-
Notifications
You must be signed in to change notification settings - Fork 64
/
Copy pathspm_kl_wishart.m
43 lines (32 loc) · 963 Bytes
/
spm_kl_wishart.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function [kl] = spm_kl_wishart (q,Q,p,P)
% KL divergence between two Wishart densities
% FORMAT [kl] = spm_kl_wishart (q,Q,p,P)
%
% Calculate KL (Q||P) = <log Q/P> where avg is wrt Q
% between two Wishart densities Q and P
%
% q,Q Parameters of first density
% p,P Parameters of first density
%___________________________________________________________________________
% Copyright (C) 2008 Wellcome Trust Centre for Neuroimaging
% Will Penny
% $Id: spm_kl_wishart.m 1276 2008-03-28 18:29:19Z guillaume $
logdetQ=log(det(Q));
logdetP=log(det(P));
% Get dimension
d=size(Q,1);
LqQ=0;
for i=1:d,
LqQ=LqQ+psi((q+1-i)/2);
end
LqQ=LqQ+d*log(2)-logdetQ;
LpP=0;
for i=1:d,
LpP=LpP+psi((p+1-i)/2);
end
LpP=LpP+d*log(2)-logdetP;
logZqQ=0.5*q*d*log(2)-0.5*q*logdetQ+spm_lg_gamma(d,q/2);
logZpP=0.5*p*d*log(2)-0.5*p*logdetP+spm_lg_gamma(d,p/2);
Qinv=inv(Q);
kl=0.5*(q-d-1)*LqQ-0.5*(p-d-1)*LpP-0.5*q*d+0.5*q*trace(P*Qinv);
kl=kl+logZpP-logZqQ;