我正在尝试在一个简单的用例上比较2个不同的DBSCAN集群。
1 /在一种情况下,我使用DBSCAN的余弦度量
2 /在另外一种情况下,我使用了使用余弦相似度的预先计算的距离矩阵
我的问题是两种方法的结果不一样。有人可以告诉我我在做什么错吗?
这是一些代码示例
def cluster(X, metric="cosine"):
cluster = DBSCAN(
eps=0.5,
min_samples=3,
metric=metric,
algorithm="brute"
)
cluster.fit_predict(X)
return cluster
sentences = [
"annuler ma commande",
"commande à annuler",
"merci de bien vouloir annuler ma commande",
"produits cassés",
"mes produits sont cassés",
"ma commande de produits cassés"
]
vectorizer = TfidfVectorizer()
tfidfs = vectorizer.fit_transform(sentences)
distance_matrix = linear_kernel(tfidfs, tfidfs)
doc_id_to_cluster_1 = cluster(tfidfs, "cosine").labels_
doc_id_to_cluster_2 = cluster(sparse.csr_matrix(distance_matrix), "precomputed").labels_
doc_id_to_cluster_1 = [0,0,0,1,1,1]
doc_id_to_cluster_2 = [0,0,0,-1,0,0]
我期望得到相同的结果。
非常感谢您的帮助
答案 0 :(得分:3)
尝试更改为直接使用余弦度量标准计算距离,您应该会得到期望的结果。
>>> from sklearn.metrics import pairwise_distances
>>> distance_matrix = pairwise_distances(tfidfs, tfidfs, metric='cosine')
>>> print(cluster(tfidfs, "cosine").labels_)
>>> print(cluster(sparse.csr_matrix(distance_matrix), "precomputed").labels_)
[0 0 0 1 1 1]
[0 0 0 1 1 1]
线性核和余弦距离在数学上接近,但是对于完全相似,线性核将给出1,而对于完全相似,余弦距离将为0,因此
linear_kernel(tfidfs, tfidfs)
等于1 - pairwise_distances(tfidfs, tfidfs, metric='cosine')