function dist=KLDiv(P,Q) % dist = KLDiv(P,Q) Kullback-Leibler divergence of two discrete probability % distributions % P and Q are automatically normalised to have the sum of one on rows % have the length of one at each % P = n x nbins % Q = 1 x nbins or n x nbins(one to one) % dist = n x 1 if size(P,2)~=size(Q,2) error('the number of columns in P and Q should be the same'); end if sum(~isfinite(P(:))) + sum(~isfinite(Q(:))) error('the inputs contain non-finite values!') end % normalizing the P and Q if size(Q,1)==1 Q = Q ./sum(Q); P = P ./repmat(sum(P,2),[1 size(P,2)]); temp = P.*log(P./repmat(Q,[size(P,1) 1])); temp(isnan(temp))=0;% resolving the case when P(i)==0 dist = sum(temp,2); elseif size(Q,1)==size(P,1) Q = Q ./repmat(sum(Q,2),[1 size(Q,2)]); P = P ./repmat(sum(P,2),[1 size(P,2)]); temp = P.*log(P./Q); temp(isnan(temp))=0; % resolving the case when P(i)==0 dist = sum(temp,2); end
时间: 2023-06-18 12:07:12 浏览: 88
这是一个计算两个离散概率分布之间 Kullback-Leibler 散度的 Matlab 函数。其中,输入的 P 和 Q 分别是 $n$ 行 $nbins$ 列的矩阵,表示 $n$ 个概率分布,$nbins$ 表示每个概率分布的长度。如果输入的 Q 是一个 $1 \times nbins$ 的向量,则会将其转换为一个与 P 相同大小的矩阵。最后的输出 dist 是一个 $n \times 1$ 的向量,表示每个概率分布与 Q 之间的 Kullback-Leibler 散度。
具体来说,这个函数首先检查输入的 P 和 Q 是否具有相同的列数,如果不同则报错。然后检查输入的 P 和 Q 是否包含非有限值,如果是则报错。接下来,对输入的 P 和 Q 进行归一化,使它们的每一行元素之和都为 1。如果输入的 Q 是一个向量,则将其转换为一个与 P 相同大小的矩阵。最后,计算 P 和 Q 之间的 Kullback-Leibler 散度,并将结果保存在 dist 中返回。
阅读全文