まとめ
- 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 の実装を使えば容易に計算でき、生成モデル評価や異常検知など幅広いシナリオで役立ちます。