余弦指标在sklearn的聚类算法中如何工作?

时间:2019-10-29 06:42:26

标签: scikit-learn metrics dbscan

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

例如, DBSCAN 具有参数eps,并且它在集群时指定了最大距离。但是,更大的余弦相似度意味着两个向量更接近,这与我们的distance概念相反。

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

因此,在聚类时,DBSCAN如何比较cosine_similarity和@param eps以确定两个向量是否具有相同标签?

一个例子

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)

result = clf.fit_predict(samples)

print(result)

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

但是

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

    1. 它的余弦相似度为4 /(4)= 1
    2. 余弦距离将为1-1 = 0,因此它们位于同一簇中
  • 对于点对[1,1], [1,0]

    1. 其余弦相似度为1 / sqrt(2),
    2. 余弦距离将为1-1 / sqrt(2)= 0.29289321881345254,该距离大于我们的eps 0.1,为什么DBSCAN将它们聚类到同一聚类中?

感谢@Stanislas Morbieu的回答,我终于理解cosine的度量标准是cosine_distance,即1-cosine

1 个答案:

答案 0 :(得分:0)

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

这里是一个示例,以了解它如何使用余弦度量标准:

undefined

它输出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]]中最接近[1, 1]的点。

在DBSCAN中,余弦距离小于0.1的点往往位于同一簇中。

DBSCAN的参数eps起着重要的作用。由于默认情况下将其设置为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) ,这意味着[1,1]和[2,2]在同一个集群中(编号2)。

顺便说一句,输出[0 1 2 2]并不意味着点在同一聚类中,而是所有点都不在聚类中。