Matrix decomposition
線形代数 において 、 QR 分解 (QR 分解 または QU 分解 とも呼ばれる) は、 行列 Aを 直交行列 Q と 上三角行列 R の 積 A = QR に 分解する ことです。QR 分解は、 線形最小二乗 (LLS) 問題を解くためによく使用され、特定の 固有値アルゴリズム である QR アルゴリズム の基礎となります 。
事例と定義
正方行列 任意の実 正方行列 Aは 次のように分解できる。
A = Q R , {\displaystyle A=QR,} ここで、 Q は 直交行列 (列は 直交 単位ベクトル 、つまり ) であり、 R は上 三角行列 (直角三角行列とも呼ばれる)である。A が 逆行列 で ある場合、 R の対角要素が正であること を条件に、因数分解は一意となる。 Q T = Q − 1 {\displaystyle Q^{\textsf {T}}=Q^{-1}}
代わりにA が複素正方行列である場合 、分解 A = QR が存在します。ここで、 Qは ユニタリ行列 です (つまり 共役転置です )。 Q † = Q − 1 {\displaystyle Q^{\dagger }=Q^{-1}}
A が n 個の線形独立な 列を持つ 場合、 Q の 最初の n列は A の 列空間 の 直交基底 を形成する。より一般的には、 Q の 最初の k 列は、任意の 1 ≤ k ≤ n に対して、 A の最初の k 列の スパン の直交基底を形成する 。 [1] A の任意の k列が Q の最初の k 列のみに依存する という事実は、 R の三角形形式に対応する 。 [1]
長方形行列 より一般的には、 m ≥ n の複素 m × n 行列 A を、 m × m ユニタリ行列 Q と m × n 上三角行列 R の積として因数分解することができます。m × n上三角行列の 一番下の行( m − n )はすべてゼロで構成されるため、 R 、または R と Qの両方 を 分割することが有用な場合が多くあります 。
A = Q R = Q [ R 1 0 ] = [ Q 1 Q 2 ] [ R 1 0 ] = Q 1 R 1 , {\displaystyle A=QR=Q{\begin{bmatrix}R_{1}\\0\end{bmatrix}}={\begin{bmatrix}Q_{1}&Q_{2}\end{bmatrix}}{\begin{bmatrix}R_{1}\\0\end{bmatrix}}=Q_{1}R_{1},} ここで、 R 1 は n × n の 上三角行列、0 は ( m − n )× n の 零行列 、 Q 1 は m × n 、 Q 2 は m ×( m − n ) であり、 Q 1 と Q 2 はどちらも直交列を持ちます。
Golub & Van Loan (1996, §5.2) は Q 1 R 1を A の 薄い QR 分解 と呼び、Trefethen と Bau はこれを 簡約 QR 分解 と呼んでいます。 [1] A がフル ランク n で、 R 1 の対角要素が正である ことを要求すると、 R 1 と Q 1 は 一意ですが、一般に Q 2 は 一意ではありません。 R 1は、 A * A ( A が実数の場合は A T A )の コレスキー分解 の上三角因子に等しくなります 。
QL、RQ、LQ分解 同様に、 Lを 下 三角行列として 、QL、RQ、LQ 分解を定義することもできます 。
QR分解の計算 QR分解を実際に計算する方法はいくつかあります。例えば、 グラム・シュミット過程 、 ハウスホルダー変換 、 ギブンズ回転 などです。それぞれに長所と短所があります。
グラム・シュミット法の使用 内積を持つ ( 複素数 の場合は または ) 完全な列ランク行列 の列にグラム・シュミット過程を適用すること を 考え ます。 A = [ a 1 ⋯ a n ] {\displaystyle A={\begin{bmatrix}\mathbf {a} _{1}&\cdots &\mathbf {a} _{n}\end{bmatrix}}} ⟨ v , w ⟩ = v T w {\displaystyle \langle \mathbf {v} ,\mathbf {w} \rangle =\mathbf {v} ^{\textsf {T}}\mathbf {w} } ⟨ v , w ⟩ = v † w {\displaystyle \langle \mathbf {v} ,\mathbf {w} \rangle =\mathbf {v} ^{\dagger }\mathbf {w} }
投影 を定義します :
proj u a = ⟨ u , a ⟩ ⟨ u , u ⟩ u {\displaystyle \operatorname {proj} _{\mathbf {u} }\mathbf {a} ={\frac {\left\langle \mathbf {u} ,\mathbf {a} \right\rangle }{\left\langle \mathbf {u} ,\mathbf {u} \right\rangle }}{\mathbf {u} }} それから:
u 1 = a 1 , e 1 = u 1 ‖ u 1 ‖ u 2 = a 2 − proj u 1 a 2 , e 2 = u 2 ‖ u 2 ‖ u 3 = a 3 − proj u 1 a 3 − proj u 2 a 3 , e 3 = u 3 ‖ u 3 ‖ ⋮ ⋮ u k = a k − ∑ j = 1 k − 1 proj u j a k , e k = u k ‖ u k ‖ {\displaystyle {\begin{aligned}\mathbf {u} _{1}&=\mathbf {a} _{1},&\mathbf {e} _{1}&={\frac {\mathbf {u} _{1}}{\|\mathbf {u} _{1}\|}}\\\mathbf {u} _{2}&=\mathbf {a} _{2}-\operatorname {proj} _{\mathbf {u} _{1}}\mathbf {a} _{2},&\mathbf {e} _{2}&={\frac {\mathbf {u} _{2}}{\|\mathbf {u} _{2}\|}}\\\mathbf {u} _{3}&=\mathbf {a} _{3}-\operatorname {proj} _{\mathbf {u} _{1}}\mathbf {a} _{3}-\operatorname {proj} _{\mathbf {u} _{2}}\mathbf {a} _{3},&\mathbf {e} _{3}&={\frac {\mathbf {u} _{3}}{\|\mathbf {u} _{3}\|}}\\&\;\;\vdots &&\;\;\vdots \\\mathbf {u} _{k}&=\mathbf {a} _{k}-\sum _{j=1}^{k-1}\operatorname {proj} _{\mathbf {u} _{j}}\mathbf {a} _{k},&\mathbf {e} _{k}&={\frac {\mathbf {u} _{k}}{\|\mathbf {u} _{k}\|}}\end{aligned}}} 新しく計算された直交基底上の s を 次のように表すことができます。 a i {\displaystyle \mathbf {a} _{i}}
a 1 = ⟨ e 1 , a 1 ⟩ e 1 a 2 = ⟨ e 1 , a 2 ⟩ e 1 + ⟨ e 2 , a 2 ⟩ e 2 a 3 = ⟨ e 1 , a 3 ⟩ e 1 + ⟨ e 2 , a 3 ⟩ e 2 + ⟨ e 3 , a 3 ⟩ e 3 ⋮ a k = ∑ j = 1 k ⟨ e j , a k ⟩ e j {\displaystyle {\begin{aligned}\mathbf {a} _{1}&=\left\langle \mathbf {e} _{1},\mathbf {a} _{1}\right\rangle \mathbf {e} _{1}\\\mathbf {a} _{2}&=\left\langle \mathbf {e} _{1},\mathbf {a} _{2}\right\rangle \mathbf {e} _{1}+\left\langle \mathbf {e} _{2},\mathbf {a} _{2}\right\rangle \mathbf {e} _{2}\\\mathbf {a} _{3}&=\left\langle \mathbf {e} _{1},\mathbf {a} _{3}\right\rangle \mathbf {e} _{1}+\left\langle \mathbf {e} _{2},\mathbf {a} _{3}\right\rangle \mathbf {e} _{2}+\left\langle \mathbf {e} _{3},\mathbf {a} _{3}\right\rangle \mathbf {e} _{3}\\&\;\;\vdots \\\mathbf {a} _{k}&=\sum _{j=1}^{k}\left\langle \mathbf {e} _{j},\mathbf {a} _{k}\right\rangle \mathbf {e} _{j}\end{aligned}}} ここで 、 これは行列形式で書くことができます。 ⟨ e i , a i ⟩ = ‖ u i ‖ {\displaystyle \left\langle \mathbf {e} _{i},\mathbf {a} _{i}\right\rangle =\left\|\mathbf {u} _{i}\right\|}
A = Q R {\displaystyle A=QR} どこ:
Q = [ e 1 ⋯ e n ] {\displaystyle Q={\begin{bmatrix}\mathbf {e} _{1}&\cdots &\mathbf {e} _{n}\end{bmatrix}}} そして
R = [ ⟨ e 1 , a 1 ⟩ ⟨ e 1 , a 2 ⟩ ⟨ e 1 , a 3 ⟩ ⋯ ⟨ e 1 , a n ⟩ 0 ⟨ e 2 , a 2 ⟩ ⟨ e 2 , a 3 ⟩ ⋯ ⟨ e 2 , a n ⟩ 0 0 ⟨ e 3 , a 3 ⟩ ⋯ ⟨ e 3 , a n ⟩ ⋮ ⋮ ⋮ ⋱ ⋮ 0 0 0 ⋯ ⟨ e n , a n ⟩ ] . {\displaystyle R={\begin{bmatrix}\langle \mathbf {e} _{1},\mathbf {a} _{1}\rangle &\langle \mathbf {e} _{1},\mathbf {a} _{2}\rangle &\langle \mathbf {e} _{1},\mathbf {a} _{3}\rangle &\cdots &\langle \mathbf {e} _{1},\mathbf {a} _{n}\rangle \\0&\langle \mathbf {e} _{2},\mathbf {a} _{2}\rangle &\langle \mathbf {e} _{2},\mathbf {a} _{3}\rangle &\cdots &\langle \mathbf {e} _{2},\mathbf {a} _{n}\rangle \\0&0&\langle \mathbf {e} _{3},\mathbf {a} _{3}\rangle &\cdots &\langle \mathbf {e} _{3},\mathbf {a} _{n}\rangle \\\vdots &\vdots &\vdots &\ddots &\vdots \\0&0&0&\cdots &\langle \mathbf {e} _{n},\mathbf {a} _{n}\rangle \\\end{bmatrix}}.}
例 次の分解を考えてみましょう
A = [ 12 − 51 4 6 167 − 68 − 4 24 − 41 ] . {\displaystyle A={\begin{bmatrix}12&-51&4\\6&167&-68\\-4&24&-41\end{bmatrix}}.} 直交行列には という 性質があることを思い出してください 。 Q {\displaystyle Q} Q T Q = I {\displaystyle Q^{\textsf {T}}Q=I}
次に、グラム・シュミットの法則を使って次のように 計算します。 Q {\displaystyle Q}
U = [ u 1 u 2 u 3 ] = [ 12 − 69 − 58 / 5 6 158 6 / 5 − 4 30 − 33 ] ; Q = [ u 1 ‖ u 1 ‖ u 2 ‖ u 2 ‖ u 3 ‖ u 3 ‖ ] = [ 6 / 7 − 69 / 175 − 58 / 175 3 / 7 158 / 175 6 / 175 − 2 / 7 6 / 35 − 33 / 35 ] . {\displaystyle {\begin{aligned}U={\begin{bmatrix}\mathbf {u} _{1}&\mathbf {u} _{2}&\mathbf {u} _{3}\end{bmatrix}}&={\begin{bmatrix}12&-69&-58/5\\6&158&6/5\\-4&30&-33\end{bmatrix}};\\Q={\begin{bmatrix}{\frac {\mathbf {u} _{1}}{\|\mathbf {u} _{1}\|}}&{\frac {\mathbf {u} _{2}}{\|\mathbf {u} _{2}\|}}&{\frac {\mathbf {u} _{3}}{\|\mathbf {u} _{3}\|}}\end{bmatrix}}&={\begin{bmatrix}6/7&-69/175&-58/175\\3/7&158/175&6/175\\-2/7&6/35&-33/35\end{bmatrix}}.\end{aligned}}} したがって、
Q T A = Q T Q R = R ; R = Q T A = [ 14 21 − 14 0 175 − 70 0 0 35 ] . {\displaystyle {\begin{aligned}Q^{\textsf {T}}A&=Q^{\textsf {T}}Q\,R=R;\\R&=Q^{\textsf {T}}A={\begin{bmatrix}14&21&-14\\0&175&-70\\0&0&35\end{bmatrix}}.\end{aligned}}}
RQ分解との関係 RQ分解は、行列 Aを上三角行列 R (直角三角行列とも呼ばれる)と直交行列 Q の積に変換します 。QR分解との唯一の違いは、これらの行列の順序です。
QR 分解は、 A の最初の列から始まる列のグラム・シュミット直交化です。
RQ分解は、 A の最後の行から始まる行のグラム・シュミット直交化です。
メリットとデメリット グラム・シュミット過程は本質的に数値的に不安定です。投影法の適用は直交化と幾何学的に類似しているように見えますが、直交化自体は 数値誤差 が生じやすい傾向があります。大きな利点は実装の容易さです。
世帯主の反射を利用する QR分解におけるハウスホルダー反射:目標は、ベクトル を と 同じ長さで と共線的なベクトルに変換する線形変換を見つけることです 。直交射影(グラム・シュミット射影)を使用することもできますが、ベクトル と が直交に近い場合、数値的に不安定になります。代わりに、ハウスホルダー反射は点線( と の間の角度を二等分するように選択 )を通ります。 この変換の最大角度は45度です。 x {\displaystyle \mathbf {x} } e 1 {\displaystyle \mathbf {e} _{1}} x {\displaystyle \mathbf {x} } e 1 {\displaystyle \mathbf {e} _{1}} x {\displaystyle \mathbf {x} } e 1 {\displaystyle \mathbf {e} _{1}} ハウスホルダー反射(または ハウスホルダー変換)は、ベクトルを 平面 または 超平面 に反射させる変換です。この演算を用いて、 m ≥ n の m 行 n 列行列 の QR 分解を計算できます 。 A {\displaystyle A}
Q は 、1 つの座標以外のすべての座標が消えるようにベクトルを反射するために使用できます。
を任意の実数 m 次元列ベクトルとし、 スカラー α に対してとなるものと する 。アルゴリズムが 浮動小数点演算 を用いて実装される場合、 αはの k 番目の座標 と逆の符号を取るべきである。 ここで 、 αは行列 A の 最終的な上三角形式において、それより後のすべての要素が0となるピボット座標となるべきであり 、これにより 有意性の低下が 避けられる。複素数の場合、 [2]と設定する。 x {\displaystyle \mathbf {x} } A {\displaystyle A} ‖ x ‖ = | α | {\displaystyle \|\mathbf {x} \|=|\alpha |} x {\displaystyle \mathbf {x} } x k {\displaystyle x_{k}}
α = − e i arg x k ‖ x ‖ {\displaystyle \alpha =-e^{i\arg x_{k}}\|\mathbf {x} \|} そして、以下のQ の構築では、転置を共役転置に置き換えます 。
そして、 ベクトル [1 0 ⋯ 0] T 、 || · || は ユークリッドノルム 、 m × m の単位 行列 であり、 e 1 {\displaystyle \mathbf {e} _{1}} I {\displaystyle I}
u = x − α e 1 , v = u ‖ u ‖ , Q = I − 2 v v T . {\displaystyle {\begin{aligned}\mathbf {u} &=\mathbf {x} -\alpha \mathbf {e} _{1},\\\mathbf {v} &={\frac {\mathbf {u} }{\|\mathbf {u} \|}},\\Q&=I-2\mathbf {v} \mathbf {v} ^{\textsf {T}}.\end{aligned}}} または、 複雑な
場合 A {\displaystyle A}
Q = I − 2 v v † . {\displaystyle Q=I-2\mathbf {v} \mathbf {v} ^{\dagger }.} Q {\displaystyle Q} はm 行 m 列のハウスホルダー行列であり 、対称かつ直交行列(複素数の場合はエルミートかつユニタリ行列)である。
Q x = [ α 0 ⋮ 0 ] . {\displaystyle Q\mathbf {x} ={\begin{bmatrix}\alpha \\0\\\vdots \\0\end{bmatrix}}.} これは、 m 行 n 列の行列 A を上 三角形 式に段階的に変換するのに使用できます 。まず、行列 A に、行列の最初の列 x を選択した際に得られるハウスホルダー行列 Q 1 を乗じます。これにより、左列(最初の行を除く)がゼロとなる 行列 Q 1 Aが得られます。
Q 1 A = [ α 1 ⋆ ⋯ ⋆ 0 ⋮ A ′ 0 ] {\displaystyle Q_{1}A={\begin{bmatrix}\alpha _{1}&\star &\cdots &\star \\0&&&\\\vdots &&A'&\\0&&&\end{bmatrix}}} これをA ′ ( Q 1 A から最初の行と最初の列を削除したもの) に対して繰り返すと、ハウスホルダー行列 Q ′ 2 が得られます。Q ′ 2 は Q 1 よりも小さいことに注意してください 。 実際 に は A ′ では なく Q 1 A に作用させたいので 、左上に拡張して 1 を埋める必要があります。つまり、一般的には次のように表すことができます。
Q k = [ I k − 1 0 0 Q k ′ ] . {\displaystyle Q_{k}={\begin{bmatrix}I_{k-1}&0\\0&Q_{k}'\end{bmatrix}}.} このプロセスを繰り返す と 、 t {\displaystyle t} t = min ( m − 1 , n ) {\displaystyle t=\min(m-1,n)}
R = Q t ⋯ Q 2 Q 1 A {\displaystyle R=Q_{t}\cdots Q_{2}Q_{1}A} は上三角行列である。したがって、
Q T = Q t ⋯ Q 2 Q 1 , Q = Q 1 T Q 2 T ⋯ Q t T {\displaystyle {\begin{aligned}Q^{\textsf {T}}&=Q_{t}\cdots Q_{2}Q_{1},\\Q&=Q_{1}^{\textsf {T}}Q_{2}^{\textsf {T}}\cdots Q_{t}^{\textsf {T}}\end{aligned}}} A = Q R {\displaystyle A=QR} は の QR 分解です 。 A {\displaystyle A}
この方法は、 上記のグラム・シュミット法よりも 数値的に安定しています。
数値テストでは、計算された因子 とが 機械精度で を満たす
。また、直交性は維持される: 。しかし、 と の精度は 条件 数とともに低下する: Q c {\displaystyle Q_{c}} R c {\displaystyle R_{c}} ‖ Q R − Q c R c ‖ ∞ ‖ A ‖ ∞ = O ( ε ) {\displaystyle {\frac {\|QR-Q_{c}R_{c}\|_{\infty }}{\|A\|_{\infty }}}=O(\varepsilon )} ‖ Q c T Q c − I ‖ ∞ = O ( ε ) {\displaystyle \|Q_{c}^{\mathsf {T}}Q_{c}-I\|_{\infty }=O(\varepsilon )} Q c {\displaystyle Q_{c}} R c {\displaystyle R_{c}} ‖ Q − Q c ‖ ∞ = O ( ε κ ∞ ( A ) ) , ‖ R − R c ‖ ∞ ‖ R ‖ ∞ = O ( ε κ ∞ ( A ) ) . {\displaystyle \|Q-Q_{c}\|_{\infty }=O(\varepsilon \,\kappa _{\infty }(A)),\quad {\frac {\|R-R_{c}\|_{\infty }}{\|R\|_{\infty }}}=O(\varepsilon \,\kappa _{\infty }(A)).}
条件付きの例( 、 )の場合: n = 4000 {\displaystyle n=4000} κ ∞ ( A ) ≈ 3 × 10 3 {\displaystyle \kappa _{\infty }(A)\approx 3\times 10^{3}} ‖ Q R − Q c R c ‖ ∞ ‖ A ‖ ∞ ≈ 1.6 × 10 − 15 , {\displaystyle {\frac {\|QR-Q_{c}R_{c}\|_{\infty }}{\|A\|_{\infty }}}\approx 1.6\times 10^{-15},} ‖ Q − Q c ‖ ∞ ≈ 1.6 × 10 − 15 , {\displaystyle \|Q-Q_{c}\|_{\infty }\approx 1.6\times 10^{-15},} ‖ R − R c ‖ ∞ ‖ R ‖ ∞ ≈ 4.3 × 10 − 14 , {\displaystyle {\frac {\|R-R_{c}\|_{\infty }}{\|R\|_{\infty }}}\approx 4.3\times 10^{-14},} ‖ Q c T Q c − I ‖ ∞ ≈ 1.1 × 10 − 13 . {\displaystyle \|Q_{c}^{\mathsf {T}}Q_{c}-I\|_{\infty }\approx 1.1\times 10^{-13}.}
悪条件テスト( 、 )では: [3] n = 4000 {\displaystyle n=4000} κ ∞ ( A ) ≈ 4 × 10 18 {\displaystyle \kappa _{\infty }(A)\approx 4\times 10^{18}} ‖ Q R − Q c R c ‖ ∞ ‖ A ‖ ∞ ≈ 1.3 × 10 − 15 , {\displaystyle {\frac {\|QR-Q_{c}R_{c}\|_{\infty }}{\|A\|_{\infty }}}\approx 1.3\times 10^{-15},} ‖ Q − Q c ‖ ∞ ≈ 5.2 × 10 − 4 , {\displaystyle \|Q-Q_{c}\|_{\infty }\approx 5.2\times 10^{-4},} ‖ R − R c ‖ ∞ ‖ R ‖ ∞ ≈ 1.2 × 10 − 4 , {\displaystyle {\frac {\|R-R_{c}\|_{\infty }}{\|R\|_{\infty }}}\approx 1.2\times 10^{-4},} ‖ Q c T Q c − I ‖ ∞ ≈ 1.1 × 10 − 13 . {\displaystyle \|Q_{c}^{\mathsf {T}}Q_{c}-I\|_{\infty }\approx 1.1\times 10^{-13}.}
次の表は、サイズがn の正方行列であると仮定して、ハウスホルダー変換による QR 分解の k 番目のステップでの演算数を示しています 。
手術 k 番目のステップ における操作の数 掛け算 2 ( n − k + 1 ) 2 {\displaystyle 2(n-k+1)^{2}} 追加事項 ( n − k + 1 ) 2 + ( n − k + 1 ) ( n − k ) + 2 {\displaystyle (n-k+1)^{2}+(n-k+1)(n-k)+2} 分割 1 {\displaystyle 1} 平方根 1 {\displaystyle 1}
これらの数値を n − 1ステップ(サイズ n の正方行列の場合 )にわたって合計すると、アルゴリズムの複雑さ(浮動小数点乗算の観点から)は次のように表される。
2 3 n 3 + n 2 + 1 3 n − 2 = O ( n 3 ) . {\displaystyle {\frac {2}{3}}n^{3}+n^{2}+{\frac {1}{3}}n-2=O\left(n^{3}\right).}
例 分解を計算してみましょう
A = [ 12 − 51 4 6 167 − 68 − 4 24 − 41 ] . {\displaystyle A={\begin{bmatrix}12&-51&4\\6&167&-68\\-4&24&-41\end{bmatrix}}.} まず、行列A の最初の列であるベクトル を に 変換する反射を見つける必要があります 。 a 1 = [ 12 6 − 4 ] T {\displaystyle \mathbf {a} _{1}={\begin{bmatrix}12&6&-4\end{bmatrix}}^{\textsf {T}}} ‖ a 1 ‖ e 1 = [ α 0 0 ] T {\displaystyle \left\|\mathbf {a} _{1}\right\|\mathbf {e} _{1}={\begin{bmatrix}\alpha &0&0\end{bmatrix}}^{\textsf {T}}}
今、
u = x − α e 1 , {\displaystyle \mathbf {u} =\mathbf {x} -\alpha \mathbf {e} _{1},} そして
v = u ‖ u ‖ . {\displaystyle \mathbf {v} ={\frac {\mathbf {u} }{\|\mathbf {u} \|}}.} ここ、
α = 14 {\displaystyle \alpha =14} そして x = a 1 = [ 12 6 − 4 ] T {\displaystyle \mathbf {x} =\mathbf {a} _{1}={\begin{bmatrix}12&6&-4\end{bmatrix}}^{\textsf {T}}} したがって
u = [ − 2 6 − 4 ] T = 2 [ − 1 3 − 2 ] T {\displaystyle \mathbf {u} ={\begin{bmatrix}-2&6&-4\end{bmatrix}}^{\textsf {T}}=2{\begin{bmatrix}-1&3&-2\end{bmatrix}}^{\textsf {T}}} そして 、 そして v = 1 14 [ − 1 3 − 2 ] T {\displaystyle \mathbf {v} ={\frac {1}{\sqrt {14}}}{\begin{bmatrix}-1&3&-2\end{bmatrix}}^{\textsf {T}}} Q 1 = I − 2 14 14 [ − 1 3 − 2 ] [ − 1 3 − 2 ] = I − 1 7 [ 1 − 3 2 − 3 9 − 6 2 − 6 4 ] = [ 6 / 7 3 / 7 − 2 / 7 3 / 7 − 2 / 7 6 / 7 − 2 / 7 6 / 7 3 / 7 ] . {\displaystyle {\begin{aligned}Q_{1}={}&I-{\frac {2}{{\sqrt {14}}{\sqrt {14}}}}{\begin{bmatrix}-1\\3\\-2\end{bmatrix}}{\begin{bmatrix}-1&3&-2\end{bmatrix}}\\={}&I-{\frac {1}{7}}{\begin{bmatrix}1&-3&2\\-3&9&-6\\2&-6&4\end{bmatrix}}\\={}&{\begin{bmatrix}6/7&3/7&-2/7\\3/7&-2/7&6/7\\-2/7&6/7&3/7\\\end{bmatrix}}.\end{aligned}}} 次に観察します:
Q 1 A = [ 14 21 − 14 0 − 49 − 14 0 168 − 77 ] , {\displaystyle Q_{1}A={\begin{bmatrix}14&21&-14\\0&-49&-14\\0&168&-77\end{bmatrix}},} つまり、ほぼ三角行列が出来上がっていることになります。(3, 2)の要素をゼロにするだけで済みます。
(1, 1) マイナー を取り、このプロセスを再度適用して
A ′ = M 11 = [ − 49 − 14 168 − 77 ] . {\displaystyle A'=M_{11}={\begin{bmatrix}-49&-14\\168&-77\end{bmatrix}}.} 上記と同じ方法で、ハウスホルダー変換の行列を得る。
Q 2 = [ 1 0 0 0 − 7 / 25 24 / 25 0 24 / 25 7 / 25 ] {\displaystyle Q_{2}={\begin{bmatrix}1&0&0\\0&-7/25&24/25\\0&24/25&7/25\end{bmatrix}}} 1 との直和を実行して、プロセスの次のステップが適切に機能することを確認します。
さて、私たちは
Q = Q 1 T Q 2 T = [ 6 / 7 − 69 / 175 58 / 175 3 / 7 158 / 175 − 6 / 175 − 2 / 7 6 / 35 33 / 35 ] . {\displaystyle Q=Q_{1}^{\textsf {T}}Q_{2}^{\textsf {T}}={\begin{bmatrix}6/7&-69/175&58/175\\3/7&158/175&-6/175\\-2/7&6/35&33/35\end{bmatrix}}.} あるいは、小数点4桁で、
Q = Q 1 T Q 2 T = [ 0.8571 − 0.3943 0.3314 0.4286 0.9029 − 0.0343 − 0.2857 0.1714 0.9429 ] R = Q 2 Q 1 A = Q T A = [ 14 21 − 14 0 175 − 70 0 0 − 35 ] . {\displaystyle {\begin{aligned}Q&=Q_{1}^{\textsf {T}}Q_{2}^{\textsf {T}}={\begin{bmatrix}0.8571&-0.3943&0.3314\\0.4286&0.9029&-0.0343\\-0.2857&0.1714&0.9429\end{bmatrix}}\\R&=Q_{2}Q_{1}A=Q^{\textsf {T}}A={\begin{bmatrix}14&21&-14\\0&175&-70\\0&0&-35\end{bmatrix}}.\end{aligned}}} 行列 Q は直交行列であり、 R は上三角行列であるため、 必要な QR 分解は A = QRです。
メリットとデメリット ハウスホルダー変換は、 R行列に零点を生成するメカニズムとして反射を利用するため、数値的に安定したQR分解アルゴリズムの中で本質的に最も単純なものです。しかし、ハウスホルダー反射アルゴリズムは帯域幅を大量に消費し、並列化が困難です。これは、新しい零点を生成する反射ごとに、 Q行列 と R 行列の両方の行列全体が変化するためです 。
世帯主QRの並列実装 ハウスホルダーQR法は、TSQRアルゴリズム( Tall Skinny QR の略)などのアルゴリズムと並列に実装できます。このアルゴリズムは、行列 A が m >> n の場合に適用できます 。 [4] このアルゴリズムは、バイナリ縮小木を用いて、フォワードパスの各ノードにおけるローカルハウスホルダーQR分解を計算し、バックワードパスでQ行列を再構成します。 バイナリ木 構造は、プロセッサ間の通信量を削減することで性能を向上させることを目的としています。
ギブンズ回転の使用 QR分解は、一連の ギブンズ回転 によっても計算できます。各回転は行列の下対角成分をゼロにし、 R 行列を形成します。すべてのギブンズ回転を連結すると、直交 Q 行列が形成されます。
実際には、ギブンズ回転は、行列全体を構築して行列乗算を行うことによって実行されるわけではありません。代わりに、スパース要素の処理という余分な作業なしに、スパースギブンズ行列乗算と同等の処理を実行するギブンズ回転手順が使用されます。ギブンズ回転手順は、比較的少数の非対角要素をゼロにする必要がある状況で有用であり、 ハウスホルダー変換 よりも簡単に並列化できます。
例 分解を計算してみましょう
A = [ 12 − 51 4 6 167 − 68 − 4 24 − 41 ] . {\displaystyle A={\begin{bmatrix}12&-51&4\\6&167&-68\\-4&24&-41\end{bmatrix}}.} まず、左下要素 をゼロにする 回転行列 を作成する必要があります 。 この行列はギブンズ回転法を用いて作成し、行列 と呼びます 。まず、ベクトル を回転させて X 軸 に沿うようにします 。このベクトルの角度は です 。 直交ギブンズ回転行列 を作成します 。 a 31 = − 4 {\displaystyle a_{31}=-4} G 1 {\displaystyle G_{1}} [ 12 − 4 ] {\displaystyle {\begin{bmatrix}12&-4\end{bmatrix}}} θ = arctan ( − ( − 4 ) 12 ) {\textstyle \theta =\arctan \left({\frac {-(-4)}{12}}\right)} G 1 {\displaystyle G_{1}}
G 1 = [ cos ( θ ) 0 − sin ( θ ) 0 1 0 sin ( θ ) 0 cos ( θ ) ] ≈ [ 0.94868 0 − 0.31622 0 1 0 0.31622 0 0.94868 ] {\displaystyle {\begin{aligned}G_{1}&={\begin{bmatrix}\cos(\theta )&0&-\sin(\theta )\\0&1&0\\\sin(\theta )&0&\cos(\theta )\end{bmatrix}}\\&\approx {\begin{bmatrix}0.94868&0&-0.31622\\0&1&0\\0.31622&0&0.94868\end{bmatrix}}\end{aligned}}} そして、今の結果では、要素 にゼロが存在します 。 G 1 A {\displaystyle G_{1}A} a 31 {\displaystyle a_{31}}
G 1 A ≈ [ 12.64911 − 55.97231 16.76007 6 167 − 68 0 6.64078 − 37.6311 ] {\displaystyle G_{1}A\approx {\begin{bmatrix}12.64911&-55.97231&16.76007\\6&167&-68\\0&6.64078&-37.6311\end{bmatrix}}} 同様にギブンズ行列と を形成することができ 、これら の 行列は下対角要素 と をゼロにし て 三角行列 を形成します 。 直交行列 は 、すべてのギブンズ行列 の積から形成されます 。 したがって となり 、 QR 分解は となります 。 G 2 {\displaystyle G_{2}} G 3 {\displaystyle G_{3}} a 21 {\displaystyle a_{21}} a 32 {\displaystyle a_{32}} R {\displaystyle R} Q T {\displaystyle Q^{\textsf {T}}} Q T = G 3 G 2 G 1 {\displaystyle Q^{\textsf {T}}=G_{3}G_{2}G_{1}} G 3 G 2 G 1 A = Q T A = R {\displaystyle G_{3}G_{2}G_{1}A=Q^{\textsf {T}}A=R} A = Q R {\displaystyle A=QR}
メリットとデメリット ギブンズ回転によるQR分解は、実装が最も複雑です。アルゴリズムを最大限に活用するために必要な行の順序を決定するのは容易ではないためです。しかし、この方法には大きな利点があります。新しいゼロ要素は、 ゼロにする要素がある行 ( i ) とその上の行 ( j ) にのみ影響します。これにより、ギブンズ回転アルゴリズムは、ハウスホルダー反射法よりも帯域幅効率が高く、並列化が容易です。 a i j {\displaystyle a_{ij}}
行列式または固有値の積との関連 QR分解を用いて正方行列の行列式 を求めることができます 。行列を 次のように分解するとします。 A = Q R {\displaystyle A=QR} det A = det Q det R . {\displaystyle \det A=\det Q\det R.}
Q {\displaystyle Q} となるように選ぶことができる 。したがって、 det Q = 1 {\displaystyle \det Q=1} det A = det R = ∏ i r i i {\displaystyle \det A=\det R=\prod _{i}r_{ii}}
ここで、 は の対角要素で ある。さらに、行列式は固有値の積に等しいので、 r i i {\displaystyle r_{ii}} R {\displaystyle R} ∏ i r i i = ∏ i λ i {\displaystyle \prod _{i}r_{ii}=\prod _{i}\lambda _{i}}
ここで は の固有値です 。 λ i {\displaystyle \lambda _{i}} A {\displaystyle A}
非正方複素行列の QR 分解の定義を導入し、固有値を特異値に置き換えることで、 上記の性質を非正方複素行列に拡張できます。 A {\displaystyle A}
非正方行列 A の QR 分解から始めます。
A = Q [ R 0 ] , Q † Q = I {\displaystyle A=Q{\begin{bmatrix}R\\0\end{bmatrix}},\qquad Q^{\dagger }Q=I} ここで 、 は零行列、 はユニタリ行列です。 0 {\displaystyle 0} Q {\displaystyle Q}
特異値分解 (SVD)と行列の行列式の 性質から、
| ∏ i r i i | = ∏ i σ i , {\displaystyle {\Big |}\prod _{i}r_{ii}{\Big |}=\prod _{i}\sigma _{i},} ここで、 は の特異値です 。 σ i {\displaystyle \sigma _{i}} A {\displaystyle A}
との 特異値は 同じであるが、複素固有値は異なる場合があることに注意する。しかし、 Aが 正方行列の場合、 A {\displaystyle A} R {\displaystyle R}
∏ i σ i = | ∏ i λ i | . {\displaystyle {\prod _{i}\sigma _{i}}={\Big |}\prod _{i}\lambda _{i}{\Big |}.} したがって、QR 分解は、行列の固有値または特異値の積を効率的に計算するために使用できます。
列ピボット ピボットQR法は、通常のグラム・シュミット法とは異なり、各ステップの開始時に残っている最大の列(列ピボット)を取り 、それによって 置換行列 P を導入する。 [5]
A P = Q R ⟺ A = Q R P T {\displaystyle AP=QR\quad \iff \quad A=QRP^{\textsf {T}}} 列ピボットは、 A が(ほぼ) ランク落ちである 、またはランク落ちの疑いがある 場合に有用です。また、数値精度を向上させることもできます。P は通常、 R の対角要素 が非増加となるように選択されます: 。これは、 特異値分解 よりも低い計算コストで A の(数値的)ランクを求めるために使用でき 、いわゆる ランク開示QRアルゴリズム の基礎となります。 | r 11 | ≥ | r 22 | ≥ ⋯ ≥ | r n n | {\displaystyle \left|r_{11}\right|\geq \left|r_{22}\right|\geq \cdots \geq \left|r_{nn}\right|}
線形逆問題の解法に用いる 直接行列逆行列解と比較すると、QR分解を用いた逆行列解は 条件数が 減少することからもわかるように数値的に安定している。 [6]
行列が次元 、階数 である劣決定 ( ) m < n {\displaystyle m<n} 線型問題 を解くには 、 まず の転置行列 の QR 分解を求めます 。 ここ で Q は直交行列 (つまり ) であり、 R は 特殊な形式 です 。ここでは は正方 三角行列で、零行列の次元は です 。代数計算を行うと、 逆問題 の解は次のように表せる ことが示されます。ここで、 は ガウスの消去法 で 求めるか、 前方代入 によって直接 計算することができます 。後者の手法の方が数値精度が高く、計算量が少なくて済みます。 A x = b {\displaystyle A\mathbf {x} =\mathbf {b} } A {\displaystyle A} m × n {\displaystyle m\times n} m {\displaystyle m} A {\displaystyle A} A T = Q R {\displaystyle A^{\textsf {T}}=QR} Q T = Q − 1 {\displaystyle Q^{\textsf {T}}=Q^{-1}} R = [ R 1 0 ] {\displaystyle R=\left[{\begin{smallmatrix}R_{1}\\0\end{smallmatrix}}\right]} R 1 {\displaystyle R_{1}} m × m {\displaystyle m\times m} ( n − m ) × m {\displaystyle (n-m)\times m} x = Q [ ( R 1 T ) − 1 b 0 ] {\displaystyle \mathbf {x} =Q\left[{\begin{smallmatrix}\left(R_{1}^{\textsf {T}}\right)^{-1}\mathbf {b} \\0\end{smallmatrix}}\right]} R 1 − 1 {\displaystyle R_{1}^{-1}} ( R 1 T ) − 1 b {\displaystyle \left(R_{1}^{\textsf {T}}\right)^{-1}\mathbf {b} }
ノルム を最小化する 過剰決定 問題 ( ) の解を求めるには 、 まず のQR分解を求めます 。この解は と 表すことができます 。 ここでは 完全な直交基底の 最初の列を含む行列 であり 、 は前述と同じです。劣決定問題と同様に、 を明示的に逆行列化することなく、 後退代入法を 使用してこれを迅速かつ正確に求めることができます 。 ( は 数値計算ライブラリによって「経済的な」QR分解として提供されることがよくあります。) x ^ {\displaystyle {\hat {\mathbf {x} }}} m ≥ n {\displaystyle m\geq n} A x = b {\displaystyle A\mathbf {x} =\mathbf {b} } ‖ A x ^ − b ‖ {\displaystyle \left\|A{\hat {\mathbf {x} }}-\mathbf {b} \right\|} A {\displaystyle A} A = Q R {\displaystyle A=QR} x ^ = R 1 − 1 ( Q 1 T b ) {\displaystyle {\hat {\mathbf {x} }}=R_{1}^{-1}\left(Q_{1}^{\textsf {T}}\mathbf {b} \right)} Q 1 {\displaystyle Q_{1}} m × n {\displaystyle m\times n} n {\displaystyle n} Q {\displaystyle Q} R 1 {\displaystyle R_{1}} x ^ {\displaystyle {\hat {\mathbf {x} }}} R 1 {\displaystyle R_{1}} Q 1 {\displaystyle Q_{1}} R 1 {\displaystyle R_{1}}
一般化 岩澤分解は、 QR 分解を半単純リー群に一般化します。
参照
参考文献
さらに読む
外部リンク オンライン行列計算機は行列の QR 分解を実行します。 LAPACKユーザーマニュアルには、QR分解を計算するためのサブルーチンの詳細が記載されています。 Mathematicaのユーザーマニュアルには、QR分解を計算するルーチンの詳細と例が記載されています。 ALGLIB には、LAPACK の C++、C#、Delphi などへの部分的な移植が含まれています。 Eigen::QR には、QR 分解の C++ 実装が含まれています。