我正在使用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]])
任何人都可以解释为什么会这样吗?
答案 0 :(得分:0)
您遇到的行为可能与您正在使用的k-means群集的底层实现有关。 k-means聚类是一个NP难问题,因此所有的实现都是启发式方法。这实际上意味着对于一个给定的种子,它会收敛到一个在多个种子之间不一定一致的局部最佳值。
答案 1 :(得分:0)
了解什么是小批量k-means。
它永远不会收敛。再做一次迭代,结果将再次改变 。
数据集的设计如此庞大,您无法一次将它们加载到内存中。所以你加载一个批处理,假装这是完整的数据集,做一个迭代。重复下一批。如果您的批次足够大且随机,那么结果将足够接近"可用虽然它永远不会是最佳的。
因此:
P.S。在一维数据上,排序您的数据集,然后使用一种从排序中获益而不是k-means的算法。