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
4

1 回答 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
于 2011-05-28T04:27:32.807 回答