#0174（2025/06/19）マハラノビス距離

# マハラノビス距離

> **一言で**
> • **ユークリッド距離** — 2 点を結ぶ直線距離
> • **マハラノビス距離** — 分散と相関で正規化した距離

---

## 1. はじめに

距離は「どれだけ離れているか」を数値化する最も基本的な概念であり、統計解析・機械学習・パターン認識など多岐にわたって利用されます。本稿では特に **マハラノビス距離** に着目し、その背景・数式・実装・ユースケースを体系的に解説します。あわせてベースラインとなる **ユークリッド距離** や他の代表的距離とも比較し、距離関数選定の実務的指針を提示します。

---

## 2. ユークリッド距離とは

* **定義** : ピタゴラスの定理を n 次元へ一般化した直線距離。
* **数式** : $d_E(\mathbf{x},\mathbf{y}) = \sqrt{ \sum_{i=1}^{d} (x_i - y_i)^2 }$。
* **前提** : 各次元が互いに独立かつ同一スケール（単位・分散）が保証されていること。
* **利点** : 実装が容易で計算コストは O(d)。
* **欠点** : スケールの違いや相関を無視するため、多変量データでは誤差が膨らみやすい。

### ▶ Python 実装

```python
import numpy as np
x = np.array([1, 2, 3])
y = np.array([5, 2, 0])
euc = np.linalg.norm(x - y)
print(euc)  # 直線距離
```

---

## 3. マハラノビス距離とは

* **定義** :  平均 $\boldsymbol\mu$ と共分散行列 $\Sigma$ を用い、データのスケール差・軸間相関を除去した距離。
* **数式** :  $d_M(\mathbf{x},\boldsymbol\mu) = \sqrt{ (\mathbf{x}-\boldsymbol\mu)^T \; \Sigma^{-1} \; (\mathbf{x}-\boldsymbol\mu) }$
* **直感** :  $\Sigma^{-1/2}$ でホワイトニングした空間におけるユークリッド距離。
* **特性** : 単位依存性がなく、軸間相関を“楕円”形状として捉える。多変量正規分布では等確率楕円の半径として自然に現れる。
* **課題** : $\Sigma^{-1}$ 計算は O(d³)。高次元×少サンプルでは推定が不安定なため正則化（Ledoit–Wolf など）が必須。

### ▶ Python 実装（SciPy + scikit‑learn）

```python
import numpy as np
from scipy.spatial.distance import mahalanobis
from sklearn.covariance import LedoitWolf

# 学習データ（身長 cm, 体重 kg）
X = np.array([[170, 65], [160, 60], [180, 80]])
mu = X.mean(axis=0)

# 共分散のロバスト推定 & 逆行列
cov = LedoitWolf().fit(X).covariance_
inv_cov = np.linalg.inv(cov)

x_new = np.array([175, 70])
mah = mahalanobis(x_new, mu, inv_cov)
print(mah)  # 分散と相関を考慮した距離
```

---

## 4. その他の代表的距離

| 距離名                | 数式 (概要)           | 主な用途           |            |                  |
| ------------------ | ----------------- | -------------- | ---------- | ---------------- |
| **マンハッタン (L1)**    | (\sum\_i          | x\_i - y\_i    | )          | スパース最適化、絶対値誤差最小化 |
| **チェビシェフ (L∞)**    | (\max\_i          | x\_i - y\_i    | )          | 工程管理、パズルの最短手数    |
| **ミンコフスキー (L\_p)** | ((\sum\_i         | x\_i - y\_i    | ^p)^{1/p}) | Lp-ノルム全般を包含      |
| **コサイン**           | $1 - \cos \theta$ | 文書・画像の類似検索     |            |                  |
| **ハミング**           | 異なるビット数           | エラー検出・訂正符号     |            |                  |
| **EMD (アースムーバー)**  | 2 分布間の最小"土砂運搬量"   | ヒストグラム比較、生成モデル |            |                  |

---

## 5. ユークリッド距離 vs マハラノビス距離

| 比較観点       | ユークリッド距離   | マハラノビス距離              |
| ---------- | ---------- | --------------------- |
| **スケール依存** | 大きな単位の軸が支配 | 分散で正規化 → 単位不変         |
| **相関考慮**   | 無視         | 共分散で補正 → 実効次元を削減      |
| **等距離面**   | 球 (超球)     | 楕円体                   |
| **計算コスト**  | O(d)       | O(d³) + Σ推定           |
| **統計的解釈**  | 特になし       | $\chi^2$ 分布に従い p 値計算可 |

---

## 6. マハラノビス距離が輝くユースケース

* **多変量異常検知** : Hotelling’s $T^2$ 管理図として製造ライン監視に採用。
* **ガウス系クラスタリング／判別** : LDA・QDA・GMM の判定距離に自然適合。
* **k‑NN + ローカル共分散** : 細長いクラスタ境界でも誤分類を低減。
* **メトリック学習 (LMNN, NCA)** : 到達先が“学習済みマハラノビス距離”。
* **高次元データ可視化** : PCA → Mahalanobis で外れ値スコアリング、t‑SNE 入力距離。
* **金融リスク管理** : 相関ポートフォリオ間の実効的乖離を測定。

---

## 7. Python 実装ガイドライン

1. **前処理** : 欠損補完 → スケール確認 → 必要なら次元削減 (PCA/SVD)。
2. **共分散推定** : `LedoitWolf`, `OAS`, またはベイズ推定で正則化。
3. **距離計算** : `scipy.spatial.distance.mahalanobis` で単点、`sklearn.metrics.pairwise_distances` で行列演算。
4. **高次元最適化** : 逆行列は `np.linalg.pinv` で安定化し、GPU 化する場合は CuPy も選択肢。

---

## 8. 使いどころ早見表

| シナリオ          | 推奨距離               |
| ------------- | ------------------ |
| とりあえず距離が欲しい   | ユークリッド＋標準化         |
| 単位混在・相関が強い    | マハラノビス             |
| 高次元 & 少サンプル   | PCA で次元圧縮 → マハラノビス |
| 計算資源が限られる     | ユークリッド (軽量)        |
| 外れ値検出で p 値が必要 | マハラノビス一択           |


---

### おわりに

距離関数の選定はモデルの性能・解釈性・運用コストに直結します。マハラノビス距離は計算負荷こそ高いものの、分散と相関を同時に取り込んだ「実質的な差異」を測る指標として非常に強力です。ユークリッド距離との使い分けを意識し、データの特性とビジネス要件に合った距離を選択してください。