1のようなものを使用することは可能ですか-scikitlearnのKNeighborsClassifierとのコサイン類似性?
This 回答は「いいえ」と表示されますが、 documentation のKNeighborsClassifierでは、 DistanceMetrics に記載されているメトリックが使用可能であると表示されます。距離メトリックには明示的なコサイン距離が含まれていません。これはおそらく実際には距離ではないためですが、おそらくメトリックに関数を入力することは可能です。 scikit learn linear kernelをKNeighborsClassifierに入力しようとしましたが、関数に引数として2つの配列が必要であるというエラーが表示されます。他の誰かがこれを試しましたか?
コサイン類似度は一般にxとして定義されますT y /(|| x || * || y ||)であり、同じ場合は1を出力し、完全に異なる場合は-1になります。この定義は技術的にはメトリックではないため、ボールやkdツリーなどの加速構造を使用することはできません。 scikitにブルートフォースアプローチの使用方法を強制的に学習させる場合、独自のカスタム距離メトリックオブジェクトを渡すと、距離として使用できるはずです。ボールツリーを使用する場合は、コサイン類似度を有効な距離メトリックに変換する方法があります( JSATライブラリ で見つけることができます)
ただし、そのxに注意してくださいT y /(|| x || * || y ||)=(x/|| x ||)T (y/|| y ||)。ユークリッド距離は、sqrt(xTx + yTy − 2 xTy)。 KNeighborsClassifierに渡す前にすべてのデータポイントを正規化すると、すべてのx
に対して_x^T x = 1
_になります。したがって、ユークリッド距離はsqrt(2 − 2x^T y)
に低下します。完全に同じ入力の場合はsqrt(2-2*1) = 0
を取得し、完全に反対の場合はsqrt(2-2*-1)= 2
を取得します。また、明らかに単純な形状であるため、データを正規化してからユークリッド距離を使用することで、コサイン距離と同じ順序を取得できます。 uniform
weightsオプションを使用している限り、結果は正しいコサイン距離を使用した場合と同じになります。
KNNファミリークラスコンストラクターにはmetric
というパラメーターがあり、最近傍モデルで使用するさまざまな距離メトリックを切り替えることができます。利用可能な距離メトリックのリストを見つけることができます ここ