我已经在Java中实现了K-Means,并且有点头疼。我通过在数据点的值范围内的每个维度中选择随机值来选择我的初始质心。我遇到了导致这些质心中的一个或多个不会成为任何数据点的壁橱质心的情况。那么下一次迭代我该怎么办?只要保留原来的随机值?选择一个新的随机值?计算其他质心的平均值?似乎在原始算法中没有考虑到这一点,但可能我只是错过了一些东西。
答案 0 :(得分:2)
k-means的大多数实现使用实际数据点定义初始质心,而不是由变量绘制的边界框中的随机点。但是,下面是一些解决实际问题的建议。
您可以随机获取另一个数据点并使其成为新的群集质心。这非常简单且快速实现,并且不应该对算法产生不利影响。
您还可以尝试使用kmeans++更智能地初始选择群集质心。该算法随机选择第一个质心,并选取剩余的K-1质心以尝试最大化质心间距离。通过选择更智能的质心,您不太可能遇到质心被指定为零数据点的问题。
如果你想要更聪明一点,你可以使用kmeans ++算法在质心被分配零数据点时创建一个新的质心。
答案 1 :(得分:1)
我使用它的方式,初始值被视为数据集中的随机点,而不是跨越空间中的随机点。这意味着每个群集最初至少有一个点。你可能仍然不幸遇到异常值,但运气好的话,你将能够检测到这一点并重新启动不同点。 (提供“K点积分”是对数据的充分描述)
答案 2 :(得分:1)
许多实现从数据集中选择随机点作为初始质心,而不是选择随机值(如果可能值的空间与集群相比较大,则可能毫无意义)。 / p>