DBSCAN错误与python中的余弦指标

che*_*eyp 6 cluster-analysis data-mining cosine-similarity dbscan scikit-learn

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

db = DBSCAN(eps=1, min_samples=2, metric='cosine').fit(X)    
Run Code Online (Sandbox Code Playgroud)

这里 X是一个csr_matrix.错误如下:

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

虽然文档说可以使用此指标.我尝试使用选项algorithm='kd_tree','ball_tree'但得到了相同.但是,如果我使用euclidean或者比如l1指标,则没有错误.

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

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

Ano*_*sse 10

sklearn中的索引(可能 - 这可能随新版本而变化)无法加速余弦.

试试algorithm='brute'.

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

from sklearn.neighbors.ball_tree import BallTree
print(BallTree.valid_metrics)
Run Code Online (Sandbox Code Playgroud)


ben*_*nbo 5

如果您想要像余弦距离那样的归一化距离,您还可以先对矢量进行标准化,然后使用欧几里德度量标准.请注意,对于两个归一化向量u和v,欧氏距离等于sqrt(2-2*cos(u,v))(参见本讨论)

你可以这样做:

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) 
Run Code Online (Sandbox Code Playgroud)

距离将位于[0,2],因此请确保相应地调整参数.