応用数学 ch6メモ(主軸変換とその応用:主成分分析、特異値分解)
6.1 主成分分析 ¶ 主軸変換 ¶ ベクトルx x x を単位ベクトルu u u の延長上の線l l l に射影した長さは、それらの内積
( u 1 , x α ) = ∥ u 1 ∥ ⋅ ∥ x α ∥ cos θ α = ∥ x α ∥ cos θ α \left(\boldsymbol{u}_1, \boldsymbol{x}_\alpha\right)=\left\|\boldsymbol{u}_1\right\| \cdot\left\|\boldsymbol{x}_\alpha\right\| \cos \theta_\alpha=\left\|\boldsymbol{x}_\alpha\right\| \cos \theta_\alpha ( u 1 , x α ) = ∥ u 1 ∥ ⋅ ∥ x α ∥ cos θ α = ∥ x α ∥ cos θ α に等しい
原点O O O を平均とするN N N 点{ x α } \{x_{\alpha} \} { x α } をl l l 上に射影した長さの平均は常に零である
1 N ∑ α = 1 N ( u 1 , x α ) = ( u 1 , 1 N ∑ α = 1 N x α ) = ( u 1 , 0 ) = 0 \frac{1}{N} \sum_{\alpha=1}^N\left(u_1, x_\alpha\right)
=\left(u_1, \frac{1}{N} \sum_{\alpha=1}^N x_\alpha\right)
=\left(u_1, 0 \right)
= 0 N 1 α = 1 ∑ N ( u 1 , x α ) = ( u 1 , N 1 α = 1 ∑ N x α ) = ( u 1 , 0 ) = 0 原点O O O を平均とするN N N 点{ x α } \{x_{\alpha} \} { x α } をl l l 上に射影した長さの 二乗の平均 は
S = 1 N ∑ α = 1 N ( u 1 , x α ) 2 = 1 N ∑ α = 1 N u 1 ⊤ x α x α ⊤ u 1 = u 1 ⊤ ( 1 N ∑ α = 1 N x α x α ⊤ ) u 1 \begin{aligned}
S &= \frac{1}{N} \sum_{\alpha=1}^N\left(\boldsymbol{u}_1, \boldsymbol{x}_\alpha\right)^2\\
&= \frac{1}{N} \sum_{\alpha=1}^N \boldsymbol{u}_1^{\top} \boldsymbol{x}_\alpha \boldsymbol{x}_\alpha^{\top} \boldsymbol{u}_1\\
&= \boldsymbol{u}_1^{\top}\left(\frac{1}{N} \sum_{\alpha=1}^N \boldsymbol{x}_\alpha \boldsymbol{x}_\alpha^{\top}\right) \boldsymbol{u}_1\\
\end{aligned} S = N 1 α = 1 ∑ N ( u 1 , x α ) 2 = N 1 α = 1 ∑ N u 1 ⊤ x α x α ⊤ u 1 = u 1 ⊤ ( N 1 α = 1 ∑ N x α x α ⊤ ) u 1 となる。このとき、
V : = 1 N ∑ α = 1 N x α x α ⊤ V:= \frac{1}{N} \sum_{\alpha=1}^N \boldsymbol{x}_\alpha \boldsymbol{x}_\alpha^{\top} V := N 1 α = 1 ∑ N x α x α ⊤ を分散共分散行列とよぶ。
分散S S S を最大化する方向u 1 u_1 u 1 を 主方向 と呼ぶ。
共分散行列Vは半正値対称行列
( x , V x ) = ( x , ( 1 N ∑ α = 1 N x α x α ⊤ ) x ) = 1 N ∑ α = 1 N ( x , x α x α ⊤ x ) = 1 N ∑ α = 1 N ( x , x α ) ( x α , x ) = 1 N ∑ α = 1 N ( x , x α ) 2 ≥ 0 \begin{aligned}
(\boldsymbol{x}, \boldsymbol{V} \boldsymbol{x}) & =\left(\boldsymbol{x},\left(\frac{1}{N} \sum_{\alpha=1}^N \boldsymbol{x}_\alpha \boldsymbol{x}_\alpha^{\top}\right) \boldsymbol{x}\right)=\frac{1}{N} \sum_{\alpha=1}^N\left(\boldsymbol{x}, \boldsymbol{x}_\alpha \boldsymbol{x}_\alpha^{\top} \boldsymbol{x}\right) \\
& =\frac{1}{N} \sum_{\alpha=1}^N\left(\boldsymbol{x}, \boldsymbol{x}_\alpha\right)\left(\boldsymbol{x}_\alpha, \boldsymbol{x}\right)=\frac{1}{N} \sum_{\alpha=1}^N\left(\boldsymbol{x}, \boldsymbol{x}_\alpha\right)^2 \geq 0
\end{aligned} ( x , V x ) = ( x , ( N 1 α = 1 ∑ N x α x α ⊤ ) x ) = N 1 α = 1 ∑ N ( x , x α x α ⊤ x ) = N 1 α = 1 ∑ N ( x , x α ) ( x α , x ) = N 1 α = 1 ∑ N ( x , x α ) 2 ≥ 0 N N N 点{ x α } \{x_{\alpha} \} { x α } の主方向はVの最大固有値λ 1 \lambda_1 λ 1 に対する固有ベクトルu 1 u_1 u 1 の方向であり、その方向の分散はλ 1 \lambda_1 λ 1 である
主軸を座標系にとるとその座標系では共分散行列はどうなるか ¶ 元の座標系の点 x α \boldsymbol{x}_\alpha x α は,新しい座標系では x α ′ = U ⊤ x α \boldsymbol{x}_\alpha^{\prime}=\boldsymbol{U}^{\top} \boldsymbol{x}_\alpha x α ′ = U ⊤ x α と書ける.その共分散行列は次のようになる。
V ′ = 1 N ∑ α = 1 N x α ′ x α ′ ⊤ = 1 N ∑ α = 1 N ( U ⊤ x α ) ( U ⊤ x α ) ⊤ = 1 N ∑ α = 1 N U ⊤ x α x α ⊤ U = U ⊤ ( 1 N ∑ α = 1 N x α x α ⊤ ) U = U ⊤ V U = ( λ 1 λ 2 ⋱ λ n ) \begin{aligned}
\boldsymbol{V}^{\prime}
&=\frac{1}{N} \sum_{\alpha=1}^N \boldsymbol{x}_\alpha^{\prime} \boldsymbol{x}_\alpha^{\prime \top}\\
&=\frac{1}{N} \sum_{\alpha=1}^N\left(\boldsymbol{U}^{\top} \boldsymbol{x}_\alpha\right)\left(\boldsymbol{U}^{\top} \boldsymbol{x}_\alpha\right)^{\top}\\
&=\frac{1}{N} \sum_{\alpha=1}^N \boldsymbol{U}^{\top} \boldsymbol{x}_\alpha \boldsymbol{x}_\alpha^{\top} \boldsymbol{U}\\
&=\boldsymbol{U}^{\top}\left(\frac{1}{N} \sum_{\alpha=1}^N \boldsymbol{x}_\alpha \boldsymbol{x}_\alpha^{\top}\right) \boldsymbol{U}\\
&=\boldsymbol{U}^{\top} \boldsymbol{V} \boldsymbol{U}\\
&=\left(\begin{array}{cccc}
\lambda_1 & & & \\
& \lambda_2 & & \\
& & & \\
& & \ddots & \\
& & & \lambda_n
\end{array}\right)
\end{aligned} V ′ = N 1 α = 1 ∑ N x α ′ x α ′⊤ = N 1 α = 1 ∑ N ( U ⊤ x α ) ( U ⊤ x α ) ⊤ = N 1 α = 1 ∑ N U ⊤ x α x α ⊤ U = U ⊤ ( N 1 α = 1 ∑ N x α x α ⊤ ) U = U ⊤ V U = ⎝ ⎛ λ 1 λ 2 ⋱ λ n ⎠ ⎞ すなわち、共分散行列V V V の固有値を対角要素とする対角行列になる。
このように主軸方向に新しい座標系をとることを 主軸変換 という。
画像の展開 ¶ m × m m\times m m × m 画素の大きさの画像があるとし、( i , j ) (i,j) ( i , j ) 画素の濃淡値がf i j f_{ij} f ij の画像をf i j = ( f i j ) \boldsymbol{f}_{ij} = (f_{ij}) f ij = ( f ij ) とする。
画像の内積とノルム ¶ 画像f i j = ( f i j ) \boldsymbol{f}_{ij} = (f_{ij}) f ij = ( f ij ) 、g i j = ( g i j ) \boldsymbol{g}_{ij} = (g_{ij}) g ij = ( g ij ) の内積と画像f i j = ( f i j ) \boldsymbol{f}_{ij} = (f_{ij}) f ij = ( f ij ) のノルムを次のように定義する
( f , g ) = ∑ i , j = 1 m f i j g i j , ∥ f ∥ = ( f , f ) = ∑ i , j = 1 m f i j 2 (\boldsymbol{f}, \boldsymbol{g})=\sum_{i, j=1}^m f_{i j} g_{i j}, \quad\|\boldsymbol{f}\|=\sqrt{(\boldsymbol{f}, \boldsymbol{f})}=\sqrt{\sum_{i, j=1}^m f_{i j}^2} ( f , g ) = i , j = 1 ∑ m f ij g ij , ∥ f ∥ = ( f , f ) = i , j = 1 ∑ m f ij 2 内積が0となる2つの画像は互いに直交するという
画像の基底 ¶ m 2 m^2 m 2 個の画素を持つ任意の画像がある m 2 m^2 m 2 個の画像 e 1 , e 2 , … , e m 2 \boldsymbol{e}_1, \boldsymbol{e}_2, \ldots, \boldsymbol{e}_{m^2} e 1 , e 2 , … , e m 2 の線形結合でただ一通りに表せるとき,{ e i } \left\{e_i\right\} { e i } を基底と呼び,各 e i e_i e i を基底画像と呼ぶ。 これらが互いに直交するとき,その基底を直交基底と呼び,さらに各画像の ノルムがすべて 1 のとき正規直交基底と呼ぶ.
画像の展開 ¶ 一部の基底画像によって
f ≈ c 1 e 1 + c 2 e 2 + ⋯ + c n e n , n < m 2 \boldsymbol{f} \approx c_1 \boldsymbol{e}_1+c_2 \boldsymbol{e}_2+\cdots+c_n \boldsymbol{e}_n, \quad n<m^2 f ≈ c 1 e 1 + c 2 e 2 + ⋯ + c n e n , n < m 2 と近似することを 展開 とよぶ。
近似の尺度として二乗誤差∥ f − ∑ i = 1 n c i e i ∥ 2 \left\|\boldsymbol{f}-\sum_{i=1}^n c_i \boldsymbol{e}_i\right\|^2 ∥ f − ∑ i = 1 n c i e i ∥ 2 を用いると、各係数c i c_i c i は
c i = ( f , e i ) , i = 1 , … , n c_i=\left(\boldsymbol{f}, \boldsymbol{e}_i\right), \quad i=1, \ldots, n c i = ( f , e i ) , i = 1 , … , n 証明
この誤差関数を最小化する c i c_i c i を求める:
E ( c 1 , … , c n ) = ∥ f − ∑ i = 1 n c i e i ∥ 2 E\left(c_1, \ldots, c_n\right)=\left\|f-\sum_{i=1}^n c_i e_i\right\|^2 E ( c 1 , … , c n ) = ∥ ∥ f − i = 1 ∑ n c i e i ∥ ∥ 2 これは内積を用いて次のように展開できる:
E = ( f − ∑ i = 1 n c i e i , f − ∑ j = 1 n c j e j ) = ( f , f ) − 2 ∑ i = 1 n c i ( f , e i ) + ∑ i = 1 n ∑ j = 1 n c i c j ( e i , e j ) \begin{gathered}
E=\left(f-\sum_{i=1}^n c_i e_i, f-\sum_{j=1}^n c_j e_j\right) \\
=(f, f)-2 \sum_{i=1}^n c_i\left(f, e_i\right) + \sum_{i=1}^n \sum_{j=1}^n c_i c_j\left(e_i, e_j\right)
\end{gathered} E = ( f − i = 1 ∑ n c i e i , f − j = 1 ∑ n c j e j ) = ( f , f ) − 2 i = 1 ∑ n c i ( f , e i ) + i = 1 ∑ n j = 1 ∑ n c i c j ( e i , e j ) ここで基底が正規直交なので:
( e i , e j ) = { 1 i = j 0 i ≠ j \left(e_i, e_j\right)= \begin{cases}1 & i=j \\ 0 & i \neq j\end{cases} ( e i , e j ) = { 1 0 i = j i = j よって∑ i = 1 n ∑ j = 1 n c i c j ( e i , e j ) \sum_{i=1}^n \sum_{j=1}^n c_i c_j\left(e_i, e_j\right) ∑ i = 1 n ∑ j = 1 n c i c j ( e i , e j ) の項は ∑ i = 1 n c i 2 \sum_{i=1}^n c_i^2 ∑ i = 1 n c i 2 となり、したがって誤差関数は
E = ∥ f ∥ 2 − 2 ∑ i = 1 n c i ( f , e i ) + ∑ i = 1 n c i 2 E=\|f\|^2-2 \sum_{i=1}^n c_i\left(f, e_i\right)+\sum_{i=1}^n c_i^2 E = ∥ f ∥ 2 − 2 i = 1 ∑ n c i ( f , e i ) + i = 1 ∑ n c i 2 となる。これを各 c k c_k c k について偏微分してゼロとおくと
∂ E ∂ c k = − 2 ( f , e k ) + 2 c k = 0 ⇒ c k = ( f , e k ) \frac{\partial E}{\partial c_k}=-2\left(f, e_k\right)+2 c_k=0 \quad \Rightarrow \quad c_k=\left(f, e_k\right) ∂ c k ∂ E = − 2 ( f , e k ) + 2 c k = 0 ⇒ c k = ( f , e k ) 画像の基底 ¶ 自明な基底 ¶ m × m m \times m m × m 画像の ( i , j ) (i, j) ( i , j ) 画素のみが 1 で,残りの画素がすべて 0 である画像を e i j \boldsymbol{e}_{i j} e ij とすると,任意の画像 f = ( f i j ) \boldsymbol{f}=\left(f_{i j}\right) f = ( f ij ) は次のように { e i j } \left\{\boldsymbol{e}_{i j}\right\} { e ij } の線形結合で表せる.
f = ∑ i , j = 0 m − 1 f i j e i j \boldsymbol{f}=\sum_{i, j=0}^{m-1} f_{i j} e_{i j} f = i , j = 0 ∑ m − 1 f ij e ij この m 2 m^2 m 2 枚の画像 { e i j } , i , j = 0 , … , m − 1 \left\{\boldsymbol{e}_{i j}\right\}, i, j=0, \ldots, m-1 { e ij } , i , j = 0 , … , m − 1 を自明な基底という.しかし,各 e i j \boldsymbol{e}_{i j} e ij は 1 点のみが光る画像であり,画像としての意味はない.
アダマール変換の基底 ¶ 次のような基底を考える.
すべての画素が 1 の画像を考える.
画像を ( m / 2 ) × ( m / 2 ) (m / 2) \times(m / 2) ( m /2 ) × ( m /2 ) 画素の 4 枚の小画像に分割する
その内の 2 枚のすべて の画素を 1 ,残りの 2 枚のすべての画素を -1 とする。ただし,すでに作った画像と同じ,または 1 と -1 を反転すると同じになるものは除く
各々 の ( m / 2 ) × ( m / 2 ) (m / 2) \times(m / 2) ( m /2 ) × ( m /2 ) 小画像をさらに 4 枚の ( m / 4 ) × ( m / 4 ) (m / 4) \times(m / 4) ( m /4 ) × ( m /4 ) 小画像に分割
以下同様にする
このような基底による画像の展開を アダマール変換 という
別の言い方
アダマール変換(Hadamard Transform)とは、
「入力ベクトルに対して、非常にシンプルな +1 と -1 のみを使った線形変換」
from scipy.linalg import hadamard
print(hadamard(2))import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import hadamard
# アダマール行列を作成(サイズは2のべき乗)
n = 4
H = hadamard(2**n)
# プロット
plt.figure(figsize=(3, 3))
plt.imshow(H, cmap='gray', interpolation='nearest')
plt.title(f"Hadamard Matrix (size {2**n}×{2**n})")
plt.show()離散コサイン変換の基底 ¶ 次のように定義した基底 { e k l } , k = 0 , 1 , … , m − 1 ; l = 0 , 1 , … , m − 1 \left\{\boldsymbol{e}_{k l}\right\}, k=0,1, \ldots, m-1 ; l=0,1, \ldots, m-1 { e k l } , k = 0 , 1 , … , m − 1 ; l = 0 , 1 , … , m − 1 ,は正規直交基底である。
e k l = ( 2 α k α l m cos π k ( 2 p + 1 ) 2 N cos π l ( 2 q + 1 ) 2 N ) \boldsymbol{e}_{k l}=\left(\frac{2 \alpha_k \alpha_l}{m} \cos \frac{\pi k(2 p+1)}{2 N} \cos \frac{\pi l(2 q+1)}{2 N}\right) e k l = ( m 2 α k α l cos 2 N πk ( 2 p + 1 ) cos 2 N π l ( 2 q + 1 ) ) 右辺のカッコの中は画像 e k l \boldsymbol{e}_{k l} e k l の ( p , q ) (p, q) ( p , q ) 画素の値を表す.ただし,次のように置 いた。
α k = { 1 2 k = 0 1 k ≠ 0 \alpha_k=\left\{\begin{array}{cc}
\frac{1}{\sqrt{2}} & k=0 \\
1 & k \neq 0
\end{array}\right. α k = { 2 1 1 k = 0 k = 0 この基底による展開を,画像の離散コサイン変換と呼ぶ.これは,式(4.79) の離散コサイン変換を x , y x, y x , y の 2 方向に適用したものである。図 6.8 に 8 × 8 8 \times 8 8 × 8 画像の場合の基底を示す.
画像の固有空間 ¶ アダマール変換や離散コサイン変換の基底画像は規則的な模様であり、画像としての意味はない
意味のある画像からの正規直交基底を作ることを考える
多数の顔写真 { f α } , α = 1 , … , N \left\{\boldsymbol{f}_\alpha\right\}, \alpha=1, \ldots, N { f α } , α = 1 , … , N があるとする。これらの平均をとれば、平均的な顔の画像
g 0 = 1 N ∑ α = 1 N f α g_0=\frac{1}{N} \sum_{\alpha=1}^N f_\alpha g 0 = N 1 α = 1 ∑ N f α が得られる。
また個々の画像と平均顔との差分
f α ′ = f α − g 0 f_\alpha^{\prime}=f_\alpha-g_0 f α ′ = f α − g 0 をとれば、個々の画像の平均からの差異を意味する
もし個々の顔の差の代表的な特徴が見つかれば、f α ′ f_\alpha^{\prime} f α ′ はその画像の定数倍で近似できる。
例えば顔の縦横比が違いなら、額と顎の部分がプラスで、頬の両側がマイナスの画像を代表的な差画像g 1 g_1 g 1 を作ることができる
そしてf α ′ f_\alpha^{\prime} f α ′ とg 1 g_1 g 1 の定数倍で最良に近似した画像との差画像をさらにべつの代表的な特徴g 2 g_2 g 2 の定数倍で近似して・・・を繰り返していく。このときg 1 , g 2 , g 3 , … g_1,g_2,g_3,\dots g 1 , g 2 , g 3 , … が正規直交系であるなら、画像f α ′ f_\alpha^{\prime} f α ′ をg 1 , g 2 , g 3 , … \boldsymbol{g}_1, \boldsymbol{g}_2, \boldsymbol{g}_3, \ldots g 1 , g 2 , g 3 , … に関して展開して次の表現が得られる
f α = g 0 + c α 1 g 1 + c α 2 g 2 + c α 3 g 3 + ⋯ \boldsymbol{f}_\alpha=\boldsymbol{g}_0+c_{\alpha 1} \boldsymbol{g}_1+c_{\alpha 2} \boldsymbol{g}_2+c_{\alpha 3} \boldsymbol{g}_3+\cdots f α = g 0 + c α 1 g 1 + c α 2 g 2 + c α 3 g 3 + ⋯ 各画像 f α f_\alpha f α の平均画像からの差 f α ′ f_\alpha^{\prime} f α ′ をよく表す画像が g g g であるとすると, これは f α ′ f_\alpha^{\prime} f α ′ が
f α ′ ≈ C α g \boldsymbol{f}_\alpha^{\prime} \approx C_\alpha \boldsymbol{g} f α ′ ≈ C α g の形で近似できるという意味である。
近似誤差を二乗誤差 ∥ f α ′ − C α g ∥ 2 \| \boldsymbol{f}_\alpha^{\prime} - C_\alpha \boldsymbol{g}\|^2 ∥ f α ′ − C α g ∥ 2 で表すとすると、この解は解析的に C α = ( f α ′ , g ) C_\alpha=\left(\boldsymbol{f}_\alpha^{\prime}, \boldsymbol{g}\right) C α = ( f α ′ , g ) となる(しかしg g g が未知なのでこれを求める必要がある)。
また、g \boldsymbol{g} g に適当な定数を掛けて ∥ g ∥ = 1 \|\boldsymbol{g}\|=1 ∥ g ∥ = 1 であるように定めてあると仮定する。
この2点を使うと二乗誤差は
J = ∑ α = 1 N ∥ f α ′ − C α g ∥ 2 = ∑ α = 1 N ( f α ′ − C α g , f α ′ − C α g ) = ∑ α = 1 N ( ( f α ′ , f α ′ ) − 2 C α ( f α ′ , g ) + C α 2 ( g , g ) ) = ∑ α = 1 N ( ( f α ′ , f α ′ ) − 2 ( f α ′ , g ) 2 + ( f α ′ , g ) 2 ( g , g ) ) = ∑ α = 1 N ( ∥ f α ′ ∥ 2 − ( f α ′ , g ) 2 ) \begin{aligned}
J & =\sum_{\alpha=1}^N\left\|\boldsymbol{f}_\alpha^{\prime}-C_\alpha \boldsymbol{g}\right\|^2
=\sum_{\alpha=1}^N\left(\boldsymbol{f}_\alpha^{\prime}-C_\alpha \boldsymbol{g}, \boldsymbol{f}_\alpha^{\prime}-C_\alpha \boldsymbol{g}\right) \\
& =\sum_{\alpha=1}^N\left(\left(\boldsymbol{f}_\alpha^{\prime}, \boldsymbol{f}_\alpha^{\prime}\right)-2 C_\alpha\left(\boldsymbol{f}_\alpha^{\prime}, \boldsymbol{g}\right)+C_\alpha^2(\boldsymbol{g}, \boldsymbol{g})\right) \\
& =\sum_{\alpha=1}^N\left(\left(\boldsymbol{f}_\alpha^{\prime}, \boldsymbol{f}_\alpha^{\prime}\right)-2\left(\boldsymbol{f}_\alpha^{\prime}, \boldsymbol{g}\right)^2+\left(\boldsymbol{f}_\alpha^{\prime}, \boldsymbol{g}\right)^2(\boldsymbol{g}, \boldsymbol{g})\right) \\
& =\sum_{\alpha=1}^N\left(\left\|\boldsymbol{f}_\alpha^{\prime}\right\|^2-\left(\boldsymbol{f}_\alpha^{\prime}, \boldsymbol{g}\right)^2\right)
\end{aligned} J = α = 1 ∑ N ∥ ∥ f α ′ − C α g ∥ ∥ 2 = α = 1 ∑ N ( f α ′ − C α g , f α ′ − C α g ) = α = 1 ∑ N ( ( f α ′ , f α ′ ) − 2 C α ( f α ′ , g ) + C α 2 ( g , g ) ) = α = 1 ∑ N ( ( f α ′ , f α ′ ) − 2 ( f α ′ , g ) 2 + ( f α ′ , g ) 2 ( g , g ) ) = α = 1 ∑ N ( ∥ ∥ f α ′ ∥ ∥ 2 − ( f α ′ , g ) 2 ) と整理できる。
J J J を最小にするには、∑ α = 1 N ( f α ′ , g ) 2 \sum_{\alpha=1}^N\left(f_\alpha^{\prime}, g\right)^2 ∑ α = 1 N ( f α ′ , g ) 2 を最大化すればいい。
m × m m \times m m × m 画像 f α ′ , g \boldsymbol{f}_\alpha^{\prime}, \boldsymbol{g} f α ′ , g を m 2 m^2 m 2 次元列べクトル に並べ換えたものをそれぞれ f ~ α ′ , g ~ \tilde{\boldsymbol{f}}_\alpha^{\prime}, \tilde{\boldsymbol{g}} f ~ α ′ , g ~ とすると次のようになる。
∑ α = 1 N ( f α ′ , g ) 2 = ∑ α = 1 N ( f ~ α ′ , g ~ ) 2 = ∑ α = 1 N g ~ ⊤ f ~ α ′ f ~ α ′ ⊤ g ~ = ( g ~ , ( ∑ α = 1 N f ~ α ′ f ~ α ′ ⊤ ) g ~ ) = ( g ~ , M ~ g ~ ) \begin{aligned}
\sum_{\alpha=1}^N\left(\boldsymbol{f}_\alpha^{\prime}, \boldsymbol{g}\right)^2
& =\sum_{\alpha=1}^N\left(\tilde{\boldsymbol{f}}_\alpha^{\prime}, \tilde{\boldsymbol{g}}\right)^2=\sum_{\alpha=1}^N \tilde{\boldsymbol{g}}^{\top} \tilde{\boldsymbol{f}}_\alpha^{\prime} \tilde{\boldsymbol{f}}_\alpha^{\prime \top} \tilde{\boldsymbol{g}} \\
& =\left(\tilde{\boldsymbol{g}},\left(\sum_{\alpha=1}^N \tilde{\boldsymbol{f}}_\alpha^{\prime} \tilde{\boldsymbol{f}}_\alpha^{\prime\top}\right) \tilde{\boldsymbol{g}}\right)
=(\tilde{\boldsymbol{g}}, \tilde{\boldsymbol{M}} \tilde{\boldsymbol{g}})
\end{aligned} α = 1 ∑ N ( f α ′ , g ) 2 = α = 1 ∑ N ( f ~ α ′ , g ~ ) 2 = α = 1 ∑ N g ~ ⊤ f ~ α ′ f ~ α ′⊤ g ~ = ( g ~ , ( α = 1 ∑ N f ~ α ′ f ~ α ′⊤ ) g ~ ) = ( g ~ , M ~ g ~ ) ここで
M ~ : = ∑ α = 1 N f ~ α ′ f ~ α ′ ⊤ \tilde{\boldsymbol{M}}:=\sum_{\alpha=1}^N \tilde{\boldsymbol{f}}_\alpha^{\prime} \tilde{\boldsymbol{f}}_\alpha^{\prime \top} M ~ := α = 1 ∑ N f ~ α ′ f ~ α ′⊤ である。行列 M ~ \tilde{\boldsymbol{M}} M ~ の固有値を λ 1 , … , λ m 2 \lambda_1, \ldots, \lambda_{m^2} λ 1 , … , λ m 2 ,対応する単位固有ベクトルを g ~ 1 , … , g ~ m 2 \tilde{\boldsymbol{g}}_1, \ldots, \tilde{\boldsymbol{g}}_{m^2} g ~ 1 , … , g ~ m 2 と する.各ベクトル g ~ κ \tilde{\boldsymbol{g}}_\kappa g ~ κ の m 2 m^2 m 2 個の成分を m × m m \times m m × m 画素に配置し直したものを g κ \boldsymbol{g}_\kappa g κ とし, g 1 , g 2 , … , g m 2 \boldsymbol{g}_1, \boldsymbol{g}_2, \ldots, \boldsymbol{g}_{m^2} g 1 , g 2 , … , g m 2 を 固有画像 と呼ぶ。これらは対称行列の固有ベクトル から作られているので,正規直交基底となる.
∑ α = 1 N ( f α ′ , g ) 2 \sum_{\alpha=1}^N\left(\boldsymbol{f}_\alpha^{\prime}, \boldsymbol{g}\right)^2 ∑ α = 1 N ( f α ′ , g ) 2 を最大化する単位ベクトルg ~ \tilde{\boldsymbol{g}} g ~ はM ~ \tilde{\boldsymbol{M}} M ~ の最大固有値に対する固有ベクトルである。したがって,g ~ \tilde{\boldsymbol{g}} g ~ は符号を除いて g ~ 1 \tilde{\boldsymbol{g}}_1 g ~ 1 に一致する。
このような、画像における主成分分析は画像処理の領域では 固有空間法 と呼ばれる。
6.3 特異値分解 ¶ 固有画像を作るにはM ~ \tilde{\boldsymbol{M}} M ~ の固有値と固有ベクトルを計算する必要があるが、m 2 × m 2 m^2\times m^2 m 2 × m 2 と巨大な行列であるため計算量が非常に多くなる。
固有値が0の固有ベクトルは応用上必要ないため、0でない固有値と固有ベクトルのみ計算できれば良い。そこで効率よく計算する方法が特異値分解。
問題は,N N N 個の n ( = m 2 ) n\left(=m^2\right) n ( = m 2 ) 次元ベクトル p 1 , … , p N \boldsymbol{p}_1, \ldots, \boldsymbol{p}_N p 1 , … , p N があるとき,n × n n \times n n × n 行列
M = ∑ α = 1 N p α p α ⊤ \boldsymbol{M}=\sum_{\alpha=1}^N \boldsymbol{p}_\alpha \boldsymbol{p}_\alpha^{\top} M = α = 1 ∑ N p α p α ⊤ の固有値,固有ベクトルを計算することである.
ベクトル p 1 , … , p N \boldsymbol{p}_1, \ldots, \boldsymbol{p}_N p 1 , … , p N を列とする n × N n \times N n × N 行列を
P = ( p 1 p 2 ⋯ p N ) \boldsymbol{P}=\left(\boldsymbol{p}_1 \quad \boldsymbol{p}_2\quad \cdots \quad \boldsymbol{p}_N\right) P = ( p 1 p 2 ⋯ p N ) とすると、M = P P ⊤ \boldsymbol{M}=\boldsymbol{P} \boldsymbol{P}^{\top} M = P P ⊤ となる(ベクトルの直積)
行列M M M の固有値・固有ベクトルは、
N = P ⊤ P \boldsymbol{N}=\boldsymbol{P}^{\top} \boldsymbol{P} N = P ⊤ P で定義される行列N N N の行列の固有値・固有ベクトルを計算する方法でも求められる
M M M とN N N のゼロでない固有値は一致する
M M M の固有値と固有ベクトルをそれぞれλ , u \lambda, u λ , u とすると
P P T ⏟ = M u = λ u \underbrace{ PP^T }_{=M} u = \lambda u = M P P T u = λ u 左からP T P^T P T をかけると
P T P ⏟ = N P T u = λ P T u ⟺ N ( P T u ) = λ ( P T u ) \underbrace{ P^T P}_{=N} P^T u = \lambda P^T u\\
\iff N (P^T u) = \lambda (P^T u) = N P T P P T u = λ P T u ⟺ N ( P T u ) = λ ( P T u ) N N N の固有値と固有ベクトルをそれぞれλ , v \lambda, v λ , v とすると
P T P ⏟ = N v = λ v \underbrace{ P^T P }_{=N} v = \lambda v = N P T P v = λ v 左からP P P をかけると
P P T ⏟ = M P v = λ P v ⟺ M ( P v ) = λ ( P v ) \underbrace{ P P^T }_{=M} P v = \lambda P v\\
\iff M (P v) = \lambda (P v) = M P P T P v = λ P v ⟺ M ( P v ) = λ ( P v ) M M M の固有値λ ( > 0 ) \lambda (> 0) λ ( > 0 ) に対する単位ベクトルをu u u 、N N N の固有値λ ( > 0 ) \lambda(> 0) λ ( > 0 ) に対する単位ベクトルをv v v とすると
u = ± P v λ , v = ± P ⊤ u λ \boldsymbol{u}=\frac{ \pm \boldsymbol{P} \boldsymbol{v}}{\sqrt{\lambda}},
\quad \boldsymbol{v}=\frac{ \pm \boldsymbol{P}^{\top} \boldsymbol{u}}{\sqrt{\lambda}} u = λ ± P v , v = λ ± P ⊤ u となる。
例えばM M M の固有値λ \lambda λ に対する固有ベクトルP v \boldsymbol{P v} Pv のノルムの二乗は
∥ P v ∥ 2 = ( P v , P v ) = ( v , P ⊤ P v ) = ( v , N v ) = ( v , λ v ) = λ ∥ v ∥ 2 = λ \left\|\boldsymbol{P v}\right\|^2=(\boldsymbol{P v}, \boldsymbol{P v})=\left(\boldsymbol{v}, \boldsymbol{P}^{\top} \boldsymbol{P v}\right)=(\boldsymbol{v}, \boldsymbol{N v})=(\boldsymbol{v}, \lambda \boldsymbol{v})=\lambda\|\boldsymbol{v}\|^2=\lambda ∥ Pv ∥ 2 = ( Pv , Pv ) = ( v , P ⊤ Pv ) = ( v , Nv ) = ( v , λ v ) = λ ∥ v ∥ 2 = λ であるため、λ \sqrt{\lambda} λ で割って単位ベクトルにする
行列 M ( = P P ⊤ ) \boldsymbol{M}\left(=\boldsymbol{P P}^{\top}\right) M ( = PP ⊤ ) の固有値を大きい順に並べたものを λ 1 , λ 2 , … , λ n \lambda_1, \lambda_2, \ldots, \lambda_n λ 1 , λ 2 , … , λ n とし,対応する n n n 次元単位固有ベクトルの正規直交系を u 1 , u 2 , … , u n \boldsymbol{u}_1, \boldsymbol{u}_2, \ldots, \boldsymbol{u}_n u 1 , u 2 , … , u n とする。こ れらを列として並べた n × n n \times n n × n 行列を
U = ( u 1 u 2 ⋯ u n ) \boldsymbol{U}=\left(\begin{array}{llll}
\boldsymbol{u}_1 & \boldsymbol{u}_2 & \cdots & \boldsymbol{u}_n
\end{array}\right) U = ( u 1 u 2 ⋯ u n ) とする.同様に,行列 N ( = P ⊤ P ) \boldsymbol{N}\left(=\boldsymbol{P}^{\top} \boldsymbol{P}\right) N ( = P ⊤ P ) の固有値を大きい順に並べたものを λ 1 , λ 2 , … , λ N \lambda_1, \lambda_2, \ldots, \lambda_N λ 1 , λ 2 , … , λ N とし,対応する N N N 次元単位固有ベクトルの正規直交系を v 1 , v 2 , … , v N v_1, v_2, \ldots, v_N v 1 , v 2 , … , v N とする.これらを列として並べた N × N N \times N N × N 行列を
V = ( v 1 v 2 ⋯ v N ) \boldsymbol{V}=\left(\begin{array}{llll}
\boldsymbol{v}_1 & \boldsymbol{v}_2 & \cdots & \boldsymbol{v}_N
\end{array}\right) V = ( v 1 v 2 ⋯ v N ) とする.行列 M \boldsymbol{M} M および N \boldsymbol{N} N の(共通の)ランク(=0でない固有値の個数) を r r r とすると,i > r i>r i > r に対して λ i = 0 \lambda_i=0 λ i = 0 である。
P V = ( P v 1 P v 2 ⋯ P v N ) = ( ± λ 1 u 1 ⋯ ± λ r u r 0 ⋯ 0 ) \boldsymbol{P} \boldsymbol{V}=\left(\begin{array}{llll}
\boldsymbol{P} \boldsymbol{v}_1 & \boldsymbol{P} \boldsymbol{v}_2 & \cdots & \boldsymbol{P} \boldsymbol{v}_N
\end{array}\right)=\left(\begin{array}{lllll}
\pm \sqrt{\lambda_1} \boldsymbol{u}_1 & \cdots & \pm \sqrt{\lambda_r} \boldsymbol{u}_r & \mathbf{0} & \cdots & \mathbf{0}
\end{array}\right) P V = ( P v 1 P v 2 ⋯ P v N ) = ( ± λ 1 u 1 ⋯ ± λ r u r 0 ⋯ 0 ) M \boldsymbol{M} M の単位固有ベクトル u 1 , u 2 , … , u r \boldsymbol{u}_1, \boldsymbol{u}_2, \ldots, \boldsymbol{u}_r u 1 , u 2 , … , u r の符号を上式の右辺の ± がすべて + に なるように選べば
P V = ( u 1 ⋯ u n ) ( λ 1 ⋱ λ r ) = U ( σ 1 ⋱ σ r ) \boldsymbol{P} \boldsymbol{V}=\left(\boldsymbol{u}_1 \cdots \boldsymbol{u}_n\right)\left(\begin{array}{ccc}
\sqrt{\lambda_1} & & \\
& \ddots & \\
& & \sqrt{\lambda_r}
\end{array}\right)=\boldsymbol{U}\left(\begin{array}{ccc}
\sigma_1 & & \\
& \ddots & \\
& & \\
& & \sigma_r
\end{array}\right) P V = ( u 1 ⋯ u n ) ⎝ ⎛ λ 1 ⋱ λ r ⎠ ⎞ = U ⎝ ⎛ σ 1 ⋱ σ r ⎠ ⎞ 右から V ⊤ \boldsymbol{V}^{\top} V ⊤ を掛けると
P = U ( σ 1 ⋱ σ r ) V ⊤ \boldsymbol{P}=\boldsymbol{U}\left(\begin{array}{ccc}
\sigma_1 & & \\
& \ddots & \\
& & \sigma_r
\end{array}\right) \boldsymbol{V}^{\top} P = U ⎝ ⎛ σ 1 ⋱ σ r ⎠ ⎞ V ⊤ これを行列P P P の 特異値分解 といい、σ i \sigma_i σ i を 特異値 という。
import numpy as np
P = np.array([
[1, 2],
[3, 4],
[5, 6],
])
M = P @ P.T
print("M:\n", M)
eigenvalues, eigenvectors = np.linalg.eig(M)
print("固有値:", eigenvalues.round(2))
print("固有ベクトル:\n", eigenvectors.round(2))M:
[[ 5 11 17]
[11 25 39]
[17 39 61]]
固有値: [90.74 0.26 0. ]
固有ベクトル:
[[-0.23 -0.88 0.41]
[-0.52 -0.24 -0.82]
[-0.82 0.4 0.41]]
N = P.T @ P
print("N:\n", N)
eigenvalues, eigenvectors = np.linalg.eig(N)
print("固有値:", eigenvalues.round(2))
print("固有ベクトル:\n", eigenvectors.round(2))N:
[[35 44]
[44 56]]
固有値: [ 0.26 90.74]
固有ベクトル:
[[-0.78 -0.62]
[ 0.62 -0.78]]
u1 = P @ eigenvectors[0] / np.sqrt(eigenvalues[0])
u2 = P @ eigenvectors[1] / np.sqrt(eigenvalues[1])
u2array([-0.09974884, -0.13444826, -0.16914768])
import numpy as np
def svd_from_eig(A):
AtA = A.T @ A
# 固有値分解(V: 右特異ベクトル)
eigenvalues, V = np.linalg.eig(AtA)
# 固有値の実数部分とインデックスを昇順で並び替え
idx = np.argsort(eigenvalues)[::-1]
eigenvalues = eigenvalues[idx]
V = V[:, idx]
# 特異値の計算(負値を0に修正)
singular_values = np.sqrt(np.clip(eigenvalues.real, 0, None))
# 左特異ベクトルの計算
U = []
for i in range(len(singular_values)):
if singular_values[i] > 1e-10:
u = A @ V[:, i] / singular_values[i]
else:
# ランク欠損時の直交補完(ここではゼロベクトル)
u = np.zeros(A.shape[0])
U.append(u)
U = np.column_stack(U)
# 必要ならUの直交補完を追加(ここでは省略)
# Σ 行列の構築
m, n = A.shape
Sigma = np.zeros((m, n))
for i in range(min(m, n)):
Sigma[i, i] = singular_values[i]
return U, Sigma, V
U, S, V = svd_from_eig(P)
# 検証
print("U:\n", U)
print("Σ:\n", S)
print("V:\n", V)
print("再構成:\n", U @ S @ V.T)
U:
[[-0.2298477 0.88346102]
[-0.52474482 0.24078249]
[-0.81964194 -0.40189603]]
Σ:
[[9.52551809 0. ]
[0. 0.51430058]
[0. 0. ]]
V:
[[-0.61962948 -0.78489445]
[-0.78489445 0.61962948]]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[31], line 45
43 print ( " Σ: \n " , S)
44 print ( " V: \n " , V)
---> 45 print ( " 再構成: \n " , U @ S @ V . T)
ValueError : matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 3 is different from 2)