Kullback Leibler在MatLab中发现2个直方图

时间:2015-04-16 16:45:06

标签: matlab distance

我想要一个函数来计算MatLab中两个直方图之间的KL距离。我试过这段代码: http://www.mathworks.com/matlabcentral/fileexchange/13089-kldiv

然而,它说我应该有两个大小为n x nbins的分布P和Q.但是,我无法理解程序包的作者是如何让我安排直方图的。我认为提供随机变量的离散值和二进制数就足够了(我假设算法会使用任意支持来评估期望值)。

感谢任何帮助。

感谢。

1 个答案:

答案 0 :(得分:2)

你链接到的函数要求传递的两个直方图是对齐的,因此长度相同NBIN x N(不是NX NBIN),也就是说,如果N> 1,那么行的数量在输入中应该等于直方图中的区间数。如果你只是要比较两个直方图(即如果N = 1)它并不重要,你可以传递这些的行或列向量版本,只要你是一致的和bin的顺序匹配。

对函数的泛型调用如下所示:

 dists = kldiv(bins,P,Q)

该实现允许将多个直方图相互比较(即,N> 1),在这种情况下,比较每个数组中的列对(具有匹配的列索引),结果是每个匹配对的距离的行向量。

数组bins应与PQ的大小相同,并用于执行非常小的检查,即输入大小相同但未在计算。例程期望bins包含垃圾箱的数字标签,以便它可以检查重复的bin标签,并在重复发生时发出警告,否则不会使用该信息。

您可以取消bins并使用

计算距离
 KL = sum(P .* (log2(P)-log2(Q)));

不使用Matlab Central版本。但是,您链接的版本执行上述最小化检查,此外还允许计算两个可选距离(请参阅文档)。

由eigenchris链接的版本检查没有直方图箱是空的(这将使计算在数字上爆炸),如果有,则删除它们对总和的贡献(不确定这是完全合适的 - 请咨询专家学科)。它应该也应该知道公式的确切形式,特别注意上面使用log2与自然对数在由eigenchris链接的版本中的自然对数。