MatLab 中 2 个直方图的 Kullback Leibler 散度

Kullback Leibler Divergence of 2 Histograms in MatLab

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

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

感谢任何帮助。

谢谢。

你link的函数要求传递的两个直方图对齐,因此具有相同的长度NBIN x N(不是N X NBIN),也就是说,如果N>1那么[=输入中的 32=]rows 应等于直方图中的 bin 数。如果您只是要比较两个直方图(即如果 N=1),那并不重要,您可以传递这些直方图的行或列向量版本,只要您保持一致并且 bin 的顺序匹配。

对该函数的一般调用如下所示:

 dists = kldiv(bins,P,Q)

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

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

您可以取消 bins 并使用

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

不使用 Matlab Central 版本。但是,您 link 执行上述最小检查的版本还允许计算两个替代距离(请参阅文档)。

eigenchris 编辑的 link 版本检查没有直方图箱为空(这会使计算在数字上爆炸),如果有,删除它们对总和的贡献(不确定这是否完全适当的 - 咨询该主题的专家)。它可能还应该知道公式的确切形式,特别注意上面 log2 的使用与 eigenchris 编辑的 link 版本中的自然对数。