sklearn DBSCAN“余弦”与“预计算”

时间:2018-11-07 17:25:01

标签: python scikit-learn

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

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

1 个答案:

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