gpt4 book ai didi

python - sklearn DBSCAN "cosine"与 "precomputed"

转载 作者:行者123 更新时间:2023-11-30 22:04:43 24 4
gpt4 key购买 nike

我正在尝试在一个简单的用例上比较 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]

我期待得到相同的结果。
非常感谢您的帮助

最佳答案

尝试更改为直接使用余弦度量来计算距离,您应该会得到您所期望的结果。

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

关于python - sklearn DBSCAN "cosine"与 "precomputed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53194672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com