我在java中有这个方法来计算概率分布的KL:
public static double klDivergence(double[] p1, double[] p2) {
double klDiv = 0.0;
for (int i = 0; i < p1.length; ++i) {
if (p1[i] == 0) { continue; }
if (p2[i] == 0.0) { continue; }
klDiv += p1[i] * Math.log( p1[i] / p2[i] );
}
return klDiv;
}
public static void main(String[] args) {
double[] d1=new double[2];
double[] d2=new double[2];
d1[0]=0.23654;
d1[1]=0.56565;
d2[0]=0.23654;
d2[1]=0.89312;
double symmetric= (klDivergence(d1, d2)+klDivergence(d2, d1))/2;
}
在计算对称KL之前,我应该规范化概率分布吗?如果你喜欢?
答案 0 :(得分:1)
Kullback-Leibler divergence定义了discrete probability distributions。这些是按照定义归一化为1.此外,没有归一化d1 [0] = 0; d1 [1] = 1和d2 [0] = 0; d2 [1] = 2将导致Kullback-Leibler散度不为零。 所以是的,你应该规范你的发行版。