ベクトルの大きさと単位ベクトル

ベクトルの大きさと単位ベクトル

 

ベクトルの大きさ

 スカラーには数直線上のある点 $x$ について、原点からの距離を表す 絶対値 $|x|$ が定義されています。ベクトルについても同じように、その大きさのみに着目した値を定義できます。

ユークリッドノルム

 2 次元ベクトル $\boldsymbol{v}=\begin{bmatrix}v_1\\v_2\end{bmatrix}$ の大きさ(長さ)は
 
\[\parallel\boldsymbol{v}\parallel=\sqrt{v_1^2+v_2^2}\]
によって定義されます。$n$ 次元ベクトルについても同様に、
 
\[\parallel\boldsymbol{v}\parallel=\sqrt{v_1^2+v_2^2+\ \cdots\ +v_n^2}\tag{1}\]
と定義します。一般に (1) によって定義された量を ユークリッドノルム (Euclidean norm) とよびます。ユークリッドノルムは numpy.sqrt() と numpy.sum() を使って実装できます。

# numpy_vector_norm

# In[1]

import numpy as np

# ベクトルを定義
v = np.array([1, 2, 3])

# ベクトルvの大きさ(ノルム)を計算
v_n = np.sqrt(np.sum(v**2))

print(v_n)
3.742

 

scipy.linalg.norm()

 scipy.linalg.norm() を使ってベクトルの大きさを計算することができます。

scipy.linalg.norm(a, ord=None, axis=None, keepdims=False)

 第 1 引数 a にベクトル (1次元配列) を渡すと、ベクトルの大きさ (ユークリッドノルム) を返します。

# scipy_vector_norm

# In[1]

import numpy as np
from scipy.linalg import norm

# ベクトルを定義
v = np.array([1, 2, 3])

# ベクトルvの大きさ(ノルム)を計算
v_n = norm(v)

print(v_n)
3.742

 第 1 引数に 2 次元配列を渡して axis で軸を指定すると、軸に沿ってノルムを計算します。たとえば、ベクトル [1 2 3] の大きさと、ベクトル [4 5 6] の大きさをまとめて計算することができます:

# In[2]

# 2次元配列を定義
a = np.array([[1, 2, 3],
              [4, 5, 6]])

# 第1軸(横軸)に沿ってノルムを計算
a_n = norm(a, axis = 1)

# 数値を丸める
a_n = np.round(a_n, 3)

print(a_n)
[3.742 8.775]

 NumPy にも numpy.linalg.norm() という関数が用意されていますが、機能は scipy.linalg.norm() とほとんど同じなので解説は割愛します。
 

線形代数セミナー: 射影,特異値分解,一般逆行列

新品価格
¥2,530から
(2019/10/27 13:08時点)

単位ベクトル

 長さ $1$ のベクトルは 単位ベクトル とよばれます。
 任意のベクトル $\boldsymbol{v}$ を自身の長さ $\parallel\boldsymbol{v}\parallel$ で割れば単位ベクトルとなります。

 たとえば、$\boldsymbol{v}=\begin{bmatrix}1\\1\end{bmatrix}$ の長さは $\sqrt{1^2+1^2}=\sqrt{2}$ なので、
 
\[\boldsymbol{v}=\frac{1}{\sqrt{2}}\begin{bmatrix}1\\1\end{bmatrix}\]
は単位ベクトルです。

# python_unit_vector

# In[1]

import numpy as np
from scipy.linalg import norm
np.set_printoptions(precision=3)

# ベクトルを定義
v = np.array([1, 1])

# 単位ベクトルを作成
u = v / norm(v)

print(u)
[0.707 0.707]

 複数のベクトルの大きさを $1$ に揃えることもできます。

# In[2]

# 2次元配列を定義
a = np.array([[1, 2, 3],
              [4, 5, 6]])

# 行ベクトルを正規化
a = a / norm(a, axis = 1, keepdims=True)

print("a:\n{}".format(a))

# 行ベクトルのノルムを確認
a_norm = norm(a, axis = 1, keepdims=True)

print("aの行ごとのノルム:\n{}".format(a_norm))
a:
[[0.267 0.535 0.802]
 [0.456 0.57  0.684]]

aの行ごとのノルム:
[[1.]
 [1.]]