annotate private/mc_global_info.m @ 18:062d46712995 tip

Moved mc_global_info1 back to public folder
author samer
date Mon, 02 Apr 2012 21:50:43 +0100
parents 0e0f2805ef9c
children
rev   line source
samer@11 1 function [Info,ergodic]=mc_global_info(T,pz)
samer@0 2 % mc_global_info - Three global information measures about stationary MC
samer@0 3 %
samer@0 4 % mc_global_info :: [[N,N]] ~'transmat' -> [[3]].
samer@0 5 %
samer@0 6 % mc_global_info ::
samer@0 7 % [[N,N]] ~'transmat',
samer@0 8 % [[N]] ~'stationary distribution if already known'
samer@11 9 % -> [[3]],bool.
samer@0 10 %
samer@0 11 % The three measures in order are
samer@0 12 % Entropy rate H(X|Z)
samer@0 13 % Redundancy I(X,Z)
samer@0 14 % Predictive information rate I(X,Y|Z)
samer@7 15 % All in NATS, not bits.
samer@0 16
samer@0 17
samer@0 18 n=size(T,1);
samer@11 19 if nargin<2, pz=mc_fixpt(T,0.001); end
samer@0 20
samer@11 21 ergodic=(size(pz,2)==1);
samer@11 22 if ergodic && all(isfinite(pz))
samer@0 23
samer@11 24 TlogT=T.*slog(T);
samer@11 25 HXZ=-sum(TlogT,1)*pz;
samer@0 26
samer@11 27 pxz=T; % p(x|z)
samer@11 28 pyxz=repmat(T,[1,1,n]).*repmat(shiftdim(T,-1),[n,1,1]); % p(y,x|z)
samer@11 29 pyz=sum(pyxz,2); % p(y|z)
samer@11 30 pyz(pyz==0)=realmin;
samer@11 31 pxyz=permute(pyxz./repmat(pyz,[1,n,1]),[2,1,3]); % p(x|y,z)
samer@0 32
samer@11 33 HXYz=-shiftdim(sum(sum(permute(pyxz,[2,1,3]).*slog(pxyz),1),2),2); % H(X|Y,z)
samer@11 34 IXYZ=(-HXYz' - sum(pxz.*slog(pxz)))*pz;
samer@0 35
samer@11 36 IXZ=max(0,(sum(TlogT)-slog(pz)')*pz);
samer@11 37
samer@11 38
samer@11 39 Info=[HXZ;IXZ;IXYZ];
samer@11 40 if any(~isreal(Info))
samer@11 41 disp('unreal information');
samer@11 42 ergodic=0;
samer@11 43 elseif any(Info<0)
samer@11 44 if any(Info<-eps)
samer@11 45 disp('negative information');
samer@11 46 disp(pz');
samer@11 47 disp(Info');
samer@11 48 ergodic=0;
samer@11 49 else
samer@11 50 Info=max(0,Info);
samer@11 51 end
samer@0 52 end
samer@11 53 else
samer@11 54 Info=[0;0;0];
samer@0 55 end
samer@0 56
samer@0 57 function y=slog(x)
samer@0 58 % slog - safe log, x<=0 => slog(x)=0
samer@0 59 %
samer@0 60 % slog :: real -> real.
samer@0 61
samer@0 62 x(x<=0)=1;
samer@0 63 y=log(x);
samer@0 64