1. 程式人生 > >列向量互資訊計算通用MATLAB程式碼

列向量互資訊計算通用MATLAB程式碼

互資訊的定義
正式地,兩個離散隨機變數 X 和 Y 的互資訊可以定義為:

其中 p(x,y) 是 X 和 Y 的聯合概率分佈函式,而p(x)和p(y)分別是 X 和 Y 的邊緣概率分佈函式。

其中 p(x,y) 當前是 X 和 Y 的聯合概率密度函式,而p(x)和p(y)分別是 X 和 Y 的邊緣概率密度函式。

互資訊量I(xi;yj)在聯合概率空間P(XY)中的統計平均值。 平均互資訊I(X;Y)克服了互資訊量I(xi;yj)的隨機性,成為一個確定的量。如果對數以 2 為基底,互資訊的單位是bit。

直觀上,互資訊度量 X 和 Y 共享的資訊:它度量知道這兩個變數其中一個,對另一個不確定度減少的程度。例如,如果 X 和 Y 相互獨立,則知道 X 不對 Y 提供任何資訊,反之亦然,所以它們的互資訊為零。在另一個極端,如果 X 是 Y 的一個確定性函式,且 Y 也是 X 的一個確定性函式,那麼傳遞的所有資訊被 X 和 Y 共享:知道 X 決定 Y 的值,反之亦然。因此,在此情形互資訊與 Y(或 X)單獨包含的不確定度相同,稱作 Y(或 X)的熵。而且,這個互資訊與 X 的熵和 Y 的熵相同。(這種情形的一個非常特殊的情況是當 X 和 Y 為相同隨機變數時。)

此外,互資訊是非負的(即 I(X;Y) ≥ 0; 見下文),而且是對稱的(即 I(X;Y) = I(Y;X))。

通用MATLAB程式碼
主函式main.m

clc
u1 = rand(4,1);
u2 = [2;32;6666;5];
wind_size = size(u1,1);
mi = calmi(u1, u2, wind_size);

calmi.m

%計算兩列向量之間的互資訊
%u1:輸入計算的向量1
%u2:輸入計算的向量2
%wind_size:向量的長度
function mi = calmi(u1, u2, wind_size)
x = [u1, u2]
; n = wind_size; [xrow, xcol] = size(x); bin = zeros(xrow,xcol); pmf = zeros(n, 2); for i = 1:2 minx = min(x(:,i)); maxx = max(x(:,i)); binwidth = (maxx - minx) / n; edges = minx + binwidth*(0:n); histcEdges = [-Inf edges(2:end-1) Inf]; [occur,bin(:,i)] = histc(x(:,i),histcEdges,1
); %通過直方圖方式計算單個向量的直方圖分佈 pmf(:,i) = occur(1:n)./xrow; end %計算u1和u2的聯合概率密度 jointOccur = accumarray(bin,1,[n,n]); %(xi,yi)兩個資料同時落入n*n等分方格中的數量即為聯合概率密度 jointPmf = jointOccur./xrow; Hx = -(pmf(:,1))'*log2(pmf(:,1)+eps); Hy = -(pmf(:,2))'*log2(pmf(:,2)+eps); Hxy = -(jointPmf(:))'*log2(jointPmf(:)+eps); MI = Hx+Hy-Hxy; mi = MI/sqrt(Hx*Hy);