Hellinger距離

中級

4.4.5

Hellinger距離

最終更新 2020-05-06 読了時間 1 分
まとめ
  • ヘリンガー距離は確率分布の平方根差に基づく距離で、0~1 の範囲で解釈できます。
  • 離散分布を例に計算手順をまとめ、KL ダイバージェンスとの違いを確認します。
  • ゼロを含む分布や正規化時の注意点を整理します。

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 \left(\sqrt{p_i} - \sqrt{q_i}\right)^2 } $$
  • 0 に近いほど分布が類似、1 に近いほど異なる。
  • 対称性と三角不等式を満たすため、メトリックとして扱えます。
  • KL ダイバージェンスと異なり、サポートがずれても有限値になります。

2. Python による計算例 #

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import numpy as np

def hellinger(p: np.ndarray, q: np.ndarray) -> float:
    """2 つの確率分布間のヘリンガー距離を返す。"""
    p = np.asarray(p, dtype=float)
    q = np.asarray(q, dtype=float)

    # ゼロ割りを避けるために正規化
    p = p / p.sum()
    q = q / q.sum()

    return float(np.linalg.norm(np.sqrt(p) - np.sqrt(q)) / np.sqrt(2))

p = np.array([0.4, 0.4, 0.2])
q = np.array([0.2, 0.5, 0.3])

print(f"Hellinger distance: {hellinger(p, q):.4f}")

ヒストグラムから距離を求める場合は、まず和が 1 になるように正規化してから平方根差を計算します。


3. 特長と比較ポイント #

  • 対称・メトリック:Jensen-Shannon 距離と同様に対称で三角不等式を満たします。
  • 有限値:分布がゼロを含んでも補間を通じて有限値に収まります。
  • 平方根変換:小さな確率が強調されすぎず、外れ値に対して安定した距離になります。

4. 実務での活用例 #

  • ベイズ推論:事前分布と事後分布の差異を定量化。
  • クラスタリング:確率ベクトル(トピック分布など)間の距離として利用。
  • コンセプトドリフト検知:時系列で得られる分布の変化を監視し、閾値を超えたらアラートを出す。

5. 注意点 #

  • ヒストグラムのビン幅や分割方法によって距離が変わるため、離散化設計を慎重に行います。
  • サンプルが少ない場合はラプラス平滑化などのスムージングを行うと安定します。
  • 他の距離(KL、Wasserstein など)と併用して分布差の特徴を多面的に捉えましょう。

まとめ #

ヘリンガー距離は平方根を活用して確率分布の差を測るメトリックで、0~1 の範囲で直感的に解釈できます。ゼロ確率を含んでも扱いやすく、ベイズ推論や分布監視など多くの場面で活躍します。

よくある質問 #

KLダイバージェンスとHellingerDistanceはどう使い分ける? #

KLダイバージェンスは非対称(P→QとQ→Pで値が異なる)で、どちらかの分布がゼロの点があると無限大になります。Hellinger距離は対称0〜1の有界な値を返すため、解釈しやすく数値的に安定しています。確率分布の類似度を「距離感」として直感的に表したい場合や、ゼロを含む分布を扱う場合はHellinger距離が向いています。

Hellinger距離が0または1に近い場合の解釈は? #

  • 0に近い:2つの分布がほぼ同一である(完全に一致すると0)
  • 1に近い:2つの分布のサポートがほぼ重なっていない(完全に離れると1)

ドリフト検知では、訓練データと本番データの特徴量分布のHellinger距離が0.1〜0.2を超えた場合にアラートを設定するケースが多いです。

連続分布に対してHellingerDistanceを計算するには? #

連続分布では積分形式 \(H(P,Q) = \frac{1}{\sqrt{2}}\sqrt{\int(\sqrt{p(x)}-\sqrt{q(x)})^2dx}\) を使います。実務では:

  • ヒストグラムに変換してから離散版の式を適用(ビン数の選択に注意)
  • scipy.spatial.distance.hellinger(非標準)または手動実装
  • 正規分布などパラメトリック分布は解析解を使用

ゼロ確率の扱いはどうすればよい? #

分布にゼロが含まれてもHellinger距離自体は有限ですが(KLと異なり)、ヒストグラム推定でゼロビンが生じる場合はラプラススムージング(各ビンに微小値を加える)を適用するのが一般的です。


分布の差と Hellinger 距離 #

2 つの分布の差を変えると各距離指標がどう変化するか確認できます。