2次形式と定値性#

2次形式#

変数の2次の項のみからなる式を 2次形式(quadratic form) と呼ぶ。n変数x1,,xnの2次形式は次のように書ける

f=a11x12+a22x22++annxn2+2a12x1x2+2a13x1x3++2an(n1)xnxn1

2次形式の別表記#

これは次のように表すこともできる。

f=i=1nj=1naijxixj

ただし、aij=ajiとする。

例:n=2の場合
f=a11x12+a22x22+2a12x1x2=a11x12+a12x1x2+a21x1x2+a22x22=i=12j=12aijxixj

2次形式の行列表記#

行列

A=(a11a1nan1ann),x=(x1xn)

aij=ajiのとき、すなわちAが対称行列のとき、2次形式は次のようなベクトルの内積として表せる

f=(x,Ax)

このときAを2次形式f係数行列 と呼ぶ。

f=((xy),(abbc)(xy))=((xy),(ax+bybx+cy))=x(ax+by)+y(bx+cy)=ax2+2bxy+cy2

2次形式の係数は対称行列で表せる#

2次形式の係数行列は対称行列で表すことができる。そのほうがシンプルになるし、対称行列で表せるという定理もある。

定義:反対称行列(交代行列)

(i,j)要素が(j,i)要素の符号を反転させた値になっていて対角要素が0の正方行列、すなわち A=A となる行列を 反対称行列 (antisymmetric matrix) あるいは 交代行列 (alternating matrix) という。

例えば

A=(0aa0),B=(021204140)

は反対称行列である。

定理:対称部分と反対称行列への分解

任意のn次正方行列Aは次のように書くことができる

A=12(A+A)+12(AA)=As+Aa

ただし、

As=12(A+A),Aa=12(AA)

である。AsAの対称部分AaAの反対称部分 と呼ぶ。

ここで As=12(A+A) は対称行列、Aa=12(AA) は反対称行列となっている。

A=(a11a12a21a22)

とすると、その転置行列は

A=(a11a21a12a22)

なので

A+A=(2a11a12+a21a21+a122a22)AA=(0a12a21a21a120)=(0a12a21(a12a21)0)

よって

(A+A)+(AA)=(2a11a12+a21a21+a122a22)+(0a12a21a21a120)=(2a112a122a212a22)

定理

(x,Ax)=0となるOでない行列Aは反対称行列である

証明

1. (x,Ax)=0ならばAは反対称行列

xを第i要素が1で残りが0のベクトルとし、(x,Ax)=0に代入すると、aii=0となる。そのためAの対角要素は0となることがわかる。

xを第i要素と第j (ji)要素が1で残りが0のベクトルを代入すると、aii+aij+aji+ajj=0となるが、対角要素は0なのでaij+aji=0すなわちaij=ajiとなり、Aは反対称行列となる。

2. Aが反対称行列なら(x,Ax)=0

Aが反対称行列なら対角要素はゼロ(aii=0)であるため、2次形式(x,Ax)のうちxi2の項はaiixi2=0となる。

また非対角要素はaij=ajiより、2次形式のうちxixjの項はaijxixj+ajixjxi=0 と打ち消し合って0になる。

以上から次の定理が導かれる

定理

行列Aを係数とする2次形式は、その対称部分Asのみで表すことができる

証明

反対称行列Aaを係数とする2次形式は0なので、

(x,Ax)=(x,(As+Aa)x)=(x,Asx)+(x,Aax)=(x,Asx)

関連する定理#

転置と内積についての定理

定理

任意の n×n 行列 A と任意の n 次元ベクトル x,y に対して、次の関係が成り立つ

(Ax,y)=(x,Ay)
証明
(x,Ay)=i,j=1najixiyj=j=1n(i=1najixi)yj=(Ax,y)

2次形式の標準形#

対称行列の対角化#

定理

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をかけると得られる。

対称行列の分解の応用例:リッジ推定量が正則となる証明

Xn次の実行列とする。実対称行列XXは非負値定符号行列であるため、

XX=PΓP

と分解可能。ここでPは直交行列であり、Γ=diag(γ1,,γn)XXの固有値(γ1γn0)を対角成分にもつ対角行列。

もしγn=0ならXXの逆行列は存在せず、γn>0なら逆行列は存在し、

(XX)1=(PΓP)1=PΓ1P((ABC)1=(C1B1A1)PP=P1)=Pdiag(1/γ1,,1/γn)P

となる。XXの最小固有値がγn0の場合、1/γnになり逆行列が計算できない。

一方、リッジ推定量のようにXX+λIとする(λR)と、その逆行列は

(XX+λI)1=(PΓP+λI)1={P(Γ+λI)P}1=P(Γ+λI)1P=Pdiag[1/(γ1+λI),,1/(γn+λI)]P

となる。こちらはγn0の場合であっても1/(γp+λI)は無限大に発散することがないため、XX+λIは正則となる。

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次形式の 標準形 と呼ぶ

f=6x2+4xy+3y2

を標準形にしたいとする。fはベクトルと行列を用いると次のように書き直すことができる。

f=((xy),(6223)(xy))

係数行列

A=(6223)

の固有値は

|λIA|=0|λ622λ3|=0(λ6)(λ3)4=0λ29λ+184=0λ29λ+14=0(λ2)(λ7)=0

より、λ=2,7となる。

f=(x,Ax)=λ1x2+λ2y2

より、fの標準形は

f=2x2+7y2

標準形にすると何が嬉しいのか? - 標準形による主軸変換の導出#

標準形は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と書ける。

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

正定値と半正定値#

定義

n×n実対称行列Aが、n次の零でない任意のベクトルxに対して、2次形式(x,Ax)が必ず正になるとき、すなわち

(x,Ax)>0

となるとき、A正定値 (または 正値 positive definite) であるという。

また、

(x,Ax)0

となるとき、A半正定値 (または 半正値 positive-semidefinite) であるという。

固有値との関係#

定理

正定値行列ARn×nの固有値λi(i=1,,n)はすべて正である(λi>0i

証明

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 より λi>0である。

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

定理

半正定値行列ARn×nの固有値λi(i=1,,n)はすべて零以上である(λi0i

証明

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

固有値 λ1,λ2,,λn が正または0なら、任意のx0に対して

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

となる。 したがって任意のx=Ux0に対して(x,Ax)0となる。

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

逆に任意のx0に対して(x,Ax)0が成り立つ場合、

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

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

任意のiに対してこれが成り立つため、 λ1,λ2,,λn はすべて正である。