行列分解法
線型代数学 において 、 コレスキー分解 または コレスキー因数分解 (発音: shə- LES -kee ) は、 エルミート 正 定値行列を 下三角行列 とその 共役転置 の積に 分解することであり、 モンテカルロシミュレーション などの効率的な数値解法に役立ちます。これは、 アンドレ=ルイ・コレスキー が実行行列に対して発見し 、1924年に彼の死後に出版されました。 [1]
コレスキー分解が適用可能な場合、 連立一次方程式を 解くのに、 LU分解 の約2倍の効率があります。 [2]
声明
エルミート 正定値行列 A のコレスキー分解は 、次の形式の分解である。
あ
=
ら
ら
∗
、
{\displaystyle \mathbf {A} =\mathbf {LL} ^{*},}
ここで、 Lは 実数で正の対角要素を持つ下三角行列 であり 、 L *は L の 共役転置 を表す 。すべてのエルミート正定値行列(したがってすべての実数値対称正定値行列)は一意のコレスキー分解を持つ。 [3]
逆は自明に成り立ちます。つまり、 A が 、下三角であろうとなかろうと、 何らかの可逆な Lに対して LL * と表せる場合、 A は エルミートかつ正定値です。
A が実数行列(対称正定値行列)の
とき、因数分解は次のように表される。L は 正の対角要素を持つ実数下三角行列
である。 [4] [5] [6]
あ
=
ら
ら
T
、
{\displaystyle \mathbf {A} =\mathbf {LL} ^{\mathsf {T}},}
半正定値行列
エルミート行列 A が正定値ではなく半正定値である場合、 L の対角要素 がゼロになることが許される A = LL *の形式の分解が依然として存在します。 [7]
分解は一意である必要はありません。たとえば、
任意の θ
に対して一意です。ただし、 A の階数 が rの場合、 r 個 の正 の対角要素と n − r列がすべてゼロである下三角行列 L が一意に存在します 。 [8]
[
0
0
0
1
]
=
ら
ら
∗
、
ら
=
[
0
0
コス
θ
罪
θ
]
、
{\displaystyle {\begin{bmatrix}0&0\\0&1\end{bmatrix}}=\mathbf {L} \mathbf {L} ^{*},\quad \quad \mathbf {L} ={\begin{bmatrix }0&0\\\cos \theta &\sin \theta \end{bmatrix}},}
あるいは、ピボットの選択を固定すると、分解を一意にすることができます。正式には、 A がランクrの n × n 正半正定値行列 である場合 、少なくとも1つの置換行列 P が存在し、 PAP Tは PAP T = LL *の 形式の一意の分解を持ちます 。ここで、 L1
は 正の対角を持つ r × rの 下三角行列です 。 [9]
ら
=
[
ら
1
0
ら
2
0
]
{\textstyle \mathbf {L} ={\begin{bmatrix}\mathbf {L} _{1}&0\\\mathbf {L} _{2}&0\end{bmatrix}}}
LDL分解
古典的なコレスキー分解に密接に関連する変種としてLDL分解がある。
あ
=
ら
だ
ら
∗
、
{\displaystyle \mathbf {A} =\mathbf {LDL} ^{*},}
ここで、 Lは 下単位三角行列(単三行列) であり 、 Dは 対角 行列である 。つまり、 L の対角要素は1である必要があるが、分解において追加の対角行列 Dを 導入する必要がある。主な利点は、LDL分解は基本的に同じアルゴリズムで計算および使用できるが、平方根の抽出を回避することである。 [10]
このため、LDL 分解は 平方根フリーのコレスキー 分解と呼ばれることが多いです。実行行列の場合、因数分解は A = LDL T の形式をとり、 LDLT 分解 (または LDL T 分解、あるいは LDL′ )と呼ばれることが多いです。これは 、実行対称行列の固有分解 A = QΛQ T を彷彿とさせますが 、 Λ と D は 類似行列 ではない ため、実際にはかなり異なります 。
LDL 分解は、次のように LL * 形式の古典的なコレスキー分解と関連しています。
あ
=
ら
だ
ら
∗
=
ら
だ
1
/
2
(
だ
1
/
2
)
∗
ら
∗
=
ら
だ
1
/
2
(
ら
だ
1
/
2
)
∗
。
{\displaystyle \mathbf {A} =\mathbf {LDL} ^{*}=\mathbf {L} \mathbf {D} ^{1/2}\left(\mathbf {D} ^{1/2}\ right)^{*}\mathbf {L} ^{*}=\mathbf {L} \mathbf {D} ^{1/2}\left(\mathbf {L} \mathbf {D} ^{1/2}\right)^{*}.}
逆に、正定値行列の 古典的なコレスキー分解を考えると、 S が の主対角要素を含む対角行列である場合 、 A は 次の
ように分解できます (これにより、各列が再スケールされて対角要素が 1 になります)。
あ
=
C
C
∗
{\textstyle \mathbf {A} =\mathbf {C} \mathbf {C} ^{*}}
C
{\textstyle \mathbf {C} }
ら
だ
ら
∗
{\textstyle \mathbf {L} \mathbf {D} \mathbf {L} ^{*}}
ら
=
C
S
−
1
{\displaystyle \mathbf {L} =\mathbf {C} \mathbf {S} ^{-1}}
だ
=
S
2
。
{\displaystyle \mathbf {D} =\mathbf {S} ^{2}.}
A が 正定値行列であれば、 D の対角要素は すべて正である。半正定値行列 A に対しては、 対角要素 D の非ゼロ要素の数が A の階数とちょうど同じになる分解が存在する 。 [11]コレスキー分解が存在しない不定値行列の中には、 D
に負の要素を持つ LDL 分解を持つものがある。つまり、 A の 最初の n − 1 個の 主要小行列 が非特異であれば十分である。 [12]
ら
だ
ら
∗
{\textstyle \mathbf {L} \mathbf {D} \mathbf {L} ^{*}}
例
以下は対称実行列のコレスキー分解です。
(
4
12
−
16
12
37
−
43
−
16
−
43
98
)
=
(
2
0
0
6
1
0
−
8
5
3
)
(
2
6
−
8
0
1
5
0
0
3
)
。
{\displaystyle {\begin{aligned}{\begin{pmatrix}4&12&-16\\12&37&-43\\-16&-43&98\\\end{pmatrix}}={\begin{pmatrix}2&0&0\\6&1&0\\-8&5&3\\\end{pmatrix}}{\begin{pmatrix}2&6&-8\\0&1&5\\0&0&3\\\end{pmatrix}}.\end{aligned}}}
LDL T の分解は次のとおりです。
(
4
12
−
16
12
37
−
43
−
16
−
43
98
)
=
(
1
0
0
3
1
0
−
4
5
1
)
(
4
0
0
0
1
0
0
0
9
)
(
1
3
−
4
0
1
5
0
0
1
)
。
{\displaystyle {\begin{aligned}{\begin{pmatrix}4&12&-16\\12&37&-43\\-16&-43&98\\\end{pmatrix}}&={\begin{pmatrix}1&0&0\\3&1&0\\-4&5&1\\\end{pmatrix}}{\begin{pmatrix}4&0&0\\0&1&0\\0&0&9\\\end{pmatrix}}{\begin{pmatrix}1&3&-4\\0&1&5\\0&0&1\\\end{pmatrix}}.\end{aligned}}}
幾何学的解釈
楕円は単位円の線形イメージです。2 つのベクトルは、 最初の軸に平行で、 最初の 2 つの軸が張る平面内にある ように選択された楕円の共役軸です。
ヴ
1
、
ヴ
2
{\textstyle v_{1},v_{2}}
ヴ
1
{\textstyle v_{1}}
ヴ
2
{\textstyle v_{2}}
コレスキー分解は、楕円体 の 共役軸 の特定の選択に相当します 。 [13] 詳細には、楕円体を と定義すると 、定義により、ベクトルの集合は のときに限り、 楕円体の共役軸になります 。すると、楕円体は であり 、ここで は 基底ベクトル をマップし 、 は n 次元の単位球面です。つまり、楕円体は単位球面の線形イメージです。
ええ
T
あ
ええ
=
1
{\textstyle y^{T}Ay=1}
ヴ
1
、
。
。
。
、
ヴ
ん
{\textstyle v_{1},...,v_{n}}
ヴ
私
T
あ
ヴ
じゅう
=
δ
私
じゅう
{\textstyle v_{i}^{T}Av_{j}=\delta _{ij}}
{
∑
私
x
私
ヴ
私
:
x
T
x
=
1
}
=
ふ
(
S
ん
)
{\displaystyle \left\{\sum _{i}x_{i}v_{i}:x^{T}x=1\right\}=f(\mathbb {S} ^{n})}
ふ
{\textstyle f}
e
私
↦
ヴ
私
{\textstyle e_{i}\mapsto v_{i}}
S
ん
{\textstyle \mathbb {S} ^{n}}
行列 を定義すると 、 は と等しくなります 。共役軸の異なる選択は、異なる分解に対応します。
五
:=
[
ヴ
1
|
ヴ
2
|
⋯
|
ヴ
ん
]
{\textstyle V:=[v_{1}|v_{2}|\cdots |v_{n}]}
v
i
T
A
v
j
=
δ
i
j
{\textstyle v_{i}^{T}Av_{j}=\delta _{ij}}
V
T
A
V
=
I
{\textstyle V^{T}AV=I}
コレスキー分解は、 最初の軸に平行になるように選択すること、 最初の 2 つの軸が張る平面内になるように選択することなどに対応します。これにより、 上三角行列が作成されます。次に、 があり 、 は 下三角です。
v
1
{\textstyle v_{1}}
v
2
{\textstyle v_{2}}
V
{\textstyle V}
A
=
L
L
T
{\textstyle A=LL^{T}}
L
=
(
V
−
1
)
T
{\textstyle L=(V^{-1})^{T}}
同様に、 主成分分析は、 が直交することを 選択することに相当します。次に、 および とする と、 が成立します。ここで、 は 直交 行列です。これにより が得られます 。
v
1
,
.
.
.
,
v
n
{\textstyle v_{1},...,v_{n}}
λ
=
1
/
‖
v
i
‖
2
{\textstyle \lambda =1/\|v_{i}\|^{2}}
Σ
=
d
i
a
g
(
λ
1
,
.
.
.
,
λ
n
)
{\textstyle \Sigma =\mathrm {diag} (\lambda _{1},...,\lambda _{n})}
V
=
U
Σ
−
1
/
2
{\textstyle V=U\Sigma ^{-1/2}}
U
{\textstyle U}
A
=
U
Σ
U
T
{\textstyle A=U\Sigma U^{T}}
アプリケーション
線形方程式の数値解
コレスキー分解は主に線形方程式 の数値解法に使用されます 。A が対称かつ正定値の場合 、 最初 にコレスキー分解を計算し 、次に 前進代入 によって y を解き 、最後に 後退代入 によって x を解くことで解くことができます 。
A
x
=
b
{\textstyle \mathbf {Ax} =\mathbf {b} }
A
x
=
b
{\textstyle \mathbf {Ax} =\mathbf {b} }
A
=
L
L
∗
{\textstyle \mathbf {A} =\mathbf {LL} ^{\mathrm {*} }}
L
y
=
b
{\textstyle \mathbf {Ly} =\mathbf {b} }
L
∗
x
=
y
{\textstyle \mathbf {L^{*}x} =\mathbf {y} }
分解で平方根を取らなくて済む別の方法は 、LDL 分解を計算し 、次に y を解き 、最後に を解くことです 。
L
L
∗
{\textstyle \mathbf {LL} ^{\mathrm {*} }}
A
=
L
D
L
∗
{\textstyle \mathbf {A} =\mathbf {LDL} ^{\mathrm {*} }}
L
y
=
b
{\textstyle \mathbf {Ly} =\mathbf {b} }
D
L
∗
x
=
y
{\textstyle \mathbf {DL} ^{\mathrm {*} }\mathbf {x} =\mathbf {y} }
対称形にできる線形システムの場合、コレスキー分解(またはそのLDL変形)は、優れた効率性と数値安定性のために選択される方法です。LU 分解 と比較すると、約2倍の効率があります。 [2]
線形最小二乗法
A が対称かつ正定値 である 形式 Ax = b のシステムは、応用分野で非常に頻繁に発生します。たとえば、線形最小二乗問題の正規方程式はこの形式です。行列 A がエネルギー関数から得られる場合もありますが、これは物理的な考慮から正でなければなりません。これは 偏微分方程式 の数値解法で頻繁に発生します 。
非線形最適化
非線形多変量関数は、 準ニュートン 法と呼ばれる ニュートン法 の変種を使用して、そのパラメータにわたって最小化することができます。反復 k では、探索は を 解くことによって定義される方向に進み 、ここで はステップ方向、 は 勾配 、 は各反復でランク 1 更新を繰り返すことによって形成される ヘッセ行列 の近似値です 。よく知られている 2 つの更新式は、 Davidon–Fletcher–Powell (DFP) と Broyden–Fletcher–Goldfarb–Shanno (BFGS) と呼ばれています。ヘッセ行列の逆行列の近似値を更新するのではなく、ヘッセ行列の近似値のコレスキー分解自体を更新することで、丸め誤差による正定値条件の損失を回避できます。 [14]
p
k
{\textstyle p_{k}}
B
k
p
k
=
−
g
k
{\textstyle B_{k}p_{k}=-g_{k}}
p
k
{\textstyle p_{k}}
p
k
{\textstyle p_{k}}
g
k
{\textstyle g_{k}}
B
k
{\textstyle B_{k}}
モンテカルロシミュレーション
コレスキー分解は、 相関のある複数の変数を持つシステムをシミュレートする モンテカルロ法でよく使用されます。 共分散行列は 分解されて下三角行列 Lが得られます。これをサンプル u の相関のない観測値のベクトルに適用すると、モデル化されているシステムの共分散特性を持つ サンプルベクトル Lu が生成されます。 [15]
次の簡略化された例は、コレスキー分解から得られる経済性を示しています。目標は、 相関係数 が与えられた 2 つの相関正規変数と を生成することだとします。これを実現するには、まず 2 つの相関のないガウスランダム変数 とを 生成する必要があります (たとえば、 Box–Muller 変換 を使用)。必要な相関係数 が与えられた場合、相関正規変数は変換 および によって取得できます 。
x
1
{\textstyle x_{1}}
x
2
{\textstyle x_{2}}
ρ
{\textstyle \rho }
z
1
{\textstyle z_{1}}
z
2
{\textstyle z_{2}}
ρ
{\textstyle \rho }
x
1
=
z
1
{\textstyle x_{1}=z_{1}}
x
2
=
ρ
z
1
+
1
−
ρ
2
z
2
{\textstyle x_{2}=\rho z_{1}+{\sqrt {1-\rho ^{2}}}z_{2}}
カルマンフィルタ
アンセンテッド カルマン フィルタ では、一般的にコレスキー分解を使用して、いわゆるシグマ ポイントのセットを選択します。カルマン フィルタは、システムの平均状態を長さ N のベクトル x として、共分散を N × N 行列 P として追跡します。行列 P は常に半正定値であり、 LL T に分解できます。L の列を 平均 x に追加したり平均 x から減算したりして 、 シグマ ポイントと呼ばれる 2 N ベクトル のセットを形成できます 。これらのシグマ ポイントは、システム状態の平均と共分散を完全に捉えます。
行列反転
エルミート行列の明示的な 逆行列は 、コレスキー分解によって計算することができ、線形システムを解くのと同様に、 演算( 乗算)を使用して計算することができる。 [10] 逆行列全体を効率的にインプレースで実行することもできる。
n
3
{\textstyle n^{3}}
1
2
n
3
{\textstyle {\tfrac {1}{2}}n^{3}}
非エルミート行列 B は、 次の恒等式を使用して逆行列化することもできます。ここで、 BB * は常にエルミートになります。
B
−
1
=
B
∗
(
B
B
∗
)
−
1
.
{\displaystyle \mathbf {B} ^{-1}=\mathbf {B} ^{*}(\mathbf {BB} ^{*})^{-1}.}
計算
コレスキー分解を計算する方法は様々あります。一般的に使用されるアルゴリズムの計算量は、 一般に O ( n 3 )です。 [ 要出典 ] 以下に説明するアルゴリズムはすべて、実数型では約 (1/3) n 3 FLOP ( n 3 /6 回 の乗算と同数の加算)、 複素数型では (4/3) n 3 FLOP を必要とします [16] 。ここで、 n は行列 A のサイズです。したがって、これらのアルゴリズムは、 2 n 3 /3 FLOPを使用する LU 分解 の半分のコストで済みます (Trefethen および Bau 1997 を参照)。
以下のアルゴリズムのどれが高速であるかは、実装の詳細によって異なります。一般的に、最初のアルゴリズムは、データへのアクセス方法があまり規則的ではないため、若干遅くなります。
コレスキーアルゴリズム
分解行列 L を計算するために使用されるコレスキーアルゴリズムは 、 ガウス消去法 の修正版です 。
再帰アルゴリズムは i := 1 から始まり、
A (1) := A .
ステップ i では、行列 A ( i ) は次の形式を持ちます。
ここで、 I i −1 は次元 i − 1の 単位行列 を表します 。
A
(
i
)
=
(
I
i
−
1
0
0
0
a
i
,
i
b
i
∗
0
b
i
B
(
i
)
)
,
{\displaystyle \mathbf {A} ^{(i)}={\begin{pmatrix}\mathbf {I} _{i-1}&0&0\\0&a_{i,i}&\mathbf {b} _{i}^{*}\\0&\mathbf {b} _{i}&\mathbf {B} ^{(i)}\end{pmatrix}},}
行列 L i が次のように定義されている
場合
( A ( i ) は正定値な ので 、 a i,i > 0であることに注意)、 A ( i ) は
次の
ように記述できます
。ここで、 b i b * i は 外積である
ことに注意します。したがって、このアルゴリズムは (Golub & Van Loan)では
外積バージョン と呼ばれています。
L
i
:=
(
I
i
−
1
0
0
0
a
i
,
i
0
0
1
a
i
,
i
b
i
I
n
−
i
)
,
{\displaystyle \mathbf {L} _{i}:={\begin{pmatrix}\mathbf {I} _{i-1}&0&0\\0&{\sqrt {a_{i,i}}}&0\\0&{\frac {1}{\sqrt {a_{i,i}}}}\mathbf {b} _{i}&\mathbf {I} _{n-i}\end{pmatrix}},}
A
(
i
)
=
L
i
A
(
i
+
1
)
L
i
∗
{\displaystyle \mathbf {A} ^{(i)}=\mathbf {L} _{i}\mathbf {A} ^{(i+1)}\mathbf {L} _{i}^{*}}
A
(
i
+
1
)
=
(
I
i
−
1
0
0
0
1
0
0
0
B
(
i
)
−
1
a
i
,
i
b
i
b
i
∗
)
.
{\displaystyle \mathbf {A} ^{(i+1)}={\begin{pmatrix}\mathbf {I} _{i-1}&0&0\\0&1&0\\0&0&\mathbf {B} ^{(i)}-{\frac {1}{a_{i,i}}}\mathbf {b} _{i}\mathbf {b} _{i}^{*}\end{pmatrix}}.}
これをi 1 から n まで繰り返す 。 n ステップ後、 A ( n +1) = I が得られるので、 求める
下三角行列 L は次のように計算される。
L
:=
L
1
L
2
…
L
n
.
{\displaystyle \mathbf {L} :=\mathbf {L} _{1}\mathbf {L} _{2}\dots \mathbf {L} _{n}.}
コレスキー・バナチエヴィッチアルゴリズムとコレスキー・クラウトアルゴリズム
5×5行列上のインプレースCholesky-Banachiewiczアルゴリズムのアクセスパターン(白)と書き込みパターン(黄色)
方程式
A
=
L
L
T
=
(
L
11
0
0
L
21
L
22
0
L
31
L
32
L
33
)
(
L
11
L
21
L
31
0
L
22
L
32
0
0
L
33
)
=
(
L
11
2
(
symmetric
)
L
21
L
11
L
21
2
+
L
22
2
L
31
L
11
L
31
L
21
+
L
32
L
22
L
31
2
+
L
32
2
+
L
33
2
)
,
{\displaystyle {\begin{aligned}\mathbf {A} =\mathbf {LL} ^{T}&={\begin{pmatrix}L_{11}&0&0\\L_{21}&L_{22}&0\\L_{31}&L_{32}&L_{33}\\\end{pmatrix}}{\begin{pmatrix}L_{11}&L_{21}&L_{31}\\0&L_{22}&L_{32}\\0&0&L_{33}\end{pmatrix}}\\[8pt]&={\begin{pmatrix}L_{11}^{2}&&({\text{symmetric}})\\L_{21}L_{11}&L_{21}^{2}+L_{22}^{2}&\\L_{31}L_{11}&L_{31}L_{21}+L_{32}L_{22}&L_{31}^{2}+L_{32}^{2}+L_{33}^{2}\end{pmatrix}},\end{aligned}}}
書き出すと次のようになります。
L
=
(
A
11
0
0
A
21
/
L
11
A
22
−
L
21
2
0
A
31
/
L
11
(
A
32
−
L
31
L
21
)
/
L
22
A
33
−
L
31
2
−
L
32
2
)
{\displaystyle {\begin{aligned}\mathbf {L} ={\begin{pmatrix}{\sqrt {A_{11}}}&0&0\\A_{21}/L_{11}&{\sqrt {A_{22}-L_{21}^{2}}}&0\\A_{31}/L_{11}&\left(A_{32}-L_{31}L_{21}\right)/L_{22}&{\sqrt {A_{33}-L_{31}^{2}-L_{32}^{2}}}\end{pmatrix}}\end{aligned}}}
したがって、 L のエントリについては次の式が得られます 。
L
j
,
j
=
(
±
)
A
j
,
j
−
∑
k
=
1
j
−
1
L
j
,
k
2
,
{\displaystyle L_{j,j}=(\pm ){\sqrt {A_{j,j}-\sum _{k=1}^{j-1}L_{j,k}^{2}}},}
L
i
,
j
=
1
L
j
,
j
(
A
i
,
j
−
∑
k
=
1
j
−
1
L
i
,
k
L
j
,
k
)
for
i
>
j
.
{\displaystyle L_{i,j}={\frac {1}{L_{j,j}}}\left(A_{i,j}-\sum _{k=1}^{j-1}L_{i,k}L_{j,k}\right)\quad {\text{for }}i>j.}
複素行列と実数行列の場合、対角要素とそれに関連する非対角要素の重要でない任意の符号変更が許容されます。A が実数で正定値の場合、平方根の下の式は 常に 正に
なり ます。
複素エルミート行列の場合、次の式が適用されます。
L
j
,
j
=
A
j
,
j
−
∑
k
=
1
j
−
1
L
j
,
k
∗
L
j
,
k
,
{\displaystyle L_{j,j}={\sqrt {A_{j,j}-\sum _{k=1}^{j-1}L_{j,k}^{*}L_{j,k}}},}
L
i
,
j
=
1
L
j
,
j
(
A
i
,
j
−
∑
k
=
1
j
−
1
L
j
,
k
∗
L
i
,
k
)
for
i
>
j
.
{\displaystyle L_{i,j}={\frac {1}{L_{j,j}}}\left(A_{i,j}-\sum _{k=1}^{j-1}L_{j,k}^{*}L_{i,k}\right)\quad {\text{for }}i>j.}
したがって、左と上のエントリがわかっていれば、 ( i , j ) エントリを計算することができます 。計算は通常、次のいずれかの順序で行われます。
Cholesky -Banachiewicz アルゴリズムは、行列 L の左上隅から開始し 、行ごとに行列を計算していきます。
for ( i = 0 ; i < dimensionSize ; i ++ ) { for ( j = 0 ; j <= i ; j ++ ) { float sum = 0 ; for ( k = 0 ; k < j ; k ++ ) sum += L [ i ][ k ] * L [ j ][ k ] ;
i == j の 場合、 L [ i ] [ j ] = sqrt ( A [ i ][ i ] - 合計 )。 それ以外の場合、 L [ i ][ j ] = ( 1.0 / L [ j ][ j ] * ( A [ i ][ j ] - 合計 ) )。 } }
上記のアルゴリズムは、 Fortran などのベクトル化プログラミング言語で ドット積 と 行列乗算 を組み合わせたものとして簡潔に表現できます。
i = 1 、 size ( A 、 1 ) を実行します。L ( i 、 i ) = sqrt ( A ( i 、 i ) - dot_product ( L ( i 、 1 : i - 1 ) 、 L ( i 、 1 : i - 1 ))) L ( i + 1 :、 i ) = ( A ( i + 1 :、 i ) - matmul ( conjg ( L ( i 、 1 : i - 1 )、 L ( i + 1 :、 1 : i - 1 ))) / L ( i 、 i ) を実行します。
ここで、は conjg要素の複素共役を表します。
Cholesky -Crout アルゴリズムは、行列 L の左上隅から開始し 、行列を列ごとに計算していきます。 for ( j = 0 ; j < dimensionSize ; j ++ ) { float sum = 0 ; for ( k = 0 ; k < j ; k ++ ) { sum += L [ j ][ k ] * L [ j ][ k ]; } L [ j ][ j ] = sqrt ( A [ j ][ j ] - sum );
i = j + 1 ; i < dimensionSize ; i ++ ) { sum = 0 ; k = 0 ; k < j ; k ++ ) { sum += L [ i ][ k ] * L [ j ][ k ]; } L [ i ][ j ] = ( 1.0 / L [ j ] [ j ] * ( A [ i ] [ j ] - sum ) ) ; } }
上記のアルゴリズムは、 Fortran などのベクトル化プログラミング言語で ドット積 と 行列乗算 を組み合わせたものとして簡潔に表現できます。
i = 1 、 size ( A 、 1 ) を実行します。L ( i 、 i ) = sqrt ( A ( i 、 i ) - dot_product ( L ( 1 : i - 1 、 i ) 、 L ( 1 : i - 1 、 i ))) L ( i 、 i + 1 :) = ( A ( i 、 i + 1 :) - matmul ( conjg ( L ( 1 : i - 1 、 i )、 L ( 1 : i - 1 、 i + 1 :))) / L ( i 、 i ) を実行します。
ここで、は conjg要素の複素共役を表します。
どちらのアクセス パターンでも、必要に応じて計算全体をインプレースで実行できます。
計算の安定性
条件の整った 線形方程式系を解きたいとします 。LU 分解を使用する場合、何らかのピボット戦略を使用しない限り、アルゴリズムは不安定になります。後者の場合、誤差はマトリックスのいわゆる成長係数に依存しますが、これは通常 (常にそうとは限りませんが) 小さいものです。
ここで、コレスキー分解が適用可能だと仮定します。前述のように、アルゴリズムは 2 倍高速になります。さらに、 ピボット処理 は不要で、誤差は常に小さくなります。具体的には、 Ax = b 、および y が 計算された解を表す場合、 y は 摂動システム ( A + E ) y = b を解きます。ここ
で、 ||·|| 2 は 行列 2 ノルム 、 c n はn に依存する小さな定数 、 ε は 単位の丸め を表します 。
‖
E
‖
2
≤
c
n
ε
‖
A
‖
2
.
{\displaystyle \|\mathbf {E} \|_{2}\leq c_{n}\varepsilon \|\mathbf {A} \|_{2}.}
コレスキー分解で注意すべき懸念事項の 1 つは、平方根の使用です。因数分解される行列が要求どおりに正定値である場合、平方根の下の数値は 正確な算術では常に正になります。残念ながら、 丸め誤差 のために数値が負になることがあり 、その場合アルゴリズムは続行できません。ただし、これは行列が非常に悪条件の場合にのみ発生します。これに対処する 1 つの方法は、分解される行列に対角補正行列を追加して、正定値性を高めることです。 [17] これにより分解の精度が低下する可能性がありますが、他の理由で非常に好ましい場合があります。たとえば、 最適化でニュートン法を 実行する場合、対角行列を追加すると、最適値から遠い場合に安定性が向上します。
LDL分解
A が対称な場合に平方根を取る必要がない別の形式は 、対称不定因数分解である [18]
A
=
L
D
L
T
=
(
1
0
0
L
21
1
0
L
31
L
32
1
)
(
D
1
0
0
0
D
2
0
0
0
D
3
)
(
1
L
21
L
31
0
1
L
32
0
0
1
)
=
(
D
1
(
s
y
m
m
e
t
r
i
c
)
L
21
D
1
L
21
2
D
1
+
D
2
L
31
D
1
L
31
L
21
D
1
+
L
32
D
2
L
31
2
D
1
+
L
32
2
D
2
+
D
3
.
)
.
{\displaystyle {\begin{aligned}\mathbf {A} =\mathbf {LDL} ^{\mathrm {T} }&={\begin{pmatrix}1&0&0\\L_{21}&1&0\\L_{31}&L_{32}&1\\\end{pmatrix}}{\begin{pmatrix}D_{1}&0&0\\0&D_{2}&0\\0&0&D_{3}\\\end{pmatrix}}{\begin{pmatrix}1&L_{21}&L_{31}\\0&1&L_{32}\\0&0&1\\\end{pmatrix}}\\[8pt]&={\begin{pmatrix}D_{1}&&(\mathrm {symmetric} )\\L_{21}D_{1}&L_{21}^{2}D_{1}+D_{2}&\\L_{31}D_{1}&L_{31}L_{21}D_{1}+L_{32}D_{2}&L_{31}^{2}D_{1}+L_{32}^{2}D_{2}+D_{3}.\end{pmatrix}}.\end{aligned}}}
D と L のエントリには次の再帰関係が適用されます 。
D
j
=
A
j
j
−
∑
k
=
1
j
−
1
L
j
k
2
D
k
,
{\displaystyle D_{j}=A_{jj}-\sum _{k=1}^{j-1}L_{jk}^{2}D_{k},}
L
i
j
=
1
D
j
(
A
i
j
−
∑
k
=
1
j
−
1
L
i
k
L
j
k
D
k
)
for
i
>
j
.
{\displaystyle L_{ij}={\frac {1}{D_{j}}}\left(A_{ij}-\sum _{k=1}^{j-1}L_{ik}L_{jk}D_{k}\right)\quad {\text{for }}i>j.}
これは、 D で生成された対角要素がゼロでない限り機能します 。分解は一意です 。Aが実数の場合、 D と L は 実数です 。
複素エルミート行列 A の場合、次の式が適用されます。
D
j
=
A
j
j
−
∑
k
=
1
j
−
1
L
j
k
L
j
k
∗
D
k
,
{\displaystyle D_{j}=A_{jj}-\sum _{k=1}^{j-1}L_{jk}L_{jk}^{*}D_{k},}
L
i
j
=
1
D
j
(
A
i
j
−
∑
k
=
1
j
−
1
L
i
k
L
j
k
∗
D
k
)
for
i
>
j
.
{\displaystyle L_{ij}={\frac {1}{D_{j}}}\left(A_{ij}-\sum _{k=1}^{j-1}L_{ik}L_{jk}^{*}D_{k}\right)\quad {\text{for }}i>j.}
繰り返しになりますが、アクセス パターンにより、必要に応じて計算全体をインプレースで実行できます。
ブロックバリアント
不定行列に適用する場合、 LDL * 分解は注意深いピボットなしでは不安定になることが知られています。 [19] 具体的には、分解の要素が任意に大きくなる可能性があります。改善策としては、ブロックサブ行列(通常は 2 × 2)で分解を実行することが考えられます。 [20]
A
=
L
D
L
T
=
(
I
0
0
L
21
I
0
L
31
L
32
I
)
(
D
1
0
0
0
D
2
0
0
0
D
3
)
(
I
L
21
T
L
31
T
0
I
L
32
T
0
0
I
)
=
(
D
1
(
s
y
m
m
e
t
r
i
c
)
L
21
D
1
L
21
D
1
L
21
T
+
D
2
L
31
D
1
L
31
D
1
L
21
T
+
L
32
D
2
L
31
D
1
L
31
T
+
L
32
D
2
L
32
T
+
D
3
)
,
{\displaystyle {\begin{aligned}\mathbf {A} =\mathbf {LDL} ^{\mathrm {T} }&={\begin{pmatrix}\mathbf {I} &0&0\\\mathbf {L} _{21}&\mathbf {I} &0\\\mathbf {L} _{31}&\mathbf {L} _{32}&\mathbf {I} \\\end{pmatrix}}{\begin{pmatrix}\mathbf {D} _{1}&0&0\\0&\mathbf {D} _{2}&0\\0&0&\mathbf {D} _{3}\\\end{pmatrix}}{\begin{pmatrix}\mathbf {I} &\mathbf {L} _{21}^{\mathrm {T} }&\mathbf {L} _{31}^{\mathrm {T} }\\0&\mathbf {I} &\mathbf {L} _{32}^{\mathrm {T} }\\0&0&\mathbf {I} \\\end{pmatrix}}\\[8pt]&={\begin{pmatrix}\mathbf {D} _{1}&&(\mathrm {symmetric} )\\\mathbf {L} _{21}\mathbf {D} _{1}&\mathbf {L} _{21}\mathbf {D} _{1}\mathbf {L} _{21}^{\mathrm {T} }+\mathbf {D} _{2}&\\\mathbf {L} _{31}\mathbf {D} _{1}&\mathbf {L} _{31}\mathbf {D} _{1}\mathbf {L} _{21}^{\mathrm {T} }+\mathbf {L} _{32}\mathbf {D} _{2}&\mathbf {L} _{31}\mathbf {D} _{1}\mathbf {L} _{31}^{\mathrm {T} }+\mathbf {L} _{32}\mathbf {D} _{2}\mathbf {L} _{32}^{\mathrm {T} }+\mathbf {D} _{3}\end{pmatrix}},\end{aligned}}}
ここで、上記の行列の各要素は正方行列です。このことから、次のような類似の再帰関係が導かれます。
D
j
=
A
j
j
−
∑
k
=
1
j
−
1
L
j
k
D
k
L
j
k
T
,
{\displaystyle \mathbf {D} _{j}=\mathbf {A} _{jj}-\sum _{k=1}^{j-1}\mathbf {L} _{jk}\mathbf {D} _{k}\mathbf {L} _{jk}^{\mathrm {T} },}
L
i
j
=
(
A
i
j
−
∑
k
=
1
j
−
1
L
i
k
D
k
L
j
k
T
)
D
j
−
1
.
{\displaystyle \mathbf {L} _{ij}=\left(\mathbf {A} _{ij}-\sum _{k=1}^{j-1}\mathbf {L} _{ik}\mathbf {D} _{k}\mathbf {L} _{jk}^{\mathrm {T} }\right)\mathbf {D} _{j}^{-1}.}
これには行列積と明示的な反転が含まれるため、実際のブロック サイズが制限されます。
分解の更新
実際によく発生するタスクは、コレスキー分解を更新する必要があることです。詳しく言うと、 ある行列 のコレスキー分解をすでに計算しておき 、次にその行列を 何らかの方法で別の行列、たとえば に変更し 、更新された行列 のコレスキー分解を計算したいとします。ここで問題となるのは、 以前に計算した の コレスキー分解を使用して のコレスキー分解を計算できるかどうかです 。
A
=
L
L
∗
{\textstyle \mathbf {A} =\mathbf {L} \mathbf {L} ^{*}}
A
{\textstyle \mathbf {A} }
A
{\textstyle \mathbf {A} }
A
~
{\textstyle {\tilde {\mathbf {A} }}}
A
~
=
L
~
L
~
∗
{\textstyle {\tilde {\mathbf {A} }}={\tilde {\mathbf {L} }}{\tilde {\mathbf {L} }}^{*}}
A
{\textstyle \mathbf {A} }
A
~
{\textstyle {\tilde {\mathbf {A} }}}
ランク1更新
更新された行列 が によって 行列に関連付けられている特定のケースは、 ランク 1 更新 として知られています 。
A
~
{\textstyle {\tilde {\mathbf {A} }}}
A
{\textstyle \mathbf {A} }
A
~
=
A
+
x
x
∗
{\textstyle {\tilde {\mathbf {A} }}=\mathbf {A} +\mathbf {x} \mathbf {x} ^{*}}
以下はMatlab 構文で記述された 、ランク1更新を実現する
関数 [21]である。
関数 [L] = cholupdate ( L, x ) n = length ( x ); k = 1 の 場合 : n r = sqrt ( L ( k , k ) ^ 2 + x ( k ) ^ 2 ); c = r / L ( k , k ); s = x ( k ) / L ( k , k ); L ( k , k ) = r ; k < nの 場合 L (( k + 1 ): n , k ) = ( L (( k + 1 ): n , k ) + s * x (( k + 1 ): n )) / c ; x (( k + 1 ): n ) = c * x (( k + 1 ): n ) - s * L (( k + 1 ): n , k ); 終了 終了 終了
ランク n 更新 とは、行列 に対して となるように分解を更新することです 。これは、 の各列に対してランク 1 更新を連続して実行することで実現できます 。
M
{\textstyle \mathbf {M} }
A
~
=
A
+
M
M
∗
{\textstyle {\tilde {\mathbf {A} }}=\mathbf {A} +\mathbf {M} \mathbf {M} ^{*}}
M
{\textstyle \mathbf {M} }
ランク1ダウンデート
ランク 1 ダウンデートは 、加算が減算に置き換えられることを除いて、ランク 1 アップデートに似ています。 これは、新しい行列 がまだ正定値である場合にのみ機能します。
A
~
=
A
−
x
x
∗
{\textstyle {\tilde {\mathbf {A} }}=\mathbf {A} -\mathbf {x} \mathbf {x} ^{*}}
A
~
{\textstyle {\tilde {\mathbf {A} }}}
上記のランク 1 更新のコードは、ランク 1 ダウンデートを行うために簡単に適応できます。割り当て内の 2 つの加算を 減算に
r置き換えるだけです。 L((k+1):n, k)
行と列の追加と削除
対称正定値行列を ブロック形式で次のように表す
と、
A
{\textstyle \mathbf {A} }
A
=
(
A
11
A
13
A
13
T
A
33
)
{\displaystyle \mathbf {A} ={\begin{pmatrix}\mathbf {A} _{11}&\mathbf {A} _{13}\\\mathbf {A} _{13}^{\mathrm {T} }&\mathbf {A} _{33}\\\end{pmatrix}}}
およびその上コレスキー因子
L
=
(
L
11
L
13
0
L
33
)
,
{\displaystyle \mathbf {L} ={\begin{pmatrix}\mathbf {L} _{11}&\mathbf {L} _{13}\\0&\mathbf {L} _{33}\\\end{pmatrix}},}
次に、新しい行と列が挿入された、 と
同じ 新しい行列 について、
A
~
{\textstyle {\tilde {\mathbf {A} }}}
A
{\textstyle \mathbf {A} }
A
~
=
(
A
11
A
12
A
13
A
12
T
A
22
A
23
A
13
T
A
23
T
A
33
)
{\displaystyle {\begin{aligned}{\tilde {\mathbf {A} }}&={\begin{pmatrix}\mathbf {A} _{11}&\mathbf {A} _{12}&\mathbf {A} _{13}\\\mathbf {A} _{12}^{\mathrm {T} }&\mathbf {A} _{22}&\mathbf {A} _{23}\\\mathbf {A} _{13}^{\mathrm {T} }&\mathbf {A} _{23}^{\mathrm {T} }&\mathbf {A} _{33}\\\end{pmatrix}}\end{aligned}}}
ここで、分解全体を直接計算せずに、
と呼ばれる のコレスキー分解を見つけることに興味があります。
A
~
{\textstyle {\tilde {\mathbf {A} }}}
S
~
{\textstyle {\tilde {\mathbf {S} }}}
S
~
=
(
S
11
S
12
S
13
0
S
22
S
23
0
0
S
33
)
.
{\displaystyle {\begin{aligned}{\tilde {\mathbf {S} }}&={\begin{pmatrix}\mathbf {S} _{11}&\mathbf {S} _{12}&\mathbf {S} _{13}\\0&\mathbf {S} _{22}&\mathbf {S} _{23}\\0&0&\mathbf {S} _{33}\\\end{pmatrix}}.\end{aligned}}}
の解( 三角行列の場合は簡単に求まる)と のコレスキー分解について 記述すると 、次の関係式が得られます。
A
∖
b
{\textstyle \mathbf {A} \setminus \mathbf {b} }
A
x
=
b
{\textstyle \mathbf {A} \mathbf {x} =\mathbf {b} }
chol
(
M
)
{\textstyle {\text{chol}}(\mathbf {M} )}
M
{\textstyle \mathbf {M} }
S
11
=
L
11
,
S
12
=
L
11
T
∖
A
12
,
S
13
=
L
13
,
S
22
=
c
h
o
l
(
A
22
−
S
12
T
S
12
)
,
S
23
=
S
22
T
∖
(
A
23
−
S
12
T
S
13
)
,
S
33
=
c
h
o
l
(
L
33
T
L
33
−
S
23
T
S
23
)
.
{\displaystyle {\begin{aligned}\mathbf {S} _{11}&=\mathbf {L} _{11},\\\mathbf {S} _{12}&=\mathbf {L} _{11}^{\mathrm {T} }\setminus \mathbf {A} _{12},\\\mathbf {S} _{13}&=\mathbf {L} _{13},\\\mathbf {S} _{22}&=\mathrm {chol} \left(\mathbf {A} _{22}-\mathbf {S} _{12}^{\mathrm {T} }\mathbf {S} _{12}\right),\\\mathbf {S} _{23}&=\mathbf {S} _{22}^{\mathrm {T} }\setminus \left(\mathbf {A} _{23}-\mathbf {S} _{12}^{\mathrm {T} }\mathbf {S} _{13}\right),\\\mathbf {S} _{33}&=\mathrm {chol} \left(\mathbf {L} _{33}^{\mathrm {T} }\mathbf {L} _{33}-\mathbf {S} _{23}^{\mathrm {T} }\mathbf {S} _{23}\right).\end{aligned}}}
これらの式は、行と列の次元が適切に設定されていれば(ゼロを含む)、任意の位置に行または列を挿入した後のコレスキー因子を決定するために使用できます。逆問題、
A
~
=
(
A
11
A
12
A
13
A
12
T
A
22
A
23
A
13
T
A
23
T
A
33
)
{\displaystyle {\begin{aligned}{\tilde {\mathbf {A} }}&={\begin{pmatrix}\mathbf {A} _{11}&\mathbf {A} _{12}&\mathbf {A} _{13}\\\mathbf {A} _{12}^{\mathrm {T} }&\mathbf {A} _{22}&\mathbf {A} _{23}\\\mathbf {A} _{13}^{\mathrm {T} }&\mathbf {A} _{23}^{\mathrm {T} }&\mathbf {A} _{33}\\\end{pmatrix}}\end{aligned}}}
コレスキー分解が知られている
S
~
=
(
S
11
S
12
S
13
0
S
22
S
23
0
0
S
33
)
{\displaystyle {\begin{aligned}{\tilde {\mathbf {S} }}&={\begin{pmatrix}\mathbf {S} _{11}&\mathbf {S} _{12}&\mathbf {S} _{13}\\0&\mathbf {S} _{22}&\mathbf {S} _{23}\\0&0&\mathbf {S} _{33}\\\end{pmatrix}}\end{aligned}}}
コレスキー因子を決定したいという願望
L
=
(
L
11
L
13
0
L
33
)
{\displaystyle {\begin{aligned}\mathbf {L} &={\begin{pmatrix}\mathbf {L} _{11}&\mathbf {L} _{13}\\0&\mathbf {L} _{33}\\\end{pmatrix}}\end{aligned}}}
行と列を削除した
行列の
A
{\textstyle \mathbf {A} }
A
=
(
A
11
A
13
A
13
T
A
33
)
,
{\displaystyle {\begin{aligned}\mathbf {A} &={\begin{pmatrix}\mathbf {A} _{11}&\mathbf {A} _{13}\\\mathbf {A} _{13}^{\mathrm {T} }&\mathbf {A} _{33}\\\end{pmatrix}},\end{aligned}}}
次の規則が得られます。
L
11
=
S
11
,
L
13
=
S
13
,
L
33
=
c
h
o
l
(
S
33
T
S
33
+
S
23
T
S
23
)
.
{\displaystyle {\begin{aligned}\mathbf {L} _{11}&=\mathbf {S} _{11},\\\mathbf {L} _{13}&=\mathbf {S} _{13},\\\mathbf {L} _{33}&=\mathrm {chol} \left(\mathbf {S} _{33}^{\mathrm {T} }\mathbf {S} _{33}+\mathbf {S} _{23}^{\mathrm {T} }\mathbf {S} _{23}\right).\end{aligned}}}
新しい行列のコレスキー分解を求める上記の方程式はすべて の形式であることに注目してください 。これにより、前のセクションで詳述した更新およびダウンデートの手順を使用して効率的に計算できます。 [22]
A
~
=
A
±
x
x
∗
{\textstyle {\tilde {\mathbf {A} }}=\mathbf {A} \pm \mathbf {x} \mathbf {x} ^{*}}
半正定値行列の証明
限定的議論による証明
上記のアルゴリズムは、すべての正定値行列に コレスキー分解があることを示しています。この結果は、限定的な議論によって半正定値行列に拡張できます。この議論は完全に構成的ではありません。つまり、コレスキー因子を計算するための明示的な数値アルゴリズムは提供されません。
A
{\textstyle \mathbf {A} }
が半正定値行列 の 場合 、シーケンスは 正定値行列 で構成されます 。(これは、たとえば、多項式関数計算のスペクトル写像定理から直接導かれる結果です。) また、
演算子ノルム
の場合も同様です 。正定値の場合、それぞれは コレスキー分解 を持ちます 。演算子ノルムの特性により、
A
{\textstyle \mathbf {A} }
n
×
n
{\textstyle n\times n}
(
A
k
)
k
:=
(
A
+
1
k
I
n
)
k
{\textstyle \left(\mathbf {A} _{k}\right)_{k}:=\left(\mathbf {A} +{\frac {1}{k}}\mathbf {I} _{n}\right)_{k}}
A
k
→
A
for
k
→
∞
{\displaystyle \mathbf {A} _{k}\rightarrow \mathbf {A} \quad {\text{for}}\quad k\rightarrow \infty }
A
k
{\textstyle \mathbf {A} _{k}}
A
k
=
L
k
L
k
∗
{\textstyle \mathbf {A} _{k}=\mathbf {L} _{k}\mathbf {L} _{k}^{*}}
‖
L
k
‖
2
≤
‖
L
k
L
k
∗
‖
=
‖
A
k
‖
.
{\displaystyle \|\mathbf {L} _{k}\|^{2}\leq \|\mathbf {L} _{k}\mathbf {L} _{k}^{*}\|=\|\mathbf {A} _{k}\|\,.}
は、演算子ノルムを備えた C* 代数である ため成り立ちます 。は 演算子の バナッハ空間 内の有界集合であるため、 比較的コンパクト です(基礎となるベクトル空間が有限次元であるため)。 その結果、 は とも表記される収束部分列を持ち、 その限界は です。 これが 望ましい特性、つまり を持ち 、 非負の対角要素を持つ下三角である ことは簡単に確認できます。すべての およびに対して 、
≤
{\textstyle \leq }
M
n
(
C
)
{\textstyle M_{n}(\mathbb {C} )}
(
L
k
)
k
{\textstyle \left(\mathbf {L} _{k}\right)_{k}}
(
L
k
)
k
{\textstyle \left(\mathbf {L} _{k}\right)_{k}}
L
{\textstyle \mathbf {L} }
L
{\textstyle \mathbf {L} }
A
=
L
L
∗
{\textstyle \mathbf {A} =\mathbf {L} \mathbf {L} ^{*}}
L
{\textstyle \mathbf {L} }
x
{\textstyle x}
y
{\textstyle y}
⟨
A
x
,
y
⟩
=
⟨
lim
A
k
x
,
y
⟩
=
⟨
lim
L
k
L
k
∗
x
,
y
⟩
=
⟨
L
L
∗
x
,
y
⟩
.
{\displaystyle \langle \mathbf {A} x,y\rangle =\left\langle \lim \mathbf {A} _{k}x,y\right\rangle =\langle \lim \mathbf {L} _{k}\mathbf {L} _{k}^{*}x,y\rangle =\langle \mathbf {L} \mathbf {L} ^{*}x,y\rangle \,.}
したがって、 です 。基になるベクトル空間は有限次元なので、演算子の空間上のすべての位相は同値です。したがって、 ノルムで が傾向にあるということは、要素ごとに が傾向 にあることを意味 します。これは、それぞれが 非負の対角要素を持つ下三角なので、 も であることを意味します。
A
=
L
L
∗
{\textstyle \mathbf {A} =\mathbf {L} \mathbf {L} ^{*}}
(
L
k
)
k
{\textstyle \left(\mathbf {L} _{k}\right)_{k}}
L
{\textstyle \mathbf {L} }
(
L
k
)
k
{\textstyle \left(\mathbf {L} _{k}\right)_{k}}
L
{\textstyle \mathbf {L} }
L
k
{\textstyle \mathbf {L} _{k}}
L
{\textstyle \mathbf {L} }
QR分解による証明
を半正定値 エルミート行列と します。これはその 平方根行列 の積として表すことができます 。 ここで、 QR 分解 を に適用すると 、が得られます。
ここで、 はユニタリで、 は 上三角です。この分解を元の等式に代入すると、 が得られます 。設定すると 証明が完了します。
A
{\textstyle \mathbf {A} }
A
=
B
B
∗
{\textstyle \mathbf {A} =\mathbf {B} \mathbf {B} ^{*}}
B
∗
{\textstyle \mathbf {B} ^{*}}
B
∗
=
Q
R
{\textstyle \mathbf {B} ^{*}=\mathbf {Q} \mathbf {R} }
Q
{\textstyle \mathbf {Q} }
R
{\textstyle \mathbf {R} }
A
=
B
B
∗
=
(
Q
R
)
∗
Q
R
=
R
∗
Q
∗
Q
R
=
R
∗
R
{\textstyle A=\mathbf {B} \mathbf {B} ^{*}=(\mathbf {QR} )^{*}\mathbf {QR} =\mathbf {R} ^{*}\mathbf {Q} ^{*}\mathbf {QR} =\mathbf {R} ^{*}\mathbf {R} }
L
=
R
∗
{\textstyle \mathbf {L} =\mathbf {R} ^{*}}
一般化
コレスキー分解は、(必ずしも有限ではない)演算子要素を持つ行列に 一般化できる [ 要出典 ] 。 ヒルベルト空間 の列をとろう 。演算子行列を考える。
{
H
n
}
{\textstyle \{{\mathcal {H}}_{n}\}}
A
=
[
A
11
A
12
A
13
A
12
∗
A
22
A
23
A
13
∗
A
23
∗
A
33
⋱
]
{\displaystyle \mathbf {A} ={\begin{bmatrix}\mathbf {A} _{11}&\mathbf {A} _{12}&\mathbf {A} _{13}&\;\\\mathbf {A} _{12}^{*}&\mathbf {A} _{22}&\mathbf {A} _{23}&\;\\\mathbf {A} _{13}^{*}&\mathbf {A} _{23}^{*}&\mathbf {A} _{33}&\;\\\;&\;&\;&\ddots \end{bmatrix}}}
直和に作用する
H
=
⨁
n
H
n
,
{\displaystyle {\mathcal {H}}=\bigoplus _{n}{\mathcal {H}}_{n},}
それぞれの
A
i
j
:
H
j
→
H
i
{\displaystyle \mathbf {A} _{ij}:{\mathcal {H}}_{j}\rightarrow {\mathcal {H}}_{i}}
は有界演算子 である 。Aが、 すべての有限k に対して 、および
任意の
h
∈
⨁
n
=
1
k
H
k
,
{\displaystyle h\in \bigoplus _{n=1}^{k}{\mathcal {H}}_{k},}
が存在する場合、 A = LL * となる 下三角演算子行列 L が 存在する。L の対角要素が正の値を取ることも できる 。
⟨
h
,
A
h
⟩
≥
0
{\textstyle \langle h,\mathbf {A} h\rangle \geq 0}
プログラミングライブラリでの実装
C プログラミング言語 : GNU 科学ライブラリは、 コレスキー分解のいくつかの実装を提供します。
Maxima コンピュータ代数システム: 関数は choleskyコレスキー分解を計算します。
GNU Octave 数値計算システムは、コレスキー分解を計算、更新、適用するためのいくつかの関数を提供します。
LAPACKライブラリ は、 Fortran 、 C、 およびほとんどの言語 からアクセスできる、コレスキー分解の高性能実装を提供します。
Python では、モジュール choleskyの 関数が numpy.linalgコレスキー分解を実行します。
Matlab では 、 chol関数はコレスキー分解を行います。 cholデフォルトでは、入力行列の上三角因子が使用されることに注意してください。つまり、 が上三角で ある を計算します 。代わりに下三角因子を使用するようにフラグを渡すこともできます。
A
=
R
∗
R
{\textstyle A=R^{*}R}
R
{\textstyle R}
R では 、 chol関数はコレスキー分解を与えます。
Julia では 、標準ライブラリ choleskyの関数 LinearAlgebraによってコレスキー分解が行われます。
Mathematica では 、関数 " CholeskyDecomposition" を行列に適用できます。
C++ では 、複数の線形代数ライブラリがこの分解をサポートしています。
Armadillo (C++ ライブラリ) は、 コレスキー分解を実行するコマンドを提供します chol。
Eigen ライブラリは、 疎行列と密行列の両方に対してコレスキー分解を提供します。
ROOT パッケージでは 、 TDecompCholクラスが利用可能です。
Analytica では 、関数は Decomposeコレスキー分解を与えます。
Apache Commons Math ライブラリには、Java、Scala、その他の JVM 言語で使用できる実装があります。
参照
注記
^ ブノワ (1924)。 「Note sur une méthode de résolution des équations Normales proventant de l'application de la methode des moindres carrés à un système d'équations linéaires en nombre inférieur à celui des inconnues (Procédé du Commandant Cholesky)」。 Bulletin Géodésique (フランス語)。 2 :66~67。 土井 :10.1007/BF03031308。
^ ab Press、William H.、Saul A. Teukolsky、William T. Vetterling、Brian P. Flannery (1992)。C での数値レシピ: 科学計算の芸術 (第 2 版)。ケンブリッジ大学イングランド EPress。p. 994。ISBN 0-521-43108-5 . 2009年1月28日 閲覧 。
^ ゴラブ & ヴァン・ローン (1996 年、p. 143)、ホーン & ジョンソン (1985 年、p. 407)、トレフェセン & バウ (1997 年、p. 174)。
^ ホーン&ジョンソン(1985年、407頁)。
^ 「行列 - 複素対称行列の対角化」 。MathOverflow 。 2020年1月25日 閲覧 。
^ Schabauer, Hannes; Pacher, Christoph; Sunderland, Andrew G.; Gansterer, Wilfried N. (2010-05-01). 「一般化された複素対称固有値問題の並列ソルバーに向けて」. Procedia Computer Science . ICCS 2010. 1 (1): 437–445. doi : 10.1016/j.procs.2010.04.047 . ISSN 1877-0509.
^ ゴラブとヴァン・ローン (1996、p. 147)。
^ Gentle, James E. (1998). 統計学への応用のための数値線形代数 . Springer. p. 94. ISBN
978-1-4612-0623-1 。
^ Higham, Nicholas J. (1990)。「半正定値行列のコレスキー分解の解析」。Cox, MG、Hammarling, SJ (編)。 信頼性の高い数値計算 。オックスフォード、イギリス: Oxford University Press。pp. 161–185。ISBN 978-0-19-853564-5 。
^ ab Krishnamoorthy, Aravindh; Menon, Deepak (2011). 「コレスキー分解を用いた行列反転」. 1111 : 4144. arXiv : 1111.4144 . Bibcode :2011arXiv1111.4144K.
^ So, Anthony Man-Cho (2007). グラフ実現問題に対する半正定値計画法アプローチ: 理論、応用、拡張 (PDF) (PhD). 定理 2.2.6.
^ Golub & Van Loan (1996, 定理 4.1.3)
^ Pope, Stephen B. 「楕円体のアルゴリズム」 コーネル大学レポート No. FDA (2008): 08-01。
^ アローラ、ジャスビル・シン (2004-06-02)。最適設計入門。エルゼビア 。ISBN 978-0-08-047025-2 。
^ Matlab randn ドキュメント。mathworks.com。
^ ?potrf インテル® マス・カーネル・ライブラリー [1]
^ Fang, Haw-ren; O'Leary, Dianne P. (2006 年 8 月 8 日). 「修正コレスキー アルゴリズム: 新しいアプローチのカタログ」 (PDF) 。
^ Watkins, D. (1991). 行列計算の基礎 . ニューヨーク: Wiley. p. 84. ISBN 0-471-61414-9 。
^ Nocedal, Jorge (2000). 数値最適化 . Springer.
^ Fang, Haw-ren (2007 年 8 月 24 日)。「対称不定値行列のブロック LDLT 因数分解の分析」。
^ 出典: Stewart, GW (1998). Basic decompositions . Philadelphia: Soc. for Industrial and Applied Mathematics. ISBN 0-89871-414-1 。
^ Osborne, M. (2010)、付録B。
参考文献
Dereniowski, Dariusz; Kubale, Marek (2004)。「並列行列のコレスキー分解とグラフのランキング」。第 5 回並列処理および応用数学国際会議 ( PDF) 。コンピュータ サイエンスに関する講義ノート。第 3019 巻。Springer-Verlag。pp. 985–992。doi : 10.1007 /978-3-540-24669-5_127。ISBN 978-3-540-21946-0 2011年7月16日時点の オリジナル (PDF)よりアーカイブ。
Golub, Gene H. ; Van Loan, Charles F. (1996). Matrix Computations (第 3 版). ボルチモア: Johns Hopkins. ISBN 978-0-8018-5414-9 。
ホーン、ロジャー A.; ジョンソン、チャールズ R. (1985)。 マトリックス分析 。ケンブリッジ大学出版局 。ISBN 0-521-38632-2 。
SJ Julier と JK Uhlmann。「確率分布の非線形変換を近似する一般的な方法」。
SJ Julier および JK Uhlmann、「非線形システムへのカルマン フィルタの新しい拡張」、Proc. AeroSense: 11th Int. Symp. Aerospace/Defence Sensing, Simulation and Controls、1997、pp. 182–193。
Trefethen, Lloyd N. ; Bau, David (1997). 数値線形代数 . フィラデルフィア: Society for Industrial and Applied Mathematics. ISBN 978-0-89871-361-9 。
Osborne, Michael (2010)。ベイジアン ガウス過程による逐次予測、最適化、求積 (PDF) (論文)。オックスフォード大学。
Ruschel、João Paulo Tarasconi、学士号「CPU および GPU でのコレスキー分解の並列実装」リオグランデドスル大学、Instituto De Informatica、2016 年、29-30 ページ。
外部リンク
科学の歴史
コレスキーの 1910 年の原稿、 Sur la résolution numérique des systèmes d'équations linéaires 、オンラインで BibNum で分析されています (フランス語と英語) [英語の場合は、「A Télécharger」をクリックしてください]
「コレスキー分解」、 数学百科事典 、 EMS Press 、2001 [1994]
コレスキー分解、データ分析概要ブック
www.math-linux.com の Cholesky 分解
コレスキー分解を簡単にする
コンピュータコード
LAPACK は、密な線形代数問題を解くための FORTRAN サブルーチンのコレクションです (DPOTRF、DPOTRF2、詳細なパフォーマンス)
ALGLIB には、LAPACK の C++、C#、Delphi、Visual Basic などへの部分的な移植が含まれています (spdmatrixcholesky、hpdmatrixcholesky)
libflame は LAPACK 機能を備えた C ライブラリです。
テキサス大学オースティン校におけるコレスキー分解の高性能実装に関するメモとビデオ。
Cholesky : TBB + Threads + SSE は、TBB、スレッド、SSE を使用した CF の実装を説明した本です (スペイン語)。
Google のライブラリ「Ceres Solver」。
Matlab での LDL 分解ルーチン。
ArmadilloはC++の線形代数パッケージです
Rosetta Code は、プログラミング チュートリアル サイトです。ページのトピック。
AlgoWikiは、アルゴリズムの特性と実装の特徴をページトピックにまとめたオープン百科事典です。
Intel® oneAPI 数値計算カーネル ライブラリ 数値計算用に Intel に最適化された数値計算ライブラリ ?potrf、?potrs
シミュレーションにおけるマトリックスの使用
オンライン計算機
オンライン行列計算機は、行列のコレスキー分解をオンラインで実行します。