2次形式と定値性#
2次形式#
変数の2次の項のみからなる式を 2次形式(quadratic form) と呼ぶ。
2次形式の別表記#
これは次のように表すこともできる。
ただし、
2次形式の行列表記#
行列
が
このとき
2次形式の係数は対称行列で表せる#
2次形式の係数行列は対称行列で表すことができる。そのほうがシンプルになるし、対称行列で表せるという定理もある。
定義:反対称行列(交代行列)
例えば
は反対称行列である。
定理:対称部分と反対称行列への分解
任意の
ただし、
である。
ここで
例
とすると、その転置行列は
なので
よって
定理
証明
1.
2.
また非対角要素は
以上から次の定理が導かれる
定理
行列
証明
反対称行列
関連する定理#
転置と内積についての定理
定理
任意の
証明
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次形式
で表すことができる。
1. 固有値がすべて正 ⇒
固有値
2.
逆に任意の
が成り立つなら、任意の
ベクトル
とすると
(「任意の
定理
半正定値行列
証明
1. 固有値がすべて正 ⇒
固有値
となる。 したがって任意の
2.
逆に任意の
とすると
任意の