2024.6.11 行列ノルム【numpy】
=============
定義と性質
=============
行列のノルムはベクトルのノルムを使って定義される。
$ ||A|| = \max_{\mathbf{x}\neq 0} \frac{||A\mathbf{x}||}{||\mathbf{x}||}
右辺の$ A\mathbf{x}はベクトルなので、$ ||A\mathbf{x}||はベクトルノルム、すなわちスカラの値を求めている。
右辺の$ ||\mathbf{x}||もノルムなのでスカラ値である。
$ ||\alpha A|| = \alpha ||A||
$ ||A+B|| \leq ||A|| + ||B||
$ ||AB|| \leq ||A||\cdot ||B||
code:norm_matrix.py
import numpy as np
import numpy.linalg as npal
data = 3, 5, 3], [2, -3, -2
x = np.array(data, dtype=float)
print('# 元の行列')
print(x)
=======================
誘導ノルム(induced norm, 作用素ノルム:operator norm)
=======================
$ m行$ n列の行列$ A =(a_{ij})の誘導$ pノルムは、任意の$ n次元ベクトル$ \bm{x}を用いて次のように定義される。
$ ||A||_p = \max_{\bm{x}\neq \bm{0}} \frac{||A\bm{x}||_p}{||\bm{x}||_p} = \max_{||\bm{x}||_p =1} ||A\bm{x}||_p
1ノルム
最大列和、すなわち行列の各列ごとに成分の絶対値の合計を求めたもののうちで、最大の値のこと。
$ ||A||_1 = \max_{}\sum_{i=1}^{m} |a_{ij}|
code:(続き).py
y1 = npal.norm(x, ord=1) # numpyによる
z1 = np.abs(x).sum(axis=0).max() # 定義式による
print('# 1ノルム: ', y1, z1)
2ノルム、スペクトルノルム
行列$ Aの最大特異値、$ AA^\topもしくは$ A^\top Aの最大固有値の平方根。
$ ||A||_2 = \max_{\mathbf{x}\neq 0} \frac{||A\mathbf{x}||_2}{||\mathbf{x}||_2} = \sqrt{\max_{\mathbf{x}\neq 0} \frac{\mathbf{x}^\top A^\top A \mathbf{x}}{\mathbf{x}^\top \mathbf{x}}}
$ ||A||_2 = \sigma_{\max}(A) =\sqrt{\lambda_{\mathrm{max}}(A^*A)}
code:(続き).py
y2 = npal.norm(x, ord=2) # numpyによる
z2 = np.max(np.abs(npal.svd(x)1)) # 定義式による
print('# 2ノルム:', y2, z2)
(参考)固有値と特異値
$ \inftyノルム
最大行和、すなわち行列の各行ごとに成分の絶対値の合計を求めたもののうちで、最大の値のこと。
$ ||A||_\infty
code:(続き).py
yinf = npal.norm(x, ord=np.inf) # numpyによる
zinf = np.max(np.sum(np.abs(x), axis=1)) # 定義式による
print('# infノルム:', yinf, zinf)
=====================
成分ごとのノルム
=====================
フロベニウスノルム
行列を構成する要素を1列に並べて得られたベクトルのL2ノルムのこと。
行列の各成分を自乗した値の和の平方根としても得られる。
$ ||A||_F = \sqrt{\sum_j \sum_i a_{ij}^2}
code:(続き).py
yfro = npal.norm(x, ord='fro') # numpyによる
zfro = np.sqrt((np.power(x, 2)).sum()) # 定義式による
print('# フロベニウスノルム(ord:デフォルト):', yfro, zfro)
最大値ノルム
行列を構成する要素を1列に並べて得られたベクトルの$ L_\inftyノルムのこと。
行列の成分のうちの絶対値が最大の値としても得られる。
$ ||A||_{\max} = \max_{i,j}(|a_{ij}|)
code:(続き).py
# ymax = npal.norm(x, ord=None)
zmax = np.max(np.abs(x))
print('# 最大値ノルム:', zmax)
================================
トレースノルム、核型ノルム(nuclear norm)
$ ||A||_{\mathrm{trace}}= \sqrt{\mathrm{tr}(A^*A)} = \sum_{i=1}^{\min (m, n)}\sigma_i
混合 L1, 2ノルム
行列を構成するサブベクトルごとにL2ノルム(ベクトル)を計算した後にその総和をとったもの。
$ ||A||_{1, 2} = \sum ||{\bm a}_j||_2
ただし、$ a_jは行列$ Aのサブベクトル(行列を構成するベクトル)
$ A = \left[ {\bm a}_1, {\bm a}_2, \cdots , {\bm a}_n \right]
TIPS
行列ノルムはスカラやベクトルに対しては適用できない。例えはフロベニウスノルムは行列ノルムであるので、2次元のarray-like以外の次元の値にはエラーを返す。
code:norm_mat2.py
import numpy as np
s = np.array(1) # 0次元
v = np.array(1,2) # 1次元
t = np.array(1,2) # 3次元
print(np.linalg.norm(s, ord='fro'))
print(np.linalg.norm(v, ord='fro'))
print(np.linalg.norm(t, ord='fro'))
(参考)2024.6.11 ベクトルノルム【numpy】