【问题标题】:sklearn DBSCAN "cosine" vs "precomputed"sklearn DBSCAN“余弦”与“预计算”
【发布时间】:2019-04-11 04:33:55
【问题描述】:

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

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

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢您的帮助!它完全按预期工作!
    猜你喜欢
    • 2020-08-12
    • 2020-01-12
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2015-12-21
    • 1970-01-01
    相关资源
    最近更新 更多