我很困惑cosine
指标在sklearn的聚类算法中如何工作。
例如, DBSCAN 具有参数eps
,并且它在集群时指定了最大距离。但是,更大的余弦相似度意味着两个向量更接近,这与我们的distance
概念相反。
我发现pairwise_metric中有cosine_similarity
和cosine_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,1], [1,0]
,
eps
0.1,为什么DBSCAN将它们聚类到同一聚类中?感谢@Stanislas Morbieu的回答,我终于理解cosine
的度量标准是cosine_distance
,即1-cosine
答案 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]
并不意味着点在同一聚类中,而是所有点都不在聚类中。