データ分析における主成分分析(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]) に対応する固有ベクトルは、vの 0列目(縦の並び[1., 0.])です。 - 固有値
2.(w[1]) に対応する固有ベクトルは、vの 1列目(縦の並び[-0.707..., 0.707...])です。
コードで取り出す場合は以下のように書きます。
# 1つ目の固有値に対応する固有ベクトルを取り出す
first_eigen_vector = v[:, 0]
まとめ
- 関数:
np.linalg.eig(行列)を使う。 - 戻り値:
固有値, 固有ベクトルの順で返ってくる。 - 注意点: 固有ベクトルは**「縦方向(列)」**にデータが入っている。
機械学習の次元削減などでこの関数を使う際は、「縦と横」の取り違えがバグの原因になりやすいため、列データとして扱うことを意識してください。
