Zenn
📈

特異値分解のちょっと格好いい姿を眺めてみる

2022/04/26に公開

目的

統計学や機械学習において特異値分解というものに遭遇することがある。これについて正方行列の時には関数解析の方面で「コンパクト作用素の canonical form」と呼ばれているものと実質同じものになっているので、これを少し見てみたい。

特異値分解

AMat(m,n;C)A \in \mathrm{Mat}(m,n; \mathbb{C}) に対して、適当なユニタリ行列 UU(m)U \in U(m)VU(n)V \in U(n) および、非負の数を対角成分に持つ対角行列 ΣMat(m,n;R)\Sigma \in \mathrm{Mat}(m,n;\R)がとれて

A=UΣV \begin{align*} A = U \Sigma V^{*} \tag{1} \end{align*}

が成立するというものである。ここで VV^*VV の共役行列である。
これについて、簡単のため、m=n=2m=n=2 の場合を見てみたい。

ざっくり説明

説明については、手持ちの本に手頃なものがないので文献 [RS1] に従う。

AAA^* A はエルミート行列になるので、スペクトル分解より適当な非負の数 s12s_1^2s22s_2^2 とそれぞれの固有空間への射影行列 P1P_1P2P_2 を用いて

AA=s12P1+s22P2 \begin{align*} A^* A = s_1^2 P_1 + s_2^2 P_2 \end{align*}

と書ける。ここで、簡単のため、s12s22>0s_1^2 \neq s_2^2 > 0 の場合のみを考える。
この場合、一般論よりそれぞれの固有空間は直交するので、単位ベクトル ψ1P1C2\psi_1 \in P_1 \mathbb{C}^2ψ2P2C2\psi_2 \in P_2 \mathbb{C}^2 をとるとこれらは直交する。よって V=(ψ1ψ2)Mat(2,2;C)V = (\psi_1\quad \psi_2) \in \mathrm{Mat}(2,2;\mathbb{C}) とおくと、これはユニタリ行列になる。

次に、ϕi=1siAψi, i=1,2\phi_i = \frac{1}{s_i} A \psi_i,\ i=1,2 と置いて、U=(ϕ1ϕ2)Mat(2,2;C)U = (\phi_1\quad \phi_2) \in \mathrm{Mat}(2,2;\mathbb{C}) と置くと、直接計算により UU もユニタリ行列になることがわかる。

ここまでで準備した UUVV を使って以下の計算をすると、

U(s100s2)V=(1s1Aψ11s2Aψ2)(s1ψˉ1Ts2ψˉ2T)=A \begin{align*} U \begin{pmatrix} s_1 & 0 \\ 0 & s_2 \end{pmatrix} V^* = \left(\frac{1}{s_1} A \psi_1\quad \frac{1}{s_2} A \psi_2\right) \begin{pmatrix} s_1 \bar{\psi}_1^T \\ s_2 \bar{\psi}_2^T \end{pmatrix} = A \end{align*}

となる。最後の等号はそれほど自明ではないが、任意の ψC2\psi \in \mathbb{C}^2 をとる時、

(1s1Aψ11s2Aψ2)(s1ψˉ1Ts2ψˉ2T)ψ=A((ψˉ1Tψ)ψ1+(ψˉ2Tψ)ψ2)=Aψ \begin{align*} \left(\frac{1}{s_1} A \psi_1\quad \frac{1}{s_2} A \psi_2\right) \begin{pmatrix} s_1 \bar{\psi}_1^T \\ s_2 \bar{\psi}_2^T \end{pmatrix} \psi &= A((\bar{\psi}_1^T \psi)\psi_1 + (\bar{\psi}_2^T \psi)\psi_2) \\ &= A \psi \tag{2} \end{align*}

と計算されることから分かる。ここで、ψ=(ψˉ1Tψ)ψ1+(ψˉ2Tψ)ψ2\psi = (\bar{\psi}_1^T \psi)\psi_1 + (\bar{\psi}_2^T \psi)\psi_2 という ψ\psi の正規直交基底による展開を用いた。

最後に、Σ=(s100s2)\Sigma = \begin{pmatrix} s_1 & 0 \\ 0 & s_2 \end{pmatrix} と置くことで、(1) を得る。

これを文献 [RS1] で言う “コンパクト作用素の canonical form” の形で書くと

Aψ=s1ψ1,ψϕ1+s2ψ2,ψϕ2 \begin{align*} A \psi = s_1 \braket{\psi_1,\psi} \phi_1 + s_2 \braket{\psi_2,\psi} \phi_2 \end{align*}

というちょっと格好いい級数展開の形式になる。ここで、,\braket{\cdot,\cdot}C2\mathbb{C}^2 のエルミート内積である。この canonical form の右辺は (2) の左辺を ϕi\phi_i の定義を思い出しつつ変形すれば得られる。

具体例

できるだけ簡単な計算で眺めたいので、2 乗して単位行列になるような Pauli 行列を改造してサンプルを作る[1]

A=(0i3i20) \begin{align*} A = \begin{pmatrix} 0 & -\frac{i}{3} \\ \frac{i}{2} & 0 \end{pmatrix} \end{align*}

を考える。直接計算して AA=A=(1/4001/9)A^* A = A = \begin{pmatrix} 1/4 & 0 \\ 0 & 1/9 \end{pmatrix} を得る。この時、上記で言うような ψ1,ψ2\psi_1, \psi_2 はそれぞれ (10),(01)\begin{pmatrix} -1 \\ 0 \end{pmatrix}, \begin{pmatrix} 0 \\ -1 \end{pmatrix} にとれる[2]。後は、ϕ1\phi_1ϕ2\phi_2 をそれぞれ計算すると、以下が AA の特異値分解であることが分かる。

A=(0ii0)(120013)(1001) \begin{align*} A = \begin{pmatrix} 0 & i \\ -i & 0 \end{pmatrix}\begin{pmatrix} \frac{1}{2} & 0 \\ 0 & \frac{1}{3} \end{pmatrix}\begin{pmatrix} -1 & 0 \\ 0 & -1 \end{pmatrix} \end{align*}

NumPy で検証してみる

以下のような実装で、理論上の計算と同じ結果が得られていることが分かる。

>>> import numpy as np
>>> A = np.array([[0, -(1/3)*1.j], [(1/2)*1.j, 0]])
>>> u, s, vh = np.linalg.svd(A)
>>> u
array([[0.+0.j, 0.+1.j],
       [0.-1.j, 0.+0.j]])
>>> s
array([0.5       , 0.33333333])
>>> vh
array([[-1.+0.j, -0.+0.j],
       [-0.+0.j, -1.+0.j]])

まとめ

特異値分解は普段はライブラリで計算してしまうので、それほど気に留める存在でもないかもしれない。ところが、関数解析の目線で見てあげると意外とイケメンな素顔もあるので、そこに焦点を当ててみようかと思ってざっと記事を書いてみた。

余談

Wikipedia の Singular value を紐解くと

In mathematics, in particular functional analysis, the singular values, or s-numbers of a compact operator T : X → Y acting between Hilbert spaces X and Y, are the square roots of non-negative eigenvalues of the self-adjoint operator T*T (where T* denotes the adjoint of T).

といったように、特異値は分野によっては s-number と呼ばれる。手元に適当な本がないのでうろ覚えだが、Schatten クラスと呼ばれるコンパクト作用素のイデアルがこの s-number を用いて定義され、ルベーグ積分における LpL^p クラスのような位置付けになっていたような記憶がある。

文献

[RS1] M. Reed and B. Simon. Methods of Modern Mathematical Physics, I. Functional Analysis, pp.203-204, Academic Press, New York, 1981

脚注
  1. 量子ゲートでいう YY ゲートを使う。 ↩︎

  2. 後の都合でここでは符号をマイナスにとっている。 ↩︎

GitHubで編集を提案

Discussion

ログインするとコメントできます