【Python】NumPyで行列の固有値・固有ベクトルを求める(np.linalg.eig)

データ分析における主成分分析(PCA)や、振動解析などで重要となる「固有値」と「固有ベクトル」。 NumPyの np.linalg.eig() 関数を使えば、これらの計算を一括で行うことができます。

今回は、2行2列の行列を例に、計算方法と戻り値の扱い方について解説します。

目次

1. 固有値・固有ベクトルの計算

np.linalg.eig() 関数は、引数に渡した行列の固有値と固有ベクトルを計算し、2つの戻り値を返します。

  • 第1戻り値: 固有値のリスト(配列)
  • 第2戻り値: 固有ベクトルの行列

サンプルコード

ここでは、計算結果が確認しやすい以下の2行2列の行列を使って計算します。 [[3, 1], [0, 2]]

import numpy as np

def eigen_calc_demo():
    # 1. 行列の定義(題材変更:上三角行列)
    # 固有値は対角成分の 3 と 2 になるはずです
    matrix_x = np.array([
        [3, 1],
        [0, 2]
    ])

    print("--- 元の行列 X ---")
    print(matrix_x)

    # 2. 固有値と固有ベクトルの計算
    # w: 固有値 (eigenvalues)
    # v: 固有ベクトル (eigenvectors)
    w, v = np.linalg.eig(matrix_x)

    print("\n--- 固有値 (w) ---")
    print(w)

    print("\n--- 固有ベクトル (v) ---")
    print(v)

if __name__ == "__main__":
    eigen_calc_demo()

実行結果

--- 元の行列 X ---
[[3 1]
 [0 2]]

--- 固有値 (w) ---
[3. 2.]

--- 固有ベクトル (v) ---
[[ 1.         -0.70710678]
 [ 0.          0.70710678]]

2. 結果の読み方と注意点

固有値 (w)

出力結果の [3. 2.] が固有値です。 行列の種類によっては複素数が返ることもあります。

固有ベクトル (v)

ここが最も注意すべきポイントです。 戻り値 v は行列になっていますが、固有ベクトルは「行(横)」ではなく**「列(縦)」**の方向に格納されています。

  • 固有値 3. (w[0]) に対応する固有ベクトルは、v0列目(縦の並び [1., 0.])です。
  • 固有値 2. (w[1]) に対応する固有ベクトルは、v1列目(縦の並び [-0.707..., 0.707...])です。

コードで取り出す場合は以下のように書きます。

# 1つ目の固有値に対応する固有ベクトルを取り出す
first_eigen_vector = v[:, 0]

まとめ

  • 関数: np.linalg.eig(行列) を使う。
  • 戻り値: 固有値, 固有ベクトル の順で返ってくる。
  • 注意点: 固有ベクトルは**「縦方向(列)」**にデータが入っている。

機械学習の次元削減などでこの関数を使う際は、「縦と横」の取り違えがバグの原因になりやすいため、列データとして扱うことを意識してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

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

目次