ここで相関行列 C が満たしているはずの性質を今一度列挙してみましょう。
- 成分 ρij は実数
- 対称行列 ρij=ρji
- 半正定値
- 対角成分 ρii=1
- 対角成分以外 −1≤ρij≤1
この相関行列 C を、
C=QQt
という形に分解するのが目的です(覚えてましたか?)
前回その方法としてコレスキー分解を紹介しましたが、どうも安心して使えなさそうだとわかりました。
次に紹介するのは固有値分解です。これは半正定値実対称行列を分解してくれます。
ではここからは線形代数の勉強です(証明などの詳細は省きます。教科書に必ず載っていますので調べてみてください)。
事実1
任意の実正方行列 A は、ある正方行列 U とこれまた正方行列、ただし対角成分のみしか値がない対角行列 W を使って、
A=UWU−1
という形に分解される(これを行列のスペクトル分解といいます)。
ここで行列 U は行列 A の固有ベクトルを横に並べたもので、対角行列 W の成分は行列 A の固有値です。
事実2
更に行列 A が対称行列であった場合、行列の固有ベクトルが全て直交する。すると、
U−1=Ut
となる。というわけで
A=UWU−1=UWUt
事実3
更に更に行列 A が半正定値だとすれば、行列の固有値は全て0以上。つまり行列 W は、
λ10vdots00λ2⋮0⋯⋯⋱⋯00⋮λN=λ10vdots00λ2⋮0⋯⋯⋱⋯00⋮λNλ10vdots00λ2⋮0⋯⋯⋱⋯00⋮λN=W′W′
と出来るではないか!すると、
A=UWU−1=UWUt=UW′W′Ut
となります。ここで (AB)t=BtAt という事実(積の順番が入れ替わる)と、対角行列は転置しても変化しないこと(この場合 (W′)t=W′)に注意すると、
A=UWU−1=UWUt=UW′W′Ut=UW′(UW′)t
やった!! UW′=Q とおけば目標達成じゃない か!
A=QQt
しかし...
実務上(ここがポイント)、相関行列がいつもいつもタチの良い形であるとは限らないのです!もちろん実対称行列であることはどんな場合も間違いないですが(複素数の相関や、100×234の相関行列を作れるものなら作ってみろ)、 半正定値を満たさない場合は往々にしてありえるのです。例えば...
- データに欠損があって、欠損データを適当に埋める
- 乱数列のうち、いくつかのペアについては相関が(観測とは無関係に)与えられている
- 測定誤差
などの場合、相関係数に矛盾が出ることがあるのです。相関係数が矛盾するとはどういうことか、ひとつ最も大げさな例を示してみましょう。
以下の3変数の相関行列を見てください。
C=11−1111−111
実数であるとか、対称であるとか相関行列の性質は確かに満たしているんですが...何がおかしいか分かりますか?
- 第1変数と第2変数の相関係数 ρ12 は 1。第1変数と第2変数は完全相関で全く同じ値になる
- 第2変数と第3変数の相関係数 ρ23 は 1。第2変数と第3変数は完全相関で全く同じ値になる
ってことは必然的に第1変数と第3変数は同じ値になるはずです。しかし与えられた相関係数 ρ13 は -1 になっている!つまり矛盾しているわけです。
要するに相関係数がありえない組み合わせになっている場合がありえるのです(さすがに例のような大げさなのはないでしょうけど)。このとき、相関行列は半正定値ではなくなってコレスキー分解が機能しなくなります。
実務上、相関行列が与えられたら(それに矛盾があろうとなかろうと)計算がストップしてしまうことは望ましくありません。とにかく安定して何らかの答えを出すことが求められます。 もちろん正しい相関行列(半正定値実対称行列)は正しく分解されることが前提です。
そこで NtRand では相関行列の分解に特異値分解(Singular Value Decomposition,SVD)という手法を採用しています。