"余弦"度量在sklearn的聚类算法中是如何工作的?



我对cosine度量如何在sklearn的聚类算法中工作感到困惑

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

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

那么,在聚类时,DBSCAN如何比较余弦_相似性和@parameps来决定两个向量是否具有相同的标签?

示例

将numpy导入为np从sklearn.cluster导入DBSCANsamples=[[1,0],[0,1],[1,1],[2,2]]clf=DBSCAN(公制="正弦",eps=0.1(结果=clf.fit_predict(示例(print(result(

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

然而,

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

    其余弦相似性为4/(4(=1
  • 余弦距离将为1-1=0,因此它们在同一簇中
  • 对于点对[1,1], [1,0]

    其余弦相似性为1/sqrt(2(
  • 余弦距离将是1-1/sqrt(2(=0.29289321881345254,这个距离大于我们的eps0.1,为什么DBSCAN将它们聚类到同一个聚类中

感谢@Stanislas Morbieu的回答,我终于明白了cosine度量意味着cosine_distance,也就是1-cosine

scikit learn中DBSCAN的实现依赖于最近邻居(请参阅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中余弦距离小于CCD_ 19的点往往在同一簇中。

DBSCAN的参数CCD_ 20起着重要作用。由于默认设置为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]并不意味着点在同一个簇中,而是所有点都不在任何簇中。

相关内容

  • 没有找到相关文章

最新更新