Kullback-Leibler 散度衡量两个概率函数之间的重叠

Kullback-Lieber divergence to measure the overlap between two probability functions

我正在尝试确定 KL 散度以测量两个密度函数(2 直方图)之间的重叠。

下面是我目前拥有的代码。但是输出的是一列数字而不是一个值?

import matplotlib.pyplot as plt
import random
import scipy.stats

A_x = [random.randrange(1,100,1) for _ in range (10000)]
A_y = [random.randrange(1,100,1) for _ in range (10000)]

B_x = [random.randrange(1,100,1) for _ in range (100000)]
B_y = [random.randrange(1,100,1) for _ in range (100000)]

fig, ax = plt.subplots()
ax.grid(False)

a,x,y,p = plt.hist2d(A_x,A_y, bins = 100)
b,x,y,p = plt.hist2d(B_x,B_y, bins = 100)      

div = scipy.stats.entropy(a, qk= b, base=None)     

scipy.stats.entropy 假设分布是一维的。查看文档字符串,可以看到:

S = -sum(pk * log(pk), axis=0)

这意味着它在第一个轴上求和。给它一个形状为 (m, n) 的数组将得到一个形状为 (n,) 的结果,这就像将数组的每一行视为一对单独的分布。

但是熵的定义并不关心分布的维数。这只是关于事件的概率,在您的情况下是 ab 的单个元素。所以你可以这样做:

div = scipy.stats.entropy(a.ravel(), qk=b.ravel(), base=None)

您将获得 KL 散度的单个值。