comparison scripts/study_analysis_rec_algos_noisy.m @ 22:2dd78e37b23a

ABS approx script is working Started working on parallel
author nikcleju
date Wed, 09 Nov 2011 00:11:14 +0000
parents
children
comparison
equal deleted inserted replaced
21:2805288d6656 22:2dd78e37b23a
1 % File: study_analysis_rec_algos
2 % Run global experiment to compare algorithms used for analysis-based reconstruction
3 % and plot phast transition graphs
4
5 clear all
6 close all
7
8 % =================================
9 % Set up experiment parameters
10 %==================================
11 % Which form factor, delta and rho we want
12 sigmas = 1.2;
13 deltas = 0.05:0.05:0.95;
14 rhos = 0.05:0.05:0.95;
15 % deltas = [0.95];
16 % rhos = [0.1];
17 %deltas = 0.3:0.3:0.9;
18 %rhos = 0.3:0.3:0.9;
19
20 % Number of vectors to generate each time
21 numvects = 100;
22
23 % Add noise
24 % This is norm(signal)/norm(noise), so power, not energy
25 SNRdb = 20; % virtually no noise
26
27 % Show progressbar ? (not recommended when running on parallel threads)
28 do_progressbar = 0;
29
30 % Value of lambda
31 lambda = 1e-2;
32
33 % What algos to run
34 do_abs_ompk = 1;
35 do_abs_ompeps = 1;
36 do_abs_tst = 1;
37 do_abs_bp = 1;
38 do_gap = 1;
39 do_nesta = 0;
40
41 % =================================
42 % Processing the parameters
43 %==================================
44 % Set up parameter structure
45 count = 0;
46 for isigma = 1:sigmas
47 for idelta = 1:numel(deltas)
48 for irho = 1:numel(rhos)
49 sigma = sigmas(isigma);
50 delta = deltas(idelta);
51 rho = rhos(irho);
52
53 d = 200;
54 p = round(sigma*d);
55 m = round(delta*d);
56 l = round(d - rho*m);
57
58 params(count+1).d = d;
59 params(count+1).p = p;
60 params(count+1).m = m;
61 params(count+1).l = l;
62
63 count = count + 1;
64 end
65 end
66 end
67
68 % Compute noiselevel from db
69 noiselevel = 1 / (10^(SNRdb/10));
70
71 %load study_analysis_init
72
73 % Generate an analysis operator Omega
74 Omega = Generate_Analysis_Operator(d, p);
75
76 % Progressbar
77 if do_progressbar
78 progressbar('Total', 'Current parameters');
79 end
80
81 % Init times
82 elapsed_abs_ompk = 0;
83 elapsed_abs_ompeps = 0;
84 elapsed_abs_tst = 0;
85 elapsed_abs_bp = 0;
86 elapsed_gap = 0;
87 elapsed_nesta = 0;
88
89 % Init results structure
90 results = [];
91
92 % Prepare progressbar reduction variables
93 % if do_progressbar
94 % incr2 = 1/numvects;
95 % incr1 = 1/numvects/count;
96 % frac2 = 0;
97 % frac1 = 0;
98 % end
99
100 % ========
101 % Run
102 % ========
103 parfor iparam = 1:numel(params)
104
105 % Read current parameters
106 d = params(iparam).d;
107 p = params(iparam).p;
108 m = params(iparam).m;
109 l = params(iparam).l;
110
111 % Init stuff
112 xrec_abs_ompk = zeros(d, numvects);
113 xrec_abs_ompeps = zeros(d, numvects);
114 xrec_abs_tst = zeros(d, numvects);
115 xrec_abs_bp = zeros(d, numvects);
116 xrec_gap = zeros(d, numvects);
117 xrec_nesta = zeros(d, numvects);
118 %
119 err_abs_ompk = zeros(numvects,1);
120 relerr_abs_ompk = zeros(numvects,1);
121 err_abs_ompeps = zeros(numvects,1);
122 relerr_abs_ompeps = zeros(numvects,1);
123 err_abs_tst = zeros(numvects,1);
124 relerr_abs_tst = zeros(numvects,1);
125 err_abs_bp = zeros(numvects,1);
126 relerr_abs_bp = zeros(numvects,1);
127 err_gap = zeros(numvects,1);
128 relerr_gap = zeros(numvects,1);
129 err_nesta = zeros(numvects,1);
130 relerr_nesta = zeros(numvects,1);
131
132 % Generate data based on parameters
133 [x0,y,M,Lambda] = Generate_Data_Known_Omega(Omega, d,p,m,l,noiselevel, numvects,'l0');
134
135 % For every generated signal do
136 for iy = 1:size(y,2)
137
138 % Compute epsilon
139 epsilon = noiselevel * norm(y(:,iy));
140
141 %--------------------------------
142 % Reconstruct (and measure delay)
143 % Compute reconstruction error
144 %--------------------------------
145 % ABS-OMPk
146 if (do_abs_ompk)
147 timer_abs_ompk = tic;
148 xrec_abs_ompk(:,iy) = ABS_OMPk_approx(y(:,iy), Omega, M, p-l, lambda);
149 elapsed_abs_ompk = elapsed_abs_ompk + toc(timer_abs_ompk);
150 %
151 err_abs_ompk(iy) = norm(x0(:,iy) - xrec_abs_ompk(:,iy));
152 relerr_abs_ompk(iy) = err_abs_ompk(iy) / norm(x0(:,iy));
153 end
154 % ABS-OMPeps
155 if (do_abs_ompeps)
156 timer_abs_ompeps = tic;
157 xrec_abs_ompeps(:,iy) = ABS_OMPeps_approx(y(:,iy), Omega, M, epsilon, lambda);
158 elapsed_abs_ompeps = elapsed_abs_ompeps + toc(timer_abs_ompeps);
159 %
160 err_abs_ompeps(iy) = norm(x0(:,iy) - xrec_abs_ompeps(:,iy));
161 relerr_abs_ompeps(iy) = err_abs_ompeps(iy) / norm(x0(:,iy));
162 end
163 % ABS-TST
164 if (do_abs_tst)
165 timer_abs_tst = tic;
166 xrec_abs_tst(:,iy) = ABS_TST_approx(y(:,iy), Omega, M, epsilon, lambda);
167 elapsed_abs_tst = elapsed_abs_tst + toc(timer_abs_tst);
168 %
169 err_abs_tst(iy) = norm(x0(:,iy) - xrec_abs_tst(:,iy));
170 relerr_abs_tst(iy) = err_abs_tst(iy) / norm(x0(:,iy));
171 end
172 % ABS-BP
173 if (do_abs_bp)
174 timer_abs_bp = tic;
175 xrec_abs_bp(:,iy) = ABS_BP_approx(y(:,iy), Omega, M, epsilon, lambda);
176 elapsed_abs_bp = elapsed_abs_bp + toc(timer_abs_bp);
177 %
178 err_abs_bp(iy) = norm(x0(:,iy) - xrec_abs_bp(:,iy));
179 relerr_abs_bp(iy) = err_abs_bp(iy) / norm(x0(:,iy));
180 end
181 % GAP
182 if (do_gap)
183 gapparams = [];
184 gapparams.num_iteration = 40;
185 gapparams.greedy_level = 0.9;
186 gapparams.stopping_coefficient_size = 1e-4;
187 gapparams.l2solver = 'pseudoinverse';
188 gapparams.noise_level = noiselevel;
189 timer_gap = tic;
190 xrec_gap(:,iy) = GAP(y(:,iy), M, M', Omega, Omega', gapparams, zeros(d,1));
191 elapsed_gap = elapsed_gap + toc(timer_gap);
192 %
193 err_gap(iy) = norm(x0(:,iy) - xrec_gap(:,iy));
194 relerr_gap(iy) = err_gap(iy) / norm(x0(:,iy));
195 end
196 % NESTA
197 if (do_nesta)
198 try
199 timer_nesta = tic;
200 xrec_nesta(:,iy) = do_nesta_DemoNonProjector(x0(:,iy), M, Omega', 0);
201 elapsed_nesta = elapsed_nesta + toc(timer_nesta);
202 catch err
203 disp('*****ERROR: NESTA throwed error *****');
204 xrec_nesta(:,iy) = zeros(size(x0(:,iy)));
205 end
206 %
207 err_nesta(iy) = norm(x0(:,iy) - xrec_nesta(:,iy));
208 relerr_nesta(iy) = err_nesta(iy) / norm(x0(:,iy));
209 end
210
211 % Update progressbar
212 % if do_progressbar
213 % %frac2 = iy/numvects;
214 % %frac1 = ((iparam-1) + frac2) / count;
215 % if norm(frac2 - 1) < 1e-6
216 % frac2 = 0;
217 % end
218 % frac2 = frac2 + incr2;
219 % frac1 = frac1 + incr1;
220 % progressbar(frac1, frac2);
221 % end
222 end
223
224 %--------------------------------
225 % Save results in big stucture & display
226 %--------------------------------
227 % Save reconstructed signals
228 % Save rel & abs errors
229 % Display error
230 disp(['Simulation no. ' num2str(iparam)]);
231 if (do_abs_ompk)
232 results(iparam).xrec_abs_ompk = xrec_abs_ompk;
233 results(iparam).err_abs_ompk = err_abs_ompk;
234 results(iparam).relerr_abs_ompk = relerr_abs_ompk;
235 disp([' ABS_OMPk: avg relative error = ' num2str(mean(relerr_abs_ompk))]);
236 end
237 if (do_abs_ompeps)
238 results(iparam).xrec_abs_ompeps = xrec_abs_ompeps;
239 results(iparam).err_abs_ompeps = err_abs_ompeps;
240 results(iparam).relerr_abs_ompeps = relerr_abs_ompeps;
241 disp([' ABS_OMPeps: avg relative error = ' num2str(mean(relerr_abs_ompeps))]);
242 end
243 if (do_abs_tst)
244 results(iparam).xrec_abs_tst = xrec_abs_tst;
245 results(iparam).err_abs_tst = err_abs_tst;
246 results(iparam).relerr_abs_tst = relerr_abs_tst;
247 disp([' ABS_TST: avg relative error = ' num2str(mean(relerr_abs_tst))]);
248 end
249 if (do_abs_bp)
250 results(iparam).xrec_abs_bp = xrec_abs_bp;
251 results(iparam).err_abs_bp = err_abs_bp;
252 results(iparam).relerr_abs_bp = relerr_abs_bp;
253 disp([' ABS_BP: avg relative error = ' num2str(mean(relerr_abs_bp))]);
254 end
255 if (do_gap)
256 results(iparam).xrec_gap = xrec_gap;
257 results(iparam).err_gap = err_gap;
258 results(iparam).relerr_gap = relerr_gap;
259 disp([' GAP: avg relative error = ' num2str(mean(relerr_gap))]);
260 end
261 if (do_nesta)
262 results(iparam).xrec_nesta = xrec_nesta;
263 results(iparam).err_nesta = err_nesta;
264 results(iparam).relerr_nesta = relerr_nesta;
265 disp([' NESTA: avg relative error = ' num2str(mean(relerr_nesta))]);
266 end
267 end
268
269 % =================================
270 % Save
271 % =================================
272 save mat/avgerr_SNR20_lbd1e-2
273
274 % =================================
275 % Plot phase transition
276 % =================================
277 %--------------------------------
278 % Prepare
279 %--------------------------------
280 %d = 200;
281 %m = 190;
282 %exactthr = d/m * noiselevel;
283 %sigma = 1.2;
284 iparam = 1;
285 for idelta = 1:numel(deltas)
286 for irho = 1:numel(rhos)
287 % Create exact recovery count matrix
288 % nexact_abs_bp (irho, idelta) = sum(results(iparam).relerr_abs_bp < exactthr);
289 % nexact_abs_ompk (irho, idelta) = sum(results(iparam).relerr_abs_ompk < exactthr);
290 % nexact_abs_ompeps (irho, idelta) = sum(results(iparam).relerr_abs_ompeps < exactthr);
291 % nexact_gap (irho, idelta) = sum(results(iparam).relerr_gap < exactthr);
292 % nexact_abs_tst (irho, idelta) = sum(results(iparam).relerr_abs_tst < exactthr);
293 % % nexact_nesta(irho, idelta) = sum(results(iparam).relerr_nesta < exactthr);
294
295 % Get histogram (for a single param set only!)
296 % hist_abs_ompk = hist(results(iparam).relerr_abs_ompk, 0.001:0.001:0.1);
297 % hist_abs_ompeps = hist(results(iparam).relerr_abs_ompeps, 0.001:0.001:0.1);
298 % hist_abs_tst = hist(results(iparam).relerr_abs_tst, 0.001:0.001:0.1);
299 % hist_abs_bp = hist(results(iparam).relerr_abs_bp, 0.001:0.001:0.1);
300 % hist_gap = hist(results(iparam).relerr_gap, 0.001:0.001:0.1);
301
302 % Compute average error value
303 if (do_abs_ompk)
304 avgerr_abs_ompk(irho, idelta) = 1 - mean(results(iparam).relerr_abs_ompk);
305 avgerr_abs_ompk(avgerr_abs_ompk < 0) = 0;
306 end
307 if (do_abs_ompeps)
308 avgerr_abs_ompeps(irho, idelta) = 1 - mean(results(iparam).relerr_abs_ompeps);
309 avgerr_abs_ompeps(avgerr_abs_ompeps < 0) = 0;
310 end
311 if (do_abs_tst)
312 avgerr_abs_tst(irho, idelta) = 1 - mean(results(iparam).relerr_abs_tst);
313 avgerr_abs_tst(avgerr_abs_tst < 0) = 0;
314 end
315 if (do_abs_bp)
316 avgerr_abs_bp(irho, idelta) = 1 - mean(results(iparam).relerr_abs_bp);
317 avgerr_abs_bp(avgerr_abs_bp < 0) = 0;
318 end
319 if (do_gap)
320 avgerr_gap(irho, idelta) = 1 - mean(results(iparam).relerr_gap);
321 avgerr_gap(avgerr_gap < 0) = 0;
322 end
323 if (do_nesta)
324 avgerr_nesta(irho, idelta) = 1 - mean(results(iparam).relerr_nesta);
325 avgerr_nesta(avgerr_nesta < 0) = 0;
326 end
327
328 iparam = iparam + 1;
329 end
330 end
331
332 %--------------------------------
333 % Plot
334 %--------------------------------
335 show_phasetrans = @show_phasetrans_win;
336 iptsetpref('ImshowAxesVisible', 'on');
337 close all
338 figbase = 'figs/avgerr_SNR20_lbd1e-2_';
339 do_save = 1;
340 %
341 if (do_abs_ompk)
342 figure;
343 %h = show_phasetrans(nexact_abs_ompk, numvects);
344 %bar(0.001:0.001:0.1, hist_abs_ompk);
345 h = show_phasetrans(avgerr_abs_ompk, 1);
346 if do_save
347 figname = [figbase 'ABS_OMPk'];
348 saveas(h, [figname '.fig']);
349 saveas(h, [figname '.png']);
350 saveTightFigure(h, [figname '.pdf']);
351 end
352 end
353 %
354 if (do_abs_ompeps)
355 figure;
356 %h = show_phasetrans(nexact_abs_ompeps, numvects);
357 %bar(0.001:0.001:0.1, hist_abs_ompeps);
358 h = show_phasetrans(avgerr_abs_ompeps, 1);
359 if do_save
360 figname = [figbase 'ABS_OMPeps'];
361 saveas(h, [figname '.fig']);
362 saveas(h, [figname '.png']);
363 saveTightFigure(h, [figname '.pdf']);
364 end
365 end
366 %
367 if (do_abs_tst)
368 figure;
369 %h = show_phasetrans(nexact_abs_tst, numvects);
370 %bar(0.001:0.001:0.1, hist_abs_tst);
371 h = show_phasetrans(avgerr_abs_tst, 1);
372 if do_save
373 figname = [figbase 'ABS_TST'];
374 saveas(h, [figname '.fig']);
375 saveas(h, [figname '.png']);
376 saveTightFigure(h, [figname '.pdf']);
377 end
378 end
379 %
380 if (do_abs_bp)
381 figure;
382 %h = show_phasetrans(nexact_abs_bp, numvects);
383 %bar(0.001:0.001:0.1, hist_abs_bp);
384 h = show_phasetrans(avgerr_abs_bp, 1);
385 if do_save
386 figname = [figbase 'ABS_BP'];
387 saveas(h, [figname '.fig']);
388 saveas(h, [figname '.png']);
389 saveTightFigure(h, [figname '.pdf']);
390 end
391 end
392 %
393 if (do_gap)
394 figure;
395 %h = show_phasetrans(nexact_gap, numvects);
396 %bar(0.001:0.001:0.1, hist_gap);
397 h = show_phasetrans(avgerr_gap, 1);
398 if do_save
399 figname = [figbase 'GAP'];
400 saveas(h, [figname '.fig']);
401 saveas(h, [figname '.png']);
402 saveTightFigure(h, [figname '.pdf']);
403 end
404 end
405 %
406 if (do_nesta)
407 figure;
408 %h = show_phasetrans(nexact_nesta, numvects);
409 %bar(0.001:0.001:0.1, hist_nesta);
410 h = show_phasetrans(avgerr_nesta, 1);
411 if do_save
412 figname = [figbase 'NESTA'];
413 saveas(h, [figname '.fig']);
414 saveas(h, [figname '.png']);
415 saveTightFigure(h, [figname '.pdf']);
416 end
417 end