LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
PHFromTraceByGFit.m
1function [alpha, A] = PHFromTraceByGFit (trace, orders)
2
3 M = length(orders);
4 K = length(trace);
5
6 % initial alpha and lambda is such that the mean is matched
7 alphav = ones(1,M) / M;
8 lambda = diag(orders) * (1:M)';
9 trm = sum(trace)/length(trace);
10 inim = sum(alphav ./ (1:M));
11 lambda = lambda * inim / trm;
12
13 Q = zeros(M, K);
14 ologli = 1;
15 logli = 0;
16 while abs(ologli-logli)>1e-7
17 ologli = logli;
18 % E-step:
19 for i=1:M
20 Q(i,:) = (alphav(i)*(lambda(i)*trace).^(orders(i)-1) / factorial(orders(i)-1) * lambda(i)) .* exp(-lambda(i)*trace);
21 end
22 logli = sum(log(sum(Q,1))) / K
23 nor = sum(Q,1);
24 for i=1:M
25 Q(i,:) = Q(i,:) ./ nor;
26 end
27 % M-step:
28 v1 = sum(Q,2);
29 v2 = Q*trace;
30 alphav = v1'/K;
31 lambda = diag(orders)*v1 ./ v2;
32 end
33
34 N = sum(orders);
35 alpha = zeros(1,N);
36 A = zeros (N);
37 ix = 1;
38 for i=1:M
39 alpha(ix) = alphav(i);
40 A(ix:ix+orders(i)-1, ix:ix+orders(i)-1) = lambda(i)*(diag(ones(1,orders(i)-1),1)-diag(ones(1,orders(i))));
41 ix = ix + orders(i);
42 end
43
44end
45