応用数学 ch5メモ(2次形式、対角化、固有値)#

Key Points

  • 対称行列の固有ベクトルは互いに直交する(→対角化可能)

  • 2次形式(x,Ax)の標準形iλixi2は楕円として解釈できる

  • 行列の対角化とは、楕円を回転させてその主軸(長軸と短軸)を座標軸に揃えること(主軸変換)に等しい

対称行列の固有値#

対称行列に対しては

  • 固有値も固有ベクトルもすべて実数

  • 固有ベクトルは互いに直交する

という性質を持っている。

現実世界やデータサイエンス領域での応用において固有値を求めるとき、相関行列や分散共分散行列など対称行列の固有値を求めることが多いので対称行列に対する固有値のトピックに触れておくと理解しやすい。

対称行列の固有値と固有ベクトルは実数#

定理

対称行列の固有値はすべて実数であり、対応する固有ベクトルも実数ベクトルである

証明

対称行列Aの一つの固有値をλ、対応する固有ベクトルをu=(u1un) とすると、定義よりAu=λuである。両辺の複素共役をとったものと合わせると次のように書くことができる。

Au=λu,Au¯=λ¯u¯

u¯と第1式の両辺を、uと第2式の両辺をそれぞれ内積をとると

u¯,Au=λu¯,u,u,Au¯=λ¯u,u¯

となる。「正方行列Aに対して Au,y=u,Ay が成り立つ」という定理と、またAは対称行列のためA=Aであることから、

u¯,Au=Au,u¯=u,Au¯=u,Au¯

となり、2つの式の左辺は等しいことがわかる。2つの式の辺々を差し引くと

0=λu¯,uλ¯u,u¯(λλ¯)u,u¯=0

となる。固有ベクトルは0ではないからu,u¯=|u1|2++|un|2>0であり、したがってλ=λ¯であり、ゆえにλは実数である。

固有ベクトルは連立1次方程式

(λIA)u=0

の解であり、係数がすべて実数であるから解も実数である。

対称行列の固有ベクトルは直交する#

定理

対称行列の異なる固有値に対応する固有ベクトルは互いに直交する

証明

対称行列Aの2つの異なる固有値をλ1,λ2、対応する固有ベクトルをu1,u2とする。

Au1=λ1u1,Au2=λ2u2

第1式をu2と内積をとり、第2式をu1と内積をとると

u2,Au1=u2,λ1u1,u1,Au2=u1,λ2u2

Aは対称行列なので

u2,Au1=Au1,u2()=u1,Au2()=u1,Au2(AA=A)

となる。そのため上の2つの式の辺々を差し引くと

u2,λ1u1u1,λ2u2=0λ1u2,u1λ2u1,u2=0(λ1λ2)u1,u2=0

λ1λ20であるから、u1,u2=0であり、u1,u2は互いに直交している

対称行列の対角化#

定理

n×n 対称行列 A の固有値を λ1,,λn とおき、対応する固有ベクトルの正規直交系を u1,,un とし、 u1,,un を列とする行列を U=(u1un) とすると、次式が成り立つ。

UAU=(λ1λ2λn)
証明
AU=A(u1u2un)=(Au1Au2Aun)=(λ1u1λ2u2λnun)=(u1u2un)(λ1λ2λn)=U(λ1λ2λn)

に左からUをかけると得られる

対称行列の固有値分解(スペクトル分解)#

定理

n×n 対称行列 A の固有値を λ1,,λn 、対応する固有ベクトルの正規直交系を u1,,un とし、 u1,,un を列とする行列を U=(u1un) とすると、次式が成り立つ。

A=U(λ1λ2λn)U
証明
AU=A(u1u2un)=(Au1Au2Aun)=(λ1u1λ2u2λnun)=(u1u2un)(λ1λ2λn)=U(λ1λ2λn)

の両辺に右からUをかけると得られる。

2次形式の標準形#

固有ベクトルの行列U と変数xの線形結合を x=Ux と書く。 これは左からUをかけてx=Uxと書くこともできる。

このとき、2次形式(x,Ax)は次のように変形できる

(x,Ax)=(Ux,AUx)=(x,UAUx)=(x,(λ1λn)x)=λ1x12+λ2x22++λnxn2

このような変数の2乗の線形結合を2次形式の 標準形 と呼ぶ

標準形にすると何が嬉しいのか?#

標準形はxyの項がなく2乗の項だけになっている。

例えば

2x2+7y2=1

があるとする。これを書き換えると

x2(1/2)2+y2(1/7)2=1

となる。これは楕円の方程式と同じ形。

楕円の標準形方程式
x2a2+y2b2=1
  • a は 長軸半径(楕円の長い方の軸の半分)

  • b は 短軸半径(楕円の短い方の軸の半分)

Hide 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()
../../../_images/4570dae232f3503fbe3c8be2c3f98f12f23a79d75f95c1009d377c790fa08f75.png

標準形にする前の形

6x2+4xy+3y2=1

も同様に楕円となっている。

Hide 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()
../../../_images/0ab97b2a98ec1af6df3ff4c6a5eb1d80b8e55c85e714ea996b63854f7aa24be3.png

x=UxxUだけ回転させたもの。あるいはxU1だけ回転させたものがxとなっている。

Uは直交行列なので、回転と鏡映をあわせた写像広義回転 )である。

合同変換

正方行列Aを正則行列Uによって

A=UAU

とする変換を 合同変換(congruence transformation) という。

「合同」とは形が変わらないこと、つまり広義回転だけをすること。

Tip

行列の対角化とは、楕円を回転させてその主軸(長軸と短軸)を座標軸に揃えることに等しい

xy座標系をUだけ回転すると、長軸と短軸に一致する。

単位ベクトルe1,e2U=(u1,u2)で回転させると、Ue1=u1,Ue2=u2なので、固有ベクトルu1,u2は楕円の長軸と短軸(2つを合わせて 主軸 という)の方向ということ。

Aの固有ベクトルは、 楕円(x,Ax)=1の主軸方向である ということ。

Hide 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()
../../../_images/4b292d19e551079d77b6f33009abfde9a553ade227eacb703c5aacb368c22a8f.png

まとめ

楕円(x,Ax)=1は、Aの固有ベクトルu1,u2がその主軸方向であり、u1,u2の方向をそれぞれx,y軸にとると、その楕円がλ1x2+λ2y2=1と書ける。

このように主軸を座標軸にとった座標系で表すことを 主軸変換 とよび、そのときの固有値を 主値 と呼ぶ。

正値対称行列と正値2次形式#

2次形式と固有ベクトル・固有値#

定理

対称行列Aに対して、2次形式(x,Ax)を最大化する単位ベクトルxAの最大固有値に対する単位固有ベクトルであり、その最大値は行列Aの最大固有値に等しい。

証明

xが単位ベクトルならxも単位ベクトルであり、i=1nxi2=1である。また固有値を大きい順にλ1λ2λnとおくと、次の関係が成り立つ。

(x,Ax)=i=1nλixi2i=1nλ1xi2=λ1i=1nxi2=λ1

等号はx1=1,x2==xn=0の場合に成立する。

x=Ux=x1u1+x2u2++xnun

であるから、x1=1,x2==xn=0に対してはx=u1 すなわち最大固有値λ1に対する単位固有ベクトルに等しい。

定理

対称行列Aに対して、2次形式(x,Ax)を最小化する単位ベクトルxAの最小固有値に対する単位固有ベクトルであり、その最小値は行列Aの最小固有値に等しい。

証明

xが単位ベクトルならxも単位ベクトルであり、i=1nxi2=1である。また固有値を大きい順にλ1λ2λnとおくと、次の関係が成り立つ。

(x,Ax)=i=1nλixi2i=1nλnxi2=λni=1nxi2=λn

等号はx1=x2==xn1=0,xn=1の場合に成立する。

x=Ux=x1u1+x2u2++xnun

であるから、x1==xn1=0,xn=1に対してはx=un すなわち最小固有値λnに対する単位固有ベクトルに等しい。

正定値と半正定値#

定義

固有値がすべて正の対称行列を 正定値 (または 正値対称行列 といい、固有値がすべて0または正の対称行列を 半正定値(半正値)対称行列 という。

定理

対称行列Aが正定値である必要十分条件は、任意の0でないベクトルxに対して

(x,Ax)>0

であること。

証明

2次形式(x,Ax)は標準形

(x,Ax)=λ1x12++λnxn2

で表すことができる。

1. 固有値がすべて正 ⇒ (x,Ax)>0

固有値λ1,,λnがすべて正なら、任意のx0に対しては(x,Ax)=λ1x12++λnxn2>0となる。 したがって任意のx=Ux0に対して(x,Ax)>0となる。

2. (x,Ax)>0 ⇒ 固有値がすべて正

逆に任意のx0に対して2次形式の標準形

(x,Ax)=λ1x12++λnxn2

が成り立つなら、任意のx=Ux0に対して(x,Ax)>0となる。

ベクトルxのうち任意のi番目の要素が1なら、つまり

x1=x2==xi1=0,xi=1,xi+1=xi+2==xn=0

とすると (x,Ax)=λi>0 より λi>0である。

(「任意のx0に対して(x,Ax)>0」という仮定により)任意のiに対してこれが成り立つため、 λ1,λ2,,λn はすべて正である