Basis Pursuit Denoising with Forward-Backward
Test the use of Forward-backward-like splitting for the resolution of a compressed sensing regularization.
addpath('../'); addpath('../toolbox/');
Dimension of the problem.
n = 600; p = n/4;
Regularization parameter.
lambda = 1;
Matrix and observation.
A = randn(p,n); y = randn(p,1);
List of benchmarked algorithms.
methods = {'fb', 'fista', 'nesterov'};
operator callbacks
F = @(x)lambda*norm(x,1); G = @(x)1/2*norm(y-A*x)^2;
Proximal operator of F.
ProxF = @(x,tau)perform_soft_thresholding(x,lambda*tau);
Gradient operator of G.
GradG = @(x)A'*(A*x-y);
Lipschitz constant.
L = norm(A)^2;
Function to record the energy.
options.report = @(x)F(x)+G(x);
Bench the algorithm
options.niter = 5000; E = []; for i=1:length(methods) options.method = methods{i}; [x,e] = perform_fb(zeros(n,1), ProxF, GradG, L, options); E(:,i) = e(:); end e = min(E(:));
[********************] [********************] [********************]
Display the decays of the energies.
IMPORTANT: Note that the comparison with Nesterov is unfair, since each Nesterov iteration cost twice more.
sel = 1:round(options.niter/10);
loglog(E(sel,:)-e);
axis tight;
legend(methods);