ノルム( norm )は単一のベクトルに対して定義される 大きさ を表す数学的な指標です。
2 次元ベクトル $\mathbf{x} = (x_1, x_2)$ における代表的なノルムである $L_2$ ノルムと $L_1$ ノルム についてまとめます。

1. L_2$ ノルム(ユークリッドノルム)

通常、ベクトルの大きさは $L_2$ ノルムを指します。
原点から点 $(x_1, x_2)$ までの直線距離を表し次の式で定義されます。

\[\|\mathbf{x}\|_2 = \sqrt{x_1^2 + x_2^2}\]

特徴

  • 三平方の定理(ピタゴラスの定理)に基づいた距離です
  • 機械学習などの最適化では、正則化($L_2$ 正則化 / Ridge)として利用されます

2. $L_1$ ノルム(マンハッタンノルム)

各成分の絶対値の和で計算されるノルムです。
格子状の街路(マンハッタンの街並み)を直線ではなく道に沿って移動したときの距離に対応します。
$L_1$ ノルムは次の式で定義されます。

\[\|\mathbf{x}\|_1 = |x_1| + |x_2|\]

特徴

  • 直線距離ではなく、軸に平行な移動距離の和となります
  • 機械学習における $L_1$ 正則化(Lasso)では、不必要なパラメータの重みを正確に 0 にする(スパース性を高める)性質があります

2 ベクトル間の距離

2 つのベクトル $\mathbf{x} = (x_1, x_2)$ と $\mathbf{y} = (y_1, y_2)$ の距離(差のノルム)は以下のように計算されます。

ユークリッド距離 ($L_2$)

\[\|\mathbf{x} - \mathbf{y}\|_2 = \sqrt{(x_1 - y_1)^2 + (x_2 - y_2)^2}\]

マンハッタン距離 ($L_1$)

\[\|\mathbf{x} - \mathbf{y}\|_1 = |x_1 - y_1| + |x_2 - y_2|\]

まとめ比較表

項目 $L_1$ ノルム $L_2$ ノルム        
名称 マンハッタンノルム ユークリッドノルム        
計算式 $ x_1 + x_2 $ $\sqrt{x_1^2 + x_2^2}$
幾何学的意味 格子状の移動距離 原点からの直線距離        
単位円の形状 ひし形(ダイヤ型) 正円        

フロベニウスノルム(行列のノルム)

行列 $W$ に対する $L_2$ ノルムはフロベニウスノルムと呼ばれ、全要素の 2 乗和の平方根で定義されます。

\[\|W\|_F = \sqrt{\sum_{i,j} w_{ij}^2}\]

機械学習では、重み行列 $W$ の大きさを測る指標として $L_2$ 正則化(Weight Decay)などで使われます。

import numpy as np

# 1. 2x2 の ndarray を定義
w = np.array([[1, 2],
              [3, 4]])

# 2. 各要素を 2 乗する (Element-wise)
# 結果: [[1, 4], [9, 16]]
w_squared = w ** 2

# 3. 要素の 2 乗和を計算
# 計算: 1 + 4 + 9 + 16 = 30
sum_squared = np.sum(w_squared)

# 4. 平方根をとってフロベニウスノルムを算出
# 計算: √30 ≈ 5.4772
frobenius_norm = np.sqrt(sum_squared)

# (参考)NumPy の標準関数を使う場合
frobenius_norm_np = np.linalg.norm(w)

print(f"元の配列 w:\n{w}")
print(f"2乗した配列 w**2:\n{w_squared}")
print(f"2乗和 sum_squared: {sum_squared} (型: {type(sum_squared)})")
print(f"フロベニウスノルム frobenius_norm: {frobenius_norm:.4f} (型: {type(frobenius_norm)})")
print(f"np.linalg.norm(w) の結果: {frobenius_norm_np:.4f}")

# 元の配列 w:
# [[1 2]
#  [3 4]]
# 2乗した配列 w**2:
# [[1  4]
#  [9 16]]
# 2乗和 sum_squared: 30 (型: <class 'numpy.int64'>)
# フロベニウスノルム frobenius_norm: 5.4772 (型: <class 'numpy.float64'>)
# np.linalg.norm(w) の結果: 5.4772