yProcessingClub

すみません、許してください

特異値分解をふんわりと理解する

www.youtube.com

www.youtube.com

本記事は上記YouTube動画からの完全パクリである.
上記動画で特異値分解の"気持ち"が分かって感動したため,シェアしたくこの記事を書いた次第である.

さて,特異値分解の前に,まずは固有値分解について説明する.
正方行列A固有値分解は以下で表される.


A=V \Lambda V^{-1}

V固有ベクトルを並べたもの,\Lambda固有値を対角成分に持つ行列である.


\begin{eqnarray}
\Lambda &=& \begin{pmatrix}
\lambda _1 & 0  & \cdots & 0\\
0 & \lambda _2 & \cdots & 0\\
\vdots & \vdots & \ddots & \vdots\\
0 & 0 & \ldots & \lambda _M \\
\end{pmatrix}
\end{eqnarray}

このように分解できると何が嬉しいのかと言うと,n乗の計算が容易になる点が挙げられる.

A^n=V \Lambda V^{-1} V \Lambda V^{-1} \cdots V \Lambda V^{-1}=V \Lambda ^n V^{-1}=V\begin{pmatrix}
\lambda _1 ^n& 0  & \cdots & 0\\
0 & \lambda _2 ^n & \cdots & 0\\
\vdots & \vdots & \ddots & \vdots\\
0 & 0 & \ldots & \lambda _M ^n\\
\end{pmatrix}V^{-1}

さて,固有値分解が行えるのは行列Aが正方行列の時のみである.
行列Aが正方行列じゃない場合にもこのような分解をしたい場合に行いたいのが特異値分解だ.



行列B(M \times N)特異値分解は以下で表される.

B=U \Sigma V^T

U(M \times M)は左特異ベクトルを並べたもの,V(N \times N)は右特異ベクトルを並べたもので,これらは正規直交基底である.

\boldsymbol{u}^T \boldsymbol{u}=1\boldsymbol{v}^T\boldsymbol{v}=1\boldsymbol{u}_1^T \boldsymbol{u}_2=0\boldsymbol{v}_1^T\boldsymbol{v}_2=0

\Sigma(M \times N)は対角成分に特異値\sigma _mを大きい順に並べた行列である.


\begin{eqnarray}
\Sigma &=& \begin{pmatrix}
\sigma _1 & 0  & \cdots & 0 & \cdots & 0\\
0 & \sigma _2 & \cdots & 0 & \cdots & 0\\
\vdots & \vdots & \ddots & \vdots & \cdots & \vdots\\
0 & 0 & \ldots & \sigma  _M & \cdots & 0\\
\end{pmatrix}
\end{eqnarray}
where \sigma _1 > \sigma _2 \cdots > \sigma _M

\SigmaはサイズがM \times Nであり,M \times Mの対角行列の右側(もしくは下側)に0成分が増えたような形となっている.


ここで突然B ^{}{B^{T}}を計算してみる.

B^{}B^T=(U \Sigma V^T)(U \Sigma V^T)^T = (U \Sigma V^T)(V \Sigma ^T U^T)=U \Sigma^{} \Sigma ^T U^T

最初のイコールはB=U \Sigma V^Tを代入しただけ,次のイコールは転置の基本ルール(ABC)^T=C^T B^T A^Tを適用,最後のイコールはVが正規直交基底のためV^TV=V^{-1}V=Iとなることを利用している.


さて,B^{}B^TのサイズはM \times Mなので固有値分解が行えるはずだ.固有値分解の式を再掲しよう.

A=V \Lambda V^{-1}

これとB^{}B^T=U \Sigma^{} \Sigma ^T U^Tを見比べると,以下のように対応していることが分かる.

B^{}B^T=AU=V\Sigma^{} \Sigma ^T=\LambdaU^T=U^{-1}=V^{-1}
U^T=U^{-1}Uが直交基底であることを利用している)

よって,B特異値分解を行うには,B^{}B^T固有値分解をすれば良いことが分かる.
B^{}B^T固有値分解を行って求まった\Lambda


\begin{eqnarray}
\Lambda &=& \begin{pmatrix}
\lambda _1 & 0  & \cdots & 0\\
0 & \lambda _2 & \cdots & 0\\
\vdots & \vdots & \ddots & \vdots\\
0 & 0 & \ldots & \lambda _M \\
\end{pmatrix}
\end{eqnarray}


\begin{eqnarray}
\Sigma \Sigma ^T&=& \begin{pmatrix}
\sigma _1 & 0  & \cdots & 0 & \cdots & 0\\
0 & \sigma _2 & \cdots & 0 & \cdots & 0\\
\vdots & \vdots & \ddots & \vdots & \cdots & \vdots\\
0 & 0 & \ldots & \sigma  _M & \cdots & 0\\
\end{pmatrix} \begin{pmatrix}
\sigma _1 & 0  & \cdots & 0\\
0 & \sigma _2 & \cdots & 0\\
\vdots & \vdots & \ddots & \vdots\\
0 & 0 & \ldots & \sigma  _M\\
\vdots & \vdots & \vdots & \vdots\\
0 & 0 & \cdots & 0\\
\end{pmatrix}\\
&=&\begin{pmatrix}
\sigma _1 ^2 & 0  & \cdots & 0\\
0 & \sigma _2 ^2& \cdots & 0\\
\vdots & \vdots & \ddots & \vdots\\
0 & 0 & \ldots & \sigma  _M ^2\\
\end{pmatrix}
\end{eqnarray}

なので,\sigma_m = \sqrt {\lambda_m}と対応づけられる.

ここから固有ベクトルを求めて,その大きさが1となるように調整すれば左特異ベクトルUが求められる.

次はB ^{T}{B^{}}を計算してみる.

B^{T}B^{}=(U \Sigma V^T)^T(U \Sigma V^T) = (V \Sigma ^T U^T)(U \Sigma V^T)=V \Sigma^{T} \Sigma ^{} V^T
B ^{T}{B^{}}のサイズはN \times Nであり,同様に固有値分解を行う.なお,


\begin{eqnarray}
\Sigma ^T \Sigma &=& \begin{pmatrix}
\sigma _1 & 0  & \cdots & 0\\
0 & \sigma _2 & \cdots & 0\\
\vdots & \vdots & \ddots & \vdots\\
0 & 0 & \ldots & \sigma  _M\\
\vdots & \vdots & \vdots & \vdots\\
0 & 0 & \cdots & 0\\
\end{pmatrix} \begin{pmatrix}
\sigma _1 & 0  & \cdots & 0 & \cdots & 0\\
0 & \sigma _2 & \cdots & 0 & \cdots & 0\\
\vdots & \vdots & \ddots & \vdots & \cdots & \vdots\\
0 & 0 & \ldots & \sigma  _M & \cdots & 0\\
\end{pmatrix} \\
&=&\begin{pmatrix}
\sigma _1 ^2 & 0  & \cdots & 0 & \cdots & 0\\
0 & \sigma _2 ^2& \cdots & 0 & \cdots & 0\\
\vdots & \vdots & \ddots & \vdots & \cdots & 0\\
0 & 0 & \ldots & \sigma  _M ^2 & \cdots & 0\\
\vdots & \vdots & \vdots & \vdots & \ddots & \vdots\\
0 & 0 & \ldots & 0 & \cdots & 0\\
\end{pmatrix}
\end{eqnarray}

であるので,\lambda _{M+1}= \cdots = \lambda _{N}=0となる.

ここから固有ベクトルを求めて,その大きさが1となるように調整すれば右特異ベクトルVが求められる.

このようにして,B^{}B^{T}及びB^{T} B^{}をそれぞれ固有値分解することで特異ベクトル及び特異値が求められる.


最後に,特異値分解をすると何が嬉しいのか述べる.



\begin{eqnarray}
B&=&U \Sigma V^T\\
&=&U \begin{pmatrix}
\sigma _1 & 0  & \cdots & 0 & \cdots & 0\\
0 & \sigma _2 & \cdots & 0 & \cdots & 0\\
\vdots & \vdots & \ddots & \vdots & \cdots & \vdots\\
0 & 0 & \ldots & \sigma  _M & \cdots & 0\\
\end{pmatrix} V^T\\
&=& \Biggl( \boldsymbol{u}_1 \ \ \boldsymbol{u}_2 \ \ \cdots \ \ \boldsymbol{u}_M \Biggr) \ \ \begin{pmatrix}
\sigma _1 & 0  & \cdots & 0 & \cdots & 0\\
0 & \sigma _2 & \cdots & 0 & \cdots & 0\\
\vdots & \vdots & \ddots & \vdots & \cdots & \vdots\\
0 & 0 & \ldots & \sigma  _M & \cdots & 0\\
\end{pmatrix} \Biggl( \boldsymbol{v}_1 \ \ \boldsymbol{v}_2 \ \ \cdots \ \ \boldsymbol{v}_N \Biggr)^T\\
&=& \boldsymbol{u}_1 \sigma _1 \boldsymbol{v}_1 ^T + \boldsymbol{u}_2 \sigma _2 \boldsymbol{v}_2 ^T + \cdots + \boldsymbol{u}_M \sigma _M \boldsymbol{v}_M ^T
\end{eqnarray}

式を見てみると\boldsymbol{u}\boldsymbol{v}^Tに重み\sigmaを掛けて足し合わせた形であり,\sigma _1 > \sigma _2 \cdots > \sigma _Mを考慮するとその重みはどんどん小さくなっていく(後ろに行くほど微小量になっていく).
微小量を足し合わせなくても結果はほぼ変わらないので,以下のように近似出来る.



\begin{eqnarray}
B&=& \boldsymbol{u}_1 \sigma _1 \boldsymbol{v}_1 ^T + \boldsymbol{u}_2 \sigma _2 \boldsymbol{v}_2 ^T + \cdots + \boldsymbol{u}_k \sigma _k \boldsymbol{v}_k ^T + \boldsymbol{u}_{k+1} \sigma _{k+1} \boldsymbol{v}_{k+1} ^T + \cdots + \boldsymbol{u}_M \sigma _M \boldsymbol{v}_M ^T\\
&\approx&\boldsymbol{u}_1 \sigma _1 \boldsymbol{v}_1 ^T + \boldsymbol{u}_2 \sigma _2 \boldsymbol{v}_2 ^T + \cdots + \boldsymbol{u}_k \sigma _k \boldsymbol{v}_k ^T
\end{eqnarray}

このように近似することで,M次元だったものがk次元に圧縮された.
次元削減は特徴量を取り出したり計算量を減らしたりすることが出来て嬉しいため,機械学習に応用されている.