QR分解 わかりやすく
行列の列は、ふつうゆがんでいます。互いに直角でもなく、長さもまちまちです。QR は、この列を二つの断片に分けます。まず列をグラム・シュミットでまっすぐに伸ばし、互いに垂直な単位ベクトルに変えます。これが Q で、長さも角度も触らない回転または反射です。伸ばしながら削った長さと重なりを集めたのが R で、上だけが埋まった三角形です。A = QR。回転一つと三角形一つ。この一行が、最小二乗を安定に解く道であり、数値線形代数がよく呼ぶ分解です。格子が正方形のままなのが、Q が回転である証拠です。斜めの列が A で、まっすぐに伸ばした列が Q です。二乗誤差の和が最小の直線が、QR の見つける答えです。
ボタンで段階を踏みます。0 段階は A の二列 a1、a2 です。斜めで、長さも違います。1 段階へ行くと、グラム・シュミットがこの二つをまっすぐに伸ばします。a1 の向きを単位長さに縮めたのが q1、a2 から q1 方向の影を引いて残った直交成分を単位化したのが q2 です。いま q1 と q2 はちょうど直角で、どちらも長さ 1 なので内積は 0 と出ます。2 段階で R が出ます。R = Qᵀ A なので自動的に上三角で、左下の枠 r21 は 0 です。A はゆがんだ列、Q はまっすぐに伸ばした直交列、R はそのあいだをつなぐ小さな三角形です。これが A = QR です。
Q の二列は、互いに垂直な単位ベクトルです。だから Q を平面に作用させると、格子はゆがまず、まるごと回るだけです。スライダーで角を回すと、マスは伸びもつぶれもせず、正方形は正方形のままです。長さも角度も保たれるからです。反射ボタンを押すと鏡のように裏返りますが、列は依然として直交単位なので形は変わりません。これが直交行列の定義です。QᵀQ = I。画面の下の QᵀQ は、どの角でも単位行列のままです。Q が回転か反射でしかない証拠です。
R はなぜ上の三角形だけが埋まるのでしょう。各枠は rij = qi · aj、つまり i 番目のまっすぐな方向に j 番目の元の列を映した影の長さです。枠を点けると内積の値が確かめられます。核心は対角の下の枠です。r21 = q2 · a1 で、q2 は a1 を引いて残った直交成分なので a1 とちょうど垂直です。垂直なら内積は 0 なので r21 は 0 です。後で作った方向 qi は、先の列 aj、つまり j が i より小さい列には使われません。その列はすでに前の方向で表されているからです。だから対角の下はまるごと 0 で、R は上三角です。
今度は逆に R を持って A を建て直します。Q は 20 度の回転に固定し、スライダーで R の三つの枠を動かすと A = QR がすぐ描き直されます。r11 は第一列 a1 の長さを決めるので、大きくすると a1 が長くなります。r22 は第二の方向へどれだけ伸びるか、つまり直交成分の長さです。r12 は剪断で、第二列を第一の方向へどれだけ傾けるかを決めます。この三つの数が長さと傾きを担い、Q はその結果をまるごと 20 度回すだけです。R が形を、Q が向きを担う分業が見えます。
QR が実際に働く場所は最小二乗です。データにいちばん合う直線は、縦の点線である残差の二乗和をいちばん小さくする線でした。スライダーで傾きと切片を動かすと、その和を減らせます。ふつうは AᵀA を作って正規方程式を解きますが、AᵀA は誤差に敏感で、数値的に不安定なことがあります。QR はその段階を飛ばします。A = QR を入れると正規方程式は R x = Qᵀ b に縮み、R が三角形なので後ろから代入すれば終わります。ボタンを押すとその QR 解へ跳び、二乗誤差の和が最小になります。AᵀA を作らず、同じ答えをより安定に得るのが QR の使い道です。