はじめに
VECTOR_DISTANCEはOracle Databaseの最新バージョン23aiで登場した関数です。
リファレンスには以下のような記載があります。
VECTOR_DISTANCEは、パラメータとして2つのベクトルを取ります。オプションで、距離を計算するための距離メトリックを指定できます。距離メトリックを指定しない場合、デフォルトの距離メトリックはコサイン距離です。
オプションで、次の短縮ベクトル距離ファンクションを使用できます。
- L1_DISTANCE
- L2_DISTANCE
- COSINE_DISTANCE
- INNER_PRODUCT
ここからわかることは以下の3点です。
1. VECTOR_DISTANCEは2つのベクトル間の距離を出力する関数である。
2. デフォルトではコサイン距離を出力する。
3. メトリックを使用するとL1_DISTANCE、L2_DISTANCE、COSINE_DISTANCE、INNER_PRODUCT関数を呼び出せる。
次から、どのような値を出力するのか見ていきます。
L1_DISTANCE
L1_DISTANCEはマンハッタン距離を出力します。
マンハッタン距離とは、2点間の座標の差の絶対値の和で、碁盤の目状の道を移動する際の距離のことです。

以下のように記述します。
VECTOR_DISTANCE(expr1, expr2, MANHATTAN);
L1_DISTANCE(expr1, expr2);
L2_DISTANCE
L2_DISTANCEはユークリッド距離(EUCLIDEAN)を出力します。
ユークリッド距離とは、空間内の2点間の最短直線距離のことです。
以下のように記述します。
VECTOR_DISTANCE(expr1, expr2, EUCLIDEAN);
L2_DISTANCE(expr1, expr2);
COSINE_DISTANCE
COSINE_DISTANCEはコサイン距離を出力します。
コサイン距離は、ベクトル同士の向きの違いを測るための指標であり、2つのベクトルがどれだけ同じ方向を向いているか、またはどれだけ違う方向を向いているかを表します。
コサイン距離の値が小さいほどベクトルの向きが同じになります。
コサイン距離は次のように表されます。
\text{cosine distance} = 1 - \text{cosine similarity}
ここで出てきたコサイン類似度(cosine similarity)は、2つのベクトル間の角度のコサインを用いて、それらの方向の類似性を-1から1の範囲で表す指標です。
コサイン類似度が1に近いほどベクトルの向きは似ており、0だと2つのベクトルのなす角が直角、-1に近いほどベクトルの向きが逆向きになります。
コサイン類似度は次のように表されます。
\text{cosine similarity} = \frac{A \cdot B}{||A|| \times ||B||}
ベクトルA,Bの内積をAのノルムとBのノルムの積で割ったものです。ここではノルムをベクトルの距離や大きさと考えてもらえればと思います。
以下のように記述します。
VECTOR_DISTANCE(expr1, expr2, COSINE);
L2_DISTANCE(expr1, expr2);
具体例で考えてみる①
例えば、以下のような2つのベクトルがあるとします。
- ベクトルA = [1, 0]
- ベクトルB = [0, 1]
これらのベクトルは直交しており内積が0になることからコサイン類似度は0になります。
このことからコサイン距離は次のように計算されます。
\text{cosine distance} = 1 - 0 = 1
具体例で考えてみる②
以下のような2つのベクトルがあるとします。
- ベクトルC = [1, 1]
- ベクトルD = [2, 2]
これらのベクトルの内積は4、大きさの積も4であることからコサイン類似度は1になります。
このことからコサイン距離は次のように計算されます。
\text{cosine distance} = 1 - 1 = 0
INNER_PRODUCT
INNER_PRODUCTは内積(ドット積)を出力します。
内積は、2つのベクトルがなす角のコサインと各ベクトルの大きさとの積で表され、ベクトルの方向の一致度と大きさを同時に反映した値です。
以下のように記述します。
VECTOR_DISTANCE(expr1, expr2, MANHATTAN);
-1*INNER_PRODUCT(expr1, expr2);
まとめ
リファレンスを参考に、備忘録も兼ねて自分なりの解釈を記載しました。
コサイン距離やコサイン類似度の定義を調べることで理解が深まりました。
参考