行列計算において、ある行列を「直交行列(Q)」と「上三角行列(R)」の積に分解することをQR分解と呼びます。 これは最小二乗法を解く際や、固有値計算の前処理などで広く利用される重要な手法です。
NumPyでは np.linalg.qr() 関数を使うだけで簡単に計算できます。
目次
実行可能なサンプルコード
ここでは、3行2列の行列を定義し、それをQとRに分解します。 また、分解した結果を掛け合わせることで、元の行列に戻る(復元できる)ことも確認します。
import numpy as np
def qr_decomposition_demo():
# 1. 分解したい行列の定義
# ここでは 3行2列 の行列を用意します
matrix_a = np.array([
[12, -51],
[6, 167],
[-4, 24]
])
print("--- Original Matrix A ---")
print(matrix_a)
# 2. QR分解の実行
# q: 直交行列 (Orthonormal matrix)
# r: 上三角行列 (Upper triangular matrix)
q, r = np.linalg.qr(matrix_a)
print("\n--- Matrix Q (直交行列) ---")
print(q)
print("\n--- Matrix R (上三角行列) ---")
print(r)
# 3. 検算 (Verification)
# Q と R を行列積 (dot) で掛け合わせると、元の A に戻るはずです
reconstructed_a = np.dot(q, r)
print("\n--- Reconstructed A (Q @ R) ---")
# 浮動小数点の誤差が出る場合があるため、見やすく丸めて表示する場合もあります
print(reconstructed_a)
# おまけ: Qの直交性の確認
# 直交行列Qは、転置との積が単位行列になります (Q.T @ Q = I)
print("\n--- Orthogonality Check (Q.T @ Q) ---")
print(np.dot(q.T, q))
if __name__ == "__main__":
qr_decomposition_demo()
解説:戻り値の意味
q (直交行列)
列ベクトル同士が互いに直交しており、かつそれぞれの大きさ(ノルム)が1である行列です。 サンプルコードの確認部分にある通り、自分自身の転置行列と掛け合わせると単位行列になります。
r (上三角行列)
対角線より下の成分がすべて0である行列です。 連立方程式を解く際、この形になっていると「後退代入」という手法を使って簡単に解を求めることができるため、計算の効率化に役立ちます。
mode 引数について
np.linalg.qr(a, mode='reduced') のようにモードを指定できます。
'reduced'(デフォルト): 入力行列の形状に合わせたコンパクトなサイズのQとRを返します。通常はこちらを使用します。'complete': 完全なサイズの正方行列としてのQと、それに対応するRを計算します。
