機械学習の論文を読んでいると、次のような式に出会うことがあります。
$$ J(\bm{W}) = \text{tr}(\bm{W}^T\bm{X}^T\bm{X}\bm{W}) – 2\,\text{tr}(\bm{W}^T\bm{X}^T\bm{Y}) $$
$\text{tr}(\cdot)$ は行列のトレース(trace、対角和)です。スカラー値であるはずの目的関数がなぜ行列のトレースで書かれるのでしょうか。それは、トレースを使うと行列のスカラー値関数を簡潔に表現でき、行列微分の計算が格段に楽になるからです。
トレースは「対角成分の和」という素朴な定義にもかかわらず、驚くほど豊かな性質を持ちます。特に巡回性(cyclic property)は、行列の順番を入れ替える強力なツールであり、機械学習・統計学・物理学の理論展開で不可欠です。
トレースを理解すると、以下のような場面で活用できます。
- 機械学習: 損失関数の行列表現と勾配計算(多変量回帰、PCA等)
- 統計学: 共分散行列の分析、分散の計算
- 最適化: 行列変数の目的関数の微分
- 物理学: 量子力学の期待値計算、密度行列のトレース
本記事の内容
- トレースの定義と基本性質
- 巡回性(cyclic property)の証明と応用
- トレースと固有値・行列式の関係
- フロベニウスノルムとの関係
- トレースを使った行列微分の公式
- Pythonでの検証
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
- 固有値分解の理論と応用 — 固有値の概念
- 行列式の定義・計算方法・幾何学的意味 — 行列式との関係
トレースの定義
定義
$n \times n$ 正方行列 $\bm{A} = (a_{ij})$ のトレース(trace、対角和)は、対角成分の和です。
$$ \begin{equation} \text{tr}(\bm{A}) = \sum_{i=1}^{n} a_{ii} = a_{11} + a_{22} + \cdots + a_{nn} \end{equation} $$
例えば
$$ \text{tr}\begin{pmatrix} 3 & 1 & 4 \\ 1 & 5 & 9 \\ 2 & 6 & 5 \end{pmatrix} = 3 + 5 + 5 = 13 $$
定義自体は極めて単純ですが、この「対角成分の和」は基底変換に対して不変であるという深い性質を持ちます。つまり $\text{tr}(\bm{P}^{-1}\bm{AP}) = \text{tr}(\bm{A})$ が成り立ちます。これは後述する巡回性から従います。
トレースは「行列空間からスカラーへの写像」であり、行列の情報を1つの数に集約する操作です。では、この写像はどのような性質を持つのでしょうか。
基本性質
線形性
トレースは線形写像です。任意の $n \times n$ 行列 $\bm{A}, \bm{B}$ とスカラー $c$ に対して
$$ \text{tr}(\bm{A} + \bm{B}) = \text{tr}(\bm{A}) + \text{tr}(\bm{B}) $$
$$ \text{tr}(c\bm{A}) = c \cdot \text{tr}(\bm{A}) $$
証明は定義から明らかです。$\text{tr}(\bm{A} + \bm{B}) = \sum_i (a_{ii} + b_{ii}) = \sum_i a_{ii} + \sum_i b_{ii}$。
転置不変性
$$ \text{tr}(\bm{A}^T) = \text{tr}(\bm{A}) $$
対角成分は転置で変わらないからです。
単位行列のトレース
$$ \text{tr}(\bm{I}_n) = n $$
スカラーのトレース
$1 \times 1$ 行列(スカラー)のトレースはそのスカラー自身です。$\text{tr}(c) = c$。
これは些細に見えますが、「$\bm{x}^T\bm{A}\bm{x}$ は $1 \times 1$ 行列なので $\text{tr}(\bm{x}^T\bm{A}\bm{x}) = \bm{x}^T\bm{A}\bm{x}$」というテクニックで頻繁に使います。スカラーをトレースで包むことで巡回性が使えるようになります。
基本性質を押さえたところで、トレースの最も重要な性質 — 巡回性に進みましょう。
巡回性(Cyclic Property)
2行列の場合
行列 $\bm{A} \in \mathbb{R}^{m \times n}$, $\bm{B} \in \mathbb{R}^{n \times m}$ に対して
$$ \begin{equation} \text{tr}(\bm{AB}) = \text{tr}(\bm{BA}) \end{equation} $$
$\bm{AB}$ は $m \times m$ 行列、$\bm{BA}$ は $n \times n$ 行列であり、サイズが異なることに注意してください。トレースの値は等しいですが、行列のサイズは一般に異なります。
証明: 定義に戻って計算します。
$$ \text{tr}(\bm{AB}) = \sum_{i=1}^{m} (\bm{AB})_{ii} = \sum_{i=1}^{m} \sum_{j=1}^{n} a_{ij} b_{ji} $$
一方
$$ \text{tr}(\bm{BA}) = \sum_{j=1}^{n} (\bm{BA})_{jj} = \sum_{j=1}^{n} \sum_{i=1}^{m} b_{ji} a_{ij} $$
二重和の総和順序を入れ替えれば同じ式になるので、$\text{tr}(\bm{AB}) = \text{tr}(\bm{BA})$ が成り立ちます。
多行列の場合
巡回性は任意の数の行列の積に拡張できます。
$$ \begin{equation} \text{tr}(\bm{ABC}) = \text{tr}(\bm{BCA}) = \text{tr}(\bm{CAB}) \end{equation} $$
一般に $\text{tr}(\bm{A}_1\bm{A}_2\cdots\bm{A}_k) = \text{tr}(\bm{A}_2\cdots\bm{A}_k\bm{A}_1) = \cdots$
重要: 巡回的な並び替えは許されますが、任意の並び替えは一般に許されません。
$$ \text{tr}(\bm{ABC}) \neq \text{tr}(\bm{ACB}) \quad \text{(一般に)} $$
巡回性の応用例
例1: 相似変換の不変量
$\text{tr}(\bm{P}^{-1}\bm{AP}) = \text{tr}(\bm{A}\bm{P}\bm{P}^{-1}) = \text{tr}(\bm{A})$ より、トレースは基底変換に依存しない行列の固有の量です。
例2: 二次形式のトレース表現
スカラー値 $\bm{x}^T\bm{A}\bm{x}$ をトレースで書くと
$$ \bm{x}^T\bm{A}\bm{x} = \text{tr}(\bm{x}^T\bm{A}\bm{x}) = \text{tr}(\bm{A}\bm{x}\bm{x}^T) $$
巡回性で $\bm{x}^T$ を後ろに回しました。この変形は、$\bm{x}$ の期待値を取る際に特に便利です。
$$ E[\bm{x}^T\bm{A}\bm{x}] = E[\text{tr}(\bm{A}\bm{x}\bm{x}^T)] = \text{tr}(\bm{A} E[\bm{x}\bm{x}^T]) $$
トレースの中で期待値を行列の中に移動できるため、$E[\bm{x}\bm{x}^T]$(共分散行列に関連)を使って計算できます。
例3: 行列の類似度
2つの行列 $\bm{A}, \bm{B}$ の「内積」(フロベニウス内積)は
$$ \langle \bm{A}, \bm{B} \rangle_F = \text{tr}(\bm{A}^T\bm{B}) = \sum_{i,j} a_{ij} b_{ij} $$
行列の全要素の内積がトレースで表現できます。
巡回性は行列計算の「手品」のような性質です。次に、トレースと固有値の深い関係を見ましょう。
トレースと固有値
固有値の和
$n \times n$ 行列 $\bm{A}$ の固有値を $\lambda_1, \lambda_2, \ldots, \lambda_n$(重複含む)とすると
$$ \begin{equation} \text{tr}(\bm{A}) = \sum_{i=1}^{n} \lambda_i \end{equation} $$
証明: 対角化可能な場合、$\bm{A} = \bm{PDP}^{-1}$ より $\text{tr}(\bm{A}) = \text{tr}(\bm{PDP}^{-1}) = \text{tr}(\bm{D}) = \sum \lambda_i$。対角化不可能な場合も、ジョルダン標準形 $\bm{J}$ の対角成分が固有値なので $\text{tr}(\bm{A}) = \text{tr}(\bm{J}) = \sum \lambda_i$。
あるいは特性多項式から直接示すこともできます。$\det(\bm{A} – \lambda\bm{I}) = (-\lambda)^n + \text{tr}(\bm{A})(-\lambda)^{n-1} + \cdots$ の $(-\lambda)^{n-1}$ の係数を比較すれば得られます。
行列式との関係
固有値に関する関係をまとめると
| 不変量 | 式 | 関係 |
|---|---|---|
| トレース | $\text{tr}(\bm{A}) = \sum_i \lambda_i$ | 固有値の和 |
| 行列式 | $\det(\bm{A}) = \prod_i \lambda_i$ | 固有値の積 |
トレースと行列式は、特性多項式の係数として自然に現れる、行列の2大不変量です。
特性方程式との関係
2次正方行列の場合、特性方程式は
$$ \lambda^2 – \text{tr}(\bm{A})\lambda + \det(\bm{A}) = 0 $$
これはケイリー・ハミルトンの定理 $\bm{A}^2 – \text{tr}(\bm{A})\bm{A} + \det(\bm{A})\bm{I} = \bm{O}$ にも直結します。
トレースと固有値の関係を理解したところで、ノルムとの関係に進みましょう。
フロベニウスノルムとの関係
フロベニウスノルムのトレース表現
行列のフロベニウスノルム(要素の二乗和の平方根)はトレースで表現できます。
$$ \begin{equation} \|\bm{A}\|_F^2 = \sum_{i,j} a_{ij}^2 = \text{tr}(\bm{A}^T\bm{A}) = \text{tr}(\bm{A}\bm{A}^T) \end{equation} $$
証明: $(\bm{A}^T\bm{A})_{ii} = \sum_j a_{ji}^2$ なので $\text{tr}(\bm{A}^T\bm{A}) = \sum_i \sum_j a_{ji}^2 = \|\bm{A}\|_F^2$。
固有値との関係
$\bm{A}^T\bm{A}$ の固有値は $\bm{A}$ の特異値の二乗 $\sigma_1^2, \ldots, \sigma_r^2$ なので
$$ \|\bm{A}\|_F^2 = \sum_{i=1}^{r} \sigma_i^2 $$
対称行列 $\bm{A} = \bm{A}^T$ の場合は特異値 = 固有値の絶対値なので
$$ \|\bm{A}\|_F^2 = \text{tr}(\bm{A}^2) = \sum_{i=1}^{n} \lambda_i^2 $$
行列近似への応用
低ランク近似の最適性を議論するとき、フロベニウスノルムの最小化問題
$$ \min_{\text{rank}(\bm{B}) \leq k} \|\bm{A} – \bm{B}\|_F^2 = \min_{\text{rank}(\bm{B}) \leq k} \text{tr}((\bm{A} – \bm{B})^T(\bm{A} – \bm{B})) $$
が現れます。SVDによる最適低ランク近似はこの問題の解です。
フロベニウスノルムの性質を踏まえ、次にトレースの微分公式を見ていきましょう。これが機械学習で最も頻繁に使われるトレースの応用です。
トレースを使った行列微分
なぜトレースで微分するのか
行列変数 $\bm{W}$ を含む目的関数 $J(\bm{W})$ はスカラーです。このスカラー関数をトレースの形で書くと、巡回性を使って微分が機械的に計算できます。
以下の公式は、機械学習・統計学で頻繁に使われる必須ツールです。
基本公式
公式1: 線形の場合
$$ \frac{\partial}{\partial \bm{X}} \text{tr}(\bm{A}\bm{X}) = \bm{A}^T $$
公式2: 二次形式
$$ \frac{\partial}{\partial \bm{X}} \text{tr}(\bm{X}^T\bm{A}\bm{X}) = (\bm{A} + \bm{A}^T)\bm{X} $$
$\bm{A}$ が対称なら $= 2\bm{AX}$。
公式3: 転置を含む場合
$$ \frac{\partial}{\partial \bm{X}} \text{tr}(\bm{A}\bm{X}^T\bm{B}) = \bm{B}\bm{A} $$
公式4: $\bm{X}$ の二乗
$$ \frac{\partial}{\partial \bm{X}} \text{tr}(\bm{X}\bm{X}^T) = 2\bm{X} $$
これは $\frac{\partial}{\partial \bm{X}} \|\bm{X}\|_F^2 = 2\bm{X}$ に対応します。
公式1の導出
$\text{tr}(\bm{AX}) = \sum_{i,j} a_{ij} x_{ji}$ なので
$$ \frac{\partial \text{tr}(\bm{AX})}{\partial x_{kl}} = a_{lk} $$
これは $\bm{A}^T$ の $(k,l)$ 成分なので $\frac{\partial}{\partial \bm{X}} \text{tr}(\bm{AX}) = \bm{A}^T$。
公式2の導出
$\text{tr}(\bm{X}^T\bm{AX})$ を展開します。$\bm{B} = \bm{AX}$ とおくと $\text{tr}(\bm{X}^T\bm{B}) = \sum_{i,j} x_{ji} b_{ji} = \sum_{i,j} x_{ji} \sum_k a_{jk} x_{ki}$。
$x_{lm}$ で微分すると、$j = l$ の項と $k = l, i = m$ の項が残り
$$ \frac{\partial}{\partial x_{lm}} \text{tr}(\bm{X}^T\bm{AX}) = \sum_k a_{lk} x_{km} + \sum_j x_{jl} a_{jm} \cdot \delta_{…} $$
整理すると $(\bm{AX})_{lm} + (\bm{A}^T\bm{X})_{lm} = ((\bm{A} + \bm{A}^T)\bm{X})_{lm}$ が得られます。
最小二乗法への応用
多変量線形回帰 $\bm{Y} = \bm{XW} + \bm{E}$ の目的関数
$$ J(\bm{W}) = \|\bm{Y} – \bm{XW}\|_F^2 = \text{tr}((\bm{Y} – \bm{XW})^T(\bm{Y} – \bm{XW})) $$
を展開します。
$$ J(\bm{W}) = \text{tr}(\bm{Y}^T\bm{Y}) – 2\,\text{tr}(\bm{W}^T\bm{X}^T\bm{Y}) + \text{tr}(\bm{W}^T\bm{X}^T\bm{X}\bm{W}) $$
$\bm{W}$ で微分すると、公式1と公式2を使って
$$ \frac{\partial J}{\partial \bm{W}} = -2\bm{X}^T\bm{Y} + 2\bm{X}^T\bm{X}\bm{W} = \bm{0} $$
正規方程式 $\bm{X}^T\bm{X}\bm{W} = \bm{X}^T\bm{Y}$ が得られます。トレースの公式のおかげで、行列微分が機械的に実行できました。
理論を一通り学んだところで、Pythonで各性質を検証しましょう。
Pythonでの検証
トレースの基本性質の検証
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
n = 5
A = np.random.randn(n, n)
B = np.random.randn(n, n)
c = 3.14
print("=== トレースの基本性質 ===\n")
# 線形性
print(f"tr(A+B) = {np.trace(A+B):.6f}")
print(f"tr(A)+tr(B) = {np.trace(A)+np.trace(B):.6f}")
print(f"差: {abs(np.trace(A+B) - np.trace(A) - np.trace(B)):.2e}\n")
# スカラー倍
print(f"tr(cA) = {np.trace(c*A):.6f}")
print(f"c*tr(A) = {c*np.trace(A):.6f}")
print(f"差: {abs(np.trace(c*A) - c*np.trace(A)):.2e}\n")
# 転置不変性
print(f"tr(A) = {np.trace(A):.6f}")
print(f"tr(A^T) = {np.trace(A.T):.6f}")
print(f"差: {abs(np.trace(A) - np.trace(A.T)):.2e}\n")
# 単位行列
print(f"tr(I_n) = {np.trace(np.eye(n)):.0f} (should be {n})")
巡回性の検証
print("\n=== 巡回性の検証 ===\n")
# 2行列の巡回性(異なるサイズ)
m, k = 4, 6
A_rect = np.random.randn(m, k)
B_rect = np.random.randn(k, m)
print(f"A: {m}x{k}, B: {k}x{m}")
print(f"tr(AB) = {np.trace(A_rect @ B_rect):.6f} ({m}x{m} matrix)")
print(f"tr(BA) = {np.trace(B_rect @ A_rect):.6f} ({k}x{k} matrix)")
print(f"差: {abs(np.trace(A_rect @ B_rect) - np.trace(B_rect @ A_rect)):.2e}\n")
# 3行列の巡回性
C = np.random.randn(n, n)
print(f"tr(ABC) = {np.trace(A @ B @ C):.6f}")
print(f"tr(BCA) = {np.trace(B @ C @ A):.6f}")
print(f"tr(CAB) = {np.trace(C @ A @ B):.6f}")
# 非巡回的並び替えは一般に成立しない
print(f"tr(ACB) = {np.trace(A @ C @ B):.6f} (not cyclic!)")
固有値との関係の検証
print("\n=== 固有値との関係 ===\n")
# 対称行列で検証
S = (A + A.T) / 2
eigenvalues = np.linalg.eigvalsh(S)
print(f"tr(S) = {np.trace(S):.6f}")
print(f"sum(eigenvalues) = {np.sum(eigenvalues):.6f}")
print(f"差: {abs(np.trace(S) - np.sum(eigenvalues)):.2e}\n")
print(f"det(S) = {np.linalg.det(S):.6f}")
print(f"prod(eigenvalues) = {np.prod(eigenvalues):.6f}")
print(f"差: {abs(np.linalg.det(S) - np.prod(eigenvalues)):.2e}")
全ての出力で「差」が $10^{-14}$ 以下であり、理論通りの性質が数値的にも確認できます。
微分公式の数値検証
fig, axes = plt.subplots(1, 3, figsize=(16, 5))
# (a) 公式1: d/dX tr(AX) = A^T
ax = axes[0]
n_test = 4
A_d = np.random.randn(n_test, n_test)
X_d = np.random.randn(n_test, n_test)
# 数値微分
eps = 1e-7
grad_numerical = np.zeros_like(X_d)
for i in range(n_test):
for j in range(n_test):
X_plus = X_d.copy()
X_plus[i, j] += eps
grad_numerical[i, j] = (np.trace(A_d @ X_plus) - np.trace(A_d @ X_d)) / eps
grad_analytical = A_d.T
error1 = np.max(np.abs(grad_numerical - grad_analytical))
ax.imshow(np.abs(grad_numerical - grad_analytical), cmap='Reds', aspect='equal')
ax.set_title(f'$\\partial/\\partial X$ tr($AX$) = $A^T$\nmax error: {error1:.2e}', fontsize=11)
ax.set_xlabel('Column', fontsize=11)
ax.set_ylabel('Row', fontsize=11)
plt.colorbar(ax.images[0], ax=ax, shrink=0.8)
# (b) 公式2: d/dX tr(X^T A X) = (A + A^T)X
ax = axes[1]
A_sym = np.random.randn(n_test, n_test)
grad_numerical2 = np.zeros_like(X_d)
f0 = np.trace(X_d.T @ A_sym @ X_d)
for i in range(n_test):
for j in range(n_test):
X_plus = X_d.copy()
X_plus[i, j] += eps
grad_numerical2[i, j] = (np.trace(X_plus.T @ A_sym @ X_plus) - f0) / eps
grad_analytical2 = (A_sym + A_sym.T) @ X_d
error2 = np.max(np.abs(grad_numerical2 - grad_analytical2))
ax.imshow(np.abs(grad_numerical2 - grad_analytical2), cmap='Reds', aspect='equal')
ax.set_title(f'$\\partial/\\partial X$ tr($X^TAX$) = $(A+A^T)X$\nmax error: {error2:.2e}', fontsize=11)
ax.set_xlabel('Column', fontsize=11)
ax.set_ylabel('Row', fontsize=11)
plt.colorbar(ax.images[0], ax=ax, shrink=0.8)
# (c) フロベニウスノルムのトレース表現
ax = axes[2]
sizes = [5, 10, 20, 50, 100]
results = {'tr(A^TA)': [], '||A||_F^2': [], 'sum(sigma_i^2)': []}
for sz in sizes:
M = np.random.randn(sz, sz)
results['tr(A^TA)'].append(np.trace(M.T @ M))
results['||A||_F^2'].append(np.sum(M**2))
results['sum(sigma_i^2)'].append(np.sum(np.linalg.svd(M, compute_uv=False)**2))
ax.plot(sizes, results['tr(A^TA)'], 'bo-', markersize=8, linewidth=2,
label='tr($A^TA$)')
ax.plot(sizes, results['||A||_F^2'], 'r^--', markersize=10, linewidth=2,
label='$\\|A\\|_F^2$')
ax.plot(sizes, results['sum(sigma_i^2)'], 'gs:', markersize=8, linewidth=2,
label='$\\sum \\sigma_i^2$')
ax.set_xlabel('Matrix size $n$', fontsize=12)
ax.set_ylabel('Value', fontsize=12)
ax.set_title('Frobenius Norm Equivalence', fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('trace_properties.png', dpi=150, bbox_inches='tight')
plt.show()
このグラフから、トレースの微分公式の正確さとフロベニウスノルムの等価性が確認できます。
-
左図(公式1の検証): $\frac{\partial}{\partial \bm{X}} \text{tr}(\bm{AX}) = \bm{A}^T$ の数値微分と解析的な勾配の差がヒートマップで表示されています。全要素で $10^{-7}$ オーダー(数値微分の精度限界)以下であり、公式が正しいことが確認できます
-
中央図(公式2の検証): $\frac{\partial}{\partial \bm{X}} \text{tr}(\bm{X}^T\bm{AX}) = (\bm{A} + \bm{A}^T)\bm{X}$ についても同様に数値微分との一致が確認されています
-
右図(フロベニウスノルムの等価性): 3つの異なる計算方法 — $\text{tr}(\bm{A}^T\bm{A})$、$\sum a_{ij}^2$、$\sum \sigma_i^2$ — が全ての行列サイズで完全に一致しています。曲線が重なって見えるのは、3つの値が一致しているためです
トレースの応用: PCAの目的関数
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# PCAの目的関数: 射影後の分散最大化
from sklearn.datasets import make_blobs
X_data, _ = make_blobs(n_samples=200, n_features=5, centers=3, random_state=42)
X_centered = X_data - X_data.mean(axis=0)
# 共分散行列
C = X_centered.T @ X_centered / len(X_centered)
# PCA: tr(W^T C W) の最大化 (W^T W = I の制約下)
eigenvalues_C, eigenvectors_C = np.linalg.eigh(C)
idx = np.argsort(eigenvalues_C)[::-1]
eigenvalues_C = eigenvalues_C[idx]
eigenvectors_C = eigenvectors_C[:, idx]
# (a) 累積寄与率
ax = axes[0]
cumulative_ratio = np.cumsum(eigenvalues_C) / np.sum(eigenvalues_C)
ax.bar(range(1, len(eigenvalues_C)+1), eigenvalues_C / np.sum(eigenvalues_C),
color='steelblue', alpha=0.7, label='Individual')
ax.plot(range(1, len(eigenvalues_C)+1), cumulative_ratio, 'ro-',
markersize=8, linewidth=2, label='Cumulative')
ax.axhline(y=0.95, color='green', linewidth=1.5, linestyle='--', label='95% threshold')
ax.set_xlabel('Principal component', fontsize=12)
ax.set_ylabel('Variance ratio', fontsize=12)
ax.set_title('PCA: tr($W^TCW$) Maximization', fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
# (b) tr(W^T C W) の値をkに対してプロット
ax = axes[1]
k_values = range(1, len(eigenvalues_C)+1)
tr_values = [np.trace(eigenvectors_C[:, :k].T @ C @ eigenvectors_C[:, :k]) for k in k_values]
total_trace = np.trace(C)
ax.plot(k_values, tr_values, 'bo-', markersize=8, linewidth=2, label='tr($W_k^TCW_k$)')
ax.axhline(y=total_trace, color='red', linewidth=1.5, linestyle='--',
label=f'tr($C$) = {total_trace:.2f}')
ax.set_xlabel('Number of components $k$', fontsize=12)
ax.set_ylabel('tr($W_k^T C W_k$)', fontsize=12)
ax.set_title('Captured Variance vs Components', fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('trace_pca.png', dpi=150, bbox_inches='tight')
plt.show()
このグラフから、トレースとPCAの関係が確認できます。
-
左図(寄与率): 各主成分の分散比率(棒グラフ)と累積寄与率(赤線)を示しています。上位2成分で95%以上の分散を説明できています。PCAの目的は $\text{tr}(\bm{W}^T\bm{CW})$(射影後の分散)を最大化することであり、これは固有値の上位 $k$ 個の和に等しいです
-
右図(捕捉された分散): 成分数 $k$ を増やすごとに $\text{tr}(\bm{W}_k^T\bm{CW}_k)$ が増加し、$k = n$ で $\text{tr}(\bm{C})$(全分散)に達しています。この曲線の形は固有値の分布を反映しており、最初の数成分で急激に増加した後に飽和するパターンは、データに低次元構造があることを意味します
トレースの公式一覧
最後に、よく使うトレースの公式を一覧にまとめます。
| 公式 | 条件 |
|---|---|
| $\text{tr}(\bm{A} + \bm{B}) = \text{tr}(\bm{A}) + \text{tr}(\bm{B})$ | 線形性 |
| $\text{tr}(\bm{AB}) = \text{tr}(\bm{BA})$ | 巡回性(サイズ互換) |
| $\text{tr}(\bm{A}) = \sum_i \lambda_i$ | 固有値の和 |
| $\|\bm{A}\|_F^2 = \text{tr}(\bm{A}^T\bm{A})$ | フロベニウスノルム |
| $\bm{x}^T\bm{Ax} = \text{tr}(\bm{Axx}^T)$ | 二次形式 |
| $\frac{\partial}{\partial \bm{X}} \text{tr}(\bm{AX}) = \bm{A}^T$ | 微分 |
| $\frac{\partial}{\partial \bm{X}} \text{tr}(\bm{X}^T\bm{AX}) = (\bm{A} + \bm{A}^T)\bm{X}$ | 微分 |
まとめ
本記事では、行列のトレースの性質と公式を網羅的に解説しました。
- トレースは対角成分の和として定義され、線形性と転置不変性を持つ
- 巡回性 $\text{tr}(\bm{ABC}) = \text{tr}(\bm{BCA}) = \text{tr}(\bm{CAB})$ はトレースの最も強力な性質であり、行列式の整理に不可欠
- トレースは固有値の和 $\text{tr}(\bm{A}) = \sum \lambda_i$ に等しく、相似変換に対して不変
- フロベニウスノルムはトレースで $\|\bm{A}\|_F^2 = \text{tr}(\bm{A}^T\bm{A})$ と表現できる
- トレースの微分公式は機械学習・統計学の行列最適化で必須ツール
次のステップとして、以下の記事も参考にしてください。
- 行列の微分公式を完全まとめ — 行列微分の体系的な解説
- 固有値分解の理論と応用 — 固有値とトレースの関係
- 射影行列と最小二乗法 — トレースの応用