2

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

谢谢

4

3 回答 3

7

scikit-learn 的KMeans类有一个predict方法,给定一些(新的)点,确定这些点属于哪个集群。调用此方法不会更改簇质心。

如果您确实希望通过添加新数据来更改质心,即您想在在线设置中进行聚类,请使用MiniBatchKMeans估计器及其partial_fit方法。

于 2012-06-17T23:05:11.030 回答
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 个随机种子重新拟合,然后选择最好的一个。

于 2012-06-17T22:55:22.413 回答
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))]
于 2015-02-20T13:26:03.483 回答