我使用以下代码与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.还可以做些什么来避免陷入局部最小值。 感谢您的帮助。
答案 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)
所以在第一次迭代中,距离可能是实际的两倍,并且随着迭代的增加,使用真实距离。在我的例子中,这帮助我摆脱了当地的最低限度!