コサイン距離は、多くの場合、例えば、算出された類似度を適用する際に使用されます。
- テキスト類似検索
- 顔認識検索
- 類似画像検索
それは理論的根拠を概説します
以下は、コサイン類似度(ウィキペディアからの図)計算値:
しかし、コサイン類似度、および一般的なユークリッド距離又は距離L1が異なっています。
- 範囲-1〜1の間のコサイン類似度。1の正確に同じ値、-1は逆逆直交又は無相関はゼロです。(以下、ソース)
- ユークリッド距離は、一般に、正規化後の0と1の間の正の値です。短い距離、より類似しています。
より直感的な類似検索のためのユークリッド距離。使用に際し、コサイン類似度に変換する必要はコサイン距離ユークリッド距離と類似しています。
ウィキ所定の角距離は(ウィキペディアからの図)を以下のように計算されます。
画像または類似度を計算するテキストので、抽出された特徴が負でない、0から1までの範囲のコサイン類似度は、簡単な方法ので、直接のように定義します:
1-コサイン類似度のコサイン距離=
コード分析
以下のコードは、異なる入力データに応じて二つのモードに分けます。
- 入力データの1次元ベクトルは、画像やテキストの単一(シングルモード)との間の類似度を算出します
- 二次元ベクトル(行列)、複数の画像またはテキスト間の類似性(バッチモード)を計算するための入力データ
1つのインポートNPとしてnumpyの
2デフcosine_distance(B):
3であればa.shape =!B.SHAPE:
4レイズはRuntimeError( "アレイ{}形状が一致してい{}" .format(a.shape、B.SHAPE) ) 5もしa.ndim == 1 : 6 a_norm = np.linalg.norm()7 b_norm = np.linalg.norm(B)8のelif a.ndim == 2 :9 a_norm = np.linalg.norm( 、軸= 1、keepdims = TRUE)10 b_norm = np.linalg.norm(B、軸= 1、keepdims = TRUE)そうでなければ11 :12レイズはRuntimeError( "配列の次元{}はない右" .format(a.ndim ))13 similiarity = np.dot(BT)/(a_norm * b_norm)14 DIST = 1 - similiarity 15戻りDIST
ライン〜。7. 6は、 np.linalg.norm 操作は、ベクトルパラダイムデフォルトのL2ノルムを求めている、ユークリッド距離が必要なベクトルに相当します。
パラメータ軸= 1を設定する10行9、。各正規化された画像処理の個々の特性に対応し、ベクトルが行のデータを処理し、正規化した二次元ベクトルに対する。
13行は、np.dot 操作は、文書の公式な解釈から、2つの動作モードをサポートすることができます。
numpy.
dot
(、 B、 アウト=なし)2つの配列の内積。具体的には、
両方の場合 、A と Bが 1次元配列され、それは(複素共役なし)ベクトルの内積です。
両方の場合 、A と Bは 2次元配列であり、それは行列乗算であるが、使用
matmul
又は 好ましいです。a @ b
一貫性のために、我々は転置操作を使用します。図は、(から次のブログ定義により)、線形代数行列乗算を、乗算を完了するために、行×列でなければなりません。実施例32は、128次元の特徴を計算し、それが32x128 * 128x32ジョブでなければなりません。