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
|