部分定义scikit学习K均值聚类的初始质心

时间:2018-10-29 12:47:37

标签: python machine-learning scikit-learn cluster-analysis k-means

Scikit文档指出:

  

初始化方法:

     

“ k-means ++”:以一种明智的方式为k-mean聚类选择初始聚类中心,以加快收敛速度​​。有关更多详细信息,请参见k_init中的注释部分。

     

如果通过ndarray,则其形状应为n_clusters,n_features,并给出初始中心。

我的数据有10个(预测的)群集和7个功能。但是,我想传递10 x 6形状的数组,即我想由我预定义6个质心维,但是要使用k-mean ++自由地迭代第7维。(换句话说,我不想指定初始质心,而是控制6维,并且只保留一个维以改变初始簇)

我尝试通过10x6尺寸,希望它可以工作,但是只会引发错误。

2 个答案:

答案 0 :(得分:2)

Sklearn不允许您执行此类精细操作。

唯一的可能性是提供第7个特征值,该值是随机的,或与Kmeans ++会达到的相似。

因此,基本上,您可以为此估算一个不错的值,如下所示:

import numpy as np
from sklearn.cluster import KMeans

nb_clust = 10
# your data
X = np.random.randn(7*1000).reshape( (1000,7) )   

# your 6col centroids  
cent_6cols = np.random.randn(6*nb_clust).reshape( (nb_clust,6) ) 

# artificially fix your centroids
km = KMeans( n_clusters=10 )
km.cluster_centers_ = cent_6cols

# find the points laying on each cluster given your initialization
initial_prediction = km.predict(X[:,0:6])

# For the 7th column you'll provide the average value 
# of the points laying on the cluster given by your partial centroids    
cent_7cols = np.zeros( (nb_clust,7) )
cent_7cols[:,0:6] = cent_6cols
for i in range(nb_clust):
    init_7th = X[ np.where( initial_prediction == i ), 6].mean()
    cent_7cols[i,6] =  init_7th

# now you have initialized the 7th column with a Kmeans ++ alike 
# So now you can use the cent_7cols as your centroids
truekm = KMeans( n_clusters=10, init=cent_7cols )

答案 1 :(得分:1)

这是k均值的非常的非标准变化。因此,您不能期望sklearn为每种奇特的变化做好准备。那样会使sklearn的速度变慢。

实际上,您的方法更像是某些回归方法(预测聚类中心的最后一个值),而不是聚类。我还怀疑结果是否比仅使用其他6个维度将最后一个值设置为分配给聚类中心的所有点的平均值好得多。尝试根据最近的中心对数据进行分区(忽略最后一列),然后将最后一列设置为所分配数据的算术平均值。

但是,sklearn是开源

因此获取源代码,并修改k-means。随机初始化最后一个组件,并且在运行k-means时仅更新最后一列。以这种方式修改它很容易-但是要设计一个效率 API来允许通过琐碎的参数进行此类自定义非常困难-使用源代码在其级别进行自定义。