ヘリンガー距離は、確率密度関数の平方根を比較することで分布間の距離を測る指標です。0〜1 の範囲に収まり、対称性とメトリック性を満たすため、ベイズ推論や統計的検定でも利用されます。
1. 定義 #
離散分布 \(P = (p_1, \dots, p_n)\)、\(Q = (q_1, \dots, q_n)\) について、
$$ H(P, Q) = \frac{1}{\sqrt{2}} \sqrt{ \sum_{i=1}^n (\sqrt{p_i} - \sqrt{q_i})^2 } $$
連続分布の場合は確率密度関数の平方根を積分します。0 ≤ H ≤ 1 で、0 は完全一致、1 は完全に異なることを意味します。
2. Python で計算 #
import numpy as np
def hellinger(p, q):
p = np.asarray(p, dtype=float)
q = np.asarray(q, dtype=float)
return np.sqrt(np.sum((np.sqrt(p) - np.sqrt(q)) ** 2)) / np.sqrt(2)
p = np.array([0.4, 0.4, 0.2])
q = np.array([0.2, 0.5, 0.3])
print("Hellinger distance:", round(hellinger(p, q), 4))
確率分布である必要があるため、事前に正規化しておきます。ヒストグラムから計算する場合はビンの総和が 1 になるようスケーリングします。
3. 特徴 #
- 対称・メトリック:三角不等式を満たし、距離として扱いやすい。
- 有限値:KL と違い、サポートが一致しなくても有限値になる(0 で補間されるため)。
- 平方根変換:確率が小さい領域を強調しすぎず、安定した比較が可能。
4. 応用例 #
- ベイズ推論:事前分布と事後分布の差を測る。
- クラスタリング:確率ベクトル(トピック分布など)の距離として利用。
- 分布シフト検知:経時的にヘリンガー距離を監視し、閾値を超えたら異常と判定。
5. 注意点 #
- 離散化の仕方によって距離が変わるため、ヒストグラムのビン設定は慎重に。
- サンプル数が少ないと推定が不安定になるため、スムージング(例えばラプラス平滑化)を施すと安定する。
- 他の距離(JSD、ワッサースタイン)と併用し、分布差異の特徴を総合的に把握する。
まとめ #
- ヘリンガー距離は平方根を使って確率分布の差を測るメトリックで、0〜1 に収まり扱いやすい。
- 実装はシンプルで、確率ベクトルの正規化と平方根差の計算だけで求められる。
- ベイズ推論や分布シフト検知など、多様な場面で活用できる距離指標として覚えておこう。