Python计算两个离散变量分布的KL散度( Kullback–Leibler divergence)

Python实现两个离散变量分布的KL散度( Kullback–Leibler divergence)

KL散度( Kullback–Leibler divergence),又称相对熵,是描述两个概率分布 P 和 Q 差异的一种方法。根据计算公式:

D(P||Q)=P(x)log2P(x)Q(x) D ( P | | Q ) = ∑ P ( x ) log 2 ⁡ P ( x ) Q ( x )

可以发现,P 和 Q 中元素的个数不用相等,只需要两个分布中的离散元素一致。


  • 下面举个简单的例子
    两个离散分布分布分别为 P 和 Q
    P 的分布为:{1,1,2,2,3}
    Q 的分布为:{1,1,1,1,1,2,3,3,3,3}
    我们发现,虽然两个分布中元素个数不相同,P 的元素个数为 5,Q 的元素个数为 10。但里面的元素都有 “1”,“2”,“3” 这三个元素。
    当 x = 1时,在 P 分布中,“1” 这个元素的个数为 2,故 P(x = 1) = 25 2 5 = 0.4,在 Q 分布中,“1” 这个元素的个数为 5,故 Q(x = 1) = 510 5 10 = 0.5
    同理,
    当 x = 2 时,P(x = 2) = 25 2 5 = 0.4 ,Q(x = 2) = 110 1 10 = 0.1
    当 x = 3 时,P(x = 3) = 15 1 5 = 0.2 ,Q(x = 3) = 410 4 10 = 0.4
    把上述概率带入公式:
    D(P||Q)=0.4log20.40.5+0.4log20.40.1+0.2log20.20.4=0.47 D ( P | | Q ) = 0.4 log 2 ⁡ 0.4 0.5 + 0.4 log 2 ⁡ 0.4 0.1 + 0.2 log 2 ⁡ 0.2 0.4 = 0.47

    至此,就计算完成了两个离散变量分布的KL散度。

  • 下面使用Python语言实现KL散度的计算
    x 和 y 是两个离散变量的随机分布(这里的离散分布和上面例子不一样,读者可自行更换为自己的离散分布)
    p[ ] 和 q[ ] 保存的是每个元素所占的比例,是一个概率。
    最终计算结果保留两位小数。
from math import log

x = [1, 1, 1, 2, 3, 4, 1, 2, 3, 4, 1, 3, 4, 1, 2, 3, 3, 1, 2, 3, 1, 2, 3, 1, 3, 1]
y = [2, 2, 2, 2, 3, 4, 4, 2, 2, 1, 2, 4, 3, 2, 2, 1, 3, 4, 4, 2, 4, 3]
k_x = set(x)
p = []
for i in k_x:
    p.append(x.count(i) / len(x))

k_y = set(y)
q = []
for i in k_y:
    q.append(y.count(i) / len(y))

KL = 0.0
for i in range(len(k_x)):
    KL += p[i] * log(p[i] / q[i], 2)
print(round(KL, 2))

希望大家看到上面这个简单的例子,都已经知道了如果计算 KL散度。
文章如有问题,请联系笔者随时更正,大家一同进步,谢谢支持!

你可能感兴趣的:(机器学习,机器学习,信息论,概率论)