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

MatLab中2个直方图的Kullback-Leibler散度,matlab,distance,Matlab,Distance,我想要一个函数来计算MatLab中两个直方图之间的KL距离。我尝试了以下代码: 然而,它说我应该有两个分布p和Q,大小为nxnbins。然而,我很难理解软件包的作者希望我如何安排直方图。我认为提供随机变量的离散化值以及箱子的数量就足够了(我假设算法将使用任意支持来评估期望值) 感谢您的帮助 谢谢。您链接到的函数要求传递的两个直方图对齐,因此具有相同的长度NBIN x N(不是N x NBIN),也就是说,如果N>1,则输入中的行数应等于直方图中的箱数。如果只是比较两个柱状图(即N=1),这其实

我想要一个函数来计算MatLab中两个直方图之间的KL距离。我尝试了以下代码:

然而,它说我应该有两个分布p和Q,大小为nxnbins。然而,我很难理解软件包的作者希望我如何安排直方图。我认为提供随机变量的离散化值以及箱子的数量就足够了(我假设算法将使用任意支持来评估期望值)

感谢您的帮助


谢谢。

您链接到的函数要求传递的两个直方图对齐,因此具有相同的长度NBIN x N(不是N x NBIN),也就是说,如果N>1,则输入中的行数应等于直方图中的箱数。如果只是比较两个柱状图(即N=1),这其实并不重要,只要一致且bin的顺序匹配,就可以传递这些柱状图的行或列向量版本

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

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

数组
bin
的大小应与
p
Q
的大小相同,用于执行非常小的检查,确保输入大小相同,但不用于计算。该例程希望
bin
包含您的bin的数字标签,以便它可以检查重复的bin标签,并在出现重复时向您发出警告,否则不会使用该信息

您可以取消
垃圾箱
并使用

 KL = sum(P .* (log2(P)-log2(Q)));
不使用Matlab中央版本。但是,您链接到的版本执行上述最小检查,此外还允许计算两个备选距离(请参阅文档)


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

你问过作者吗?我想我不会得到答案:自去年以来,这些问题一直没有答案。我希望这里有人能为函数的编码提供一些见解或捷径。我不推荐这种特殊的实现,因为它不能正确处理零概率。我会用它来代替。你所需要做的就是指定两个长度相等的概率向量;例如
P=[0.25 0.25 0.25 0.25]
Q=[0.1 0.2 0.3 0.4]