我尝试将k-means实施为家庭作业。我的练习表给了我关于空中心的以下评论:
在迭代过程中,如果任何聚类中心没有与之关联的数据点,则将其替换为随机数据点。
这让我有点困惑,首先维基百科或我读过的其他来源根本没有提到这一点。我进一步阅读了“为您的数据选择一个好的 k”的问题——如果我开始为空的集群设置新的中心,我的算法应该如何收敛。
如果我忽略空集群,我会在 30-40 次迭代后收敛。忽略空簇是错误的吗?
看看这个空簇如何发生的例子:http ://www.ceng.metu.edu.tr/~tcan/ceng465_f1314/Schedule/KMeansEmpty.html 它基本上意味着要么1)随机震颤,要么2 ) 簇数 k 是错误的。您应该遍历 k 的几个不同值并选择最佳值。如果在迭代过程中遇到空集群,请将随机数据点放入该集群并继续。我希望这对你去年的家庭作业有所帮助。
处理空集群不是 k-means 算法的一部分,但可能会导致更好的集群质量。谈到收敛,它从来都不是精确的,而是只有启发式保证的,因此通过包含最大迭代次数来扩展收敛的标准。
关于解决这个问题的策略,我想说随机分配一些数据点给它不是很聪明,因为我们可能会影响集群质量,因为到它当前分配的中心的距离很大或很小。这种情况的启发式方法是选择离最大集群最远的点并移动空集群,然后这样做直到没有空集群。
如果在分配步骤期间没有将点分配给集群,则可以获得空集群。如果发生这种情况,您需要选择一个替换质心,否则 SSE 会比必要的大。
*选择对SSE贡献最大的点 *从具有最高SSE的簇中选择一个点 *如果有多个空簇,上述可以重复多次。
***SSE = 平方误差之和。
您不应忽略空簇,而应替换它。k-means 是一种只能为您提供局部最小值的算法,而空簇是您不想要的局部最小值。即使你用一个随机点替换一个点,你的程序也会收敛。请记住,在算法开始时,您随机选择初始 K 个点。如果它可以收敛,为什么 K-1 收敛点与 1 个随机点不能?只需要更多的迭代。
“为您的数据选择好的k”是指选择正确数量的集群的问题。由于 k-means 算法使用预定数量的聚类中心,因此必须首先选择它们的数量。选择错误的数字可能会使数据点难以划分为集群,或者集群可能变得小而无意义。
关于忽略空集群是否是一个坏主意,我无法回答您。如果这样做,您最终得到的集群数量可能比您在开始时定义的要少。这会让那些期望 k-means 以某种方式工作的人感到困惑,但这并不一定是一个坏主意。
如果您重新定位任何空的集群中心,如果这种情况发生的次数有限,您的算法可能无论如何都会收敛。但是,如果您必须经常搬迁,您的算法可能不会终止。
对于“为您的数据选择好的 k”,Andrew Ng 给出了 T 恤制造商的示例,该制造商查看潜在客户的测量结果并进行 k-means 来决定您是要提供 S/M/L (k=3) 还是 2XS/ XS/S/M/L/XL/2XL (k=7)。有时决策是由数据驱动的(k=7 给出空集群),有时是出于业务考虑(制造成本较低,只有三种尺寸,或者市场营销表示客户需要更多选择)。