論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
逆行列
Inverse Matrix
数学基礎

🔖 キーワード索引

30秒結論文脈直感数式読み解き実値計算Python実装落とし穴比較表産業活用演習FAQ参考文献用語辞典50連発行列式partial correlation

inverse matrix」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「inverse matrix」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。

inverse matrix統計分析SSDSE-B-2026前提条件適用範囲落とし穴関連手法Python 実装検証方法

これらのキーワードは「inverse matrix の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。

💡 30秒で分かる結論

🍰 まずはやさしく

行列の逆数のようなものです。

データ分析で特定の目的のために使います。

スマホの計算アプリのような道具です。

何ができるのかを短時間で確認します。

行列の「逆数」相当

inverse matrix を 30 秒で把握する重要ポイント:

📍 あなたが今見ているもの

🍰 まずはやさしく

逆行列を詳しく学ぶページです。

実際のデータを使って検証するために使います。

都道府県の統計データを例に考えます。

定義から計算方法まで順番に読みます。

本ページでは 逆行列(Inverse Matrix)を SSDSE-B-2026 の 47 都道府県 2023 年データで具体的に検証する。 公式定義 → 直感 → 数式 → 実値計算 → Python → 落とし穴 → 産業活用 → 演習 → FAQ の順で学べる。

本ページでは「inverse matrix」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。

「inverse matrix」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。

🎨 直感で掴む

🍰 まずはやさしく

数学的な便利な道具です。

いつどう使うかを理解するために使います。

部活の計画を立てるような感覚で考えます。

処理の流れに沿ってイメージを掴みます。

統計・機械学習の理論を支える数学的な道具です。

本ページでは 逆行列 を、 定義・前提条件・使い方・落とし穴の順に整理して解説します。 厳密な定義より、 まず何を、 いつ、 どう使うかを理解することを優先してください。

inverse matrix を直感的に理解するには、 「具体的な日常の場面に当てはめる」のが効果的。 抽象的な定義から入るより、 「これは何の役に立つのか」「どんな場面で使うか」「他の手段とどう違うのか」の 3 点を先に押さえることで、 数式や手続きの理解が定着しやすい。

本ページでは inverse matrix を「データから意思決定までの一連のプロセス」に位置付け、 (1) 入力、 (2) 処理、 (3) 出力、 (4) 解釈 の 4 段階で順に解説する。 この枠組みで他の手法と比較すれば、 inverse matrix の独自性と共通性が見えてくる。

具体例として、 SSDSE-B-2026 のデータを使い、 inverse matrix を実際に動かすイメージを次節以降で示す。 数式 → 値代入 → 手計算 → Python 実装 の流れで、 抽象と具体を行き来しながら理解を深める。

📐 定義

🍰 まずはやさしく

行列における逆数のことです。

機械学習の基礎を学ぶために使います。

買い物の合計金額を計算するように使います。

正しい定義と数式について読みます。

行列の「逆数」相当

英語名 Inverse Matrix

🎯 いつ・どこで使うか

📋 前提条件・適用範囲

この用語を理解・使用するときは、 次のような前提を意識してください:

📐 数式または定義(厳密版)

正方行列 $A \in \mathbb{R}^{n \times n}$ に対し、 $AA^{-1} = A^{-1}A = I_n$ を満たす行列 $A^{-1}$ を $A$ の逆行列と呼ぶ。

$$A^{-1} = \frac{1}{\det(A)} \,\mathrm{adj}(A),\quad AA^{-1}=I_n,\quad \det(A) \neq 0$$

ここで $\det(A)$ は行列式、 $\mathrm{adj}(A)$ は余因子行列。 $\det(A) = 0$ のとき $A$ は特異(singular)で逆行列を持たない。

応用:線形回帰の正規方程式 $\hat{\beta} = (X^\top X)^{-1} X^\top y$、 連立方程式 $Ax = b \Rightarrow x = A^{-1}b$、 多変量相関の partial correlation。

🔬 数式を言葉で読み解く

記号意味SSDSE-B-2026 での例
$A$$n \times n$ の正方行列相関行列 $R$ (3 × 3): 総人口 / 出生数 / 死亡数
$A^{-1}$$A$ の逆行列$R^{-1}$ から partial correlation を計算
$\det(A)$行列式0 でなければ可逆。 SSDSE 相関行列は通常 det > 0
$I_n$$n \times n$ 単位行列対角に 1、 その他 0
$\mathrm{adj}(A)$余因子行列の転置逆行列の構成要素
$\hat{\beta}$回帰係数ベクトルOLS の最終出力
$X^\top X$計画行列の Gram 行列回帰の正規方程式に必要
特異$\det(A) = 0$多重共線性が完全 → 逆行列なし

🧮 SSDSE-B-2026 47 都道府県での実値計算

このコードでやること: SSDSE-B-2026 の 3 指標で相関行列を作り、 その逆行列を計算する。

📥 入力データ: data/raw/SSDSE-B-2026.csv(2023 年 47 県)

 1
 2
 3
 4
 5
 6
 7
 8
 9
import pandas as pd
import numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv',
                 encoding='cp932', skiprows=1)
d23 = df[df['年度']==2023]
R = d23[['総人口','出生数','死亡数']].corr().values
print('相関行列 R =')
print(R.round(4))
print('\ndet(R) =', np.linalg.det(R).round(6))

📤 実行結果:

相関行列 R = [[1. 0.9954 0.9891] [0.9954 1. 0.9774] [0.9891 0.9774 1. ]] det(R) = 0.000147

💬 相関がすべて 0.97-0.99 と高いため det(R)=0.00015 とほぼ 0。 逆行列は計算可能だが「ほぼ特異」で要素が極端に大きくなる(数値的不安定)。

このコードでやること: 相関行列 R の逆行列を計算し、 partial correlation を取り出す。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
R_inv = np.linalg.inv(R)
print('R^-1 =')
print(R_inv.round(2))
# partial r(ij) = -R_inv[i,j] / sqrt(R_inv[i,i]*R_inv[j,j])
p01 = -R_inv[0,1] / np.sqrt(R_inv[0,0]*R_inv[1,1])
p02 = -R_inv[0,2] / np.sqrt(R_inv[0,0]*R_inv[2,2])
p12 = -R_inv[1,2] / np.sqrt(R_inv[1,1]*R_inv[2,2])
print(f'partial r(総人口|出生): {p01:.3f}')
print(f'partial r(総人口|死亡): {p02:.3f}')
print(f'partial r(出生|死亡): {p12:.3f}')

📤 実行結果:

R^-1 = [[ 304.17 -195.21 -110.05] [-195.21 147.69 48.73] [-110.05 48.73 62.23]] partial r(総人口|出生): 0.921 partial r(総人口|死亡): 0.800 partial r(出生|死亡): -0.508

💬 partial correlation は他変数の影響を除いた純粋な関係。 出生数と死亡数は元々 r=0.977 だったが、 総人口を制御すると -0.508 に逆転。 「人口効果」が両者を強く結びつけていたことが分かる。

このコードでやること: 連立方程式の解法として逆行列を用いる: A x = b を解く。

 1
 2
 3
 4
 5
 6
 7
 8
 9
# 簡単な 3 元連立方程式の例
A = np.array([[2, 1, 1],
              [1, 3, 2],
              [1, 0, 1]], dtype=float)
b = np.array([8, 13, 4], dtype=float)
x = np.linalg.inv(A) @ b
print('x =', x.round(3))
# 検算
print('A @ x =', (A @ x).round(3))

📤 実行結果:

x = [1.75 2.25 2.25] A @ x = [ 8. 13. 4.]

💬 x = [1.75, 2.25, 2.25] が解。 ただし大規模な問題では np.linalg.solve(A, b) の方が数値的に安定で高速。 逆行列は概念理解用。

このコードでやること: SSDSE-B-2026 で「総人口を出生数・死亡数で線形回帰」する正規方程式の解を逆行列で計算する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
d23 = df[df['年度']==2023]
X = d23[['出生数','死亡数']].values.astype(float)
X = np.column_stack([np.ones(len(X)), X])  # 切片列
y = d23['総人口'].values.astype(float)
# beta = (X^T X)^-1 X^T y
beta = np.linalg.inv(X.T @ X) @ X.T @ y
print(f'intercept = {beta[0]:.0f}')
print(f'b_births  = {beta[1]:.3f}')
print(f'b_deaths  = {beta[2]:.3f}')

📤 実行結果:

intercept = -139968 b_births = 104.655 b_deaths = 34.804

💬 出生数 1 増加で総人口 104.7 人、 死亡数 1 増加で 34.8 人の影響(人口当たり比率を逆算した数値)。 正規方程式は逆行列の最も実用的な応用。 ただし大規模では QR / SVD 分解の方が安定。

🧮 数式に値を入れて手で計算する: 2×2 逆行列

A = [[4,3],[2,1]] の逆行列を計算する。

Step 1: 行列式

det(A) = 4·1 - 3·2 = 4 - 6 = -2

Step 2: 逆行列公式

A⁻¹ = (1/det) · [[d, -b], [-c, a]] = (1/-2) · [[1, -3], [-2, 4]] = [[-0.5, 1.5], [1.0, -2.0]]

Step 3: 検算 A·A⁻¹ = I

A·A⁻¹ = [[4·(-0.5)+3·1, 4·1.5+3·(-2)], [2·(-0.5)+1·1, 2·1.5+1·(-2)]] = [[1, 0], [0, 1]] ✓

🐍 Python で再現

1
2
3
4
5
import numpy as np
A = np.array([[4, 3], [2, 1]])
A_inv = np.linalg.inv(A)
print(f"逆行列:\n{A_inv}")
print(f"検算 A·A⁻¹:\n{(A @ A_inv).round(3)}")

📤 実行結果

逆行列: [[-0.5 1.5] [ 1. -2. ]] 検算 A·A⁻¹: [[1. 0.] [0. 1.]]

💬 手計算 (Step 2) と Python 出力が完全一致。

🐍 Python での扱い

SSDSE-B-2026 のような公的統計データを Python で扱う際の基本パターン:

📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年) 年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) … 2023 R01000 北海道 5,092,000 1,681,000 24,430 … 2023 R13000 東京都 14,086,000 3,205,000 86,348 … 2023 R47000 沖縄県 1,468,000 350,000 12,549 … …(残り 112 列は住宅・家計・教育・医療など)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import pandas as pd
import numpy as np

# データ読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
print(df.shape)
print(df.dtypes)
print(df.describe())

# 「逆行列」の文脈で扱う場合の例:
# 分野: 数学基礎
# 関連手法は同カテゴリの他用語を参照してください。
📤 実行例(実測) (564, 112) 年度 int64 地域コード object 都道府県 object 総人口 int64 総人口(男) int64 ... 保健医療費(二人以上の世帯) int64 交通・通信費(二人以上の世帯) int64 教育費(二人以上の世帯) int64 教養娯楽費(二人以上の世帯) int64 その他の消費支出(二人以上の世帯) int64 Length: 112, dtype: object 年度 総人口 ... 教養娯楽費(二人以上の世帯) その他の消費支出(二人以上の世帯) count 564.000000 5.640000e+02 ... 564.000000 564.000000 mean 2017.500000 2.690688e+06 ... 26931.026596 59784.718085 std 3.455117 2.730951e+06 ... 4219.487086 8813.812956 min 2012.000000 5.370000e+05 ... 14661.000000 35 …(以下略)

具体的なコードは 機械学習の基礎 を参照してください。

📝 レポートでの報告

分析結果を報告するときに含めるべき情報:

✅ チェックリスト

🐍 拡張 Python レシピ

上記の実値計算がそのまま Python の動作確認ブロックを兼ねる。 加えて、 産業界で使う応用パターンを下の 50 連発に整理した。

⚠️ よくある落とし穴

❌ 正方でないのに inv を呼ぶ
$n \times m$ ($n \ne m$) の行列に np.linalg.inv を呼ぶと LinAlgError: Last 2 dimensions must be square。 矩形行列は np.linalg.pinv で Moore-Penrose 擬似逆行列を使う。
❌ 行列式 ≈ 0 を見逃す
SSDSE-B-2026 で「人口」と「世帯数」のようなほぼ線形従属な列を含む X で $(X^T X)^{-1}$ を取ると、 det が $10^{-15}$ オーダーで数値的に特異。 np.linalg.cond(A) が $10^{10}$ を超えたら正則化 (Ridge) か SVD 擬似逆へ。
❌ inv して b を掛ける
$A^{-1}b$ を np.linalg.inv(A) @ b で計算するのは数値的に不利。 np.linalg.solve(A, b) は内部で LU 分解を使い、 精度・速度ともに約 2-3 倍優れる。 逆行列を明示的に作るのは partial correlation 計算など要素を直接見たい場合だけ。

⚠️ よくある 逆行列 失敗例

  1. 特異行列に inv を呼ぶ:np.linalg.LinAlgError が発生。 多重共線性をまず除く
  2. 数値誤差を無視:det が 1e-15 未満なら逆行列要素が爆発。 SVD で擬似逆行列を
  3. 非正方行列に inv:m × n (m ≠ n) には逆行列なし。 np.linalg.pinv
  4. solve 推奨を無視:Ax=b なら np.linalg.solve(A, b) の方が高速かつ安定
  5. 逆行列を 2 度計算:同じ A の逆を何度も計算するのは無駄。 一度計算してキャッシュ

🗺 概念マップ

逆行列を中心とした概念ツリー

📦 逆行列(このページ)
├─ 上位:線形代数 / 行列計算
├─ 同族:LU 分解 / QR 分解 / SVD / コレスキー分解
├─ 派生:擬似逆行列 / 共分散逆行列
├─ 利用:相関分析 (partial) / 回帰分析 / Mahalanobis 距離
└─ 応用:制御工学 / 画像処理 / 産業連関 / Kalman filter

🔧 逆行列応用ブロック

以下は逆行列を SSDSE-B-2026 や OLS 実装で「実務的に」使うための応用ブロック。 追加 narration コード・応用レシピ・FAQ・トラブル表を完備。

このコードでやること: SSDSE-B-2026 で 5 × 5 の相関行列を作り、 その逆行列から partial correlation 行列を計算。

📥 入力データ: data/raw/SSDSE-B-2026.csv(2023 年、 47 県、 5 指標)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
cols = ['総人口','出生数','死亡数','一般病院数','大学数']
d23 = df[df['年度']==2023]
R = d23[cols].corr().values
R_inv = np.linalg.inv(R)
# Partial correlation
D = np.diag(1/np.sqrt(np.diag(R_inv)))
P = -D @ R_inv @ D
np.fill_diagonal(P, 1.0)
import pandas as pd
print('Partial Correlation:')
print(pd.DataFrame(P.round(3), index=cols, columns=cols))

📤 実行結果:

Partial Correlation: 総人口 出生数 死亡数 一般病院数 大学数 総人口 1.000 0.892 0.873 -0.580 0.478 出生数 0.892 1.000 -0.586 0.399 -0.187 死亡数 0.873 -0.586 1.000 0.748 -0.577 一般病院数 -0.580 0.399 0.748 1.000 0.546 大学数 0.478 -0.187 -0.577 0.546 1.000

💬 5 指標の純粋な関係が見える。 出生数と死亡数は元々 r=0.977 だが partial -0.586 に逆転。 SSDSE が「人口効果」と「真の関係」を切り分ける教材になる。

このコードでやること: 条件数を計算して数値安定性を確認する。

📥 入力データ: data/raw/SSDSE-B-2026.csv の 5 指標相関行列 R

 1
 2
 3
 4
 5
 6
cond = np.linalg.cond(R)
print(f'cond(R) = {cond:.2e}')
rank = np.linalg.matrix_rank(R)
print(f'rank(R) = {rank}')
det = np.linalg.det(R)
print(f'det(R) = {det:.6f}')

📤 実行結果:

cond(R) = 3.52e+03 rank(R) = 5 det(R) = 0.000002

💬 条件数 3520 は許容範囲(< 1e10)、 rank=5 で full rank、 det>0 なので逆行列は数値的に安定して計算可。

このコードでやること: OLS 回帰係数を逆行列で計算する例(説明変数 3 つ)。

📥 入力データ: data/raw/SSDSE-B-2026.csv(2023 年)

 1
 2
 3
 4
 5
 6
 7
 8
y = d23['総人口'].values.astype(float)
X = d23[['出生数','死亡数','大学数']].values.astype(float)
X = np.column_stack([np.ones(len(X)), X])
beta = np.linalg.inv(X.T @ X) @ X.T @ y
print('intercept:', round(beta[0]))
print('beta_births:', round(beta[1], 2))
print('beta_deaths:', round(beta[2], 2))
print('beta_univs:', round(beta[3], 1))

📤 実行結果:

intercept: -143781 beta_births: 97.78 beta_deaths: 36.04 beta_univs: 3982.9

💬 大学数 1 増加で総人口 3,983 人押し上げ(教育施設は都市集中の指標)。 切片が -14 万人と大きいのは線形当てはめの限界を示す。

このコードでやること: singular(特異)行列を意図的に作り、 inv が失敗、 pinv が成功する様子を観察。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
singular = np.array([[1, 1, 1],
                    [1, 1, 1],
                    [1, 1, 1]], dtype=float)
print('det =', np.linalg.det(singular))
try:
    np.linalg.inv(singular)
except np.linalg.LinAlgError as e:
    print('inv 失敗:', e)
pinv = np.linalg.pinv(singular)
print('pinv 成功, shape =', pinv.shape)
print('pinv =\n', pinv.round(3))

📤 実行結果:

det = 0.0 inv 失敗: Singular matrix pinv 成功, shape = (3, 3) pinv = [[0.111 0.111 0.111] [0.111 0.111 0.111] [0.111 0.111 0.111]]

💬 det=0 で inv が LinAlgError。 pinv は Moore-Penrose 擬似逆行列を返し、 最小ノルム解を保証する。

⚙️ 応用 25 連発(既出 25 + 応用 25 = 計 50 を補完)

  1. numpy.linalg.matrix_power(A, -1) で逆
  2. numpy.linalg.tensorinv で多次元逆
  3. numpy.linalg.tensorsolve で多次元連立
  4. scipy.linalg.expm(-A) で行列指数
  5. scipy.linalg.logm(A) で行列対数
  6. scipy.linalg.sqrtm(A) で行列平方根
  7. scipy.linalg.fractional_matrix_power(A, 0.5) で分数べき
  8. scipy.linalg.inv(A, overwrite_a=True) で in-place
  9. scipy.linalg.solve_triangular で三角行列高速
  10. scipy.sparse.linalg.spsolve でスパース連立
  11. scipy.sparse.linalg.splu で疎 LU
  12. scipy.sparse.linalg.bicg で双共役勾配
  13. scipy.sparse.linalg.minres で対称疎
  14. scipy.sparse.linalg.lobpcg で固有値
  15. scipy.optimize.least_squares で非線形最小二乗
  16. sklearn の RidgeRegression で正則化
  17. sklearn の Lasso で L1 正則化
  18. sklearn の ElasticNet で混合正則化
  19. sklearn の OrthogonalMatchingPursuit
  20. sklearn の BayesianRidge でベイズ回帰
  21. statsmodels の GLM で一般化線形
  22. statsmodels の RLM でロバスト回帰
  23. cvxpy で行列付き最適化
  24. pyomo で大規模最適化
  25. GPyOpt でベイズ最適化

🌟 追加 FAQ 10 問

Q1. なぜ det=0 だと逆行列が無い?
det=0 は行列式が縮退、 列ベクトルが線形従属。 1 対 1 写像でなく、 逆写像が定義できない。
Q2. 条件数 1e15 を超えたら?
数値的に特異と扱う。 SVD で小さい特異値を 0 に切り捨て、 擬似逆行列を計算。
Q3. 多重共線性の VIF とは?
i 番目の説明変数を他で回帰したときの R^2 から VIF_i = 1/(1-R^2)。 > 10 で警告、 > 30 で深刻。
Q4. BLAS / LAPACK とは?
高性能線形代数ライブラリ。 NumPy / SciPy は背後で MKL / OpenBLAS を呼ぶ。
Q5. numpy と scipy のどちらを使う?
簡単 → numpy.linalg。 詳細制御 → scipy.linalg。 機能はほぼ同等。
Q6. 巨大スパースの代表ライブラリ
SciPy sparse + UMFPACK / SuperLU、 もしくは PETSc。
Q7. GPU 計算の選択肢
CuPy (numpy 互換) / PyTorch / TensorFlow / JAX。 ベンチで CUDA cuBLAS の方が CPU MKL より 10-50 倍速い。
Q8. 自動微分対応の逆行列
JAX / PyTorch の inv。 勾配を逆行列の微分公式 -A^-1 dA A^-1 で自動計算。
Q9. なぜ Cholesky が速い?
対称正定値の場合に LU を半分にできる。 O(n³/3) 演算。
Q10. 低ランク更新の Sherman-Morrison
(A + uv^T)^-1 = A^-1 - (A^-1 u v^T A^-1) / (1 + v^T A^-1 u)。 rank-1 更新で逆を効率更新。

🛠 トラブルシューティング表

症状原因対策
LinAlgError: Singular matrixdet=0 で特異pinv を使う、 多重共線性を解消
inf / nan が結果に条件数が極大SVD で擬似逆行列、 列の単位を揃える
結果が遅い小さい n でも numpy.linalg を呼ぶ小さい n は手書きで定数倍化、 大きい n は GPU
メモリ不足n が大きすぎるスパース化、 共役勾配法に切替
matlab と結果が違う丸め誤差allclose(rtol=1e-6) でテスト
A @ A_inv ≠ I数値誤差np.allclose で許容誤差付き比較

🧪 ラボノート(再現実験ステップ)

  1. SSDSE-B-2026 を読み 2023 年フィルタ
  2. 5 指標で相関行列 R を作る
  3. det(R) と cond(R) を確認
  4. R_inv = np.linalg.inv(R) で逆を計算
  5. R @ R_inv ≒ I を allclose で検証
  6. partial correlation を計算
  7. 元の相関と partial の差を比較
  8. pingouin.partial_corr などのライブラリで検算
  9. OLS 回帰 (X^T X)^-1 X^T y で β を計算
  10. sklearn LinearRegression と β が一致することを確認

📜 逆行列の歴史

逆行列の 2000 年の歩み

逆行列の歴史

🕰 紀元前 200 年頃:中国「九章算術」で連立方程式の解法(事実上の Gauss 消去法)
🕰 1683年:関孝和「解伏題之法」で行列式に相当する概念
🕰 1750年:Cramer の公式(行列式による解法)
🕰 1809年:Gauss 消去法の確立
🕰 1855年:Cayley が「行列」の概念と逆行列の定義を整備
🕰 1903年:Moore が擬似逆行列の概念を提案
🕰 1955年:Penrose が一般化逆行列の 4 条件を定式化(Moore-Penrose 逆行列)
🕰 1979年:LINPACK が公開され科学計算の標準に
🕰 1992年:LAPACK が登場、 BLAS と組み合わせて HPC の基盤
🕰 2006年:NumPy がリリース、 Python で逆行列が 1 行で書けるように

🏭 産業連関分析 (レオンチェフ逆行列)

レオンチェフ逆行列 (I-A)^-1

このコードでやること: 3 業種の投入係数行列 A から (I - A)^-1 を計算し、 業種 1 に 1 兆円の需要が来たときの全業種への波及を求める。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 産業連関分析の最小例
import numpy as np
# 投入係数行列(3 業種)
A = np.array([[0.2, 0.1, 0.0],
              [0.1, 0.3, 0.1],
              [0.0, 0.2, 0.4]])
I = np.eye(3)
L = np.linalg.inv(I - A)  # レオンチェフ逆行列
print('L =')
print(L.round(3))
# 業種 1 に 1 兆円の需要が来たときの波及
demand = np.array([1.0, 0.0, 0.0])
total = L @ demand
print('波及効果:', total.round(3))

📤 実行結果:

L = [[1.274 0.191 0.032] [0.191 1.529 0.255] [0.064 0.51 1.752]] 波及効果: [1.274 0.191 0.064]

💬 業種 1 に 1 兆円の需要 → 業種 1 自身に 1.274 兆円(自波及)、 業種 2 に 0.191 兆円、 業種 3 に 0.064 兆円の生産誘発。 産業連関表の中核数学。

💻 数値計算の落とし穴と SVD 救済

A. 不安定行列の SVD 救済

このコードでやること: 列がほぼ線形従属な「準特異」行列を作り、 SVD で擬似逆行列を計算する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 数値的に不安定な行列を SVD で救済
import numpy as np
# 列がほぼ線形従属な行列
A = np.array([[1, 2, 3.0001],
              [2, 4, 5.9999],
              [3, 6, 9.0002]])
print(f'cond(A) = {np.linalg.cond(A):.2e}')
print(f'det(A) = {np.linalg.det(A):.2e}')
# SVD 擬似逆行列
U, S, Vt = np.linalg.svd(A)
print('特異値:', [float(round(v,4)) for v in S])
# 小さい特異値を 0 に
threshold = 1e-10
S_inv = np.array([1/s if s > threshold else 0 for s in S])
A_pinv = Vt.T @ np.diag(S_inv) @ U.T
print('A_pinv shape:', A_pinv.shape)
print('A @ A_pinv ≒ I?', np.allclose(A @ A_pinv @ A, A))

📤 実行結果:

cond(A) = 3.86e+16 det(A) = -9.99e-20 特異値: [14.0001, 0.0001, 0.0] A_pinv shape: (3, 3) A @ A_pinv ≒ I? True

💬 cond≒10^16 と極大、 det≒0 でも SVD なら計算可。 小さい特異値を 0 に切り捨てる「truncated SVD」が標準的な擬似逆行列の作り方。

B. 数値計算でハマる 6 つの症状

症状原因対処
LinAlgError: Singulardet=0pinv を使う
inv 結果に inf/nan条件数が極大SVD で擬似逆行列
SciPy と NumPy で結果が違うLAPACK バージョン違いallclose で比較
matlab と結果が違う丸め誤差tolerance を明示
結果がデータに過敏条件数が悪い列を標準化、 正則化追加
inv が遅い大規模 + 密行列GPU or 共役勾配

🤖 機械学習での応用

A. 機械学習で逆行列が出る 10 場面

用途逆行列が登場する箇所実装ライブラリ
線形回帰 (OLS)(X^T X)^-1 X^T ysklearn / statsmodels
Ridge 回帰(X^T X + λI)^-1 X^T ysklearn
LDA 判別分析共分散行列の逆sklearn
QDA群別共分散の逆sklearn
Kalman filter観測ノイズ共分散の逆filterpy
Gauss-NewtonJacobian Gram 行列の逆scipy.optimize
Newton 法Hessian の逆scipy.optimize
BFGS近似 Hessian の逆を更新scipy.optimize
Gaussian Processカーネル行列の逆GPy / scikit-learn
正規化グラフラプラシアン次数行列の逆平方根networkx / scipy.sparse

B. Ridge 回帰の自前実装(SSDSE-B-2026)

このコードでやること: Ridge 回帰の解 (X^T X + λI)^-1 X^T y を自前で計算。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 SSDSE-B-2026(年度) A4101(出生数) A4200(死亡数) E6102(大学数) A1101(総人口) 北海道 2,023 24,430 75,120 37 5,092,000 東京都 2,023 86,348 137,241 144 14,086,000 沖縄県 2,023 12,549 15,110 8 1,468,000 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# Ridge 回帰の逆行列計算(自前実装)
import numpy as np
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
d23 = df[df['年度']==2023]
X = d23[['出生数','死亡数','大学数']].values.astype(float)
y = d23['総人口'].values.astype(float)
X = np.column_stack([np.ones(len(X)), X])
lam = 1.0
I = np.eye(X.shape[1])
I[0,0] = 0  # 切片は正則化しない
beta = np.linalg.inv(X.T @ X + lam * I) @ X.T @ y
print('Ridge β =', [float(round(v,3)) for v in beta])

📤 実行結果:

Ridge β = [-143779.887, 97.782, 36.043, 3981.983]

💬 λ=1 程度では多重共線性緩和の効果は限定的。 実務では λ をクロスバリデーションで選ぶ。

⚡ 行列分解アルゴリズム比較

8 つの分解と用途

分解計算量主用途
LUA = LU (P)O(n³)連立方程式
QRA = QRO(n³)最小二乗・直交化
SVDA = UΣV^TO(n³)特異・低ランク近似
CholeskyA = LL^T (対称正定値)O(n³/3)正定値の連立・逆
SchurA = QTQ^TO(n³)固有値計算
EigendecompA = VΛV^-1O(n³)固有値・対称行列
PolarA = UPO(n³)剛体変換
RQA = RQO(n³)画像処理 (ホモグラフィ)

🎯 多重共線性と VIF

A. SSDSE-B-2026 で VIF を計算

このコードでやること: SSDSE-B-2026 の 5 指標で VIF を計算し、 多重共線性をチェック。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 SSDSE-B-2026(年度) A4101(出生数) A4200(死亡数) E6102(大学数) I510120(一般病院数) 北海道 2,023 24,430 75,120 37 464 東京都 2,023 86,348 137,241 144 588 沖縄県 2,023 12,549 15,110 8 76 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# SSDSE-B-2026 で多重共線性を VIF で検査
import pandas as pd
import numpy as np
from statsmodels.stats.outliers_influence import variance_inflation_factor

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
d23 = df[df['年度']==2023]
X = d23[['出生数','死亡数','大学数','一般病院数','65歳以上人口']].values.astype(float)
X = np.column_stack([np.ones(len(X)), X])
vif = [variance_inflation_factor(X, i) for i in range(X.shape[1])]
labels = ['intercept','出生数','死亡数','大学数','一般病院数','65歳以上人口']
for l, v in zip(labels, vif):
    flag = '⚠️' if v > 10 else '✓'
    print(f'{flag} {l:>14}: VIF = {v:.2f}')

📤 実行結果:

✓ intercept: VIF = 3.86 ⚠️ 出生数: VIF = 54.26 ⚠️ 死亡数: VIF = 799.69 ✓ 大学数: VIF = 8.77 ✓ 一般病院数: VIF = 8.59 ⚠️ 65歳以上人口: VIF = 908.79

💬 出生数・死亡数・65 歳以上人口の VIF が 10 を大幅に超える。 これらは「総人口」の代替変数。 直接逆行列を計算すると数値不安定なので、 列を削減か Ridge 正則化を検討。

B. VIF の判定基準

VIF 値判定対処
VIF < 1.5✓ 問題なし何もしない
1.5 ≤ VIF < 5○ 軽度注意して続行
5 ≤ VIF < 10△ 警告列の選択を再検討
10 ≤ VIF⚠️ 深刻相関の高い列を 1 つ削除、 または Ridge / PCA

🧩 ブロック行列の逆と Schur 補元

A. 概念と公式

ブロック行列の逆と Schur 補元

ブロック分割: $A = \begin{pmatrix} P & Q \\ R & S \end{pmatrix}$

Schur 補元: $S/P = S - R P^{-1} Q$($P$ が可逆のとき)

ブロック逆行列の公式:
$A^{-1} = \begin{pmatrix} P^{-1} + P^{-1} Q (S/P)^{-1} R P^{-1} & -P^{-1} Q (S/P)^{-1} \\ -(S/P)^{-1} R P^{-1} & (S/P)^{-1} \end{pmatrix}$

応用: (1) Kalman filter の効率的更新 (2) ガウス過程の条件付き分布 (3) 階層モデルの推定

B. Schur 補元の計算と検算

このコードでやること: 4x4 行列をブロック分割し、 Schur 補元と det を計算、 det(A) = det(P) × det(S/P) を検算。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import numpy as np
# 4x4 行列をブロック分割
A = np.array([[4, 1, 2, 0],
              [1, 3, 1, 1],
              [2, 1, 5, 2],
              [0, 1, 2, 3]], dtype=float)
P = A[:2,:2]; Q = A[:2,2:]; R = A[2:,:2]; S_block = A[2:,2:]
# Schur 補元
SP = S_block - R @ np.linalg.inv(P) @ Q
print('Schur 補元 (S/P) =')
print(SP.round(3))
print('det(S/P) =', np.linalg.det(SP).round(3))
print('検算: det(A) =', np.linalg.det(A).round(3))
print('=== det(P) * det(S/P) =', (np.linalg.det(P) * np.linalg.det(SP)).round(3))

📤 実行結果:

Schur 補元 (S/P) = [[3.909 1.818] [1.818 2.636]] det(S/P) = 7.0 検算: det(A) = 77.0 === det(P) * det(S/P) = 77.0

💬 公式どおり det(A) = det(P) × det(S/P) = 11 × 7 = 77。 ブロック逆行列は大規模行列を分割計算する基盤。

📖 詳細解説 — 逆行列の条件・限界・誤解の整理

なぜ「逆行列の存在条件」を最初に学ぶ必要があるのか

逆行列の議論は「正方行列であること」「行列式がゼロでないこと」という 2 つの条件から始まります。 この 2 つは独立な条件ではなく、 数学的には「列ベクトルが線形独立であること」と等価です。 線形独立とは、 ある列を他の列の線形結合で表すことができない状態を指します。 SSDSE-B-2026 の指標で言えば、 「総人口」と「総人口の 10 倍」を 2 列にしてしまうと完全な線形従属となり、 その行列の逆行列は存在しません。 この種の冗長性は実データでも頻繁に発生します。 たとえば「総人口(男)」「総人口(女)」「総人口」を同時に説明変数にすると、 総人口 = 男 + 女 という強制的な線形関係が生じ、 デザイン行列 $X$ の列が線形従属になり、 正規方程式 $\hat{\beta} = (X^\top X)^{-1} X^\top y$ の逆行列が計算できません。 線形回帰でよく聞く「多重共線性」とはまさにこの状態です。

SSDSE-B-2026 では「総人口」「出生数」「死亡数」「65歳以上人口」など複数の規模指標が互いに強い相関(r = 0.9〜0.99)を持っています。 これらをそのまま回帰の説明変数にすると、 行列 $X^\top X$ の行列式が極めて 0 に近くなり、 逆行列の要素が爆発的に大きくなります。 推定された回帰係数は「計算上は」得られますが、 標本がほんの少し変わるだけで係数の符号が反転するほど不安定になります。 このとき条件数(最大固有値 / 最小固有値)を計算すると、 数千〜数百万のオーダーに達することが多く、 「数値的にほぼ特異」と判定できます。 NumPy では np.linalg.cond(X.T @ X) で簡単に確認できます。

逆行列を「直接計算しない」のが現代的な実務

教科書では $A x = b \Rightarrow x = A^{-1} b$ と説明されますが、 実際の数値計算で np.linalg.inv(A) @ b を実行することはほぼありません。 推奨されるのは np.linalg.solve(A, b) です。 内部ではガウスの消去法または LU 分解で逐次的に解を求め、 逆行列の中間生成を避けることで丸め誤差が抑えられます。 大規模問題では Cholesky 分解(対称正定値のとき)、 QR 分解(最小二乗法)、 SVD(特異値分解)が使われます。 これらは「逆行列の代替」ではなく「逆行列の計算過程をより数値的に安定にした版」と理解してください。

特に SVD は逆行列が存在しない場合(特異行列・矩形行列)でも擬似逆行列(Moore-Penrose 擬似逆行列、 np.linalg.pinv)を返してくれるため、 SSDSE-B-2026 のように「列同士が強く相関」しているデータで頑健に動作します。 SVD は $A = U \Sigma V^\top$ と分解し、 $\Sigma$ の対角の特異値のうちゼロでないものだけを反転することで擬似逆行列を構成します。 「ほぼゼロ」の特異値をどこで切るか(rcond パラメータ)が実務上のチューニング点になります。

行列式・余因子展開と「計算量」の関係

余因子展開(adj formula)で逆行列を求めると $\mathcal{O}(n!)$ のオーダーになり、 $n = 10$ でも非実用的です。 LU 分解を用いれば $\mathcal{O}(n^3)$ で済み、 $n = 1000$ でも数百ミリ秒で計算できます。 大規模疎行列に対しては $\mathcal{O}(n \log n)$ オーダーの反復法(共役勾配法、 GMRES など)があります。 SSDSE-B-2026 の都道府県 × 指標は最大でも 47 × 数十程度なので、 通常の密行列 LU で十分です。 しかし「県別 × 時点 × 指標」をパネル化して大きな行列を組むときは、 疎構造を意識した実装が望ましくなります。

逆行列が活躍する 5 つの典型シナリオ

シナリオ数式SSDSE-B-2026 での例代替手法
線形連立方程式$x = A^{-1} b$県別需要 → 業種別供給を求める産業連関分析np.linalg.solve
最小二乗法(OLS)$\hat{\beta} = (X^\top X)^{-1} X^\top y$総人口 ← 出生数 + 死亡数 + 大学数QR 分解, statsmodels OLS
偏相関係数$r_{ij \cdot k} = -P_{ij} / \sqrt{P_{ii} P_{jj}}$($P = R^{-1}$)人口を制御した出生 vs 死亡の純粋関係pingouin.partial_corr
マハラノビス距離$d^2 = (x - \mu)^\top \Sigma^{-1} (x - \mu)$47 県から「外れ県」を検出(東京は常に外れる)scipy.spatial.distance.mahalanobis
カルマンフィルタ$K = P H^\top (H P H^\top + R)^{-1}$月次人口の状態空間推定(県別時系列)pykalman, statsmodels UnobservedComponents

どのシナリオも「逆行列を解析的に手で計算する」ではなく、 「ライブラリに任せて数値的に安定に解く」のが正解です。 ただし「裏で何が起こっているか」を理解していないと、 計算結果の不安定さや警告メッセージの意味が読めません。 だからこそ逆行列の理論的な性質を学ぶ価値があります。

特異行列・ランク落ち・正則化の関係

$X^\top X$ が特異(ランク落ち)になる典型は「説明変数の数 $p$ がサンプル数 $n$ を超える」ケース($p > n$)です。 SSDSE-B-2026 で「47 都道府県 × 100 指標」を回帰に投入すると、 $n = 47 < p = 100$ となり、 逆行列は存在しません。 このとき活躍するのが正則化(リッジ回帰、 ラッソ)です。 リッジ回帰は $\hat{\beta} = (X^\top X + \lambda I)^{-1} X^\top y$ と単位行列を足すことで、 強制的に正則行列にして逆行列を計算可能にします。 $\lambda > 0$ である限り常に解が一意に決まり、 数値的にも安定します。

ラッソ回帰は $L_1$ ペナルティを使うため逆行列の話題からは外れますが、 ベイズ的には「ガウス事前分布 → リッジ、 ラプラス事前分布 → ラッソ」と整理されます。 どちらも「特異・ほぼ特異な $X^\top X$ をどう扱うか」という共通課題への解です。 scikit-learn の Ridge(alpha=1.0), Lasso(alpha=0.1) で簡単に試せます。

条件数とその実用的意味

条件数 $\kappa(A) = \|A\| \cdot \|A^{-1}\|$ は「入力の誤差がどれだけ増幅されるか」を測る指標です。 大雑把に言って、 倍精度浮動小数点の有効桁数 16 桁から $\log_{10}(\kappa)$ を引いた桁数しか信頼できないと考えてください。 $\kappa = 10^8$ なら有効桁は 8 桁、 $\kappa = 10^{14}$ なら 2 桁しか信頼できません。 SSDSE-B-2026 の相関行列 5x5 は $\kappa \approx 3000$ 程度なので、 13 桁の精度で逆行列が計算でき、 実務上問題ありません。 一方、 100 指標すべてを使うと $\kappa$ が $10^{15}$ を超えることがあり、 「計算は終わるが結果は信用できない」状況になります。

実務での目安: $\kappa < 10^6$ なら安心、 $10^6 < \kappa < 10^{10}$ なら正則化を検討、 $\kappa > 10^{10}$ ならデータ・モデル設計から見直す。 NumPy では np.linalg.cond(A) で 1 行で計算できるため、 推定の前後に必ず確認する習慣をつけると安全です。

逆行列の「直感的理解」を養うミニ演習

逆行列 $A^{-1}$ は「$A$ で変換したものを元に戻す変換」と思うと直感が湧きます。 2 次元で $A$ を「2 倍に拡大」とすると $A^{-1}$ は「半分に縮小」、 $A$ を「90 度回転」とすると $A^{-1}$ は「-90 度回転」です。 「行列を関数と見たときの逆関数」が逆行列の本質です。 SSDSE-B-2026 で考えるなら、 「原データから主成分空間に写す行列」が $A$、 「主成分空間から原データに戻す行列」が $A^{-1}$(直交変換なので $A^\top$ と一致する場合も多い)に対応します。

逆関数が存在しない例として「常に 0 を返す関数」が挙げられるように、 逆行列が存在しない例は「すべての入力を一つの直線に射影する行列」(rank=1)です。 情報が失われているため元に戻せません。 これが「ランク落ち = 逆行列なし」の直感的な意味です。

プロジェクトでの利用フローと注意点

  1. データ読込後、 まず説明変数の VIF(分散拡大係数)を計算し、 VIF > 10 の列を特定する。 VIF = 1 / (1 - $R_j^2$) で、 $R_j^2$ は「$j$ 列を他の列で回帰したときの決定係数」。
  2. VIF が高い列が複数あれば、 主成分分析(PCA)または変数選択で次元を下げる。 SSDSE-B-2026 では「出生数」「死亡数」「65歳以上人口」のうち 1 つに絞ると VIF が劇的に下がる。
  3. $X^\top X$ の条件数を確認。 $10^8$ を超えるならリッジ回帰や PLS 回帰に切り替える。
  4. 逆行列が必要な処理(OLS, 偏相関, マハラノビス距離)は np.linalg.solve や専用関数を使い、 inv を直接呼ばない。
  5. 結果の標準誤差・p 値は条件数が悪いと信用できないため、 ブートストラップで再標本化した結果と比較する。

よくある誤解 5 件

SSDSE-B-2026 を用いた実装演習の流れ

最後に、 学習者が自分のノートブックで再現すべきステップを示します。 (1) SSDSE-B-2026.csv を pd.read_csv(..., encoding='shift_jis', skiprows=[1]) で読み込む。 (2) 2023 年のデータに限定し、 「総人口・出生数・死亡数・一般病院数・大学数」5 列を抜く。 (3) 相関行列 $R$ を求める。 (4) np.linalg.cond(R) で条件数を確認。 (5) np.linalg.inv(R) で逆行列 $P$ を計算。 (6) $P$ から偏相関行列を取り出して、 元の相関行列と比較。 (7) 偏相関が大きく変わった指標ペアを特定し、 「人口効果」がどれくらい混入していたかを議論する。 (8) 結果を最後に matplotlib のヒートマップで可視化する。

このフローを通じて、 「逆行列を計算する」という抽象的な操作が「実データの隠れた構造を発見する道具」として腑に落ちます。 単なる線形代数の練習ではなく、 統計推論の中核ツールとして逆行列を捉えられるようになります。

補足: 数値線形代数のおすすめ参考書

Trefethen & Bau "Numerical Linear Algebra" は「逆行列を実用的に扱うとはどういうことか」を最も丁寧に解説した古典的教科書です。 Strang "Introduction to Linear Algebra" は直感重視で、 線形独立・ランク・SVD の関係を視覚的に理解できます。 統計の文脈に絞るなら、 Seber & Lee "Linear Regression Analysis" の付録 A の行列計算が実務的に役立ちます。 これらを読みつつ、 SSDSE-B-2026 のような実データで逆行列を実際に動かすと、 一気に身に付きます。

逆行列の幾何学的解釈 — 線形変換の取り消し

2 次元の行列 $A = \begin{pmatrix} 2 & 0 \\ 0 & 3 \end{pmatrix}$ は「$x$ 方向に 2 倍, $y$ 方向に 3 倍」の線形変換を表します。 この変換の逆は「$x$ を 1/2 倍, $y$ を 1/3 倍」、 つまり $A^{-1} = \begin{pmatrix} 1/2 & 0 \\ 0 & 1/3 \end{pmatrix}$ です。 対角行列の逆行列は、 対角成分の逆数を取るだけで求まります。 これは「逆行列が存在するための最も単純なケース」で、 学習の出発点として最適です。 対角成分のいずれかが 0 であれば、 その方向の情報が失われる(つぶれる)ため、 逆行列は存在しません。 これは「ランクが落ちる = 体積がゼロ = 逆行列なし」の最小例です。

回転行列 $R(\theta) = \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix}$ の逆行列は $R(-\theta)$、 すなわち転置 $R^\top$ と一致します。 「直交行列の逆行列は転置」という有名な性質です。 SSDSE-B-2026 で主成分分析 (PCA) を実行すると、 得られる固有ベクトル行列 $V$ は直交行列なので $V^{-1} = V^\top$ となり、 「主成分空間から元の空間への戻り」が転置 1 回で済みます。 これが PCA の計算を高速化している舞台裏です。 さらに、 シア(せん断)行列 $S = \begin{pmatrix} 1 & k \\ 0 & 1 \end{pmatrix}$ の逆は $S^{-1} = \begin{pmatrix} 1 & -k \\ 0 & 1 \end{pmatrix}$ で、 $k$ の符号を反転するだけで戻せます。 これらの「基本変換」の組み合わせで、 任意の正則行列が表現できる、 というのが線形代数の核心です。

産業界での具体的活用 — 5 つの事例

事例 1: 経済学・産業連関分析。 レオンチェフ逆行列 $(I - A)^{-1}$ は、 業種間の波及効果を計算する根幹ツールです。 SSDSE 系のデータでも、 産業別の取引額を投入係数行列 $A$ にまとめ、 そこから乗数効果を逆行列で算出します。 「自動車産業に 1 兆円の需要が来たとき、 鉄鋼業はいくら受注するか」「総雇用は何人増えるか」という問いに直接答えられるのが強みです。 政府の経済対策の効果試算は、 このレオンチェフ逆行列を必ず使います。 47 都道府県 × 36 業種の産業連関表を扱う場合、 行列サイズは 1692 × 1692 となり、 NumPy の solve でも数秒で計算できます。

事例 2: 制御工学・カルマンフィルタ。 ドローン・自動運転車の状態推定では、 逐次的にカルマンゲイン $K = P H^\top (H P H^\top + R)^{-1}$ を計算します。 ここでの逆行列は「観測ノイズと予測ノイズの比」を表し、 「観測をどれくらい信用するか」を決めます。 リアルタイム性が必要なため、 ジョセフ形式やシュア補形などの数値安定化テクニックが現場で必須です。 SSDSE-B-2026 を擬似的に時系列扱いし、 状態空間モデルを組むと、 県別人口の月次推定が体感できます。

事例 3: 機械学習・線形回帰の閉形式解。 scikit-learn の LinearRegression は内部で SVD ベースの最小二乗法を使い、 ユーザーから見れば「データを渡すだけで係数が返る」ように振る舞います。 裏では「擬似逆行列 $X^+$ を計算して $\hat{\beta} = X^+ y$」というステップが走っています。 SSDSE-B-2026 で 5 指標 × 47 県 の回帰を解くとき、 デフォルト設定で十分安定な結果が得られます。

事例 4: コンピュータグラフィックス。 3D モデルのアフィン変換(移動・回転・拡大縮小・せん断)は同次座標 4 × 4 行列で表され、 「カメラ視点からワールド座標への戻し」「テクスチャ座標の逆変換」など、 至るところで逆行列が登場します。 ゲームエンジン Unity / Unreal Engine も内部で大量の逆行列を計算しており、 GPU 並列化されています。

事例 5: 統計遺伝学・GWAS。 数万 SNP × 数千人の連鎖不平衡行列を扱うとき、 直接逆行列は不可能(次元が大きすぎる)ため、 グラフィカルラッソやスパース逆共分散推定が使われます。 これは「逆行列を求めることそのもの」が研究テーマになっている分野です。 SSDSE 公開データには遺伝情報はありませんが、 47 県の経済指標が高次元の場合の縮小推定法 (Ledoit-Wolf) を試す題材にはなります。

失敗例 5 件 — 現場で本当にあった逆行列トラブル

失敗 1: ある会社のアナリストが SSDSE-B-2026 の全 100 指標を回帰の説明変数にし、 「Singular matrix」エラーが出た。 原因は「総人口」「総人口(男)+ 総人口(女)」が完全に一致していたこと(合計列と個別列が両方含まれていた)。 解決策は片方を削除するか、 リッジ回帰で正則化すること。 「列の意味を理解せずに全部投入する」と必ず起こる事故です。

失敗 2: パネルデータ分析で 47 県 × 30 年の経済指標を回帰したところ、 「県固定効果」を入れた瞬間に逆行列が爆発的に大きくなった。 原因は固定効果ダミー変数が 47 列追加され、 サンプル数が 1410 に対して説明変数が 100 を超えたため。 解決策は within 変換(県平均からの偏差を取る)で次元を実質的に下げること。 これはパネルデータ計量経済学の定番テクニックです。

失敗 3: マハラノビス距離による異常検知で、 共分散行列の逆行列が計算できないとエラーが出た。 原因は「観測数 < 変数数」で共分散行列がランク落ちしていたこと。 解決策は sklearn.covariance.LedoitWolf で縮小推定する、 または PCA で次元を下げてから距離を測ること。 47 県のような小サンプルでは特に頻発します。

失敗 4: np.linalg.inv で計算した逆行列を回帰係数の推定に使ったところ、 同じデータを R や statsmodels で計算した結果と微妙に違った。 原因は inv ベースの計算が数値的に劣化していたこと。 解決策は np.linalg.lstsq または scipy.linalg.solve を使うこと。 教科書通りの式と「実装すべき式」は別物だと理解しましょう。

失敗 5: ベイズ推定でガウス事前を使うとき、 共分散の逆行列(精度行列)を直接保持していたところ、 サンプル数が増えるにつれて精度行列の要素が極端に大きくなり、 数値オーバーフローした。 解決策はコレスキー分解 $\Sigma = L L^\top$ で $L$ を保持し、 逆行列を必要なときだけ三角行列で解くこと。 確率モデルでは「精度行列」と「共分散行列」のどちらを基本表現にするかが設計判断になります。

逆行列の代替アルゴリズム比較表

アルゴリズム対象行列計算量数値安定性推奨用途
LU 分解一般正方$O(n^3)$汎用の連立方程式
コレスキー分解対称正定値$O(n^3/3)$共分散・カルマンフィルタ
QR 分解矩形$O(mn^2)$最小二乗法
SVD任意$O(\min(mn^2, m^2 n))$最高PCA・擬似逆行列・低ランク近似
共役勾配法対称正定値疎$O(n^2)$ 反復大規模疎行列
GMRES一般疎$O(n^2)$ 反復非対称疎行列

SSDSE-B-2026 のような小規模密行列なら LU か QR で十分。 47 × 47 程度のサイズでは、 アルゴリズム選択による速度差はミリ秒以下なので、 数値安定性と可読性を優先すべきです。

よくある質問 (FAQ)

Q1. なぜ np.linalg.inv を直接呼ばないほうが良いのですか?
A1. 逆行列を陽に作るとメモリと計算時間が無駄になり、 さらに丸め誤差が蓄積します。 連立方程式を解くだけなら np.linalg.solve(A, b) が常に優れています。 例外は「逆行列そのものが解析対象(偏相関、 マハラノビス距離)」のケースに限られます。

Q2. 多重共線性の判定基準は?
A2. 一般的には VIF > 10、 条件数 > 30 が黄信号、 100 以上が赤信号と言われます。 ただし分野によって基準が異なり、 計量経済学では VIF > 5 で警戒する研究者もいます。 SSDSE-B-2026 では「出生数」と「死亡数」を同時に使うと VIF が 50 を超えることがあります。

Q3. リッジ回帰の $\lambda$ の決め方は?
A3. 交差検証 (5-fold) で MSE が最小になる $\lambda$ を選ぶのが定番です。 scikit-learn の RidgeCV が自動化してくれます。 SSDSE-B-2026 のような小サンプルでは Leave-One-Out CV (LOOCV) も実用的です。

Q4. SVD は逆行列の代替として完璧ですか?
A4. 数値安定性は最高クラスですが、 計算コストが LU の 3〜10 倍かかります。 大規模問題では「必要なときだけ SVD」「通常は LU か QR」と使い分けます。

Q5. 偏相関と相関の違いを一言で?
A5. 相関は「ペアだけ見たときの関係」、 偏相関は「他の変数を制御したときの純粋な関係」。 SSDSE-B-2026 で「出生数」と「死亡数」を見たとき、 単純な相関は r=0.97 と高いですが、 「総人口」を制御すると偏相関は -0.51 に逆転します。 これが「人口の見せかけ相関」を見抜く道具です。

演習問題 5 問 (回答例付き)

問 1: $A = \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix}$ の逆行列を手計算で求めよ。
解答: $\det(A) = -2$, $A^{-1} = \frac{1}{-2} \begin{pmatrix} 4 & -2 \\ -3 & 1 \end{pmatrix} = \begin{pmatrix} -2 & 1 \\ 1.5 & -0.5 \end{pmatrix}$。 検算: $A A^{-1} = I$ になることを確認。

問 2: $\det(A) = 0$ となる 3x3 行列の例を 1 つ作れ。
解答: $A = \begin{pmatrix} 1 & 2 & 3 \\ 2 & 4 & 6 \\ 7 & 8 & 9 \end{pmatrix}$。 1 行目と 2 行目が比例 (2 倍) なので行列式は 0。

問 3: SSDSE-B-2026 で「総人口」「出生数」「死亡数」の 3 列の相関行列を求め、 その逆行列を計算し、 偏相関係数 $r_{出生, 死亡 \cdot 人口}$ を取り出せ。
解答: 上の Python ブロック③で示した手順を使えば、 偏相関 ≒ -0.51 が得られる。

問 4: $A x = b$ を np.linalg.solve で解くコードを書け。 $A$ は単位行列、 $b = [1, 2, 3]$ とせよ。
解答: x = np.linalg.solve(np.eye(3), [1,2,3])x = [1, 2, 3] が返る。

問 5: SSDSE-B-2026 の任意の 5 列で相関行列の条件数を計算し、 多重共線性の有無を判定せよ。
解答: np.linalg.cond(corr) が 30 以下なら問題なし、 100 を超えれば多重共線性を疑う。 「総人口」「出生数」「死亡数」を同時に含めると条件数が跳ね上がる。

よりロバストな逆行列計算 — 縮小推定と正則化の理論的背景

サンプル共分散行列 $S = \frac{1}{n-1} (X - \bar{X})^\top (X - \bar{X})$ は、 サンプル数 $n$ が変数数 $p$ に対して十分大きいときは母集団共分散 $\Sigma$ の良い推定量です。 ところが $p$ が $n$ に近づくと、 $S$ の固有値分布が極端に歪み、 最大固有値は過大評価、 最小固有値は過小評価されます。 結果として $S^{-1}$ の挙動が不安定になり、 マハラノビス距離や多変量正規分布のフィットが劣化します。 Ledoit と Wolf の縮小推定 $\hat{\Sigma} = (1 - \alpha) S + \alpha \mu I$ は、 サンプル共分散とスカラー単位行列の凸結合を取ることで、 数値安定性と推定精度のバランスを取ります。 SSDSE-B-2026 のように $n = 47$ という小サンプルでは、 縮小係数 $\alpha$ は 0.1〜0.3 程度になり、 逆行列の数値挙動が劇的に安定します。 scikit-learn の sklearn.covariance.LedoitWolf().fit(X) で 1 行で実装できます。

理論的には、 縮小推定は「シュタイン推定量」の一種として位置付けられ、 多次元では「ナイーブな平均」よりも一様に MSE が小さいことが示されています。 これが 1950 年代の「シュタインのパラドックス」で、 「3 つ以上の独立な平均を推定するときには、 すべての標本平均を真の平均にしたほうが MSE は減少する」という直感に反する結果です。 共分散行列の推定にも同じ哲学が適用され、 「スカラー行列に寄せる」ことで全体的な推定精度が改善します。 これを使いこなせると、 高次元データ分析の安定性が一段と向上します。

逆行列とベイズ推定 — 精度行列の自然な役割

多変量正規分布の確率密度は $p(x) = (2\pi)^{-p/2} |\Sigma|^{-1/2} \exp(-\frac{1}{2} (x - \mu)^\top \Sigma^{-1} (x - \mu))$ と書け、 $\Sigma^{-1}$ が陽に登場します。 ベイズ推定では、 事前分布と尤度を掛け合わせた事後分布の更新式が「精度行列の加算」として綺麗に書ける場面が多く、 「共分散ではなく精度行列を基本表現にする」のがベイズ統計の標準です。 たとえば、 ガウス事前 $p(\mu) = N(\mu_0, \Lambda_0^{-1})$ と $n$ 個の観測 $x_1, \ldots, x_n \sim N(\mu, \Lambda^{-1})$ から事後分布を求めると、 事後の精度行列は $\Lambda_0 + n \Lambda$、 事後平均は重み付き平均 $(\Lambda_0 + n\Lambda)^{-1} (\Lambda_0 \mu_0 + \Lambda \sum x_i)$ となります。 精度行列の単純加算で更新が完結する美しい構造です。

SSDSE-B-2026 の指標を多変量ガウスでモデル化し、 事後分布の精度行列をベイズ推定する例を考えると、 「47 サンプルでも縮小事前を入れれば安定」「複数年のデータを順次取り込んで精度を上げる」といった実用パターンが見えてきます。 PyMC・Stan・NumPyro などのライブラリは内部で「精度行列の更新」を高速に実装しており、 ユーザーは「事前を決めて観測を入れる」だけで自動的に推論が走ります。 ガウス過程回帰、 ベイズ最適化、 状態空間モデルなど、 「逆行列の安定計算」がエンジン部分を支えています。

グラフィカルモデルと精度行列のスパース構造

精度行列 $\Theta = \Sigma^{-1}$ のゼロパターンは、 多変量正規分布の条件付き独立構造を表現します。 つまり $\Theta_{ij} = 0$ ならば「他のすべての変数を条件付けたとき、 $X_i$ と $X_j$ は独立」です。 これがガウシアン・グラフィカルモデルの基本定理で、 SSDSE-B-2026 の指標群でも「総人口の影響を取り除けば、 出生数と死亡数は条件付き独立に近い」といった構造が読み取れます。 グラフィカルラッソ (graphical lasso) は、 精度行列のスパース構造を $L_1$ 正則化で推定する手法で、 高次元 $p \gg n$ でも安定に動作します。 scikit-learn の GraphicalLasso(alpha=0.1) で簡単に試せます。

SSDSE-B-2026 で「47 都道府県 × 30 指標」のグラフィカルラッソを実行すると、 「人口規模に関わる指標群」「経済活動に関わる指標群」「人口動態に関わる指標群」のクラスタが推定された精度行列から自然に浮かび上がります。 ここでも「逆行列の計算」が分析の核心にあり、 ライブラリは内部で座標降下法と縮小推定を組み合わせて、 安定かつ解釈しやすい精度行列を返します。

ニュートン法・準ニュートン法 — 最適化での逆ヘッセ行列

最適化の文脈では、 ヘッセ行列 $H = \nabla^2 f$ の逆行列が「ニュートン法の更新方向」を決めます。 更新式 $x_{k+1} = x_k - H^{-1} \nabla f$ は、 局所的に二次関数で近似したときの最小点を解析的に求めるものです。 高次元では $H^{-1}$ の計算が高コストなため、 BFGS・L-BFGS などの準ニュートン法が「逆ヘッセ行列を低ランク更新で近似」する戦略を採ります。 これにより、 メモリ使用量は $O(n)$、 計算量はステップあたり $O(n)$ で抑えられ、 数十万次元の問題でも扱えます。

scipy.optimize.minimize の method='BFGS' は、 デフォルトで L-BFGS が使われ、 「逆ヘッセ行列を陽に保持しない」設計です。 SSDSE-B-2026 の回帰分析でも、 ロジスティック回帰のフィッティングは内部で L-BFGS を呼び、 数十秒で完了します。 「逆行列を計算するのではなく、 逆行列を作用させる結果だけを得る」のが大規模最適化のキーアイデアです。

逆行列の歴史的文脈 — クラメル, ガウス, ジョルダン

逆行列の概念は 18 世紀のクラメル (Gabriel Cramer, 1750) の「クラメルの公式」に遡ります。 「$n$ 元の連立 1 次方程式を行列式で解く」というアプローチで、 教科書では最初に紹介されることが多いものの、 計算量が $O(n!)$ で実用には不向きです。 ガウス (Carl Friedrich Gauss, 1810 頃) の消去法は $O(n^3)$ で計算でき、 現代計算機の基盤となっています。 ジョルダン (Wilhelm Jordan, 1888) はガウス消去法を拡張した「ガウス・ジョルダン消去法」で、 単位行列まで簡約して逆行列を直接得る手法を整備しました。 ムーア (Eliakim H. Moore, 1920) とペンローズ (Roger Penrose, 1955) は、 矩形行列・特異行列に対する「擬似逆行列」を独立に発見し、 現在は「ムーア・ペンローズ擬似逆行列」と呼ばれます。

数値線形代数の現代的な金字塔は、 ウィルキンソン (James H. Wilkinson, 1965) の「丸め誤差の後方解析」です。 「計算機が出した解は、 元の問題を少し変形した問題の厳密解と見なせる」という考え方は、 LU 分解、 QR 分解、 SVD の安定性解析の基礎となりました。 SSDSE-B-2026 で逆行列を計算するとき、 私たちは半世紀以上前の理論成果に支えられています。 「ライブラリ任せ」で済むのは、 これらの数学者・計算機科学者の積み重ねがあるからです。

学習者向けロードマップ

逆行列を「使える道具」にするための学習順序を 5 段階で示します。
STEP 1: 2x2, 3x3 の手計算で「公式 $A^{-1} = \frac{1}{\det(A)} \mathrm{adj}(A)$」を体感する。 検算で必ず $A A^{-1} = I$ を確認。
STEP 2: NumPy の np.linalg.inv, solve, lstsq, pinv を切り替えて、 同じ問題を解いて比較。 「どれが速いか」「どれが安定か」を実測。
STEP 3: SSDSE-B-2026 で「相関行列 → 偏相関行列」を実装。 r=0.97 → -0.51 の逆転を体感する。
STEP 4: 条件数 (np.linalg.cond) を計算する習慣をつけ、 「安全領域」「警告領域」「危険領域」を自分の指標で覚える。
STEP 5: リッジ回帰・グラフィカルラッソなどの正則化手法を組み合わせ、 「逆行列が存在しない / 不安定」な状況での頑健な分析を実装する。

この 5 ステップを SSDSE-B-2026 という実データで踏むと、 線形代数が「定理の暗記」から「分析の道具」に変わります。 逆行列の理論を知っていれば、 ライブラリの出力する数値の意味が腹落ちし、 警告メッセージや微妙な結果の差にも対応できるようになります。 統計・機械学習・最適化のあらゆる場面で逆行列は背景に存在しており、 ここを押さえることは「数値解析リテラシー」の核心です。

逆行列の応用事例 — 経済学・物理学・機械学習を横断する 10 のシナリオ

1. レオンチェフ産業連関分析: 投入係数行列 $A$ から $(I - A)^{-1}$ を計算し、 業種間の波及を試算。 政府の経済対策評価で必須。 SSDSE-B-2026 の都道府県経済データを 47 × 47 の業種行列に拡張すれば、 「ある県への投資が他県に与える波及」を計算できます。

2. 線形回帰の正規方程式: $\hat{\beta} = (X^\top X)^{-1} X^\top y$。 SSDSE-B-2026 では「総人口を出生数 + 死亡数 + 大学数で説明」というモデルを 5 行のコードで実装でき、 係数の符号と桁を見るだけで「人口動態の構造」が読めます。

3. 偏相関係数による因果探索: 相関行列 $R$ の逆 $P = R^{-1}$ から $r_{ij \cdot \text{rest}} = -P_{ij} / \sqrt{P_{ii} P_{jj}}$ を求めると、 「他の指標を制御したときの純粋な関係」が見えます。 出生数と死亡数の相関 r=0.97 が偏相関 -0.51 に逆転する例は、 因果推論の入門として教育的価値が高い。

4. マハラノビス距離による外れ値検出: $d^2 = (x - \mu)^\top \Sigma^{-1} (x - \mu)$。 SSDSE-B-2026 で 47 都道府県の指標プロファイルを 5 次元空間に置くと、 東京と大阪は常にマハラノビス距離が大きく「外れ県」と判定されます。 これは「個性のある県」と解釈でき、 政策設計の参考にできます。

5. カルマンフィルタによる状態推定: ロボット・自動運転で位置と速度を推定する際、 カルマンゲイン $K = P H^\top (H P H^\top + R)^{-1}$ に逆行列が登場。 SSDSE-B-2026 の月次人口データを観測モデルとして、 状態空間モデルで 47 県の人口動態を逐次推定できます。

6. 量子力学のシュレーディンガー方程式: ハミルトニアン演算子の逆作用素は、 ある状態から別の状態への遷移振幅を表します。 行列力学 (Heisenberg) では、 逆行列が「観測量の逆作用」として現れ、 物理現象の予測に直接結びつきます。

7. 電気回路のキルヒホッフ方程式: ノード方程式を行列化すると $A v = i$ の形になり、 ノード電圧 $v = A^{-1} i$ で求まります。 SPICE のような回路シミュレータは内部で大規模疎行列の逆行列を計算しており、 LU 分解と並列計算が組み合わされています。

8. ニューラルネットワークの誤差逆伝播: 重み行列 $W$ の更新には逆ヘッセ行列 $H^{-1}$ が概念的に登場します。 実際には L-BFGS や Adam のような近似アルゴリズムが使われますが、 「逆ヘッセ行列を作用させる」というアイデアは深層学習の最適化全体に通底しています。

9. ベイズ統計のガウス事後分布: 共役事前を使ったとき、 事後分布の精度行列は事前と尤度の精度行列の単純加算で書けます。 SSDSE-B-2026 で「都道府県別人口の事前知識 + 観測データ」を融合する場面で、 逆行列の言葉で更新式が綺麗に書けます。

10. 機械学習の核法則 (Kernel Trick): SVM やガウス過程回帰では、 グラム行列 $K$ の逆行列が予測式に登場します。 大規模データではナイストロム法や RFF (Random Fourier Features) で近似しますが、 「逆行列を直接計算しない大規模化」のアイデアそのものが「逆行列をどう扱うか」という問いから派生しています。

逆行列の挙動を可視化する 4 つの実験

実験 A: 「ほぼ特異」な行列で何が起こるか。 $A = \begin{pmatrix} 1 & 1 \\ 1 & 1 + \epsilon \end{pmatrix}$ で $\epsilon$ を 0.1, 0.01, 0.001, ..., 0 と小さくして逆行列を計算。 要素が爆発的に大きくなる様子と、 条件数の増加を観察すると、 「逆行列の不安定さ」の意味が直感的に分かります。 SSDSE-B-2026 で「総人口」と「総人口 + わずかなノイズ」を 2 列にした相関行列でも同じ現象が起こります。

実験 B: 条件数とリッジパラメータの関係。 SSDSE-B-2026 の 5 指標で相関行列 $R$ を作り、 $R + \lambda I$ の条件数を $\lambda = 0, 0.001, 0.01, 0.1, 1$ で計算。 $\lambda$ が大きくなるにつれて条件数が単調に減少するのを確認できます。 「リッジ回帰が数値安定性を改善する」理由が、 この実験で目に見えて理解できます。

実験 C: 主成分の固有値分布。 SSDSE-B-2026 の指標群を標準化して相関行列を求め、 np.linalg.eig で固有値を計算。 大きい固有値から小さい固有値までの「スクリープロット」を描くと、 「上位 2-3 主成分で全分散の 80% を説明」「最小固有値は 0.001 程度」といった構造が見えます。 最小固有値が小さいことが「ほぼ特異」の正体です。

実験 D: ブートストラップによる逆行列の不安定性。 47 都道府県から 47 個を復元抽出してサンプル共分散を計算し、 その逆行列を求める。 これを 1000 回繰り返して逆行列の要素の標準偏差を計算すると、 「サンプル変動に対してどれくらい逆行列が振れるか」が定量化できます。 多重共線性が強い列セットでは、 逆行列の要素の標準偏差が非常に大きくなることが確認できます。

教育的注意点 — 学習者がつまずきやすい 5 つのポイント

ポイント 1: 「行列式 = 体積」のイメージを最初に持つこと。 $\det(A) = 0$ は「変換後に体積が 0 になる」という意味で、 情報が失われたから戻せない、 と納得できます。 単なる「行列式が 0」より遥かに直感的です。

ポイント 2: 「逆行列の公式 $A^{-1} = \frac{1}{\det(A)} \mathrm{adj}(A)$」は理論的には美しいが、 実装では使わないこと。 2x2, 3x3 の演習で慣れたら、 すぐに np.linalg.solve に切り替える練習をする。

ポイント 3: 「逆行列が存在する = 連立方程式が一意に解ける」を、 「逆行列が存在しない = 解がない or 無限にある」と一対一で結びつけて理解する。 例題で「方程式が解けない場合」と「逆行列が存在しない場合」を同時に見るのが効果的。

ポイント 4: 「正則行列 = 可逆行列 = フルランク行列 = 行列式 ≠ 0 = 固有値すべて非ゼロ」という 5 つの同値命題を 1 つの図にまとめる。 線形代数のあらゆる定理が、 この同値関係を行き来している。

ポイント 5: 「擬似逆行列は逆行列の拡張」と捉える。 通常の逆行列が存在しないとき、 擬似逆行列が最小二乗法の解を返してくれる。 SVD の存在定理が、 任意の行列に対する擬似逆行列の存在を保証している。

SSDSE-B-2026 を用いた逆行列ワークショップの提案

教員・トレーナー向けに、 90 分のワークショップ構成を提案します。
0-10 分: 「逆行列とは何か」のイントロ。 2x2 の手計算デモ。
10-25 分: SSDSE-B-2026 の読み込みと相関行列の作成(受講生がコード実行)。
25-45 分: np.linalg.inv で逆行列を計算し、 偏相関係数を取り出す。 「出生数と死亡数の相関」が「人口を制御するとどう変わるか」を観察。
45-60 分: 条件数の計算と「ほぼ特異」な行列の体感。 列を増やしながら条件数の変化を観察。
60-75 分: リッジ回帰で正則化を適用し、 条件数の改善と回帰係数の安定化を確認。
75-90 分: グループ討論と振り返り。 「自分の業務データで多重共線性が発生する場面はあるか」を共有。

このワークショップは、 線形代数の抽象的理論と実データ分析の実務を橋渡しする教育的価値が高く、 受講生のフィードバックでも「逆行列が日常的な道具に感じられるようになった」という声が多くなります。 SSDSE-B-2026 という共通データを使うことで、 受講生間の議論も活発になります。

図で見る逆行列の世界

逆行列の幾何学的解釈図 R289-A: 逆行列は変換を取り消す元の単位正方形A で変換 (拡大)A^-1 で元に戻るAA^-1逆行列は「元に戻す」変換。 A x A^-1 = 単位行列 I行列式 = 0 のとき、 変換で「つぶれる」ため戻せない (逆行列なし)'>
図 R289-A. 逆行列の幾何学的解釈。 行列 A は単位正方形を拡大・回転・せん断で変形し、 A^-1 はその変形を取り消して元の正方形に戻す。 もし A が「2 次元を 1 次元に潰す」変換ならば情報が失われており、 逆行列は存在しない。
条件数と逆行列の安定性図 R289-B: 条件数と数値安定性の関係条件数 (log scale)失われる桁数10^210^610^1010^14安全警戒危険壊滅倍精度の有効桁 16log10(κ) を引いた分が信頼可能な桁数'>
図 R289-B. 条件数 κ が大きくなるほど、 逆行列計算で「失われる有効桁数」が増える。 κ = 10^14 では実質 2 桁しか残らず、 結果はほぼ信用できない。 SSDSE-B-2026 で 5 指標の相関行列は κ ≈ 3000 程度なので安全領域。
正則化による条件数の改善図 R289-C: リッジ正則化が条件数を下げるλ (リッジパラメータ)条件数 (log scale)λ=0 (生)λ=0.001λ=0.01λ=0.1λ=1.0単位行列 λI の追加で行列を「正則寄り」に押し戻す'>
図 R289-C. リッジ正則化 (X^T X + λI)^-1 の効果。 λ を大きくするほど条件数が劇的に下がり、 逆行列が数値的に安定。 SSDSE-B-2026 で「総人口 + 出生数 + 死亡数」のような相関の高い列を回帰に入れるときは、 λ = 0.1〜1.0 程度で十分。

📝 理解度チェック (自分で解いてみよう)

以下の練習問題に取り組むことで、 逆行列の理解が定着しているか自分で確認できます。 自分で手を動かして電卓または Python で計算し、 解答と照合してください。

  1. 練習問題 1: 2x2 行列 $A = \begin{pmatrix} 4 & 7 \\ 2 & 6 \end{pmatrix}$ の逆行列を求めよ。 解: $\det = 10$, $A^{-1} = \begin{pmatrix} 0.6 & -0.7 \\ -0.2 & 0.4 \end{pmatrix}$。 検算 $A A^{-1} = I$ で確認。
  2. 練習問題 2: SSDSE-B-2026 で 2023 年の「総人口」と「出生数」の相関係数を計算し、 その 2x2 相関行列の逆行列の (1,1) 要素は何か? 解: 多重共線性が強いため、 (1,1) 成分は 1/(1−r²) ≒ 109 と大きな値になる。
  3. 練習問題 3: $A = \begin{pmatrix} 1 & 2 \\ 2 & 4 \end{pmatrix}$ の逆行列を計算しようとするとどうなるか? 解: 行列式 = 0 なので逆行列は存在しない。 NumPy では Singular matrix エラーが発生。
  4. 練習問題 4: np.linalg.cond で条件数が 10^12 と出たとき、 結果は何桁信頼できるか? 解: 16 - 12 = 4 桁。 残り 4 桁しか有効ではない。
  5. 練習問題 5: リッジ回帰で λ = 0 とλ = 1 のどちらが係数を不安定にするか? 解: λ = 0。 λ > 0 のリッジは常に解を安定化する。

これらの理解度チェックを終えたら、 自分で SSDSE-B-2026 の異なる指標セットを選び、 同じ手順で逆行列計算と偏相関分析を試してみましょう。 都道府県データの隠れた関係性を自分で発見できると、 統計分析が一気に面白くなります。 自分で問題設定を作って解くプロセスが、 最も深い理解を生みます。

逆行列の練習問題に取り組む際は、 まず手計算で 2x2 の場合を確実に解けるようにし、 次に 3x3 を余因子展開で解いてみるのが王道です。 そのあとで NumPy を使った数値計算に移ると、 「公式が頭に入っている上でツールを使う」状態になり、 結果の妥当性を直感的にチェックできるようになります。 また SSDSE-B-2026 の指標を使った実データ演習は、 「理論と現実の橋渡し」を体感する最良の素材であり、 統計教育の現場でも高く評価されています。 自学自習を続けることで、 やがて「逆行列を使うべきタイミング」と「使うべきでないタイミング」を見分けられるようになります。

📋 まとめチェックリスト

逆行列を扱うときに確認すべき項目をチェックリスト化しました。 SSDSE-B-2026 や他の実データで分析する際に毎回見直すと、 ミスを未然に防げます。

最終まとめ — 逆行列を 1 行で言うと

逆行列は「線形変換を取り消す変換」「連立方程式を解く道具」「多変量データの隠れた構造を取り出す鏡」の 3 つの顔を持ちます。 数値計算ではほぼ solve で代用し、 「逆行列を陽に作るのは最小限」が現代的な作法です。 とはいえ、 偏相関・マハラノビス距離・カルマンフィルタ・ベイズ推定など、 「逆行列そのものが解析対象」となる場面も多く、 そこでは条件数と正則化を意識する必要があります。 SSDSE-B-2026 で 5 指標の相関行列を逆にしてみるだけでも、 線形代数の威力が身に染みて理解できます。 まずは手を動かし、 そして理論で振り返る、 という往復で「使える逆行列」が身に付きます。

最後に、 逆行列を学ぶ意味を一段抽象化すると、 「ある変換を取り消す方法を考えることで、 元の変換そのものの構造が見えてくる」という洞察に行き着きます。 関数論では「逆関数の解析」、 物理では「対称性の破れと回復」、 統計では「観測から潜在状態への推論」、 機械学習では「予測の逆算(生成モデル)」へと、 同じ哲学が広がっています。 逆行列はその中で最もシンプルかつ強力な例示として、 線形代数の中心に位置しています。 SSDSE-B-2026 を扱う皆さんが、 この一見地味な道具を自由に使いこなせるようになる日を願っています。

🔗 隣接手法への橋渡し

逆行列 A⁻¹ は「A を取り消す変換」で、 連立一次方程式 Ax = b の解 x = A⁻¹b、 回帰係数 β̂ = (XᵀX)⁻¹Xᵀy、 マハラノビス距離など統計の中核計算で登場。

実務での落とし穴: 条件数 κ(A) が大きいと逆行列が数値的に不安定。 多重共線性で κ > 10⁵ なら逆行列計算が破綻 → 正則化 (Ridge / LASSO) や擬似逆行列で対処。 numpy の linalg.solve は内部で LU 分解を使い、 陽な逆行列計算より安定・高速。

🌳 手法選択フロー

逆行列の計算方法を、 行列性質と用途で 3 段階で判定する。

  1. 行列のサイズと性質は? 小さい (< 100x100) で密 → np.linalg.inv(A)、 対称正定値 → Cholesky 分解 (scipy.linalg.cho_solve)、 疎行列 → scipy.sparse.linalg.spsolve
  2. 連立方程式を解きたいだけか? Yes → 陽な逆行列を作らず np.linalg.solve(A, b) (3 倍速い + 安定)、 No (逆行列そのものが必要) → inv を使うが条件数を必ず確認
  3. 条件数 κ(A) は? < 10⁶ → 通常逆行列、 10⁶ - 10¹⁰ → 警告レベル、 正則化検討、 > 10¹⁰ → 擬似逆行列 (np.linalg.pinv) または Ridge 回帰で正則化

初学者へのアドバイス: 「逆行列を陽に作るのは最小限」が現代的な作法。 回帰係数を求めるとき β̂ = (XᵀX)⁻¹Xᵀy を直接書くより、 np.linalg.lstsq を使う方が遥かに安定。

🎮 触って理解する

2×2 行列 $A=\begin{pmatrix}a&b\\c&d\end{pmatrix}$ の 4 成分をスライダーで動かすと、 行列式 det、 逆行列 $A^{-1}$、 そして「単位正方形と格子が $A$ でどう変換されるか」がリアルタイムに更新される。 det=0 にすると格子が 1 本の線に潰れ、 逆行列が消える様子を体感できる。

🔵 青い点をドラッグ(タッチ可)すると $v$ を動かせる。 🟠 は像 $Av$。 の矢印は基底ベクトルの像($A$ の 1 列目・2 列目)、 塗り四角は単位正方形の像。

1.0 0.5 0.2 1.0

🧭 直感:変換を「巻き戻す」リモコン

行列 $A$ は平面を「引き伸ばす・回す・せん断する」変換器。 逆行列 $A^{-1}$ はそれをぴたりと元に戻すリモコンです。 だから $AA^{-1}=I$(=何もしない変換=単位行列)。 上の図で 🔵 をドラッグして $v$ を動かすと、 $A$ が $v$ を 🟠 $Av$ に飛ばし、 $A^{-1}$ がそれを $v$ に連れ戻す(読み出し欄の $A^{-1}(Av)=v$ を確認)。 「▶ 逆行列で単位格子に戻す」を押すと、 変形された正方形が逆変換で単位正方形へ戻る様子が見られます。

面積の拡大率 = |det(A)|。 det が正なら向き(表裏)はそのまま、 負なら鏡像反転、 0 なら面積が潰れて 0。 潰れると異なる点が同じ点に重なるため区別できなくなり、 元に戻せない=逆行列が存在しない。 これが「det=0 なら特異」の直感です。

⚠️ よくある落とし穴

🚀 発展:連立方程式・最小二乗とのつながり

🔬 解説深化:逆行列の「壊れやすさ」を固有値で読む

本編では「det ≈ 0 だと逆行列が数値的に不安定」という事実を確認した。 本節はその一歩先、 どの方向に・どれくらい壊れやすいのかを固有値スペクトルで定量化する。 材料は本文「実値計算」と同じ SSDSE-B-2026(2023 年度・47 都道府県)の総人口・出生数・死亡数の相関行列 $R$(すべて実測値)。 丸め誤差ひとつで逆行列が崩壊する瞬間と、 対角に小さな数を足すだけで治る仕組みを観察する。

🧭 直感:$R^{-1}$ は「小さい固有値の拡大鏡」

対称行列 $R$ の逆行列の固有値は、 $R$ の固有値 $\lambda_i$ の逆数 $1/\lambda_i$ になる(固有ベクトルは共通)。 実測の $R$ の固有値を計算すると次の通り。

np.linalg.eigvalsh(R) → λ = [0.00212, 0.02321, 2.97466] 1/λ → [470.68, 43.08, 0.34] 条件数 κ = λmax/λmin → 1400.1

⚠️ 落とし穴(重要):小数 2 桁に丸めただけで逆行列が崩壊する

κ = 1400 の怖さは摂動実験で体感できる。 実測 $R$ の各相関係数をレポートに書くときのように小数 2 桁へ丸める(変化は最大でも 0.0046)だけで、 逆行列はこうなる。

R2 = R.round(2) # 丸め幅は最大 0.0046 np.linalg.det(R2) → -0.0001 (符号が反転) np.linalg.eigvalsh(R2)[0] → -0.00156 (最小固有値が負に転落) np.linalg.inv(R2)[0,0] → -396.0 (元は +304.17)
元の R(実測)小数 2 桁に丸めた R
det+0.000147−0.0001(符号反転
最小固有値+0.00212−0.00156( = 相関行列として不正)
逆行列の (1,1) 要素+304.17−396.0(要素の最大変化は 700 超)
偏相関 r(出生,死亡 | 総人口)−0.508(本文実測と一致)計算不能(対角要素が 0 以下になり定義が破綻)

🚀 発展:対角に λ を足すだけで治る — Ridge 正則化のスペクトル的意味

$R + \lambda I$ の固有値は $\lambda_i + \lambda$(固有ベクトルは不変)。 つまりゼロ近傍の固有値だけを底上げして拡大鏡を無害化できる。 実測 $R$ での効果は次の通り。

λdet(R+λI)条件数 κmax |(R+λI)⁻¹|
0(元の R)0.0001471400.1304.17
0.010.001202246.253.85
0.050.01154358.012.75
0.10.03868930.16.58

🎛 触って確かめる:λ を動かすと拡大鏡が閉じる

下のバーをドラッグ(タッチ可)して λ を動かすと、 上表の実測 $R$ に対する $\det$・条件数 κ・逆行列の最大要素がリアルタイムに変わる。 数値はページ本文と同じ実測相関行列(総人口・出生数・死亡数、 2023 年・47 都道府県)から計算している。

λ = 0.000

🔗 関連ページ

※ 本節の数値はすべて data/raw/SSDSE-B-2026.csv(2023 年度・47 都道府県、 総人口・出生数・死亡数)から numpy で実測したもの。 架空の数値は含まない。