Взаимная информация MATLAB Matrix - PullRequest
6 голосов
/ 28 мая 2011

У меня есть квадратная матрица, которая представляет частоту совпадений в наборе данных. Другими словами, строки представляют все возможные наблюдения объекта 1, а столбцы - возможные наблюдения объекта 2. Число в ячейке (x, y) - это число раз, когда объект 1 наблюдался как x в одно и то же время. особенность 2 была у.

Я хочу рассчитать взаимную информацию, содержащуюся в этой матрице. 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 голосов
/ 28 мая 2011

Я не знаю каких-либо встроенных функций взаимной информации в 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
...