【问题标题】:What is the appropriate distance metric when clustering paragraph/doc2vec vectors?对段落/doc2vec 向量进行聚类时,合适的距离度量是多少?
【发布时间】:2019-03-14 07:32:45
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: python cluster-analysis distance doc2vec hdbscan


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复。然后我将使用余弦距离。我在 sklearn 中实现了角距离函数,但它给了我更少的集群。
    【解决方案2】:

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

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

    人们一直使用余弦,因为它对词袋很有效。据我所知,该选择并非基于适当的理论分析。

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

    我建议尝试以下方法:

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

    【讨论】:

    • 感谢您的回复。你确定点积吗?在最初的 doc2vec 论文中,作者也使用了余弦。我想测试并看看你所说的会发生什么并没有伤害。我认为重新实现 HDBSCAN 有点超出我的范围 :)
    猜你喜欢
    • 1970-01-01
    • 2014-06-18
    • 2016-02-08
    • 1970-01-01
    • 2014-10-19
    • 2017-03-17
    • 1970-01-01
    • 2020-01-21
    • 2015-10-05
    相关资源
    最近更新 更多