Jensen-Shannon ダイバージェンス

Eval

Jensen-Shannon ダイバージェンス

作成日: 最終更新: 読了時間: 1 分
まとめ
  • Jensen-Shannon ダイバージェンスは KL ダイバージェンスを対称化し、有限値にした指標です。
  • Python での計算例とともに、距離(平方根)との関係を整理します。
  • クラスタリングや生成モデル評価での活用ポイントを紹介します。

1. 定義と性質 #

確率分布 \(P\) と \(Q\) に対して、\(M = \frac{1}{2}(P + Q)\) とすると Jensen-Shannon ダイバージェンスは

$$ \mathrm{JSD}(P \parallel Q) = \frac{1}{2} \mathrm{KL}(P \parallel M) + \frac{1}{2} \mathrm{KL}(Q \parallel M) $$

で定義され、常に 0 以上 1 以下(底を 2 とした対数の場合)の値を取ります。

  • 対称性:\(\mathrm{JSD}(P \parallel Q) = \mathrm{JSD}(Q \parallel P)\)。
  • 有限値:サポートがずれても補間した \(M\) を介して有限値になります。
  • 平方根を取った値は Jensen-Shannon 距離として三角不等式を満たします。

2. Python による計算例 #

import numpy as np
from scipy.spatial.distance import jensenshannon

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

js_distance = jensenshannon(p, q, base=2)
js_divergence = js_distance ** 2  # 平方根を戻すとダイバージェンス

print(f"Jensen-Shannon distance : {js_distance:.4f}")
print(f"Jensen-Shannon divergence: {js_divergence:.4f}")

jensenshannon が返すのは距離(平方根)なので、ダイバージェンスを求めたい場合は 2 乗します。


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

  • 対称性と安定性:KL のように一方の分布にだけ依存しないため、分布比較の基準が明確です。
  • バウンディング:値が 0~1 に収まるため、閾値設定やモニタリング指標として扱いやすいです。
  • メトリック性:平方根を取れば距離となり、クラスタリングや可視化に利用できます。

4. 実務での活用例 #

  • 生成モデル評価:生成サンプルと実データの分布差を測り、学習の安定性を確認。
  • 言語モデル・トピックモデル:単語分布やトピック分布の違いを定量化。
  • 異常検知:時系列で得られる分布を比較し、閾値を超えた場合に異常と判断。
  • モデル選択:複数モデルの出力分布を比較し、実データに最も近い候補を選定。

5. 注意点 #

  • 連続分布を扱う場合は、適切にビン分割するかカーネル密度推定を用いて離散化します。
  • ゼロ確率が多い場合は、微小な平滑化を事前に行うと数値が安定します。
  • 距離が小さくても必ずしもモデル性能が高いとは限らないため、他指標と併せて判断しましょう。

まとめ #

Jensen-Shannon ダイバージェンスは KL を対称化し、有限値に収めた分布比較指標です。SciPy の実装を使えば容易に計算でき、生成モデル評価や異常検知など幅広いシナリオで役立ちます。