如何在sklearn中检查k-means中给定向量的集群细节

Posted

技术标签:

【中文标题】如何在sklearn中检查k-means中给定向量的集群细节【英文标题】:How to check the cluster details of a given vector in k-means in sklearn 【发布时间】:2019-11-10 00:35:52 【问题描述】:

我正在使用以下代码使用 k-means 聚类算法对我的词向量进行聚类。

from sklearn import cluster
model = word2vec.Word2Vec.load("word2vec_model")
X = model[model.wv.vocab]
clusterer = cluster.KMeans (n_clusters=6)
preds = clusterer.fit_predict(X)
centers = clusterer.cluster_centers_

给定 word2vec 词汇表中的一个词(例如,word_vector = model['jeep']),我想获取它的集群 ID 和到集群中心的余弦距离。

我尝试了以下方法。

for i,j in enumerate(set(preds)):
    positions = X[np.where(preds == i)]
    print(positions)

但是,它返回每个集群 ID 中的所有向量,而不是我正在寻找的。​​p>

如果需要,我很乐意提供更多详细信息。

【问题讨论】:

专业提示:要查看 k-means 对词向量的限制,请找到与每个聚类中心最相似的向量。这些通常是非常不起眼的词,表明集群质量很低。 【参考方案1】:

聚类后,您将获得所有输入数据的labels_(与输入数据的顺序相同),即clusterer.labels_[model.wv.vocab['jeep'].index] 将为您提供jeep 所属的集群。

你可以用scipy.spatial.distance.cosine计算余弦距离

cluster_index = clusterer.labels_[model.wv.vocab['jeep'].index]
print(distance.cosine(model['jeep'], centers[cluster_index]))
>> 0.6935321390628815

完整代码

我不知道你的模型是什么样子的,但让我们使用GoogleNews-vectors-negative300.bin

from gensim.models import KeyedVectors
from sklearn import cluster
from scipy.spatial import distance

model = KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)

# let's use a subset to accelerate clustering
X = model[model.wv.vocab][:40000]

clusterer = cluster.KMeans (n_clusters=6)
preds = clusterer.fit_predict(X)
centers = clusterer.cluster_centers_

cluster_index = clusterer.labels_[model.wv.vocab['jeep'].index]
print(cluster_index, distance.cosine(model['jeep'], centers[cluster_index]))

【讨论】:

嗨,只是想知道如何获得余弦相似度,而不是余弦距离? :)【参考方案2】:

这是我的尝试!

from gensim.test.utils import common_texts
from gensim.models import Word2Vec

model = Word2Vec(common_texts, size=100, window=5, min_count=1, workers=4)

from sklearn.cluster import KMeans

clustering_model = KMeans(n_clusters=2)

preds = clustering_model.fit_predict([model.wv.get_vector(w) for w in model.wv.vocab])

获取集群 ID 的预测

>>> clustering_model.predict([model.wv.get_vector('computer')])
# array([1], dtype=int32)

获取给定单词和聚类中心之间的余弦相似度

>>> from sklearn.metrics.pairwise import cosine_similarity
>>> cosine_similarity(clustering_model.cluster_centers_, [model.wv.get_vector('computer')])

# array([[-0.07410881],
       [ 0.34881588]])

【讨论】:

以上是关于如何在sklearn中检查k-means中给定向量的集群细节的主要内容,如果未能解决你的问题,请参考以下文章

如何从 K-Means 聚类中解释轮廓系数?

如何从 Tf-IDF 向量中选择 K-mean 的初始聚类

在 SKLearn 中使用 K-Means 处理图像矩阵

使用sklearn Kmeans时如何避免Kmean局部最优

如何将我的索引向量更改为可在 sklearn 中使用的稀疏特征向量?

机器学习之SKlearn(scikit-learn)的K-means聚类算法