正定値行列の理論と応用 — 判定法から最適化・統計への接続

2変数関数 $f(x, y) = 3x^2 + 2xy + 2y^2$ は最小値を持つでしょうか。この関数をベクトルと行列で書き直すと

$$ f(\bm{x}) = \bm{x}^T \begin{pmatrix} 3 & 1 \\ 1 & 2 \end{pmatrix} \bm{x} $$

この二次形式が常に正($\bm{x} \neq \bm{0}$ のとき $f(\bm{x}) > 0$)であるかどうかは、中央の行列が正定値(positive definite)かどうかで判定できます。正定値なら関数は「お椀型」であり、唯一の最小値を持ちます。

正定値行列は線形代数で最も「都合のよい」行列のクラスです。正定値であれば、連立方程式は安定に解け(コレスキー分解)、最適化問題は凸で極値が一意に存在し、統計量(共分散行列)として意味を持ちます。

正定値行列を理解すると、以下のような場面で活用できます。

  • 最適化: 二次計画問題の凸性判定、ニュートン法のヘッセ行列
  • 統計学: 共分散行列の正定値性、マハラノビス距離
  • 機械学習: カーネル関数の正定値性(マーサーの定理)
  • 数値計算: コレスキー分解による効率的な求解

本記事の内容

  • 正定値行列の定義と直感的理解
  • 正定値性の判定法(固有値、首座小行列式、コレスキー分解)
  • 正定値行列の性質
  • 半正定値行列との違い
  • 共分散行列・カーネル行列との関係
  • Pythonでの実装と可視化

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

正定値行列とは

直感的な理解

正定値行列は、二次形式 $\bm{x}^T\bm{A}\bm{x}$ が常に正になる行列です。幾何学的には、正定値行列による変換は「引き伸ばし」のみを行い、方向を反転させません。

2次元で考えましょう。二次形式 $f(x, y) = \bm{x}^T\bm{A}\bm{x}$ のグラフは

  • 正定値: 上向きのお椀型(最小値を持つ)
  • 負定値: 下向きのお椀型(最大値を持つ)
  • 不定: 鞍点型(馬の鞍の形)
  • 半正定値: お椀型だが底が平ら(最小値は一意でない)

最適化では、ヘッセ行列(二次微分の行列)が正定値なら、その点が極小値であることが保証されます。

数学的定義

$n \times n$ 実対称行列 $\bm{A}$($\bm{A} = \bm{A}^T$)が正定値(positive definite)であるとは、全ての $\bm{x} \neq \bm{0}$ に対して

$$ \begin{equation} \bm{x}^T\bm{A}\bm{x} > 0 \end{equation} $$

が成り立つことをいいます。記号で $\bm{A} \succ 0$ と書きます。

同様に、以下の概念も定義されます。

名称 条件 記号
正定値 $\bm{x}^T\bm{A}\bm{x} > 0$ ($\forall \bm{x} \neq \bm{0}$) $\bm{A} \succ 0$
半正定値(正半定値) $\bm{x}^T\bm{A}\bm{x} \geq 0$ ($\forall \bm{x}$) $\bm{A} \succeq 0$
負定値 $\bm{x}^T\bm{A}\bm{x} < 0$ ($\forall \bm{x} \neq \bm{0}$) $\bm{A} \prec 0$
不定 正の値も負の値も取る

注意: 正定値行列は対称行列に限定します。非対称行列に対しても正定値性を定義する流儀がありますが、本記事では対称行列のみを扱います。

正定値行列の定義を押さえたところで、「この行列は正定値か?」をどう判定するかを見ていきましょう。

正定値性の判定法

判定法1: 固有値による判定

$\bm{A}$ が正定値である $\iff$ $\bm{A}$ の全ての固有値が正

$$ \lambda_1, \lambda_2, \ldots, \lambda_n > 0 $$

証明: スペクトル分解 $\bm{A} = \bm{Q}\bm{D}\bm{Q}^T$ を使うと $\bm{x}^T\bm{A}\bm{x} = \bm{y}^T\bm{D}\bm{y} = \sum_i \lambda_i y_i^2$($\bm{y} = \bm{Q}^T\bm{x}$)。全ての $\lambda_i > 0$ なら $\sum \lambda_i y_i^2 > 0$($\bm{y} \neq \bm{0}$ つまり $\bm{x} \neq \bm{0}$ のとき)。

逆に、$\lambda_k \leq 0$ なら $\bm{x} = \bm{q}_k$(対応する固有ベクトル)で $\bm{x}^T\bm{A}\bm{x} = \lambda_k \leq 0$。

この判定は直感的ですが、全固有値を計算する必要があり $O(n^3)$ のコストがかかります。

判定法2: 首座小行列式(シルベスターの判定法)

$\bm{A}$ が正定値である $\iff$ 全ての首座小行列式(leading principal minor)が正

$$ a_{11} > 0, \quad \det\begin{pmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{pmatrix} > 0, \quad \det\begin{pmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{pmatrix} > 0, \quad \ldots, \quad \det(\bm{A}) > 0 $$

具体例: $\bm{A} = \begin{pmatrix} 3 & 1 \\ 1 & 2 \end{pmatrix}$ の場合

  • $a_{11} = 3 > 0$
  • $\det(\bm{A}) = 3 \cdot 2 – 1 \cdot 1 = 5 > 0$

全て正なので正定値です。

判定法3: コレスキー分解

$\bm{A}$ が正定値である $\iff$ コレスキー分解 $\bm{A} = \bm{LL}^T$ が存在する

$\bm{L}$ は正の対角成分を持つ下三角行列です。コレスキー分解のアルゴリズムは $O(n^3/3)$ の計算量で、LU分解の約半分です。分解の過程で対角成分の平方根が負になった場合、$\bm{A}$ は正定値でないと判定できます。

実用的にはコレスキー分解を試みるのが最も効率的な判定法です。成功すれば正定値であり、かつ分解結果を連立方程式の求解に使えます。

判定法4: 定義に基づく直接判定

他の判定法が使えない場合、ランダムなベクトルで $\bm{x}^T\bm{A}\bm{x}$ を計算して負になるかチェックする方法があります。ただし、これは必要条件のみを確認する方法であり、十分条件の証明にはなりません。

複数の判定法を学んだところで、正定値行列の豊かな性質を見ていきましょう。

正定値行列の性質

基本性質

$\bm{A} \succ 0$ のとき、以下が成り立ちます。

正則性: $\bm{A}$ は正則($\det(\bm{A}) > 0$)。全固有値が正なので積も正です。

対角成分: $a_{ii} > 0$(全対角成分が正)。$\bm{e}_i^T\bm{A}\bm{e}_i = a_{ii} > 0$ より明らかです。

逆行列も正定値: $\bm{A}^{-1} \succ 0$。固有値が $1/\lambda_i > 0$ なので正定値です。

正のべき乗根: $\bm{A}^{1/2}$ が存在します。$\bm{A} = \bm{Q}\bm{D}\bm{Q}^T$ に対して $\bm{A}^{1/2} = \bm{Q}\bm{D}^{1/2}\bm{Q}^T$($D^{1/2}_{ii} = \sqrt{\lambda_i}$)。

演算の保存

: $\bm{A} \succ 0$ かつ $\bm{B} \succ 0$ ならば $\bm{A} + \bm{B} \succ 0$。

$$ \bm{x}^T(\bm{A} + \bm{B})\bm{x} = \bm{x}^T\bm{A}\bm{x} + \bm{x}^T\bm{B}\bm{x} > 0 $$

スカラー倍: $c > 0$ のとき $c\bm{A} \succ 0$。

合同変換: $\bm{B}$ が正則なら $\bm{B}^T\bm{AB} \succ 0$。

$$ \bm{x}^T(\bm{B}^T\bm{AB})\bm{x} = (\bm{Bx})^T\bm{A}(\bm{Bx}) > 0 \quad (\bm{Bx} \neq \bm{0}) $$

注意: 積 $\bm{AB}$ は一般に正定値ではありません(対称性が保証されないため)。ただし $\bm{AB}$ の固有値は全て正です。

不等式

正定値行列に対して、以下の重要な不等式があります。

算術平均-幾何平均不等式の行列版:

$$ \det(\bm{A}) \leq \prod_{i=1}^{n} a_{ii} $$

等号は $\bm{A}$ が対角行列のとき成り立ちます。

ミンコフスキーの行列不等式:

$$ [\det(\bm{A} + \bm{B})]^{1/n} \geq [\det(\bm{A})]^{1/n} + [\det(\bm{B})]^{1/n} $$

正定値行列の性質を理解したところで、具体的な応用を見ていきましょう。

半正定値行列

定義と性質

半正定値行列(positive semidefinite, PSD)は、全ての $\bm{x}$ に対して $\bm{x}^T\bm{A}\bm{x} \geq 0$ を満たす行列です(等号を許す)。固有値が全て非負($\lambda_i \geq 0$)です。

正定値と半正定値の違い:

性質 正定値 ($\succ 0$) 半正定値 ($\succeq 0$)
固有値 $\lambda_i > 0$ $\lambda_i \geq 0$
正則性 常に正則 特異かもしれない
コレスキー分解 常に存在 $\bm{A} = \bm{LL}^T$ は存在するが $\bm{L}$ に0対角成分あり
二次形式 狭義の最小値 最小値だが一意でないかもしれない

半正定値が現れる場面

$\bm{X}$ が任意の $m \times n$ 行列のとき

$$ \bm{X}^T\bm{X} \succeq 0 $$

常に半正定値です。なぜなら $\bm{x}^T(\bm{X}^T\bm{X})\bm{x} = \|\bm{Xx}\|^2 \geq 0$。$\bm{X}$ がフルランクなら正定値になります。

共分散行列 $\bm{\Sigma} = E[(\bm{x} – \bm{\mu})(\bm{x} – \bm{\mu})^T]$ はこの形なので常に半正定値です。

半正定値行列の概念は、次に見る共分散行列やカーネル行列で重要になります。

共分散行列と正定値性

共分散行列

$n$ 次元確率変数ベクトル $\bm{x}$ の共分散行列

$$ \bm{\Sigma} = E[(\bm{x} – \bm{\mu})(\bm{x} – \bm{\mu})^T] $$

は対称かつ半正定値です。データが縮退していない(全次元に変動がある)場合は正定値です。

共分散行列の正定値性は以下の場面で重要です。

  • 多変量正規分布: 確率密度関数 $p(\bm{x}) \propto \exp(-\frac{1}{2}(\bm{x}-\bm{\mu})^T\bm{\Sigma}^{-1}(\bm{x}-\bm{\mu}))$ は $\bm{\Sigma} \succ 0$ を必要とする
  • マハラノビス距離: $d^2 = (\bm{x}-\bm{\mu})^T\bm{\Sigma}^{-1}(\bm{x}-\bm{\mu})$ は $\bm{\Sigma}$ の正定値性により非負
  • PCA: 共分散行列の固有値分解で主成分を抽出

カーネル行列

機械学習のカーネル法では、カーネル関数 $k(\bm{x}_i, \bm{x}_j)$ から構成されるグラム行列

$$ K_{ij} = k(\bm{x}_i, \bm{x}_j) $$

が半正定値であることが要求されます(マーサーの条件)。ガウスカーネル $k(\bm{x}, \bm{y}) = \exp(-\|\bm{x}-\bm{y}\|^2 / 2\sigma^2)$ は常に半正定値カーネルです。

理論の整理が済んだので、Pythonで可視化して理解を深めましょう。

Pythonでの実装と可視化

二次形式の可視化

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm

fig, axes = plt.subplots(1, 3, figsize=(16, 5), subplot_kw={'projection': '3d'})

matrices = [
    (np.array([[3, 1], [1, 2]]), 'Positive Definite\n$\\lambda = 3.62, 1.38$'),
    (np.array([[1, 0], [0, 0]]), 'Positive Semidefinite\n$\\lambda = 1, 0$'),
    (np.array([[2, 0], [0, -1]]), 'Indefinite\n$\\lambda = 2, -1$')
]

x = np.linspace(-2, 2, 100)
y = np.linspace(-2, 2, 100)
X, Y = np.meshgrid(x, y)

for ax, (A, title) in zip(axes, matrices):
    Z = A[0,0]*X**2 + (A[0,1]+A[1,0])*X*Y + A[1,1]*Y**2

    surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm, alpha=0.8,
                           linewidth=0, antialiased=True)
    ax.set_xlabel('$x_1$', fontsize=10)
    ax.set_ylabel('$x_2$', fontsize=10)
    ax.set_zlabel('$x^TAx$', fontsize=10)
    ax.set_title(title, fontsize=11)

plt.tight_layout()
plt.savefig('positive_definite_quadratic.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフから、正定値性と二次形式の形状の関係が視覚的にわかります。

  1. 左図(正定値): お椀型(楕円放物面)で、原点が唯一の最小値です。全ての方向で二次形式が正であり、等高線は楕円を描きます。固有値 $\lambda_1 = 3.62$, $\lambda_2 = 1.38$ が楕円の長軸と短軸のスケールを決めています

  2. 中央図(半正定値): 谷型の形状で、$x_2$ 方向が平坦です。固有値0の方向では変化がなく、最小値は直線上の全点で達成されます(一意でない)

  3. 右図(不定): 鞍点型で、$x_1$ 方向では正($\lambda_1 = 2$)、$x_2$ 方向では負($\lambda_2 = -1$)です。最小値も最大値も存在しません

判定法の比較

fig, axes = plt.subplots(1, 3, figsize=(16, 5))

# テスト行列の生成
np.random.seed(42)

def generate_pd_matrix(n):
    """正定値行列を生成"""
    B = np.random.randn(n, n)
    return B.T @ B + 0.1 * np.eye(n)

def generate_psd_matrix(n):
    """半正定値行列を生成(ランク不足)"""
    B = np.random.randn(n, n-1)
    return B @ B.T

def generate_indefinite_matrix(n):
    """不定行列を生成"""
    A = np.random.randn(n, n)
    return (A + A.T) / 2

# (a) 固有値分布の比較
ax = axes[0]
n = 6
A_pd = generate_pd_matrix(n)
A_psd = generate_psd_matrix(n)
A_indef = generate_indefinite_matrix(n)

eig_pd = np.linalg.eigvalsh(A_pd)
eig_psd = np.linalg.eigvalsh(A_psd)
eig_indef = np.linalg.eigvalsh(A_indef)

x_pos = np.arange(n)
width = 0.25
ax.bar(x_pos - width, sorted(eig_pd, reverse=True), width, color='green',
       alpha=0.7, label='Positive definite')
ax.bar(x_pos, sorted(eig_psd, reverse=True), width, color='blue',
       alpha=0.7, label='Positive semidefinite')
ax.bar(x_pos + width, sorted(eig_indef, reverse=True), width, color='red',
       alpha=0.7, label='Indefinite')
ax.axhline(y=0, color='black', linewidth=1)
ax.set_xlabel('Eigenvalue index', fontsize=12)
ax.set_ylabel('Eigenvalue', fontsize=12)
ax.set_title('Eigenvalue Distribution', fontsize=13)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

# (b) 首座小行列式
ax = axes[1]
minors_pd = [np.linalg.det(A_pd[:k,:k]) for k in range(1, n+1)]
minors_psd = [np.linalg.det(A_psd[:k,:k]) for k in range(1, n+1)]
minors_indef = [np.linalg.det(A_indef[:k,:k]) for k in range(1, n+1)]

ax.plot(range(1, n+1), minors_pd, 'go-', markersize=8, linewidth=2,
        label='Positive definite')
ax.plot(range(1, n+1), minors_psd, 'bs-', markersize=8, linewidth=2,
        label='Positive semidefinite')
ax.plot(range(1, n+1), minors_indef, 'r^-', markersize=8, linewidth=2,
        label='Indefinite')
ax.axhline(y=0, color='black', linewidth=1)
ax.set_xlabel('Minor order $k$', fontsize=12)
ax.set_ylabel('$k$-th leading principal minor', fontsize=12)
ax.set_title("Sylvester's Criterion", fontsize=13)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

# (c) コレスキー分解の判定
ax = axes[2]
n_tests = 200
results = {'PD': 0, 'PSD': 0, 'Indefinite': 0}

for _ in range(n_tests):
    # ランダムな対称行列
    M = np.random.randn(5, 5)
    M = (M + M.T) / 2

    eigs = np.linalg.eigvalsh(M)
    if np.all(eigs > 1e-10):
        category = 'PD'
    elif np.all(eigs >= -1e-10):
        category = 'PSD'
    else:
        category = 'Indefinite'
    results[category] += 1

    # コレスキー分解を試みる
    try:
        np.linalg.cholesky(M)
        cholesky_success = True
    except np.linalg.LinAlgError:
        cholesky_success = False

colors = ['green', 'blue', 'red']
bars = ax.bar(results.keys(), results.values(), color=colors, alpha=0.7)
ax.set_ylabel('Count', fontsize=12)
ax.set_title(f'Random $5 \\times 5$ Symmetric Matrices\n({n_tests} samples)', fontsize=12)
ax.grid(True, alpha=0.3)

for bar, count in zip(bars, results.values()):
    ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 2,
            str(count), ha='center', fontsize=12, fontweight='bold')

plt.tight_layout()
plt.savefig('pd_detection.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフから、正定値行列の判定法が確認できます。

  1. 左図(固有値分布): 正定値行列(緑)は全固有値が正、半正定値行列(青)は最小固有値が0(またはほぼ0)、不定行列(赤)は正と負の固有値が混在しています。固有値の符号で行列のタイプが完全に決まります

  2. 中央図(首座小行列式): シルベスターの判定法を可視化しています。正定値行列(緑)は全ての首座小行列式が正、不定行列(赤)は途中で負になる小行列式があります。半正定値行列(青)は最後の小行列式が0に近くなっています

  3. 右図(ランダム行列の分類): ランダムな対称行列200個のうち、約半数が不定であり、正定値はそれより少数です。ランダムな対称行列が正定値である確率は $1/2^n$ に近く、高次元では非常に稀であることがわかります

共分散行列の可視化

fig, axes = plt.subplots(1, 3, figsize=(16, 5))

# データ生成
np.random.seed(42)
n_samples = 500

# 正定値共分散行列
Sigma = np.array([[2, 1.2], [1.2, 1]])
mean = np.array([0, 0])

# 多変量正規分布からサンプル
L = np.linalg.cholesky(Sigma)
z = np.random.randn(n_samples, 2)
data = z @ L.T + mean

# (a) 散布図と共分散楕円
ax = axes[0]
ax.scatter(data[:, 0], data[:, 1], alpha=0.3, s=10, color='steelblue')

# 共分散楕円
eigenvalues_cov, eigenvectors_cov = np.linalg.eigh(Sigma)
theta_ell = np.linspace(0, 2*np.pi, 100)
for n_sigma in [1, 2, 3]:
    ellipse = np.array([np.cos(theta_ell), np.sin(theta_ell)])
    ellipse = eigenvectors_cov @ np.diag(np.sqrt(eigenvalues_cov)) @ ellipse * n_sigma
    ax.plot(ellipse[0], ellipse[1], linewidth=2,
            label=f'{n_sigma}$\\sigma$ ellipse')

# 固有ベクトル方向
for i in range(2):
    v = eigenvectors_cov[:, i] * np.sqrt(eigenvalues_cov[i])
    ax.annotate('', xy=v*2, xytext=[0,0],
                arrowprops=dict(arrowstyle='->', color='red', lw=2))

ax.set_xlabel('$x_1$', fontsize=12)
ax.set_ylabel('$x_2$', fontsize=12)
ax.set_title('Covariance Matrix (PD)', fontsize=13)
ax.set_aspect('equal')
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

# (b) マハラノビス距離
ax = axes[1]
Sigma_inv = np.linalg.inv(Sigma)
mahal_dist = np.array([np.sqrt((x - mean) @ Sigma_inv @ (x - mean)) for x in data])

scatter = ax.scatter(data[:, 0], data[:, 1], c=mahal_dist, cmap='hot_r',
                     s=15, alpha=0.7)
plt.colorbar(scatter, ax=ax, label='Mahalanobis distance')
ax.set_xlabel('$x_1$', fontsize=12)
ax.set_ylabel('$x_2$', fontsize=12)
ax.set_title('Mahalanobis Distance', fontsize=13)
ax.set_aspect('equal')
ax.grid(True, alpha=0.3)

# (c) サンプル共分散行列の正定値性
ax = axes[2]
sample_sizes = [5, 10, 20, 50, 100, 200, 500]
min_eigenvalues = []
for n_s in sample_sizes:
    min_eigs = []
    for _ in range(100):
        sample = data[np.random.choice(n_samples, n_s, replace=False)]
        S = np.cov(sample, rowvar=False)
        min_eigs.append(np.min(np.linalg.eigvalsh(S)))
    min_eigenvalues.append(min_eigs)

bp = ax.boxplot(min_eigenvalues, labels=sample_sizes, patch_artist=True)
for patch in bp['boxes']:
    patch.set_facecolor('steelblue')
    patch.set_alpha(0.7)

ax.axhline(y=0, color='red', linewidth=1.5, linestyle='--', label='$\\lambda = 0$')
ax.set_xlabel('Sample size', fontsize=12)
ax.set_ylabel('Minimum eigenvalue of $S$', fontsize=12)
ax.set_title('Sample Covariance: PD Check', fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('covariance_pd.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフから、共分散行列の正定値性の実用的な側面が確認できます。

  1. 左図(共分散楕円): 正定値共分散行列 $\bm{\Sigma}$ のもとで多変量正規分布のサンプル(青点)と共分散楕円(1, 2, 3 $\sigma$)を表示しています。楕円の主軸方向が固有ベクトル方向(赤矢印)に一致し、軸の長さが固有値の平方根に比例しています

  2. 中央図(マハラノビス距離): データ点の色がマハラノビス距離 $d = \sqrt{(\bm{x}-\bm{\mu})^T\bm{\Sigma}^{-1}(\bm{x}-\bm{\mu})}$ を表しています。中心から離れた点ほど距離が大きく、楕円形の等高線に沿って距離が一定です。ユークリッド距離と異なり、相関構造を考慮した「自然な距離」が得られています

  3. 右図(サンプル共分散行列の最小固有値): サンプルサイズが小さいと、サンプル共分散行列の最小固有値が0に近くなり、数値的に正定値でなくなるリスクがあります。サンプルサイズが増えると最小固有値が真の値($\approx 0.36$)に安定します。$n < p$(サンプル数 < 次元数)のとき、サンプル共分散行列は特異(半正定値だが正定値でない)になります

正定値行列と凸最適化

正定値行列は凸最適化理論と密接に関係しています。

二次関数 $f(\bm{x}) = \frac{1}{2}\bm{x}^T\bm{A}\bm{x} – \bm{b}^T\bm{x}$ は

  • $\bm{A} \succ 0$ のとき狭義凸関数 → 唯一の最小値 $\bm{x}^* = \bm{A}^{-1}\bm{b}$
  • $\bm{A} \succeq 0$ のとき凸関数 → 最小値は存在するが一意とは限らない
  • $\bm{A}$ が不定のとき非凸 → 鞍点が存在し、大域的最小値が存在しない場合がある

ニュートン法では、ヘッセ行列 $\bm{H} = \nabla^2 f$ が正定値であることを仮定します。正定値でない場合、修正ニュートン法やLevenberg-Marquardt法で $\bm{H} + \lambda\bm{I}$ と正則化して正定値性を確保します。

このような正則化のアイデアは機械学習でも広く使われています。たとえば、リッジ回帰($L^2$ 正則化)では正規方程式が $(\bm{X}^T\bm{X} + \lambda\bm{I})\bm{w} = \bm{X}^T\bm{y}$ となり、$\lambda > 0$ を加えることで左辺の行列が確実に正定値になります。これにより、特徴量間に強い多重共線性がある場合でも安定した解が得られるようになります。正定値性の確保が数値的安定性と統計的正則化の両面で重要な役割を果たしている好例です。

正定値行列の平方根と行列不等式

行列の平方根

正定値行列 $\bm{A} \succ 0$ には一意の正定値平方根 $\bm{A}^{1/2}$ が存在し、$\bm{A}^{1/2} \bm{A}^{1/2} = \bm{A}$ を満たします。スペクトル分解 $\bm{A} = \bm{Q}\bm{D}\bm{Q}^T$ を用いると

$$ \bm{A}^{1/2} = \bm{Q} \begin{pmatrix} \sqrt{\lambda_1} & & \\ & \ddots & \\ & & \sqrt{\lambda_n} \end{pmatrix} \bm{Q}^T $$

と計算できます。平方根は多変量正規分布からのサンプル生成で使われます。$\bm{z} \sim N(\bm{0}, \bm{I})$ のとき $\bm{x} = \bm{\mu} + \bm{\Sigma}^{1/2}\bm{z}$ は $N(\bm{\mu}, \bm{\Sigma})$ に従います。実用的にはコレスキー分解 $\bm{\Sigma} = \bm{L}\bm{L}^T$ を使って $\bm{x} = \bm{\mu} + \bm{L}\bm{z}$ と計算する方が効率的です。

レーヴナー(Löwner)順序

正定値行列の間に半順序を定義できます。$\bm{A} \succeq \bm{B}$ とは $\bm{A} – \bm{B} \succeq 0$(半正定値)であることを意味します。この順序はレーヴナー順序と呼ばれ、凸最適化の半正定値計画(SDP: Semidefinite Programming)で中心的な役割を果たします。

たとえば、「$\bm{X} \succeq 0$ かつ $\text{tr}(\bm{X}) \leq 1$」という制約は凸集合を定めます。このような半正定値制約を含む最適化問題は効率的に解くことができ、制御系の安定性解析(リアプノフ不等式 $\bm{A}^T\bm{P} + \bm{P}\bm{A} \prec 0$)やロバスト制御設計に広く応用されています。

まとめ

本記事では、正定値行列の理論と応用について解説しました。

  • 正定値行列は $\bm{x}^T\bm{A}\bm{x} > 0$($\forall \bm{x} \neq \bm{0}$)を満たす対称行列で、全固有値が正
  • 判定法は固有値首座小行列式(シルベスター)、コレスキー分解の3つが主要
  • 正定値行列は和・スカラー倍・合同変換で保存され、逆行列も正定値
  • 半正定値行列は固有値が非負(0を許す)で、共分散行列やカーネル行列に現れる
  • 共分散行列の正定値性は多変量正規分布やマハラノビス距離の基盤
  • 凸最適化では正定値ヘッセ行列が唯一の最小値の存在を保証する

次のステップとして、以下の記事も参考にしてください。