我的意图是使用HDBSCAN对来自doc2vec的文档向量进行聚类。我想找到包含语义和文本重复项的微小簇。
为此,我使用gensim生成文档向量。生成的文档的元素都在[-1,1]范围内。
要比较两个文档,我想比较角度相似度。我通过计算向量的余弦相似度来做到这一点,效果很好。
但是,要聚类文档,HDBSCAN需要距离矩阵,而不是相似度矩阵。 sklearn
中从余弦相似度到余弦距离的原始转换为1-similarity
。但是,据我了解,使用此公式可以打破三角形不等式,从而使其无法成为真正的距离度量标准。在搜索和查看其他人的代码以完成类似任务时,似乎大多数人似乎都在使用sklearn.metrics.pairwise.pairwise_distances(data, metric='cosine')
,无论如何,余弦距离定义为1-similarity
。看起来它提供了适当的结果。
我想知道这是否正确,还是应该使用以np.arccos(cosine similarity)/pi
计算的角距离。我还看到人们在12归一化文档向量上使用欧几里得距离。这似乎等同于余弦相似度。
请让我知道用于计算文档向量之间的距离以进行聚类的最合适方法是什么:
答案 0 :(得分:1)
我相信在实践中会使用余弦距离,尽管事实上在某些极端情况下它不是适当的度量标准。
您提到“生成的文档的元素都在[-1,1]范围内”。通常不会保证是这种情况–尽管如果您已经对所有原始文档向量进行了单位归一化,那就可以了。
如果您已经完成或想要进行单位归一化,那么在进行这样的归一化后,欧几里得距离将始终给出与余弦距离相同的最近邻排名。绝对值和它们之间的相对比例将有所不同,但是所有“ X比Z更接近Y”测试将与基于余弦距离的测试相同。因此,聚类质量应该与直接使用余弦距离几乎相同。
答案 1 :(得分:0)
适当的相似性度量标准是点积,而不是余弦。
Word2vec等使用点积训练,而不是通过向量长度归一化。并且您应该完全使用经过培训的内容。
人们一直使用余弦,因为它可以很好地处理一堆单词。该选择并非基于我所知的适当理论分析。
HDBSCAN不需要指标。 1-sim转换假定x以1为界,因此无法可靠地工作。
我建议尝试以下方法: