用Python进行直方图平滑的KL(Kullback-Leibler)距离

4
我有两个数字列表(长度不同)。 使用Python,我想计算10个bin的直方图。 然后,我想使用标准核(均值为0,sigma=1的高斯核)平滑这两个直方图。 然后,我想计算这两个平滑直方图之间的KL距离。 我找到了一些关于直方图计算的代码,但不确定如何应用标准核进行平滑,然后如何计算KL距离。 请帮忙。
1个回答

11

要计算直方图,您可以使用numpy.histogram()。而对于高斯平滑,则可以使用scipy.ndimage.filters.gaussian_filter()。如需查找Kullback-Leibler散度代码,请单击此处

用于执行所需计算的方法可能如下所示:

import numpy as np
from scipy.ndimage.filters import gaussian_filter

def kl(p, q):
    p = np.asarray(p, dtype=np.float)
    q = np.asarray(q, dtype=np.float)

    return np.sum(np.where(p != 0, p * np.log(p / q), 0))

def smoothed_hist_kl_distance(a, b, nbins=10, sigma=1):
    ahist, bhist = (np.histogram(a, bins=nbins)[0],
                    np.histogram(b, bins=nbins)[0])

    asmooth, bsmooth = (gaussian_filter(ahist, sigma),
                        gaussian_filter(bhist, sigma))

    return kl(asmooth, bsmooth)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接