対称行列の固有値¶
対称行列に対しては
固有値も固有ベクトルもすべて実数
固有ベクトルは互いに直交する
という性質を持っている。
現実世界やデータサイエンス領域での応用において固有値を求めるとき、相関行列や分散共分散行列など対称行列の固有値を求めることが多いので対称行列に対する固有値のトピックに触れておくと理解しやすい。
対称行列の固有値と固有ベクトルは実数¶
対称行列の固有ベクトルは直交する¶
2次形式の標準形¶
固有ベクトルの行列 と変数の線形結合を と書く。 これは左からをかけてと書くこともできる。
このとき、2次形式は次のように変形できる
このような変数の2乗の線形結合を2次形式の 標準形 と呼ぶ
Source
import numpy as np
import matplotlib.pyplot as plt
# 楕円のパラメータ
a = 1 / np.sqrt(2) # 長軸半径
b = 1 / np.sqrt(7) # 短軸半径
# 楕円のプロット用データ生成
theta = np.linspace(0, 2 * np.pi, 300)
x = a * np.cos(theta)
y = b * np.sin(theta)
# 図の作成
fig, ax = plt.subplots(figsize=(4, 3))
ax.plot(x, y)
# 軸の設定
ax.axhline(0, color='black', linewidth=0.5)
ax.axvline(0, color='black', linewidth=0.5)
ax.set(
xlabel="$x'$",
ylabel="$y'$",
title=r'Plot of $\frac{x^{\prime 2}}{(1 / \sqrt{2})^2}+\frac{y^{\prime 2}}{(1 / \sqrt{7})^2}=1$',
aspect='equal'
)
ax.grid(True)
# 図を表示
plt.show()

Source
import numpy as np
import matplotlib.pyplot as plt
# グリッド範囲を設定
x_vals = np.linspace(-1, 1, 400)
y_vals = np.linspace(-1, 1, 400)
X, Y = np.meshgrid(x_vals, y_vals)
# 方程式 6x^2 + 4xy + 3y^2 = 1 の左辺
Z = 6 * X**2 + 4 * X * Y + 3 * Y**2 - 1
# 図の作成
fig, ax = plt.subplots(figsize=(3, 3))
ax.contour(X, Y, Z, levels=[0], colors='steelblue') # 楕円を描画(等高線プロット)
ax.axhline(0, color='black', linewidth=0.5)
ax.axvline(0, color='black', linewidth=0.5)
# 軸の設定
ax.set(
xlabel="$x$",
ylabel="$y$",
title=r"Plot of $6x^2 + 4xy + 3y^2 = 1$",
aspect='equal'
)
ax.grid(True)
# 図を表示
plt.show()

は をだけ回転させたもの。あるいはをだけ回転させたものがとなっている。
は直交行列なので、回転と鏡映をあわせた写像 ( 広義回転 )である。
「合同」とは形が変わらないこと、つまり広義回転だけをすること。
座標系をだけ回転すると、長軸と短軸に一致する。
単位ベクトルをで回転させると、なので、固有ベクトルは楕円の長軸と短軸(2つを合わせて 主軸 という)の方向ということ。
の固有ベクトルは、 楕円の主軸方向である ということ。
Source
import matplotlib.pyplot as plt
import numpy as np
# 固有ベクトルの描画 --------------------------------------------
A = np.array([[6, 2],
[2, 3]])
eigenvalues, eigenvectors = np.linalg.eig(A)
origin = np.array([0, 0]) # 原点
eigvec1 = eigenvectors[:, 0] # 固有値 7 に対応する固有ベクトル
eigvec2 = eigenvectors[:, 1] # 固有値 2 に対応する固有ベクトル
# 図の作成
fig, ax = plt.subplots(figsize=(4, 4))
ax.quiver(*origin, *eigvec1, color='r', angles='xy', scale_units='xy', scale=1, label="Eigenvector (λ=7)")
ax.quiver(*origin, *eigvec2, color='b', angles='xy', scale_units='xy', scale=1, label="Eigenvector (λ=2)")
# 楕円の描画 --------------------------------------------
# グリッド範囲を設定
x_vals = np.linspace(-1, 1, 400)
y_vals = np.linspace(-1, 1, 400)
X, Y = np.meshgrid(x_vals, y_vals)
# 方程式 6x^2 + 4xy + 3y^2 = 1 の左辺
Z = 6 * X**2 + 4 * X * Y + 3 * Y**2 - 1
# 図の作成
ax.contour(X, Y, Z, levels=[0], colors='steelblue') # 楕円を描画(等高線プロット)
# plot全体の設定 --------------------------------------------------
ax.axhline(0, color='black', linewidth=0.5)
ax.axvline(0, color='black', linewidth=0.5)
ax.set(
xlabel="$x$",
ylabel="$y$",
title="Eigenvectors of A",
xlim=(-1, 1),
ylim=(-1, 1),
aspect='equal'
)
ax.legend()
ax.grid(True)
# 図を表示
plt.show()
