この記事では、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
参考文献 など
- 我妻幸長『Python で動かして学ぶ! 数学の教科書』(翔泳社、2019)
- 【WordPress】WordPressでTeXを使う方法
- TeX(LaTeX)で数式のイコールをそろえる(eqnarray)
- WordPressのシンタックスハイライトは【Highlighting Code Block】がおすすめ
コメント