ベクトルのノルムとは、ベクトルの長さ(大きさ)を表す指標のことです。ベクトルのマグニチュードと呼ばれることもあります。ノルムは長さ・大きさであるため、ベクトルの成分がすべてゼロである場合を除いて常に正の値になります。
これは、機械学習においては、正則化のメソッドとして、そしてより幅広い行列計算の一部として必要になります。そして算出方法の違いによって、以下の 3 種類があります。
- \(L^1\) ノルム
- \(L^2\) ノルム
- \(L^{inf}\) ノルム
それぞれ一つずつ見ていきましょう。
\(L^1\) ノルム(マンハッタン・ノルム)
ベクトルの \(L^1\) ノルムは \(\|v\|_1\) と表記されます。
\[L^1(v)=\|v\|_1\]
これはベクトルのそれぞれの要素の絶対値の合計で求められます。これで求められる値は、ベクトル空間における原点からのマンハッタン距離を意味します。そのため \(L^1\)ノルムは、タクシーノルムやマンハッタン・ノルムのも言われます。
\[
\|v\|_1 = |a_1|+|a_2|+|a_3|
\]
NumPy では norm()
関数を使って \(L^1\) ノルムを求めることができます。この場合、関数の第二引数には \(L^1\) を示す \(1\) を渡す必要があります。
# NumPy のインポート
import numpy as np
# ベクトルの定義
a = np.array([1, 2, 3])
print(a)
# L1 ノルムの計算
l1=np.linalg.norm(a, 1)
print(l1)
この \(L^1\) ノルムは、正則化メソッドとして機械学習アルゴリズムをフィッティングするときにしばしば使われます。たとえば、モデルの係数を小さいままにして、モデルの複雑さを小さくするメソッドなどです。
\(L^2\) ノルム(ユークリッド・ノルム)
ベクトルの \(L^2\) ノルムは \(\|v\|_2\) と表記されます。
\[L^2(v)=\|v\|_2\]
\(L^2\) ノルムは原点から座標までのユークリッド距離を計算するものです。そのためユークリッド・ノルムとも言われます。これは以下の計算で求められます。
\[
\|v\|_2 = \sqrt{a_1^2+a_2^2+a_3^2}
\]
\(L^2\) ノルムも NumPy の norm()
関数で求めることができます。これを求めるときは第二引数は必要ありません。
# NumPy のインポート
import numpy as np
# ベクトルの定義
a = np.array([3, 2, 1])
print(a)
# L2 ノルムの計算
l2=np.linalg.norm(a)
print(l2)
\(L^1\) ノルムと同じように \(L^2\) ノルムも、正則化メソッドとして機械学習アルゴリズムをフィッティングするときにしばしば使われます。たとえば、モデルの係数を小さいままにして、モデルの複雑さを小さくするメソッドなどです。
機械学習においては、\(L^2\) ノルムは、その他のノルムよりも広く使われています。
\(L^{inf}\) ノルム(ベクトル最大値ノルム)
最大値ノルムは \(\|v\|_{inf}\) と表記されます。
\[
L^{inf}(v)=\|v\|_{inf}
\]
最大値ノルムは文字通り、ベクトルの要素の中の最大値を求めることで取得します。
\[
\|v\|_{inf}
=
{\rm max}|a_1|,|a_2|,|a_3|
\]
最大値ノルムも NumPy の norm()
関数で求めることができます。ただし、第二引数に np.inf を渡す必要があります。
# NumPy のインポート
import numpy as np
# ベクトルの定義
a = np.array([3, 2, 1])
print(a)
# 最大値ノルムの計算
maxnorm=np.linalg.norm(a, np.inf)
print(maxnorm)
最大値ノルムも機械学習における正則化に使われます。最大値ノルム正則化と呼ばれるニューラルネットワークの重みづけなどです。