コレスキー分解|正定値行列の平方根と正定値性の判定
対称で正定値な行列は、下三角行列とその転置の積に分かれます。
これをコレスキー分解といいます。 は対角成分がすべて正の下三角行列で、 の平方根にあたるものです。
LU 分解では と の 2 つを求めますが、対称性のおかげで片方だけで済みます。計算量も記憶する量も半分になります。
<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 つずつ増える形なので、連立方程式を解く必要はありません。左上から順に埋めるだけです。
<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 分解のおよそ半分です。記憶する量も、下三角だけなので半分で済みます。
連立方程式を解く
に を入れると、三角の方程式が 2 つ並びます。
まず を上から解き、次に を下から解きます。LU 分解と同じ形ですが、使う行列が 1 つだけです。
例:連立方程式を解く
さきほどの に対して、右辺を とします。
を上から解きます。 から 、 から です。
第 3 式は なので、 から になります。
を下から解きます。 から 、 から 、 から です。
解は で、 を計算すると に戻ります。
行列式は対角の 2 乗の積
です。三角行列の行列式は対角の積なので、次の形になります。
さきほどの例なら です。LDL 分解の の対角を掛けても で一致します。
正定値行列の行列式が正になることも、この式から出ます。平方になっているので負にはなりません。
正定値かどうかの判定に使える
分解の手順そのものが判定になります。平方根の中身が負になった時点で、その行列は正定値ではありません。
首座小行列式をすべて計算する方法や、固有値を求める方法より手軽です。分解を試みて、最後まで進めるかどうかを見るだけで済みます。
数値計算のライブラリが正定値性を確かめるときも、たいていこの方法を使います。判定と分解が同時に終わるので無駄がありません。
例:正定値でない行列では途中で止まる
次の対称行列で試します。
、 までは進みます。ところが次の段階で行き詰まります。
平方根が実数の範囲で取れません。実際この行列の固有値は と で、正定値ではありません。
を入れると二次形式が になります。負の値を取るので、平方の和には書けないわけです。
半正定値のときは一意でなくなる
どまりの半正定値行列でも、分解自体は存在します。ただし対角に が現れ、一意性が崩れます。
になるので、 を決める割り算ができません。 をどう選んでも は満たされます。
、 と置けば、 のどれでも になります。分解が無数にあるわけです。
実際の計算では、対角の大きい成分を先に持ってくる置換を入れて対処します。階数のぶんだけ正の対角が並ぶ形に整えられます。
応用
統計では、共分散行列から相関のある乱数を作るのに使います。互いに独立な標準正規乱数 に を掛けると、 の共分散行列が になります。
最小二乗法の正規方程式にも現れます。係数行列 は対称で、列が一次独立なら正定値なので、この分解で解けます。
大きな疎行列の反復解法では、途中を切り捨てた不完全コレスキー分解を前処理に使います。厳密な分解でなくても、収束を速める効果があります。
例:共分散行列から相関のある乱数を作る
相関係数が の 2 変数を作ります。目標とする共分散行列は次の形です。
分解すると 、、 です。
独立な標準正規乱数 、 に を掛けると、、 が得られます。
の分散は 、 との共分散は です。狙いどおりの相関を持つ組ができました。
他の話題とのつながり
ブロックに区切って同じ消去を進めると、右下にシューア補元が現れます。正定値行列のシューア補元もまた正定値になるので、分解が最後まで進むことの説明になります。
スペクトル分解を使えば、対称行列の別の平方根も作れます。固有値の平方根を使う は対称ですが、コレスキー分解の は三角です。同じ「平方根」でも形が違います。
正定値性そのものの判定法は正定値行列と半正定値行列の記事に、二次形式の標準形は二次形式と標準形の記事にあります。












