如何根据 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().
问题:
加载kmeans泡菜对象并应用的方法
kmean_fit.predict()
请允许我将 新观察分配给
existing clusters 基于现有集群的质心?这种方法是否只是从头开始重新聚类新数据?
如果此方法不起作用如何将新观察值分配给
现有集群,因为我已经保存了集群
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_clusters
和 random_state
参数在 model
和 model_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)
我使用以下代码使用 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().
问题:
加载kmeans泡菜对象并应用的方法
kmean_fit.predict()
请允许我将 新观察分配给 existing clusters 基于现有集群的质心?这种方法是否只是从头开始重新聚类新数据?如果此方法不起作用如何将新观察值分配给 现有集群,因为我已经保存了集群 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_clusters
和 random_state
参数在 model
和 model_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)