LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
kpcfit_sub_bic.m
1function Nstar = map_kpcfit_bic(SA,orders,varargin)
2% function order = map_kpcfit_bic(SA,orders,...) returns the possible order for
3% a trace for the purpose of KPCfitting
4%
5% order = map_kpcfit_bic(SA,orders,...) returns the order of KPCmap as a power of 2,
6% SA is a sequence of autocorrelations of a trace, ordered from lag-1 to lag-n, and
7% orders is a range of orders that will be chosen from.
8
9
10nlags = length(SA);
11nlagsend = find(SA < 1e-6); % nlagsend = point of first decay below zero
12ordermax = max(orders);
13if isempty(nlagsend)
14 nlagsend = nlags;
15else
16 nlagsend = nlagsend(1)-1 + ordermax;
17end
18
19NLAGSMAX = 10000;
20
21if (nlagsend > NLAGSMAX)
22 SAlags = unique(round(logspace(log10(1),log10(nlagsend-ordermax),NLAGSMAX)));
23 len = length(SAlags);
24 temp = NLAGSMAX - length(SAlags);
25 step = (nlagsend-ordermax)^(1/NLAGSMAX);
26 i = 1;
27 while (((SAlags(i) - round(step^i)) < temp) && (i<=len))
28 i = i + 1;
29
30 end
31 SAlags = [1:SAlags(i),SAlags(i+1:end)];
32else
33 % if nlagsend-ordermax*2 < 0, suggest something to the user
34 if nlagsend > (ordermax)
35 SAlags = 1:(nlagsend-ordermax);
36 else
37 ordermax = nlagsend-2;
38 SAlags = 1:(nlagsend-ordermax);
39 orders = orders(find(orders<=ordermax));
40 end
41end
42%SAlags = linspace(ordermax+1,ordermax+1000,500);
43
44n_samples = length(SAlags);
45SAlags = round(SAlags);
46X = [];
47X = SA(SAlags);
48rarray = [];
49parray = [];
50rsarray = [];
51adjRarray = [];
52cp = [];
53AIC = [];
54mean_error = [];
55predict_error = [];
56SBC = [];
57sse_sacf = [];
58bpre = zeros(2,1);
59SAlags_y = SAlags;
60%SAlags_y = SAlags + ordermax;
61Y = SA(SAlags_y);
62j = ordermax;
63order = j;
64X = [];
65for i = 1:order
66 lags_x = SAlags_y + i;
67 X(:,end+1) = SA(lags_x);
68end
69
70Y_var = var(Y);
71%disp(size(Y));
72%disp(size(X));
73%X(:,end+1) = ones(size(X,1),1);
74warning off
75if length(Y) == 1
76 %[b,bint,r,rint,stats] = regress([Y;Y],[X;X])
77 MSEtotal = 1e6;
78else
79 [b,bint,r,rint,stats] = regress(Y,X);
80 MSEtotal = sum(r.^2)/(n_samples-1);
81end
82warning on
83
84
85for j = 1:length(orders)
86 order = orders(j);
87 X = [];
88 for i = 1:order
89 lags_x = SAlags_y + i;
90 X(:,end+1) = SA(lags_x);
91 end
92
93 Y_var = var(Y);
94 %X(:,end+1) = ones(size(X,1),1);
95 warning off all;
96 [b,bint,r,rint,stats] = regress(Y,X);
97 %predict_error(end+1) = norm(Ypredict - Xpredict(:,1:order)*b);
98 AIC(end+1) = n_samples*log(sum(r.^2)) - n_samples*log(n_samples) + 2*order;
99 SBC(end+1) = n_samples*log(sum(r.^2)) - n_samples*log(n_samples) + log(n_samples)*order;
100 cp(end+1) = sum(r.^2)/MSEtotal - (n_samples-2*order);
101 mean_error(end+1) = mean(r);
102 sse_sacf(end+1) = sum(r.^2)/sum(Y.^2);
103 %disp(bint);
104 adjR = 1 - sum(r.^2)/(n_samples-order)/Y_var;
105 adjRarray(end+1) = adjR;
106 bpre = b;
107 r = norm(r,2);
108 rarray(end+1) = r;
109 parray(end+1) = stats(4);
110 rsarray(end+1) = stats(1);
111
112
113 %disp(stats(3));
114end
115xaxis = orders;
116%h0 = plot(xaxis,mean_error);
117%h1 = plot(xaxis,rarray);
118%h2 = plot(xaxis,rsarray);
119%h3 = plot(xaxis,adjRarray);
120%h3 = plot(xaxis,parray);
121%h5 = plot(xaxis,cp);
122%h6 = plot(xaxis,AIC);
123%h7 = plot(xaxis,predict_error);
124if ~isempty(varargin)
125
126 h8 = plot(xaxis,SBC,varargin{1});
127end
128%h9 = plot(xaxis,sse_sacf);
129%hold on;
130%h2 = plot(xaxis,parray,'*');
131
132%h = gca;
133%legend(h,'R-norm','p-value');
134
135
136[v,ind] = sort(SBC,'ascend');
137
138Nstar = log2(orders(ind(1)));
139
140order = 2^Nstar;
141X = [];
142for i = 1:order
143 lags_x = SAlags_y + i;
144 X(:,end+1) = SA(lags_x);
145end
146
147warning off all;
148
149[b,bint,r,rint,stats] = regress(Y,X);
150rssrho = sum(r.^2)/sum(Y.^2);
151
152if (rssrho > 0.05)
153 disp('Warning! The residual sum of square indicates that the trace may not be well characterized by a MAP with less than 64 states!');
154
155 disp('##################################### Using another model for fitting is suggested! ########################################');
156
157end
158
159
160
161% a small example for the order 16 case
162
163
164end