问题描述
|
我有一个正方形矩阵,表示数据集中同时出现的频率计数。换句话说,行代表特征1的所有可能观察,列代表特征2的可能观察。单元格(x,y)中的数字是同时观察到特征1为x的次数。特征2是y。
我想计算此矩阵中包含的相互信息。 MATLAB具有内置的
@R_777_4045@ion
函数,但它带有2个参数,一个用于x,一个用于y。我将如何处理此矩阵以获取期望的参数?
另外,我编写了自己的采用矩阵的互信息函数,但是不确定其准确性。看起来合适吗?
function [mutualinfo] = mutual@R_777_4045@ion(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
解决方法
我不知道MATLAB中有任何内置的互信息功能。也许您掌握了MathWorks File Exchange或其他一些第三方开发人员提交的文件之一?
我认为您计算
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