Mercurial > hg > pycsalgos
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 |