我正在使用PyCluster的kMeans来聚类一些数据 - 主要是因为SciPy的kMeans2()产生了一个不可克服的错误。 Mentioned here。无论如何,PyCluster kMeans运行良好,我现在正在尝试优化kMeans集群的数量。 PyCluster附带的文献表明我可以通过实现EM算法来优化其kMeans - bottom of page 13 here - 但我找不到一个例子。
有人可以指点我的PyCluster k-means优化问题吗?提前感谢您的帮助。
答案 0 :(得分:7)
PyCluster的手册指的是与您询问的问题不同的优化问题。当您询问如何确定最佳群集数时,本手册将介绍如何在给定群集总数的情况下找到最佳群集。要理解的概念是k-means,它是一种EM(期望最大化问题)算法,不能保证最优的聚类解决方案(其中最优聚类解决方案可以定义为最小化总和的聚类的分配)。每个数据点与其簇的平均值之间的距离的平方)。 k-means的工作方式是:
set cluster means to equal k randomly generated points
while not converged:
# expectation step:
for each point:
assign it to its expected cluster (cluster whose mean it is closest to)
# maximization step:
for each cluster:
# maximizes likelihood for cluster mean
set cluster mean to be the average of all points assigned to it
k-means算法将在初始化时输出最佳解决方案,但不一定能在全局范围内找到最佳的聚类解决方案。这是本手册在第13页底部引用的内容。手册说kcluster例程将多次执行EM(这正是k-means算法)并选择最佳聚类。它从未提到找到最佳簇数的问题。
尽管如此,您可以使用一些启发式方法来确定最佳群集数量(例如参见Wikipedia):