用欧几里得距离vs曼哈顿距离实现k-均值?

时间:2018-12-05 13:17:23

标签: python cluster-analysis k-means euclidean-distance

我正在python和Spark上从头实现kmeans算法。实际上,这是我的作业。问题是要使用具有不同初始化方法的预定义质心来实现kmeans,其中之一是随机初始化(c1),而另一个是kmeans ++(c2)。同样,要求使用不同的距离度量,欧几里得距离和曼哈顿距离。两者的公式介绍如下:

enter image description here

每个部分中的第二个公式用于对应的成本函数,该函数将被最小化。我都实现了它们,但是我认为有问题。这是使用不同设置的kmeans每次迭代的成本函数图:

enter image description here

enter image description here

第一个图看起来不错,但是第二个图似乎有问题,因为就我而言,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

1 个答案:

答案 0 :(得分:1)

K-均值不会不最小化距离

它使平方和(不是度量)最小化。

如果按欧几里得距离将点分配给最近的聚类,它将仍然最小化平方和,而不是欧几里得距离。特别是,欧几里德距离的总和可能会增加。

最小化欧几里得距离是韦伯问题。 平均值不是最佳选择。您需要一个复杂的几何中值以最小化欧几里得距离。

如果用曼哈顿距离分配点,则不清楚最小化的是什么...您有两个竞争目标。虽然我认为它仍然会收敛,但要证明这一点可能有些棘手。因为使用平均值可能会增加曼哈顿距离的总和。

我想我曾在SO或stats.SE上发布过k均值最小化欧氏距离的反例。因此,您的代码和分析甚至可能还不错-这是有缺陷的作业。