庚午里藻の日記

見た映画とかアニメの備忘録にしたり、パソコンいじったことのメモにしたり

正規直交変換とか白色化とかについて

授業で扱った内容でしかもゴリゴリに既出なんですけど、せっかくなんで(忘れかけている節もあるし)記事にしようと思います。

ここにあるスライドにほぼ同じことが書いてあるのは内緒です。

正規直交変換、白色化についてさらっと式を含めて説明したいと思います。

正規直交変換

線形変換の一種で、固有ベクトル行列を用いた線形変換です。変換後のデータの共分散行列は固有値を対角成分として持つ行列になります。

変換後のデータの共分散行列が固有値を対角成分として持つ行列になることを示します。

変換前のデータをX, 変換後のデータをYとすると以下のように表すことができます。共分散行列に関しては線形変換なので、元のXの共分散行列を以下の式のように変形することで計算できます。


Y = \Phi^{T} X \\
\Sigma_Y = \Phi^{T} \Sigma_X \Phi

ここで、 \PhiはXの固有ベクトル行列なので、各固有ベクトル固有値の組に対して \Sigma \phi = \lambda \phiが成立します。これをまとめると以下の式が成立します。


\Sigma \Phi = \Phi \Lambda

ただし、 \Lambda固有値を対角成分としてもつ対角行列です。

それと、これは話が簡単になる制約(だと思う)んですけど、固有ベクトルの大きさはそれぞれ1であるとします。したがって、異なる固有ベクトル同士の内積は0、同じ固有ベクトル同士の内積は1なので、固有ベクトル行列とその転置の積は単位行列になります。

以上より、以下の条件を用いることができます。


\Sigma \Phi = \Phi \Lambda \\
\Phi^{T} \Phi = I

これらの条件より、はじめに書いた共分散行列に対する条件は以下のように変形できます。


\Sigma_Y = \Phi^{T} \Sigma_X \Phi = \Phi^{T} \Phi \Lambda = I \Lambda = \Lambda

つまり、正規直交変換を施すことによって変換後の共分散行列は \Lambdaとなることがわかりました。

白色化

正規直交行列を施した上に、さらに \Lambda^{-\frac{1}{2}}による線形変換を施すことでデータを以下のように変換することができます。


Y = \Lambda^{-\frac{1}{2}} \Phi^{T} X = (\Phi \Lambda^{-\frac{1}{2}})^{T} X \\
\Sigma_Y = \Lambda^{-\frac{1}{2}} \Phi^{T} \Sigma_X \Phi \Lambda^{-\frac{1}{2}} = \Lambda^{-\frac{1}{2}} \Lambda \Lambda^{-\frac{1}{2}} = I

共分散行列が単位行列になることが確認できます。

また、白色化後は正規直交変換を施しても共分散行列は変化しません。( \Phi^{T} I \Phi = Iなので)

おまけ:同時対角化

2つの異なる共分散行列を持つデータを同時に対角化する線形変換を定義することができます。

まず、データ1に対して白色化を施します。すなわち、 \Lambda_1^{-\frac{1}{2}} \Phi_1^{T}でどちらのデータに対しても線形変換を施します。すると、データ1の共分散行列は(白色化したので) Iに、データ2の共分散行列は  \Lambda_1^{-\frac{1}{2}} \Phi_1^{T} \Sigma_2 \Phi_1 \Lambda_1^{-\frac{1}{2}} = Kとなります。

このKを改めて正規直交変換によって対角化します。すでに白色化しているデータ1については任意の正規直交変換を施しても共分散行列は変化しないので問題ありません。

したがって、同時対角化を施すためにはデータ1、データ2どちらに対しても \Phi_K^{T} \Lambda_1^{-\frac{1}{2}} \Phi_1^{T} による線形変換を行えばいいことがわかりました。

ちなみにその変換の部分をpythonとかで書くとこんな感じ

ed,ev=np.linalg.eig(cov1) #edは固有値の配列、evは固有ベクトル行列になっている

tr=np.diag(ed**(-1./2.)).dot(ev.T) #白色化の項

K = tr.dot(cov2).dot(tr.T) #Kを計算

Ked, Kev = np.linalg.eig(K) #Kの固有値の配列と固有ベクトルを取得
tr2 = Kev.T.dot(tr)

x1=x.dot(tr2.T) 

cov1、cov2はそれぞれデータ1、データ2の共分散行列とします。trは白色化の項を表し、Kの固有値固有ベクトルを計算した上でその積であるtr2が同時対角化の項となっています。

最後に同時対角化したデータの図を載せて終わりにします。

f:id:kanoeuma_310mo:20190908212136p:plain:w300

これが

f:id:kanoeuma_310mo:20190908212221p:plain:w300
こうじゃ!

これで終わりです。