内積#
\(k\)次元のベクトル\(\boldsymbol{a} = (a_1, a_2, \dots, a_k)^\top, \ \boldsymbol{b} = (b_1, b_2, \dots, b_k)^\top\)があるとき、
という演算を内積(inner product)といい、\(\boldsymbol{a}^\top \boldsymbol{b}\)や\(\boldsymbol{a} \cdot \boldsymbol{b}\)や\((\boldsymbol{a}, \boldsymbol{b})\)や\(\langle\boldsymbol{a}, \boldsymbol{b} \rangle\)と表す
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import japanize_matplotlib
a = np.array([1, 1, 1])
b = np.array([2, 2, 2])
a.T @ b
6
ノルム#
ベクトル\(\boldsymbol{a}\)に対して\(\sqrt{\boldsymbol{a}^\top \boldsymbol{b}}\)をベクトル\(\boldsymbol{a}\)の 長さ または ノルム(norm) といい、\(\|\boldsymbol{a}\|\)で表す。すなわち
である。
内積と類似度#
コサイン類似度#
Note
コサイン類似度
2つのベクトル\(\boldsymbol{a} = (a_1, a_2, \dots, a_k)^T\)と\(\boldsymbol{b} = (b_1, b_2, \dots, b_k)^T\)について、
をコサイン類似度という
コサイン類似度はベクトルを矢印で表現したときに同じ方向を向いているほど1に近く、真逆の方向ほど-1に近くなる
def cos(a, b):
return (a.T @ b) / (np.linalg.norm(a) * np.linalg.norm(b))
cos(a, b)
1.0000000000000002
直交#
直交
ベクトル\(\boldsymbol{a}, \boldsymbol{b} \in \mathbb{R}^n\)が
を満たすとき、\(\boldsymbol{a}, \boldsymbol{b}\)は直交しているという
コーシー・シュワルツの不等式#
コサイン類似度が \([-1, 1]\) の範囲に正規化される理由
定理(コーシー・シュワルツの不等式)
ベクトル\(\boldsymbol{a}, \boldsymbol{b}\)に対し、
が成立する。等号になるのは \(\boldsymbol{a} = 0\) または \(\boldsymbol{a} = c \boldsymbol{b} \ (c \in \mathbb{R})\) のとき(1次独立でないとき)に限る
平方根をとれば
となり、それを変形すると
なので両辺を\(\| \boldsymbol{a} \| \cdot \| \boldsymbol{b} \|\)で割れば