【问题标题】:Cosine similarity vs Cosine distance余弦相似度与余弦距离
【发布时间】:2017-12-12 10:00:48
【问题描述】:

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

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'))

【问题讨论】:

    标签: python machine-learning nlp cluster-computing cluster-analysis


    【解决方案1】:

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

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

    DBSCAN 可以通过相似性而不是距离轻松实现(参见广义 DBSCAN)。我相信我在 ELKI 中看到了这一点,但在 sklearn 中没有。在 sklearn 中,你可以使用cosine_distance,但有上述缺点。

    【讨论】:

    • 谢谢你的回答 :) 你的意思是我们不能在 sklearn 中使用与 DBSCAN 实现的余弦相似度?
    • 您可以简单地使用余弦距离而不是相似度。然后,您的 epsilon 也需要是余弦距离,而不是余弦相似度。但我不会称之为“不可能”......
    • 我们可以使用db = DBSCAN(min_samples=1, metric='precomputed').fit(pairwise_distances(feature_matrix, metric='cosine') 吗?
    • min_samples 对于 DBSCAN 应该大于 2,否则它不是基于密度的。我看不到预先计算距离矩阵的任何好处。使用metric="cosine",sklearn 中的 DBSCAN 实现甚至可以做到这一点。但是距离矩阵需要 O(n²) 内存,即它的缩放比例很差。为什么要强迫它使用不好的方法?让 DBSCAN 函数决定。
    • 请注意,问题是关于余弦 距离 与余弦 相似度。您建议的代码也是距离,而不是相似度。 Sklearn 已经可以使用余弦 distance 进行 DBSCAN,但没有相似之处。
    猜你喜欢
    • 2010-10-31
    • 2020-02-11
    • 2020-08-12
    • 2015-05-31
    • 2020-04-22
    • 2014-02-25
    • 2011-01-01
    • 2013-02-27
    相关资源
    最近更新 更多