内積

内積#

k次元のベクトルa=(a1,a2,,ak)T, b=(b1,b2,,bk)Tがあるとき、

i=1kaibi

という演算を内積(inner product)といい、aTbab(a,b)a,bと表す

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

内積と類似度#

Note

コサイン類似度 2つのベクトルa=(a1,a2,,ak)Tb=(b1,b2,,bk)Tについて、

cos(a,b)=aTb||a|| ||b||=i=1kaibii=1kai2i=1kbi2

をコサイン類似度という

aTb=||a|| ||b||cos(a,b)cos(a,b)=aTb||a|| ||b||

コサイン類似度はベクトルを矢印で表現したときに同じ方向を向いているほど1に近く、真逆の方向ほど-1に近くなる

def cos(a, b):
    return (a.T @ b) / (np.linalg.norm(a) * np.linalg.norm(b))

cos(a, b)
1.0000000000000002
Hide code cell source
o = np.array([0, 0])
buffer = 0.1
lim = np.array([-1, 1]) * (1 + buffer)
ticks = [-1, 0, 1]

datasets = [
    [np.array([1, 0]), np.array([0, 1])],
    [np.array([1.1, 0.9]), np.array([0.9, 1.1])],
    [np.array([1, 1]), np.array([-1, -1])],
]
m = len(datasets)
fig, axes = plt.subplots(ncols=m, figsize=[m*3, 2.5])
for i in range(m):
    a, b = datasets[i]
    axes[i].arrow(*o, *a, width=0.02, color="black", length_includes_head=True, alpha=0.7)
    axes[i].arrow(*o, *b, width=0.02, color="black", length_includes_head=True, alpha=0.7)
    axes[i].grid(True, alpha=0.3)
    axes[i].set(title=f"cos(a, b) = {cos(a, b):.2f}", xticks=ticks, yticks=ticks, xlim=lim, ylim=lim)

fig.show()
../../../_images/f7dc900902f03617ef041ddb70fa9cb004b80dc536720c58708891b641b59f45.png

直交#

直交

ベクトルa,bRn

aTb=0

を満たすとき、abは直交しているという