我试图在一个简单的用例上比较两个不同的DBSCAN集群。
1/在一种情况下,我使用DBSCAN的余弦度量。
在指定的情况下,我使用了一个利用余弦相似的预先计算的距离矩阵。
我的问题是,对于这两种方法,我没有相同的结果。有人能告诉我我做错了什么吗?
下面是一些代码示例
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
我还以为会有同样的结果呢。
非常感谢你的帮助
发布于 2018-11-07 17:53:52
试着直接用余弦度量来计算你的距离,你应该得到你所期望的。
>>> 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')。
https://stackoverflow.com/questions/53194672
复制相似问题