DBSCAN错误与python中的余弦指标

时间:2015-09-23 17:10:47

标签: scikit-learn cluster-analysis data-mining cosine-similarity dbscan

我试图使用带有余弦指标的scikit-learn库中的DBSCAN算法,但却遇到了错误。 代码行是

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

其中Xcsr_matrix。错误如下:

  

度量'余弦'对算法'auto'无效,

虽然文档说可以使用此指标。 我尝试使用选项algorithm='kd_tree''ball_tree'但是也一样。但是,如果我使用euclidean或者l1指标,则没有错误。

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

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

2 个答案:

答案 0 :(得分:10)

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

尝试algorithm='brute'

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

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

答案 1 :(得分:5)

如果您想要像余弦距离那样的归一化距离,您还可以先对矢量进行标准化,然后使用欧几里德指标。请注意,对于两个归一化向量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],因此请务必相应地调整参数。