annotate matlab/study_analysis_rec_approx.m @ 54:527b0f6a9ffc

Changed dictionary structure
author nikcleju
date Wed, 14 Dec 2011 14:37:20 +0000
parents
children
rev   line source
nikcleju@54 1 % File: study_analysis_rec_algos
nikcleju@54 2 % Run experiment to prove that our approx. ABS approach really converges to
nikcleju@54 3 % the anaysis solution as lambda -> infty
nikcleju@54 4 % For this, we need to generate signals that, provably, yield bad results
nikcleju@54 5 % with synthesis recovery, and good results with analysis recovery
nikcleju@54 6 % To do this we choose, N >> d, small l, and m close to d
nikcleju@54 7
nikcleju@54 8 clear all
nikcleju@54 9 close all
nikcleju@54 10
nikcleju@54 11 % =================================
nikcleju@54 12 % Set up experiment parameters
nikcleju@54 13 %==================================
nikcleju@54 14 % Which form factor, delta and rho we want
nikcleju@54 15 sigma = 2;
nikcleju@54 16 %delta = 0.995;
nikcleju@54 17 %rho = 0.7;
nikcleju@54 18 %delta = 0.8;
nikcleju@54 19 %rho = 0.15;
nikcleju@54 20 delta = 0.5;
nikcleju@54 21 rho = 0.05;
nikcleju@54 22
nikcleju@54 23 % Number of vectors to generate each time
nikcleju@54 24 numvects = 10;
nikcleju@54 25
nikcleju@54 26 % Add noise
nikcleju@54 27 % This is norm(signal)/norm(noise), so power, not energy
nikcleju@54 28 SNRdb = 20;
nikcleju@54 29 %epsextrafactor = 2
nikcleju@54 30
nikcleju@54 31 % =================================
nikcleju@54 32 % Processing the parameters
nikcleju@54 33 %==================================
nikcleju@54 34
nikcleju@54 35 % Compute noiselevel from db
nikcleju@54 36 noiselevel = 1 / (10^(SNRdb/10));
nikcleju@54 37
nikcleju@54 38 % Set up parameter structure
nikcleju@54 39 % and generate data X as well
nikcleju@54 40 d = 50;
nikcleju@54 41 p = round(sigma*d);
nikcleju@54 42 m = round(delta*d);
nikcleju@54 43 l = round(d - rho*m);
nikcleju@54 44
nikcleju@54 45 % Generate Omega and data based on parameters
nikcleju@54 46 Omega = Generate_Analysis_Operator(d, p);
nikcleju@54 47 %Make Omega more coherent
nikcleju@54 48 [U, S, V] = svd(Omega);
nikcleju@54 49 %Sdnew = diag(S) ./ (1:numel(diag(S)))';
nikcleju@54 50 Sdnew = diag(S) .* (1:numel(diag(S)))'; % Make D coherent, not Omega!
nikcleju@54 51 Snew = [diag(Sdnew); zeros(size(S,1) - size(S,2), size(S,2))];
nikcleju@54 52 Omega = U * Snew * V';
nikcleju@54 53 [x0,y,M,Lambda, realnoise] = Generate_Data_Known_Omega(Omega, d,p,m,l,noiselevel, numvects,'l0');
nikcleju@54 54
nikcleju@54 55 datafilename = 'mat/data_SNR20';
nikcleju@54 56 save(datafilename);
nikcleju@54 57 %load mat/data_SNR20
nikcleju@54 58
nikcleju@54 59 % Values of lambda
nikcleju@54 60 %lambdas = sqrt([1e-10 1e-8 1e-6 1e-4 1e-2 1 100 1e4 1e6 1e8 1e10]);
nikcleju@54 61 lambdas = [0 10.^linspace(-5, 4, 10)];
nikcleju@54 62 %lambdas = 1000
nikcleju@54 63 %lambdas = sqrt([0 1 10000]);
nikcleju@54 64
nikcleju@54 65 % Algorithm identifiers
nikcleju@54 66 algonone = [];
nikcleju@54 67 ompk = 1;
nikcleju@54 68 ompeps = 2;
nikcleju@54 69 tst = 3;
nikcleju@54 70 bp = 4;
nikcleju@54 71 gap = 5;
nikcleju@54 72 nesta = 6;
nikcleju@54 73 sl0 = 7;
nikcleju@54 74 yall1 = 8;
nikcleju@54 75 spgl1 = 9;
nikcleju@54 76 nestasynth = 10;
nikcleju@54 77 numallalgos = 10;
nikcleju@54 78 algoname{ompk} = 'ABS OMPk';
nikcleju@54 79 algoname{ompeps} = 'ABS OMPeps';
nikcleju@54 80 algoname{tst} = 'ABS TST';
nikcleju@54 81 algoname{bp} = 'ABS BP';
nikcleju@54 82 algoname{gap} = 'GAP';
nikcleju@54 83 algoname{nesta} = 'NESTA Analysis';
nikcleju@54 84 algoname{sl0} = 'ABS SL0';
nikcleju@54 85 algoname{yall1} = 'ABS YALL1';
nikcleju@54 86 algoname{spgl1} = 'ABS SPGL1';
nikcleju@54 87 algoname{nestasynth} = 'NESTA Synth';
nikcleju@54 88
nikcleju@54 89 % What algos to run
nikcleju@54 90 %algos = [gap, ompk, ompeps, tst, bp, sl0, yall1];
nikcleju@54 91 %algos = [gap, ompk, ompeps, tst, bp];
nikcleju@54 92 algos = [gap, sl0];
nikcleju@54 93 numalgos = numel(algos);
nikcleju@54 94
nikcleju@54 95 % Save mat file?
nikcleju@54 96 do_save_mat = 0;
nikcleju@54 97 matfilename = 'mat/approx_d50_sigma2_SNR20db_Dcoh';
nikcleju@54 98
nikcleju@54 99 % Save figures?
nikcleju@54 100 do_save_figs = 0;
nikcleju@54 101 figfilename = 'figs/approx_d50_sigma2_SNR20db_Dcoh';
nikcleju@54 102
nikcleju@54 103 % Show progressbar ? (not recommended when running on parallel threads)
nikcleju@54 104 do_progressbar = 0;
nikcleju@54 105 if do_progressbar
nikcleju@54 106 progressbar('Total', 'Current parameters');
nikcleju@54 107 end
nikcleju@54 108
nikcleju@54 109 % Init times
nikcleju@54 110 for i = 1:numalgos
nikcleju@54 111 elapsed(algos(i)) = 0;
nikcleju@54 112 end
nikcleju@54 113
nikcleju@54 114 % Init results structure
nikcleju@54 115 results = [];
nikcleju@54 116
nikcleju@54 117
nikcleju@54 118 % ========
nikcleju@54 119 % Run
nikcleju@54 120 % ========
nikcleju@54 121
nikcleju@54 122 % Run GAP and NESTA first
nikcleju@54 123 if any(algos == gap)
nikcleju@54 124 for iy = 1:size(y,2)
nikcleju@54 125 a = gap;
nikcleju@54 126 % Compute epsilon
nikcleju@54 127 %epsilon = epsextrafactor * noiselevel * norm(y(:,iy));
nikcleju@54 128 epsilon = 1.1 * norm(realnoise(:,iy));
nikcleju@54 129 %
nikcleju@54 130 gapparams = [];
nikcleju@54 131 gapparams.num_iteration = 1000;
nikcleju@54 132 gapparams.greedy_level = 0.9;
nikcleju@54 133 gapparams.stopping_coefficient_size = 1e-4;
nikcleju@54 134 gapparams.l2solver = 'pseudoinverse';
nikcleju@54 135 %gapparams.noise_level = noiselevel;
nikcleju@54 136 gapparams.noise_level = epsilon;
nikcleju@54 137 timer(a) = tic;
nikcleju@54 138 xrec{a}(:,iy) = GAP(y(:,iy), M, M', Omega, Omega', gapparams, zeros(d,1));
nikcleju@54 139 elapsed(a) = elapsed(a) + toc(timer(a));
nikcleju@54 140 %
nikcleju@54 141 err{a}(iy) = norm(x0(:,iy) - xrec{a}(:,iy));
nikcleju@54 142 relerr{a}(iy) = err{a}(iy) / norm(x0(:,iy));
nikcleju@54 143 end
nikcleju@54 144 disp([ algoname{a} ': avg relative error = ' num2str(mean(relerr{a}))]);
nikcleju@54 145 end
nikcleju@54 146 if any(algos == nesta)
nikcleju@54 147 for iy = 1:size(y,2)
nikcleju@54 148 a = nesta;
nikcleju@54 149 % Compute epsilon
nikcleju@54 150 %epsilon = epsextrafactor * noiselevel * norm(y(:,iy));
nikcleju@54 151 epsilon = 1.1 * norm(realnoise(:,iy));
nikcleju@54 152 %
nikcleju@54 153 try
nikcleju@54 154 timer(a) = tic;
nikcleju@54 155 %xrec{a}(:,iy) = do_nesta_DemoNonProjector(x0(:,iy), M, Omega', 0);
nikcleju@54 156
nikcleju@54 157 % Common heuristic: delta = sqrt(m + 2*sqrt(2*m))*sigma ?????????
nikcleju@54 158 [U,S,V] = svd(M,'econ');
nikcleju@54 159 opts.U = Omega;
nikcleju@54 160 opts.Ut = Omega';
nikcleju@54 161 opts.USV.U=U;
nikcleju@54 162 opts.USV.S=S;
nikcleju@54 163 opts.USV.V=V;
nikcleju@54 164 opts.TolVar = 1e-5;
nikcleju@54 165 opts.Verbose = 0;
nikcleju@54 166 xrec{a}(:,iy) = NESTA(M, [], y(:,iy), 1e-3, epsilon, opts);
nikcleju@54 167 elapsed(a) = elapsed(a) + toc(timer(a));
nikcleju@54 168 catch err
nikcleju@54 169 disp('*****ERROR: NESTA throwed error *****');
nikcleju@54 170 xrec{a}(:,iy) = zeros(size(x0(:,iy)));
nikcleju@54 171 end
nikcleju@54 172 %
nikcleju@54 173 err{a}(iy) = norm(x0(:,iy) - xrec{a}(:,iy));
nikcleju@54 174 relerr{a}(iy) = err{a}(iy) / norm(x0(:,iy));
nikcleju@54 175 end
nikcleju@54 176 disp([ algoname{a} ': avg relative error = ' num2str(mean(relerr{a}))]);
nikcleju@54 177 end
nikcleju@54 178
nikcleju@54 179 for i = 1:numel(algos)
nikcleju@54 180 if algos(i) == gap
nikcleju@54 181 continue;
nikcleju@54 182 end
nikcleju@54 183 prevgamma{algos(i)} = zeros(p, numvects);
nikcleju@54 184 end
nikcleju@54 185
nikcleju@54 186 % Run ABS algorithms (lambda-dependent)
nikcleju@54 187 for iparam = 1:numel(lambdas)
nikcleju@54 188
nikcleju@54 189 % Read current parameters
nikcleju@54 190 lambda = lambdas(iparam);
nikcleju@54 191
nikcleju@54 192 % Init stuff
nikcleju@54 193 for i = 1:numel(algos)
nikcleju@54 194 if algos(i) == gap || algos(i) == nesta
nikcleju@54 195 continue;
nikcleju@54 196 end
nikcleju@54 197 xrec{algos(i)} = zeros(d, numvects);
nikcleju@54 198 end
nikcleju@54 199 %
nikcleju@54 200 for i = 1:numel(algos)
nikcleju@54 201 if algos(i) == gap || algos(i) == nesta
nikcleju@54 202 continue;
nikcleju@54 203 end
nikcleju@54 204 err{algos(i)} = zeros(numvects,1);
nikcleju@54 205 relerr{algos(i)} = zeros(numvects,1);
nikcleju@54 206 end
nikcleju@54 207
nikcleju@54 208 % For every generated signal do
nikcleju@54 209 for iy = 1:size(y,2)
nikcleju@54 210
nikcleju@54 211 % Compute epsilon
nikcleju@54 212 %epsilon = epsextrafactor * noiselevel * norm(y(:,iy));
nikcleju@54 213 epsilon = 1.1 * norm(realnoise(:,iy));
nikcleju@54 214
nikcleju@54 215 %--------------------------------
nikcleju@54 216 % Reconstruct (and measure delay), Compute reconstruction error
nikcleju@54 217 %--------------------------------
nikcleju@54 218 for i = 1:numel(algos)
nikcleju@54 219 a = algos(i);
nikcleju@54 220 if a == gap || a == nesta
nikcleju@54 221 continue
nikcleju@54 222 end
nikcleju@54 223 if a == ompk
nikcleju@54 224 timer(a) = tic;
nikcleju@54 225 xrec{a}(:,iy) = ABS_OMPk_approx(y(:,iy), Omega, M, p-l, lambda);
nikcleju@54 226 elapsed(a) = elapsed(a) + toc(timer(a));
nikcleju@54 227 elseif a == ompeps
nikcleju@54 228 timer(a) = tic;
nikcleju@54 229 xrec{a}(:,iy) = ABS_OMPeps_approx(y(:,iy), Omega, M, epsilon, lambda, Omega * x0(:,iy));
nikcleju@54 230 elapsed(a) = elapsed(a) + toc(timer(a));
nikcleju@54 231 elseif a == tst
nikcleju@54 232 timer(a) = tic;
nikcleju@54 233 xrec{a}(:,iy) = ABS_TST_approx(y(:,iy), Omega, M, epsilon, lambda, Omega * x0(:,iy));
nikcleju@54 234 elapsed(a) = elapsed(a) + toc(timer(a));
nikcleju@54 235 elseif a == bp
nikcleju@54 236 timer(a) = tic;
nikcleju@54 237 [xrec{a}(:,iy), prevgamma{a}(:,iy)] = ABS_BP_approx(y(:,iy), Omega, M, epsilon, lambda, prevgamma{a}(:,iy), Omega * x0(:,iy));
nikcleju@54 238 elapsed(a) = elapsed(a) + toc(timer(a));
nikcleju@54 239 elseif a == yall1
nikcleju@54 240 timer(a) = tic;
nikcleju@54 241 xrec{a}(:,iy) = ABS_YALL1_approx(y(:,iy), Omega, M, epsilon, lambda, Omega * x0(:,iy));
nikcleju@54 242 elapsed(a) = elapsed(a) + toc(timer(a));
nikcleju@54 243 % elseif a == gap
nikcleju@54 244 % gapparams = [];
nikcleju@54 245 % gapparams.num_iteration = 40;
nikcleju@54 246 % gapparams.greedy_level = 0.9;
nikcleju@54 247 % gapparams.stopping_coefficient_size = 1e-4;
nikcleju@54 248 % gapparams.l2solver = 'pseudoinverse';
nikcleju@54 249 % %gapparams.noise_level = noiselevel;
nikcleju@54 250 % gapparams.noise_level = epsilon;
nikcleju@54 251 % timer(a) = tic;
nikcleju@54 252 % xrec{a}(:,iy) = GAP(y(:,iy), M, M', Omega, Omega', gapparams, zeros(d,1));
nikcleju@54 253 % elapsed(a) = elapsed(a) + toc(timer(a));
nikcleju@54 254 % elseif a == nesta
nikcleju@54 255 % try
nikcleju@54 256 % timer(a) = tic;
nikcleju@54 257 % %xrec{a}(:,iy) = do_nesta_DemoNonProjector(x0(:,iy), M, Omega', 0);
nikcleju@54 258 %
nikcleju@54 259 % % Common heuristic: delta = sqrt(m + 2*sqrt(2*m))*sigma ?????????
nikcleju@54 260 % [U,S,V] = svd(M,'econ');
nikcleju@54 261 % opts.U = Omega;
nikcleju@54 262 % opts.Ut = Omega';
nikcleju@54 263 % opts.USV.U=U;
nikcleju@54 264 % opts.USV.S=S;
nikcleju@54 265 % opts.USV.V=V;
nikcleju@54 266 % opts.TolVar = 1e-5;
nikcleju@54 267 % opts.Verbose = 0;
nikcleju@54 268 % xrec{a}(:,iy) = NESTA(M, [], y(:,iy), 1e-3, epsilon, opts);
nikcleju@54 269 % elapsed(a) = elapsed(a) + toc(timer(a));
nikcleju@54 270 % catch err
nikcleju@54 271 % disp('*****ERROR: NESTA throwed error *****');
nikcleju@54 272 % xrec{a}(:,iy) = zeros(size(x0(:,iy)));
nikcleju@54 273 % end
nikcleju@54 274 elseif a == sl0
nikcleju@54 275 timer(a) = tic;
nikcleju@54 276 xrec{a}(:,iy) = ABS_SL0_approx(y(:,iy), Omega, M, epsilon, lambda);
nikcleju@54 277 elapsed(a) = elapsed(a) + toc(timer(a));
nikcleju@54 278 elseif a == spgl1
nikcleju@54 279 timer(a) = tic;
nikcleju@54 280 xrec{a}(:,iy) = ABS_SPGL1_approx(y(:,iy), Omega, M, epsilon, lambda, Omega * xrec{bp}(:,iy));
nikcleju@54 281 elapsed(a) = elapsed(a) + toc(timer(a));
nikcleju@54 282 elseif a == nestasynth
nikcleju@54 283 timer(a) = tic;
nikcleju@54 284 xrec{a}(:,iy) = ABS_NESTAsynth_approx(y(:,iy), Omega, M, epsilon, lambda, Omega * xrec{bp}(:,iy));
nikcleju@54 285 elapsed(a) = elapsed(a) + toc(timer(a));
nikcleju@54 286 else
nikcleju@54 287 %error('No such algorithm!');
nikcleju@54 288 end
nikcleju@54 289 %
nikcleju@54 290 % Compare to GAP instead!
nikcleju@54 291 %x0(:,iy) = xrec{gap}(:,iy);
nikcleju@54 292 %
nikcleju@54 293 err{a}(iy) = norm(x0(:,iy) - xrec{a}(:,iy));
nikcleju@54 294 relerr{a}(iy) = err{a}(iy) / norm(x0(:,iy));
nikcleju@54 295 end
nikcleju@54 296
nikcleju@54 297 % Update progressbar
nikcleju@54 298 % if do_progressbar
nikcleju@54 299 % %frac2 = iy/numvects;
nikcleju@54 300 % %frac1 = ((iparam-1) + frac2) / count;
nikcleju@54 301 % if norm(frac2 - 1) < 1e-6
nikcleju@54 302 % frac2 = 0;
nikcleju@54 303 % end
nikcleju@54 304 % frac2 = frac2 + incr2;
nikcleju@54 305 % frac1 = frac1 + incr1;
nikcleju@54 306 % progressbar(frac1, frac2);
nikcleju@54 307 % end
nikcleju@54 308 end
nikcleju@54 309
nikcleju@54 310 %--------------------------------
nikcleju@54 311 % Save results in big stucture & display
nikcleju@54 312 %--------------------------------
nikcleju@54 313 % Save reconstructed signals
nikcleju@54 314 % Save rel & abs errors
nikcleju@54 315 % Display error
nikcleju@54 316 results(iparam).xrec = xrec;
nikcleju@54 317 results(iparam).err = err;
nikcleju@54 318 results(iparam).relerr = relerr;
nikcleju@54 319 %
nikcleju@54 320 %disp(['Simulation no. ' num2str(iparam)]);
nikcleju@54 321 disp(['Lambda = ' num2str(lambda) ':']);
nikcleju@54 322 for i = 1:numalgos
nikcleju@54 323 a = algos(i);
nikcleju@54 324 if a == gap || a == nesta
nikcleju@54 325 continue
nikcleju@54 326 end
nikcleju@54 327 disp([ algoname{a} ': avg relative error = ' num2str(mean(relerr{a}))]);
nikcleju@54 328 end
nikcleju@54 329 end
nikcleju@54 330
nikcleju@54 331 % =================================
nikcleju@54 332 % Save
nikcleju@54 333 % =================================
nikcleju@54 334 if do_save_mat
nikcleju@54 335 save(matfilename);
nikcleju@54 336 disp(['Saved to ' matfilename]);
nikcleju@54 337 end
nikcleju@54 338
nikcleju@54 339 % =================================
nikcleju@54 340 % Plot
nikcleju@54 341 % =================================
nikcleju@54 342 toplot = zeros(numel(lambdas), numalgos);
nikcleju@54 343
nikcleju@54 344 relerrs = {results.relerr};
nikcleju@54 345 for i = 1:numalgos
nikcleju@54 346 for j = 1:numel(lambdas)
nikcleju@54 347 toplot(j,i) = mean(relerrs{j}{algos(i)});
nikcleju@54 348 end
nikcleju@54 349 end
nikcleju@54 350
nikcleju@54 351 %h = plot(toplot);
nikcleju@54 352 h = semilogx(lambdas, toplot);
nikcleju@54 353 legend(algoname{algos})
nikcleju@54 354 xlabel('Lambda')
nikcleju@54 355 ylabel('Average reconstruction error')
nikcleju@54 356 title('Reconstruction error with different algorithms')
nikcleju@54 357
nikcleju@54 358 if (do_save_figs)
nikcleju@54 359 saveas(gcf, [figfilename '.fig']);
nikcleju@54 360 saveas(gcf, [figfilename '.png']);
nikcleju@54 361 saveTightFigure(gcf, [figfilename '.pdf']);
nikcleju@54 362 end
nikcleju@54 363