使用Kmeans时避免局部最小值

时间:2017-05-04 17:47:55

标签: python cluster-analysis k-means

我使用以下代码与sklearn.cluster.KMeans中的KMeans进行群集

=TRIM(MID(A1,1,FIND(" ",A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A1&"0123456789",MIN(FIND({0,1,2,3,4,5,6,7,8,9},A1&"0123456789"))+10)))))

为了避免局部最小值,我使用n_init = 100.还可以做些什么来避免陷入局部最小值。 感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

我担心使用k-means算法,你无法完全避免局部最小值;你只能尽量减少获得一次的机会。

这个Cross Validated post很好地讨论了为什么你无法摆脱局部最小值。

许多人使用的常见黑客,以及通过设置n_init = 100正在进行的操作是多次运行K-means然后选择产生最低错误的运行。如果你运行这个k ^ n次然后选择最好的那个,那么你将保证你找到一个全局最小值,但这太费时间而不实用。

答案 1 :(得分:0)

为什么你认为你需要全球最低标准?

任何群集只是启发式。没有最佳聚类这样的东西,因为这是一种探索性技术。

此外,您的数据可能不是"确切的"但你只有一个子集,有限的精度等 - "最优性"完全被高估了。

将您从10次初始化获得的最佳结果与从100次初始化获得的最佳结果进行比较。这有什么不同吗?你还等多久才能再次获得同样的改善?

答案 2 :(得分:0)

另一个“黑客” - 我通过在迭代期间随机化群集分配获得了成功,例如(在R中)通过将欧几里德距离乘以

(1 + runif(1,0,1.0)/iteration)

所以在第一次迭代中,距离可能是实际的两倍,并且随着迭代的增加,使用真实距离。在我的例子中,这帮助我摆脱了当地的最低限度!