“余弦”度量在 sklearn 聚类算法中如何工作?

Posted

技术标签:

【中文标题】“余弦”度量在 sklearn 聚类算法中如何工作?【英文标题】:How does `cosine` metric works in sklearn's clustering algorithoms? 【发布时间】:2020-02-24 09:38:47 【问题描述】:

我很困惑cosine 指标在 sklearn 的聚类算法中是如何工作的。

例如DBSCAN有一个参数eps,它指定了聚类时的最大距离。然而,更大的余弦相似度意味着两个向量更接近,这与我们的distance 概念正好相反。

我发现pairwise_metric中有cosine_similaritycosine_distance(只是1-cos()),当我们指定度量为cosine时,我们使用cosine_similarity

那么,在聚类时,DBSCAN 是如何比较 cosine_similarity 和 @param eps 来判断两个向量是否具有相同的标签?

一个例子

将 numpy 导入为 np 从 sklearn.cluster 导入 DBSCAN 样本 = [[1, 0], [0, 1], [1, 1], [2, 2]] clf = DBSCAN(metric='cosine', eps=0.1) 结果 = clf.fit_predict(样本) 打印(结果)

它输出 [-1, -1, -1, -1] 这意味着这四个点在同一个簇中

然而,

对于点对[1,1], [2, 2]

    其 cosine_similarity 为 4/(4) = 1, 余弦距离为 1-1 = 0,因此它们在同一个簇中

对于点对[1,1], [1,0]

    其 cosine_similarity 为 1/sqrt(2), 余弦距离将是1-1/sqrt(2) = 0.29289321881345254,这个距离比我们的eps0.1还大,为什么DBSCAN将它们聚集到同一个簇中?

感谢@Stanislas Morbieu 的回答,我终于明白cosine 指标的意思是cosine_distance,即1-cosine

【问题讨论】:

我应该如何调整我的eps参数 【参考方案1】:

scikit-learn 中 DBSCAN 的实现依赖于NearestNeighbors(参见implementation of DBSCAN)。

下面是一个例子,看看它如何与余弦度量一起工作:

import numpy as np
from sklearn.neighbors import NearestNeighbors

samples = [[1, 0], [0, 1], [1, 1], [2, 2]]
neigh = NearestNeighbors(radius=0.1, metric='cosine')
neigh.fit(samples) 

rng = neigh.radius_neighbors([[1, 1]])
print([samples[i] for i in rng[1][0]])

它输出[[1, 1], [2, 2]],即在0.1的半径内离[1, 1]最近的点。

因此,在 DBSCAN 中余弦距离小于eps 的点往往在同一个簇中。

DBSCAN 的参数min_samples 起着重要作用。由于默认设置为5,因此没有任何点可以视为核心点。 设置为1,示例代码:

import numpy as np
from sklearn.cluster import DBSCAN

samples = [[1, 0], [0, 1], [1, 1], [2, 2]]

clf = DBSCAN(metric='cosine', eps=0.1, min_samples=1)

result = clf.fit_predict(samples)

print(result)

输出 [0 1 2 2] 表示 [1, 1] 和 [2, 2] 在同一个簇中(编号为 2)。

顺便说一句,输出[-1, -1, -1, -1] 并不意味着点在同一个簇中,而是所有点都不在簇中。

【讨论】:

感谢您的回答。为了便于阅读,我在问题中添加了一些新信息 我根据您添加的示例更新了答案。 非常感谢!我忽略了这个参数,现在我知道实际的指标是cosine_distance(1-cosine)

以上是关于“余弦”度量在 sklearn 聚类算法中如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 SKLearn 距离度量类没有余弦距离?

聚类算法(相似度与性能度量)

常用聚类(K-means,DBSCAN)以及聚类的度量指标:

机器学习 - 算法 - 聚类 K-MEANS 算法

聚类算法讲解:KMEANS和DBSCAN

无监督学习小记(参考)