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,)
的结果,这就像将数组的每一行视为一对单独的分布。
但是熵的定义并不关心分布的维数。这只是关于事件的概率,在您的情况下是 a
或 b
的单个元素。所以你可以这样做:
div = scipy.stats.entropy(a.ravel(), qk=b.ravel(), base=None)
您将获得 KL 散度的单个值。
我正在尝试确定 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,)
的结果,这就像将数组的每一行视为一对单独的分布。
但是熵的定义并不关心分布的维数。这只是关于事件的概率,在您的情况下是 a
或 b
的单个元素。所以你可以这样做:
div = scipy.stats.entropy(a.ravel(), qk=b.ravel(), base=None)
您将获得 KL 散度的单个值。