高校日本史191026 views
高校倫理1444503 views
世界の国567435 views
りんご220229 views
ヒストリア294981 views
中学理科1633649 views
Computer370048 views
高校国語790013 views
中学英語813624 views
小学算数1203731 views
Help
Tools

English

コレスキー分解|正定値行列の平方根と正定値性の判定

対称で正定値な行列は、下三角行列とその転置の積に分かれます。

これをコレスキー分解といいます。 は対角成分がすべて正の下三角行列で、 の平方根にあたるものです。

LU 分解では と の 2 つを求めますが、対称性のおかげで片方だけで済みます。計算量も記憶する量も半分になります。

HTML
CSS
JavaScript
<svg viewBox="0 0 460 200" width="100%" style="max-width:460px;display:block;margin:0 auto">
	<rect x="30" y="40" width="100" height="100" fill="#1b81e0" fill-opacity="0.12" stroke="#c8c8c8" stroke-width="1"></rect>
	<text x="80" y="95" font-size="15" fill="#1f1f1f" text-anchor="middle">A</text>
	<text x="80" y="30" font-size="11" fill="#9a9a9a" text-anchor="middle">対称・正定値</text>
	<text x="150" y="97" font-size="15" fill="#9a9a9a" text-anchor="middle">=</text>
	<polygon points="175,40 175,140 275,140" fill="#1b81e0" fill-opacity="0.12"></polygon>
	<rect x="175" y="40" width="100" height="100" fill="none" stroke="#c8c8c8" stroke-width="1"></rect>
	<line x1="175" y1="40" x2="275" y2="140" stroke="#9a9a9a" stroke-width="1" stroke-dasharray="3 3"></line>
	<text x="205" y="123" font-size="15" fill="#1b81e0" text-anchor="middle">L</text>
	<text x="225" y="30" font-size="11" fill="#9a9a9a" text-anchor="middle">下三角(対角は正)</text>
	<text x="295" y="97" font-size="15" fill="#9a9a9a" text-anchor="middle">×</text>
	<polygon points="320,40 420,40 420,140" fill="#1b81e0" fill-opacity="0.12"></polygon>
	<rect x="320" y="40" width="100" height="100" fill="none" stroke="#c8c8c8" stroke-width="1"></rect>
	<line x1="320" y1="40" x2="420" y2="140" stroke="#9a9a9a" stroke-width="1" stroke-dasharray="3 3"></line>
	<text x="390" y="65" font-size="15" fill="#1b81e0" text-anchor="middle">L</text>
	<text x="400" y="58" font-size="10" fill="#1b81e0">T</text>
	<text x="370" y="30" font-size="11" fill="#9a9a9a" text-anchor="middle">その転置</text>
	<text x="230" y="180" font-size="11" fill="#9a9a9a" text-anchor="middle">求めるのは L だけで、もう一方は転置するだけです</text>
</svg>

コレスキー分解とは

対称行列 に対して、対角成分が正である下三角行列 を見つけて と書くことをコレスキー分解といいます。

複素数まで広げるなら、エルミート行列に対して と書きます。転置のかわりに共役転置を使うだけで、話の筋は変わりません。

数の世界の平方根と同じ位置にあります。正の数 が と書けるように、正定値行列は と書けます。

正定値であることが前提

が正定値であるとは、 でないすべてのベクトル について が成り立つことをいいます。

この仮定は外せません。 と書けたとすると、二次形式は となり、必ず 以上になるからです。

が正則なら となるのは のときだけで、値は正になります。逆に正定値なら分解が存在することも示せます。

成分は順に決まる

を成分ごとに書き下すと、左上から順に が決まっていきます。対角成分は次の式です。

対角より下の成分は、すでに求めた値を使って割り算で出ます。

未知数が 1 つずつ増える形なので、連立方程式を解く必要はありません。左上から順に埋めるだけです。

HTML
CSS
JavaScript
<svg viewBox="0 0 460 210" width="100%" style="max-width:460px;display:block;margin:0 auto">
	<text x="230" y="22" font-size="11" fill="#9a9a9a" text-anchor="middle">左上から順に、下三角の成分が 1 つずつ決まります</text>
	<rect x="150" y="40" width="160" height="140" fill="none" stroke="#c8c8c8" stroke-width="1"></rect>
	<rect x="150" y="40" width="53" height="47" fill="#1b81e0" fill-opacity="0.18"></rect>
	<rect x="150" y="87" width="53" height="46" fill="#1b81e0" fill-opacity="0.14"></rect>
	<rect x="203" y="87" width="53" height="46" fill="#1b81e0" fill-opacity="0.14"></rect>
	<rect x="150" y="133" width="53" height="47" fill="#1b81e0" fill-opacity="0.1"></rect>
	<rect x="203" y="133" width="53" height="47" fill="#1b81e0" fill-opacity="0.1"></rect>
	<rect x="256" y="133" width="54" height="47" fill="#1b81e0" fill-opacity="0.1"></rect>
	<text x="176" y="70" font-size="13" fill="#1f1f1f" text-anchor="middle">1</text>
	<text x="176" y="116" font-size="13" fill="#1f1f1f" text-anchor="middle">2</text>
	<text x="229" y="116" font-size="13" fill="#1f1f1f" text-anchor="middle">3</text>
	<text x="176" y="162" font-size="13" fill="#1f1f1f" text-anchor="middle">4</text>
	<text x="229" y="162" font-size="13" fill="#1f1f1f" text-anchor="middle">5</text>
	<text x="283" y="162" font-size="13" fill="#1f1f1f" text-anchor="middle">6</text>
	<text x="229" y="70" font-size="13" fill="#9a9a9a" text-anchor="middle">0</text>
	<text x="283" y="70" font-size="13" fill="#9a9a9a" text-anchor="middle">0</text>
	<text x="283" y="116" font-size="13" fill="#9a9a9a" text-anchor="middle">0</text>
	<text x="230" y="200" font-size="11" fill="#9a9a9a" text-anchor="middle">対角に来るたびに平方根を 1 回とります</text>
</svg>

例:2 次の行列で手順をなぞる

小さい行列で流れを見ます。

まず です。第 1 列の残りは、対角で割って になります。

対角に戻ると、その行ですでに求めた成分の 2 乗を引いてから平方根を取ります。 です。

の 成分は で、もとの行列に戻ります。

例:3 次の行列を分解する

次の対称行列を分解します。

第 1 列から始めます。、、 です。

第 2 列に移ります。、 になります。

最後に です。

を計算すると、もとの に戻ります。平方根の中身が 、、 とすべて正だったことにも注目してください。

対角を正に取れば一通りに決まる

対角成分を正に取るという約束をすれば、分解は一通りに決まります。上の手順で選択の余地がなかったことが、そのまま証明になっています。

約束を外せば自由が残ります。 の第 列全体の符号を反転しても は変わらないからです。

正定値なら平方根の中身が必ず正になり、途中で止まることもありません。この事実の証明には、部分行列も正定値であることを使います。

二次形式が平方和になる

分解ができると、二次形式が平方の和として書けます。

これは平方完成そのものです。 の成分が、平方完成で出てくる係数に対応します。

正定値性が目に見える形になるのが利点です。二次形式が平方の和である以上、値は 以上で、 になるのは のときだけです。

例:二次形式を平方完成する

さきほどの 3 次の で書き下します。二次形式を成分で展開すると、次の式になります。

の列を係数として読むと、3 つの平方の和にまとまります。

括弧の中に並ぶ数は、 の第 1 列、第 2 列、第 3 列そのものです。 を入れると、どちらの式も になります。

手で平方完成を進めても、同じ式に行き着きます。コレスキー分解は、その手順を行列の形で書き留めたものにほかなりません。

平方根を使わない LDL 分解

平方根を避けたいときは、対角を別に取り出します。

ここで は対角がすべて の下三角行列、 は対角行列です。成分は次の式で決まります。

平方根が出てこないので、有理数の範囲で計算が閉じます。 の成分が正なら、平方根を に配ってコレスキー分解に戻せます。

例:同じ行列を LDL 分解で書く

さきほどの の各列を、対角成分で割ります。

の対角は、コレスキー分解の対角を 2 乗したものです。、、 と対応しています。

整数だけで書けている点に注目してください。もとの行列が整数でも、コレスキー分解には平方根が現れることがあります。LDL 分解ならそれを避けられます。

例:平方根が残る行列で 2 つの分解を比べる

次の行列は、差分方程式や格子の問題でよく現れる形です。

コレスキー分解を進めると、最初の段階から平方根が出てきます。、、 です。

続けると 、、 になります。手で扱うには重い形です。

同じ行列を LDL 分解で書くと、有理数だけで収まります。

の対角はすべて正なので、この行列は正定値です。行列式は になります。

LU 分解の対称版として見る

が対称なら、LDU 分解の は の転置になります。つまり は LDU 分解の対称版です。

消去の手順もまったく同じです。違うのは、対称性のおかげで下半分だけ計算すれば足りることです。

コレスキー分解は、そこからさらに の平方根を に吸収させた形にあたります。3 つの書き方は同じ計算の言い換えです。

LU 分解

どんな正則行列にも使えます。ピボット選択が要り、 と の両方を求めます

コレスキー分解

対称正定値のときだけ使えます。ピボット選択が要らず、 だけで済むので手数は半分です

ピボット選択が要らず、計算量も半分

正定値性から、平方根の中身が必ず正になります。 で割る心配も、 に近い値で割る心配もありません。

だから行の入れ替えが要りません。LU 分解では安定性のために毎回ピボットを選びますが、こちらでは順番どおりに進めるだけです。

演算量は 程度で、LU 分解のおよそ半分です。記憶する量も、下三角だけなので半分で済みます。

連立方程式を解く

に を入れると、三角の方程式が 2 つ並びます。

まず を上から解き、次に を下から解きます。LU 分解と同じ形ですが、使う行列が 1 つだけです。

例:連立方程式を解く

さきほどの に対して、右辺を とします。

を上から解きます。 から 、 から です。

第 3 式は なので、 から になります。

を下から解きます。 から 、 から 、 から です。

解は で、 を計算すると に戻ります。

行列式は対角の 2 乗の積

です。三角行列の行列式は対角の積なので、次の形になります。

さきほどの例なら です。LDL 分解の の対角を掛けても で一致します。

正定値行列の行列式が正になることも、この式から出ます。平方になっているので負にはなりません。

正定値かどうかの判定に使える

分解の手順そのものが判定になります。平方根の中身が負になった時点で、その行列は正定値ではありません。

首座小行列式をすべて計算する方法や、固有値を求める方法より手軽です。分解を試みて、最後まで進めるかどうかを見るだけで済みます。

数値計算のライブラリが正定値性を確かめるときも、たいていこの方法を使います。判定と分解が同時に終わるので無駄がありません。

例:正定値でない行列では途中で止まる

次の対称行列で試します。

、 までは進みます。ところが次の段階で行き詰まります。

平方根が実数の範囲で取れません。実際この行列の固有値は と で、正定値ではありません。

を入れると二次形式が になります。負の値を取るので、平方の和には書けないわけです。

半正定値のときは一意でなくなる

どまりの半正定値行列でも、分解自体は存在します。ただし対角に が現れ、一意性が崩れます。

になるので、 を決める割り算ができません。 をどう選んでも は満たされます。

、 と置けば、 のどれでも になります。分解が無数にあるわけです。

実際の計算では、対角の大きい成分を先に持ってくる置換を入れて対処します。階数のぶんだけ正の対角が並ぶ形に整えられます。

応用

統計では、共分散行列から相関のある乱数を作るのに使います。互いに独立な標準正規乱数 に を掛けると、 の共分散行列が になります。

最小二乗法の正規方程式にも現れます。係数行列 は対称で、列が一次独立なら正定値なので、この分解で解けます。

大きな疎行列の反復解法では、途中を切り捨てた不完全コレスキー分解を前処理に使います。厳密な分解でなくても、収束を速める効果があります。

例:共分散行列から相関のある乱数を作る

相関係数が の 2 変数を作ります。目標とする共分散行列は次の形です。

分解すると 、、 です。

独立な標準正規乱数 、 に を掛けると、、 が得られます。

の分散は 、 との共分散は です。狙いどおりの相関を持つ組ができました。

他の話題とのつながり

ブロックに区切って同じ消去を進めると、右下にシューア補元が現れます。正定値行列のシューア補元もまた正定値になるので、分解が最後まで進むことの説明になります。

スペクトル分解を使えば、対称行列の別の平方根も作れます。固有値の平方根を使う は対称ですが、コレスキー分解の は三角です。同じ「平方根」でも形が違います。

正定値性そのものの判定法は正定値行列と半正定値行列の記事に、二次形式の標準形は二次形式と標準形の記事にあります。

よくある誤り

対称というだけでは分解できません。正定値であることまで要ります
平方根の中身が負になったら、計算を間違えたのではなく、その行列が正定値でないということです
は の平方根と呼ばれますが、 という意味ではありません。 です
スペクトル分解から作る とコレスキー分解の は別物です。前者は対称、後者は三角になります
の対角はコレスキー分解の対角そのものではありません。2 乗したものが対応します
半正定値のときは分解が一通りに決まりません。一意性は正定値の場合の話です
ピボット選択が要らないのは正定値だからです。対称でも正定値でなければ、この保証はありません
行列式が正であることは正定値の必要条件にすぎません。 が 2 つ並ぶ行列でも行列式は正になります

参考文献

Cholesky decomposition - Wikipedia
Cholesky-Zerlegung - Wikipedia(ドイツ語)
Factorisation de Cholesky - Wikipédia(フランス語)
科列斯基分解 - 维基百科(中国語)
対称で正定値な行列は、下三角行列とその転置の積に分かれます。これがコレスキー分解です。成分が左上から順に決まる仕組み、平方根を避ける LDL 分解、ピボット選択が要らず手数が LU 分解の半分で済む理由、二次形式が平方の和になること、平方根の中身が負になれば正定値でないと分かることを、計算例をつけて解説します。