如何基于python中最近的集群中心逻辑将新的观测值分配给现有的Kmeans集群?


问题内容

我使用下面的代码使用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泡菜对象,并将其应用于新数据,方法是使用 kmean_fit.predict().

问题:

  1. 加载kmeans泡菜对象并应用该方法的方法是否 kmean_fit.predict()可以让我根据 现有星团 的质心将 新观测值 分配给现有星团?这种方法是否只是重新构建新数据?

  2. 如果我已经使用高效的python代码保存了集群中心点,那么该方法不起作用如何将新观测值分配给现有集群?

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


问题答案:

是。无论sklearn.cluster.KMeans对象是否被腌制( 如果正确地对其进行腌制,您将要处理“相同”原始对象
)都不会影响您可以使用该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对象?你很好

使用“新”模型进行预测:

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

Out[64]: array([0])