我有一个方阵,表示数据集中共现的频率计数。换句话说,行代表特征1的所有可能观察,列是特征2的可能观察。单元格中的数字(x,y)是特征1同时被观察为x的次数特征2是y。
我想计算此矩阵中包含的互信息。 MATLAB有一个内置的information
函数,但它需要2个参数,一个用于x,一个用于y。我如何操纵这个矩阵来获得它期望的参数?
或者,我编写了自己的互信息函数,它采用矩阵,但我不确定它的准确性。看起来不错吗?
function [mutualinfo] = mutualInformation(counts)
total = sum(counts(:));
pX = sum(counts, 1) ./ total;
pY = sum(counts) ./ total;
pXY = counts ./ total;
[h, w] = size(counts);
mutualinfo = 0;
for row = 1:h
for col = 1:w
mutualinfo = mutualinfo + pXY(row, col) * log(pXY(row, col) / (pX(row)*pY(col)));
end;
end;
end
答案 0 :(得分:6)
我不知道MATLAB中有任何内置的互信息函数。也许您收到了MathWorks File Exchange或某些other third-party developer code提交的一份提交内容?
我认为您计算pX
和pY
的方式可能有问题。另外,您可以对操作进行矢量化,而不是使用for循环。这是您试用的函数的另一个版本:
function mutualInfo = mutualInformation(counts)
pXY = counts./sum(counts(:));
pX = sum(pXY,2);
pY = sum(pXY,1);
mutualInfo = pXY.*log(pXY./(pX*pY));
mutualInfo = sum(mutualInfo(:));
end