#Питон #Python #K-means, К-средние Нужно написать алгоритм k-means для сортировки сгенерированных данных в питоне.
Перед этим заданием нужно было просто реализовать алгоритм в питоне. 1.Нужно было сгенерировать данные с функции random
2.выбрать два центра случайным образом
3.создать два начальных класса
4.Затем найти новые центры и перераспределить точки в соответствии с ними.
(это задание уже выполнено смотри код внизу)
Теперь нужно преобразовать код так, чтобы для класса была только одна переменная-список, то же самое касается центров и расстояний. То есть вместо distance1, distance2, должна быть только одна переменная distances (и для других тоже: classes, centers). Должен получиться код, в котором мы задаем только количество классов, а не создаем для каждого класса переменную.
Как нам объясняли, должно быть что-то типа такого:
k=3
centers = [ ]
for i in range(k):
centers[i]= points [random.randint(1, len(points)]
Всю эту красоту надо вывести на экран с matplotlib
Вот такой код надо преобразовать, или написать новый:
import matplotlib.pyplot as plt
import random
def main():
min_distance = 0.01
distance_center_1 = 10
distance_center_2 = 10
points = [(random.randint(1, 10), random.randint(1, 10)) for i in range(50)] + [(random.randint(15, 25), random.randint(15, 25)) for i in range(50)]
выбрать два центра случайным образом
class_center_1 = points[random.randint(1, len(points))]
class_center_2 = points[random.randint(1, len(points))]
i=0
while (distance_center_1 > min_distance) and (distance_center_2 > min_distance):
print(i)
class_1 = []
class_2 = []
pass
for e in range(len(points)):
distance_1 = euclidian_dist(class_center_1, points)
distance_2 = euclidian_dist(class_center_2, points)
if distance_1 <= distance_2:
class_1.append(points[e])
else:
class_2.append(points[e])
new_class_center_1 = get_centroid(class_1)
new_class_center_2 = get_centroid(class_2)
#расстояние между старым и новым центрами
distance_center_1 = euclidian_dist(class_center_1, new_class_center_1)
distance_center_2 = euclidian_dist(class_center_2, new_class_center_2)
class_center_1 = new_class_center_1
class_center_2 = new_class_center_2
plt.plot([p[0] for p in class1], [p[1] for p in class1], 'ro')
plt.plot([p[0] for p in class2], [p[1] for p in class2], 'go')
plt.show()
i += 1
plt.plot([p[0] for p in class1], [p[1] for p in class1], 'ro')
plt.plot([p[0] for p in class2], [p[1] for p in class2], 'go')
plt.show()
def euclidian_dist(p1, p2):
return ((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2) ** (1 / 2)
def get_centroid(cluster):
centroids_id = [0,0]
for e in cluster:
centroids_id[0]= centroids_id [0]+ e[0]
centroids_id[1] = centroids_id[1] + e[1]
pass
centroids_id[0] = centroids_id[0]/len(cluster)
centroids_id[1] = centroids_id[1] /len(cluster)
return centroids_id