我有两个信号s1和s2,每个采样 170 次。
x = 0.2:0.2:34;
s1 = rand(size(x));
s2 = randn(size(x));
计算两个离散变量之间的 MI(互信息)需要了解它们的边际概率分布函数及其联合概率分布。
我正在使用这个Kernel Density Estimator估计每个信号的边际分布。
[~,pdf1,xmesh1,~]=kde(s1);
[~,pdf2,xmesh2,~]=kde(s2);
我正在使用这个2D Kernel Density Estimator估计联合 pdf 。
[~,pdf_joint,X,Y]=kde2d(data);
我创建了一个函数,它将原始信号、它们的边缘 pdf 和它们的联合 pdf 作为输入,并计算互信息。
不幸的是,我似乎在这个功能中有一些拥抱错误,我无法弄清楚。MI 应该始终是正数,但我得到的是复数和/或负数!
我为计算 MI 编写的函数如下所示。
function mi = computeMI(s1, s2, pdf1, xmesh1, pdf2, xmesh2, pdf_joint, X, Y)
N = size(s1, 2);
p_i = zeros(1, N);
p_j = zeros(1, N);
for i=1:N
p_i(i) = interp1(xmesh1, pdf1, s1(i));
p_j(i) = interp1(xmesh2, pdf2, s2(i));
end;
mi = 0;
p_ij = zeros(N, N);
for j=1:N
for i=1:N
p_ij(i, j) = interp2(X, Y, pdf_joint, s1(i), s2(j));
delta_mi = p_ij(i,j) * (log2(p_ij(i,j) / (p_i(i) * p_j(j))));
mi = mi + delta_mi;
end;
end;
非常感谢您的帮助。