1function [mmap,fF,fB] = mamap2m_fit_fb_multiclass(
map,p,F,B,classWeights,fbWeights)
2% Performs approximate fitting of a
MMAP given the underlying MAP,
3% the
class probabilities (always fitted exactly), the forward moments,
4% and the backward moments.
6% -
map: second-order AMAP underlying the MAMAP[m]
7% - p: vector of
class probabilities
8% - F: vector of forward moments
9% - B: vector of backward moments
10% - classWeights: optional vector of weights
for each class
11% - fbWeights: optional 2-vector of weights of forward and backward moments
13% - mmap: fitted MAMAP[m]
14% - fF: vector of optimal feasible forward moments
15% - fB: vector of optimal feasible backward moments
17if (size(
map{1},1) ~= 2)
18 error(
'Underlying MAP must be of second-order.');
21 error(
'Underlying MAP must be acyclic');
25elseif (
map{2}(1,1) == 0)
28 error('Underlying MAP must be in canonical acyclic form');
31%fprintf('Fitting MAMAP(2,m) F+B: form = %d\n', form);
36% default weights to use in the objective function
37if nargin < 5 || isempty(classWeights)
38 classWeights = ones(k,1);
41 fbWeights = ones(2,1);
56if (form == 1 && (r1 < degentol || r2 > 1-degentol || abs(h2-h1*r2) < degentol || abs(h1 - h2 + h2*r1) < degentol )) || ...
57 (form == 2 && (r2 > 1-degentol || abs(h1 - h2 + h2*r1) < degentol || abs(h1 - h2 - h1*r1 + h1*r1*r2) < degentol ))
60 % fprintf(
'Fitting MAMAP(2,m) F+B: detected Poisson process\n');
62 %
return marked poisson process
68 mmap{2+c} = mmap{2} * p(c);
71 fF = mmap_forward_moment(mmap,1);
72 fB = mmap_backward_moment(mmap,1);
76elseif (form == 2 && r2 < degentol && abs(1-r1) < degentol)
78 % DEGENERATE PHASE_TYPE
79 % fprintf(
'Fitting MAMAP(2,m) F+B: detected degenerate phase-type form\n');
81 % compute parameters of D11,D12,...,D1k
89elseif form == 1 && r2 < degentol
91 % CANONICAL PHASE_TYPE
92% fprintf(
'Fitting MAMAP(2,m) F+B: detected canonical phase-type form\n');
94% fprintf(
'Fitting MAMAP(2,m) F+B: fitting backward\n');
96 % convert to phase-type
101 mmap = maph2m_fit_multiclass(
aph, p, B, classWeights);
103 fF = mmap_forward_moment(mmap, 1);
104 fB = mmap_backward_moment(mmap, 1);
108elseif (form == 1 && abs(1-r1) < degentol) || ...
109 (form == 2 && abs(1-r1) < degentol)
111 % NON-CANONICAL PHASE_TYPE
112 % fprintf(
'Fitting MAMAP(2,m) F+B: detected non-canonical phase-type form\n');
114 % coefficients: q(j,c) = F(c) * q_f(j,c) + q_0(j,c)
119 q_f(1,c) = p(c) * ( -1/((h1 + h2*(r1 - 1))*(r2 - 1)*(r1 + r2 - r1*r2)) );
120 q_0(1,c) = p(c) * ( h2/((r2 - 1)*(r1 + r2 - r1*r2)*(h1 - h2 + h2*r1)) );
122 q_f(2,c) = p(c) * ( -1/(r2*(h1 + h2*(r1 - 1))*(r1 + r2 - r1*r2)) );
123 q_0(2,c) = p(c) * ( (h1 + h2*r1)/(r2*(r1 + r2 - r1*r2)*(h1 - h2 + h2*r1)) );
126 % inequality constraints
131 row = ((c-1)*4+(j-1)*2);
134 A(row+1,col+1) = q_f(j,c);
135 b(row+1) = 1 - q_0(j,c);
137 A(row+2,col+1) = - q_f(j,c);
142 % equality constraints
146 % equality constraints
149 beq(j) = beq(j) - q_0(j,c);
158 forwardWeight = (classWeights(c) * fbWeights(1));
159 H(base+1,base+1) = 2/F(c)^2 * forwardWeight;
160 h(base+1) = -2/F(c) * forwardWeight;
163 % solve optimization problem
167 % fprintf(
'Fitting MAMAP(2,m) F+B: F(%d) = %f -> %f\n', c, F(c), fF(c));
170 % compute parameters of D11,D12,...,D1k
176 q(2,c) = fF(c) * q_f(1,c) + q_0(1,c);
177 q(3,c) = fF(c) * q_f(2,c) + q_0(2,c);
180elseif form == 2 && r2 < degentol
182 % DEGENERATE CASE FOR gamma < 0
183 % fprintf(
'Fitting MAMAP(2,m) F+B: detected degenerate MMAP form\n');
185 if fbWeights(1) >= fbWeights(2)
187 % fprintf(
'Fitting MAMAP(2,m) F+B: fitting forward\n');
189 % coefficients: q(j,c) = F(c) * q_f(j,c) + q_0(j,c)
194 q_f(1,c) = p(c) * ( -(r1 - 2)/((h1 + h2*(r1 - 1))*(r1 - 1)) );
195 q_0(1,c) = p(c) * ( 1 - (h1 + h2)/((r1 - 1)*(h1 - h2 + h2*r1)) );
197 q_f(2,c) = p(c) * ( -(r1 - 2)/(h1 + h2*(r1 - 1)) );
198 q_0(2,c) = p(c) * ( (h2*(r1 - 2))/(h1 - h2 + h2*r1) );
201 % inequality constraints
206 row = ((c-1)*4+(j-1)*2);
209 A(row+1,col+1) = q_f(j,c);
210 b(row+1) = 1 - q_0(j,c);
212 A(row+2,col+1) = - q_f(j,c);
217 % equality constraints
221 % equality constraints
224 beq(j) = beq(j) - q_0(j,c);
233 forwardWeight = (classWeights(c) * fbWeights(1));
234 H(base+1,base+1) = 2/F(c)^2 * forwardWeight;
235 h(base+1) = -2/F(c) * forwardWeight;
238 % solve optimization problem
242 % fprintf(
'Fitting MAMAP(2,m) F+B: F(%d) = %f -> %f\n', c, F(c), fF(c));
245 % compute parameters of D11,D12,...,D1k
249 q(j,c) = fF(c) * q_f(j,c) + q_0(j,c);
258 % fprintf(
'Fitting MAMAP(2,m) F+B: fitting backward\n');
260 % coefficients: q(j,c) = F(c) * q_b(j,c) + q_0(j,c)
265 q_b(1,c) = p(c) * ( -(r1 - 2)/((h2 + h1*(r1 - 1))*(r1 - 1)) );
266 q_0(1,c) = p(c) * ( 1 - (h1 + h2)/((r1 - 1)*(h2 - h1 + h1*r1)) );
268 q_b(2,c) = p(c) * ( -(r1 - 2)/(h2 + h1*(r1 - 1)) );
269 q_0(2,c) = p(c) * ( (h1*(r1 - 2))/(h2 - h1 + h1*r1) );
272 % inequality constraints
277 row = ((c-1)*4+(j-1)*2);
280 A(row+1,col+1) = q_b(j,c);
281 b(row+1) = 1 - q_0(j,c);
283 A(row+2,col+1) = - q_b(j,c);
288 % equality constraints
292 % equality constraints
295 beq(j) = beq(j) - q_0(j,c);
304 backwardWeight = (classWeights(c) * fbWeights(2));
305 H(base+1,base+1) = 2/B(c)^2 * backwardWeight;
306 h(base+1) = -2/B(c) * backwardWeight;
309 % solve optimization problem
313 % fprintf(
'Fitting MAMAP(2,m) F+B: B(%d) = %f -> %f\n', c, B(c), fB(c));
316 % compute parameters of D11,D12,...,D1k
320 q(j,c) = fB(c) * q_b(j,c) + q_0(j,c);
331 % coefficients: q(j,c) = F(c) * q_f(j,c) + B(c) * q_b(j,c) + q_0(j,c)
337 % first canonical form (positive
auto-correlation decay)
339 q_b(1,c) = -(p(c)*(r1*r2 - r2 + 1))/((h2 - h1*r2)*(r1 - 1)*(r2 - 1));
340 q_0(1,c) = (p(c)*(h1 + h2 - h1*r2)*(r1*r2 - r2 + 1))/((h2 - h1*r2)*(r1 - 1)*(r2 - 1));
341 q_f(2,c) = -(p(c)*(r1*r2 - r2 + 1))/(r1*(h1 + h2*(r1 - 1))*(r2 - 1));
342 q_b(2,c) = -(p(c)*(r1*r2 - r2 + 1))/(r1*(h2 - h1*r2)*(r2 - 1));
343 q_0(2,c) = (p(c)*(r1*r2 - r2 + 1))/((r1 - 1)*(r2 - 1)) + (h1*p(c)*(r1*r2 - r2 + 1))/(r1*(h2 - h1*r2)*(r2 - 1)) - (h1*p(c)*(r1*r2 - r2 + 1))/(r1*(h1 + h2*(r1 - 1))*(r1 - 1)*(r2 - 1));
344 q_f(3,c) = -(p(c)*(r1*r2 - r2 + 1))/(r1*r2*(h1 - h2 + h2*r1));
346 q_0(3,c) = (p(c)*(h1 + h2*r1)*(r1*r2 - r2 + 1))/(r1*r2*(h1 - h2 + h2*r1));
348 % second canonical form (negative
auto-correlation decay)
350 q_b(1,c) = -(p(c)*(r1 + r2 - r1*r2 - 2))/((r1 - 1)*(r2 - 1)*(h1 - h2 - h1*r1 + h1*r1*r2));
351 q_0(1,c) = (p(c)*(h2 + h1*r1 - h1*r1*r2)*(r1 + r2 - r1*r2 - 2))/((r1 - 1)*(r2 - 1)*(h1 - h2 - h1*r1 + h1*r1*r2));
352 q_f(2,c) = (p(c)*(r1 + r2 - r1*r2 - 2))/((r2 - 1)*(h1 - h2 + h2*r1));
354 q_0(2,c) = -(h2*p(c)*(r1 + r2 - r1*r2 - 2))/((r2 - 1)*(h1 - h2 + h2*r1));
355 q_f(3,c) = (p(c)*(r1 + r2 - r1*r2 - 2))/(r2*(h1 + h2*(r1 - 1)));
356 q_b(3,c) = (p(c)*(r1 + r2 - r1*r2 - 2))/(r2*(h1 - h2 - h1*r1 + h1*r1*r2));
357 q_0(3,c) = (h1*p(c)*(r1 + r2 - r1*r2 - 2))/(r2*(h1 + h2*(r1 - 1))*(r1 - 1)) - (h1*p(c)*(r1 + r2 - r1*r2 - 2))/(r2*(h1 - h2 - h1*r1 + h1*r1*r2)) - (p(c)*(r1 + r2 - r1*r2 - 2))/(r2*(r1 - 1));
361 % inequality constraints
366 row = ((c-1)*6+(j-1)*2);
369 A(row+1,col+1) = q_f(j,c);
370 A(row+1,col+2) = q_b(j,c);
371 b(row+1) = 1 - q_0(j,c);
373 A(row+2,col+1) = - q_f(j,c);
374 A(row+2,col+2) = - q_b(j,c);
379 % equality constraints
383 % equality constraints
385 Aeq(j,(c-1)*2+1) = q_f(j,c);
386 Aeq(j,(c-1)*2+2) = q_b(j,c);
387 beq(j) = beq(j) - q_0(j,c);
396 forwardWeight = (classWeights(c) * fbWeights(1));
397 backwardweight = (classWeights(c) * fbWeights(2));
398 H(base+1,base+1) = 2/F(c)^2 * forwardWeight;
399 H(base+2,base+2) = 2/B(c)^2 * backwardweight;
400 h(base+1) = -2/F(c) * forwardWeight;
401 h(base+2) = -2/B(c) * backwardweight;
404 % solve optimization problem
407 % feasible set of moments
411 fF(c) = x((c-1)*2+1);
412 fB(c) = x((c-1)*2+2);
416 % fprintf(
'Fitting MAMAP(2,m) F+B: F(%d) = %f -> %f\n', c, F(c), fF(c));
417 % fprintf(
'Fitting MAMAP(2,m) F+B: B(%d) = %f -> %f\n', c, B(c), fB(c));
420 % compute parameters of D11,D12,...,D1k
424 q(j,c) = fF(c) * q_f(j,c) + fB(c) * q_b(j,c) + q_0(j,c);
429% compute D11,D12,...,D1k
432 mmap{2+c} = mmap{2} .* [q(1,c) 0; q(2,c) q(3,c)];
436 mmap{2+c} = mmap{2} .* [0 q(1,c); q(2,c) q(3,c)];
440fF = mmap_forward_moment(mmap, 1);
441fB = mmap_backward_moment(mmap, 1);
444 % fprintf(
'Fitting MAMAP(2,m) F+B: running quadratic programming solver...\n');
445 options = optimset(
'Algorithm',
'interior-point-convex',
'Display',
'none',
'MaxIter',3000);
446 %[x,fx,xflag] = quadprog(H, h, A, b, Aeq, beq, [], [], [], options);
447 lb = 1e-6*ones( size(A,2),1);
448 ub = 1e6*ones( size(A,2),1);
449 [x,fx,xflag]=QP(H, h, A, b, Aeq, beq, lb, ub, options);
451 error(
'Quadratic programming solver failed: %d\n', xflag);
453 fit_error = fx + length(x);
454 %fprintf(
'Fitting MAMAP(2,m) F+B: error = %e\n', fit_error);