聚类 paragraph/doc2vec 向量时合适的距离度量是多少?

What is the appropriate distance metric when clustering paragraph/doc2vec vectors?

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

为此,我使用 gensim 生成文档向量。生成的 docvec 的元素都在 [-1,1].

范围内

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

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

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

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

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

你提到 "elements of the resulting docvecs are all in the range [-1,1]"。通常不能保证是这种情况——尽管如果您已经对所有原始文档向量进行了单位标准化,情况就会如此。

如果您已经完成了单位归一化,或者想要这样做,那么在这种归一化之后,欧几里德距离将始终给出与余弦距离相同的最近邻排序顺序。绝对值和它们之间的相对比例会略有不同——但所有 "X is closer to Y than Z" 测试都与基于余弦距离的测试相同。因此聚类质量应该与直接使用余弦距离几乎相同。

正确的相似性度量是点积,而不是余弦。

Word2vec 等使用点积进行训练,而不是通过向量长度进行归一化。你应该完全使用训练过的东西。

人们一直在使用余弦,因为它对词袋很有效。据我所知,这个选择并不是基于正确的理论分析。

HDBSCAN 不需要指标。 1-sim 转换假设 x 以 1 为界,因此它不会可靠地工作。

我建议尝试以下方法:

  • 使用负距离。这可能只是工作。即,d(x,y)=-(x 点 y)
  • 使用 max-sim 变换。一旦有了点积矩阵,就很容易得到最大值。
  • 使用相似性而不是度量实施 HDBSCAN*