応用数学 ch5メモ(2次形式、対角化、固有値)#
Key Points
対称行列の固有ベクトルは互いに直交する(→対角化可能)
2次形式
の標準形 は楕円として解釈できる行列の対角化とは、楕円を回転させてその主軸(長軸と短軸)を座標軸に揃えること(主軸変換)に等しい
対称行列の固有値#
対称行列に対しては
固有値も固有ベクトルもすべて実数
固有ベクトルは互いに直交する
という性質を持っている。
現実世界やデータサイエンス領域での応用において固有値を求めるとき、相関行列や分散共分散行列など対称行列の固有値を求めることが多いので対称行列に対する固有値のトピックに触れておくと理解しやすい。
対称行列の固有値と固有ベクトルは実数#
定理
対称行列の固有値はすべて実数であり、対応する固有ベクトルも実数ベクトルである
証明
対称行列
となる。「正方行列
となり、2つの式の左辺は等しいことがわかる。2つの式の辺々を差し引くと
となる。固有ベクトルは
固有ベクトルは連立1次方程式
の解であり、係数がすべて実数であるから解も実数である。
対称行列の固有ベクトルは直交する#
定理
対称行列の異なる固有値に対応する固有ベクトルは互いに直交する
証明
対称行列
第1式を
となる。そのため上の2つの式の辺々を差し引くと
対称行列の対角化#
定理
証明
に左から
対称行列の固有値分解(スペクトル分解)#
定理
証明
の両辺に右から
2次形式の標準形#
固有ベクトルの行列
このとき、2次形式
このような変数の2乗の線形結合を2次形式の 標準形 と呼ぶ
標準形にすると何が嬉しいのか?#
標準形は
例えば
があるとする。これを書き換えると
となる。これは楕円の方程式と同じ形。
は 長軸半径(楕円の長い方の軸の半分) は 短軸半径(楕円の短い方の軸の半分)
Show code cell 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()

標準形にする前の形
も同様に楕円となっている。
Show code cell 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()

合同変換
正方行列
とする変換を 合同変換(congruence transformation) という。
「合同」とは形が変わらないこと、つまり広義回転だけをすること。
Tip
行列の対角化とは、楕円を回転させてその主軸(長軸と短軸)を座標軸に揃えることに等しい
単位ベクトル
Show code cell 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()

まとめ
楕円
このように主軸を座標軸にとった座標系で表すことを 主軸変換 とよび、そのときの固有値を 主値 と呼ぶ。
正値対称行列と正値2次形式#
2次形式と固有ベクトル・固有値#
定理
対称行列
証明
等号は
であるから、
定理
対称行列
証明
等号は
であるから、
正定値と半正定値#
定義
固有値がすべて正の対称行列を 正定値 (または 正値) 対称行列 といい、固有値がすべて0または正の対称行列を 半正定値(半正値)対称行列 という。
定理
対称行列
であること。
証明
2次形式
で表すことができる。
1. 固有値がすべて正 ⇒
固有値
2.
逆に任意の
が成り立つなら、任意の
ベクトル
とすると
(「任意の