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.6和scikit-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)
如果您想要像余弦距离那样的归一化距离,您还可以先对矢量进行标准化,然后使用欧几里德度量标准.请注意,对于两个归一化向量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],因此请确保相应地调整参数.
| 归档时间: |
|
| 查看次数: |
5982 次 |
| 最近记录: |