2011-05-27 54 views
6

我有一個方形矩陣,它表示數據集中共現事件的頻率計數。換句話說,這些行表示特徵1的所有可能的觀察值,並且這些列是特徵2的可能觀察值。單元格(x,y)中的數目是特徵1被同時觀察爲x的次數特徵2是y。MATLAB矩陣的相互信息

我想計算矩陣中包含的互信息。 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 

回答

6

我不知道MATLAB中的任何內置互信息函數。也許你有從MathWorks File Exchangeother third-party developer code提交的意見書?

我認爲您的計算方式可能有問題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 
+0

該函數返回值相同本人原創,所以我相信他們是等效的。不過,你的更優雅。 – Colin 2011-05-30 17:14:11