余弦相似性与余弦距离



我有一组文档,如下例所示。

doc1 = {'Science': 0, 'History': 0, 'Politics': 0.15,... 'Sports': 0}
doc2 = {'Science': 0.3, 'History': 0.5, 'Politics': 0.1,... 'Sports': 0}

我通过使用上述向量(我的向量大多是稀疏向量(使用 DBSCAN 对这些文档进行聚类。我知道"余弦相似性"对于稀疏向量的计算非常有效。然而,根据 sklearn.DBSCAN 拟合文档 您应该使用距离矩阵作为 DBSCAN 的输入。因此,我想知道如果我使用"余弦相似性"而不是"余弦距离"是否错误。

请让我知道最适合我的问题的方法是什么。是使用余弦距离的DBSCAN还是使用余弦相似性的DBSCAN?

# Fit DBSCAN using cosine distance
db = DBSCAN(min_samples=1, metric='precomputed').fit(pairwise_distances(feature_matrix, metric='cosine'))

# Fit DBSCAN using cosine similarity
db = DBSCAN(min_samples=1, metric='precomputed').fit(1-pairwise_distances(feature_matrix, metric='cosine'))

如果你传递一个距离矩阵,它将是O(n²(。

如果传递实际数据,则代码可以使用索引使其比这更快。所以我宁愿尝试metric="cosine".

DBSCAN可以简单地实现相似性而不是距离(参见广义DBSCAN(。我相信我在 ELKI 中看到了这一点,但在 sklearn 中没有。在 sklearn 中,您可以使用具有上述缺点的cosine_distance

最新更新