首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >学习DBSCAN“余弦”与“预先计算”

学习DBSCAN“余弦”与“预先计算”
EN

Stack Overflow用户
提问于 2018-11-07 17:25:01
回答 1查看 2.3K关注 0票数 1

我试图在一个简单的用例上比较两个不同的DBSCAN集群。

1/在一种情况下,我使用DBSCAN的余弦度量。

在指定的情况下,我使用了一个利用余弦相似的预先计算的距离矩阵。

我的问题是,对于这两种方法,我没有相同的结果。有人能告诉我我做错了什么吗?

下面是一些代码示例

代码语言:javascript
运行
复制
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

我还以为会有同样的结果呢。

非常感谢你的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-07 17:53:52

试着直接用余弦度量来计算你的距离,你应该得到你所期望的。

代码语言:javascript
运行
复制
>>> 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')

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53194672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档