numpyライブラリめちゃくちゃ便利ですよね。numpyには、線形代数のライブラリである、numpy.linalgモジュールが非常に便利です。
linalgモジュールは、BLAS、LAPCKを内部的にロードしており、非常に高速に行列演算を行うことができます。
本記事のまとめ方針としては、基本的にNumpyの公式ドキュメントの内容に基づいてまとめ、できるだけわかりやすく用途別にまとめでいきます。
本記事の内容
- ベクトルのノルム(ユークリッド距離)を計算する方法
- ベクトルの内積を計算する方法
ベクトルのノルム(ユークリッド距離)の計算
ベクトルのノルム
任意の次元(N次元とする)の2点$x$、$y$があったとき、ベクトルのノルム$d(x, y)$ は以下のように計算される。これはユークリッド距離とも言われている。
\begin{equation} d(x, y) = \sqrt{\sum_{i}^{N}(x_i - y_i)^2} \end{equation}
Pythonを用いてこの定義通りに1から計算することもできますが、numpy.linalg.norm を用いると便利です。
x = np.array([0, 0])
y = np.array([2, 2])
d = np.linalg.norm(x-y)
# 2.8284271247461903
ベクトルの内積の計算をする方法
ベクトルの内積
N次元のベクトル$\bm{x}$、$\bm{y}$があったとき、内積$\bm{x} \cdot \bm{y}$ は次のように計算される。
\begin{equation} \bm{x} \cdot \bm{y} = x_1y_1 + x_2 y_2 + \cdots + x_ny_n \end{equation}
この計算も(2)の定義式からそのまま計算できますが、numpyの関数を使うと便利です。
x = [2, 3, 1, -1, 5, 10]
y = [4, 1, -1, 1, 5, 8]
np.dot(x, y)
# => 114
np.dot(y, x)
# => 114
(2)の定義式を見ても明らかですが、内積計算においては、2つのベクトルを交換しても同じ値になります。つまり、下記の交換則が成り立ちます。
\bm{x} \cdot \bm{y} = \bm{y} \cdot \bm{x}