MATLAB矩阵的互信息

6
我有一个表示数据集中共存频率计数的方阵。换句话说,行代表特征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
1个回答

6
我不知道MATLAB中是否有内置的互信息函数。也许你已经得到了MathWorks File Exchange或其他第三方开发者代码之一?
我认为你计算pXpY的方式可能有问题。此外,你可以矢量化操作,而不是使用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

这个函数返回的值与我的原始函数相同,因此我认为它们是等价的。不过,你的更加优雅。 - Colin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接