python 中余弦度量的 DBSCAN 错误
DBSCAN error with cosine metric in python
我试图将 scikit-learn 库中的 DBSCAN 算法与余弦度量一起使用,但一直遇到错误。
代码行是
db = DBSCAN(eps=1, min_samples=2, metric='cosine').fit(X)
其中 X
是 csr_matrix
。错误如下:
Metric 'cosine' not valid for algorithm 'auto',
虽然文档说可以使用此指标。
我尝试使用选项 algorithm='kd_tree'
和 'ball_tree'
但结果相同。但是,如果我使用 euclidean
或 l1
指标,则不会出现错误。
矩阵 X
很大,所以我不能使用预先计算的成对距离矩阵。
我使用 python 2.7.6
和 scikit-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] 范围内,因此请务必相应地调整参数。
我试图将 scikit-learn 库中的 DBSCAN 算法与余弦度量一起使用,但一直遇到错误。 代码行是
db = DBSCAN(eps=1, min_samples=2, metric='cosine').fit(X)
其中 X
是 csr_matrix
。错误如下:
Metric 'cosine' not valid for algorithm 'auto',
虽然文档说可以使用此指标。
我尝试使用选项 algorithm='kd_tree'
和 'ball_tree'
但结果相同。但是,如果我使用 euclidean
或 l1
指标,则不会出现错误。
矩阵 X
很大,所以我不能使用预先计算的成对距离矩阵。
我使用 python 2.7.6
和 scikit-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] 范围内,因此请务必相应地调整参数。