使用scikit-learn的顺序k均值聚类

时间:2012-06-17 22:05:34

标签: python machine-learning cluster-analysis scikit-learn

有没有办法使用scikit-learn执行顺序k-means聚类?我似乎找不到合适的方法来添加新数据,而无需重新拟合所有数据。

谢谢

3 个答案:

答案 0 :(得分:7)

scikit-learn的KMeans类有一个predict方法,给定一些(新的)点,确定这些点所属的聚类。调用此方法更改群集中心。

如果您 希望通过添加新数据来更改质心,即您想在在线设置中进行聚类,请使用MiniBatchKMeans估算工具及其{{1方法。

答案 1 :(得分:3)

您可以将init参数的质心的初始值传递给sklearn.cluster.kmeans。那么你就可以这样做:

centroids, labels, inertia = k_means(data, k)
new_data = np.append(data, extra_pts)
new_centroids, new_labels, new_inertia = k_means(new_data, k, init=centroids)

假设您只是添加数据点而不是更改k

我认为这有时意味着你会得到一个不理想的结果,但通常应该更快。你可能偶尔会想要用10个随机种子重做拟合,然后选择最好的种子。

答案 2 :(得分:1)

编写自己的函数也比较容易,找出哪个质心最接近您正在考虑的点。假设你有一些矩阵X已经为kmeans做好准备了:

centroids, labels, inertia = cluster.k_means(X, 5)

def pred(arr):
    return np.argmin([np.linalg.norm(arr-b) for b in centroids])

您可以通过以下方式确认这是有效的:

[pred(X[i]) == labels[i] for i in range(len(X))]