Python 是k-means++;每次都是完美的吗?还有哪些初始化策略可以产生最佳的k-均值?

Python 是k-means++;每次都是完美的吗?还有哪些初始化策略可以产生最佳的k-均值?,python,python-3.x,machine-learning,cluster-analysis,k-means,Python,Python 3.x,Machine Learning,Cluster Analysis,K Means,我已经实现了一个k-means算法,性能在很大程度上取决于质心的初始化方式。我发现随机均匀初始化在大约5%的时间内给出了一个好的k-means,而在k-means++中,它接近50%。为什么好的k-均值的收益率如此之低?我应该否认,我只使用了少数几个数据集,我的好/坏比率只是这些数据集的指标,而不是广泛的指标 下面是一个使用k-means++的示例,其最终结果并不理想。该聚类的邓恩指数为0.16 还有一个例子,它在Dunn指数为0.67的情况下运行良好 我可能觉得k-means++每次都能产

我已经实现了一个k-means算法,性能在很大程度上取决于质心的初始化方式。我发现随机均匀初始化在大约5%的时间内给出了一个好的k-means,而在k-means++中,它接近50%。为什么好的k-均值的收益率如此之低?我应该否认,我只使用了少数几个数据集,我的好/坏比率只是这些数据集的指标,而不是广泛的指标

下面是一个使用k-means++的示例,其最终结果并不理想。该聚类的邓恩指数为0.16

还有一个例子,它在Dunn指数为0.67的情况下运行良好

我可能觉得k-means++每次都能产生一个好的k-means。我的代码可能有问题吗

def初始化_质心(点,k):
"""
参数:
点:点的列表。
k:要放置多少个质心。
返回:
质心列表。
"""
集群=[]
clusters.append(选择(点))#第一个质心是随机点
对于范围内的(k-1):#对于其他质心
距离=[]
对于p in点:
d=inf
对于簇中的c:#找到p和c之间的最小距离
d=最小值(d,距离(p,c))
距离。附加(d)
#从最小距离中查找最大距离索引
clusters.append(点[距离.索引(最大距离)))
返回簇
这是根据维基百科上的算法改编的:

从数据点中随机均匀地选择一个中心

对于每个数据点x,计算D(x),x与已选择的最近中心之间的距离

随机选择一个新数据点作为新中心,使用加权概率分布,其中选择一个点x,概率与D(x)2成比例

重复步骤2和3,直到选择了k个中心

既然已经选择了初始中心,使用标准的k-均值聚类继续

不同之处在于质心的选择使其成为最远距离,而不是在最远距离之间进行选择的概率

我的目的是比较不同
k
值的Dunn指数,从经验上看,Dunn指数越高,聚类效果越好。如果有一半的时间不起作用,我就无法收集(好的)数据,因此由于k-means++或我的实现的不完善,我的结果是不正确的


还有哪些初始化策略可以用来获得更一致的结果?

您的第一段提到了
k-means
k-means++
。你是在比较这两种方法还是一直在谈论
k-means++
?@Gabriel我觉得k-means是聚类算法,k-means++是初始化策略。我的整个问题都用到了这两个词。哦,我明白了。因此,您基本上想知道为什么您的
k-means++
实现以观察到的速率“失败”。我相信一个好的健全性检查是将您的实现与
scikit-learn
进行比较。默认情况下,它使用
k-means++
方法,如果该(经过良好测试的)实现与您的实现具有类似的性能,那么这就是最好的。该实现默认使用10种不同的种子初始化,因此这表明他们平均在10%的时间内(至少)期望“良好”的结果。你绝对应该把你的方法和他们的比较。