我试图使用带有余弦指标的scikit-learn库中的DBSCAN算法,但却遇到了错误。 代码行是
db = DBSCAN(eps=1, min_samples=2, metric='cosine').fit(X)
其中X
是csr_matrix
。错误如下:
度量'余弦'对算法'auto'无效,
虽然文档说可以使用此指标。
我尝试使用选项algorithm='kd_tree'
和'ball_tree'
但是也一样。但是,如果我使用euclidean
或者l1
指标,则没有错误。
矩阵X
很大,所以我不能使用成对距离的预先计算矩阵。
我使用python 2.7.6
和scikit-learn 0.16.1
。
我的数据集没有完整的零行,因此余弦度量是明确定义的。
答案 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],因此请务必相应地调整参数。