Взаимная информация о MATLAB Matrix
У меня есть квадратная матрица, которая представляет частоту встречаемости в наборе данных. Другими словами, строки представляют все возможные наблюдения объекта 1, а столбцы - возможные наблюдения объекта 2. Число в ячейке (x, y) - это число раз, когда объект 1 наблюдался как x в одно и то же время. функция 2 была у.
Я хочу рассчитать взаимную информацию, содержащуюся в этой матрице. MATLAB имеет встроенный information
функция, но она принимает 2 аргумента, один для х и один для у. Как бы я манипулировал этой матрицей, чтобы получить ожидаемые аргументы?
Кроме того, я написал свою собственную функцию взаимной информации, которая использует матрицу, но я не уверен в ее точности. Это выглядит правильно?
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 ответ
Я не знаю каких-либо встроенных функций взаимной информации в 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