Python 余弦相似性与余弦距离
我有一组文档,如下例所示Python 余弦相似性与余弦距离,python,machine-learning,nlp,cluster-computing,cluster-analysis,Python,Machine Learning,Nlp,Cluster Computing,Cluster Analysis,我有一组文档,如下例所示 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 fit文档,您应该使用
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 fit文档,您应该使用距离矩阵作为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可以通过相似性而不是距离来实现(c.f.广义DBSCAN)。我相信我在ELKI中看到了这一点,但在sklearn中没有看到。在sklearn中,您可以使用具有上述缺点的
余弦距离
。谢谢您的回答:)您的意思是我们不能在sklearn中的DBSCAN实现中使用余弦相似性?您可以简单地使用余弦距离而不是相似性。你的ε需要是余弦距离,而不是余弦相似性。但我不认为这是“不可能的”…我们可以使用db=DBSCAN(minu samples=1,metric='precomputed').fit(成对距离(特征矩阵,metric='cosine')
?DBSCAN的minu samples
应该大于2,否则它不是基于密度的。我看不到预计算距离矩阵的任何好处。使用metric=“cosine”
,sklearn中的DBSCAN实现甚至可以做到这一点。但是距离矩阵需要O(n²)内存,也就是说,它的伸缩性不好。为什么要强迫它使用一种不好的方法?让DBSCAN函数来决定。请注意,问题是关于余弦距离与余弦相似性。您建议的代码也是距离,而不是相似性。Sklearn已经可以使用余弦距离进行DBSCAN,但不能使用相似性。