python 中余弦度量的 DBSCAN 错误

DBSCAN error with cosine metric in python

我试图将 scikit-learn 库中的 DBSCAN 算法与余弦度量一起使用,但一直遇到错误。 代码行是

db = DBSCAN(eps=1, min_samples=2, metric='cosine').fit(X)    

其中 Xcsr_matrix。错误如下:

Metric 'cosine' not valid for algorithm 'auto',

虽然文档说可以使用此指标。 我尝试使用选项 algorithm='kd_tree''ball_tree' 但结果相同。但是,如果我使用 euclideanl1 指标,则不会出现错误。

矩阵 X 很大,所以我不能使用预先计算的成对距离矩阵。

我使用 python 2.7.6scikit-learn 0.16.1。 我的数据集没有整行零,因此余弦度量定义明确。

sklearn 中的索引(可能 - 这可能会随着新版本而改变)无法加速余弦。

尝试algorithm='brute'

有关您的 sklearn 版本可以加速的指标列表,请参阅球树支持的指标:

from sklearn.neighbors.ball_tree import BallTree
print(BallTree.valid_metrics)

如果你想要像余弦距离这样的归一化距离,你也可以先对你的向量进行归一化,然后再使用欧几里得度量。请注意,对于两个归一化向量 u 和 v,欧氏距离等于 sqrt(2-2*cos(u, v)) (see this discussion)

因此您可以执行以下操作:

Xnorm = np.linalg.norm(X,axis = 1)
Xnormed = np.divide(X,Xnorm.reshape(Xnorm.shape[0],1))
db = DBSCAN(eps=0.5, min_samples=2, metric='euclidean').fit(Xnormed) 

距离将在 [0,2] 范围内,因此请务必相应地调整参数。