Я реализую алгоритм kmeans с нуля на python и на Spark.На самом деле, это моя домашняя работа.Проблема заключается в реализации kmeans с предопределенными центроидами с различными методами инициализации, один из которых - случайная инициализация (c1), а другой - kmeans ++ (c2).Кроме того, необходимо использовать различные метрики расстояния, евклидово расстояние и расстояние до Манхэттена.Формула для них обоих представлена следующим образом:
![enter image description here](https://i.stack.imgur.com/JKtab.png)
Вторая формула в каждом разделе предназначена для соответствующей функции стоимости, которая будет минимизирована,Я реализовал оба из них, но я думаю, что есть проблема.Это график функции стоимости за итерацию kmeans с различными настройками:
![enter image description here](https://i.stack.imgur.com/mVhnT.png)
![enter image description here](https://i.stack.imgur.com/EEhO1.png)
Первый график выглядит хорошо, но у второго, похоже, есть проблема, потому что, насколько я понимаю, стоимость kmeans должна уменьшаться после каждой итерации.Так в чем проблема?Это из моего кода или формулы?
А вот мои функции для вычисления расстояний и стоимости:
def Euclidean_distance(point1, point2):
return np.sqrt(np.sum((point1 - point2) ** 2))
def Manhattan_distance(point1, point2):
return np.sum(np.absolute(point1 - point2))
def cost_per_point(point, center, cost_type = 'E'):
if cost_type =='E':
return Euclidean_distance(point, center)**2
else:
return Manhattan_distance(point, center)
А вот мой полный код на GitHub: https://github.com/mrasoolmirzaei/My-Data-Science-Projects/blob/master/Implementing%20Kmeans%20With%20Spark.ipynb