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

Geo*_*eRF 2 python cluster-analysis k-means scikit-learn text-classification

我使用下面的代码通过 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)
Run Code Online (Sandbox Code Playgroud)

我还使用保存了质心kmean_fit.cluster_centers_

然后我腌制了 K 均值对象。

filename = pickle_path+'\\'+'_kmean_fit.sav'
pickle.dump(kmean_fit, open(filename, 'wb'))
Run Code Online (Sandbox Code Playgroud)

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

问题 :

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

  2. 如果此方法不起作用,鉴于我已经使用高效的 p​​ython 代码保存了集群质心,如何将新观察值分配给现有集群?

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

bla*_*ite 6

是的。对象是否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)
Run Code Online (Sandbox Code Playgroud)

出去:

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)
Run Code Online (Sandbox Code Playgroud)

继续:

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

model_loaded
Run Code Online (Sandbox Code Playgroud)

出去:

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)
Run Code Online (Sandbox Code Playgroud)

看看和对象之间的n_clustersrandom_state参数是如何相同的?你可以走了。modelmodel_new

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

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

Out[64]: array([0])
Run Code Online (Sandbox Code Playgroud)