对段落/doc2vec 向量进行聚类时,合适的距离度量是多少?

flu*_*fet 5 python cluster-analysis distance doc2vec hdbscan

我的目的是使用 HDBSCAN 对来自 doc2vec 的文档向量进行聚类。我想找到存在语义和文本重复的微小集群。

为此,我使用 gensim 生成文档向量。生成的 docvec 的元素均在 [-1,1] 范围内。

为了比较两个文档,我想比较角度相似度。我通过计算向量的余弦相似度来做到这一点,效果很好。

但是,要对 HDBSCAN 文档进行聚类,需要距离矩阵,而不是相似度矩阵。从余弦相似度到余弦距离的本机转换sklearn1-similarity。然而,据我了解,使用这个公式可以打破三角不等式,使其无法成为真正的距离度量。当搜索和查看其他人的类似任务的代码时,似乎大多数人似乎都在使用sklearn.metrics.pairwise.pairwise_distances(data, metric='cosine')它来定义余弦距离1-similarity。看起来它提供了适当的结果。

我想知道这是否正确,或者我是否应该使用角距离,计算为np.arccos(cosine similarity)/pi。我还看到人们在 l2 标准化文档向量上使用欧几里德距离;这似乎相当于余弦相似度。

请让我知道计算聚类文档向量之间的距离最合适的方法是什么:)

goj*_*omo 1

我相信在实践中使用了余弦距离,尽管事实上在某些极端情况下它不是一个合适的度量。

\n\n

您提到“生成的文档的元素都在 [-1,1] 范围内”。通常不能保证 \xe2\x80\x93 是这种情况,尽管如果您已经对所有原始文档向量进行了单位标准化,则情况会是这样。

\n\n

如果您已经完成了单位标准化,或者想要这样做,那么在标准化之后,欧氏距离将始终给出与余弦距离相同的最近邻排序顺序。绝对值以及它们之间的相对比例会略有不同 \xe2\x80\x93 但所有“X 比 Z 更接近 Y”测试将与基于余弦距离的测试相同。因此聚类质量应该与直接使用余弦距离几乎相同。

\n