NumPy でベクトルの内積とノルムを計算する

数学

この記事では、NumPy でのベクトルの内積とノルムの計算方法を紹介します。

内積とは

内積はベクトル同士の積の一種で、次のように各要素同士の積の総和です。

$$
\vec{a}=(a_1,a_2,\cdots,a_n)\\
\vec{b}=(b_1,b_2,\cdots,b_n)
$$

のとき、内積 \(\vec{a}\bullet\vec{b}\) は、

$$
\begin{eqnarray}
\vec{a}\bullet\vec{b} &=& (a_1,a_2,\cdots,a_n)\bullet(b_1,b_2,\cdots,b_n)\\
&=& (a{_1}b{_1}+a{_2}b{_2}+\cdots+a{_n}b{_n})\\
&=& \sum\limits_{k=1}^n a_k b_k
\end{eqnarray}
$$

になります。

内積の実装

Numpy の dot() 関数で求めることができる。また、sum() 関数を使って各要素の積の総和としても求めることができます。

import numpy as np

a = np.array([1, 2, 3])
b = np.array([3, 2, 1])

print("--- dot() 関数 ---")
print(np.dot(a,b)) # dot() 関数による内積
print("--- 積の総和 ---")
print(np.sum(a*b)) # 積の総和による内積
出力
--- dot() 関数 ---
10
--- 積の総和 ---
10

ノルムとは

ノルムとは、ベクトルの「大きさ」を表す量です。人工知能でもよく使われ、$L^2$ ノルムと $L^1$ ノルムが代表的です。

\(L^2\) ノルム

\(L_2\) ノルムは \(|\vec{x}|_2\) と表します。ベクトルの各要素を 2 乗和し、平方根をとって計算します。

$$
\begin{eqnarray}
\|\vec{x}\|_2 &=& \sqrt{x^2_1+x^2_2+\cdots+x^2_n}
\\ &=& \sqrt{\sum_{k=1}^{n}x^2_k}
\end{eqnarray}
$$

\(L^1\) ノルム

\(L_1\) ノルムは \(|\vec{x}|_1\) と表します。ベクトルの各要素の絶対値を足し合わせて計算します。

$$
\begin{eqnarray}
\|\vec{x}\|_1 &=& |x_1|+|x_2|+\cdots+|x_n|
\\ &=& {\sum_{k=1}^{n}|x_k|}
\end{eqnarray}
$$

一般化されたノルム

ノルムを一般化した \(L^p\) ノルムは次のように表されます。

$$
\begin{eqnarray}
|\vec{x}|_p &=& (|x_1|^p+|x_2|^p+\cdots+|x_n|^p)^\frac{1}{p}
\\ &=& ({\sum_{k=1}^{n}|x_k|^p})^\frac{1}{p}
\end{eqnarray}
$$

ノルムの実装

ノルムは NumPy の linalg.norm() 関数で求めることができます。

import numpy as np

a = np.array([1, 1, -1, -1])

print("--- L2 ノルム ---")
print(np.linalg.norm(a)) #L2 ノルム
print("--- L1 ノルム ---")
print(np.linalg.norm(a,1)) #L1 ノルム
出力
--- L2 ノルム --- 
2.0 
--- L1 ノルム --- 
4.0

参考文献 など

コメント

タイトルとURLをコピーしました