在 python (sklearn) 中使用 Affinity Propagation 对 word2vec 向量进行聚类
Posted
技术标签:
【中文标题】在 python (sklearn) 中使用 Affinity Propagation 对 word2vec 向量进行聚类【英文标题】:Cluster word2vec vectors using Affinity Propagation in python (sklearn) 【发布时间】:2018-04-19 13:49:03 【问题描述】:我想使用 Affinity Propagation 对我的 word2vec 聚类进行聚类并获取聚类中心词。
我目前的代码如下。
model = word2vec.Word2Vec.load("word2vec")
word_vectors = model.wv.syn0
affprop = AffinityPropagation(affinity="precomputed", damping=0.5)
af= affprop.fit(word_vectors)
但是,这会引发以下错误:
ValueError: S must be a square array (shape=(77, 300))
据我了解,300 表示 word2vec 隐藏层维度,77 是我的词汇量。
我只是想知道如何对非方形数组的 word2vec 向量使用 Affinity Propagation。
请帮帮我!
【问题讨论】:
【参考方案1】:这是因为你说样本之间的亲和度已经计算过了,它总是一个方阵。因此,您可以使用已实现的欧几里德距离,或者如果您想使用不同的度量标准,您必须预先计算它,请参见下面的示例代码:
# some dummy data
word_vectors = np.random.random((77, 300))
# using eucliden distance
affprop = AffinityPropagation(affinity='euclidean', damping=0.5)
af = affprop.fit(word_vectors)
# using cosine
from sklearn.metrics.pairwise import cosine_distances
word_cosine = cosine_distances(word_vectors)
affprop = AffinityPropagation(affinity='precomputed', damping=0.5)
af = affprop.fit(word_cosine)
【讨论】:
非常感谢您的出色回答:) 我们可以直接计算您提到的余弦距离还是我们需要使用这样的方法:index = gensim.similarities.MatrixSimilarity(gensim.matutils.Dense2Corpus(word_vectors)) for sims in index: similarity_matrix.append(sims) similarity_array = np.array(similarity_matrix)
您可以使用任何您想要的方法计算距离。为了简单起见,我倾向于使用 scikit。
您能否告诉我我们输入到亲和传播的矩阵是否本质上需要是距离矩阵?我们可以输入相似度矩阵吗? :)
它应该是一个相似度矩阵。抱歉,我上次的评论有歧义,基本上 scikit 使用负欧几里得距离,因此较大的值表示值更接近。以上是关于在 python (sklearn) 中使用 Affinity Propagation 对 word2vec 向量进行聚类的主要内容,如果未能解决你的问题,请参考以下文章
Affinity Propagation (sklearn) - 奇怪的行为
在 spark ML 2.2.0 中使用 sklearn-python 模型进行预测
如何在 Python 中使用 sklearn 对模型进行单一预测?