MiniBatchKMeans在后续迭代后给出不同的质心

时间:2016-08-03 18:42:47

标签: python statistics scikit-learn cluster-analysis k-means

我正在使用anaconda中MiniBatchKMeans模块中的sklearn.cluster模型。我正在聚类一个包含大约75,000个点的数据集。它看起来像这样:

data = np.array([8,3,1,17,5,21,1,7,1,26,323,16,2334,4,2,67,30,2936,2,16,12,28,1,4,190...])

我使用以下流程调整数据。

from sklearn.cluster import MiniBatchKMeans kmeans = MiniBatchKMeans(batch_size=100) kmeans.fit(data.reshape(-1,1)

这一切都很好,我继续找到数据的质心:

centroids = kmeans.cluster_centers_ print centroids

这给了我以下输出:

array([[ 13.09716569], [ 2908.30379747], [ 46.05089228], [ 725.83453237], [ 95.39868475], [ 1508.38356164], [ 175.48099948], [ 350.76287263]])

但是,当我再次运行该过程时,使用相同的数据,我得到质心的不同值,例如:

array([[ 29.63143489], [ 1766.7244898 ], [ 171.04417206], [ 2873.70454545], [ 70.05295277], [ 1074.50387597], [ 501.36134454], [ 8.30600975]])

任何人都可以解释为什么会这样吗?

2 个答案:

答案 0 :(得分:0)

您遇到的行为可能与您正在使用的k-means群集的底层实现有关。 k-means聚类是一个NP难问题,因此所有的实现都是启发式方法。这实际上意味着对于一个给定的种子,它会收敛到一个在多个种子之间不一定一致的局部最佳值。

答案 1 :(得分:0)

了解什么是小批量k-means。

它永远不会收敛。再做一次迭代,结果将再次改变

数据集的设计如此庞大,您无法一次将它们加载到内存中。所以你加载一个批处理,假装这是完整的数据集,做一个迭代。重复下一批。如果您的批次足够大且随机,那么结果将足够接近"可用虽然它永远不会是最佳的。

因此:

  1. 小批量结果比常规k均值结果更随机。它们每次迭代都会改变。
  2. 如果您可以将数据加载到内存中,请不要使用minibatch。而是使用快速k-means实现。 (大多数都非常慢)。
  3. P.S。在一维数据上,排序您的数据集,然后使用一种从排序中获益而不是k-means的算法。