2015-12-07 12 views
7

scikit learnのKNeighborsClassifierと1 - cosine類似性のようなものを使用することはできますか?scikitで余弦距離を学習するKNeighborsClassifier

This答えはありませんが、KNeighborsClassifierのdocumentationには、DistanceMetricsに記載されているメトリックがあります。距離メトリックには明示的なコサイン距離は含まれていません。おそらく距離ではないからですが、おそらくメトリックに関数を入力することは可能です。私はscikitを入力して、KNeighborsClassifierに線形カーネルを学習しようとしましたが、関数が引数として2つの配列を必要とするというエラーが出ます。誰かがこれを試した?

+0

KNN分類器は、三角不等式に依存するいくつかの最適化を使用する可能性が高い。コサインメトリックはそれに従わないので、KNNの正しい動作は保証されません。 –

+2

@ Barmaley.exeコサインメトリックは、三角形の不等式に従うことができ、明示的な実装をとらなくても同じ順序付けを行うことができます。詳細は私の答えを見てください –

答えて

20

コサイン類似度は一般にxxy /(|| x || * || y ||)と定義され、それらが同じ場合は1を出力し、完全に異なる場合は-1を出力します。この定義は技術的にはメトリックではないため、ボールやkdツリーなどのアクセラレーション構造を使用することはできません。あなたがブルートフォースアプローチを使用するようにscikitを習得させると、独自のカスタム距離メトリックオブジェクトを渡すと距離として使うことができます。あなたは Y /(|| X ||しかし

お知らせ(あなたがJSAT libraryでものを見つけることができます)、をxはそのTボールの木を使用したい場合はメトリックの有効な距離にコサイン類似度を変換する方法があります。 * || y ||)=(x/|| x ||)T(y/|| y ||)。ユークリッド距離は等価的にsqrt(x T x + y Ty - 2 x T y)と書くことができます。 KNeighborsClassifierに渡す前にすべてのデータポイントを正規化すると、すべてxの場合はx^T x = 1となります。したがって、ユークリッド距離はsqrt(2 − 2x^T y)に低下します。完全に同じ入力の場合はsqrt(2-2*1) = 0、完全な反対の場合はsqrt(2-2*-1)= 2となります。そしてそれは明らかにシンプルな形なので、データを正規化してユークリッド距離を使うことで余弦距離と同じ順序を得ることができます。 uniformウェイトオプションを使用している限り、正しいコサイン距離を使用した場合と同じ結果になります。

関連する問題