【Python】NumPyで行列をQR分解する方法(np.linalg.qrの使い方)

行列計算において、ある行列を「直交行列(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を計算します。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次