5

私はコサインメトリックでscikit-learnライブラリのDBSCANアルゴリズムを使用しようとしましたが、エラーが発生しました。 コードの行は、Xcsr_matrixあるPythonのコサインメトリックでのDBSCANエラー

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

あります。ドキュメントは、このメトリックを使用することが可能であることを述べているものの、

アルゴリズム「オート」の有効な

メトリック「コサイン」ではない:エラーは、次のようです。 オプションalgorithm='kd_tree''ball_tree'を使用しようとしましたが、同じことがありました。ただし、euclidean、またはl1のメトリックを使用するとエラーは発生しません。

マトリックスXが大きいので、ペアワイズ距離の事前計算マトリックスを使用することはできません。

私はpython 2.7.6scikit-learn 0.16.1を使用します。 私のデータセットはゼロの完全な行を持たないので、余弦メトリックは明確に定義されています。

+0

これは率直に言って、間違いなくsklearnのバグです。コサインの類似度はメトリックではありません。それは三角形の不等式に従わないので、KDTreeで動作しないし、無理やり強制することもできません。アルゴリズムが 'auto'に設定されたときに、それが使えないことを知っておくべき方法を使用しようとするのはなぜなのでしょうか。 –

+0

@AdamAcosta:私が正しく理解していれば、あなたは 'brute''ではなく、試してみて、' 'ball_tree''を使用して失敗する「をalgorithm'キーワードauto''が ''使うべき」と主張していますか? (私は同意するでしょう) –

答えて

9

sklearnのインデックス(おそらく、これは新しいバージョンで変更される可能性があります)はコサインを加速することはできません。

Try algorithm='brute'

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

ありがとう!今それは動作します。まず、私のデータセットに 'np.double'の代わりに' np.float32'を使用したのでエラーが出ました。 DBSCANは、コサインメトリックの精度が小さいことが前提です(後者の範囲は0〜1)。 – cheyp

+0

これは一般的には必要ないはずですが、Sklearnの実装にはこのような制限があります。 –

4

あなたはコサイン距離などの正規化距離が必要な場合、また、あなたのベクトルを正規化することができますsklearnのバージョンがボールツリーのサポート指標を見る、加速することができメトリックのリストについては

最初にユークリッド距離を使用してください。

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) 

:2つの正規化ベクトルuとvのユークリッド距離は平方根に等しい(2-2 * COS(U、V))(see this discussion

のためにあなたが故にような何かを行うことができていることに注意してください距離は[0,2]にあるので、それに応じてパラメータを調整してください。

+0

あなたはもう少しそのような場合には、ユークリッド距離・オン・正規化ベクトルとのDBSCANアルゴリズムは、素直に、コサイン距離と同じ結果をもたらすであろう理由の拡大もらえますか?特に、二乗/平方根には何があり、余弦は実際に距離*でなく類似性*を測定することに関係しますか(距離は1-cos(。) ') –

+0

たとえば、' eps'がコサイン距離で 'x'に設定されることがわかっているなら、' euclid'でDBSCANを使うときは 'sqrt(x)'に設定するべきです。そして、そのようなデータがあれば、スケルトンの索引付けは締結の目的を達成していますか? –

+0

@ NikanaReklawyks上記のように、私がここで述べたことは、コサイン距離のような正規化された距離を得るために行うことができます。それは、二乗演算のために全く同じではありません。また、あなたが指摘したように、コサイン距離は、人々が正の空間におけるコサイン類似度の補完と名付けるものであり、適切な距離メトリックではない。しかし、コサイン距離について質問したので、私はその詳細には入りません。 – benbo