如何根据 python 中最近的聚类质心逻辑将新观察值分配给现有 Kmeans 聚类?

How to assign an new observation to existing Kmeans clusters based on nearest cluster centriod logic in python?

我使用以下代码使用 Scikit learn 创建 k-means 集群。

kmean = KMeans(n_clusters=nclusters,n_jobs=-1,random_state=2376,max_iter=1000,n_init=1000,algorithm='full',init='k-means++')

kmean_fit = kmean.fit(clus_data)

我还使用 kmean_fit.cluster_centers_

保存了质心

然后我腌制了 K 表示对象。

filename = pickle_path+'\'+'_kmean_fit.sav'
pickle.dump(kmean_fit, open(filename, 'wb'))

这样我就可以加载相同的 kmeans pickle 对象并在新数据出现时将其应用于新数据,使用 kmean_fit.predict().

问题:

  1. 加载kmeans泡菜对象并应用的方法 kmean_fit.predict() 请允许我将 新观察分配给 existing clusters 基于现有集群的质心?这种方法是否只是从头开始重新聚类新数据?

  2. 如果此方法不起作用如何将新观察值分配给 现有集群,因为我已经保存了集群 centriods using efficent python 代码?

PS:我知道使用现有集群作为因变量构建分类器是另一种方法,但我不想这样做,因为时间紧迫。

是的。 sklearn.cluster.KMeans 对象是否被腌制(如果你正确地取消腌制,你将处理 ​​"same" 原始对象 )不影响您可以使用 predict 方法对新观察进行聚类。

一个例子:

from sklearn.cluster import KMeans
from sklearn.externals import joblib

model = KMeans(n_clusters = 2, random_state = 100)
X = [[0,0,1,0], [1,0,0,1], [0,0,0,1],[1,1,1,0],[0,0,0,0]]
model.fit(X)

输出:

KMeans(copy_x=True, init='k-means++', max_iter=300, n_clusters=2, n_init=10,
    n_jobs=1, precompute_distances='auto', random_state=100, tol=0.0001,
    verbose=0)

继续:

joblib.dump(model, 'model.pkl')  
model_loaded = joblib.load('model.pkl')

model_loaded

输出:

KMeans(copy_x=True, init='k-means++', max_iter=300, n_clusters=2, n_init=10,
    n_jobs=1, precompute_distances='auto', random_state=100, tol=0.0001,
    verbose=0)

看看 n_clustersrandom_state 参数在 modelmodel_new 对象之间如何相同?你可以开始了。

用"new"模型预测:

model_loaded.predict([0,0,0,0])

Out[64]: array([0])

这个问题有点老了,但是kmeans在合适的时候设置了一个cluster_centers_参数。如果你有质心,你可以通过以下方式设置它:

kmeans.cluster_centers_ = centroids_init

这之后应该可以装下

根据Sklearn Kmeans documentation使用predict(X, sample_weight=None)加载带有存储的Kmeans模型的pickle文件后,将预测X中每个样本所属的最近簇。

在矢量量化文献中,cluster_centers_被称为码本,predict返回的每个值都是码本中最接近的码的索引。

实用笔记!
很多时候人们倾向于从 model.labels_ 中获取聚类标签,但是在这种预测情况下,请确保使用返回的结果,例如以下示例中的 pred_y

    from sklearn.cluster import KMeans
    import pickle

    # load the model
    model = pickle.load(open(filename, 'rb'))

    # predict using the loaded model
    pred_y = model.predict(X)