5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

特異値分解について(E資格対策)

Last updated at Posted at 2020-03-23

初カキコ…ども…

俺みたいな20代でE資格受ける腐れ野郎、他に、いますかっていねーか、はは

本日は特異値分解について書きます。
今回はプロセス(どうやれば問題が解けるか)に注目しているので固有値や固有ベクトルの説明などは省いております。

目次
特異値分解って?
特異値分解のやり方
 -例題
特異値分解はpythonでもできる

特異値分解って?

特異値分解(別名 SDV(Single Value Deconposition))とは
$$
\begin{equation}
A = UDV^T
\end{equation}
$$

$A$ : m行n列の行列。
$U$ : m行m列の直行行列
$D$ : m行r列の行列。対角成分は非負で大きい順に並んだ行列、非対角成分は0。
$V$ : r行n列の直行行列

と、上式のようにある行列Aを3つの行列の掛け算で表す手法を指します。
さらに$U,D$は直行行列なので

UU^T=E \\
VV^T=E

(E:単位行列)
が成り立ちます。

特異値分解のやり方

順番は以下の通り

  1. $AA^T$の固有値、固有ベクトルを求め$U$を算出
  2. $A^TA$の固有値、固有ベクトルを求め$V$を算出
  3. $U,V^T$に対応する特異値をDに並べて完成

以下それぞれのプロセスの解説です。
1.$AA^T$の固有値、固有ベクトルを求め$U$を算出

\begin{align}
AA^T&=UDV^T (UDV^T)^T \\
&=UDV^T VD^TU^T \\
&=UDD^TU^T
\end{align}

となります。ちょっと式をいじってみましょう。$U$は直行行列なので$U^T=U^{-1}$、つまり

AA^T=U(DD^T)U^{-1}

と変形できます。
どこかで見たことありませんかこの形

A=PDP^{-1}

固有値分解と同じ形です。
つまり$U$は$AA^T$を固有値分解したときの固有ベクトルを並べた$P$と捉えられます。
$AA^T$の固有値分解を行い、固有ベクトルを$U$に並べましょう。

2.$A^TA$の固有値、固有ベクトルを求め$V$を算出
1.とほぼ同じです。

\begin{align}
A^TA&=(UDV^T)^TUDV^T  \\
&=VD^TU^T UDV^T \\
&=VDD^TV^T
\end{align}

となります。1.と文字が違うだけでほぼ同じです。
つまり$V$は$A^TA$を固有値分解したときの固有ベクトルを並べたPと捉えられます。
あとは1と同じ。

3.$U,V^T$に対応する特異値をDに並べて完成

AA^T=U(DD^T)U^{-T} \\
A^TA=VDD^TV^T

なので左辺ではAを2回、Dも2回かけているので、Dに特異値σ$(={\sqrt{λ}})$を並べる際は固有値の平方根を取り、非負であるので正の数の値を並べましょう。

抽象的なので実際に例題を解きましょう。

例題

$$ A= \begin{pmatrix} 0 & 1 \\ 2 & 0 \end{pmatrix} $$
を特異値分解せよ。

では先ほど書いたプロセスに従って解いていきます。

1. AA^Tの固有値、固有ベクトルを求めUを算出

まず$AA^T$の値を求めます。

\begin{align}
AA^T&=
\begin{pmatrix}
0 & 1 \\
2 & 0
\end{pmatrix}

\begin{pmatrix}
0 & 2 \\
1 & 0
\end{pmatrix} \\

&=
\begin{pmatrix}
0×0+1×1 & 0×2+1×0 \\
2×0+0×1 & 2×2+0×0
\end{pmatrix} \\

&=
\begin{pmatrix}
1 & 0 \\
0 & 4
\end{pmatrix}
\end{align}

では固有値を求めましょう。

\begin{align}
|AA^T- λE|
&=
\begin{vmatrix}
1-λ & 0 \\
0 & 4-λ
\end{vmatrix}
&=0
\end{align}

より

λ=1,4

と求められます。それぞれの固有値について固有ベクトルを求めます。

(i)λ=4のとき
( $D$の対角成分は大きい順に並んでいるので大きい固有値から解いたほうが間違いがなく済みます。 )

\begin{align}
(AA^T- λE)x
&=
\begin{pmatrix}
1-4 & 0 \\
0 & 4-4
\end{pmatrix}
\begin{pmatrix}
x_1 \\
x_2
\end{pmatrix} \\
&=O
\end{align}

つまり

\begin{align}
\begin{pmatrix}
-3x_1 \\
0
\end{pmatrix}
=
\begin{pmatrix}
0 \\
0
\end{pmatrix} 
\end{align}

よって

\begin{align}
\begin{pmatrix}
x_1 \\
x_2
\end{pmatrix}
=k
\begin{pmatrix}
0 \\
1
\end{pmatrix} 
\end{align}

$k$:実数

(ii)λ=1のとき

\begin{align}
(AA^T- λE)x
&=
\begin{pmatrix}
1-1 & 0 \\
0 & 4-1
\end{pmatrix}
\begin{pmatrix}
x_1 \\
x_2
\end{pmatrix} \\
&=O
\end{align}

つまり

\begin{align}
\begin{pmatrix}
0 + 0 \\
3x_2
\end{pmatrix}
=
\begin{pmatrix}
0 \\
0
\end{pmatrix} 
\end{align}

よって

\begin{align}
\begin{pmatrix}
x_1 \\
x_2
\end{pmatrix}
=l
\begin{pmatrix}
1 \\
0
\end{pmatrix} 
\end{align}

$l$:実数

(i)(ii)より

U=
\begin{align}
\begin{pmatrix}
0 & 1 \\
1 & 0
\end{pmatrix}
\end{align}

注意:$U$は直行行列なので正規化(列ベクトルの大きさが1になるよう調整)を忘れないでください。

2. A^TAの固有値、固有ベクトルを求めVを算出

まず$A^TA$の値を求めます。

\begin{align}
A^TA&=
\begin{pmatrix}
0 & 2 \\
1 & 0
\end{pmatrix}

\begin{pmatrix}
0 & 1 \\
2 & 0
\end{pmatrix} \\

&=
\begin{pmatrix}
0×0+2×2 & 0×1+2×0 \\
1×0+0×2 & 1×1+0×0
\end{pmatrix} \\

&=
\begin{pmatrix}
4 & 0 \\
0 & 1
\end{pmatrix}
\end{align}

次に固有値を求めましょう。

\begin{align}
|A^TA- λE|
&=
\begin{vmatrix}
4-λ & 0 \\
0 & 1-λ
\end{vmatrix}
&=0
\end{align}

より

λ=4,1

と求められます。1.と同じように求まった固有値について固有ベクトルを求めます。
$U$の時と同じだから値をそのまま書くと間違いになります($U:AA^T$、$V:A^TA$)

(iii)λ=4のとき

\begin{align}
(AA^T- λE)x
&=
\begin{pmatrix}
4-4 & 0 \\
0 & 1-4
\end{pmatrix}
\begin{pmatrix}
x_1 \\
x_2
\end{pmatrix} \\
&=O
\end{align}

つまり

\begin{align}
\begin{pmatrix}
0 \\
-3x_2
\end{pmatrix}
=
\begin{pmatrix}
0 \\
0
\end{pmatrix} 
\end{align}

よって

\begin{align}
\begin{pmatrix}
x_1 \\
x_2
\end{pmatrix}
=m
\begin{pmatrix}
0 \\
1
\end{pmatrix} 
\end{align}

$m$:実数

(iv)λ=1のとき

\begin{align}
(AA^T- λE)x
&=
\begin{pmatrix}
4-1 & 0 \\
0 & 1-1
\end{pmatrix}
\begin{pmatrix}
x_1 \\
x_2
\end{pmatrix} \\
&=O
\end{align}

つまり

\begin{align}
\begin{pmatrix}
3x_1 \\
0
\end{pmatrix}
=
\begin{pmatrix}
0 \\
0
\end{pmatrix} 
\end{align}

よって

\begin{align}
\begin{pmatrix}
x_1 \\
x_2
\end{pmatrix}
=n
\begin{pmatrix}
0 \\
1
\end{pmatrix} 
\end{align}

$n$:実数

(iii)(iv)より

V^T=
\begin{align}
\begin{pmatrix}
1 & 0 \\
0 & 1
\end{pmatrix}
\end{align}

3.U,V^Tに対応する特異値をDに並べて完成

λ=4,1 \\
U=
\begin{align}
\begin{pmatrix}
0 & 1 \\
1 & 0
\end{pmatrix}
\end{align}
V^T=
\begin{align}
\begin{pmatrix}
1 & 0 \\
0 & 1
\end{pmatrix}\\
\end{align}

と求まったので最後に$D$を求めます。

\begin{align}
D&=
\begin{pmatrix}
+{\sqrt{λ_1}} & 0 \\
0 & +{\sqrt{λ_2}}
\end{pmatrix}\\
&=
\begin{pmatrix}
+{\sqrt{4}} & 0 \\
0 & +{\sqrt{1}}
\end{pmatrix}\\
&=
\begin{pmatrix}
2 & 0 \\
0 & 1
\end{pmatrix}\\
\end{align}

よって

\begin{align}
A &= UDV^T \\
&=
\begin{pmatrix}
0 & 1 \\
1 & 0
\end{pmatrix}
\begin{pmatrix}
2 & 0 \\
0 & 1
\end{pmatrix}
\begin{pmatrix}
1 & 0 \\
0 & 1
\end{pmatrix}\\
\end{align}

とAが求まりました。

また
Uの列ベクトルを左特異ベクトル、
Vの列ベクトルを右特異ベクトル
と言います。

特異値分解はpythonでもできる

実はpythonで求められたりします。
今回の問題をpythonで解いてみましょう。

svd.py
import numpy as np
A = np.array([[0,1],[2,0]]) #Aの行列
U, D, V = np.linalg.svd(A, full_matrices=True)
print("U=")
print(U)
print("D=")
print(D)
print("V=")
print(V)
result

U=
[[ 0. -1.]
 [-1.  0.]]
D=
[2. 1.]
V=
[[-1. -0.]
 [-0. -1.]]

Dには対角成分が入っています。U,Vの符号が違いますが、どちらも-1を外に出してあげれば答えは一致します。

以上です、間違い等あればご指摘ください。

参考記事
https://qiita.com/kyoro1/items/4df11e933e737703d549

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?