如何基于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().
问题:
-
加载kmeans泡菜对象并应用该方法的方法是否
kmean_fit.predict()
可以让我根据 现有星团 的质心将 新观测值 分配给现有星团?这种方法是否只是重新构建新数据? -
如果我已经使用高效的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_clusters
和random_state
参数之间的相同model
和model_new
对象?你很好
使用“新”模型进行预测:
model_loaded.predict([0,0,0,0])
Out[64]: array([0])