ISTA
function [x_s,k,timecost] = ISTA_lasso(A,b,x0,nu,lambda,iter, eps)
% 用ISTA(Iterative Soft Thresholding Algorithm,迭代收缩阈值算法)
% 解决l_1正则化问题(LASSO问题,least absolute shrinkage and selection operator,最小绝对收缩和选择算子):
% min F(x)=1/2*|| Ax - b ||_2^2 + \lambda || x ||_1
%=======================================
% 输入 A b
% x0......... 起始点
% L0 ........ initial choice of stepsize
% nu ........ 确定步长的常数(0,1)
% lambda .... l_1范数的正则化参数
% eps ....... 停止准则
% iter ...... 迭代次数
%=======================================
% 输出
% x_s ....... ISTA生成的序列 {xk}
% k ......... 迭代终止时迭代次数
t0=clock;
x_s = [];
x_old = x0;
[~,D]=eig(A'*A);
beta=nu/max(diag(D));
% 主循环
T = @(tau, x) max(0, x - tau) + min(0, x + tau);% 收缩阈值函数
for i = 1:iter
x_new = T(lambda*beta, x_old - beta*A'*(A*x_old-b));
% 记录
x_s = [x_s, x_new];
% 检查停止
e = norm(x_new-x_old,inf);
k=i;
if e < eps
timecost=etime(clock,t0);
break
end
% 更新
x_old = x_new;
end
GEM
function [x_s,k, timecost] = GEM_lasso(A,b,x0,nu,lambda,iter, eps)
% 用GEM(Generalized Extragradient Method,广义外梯度法)
% 解决l_1正则化问题(LASSO问题,least absolute shrinkage and selection operator,最小绝对收缩和选择算子):
% min F(x)=1/2*|| Ax - b ||_2^2 + \lambda || x ||_1
%=======================================
% 输入 A b
% x0......... 起始点
% nu......... 常数,确定beta
% eta ....... 常数,确定利普西茨常数L0
% lambda .... l_1范数的正则化参数
% eps ....... 停止准则
% iter ...... 迭代次数
%=======================================
% 输出
% x_s ....... GEM生成的序列 {xk}
% k ......... 迭代终止时迭代次数
t0=clock;
x_s = [];
x_old = x0;
[~,D]=eig(A'*A);
beta=nu/max(diag(D));
% 主循环
T = @(tau, x) max(0, x - tau) + min(0, x + tau);% 软阈值函数
for i = 1:iter
x_bar = T(beta*lambda, x_old - beta*A'*(A*x_old-b));
x_new = T(beta*lambda, x_old - beta*A'*(A*x_bar-b));
% 记录
x_s = [x_s, x_new];
% 检查停止
e = norm(x_new-x_old,inf);
k=i;
if e < eps
timecost=etime(clock,t0);
break
end
% 更新
x_old = x_new;
end
end
PGA_a1
function [x_s,k,timecost] = PGAa1_lasso(A,b,x0,nu,gama,lambda,iter, eps)
% 用PGAa1 解决l_1正则化问题
% min F(x)=1/2*|| Ax - b ||_2^2 + \lambda || x ||_1
%=======================================
% 输入 A b
% x0......... 起始点
% nu......... 常数,确定beta
% eta ....... 常数,确定利普西茨常数L0
% lambda .... l_1范数的正则化参数
% eps ....... 停止准则
% iter ...... 迭代次数
%=======================================
% 输出
% x_s ....... pgaa1生成的序列 {xk}
% k ......... 迭代终止时迭代次数
t0=clock;
x_s = [];
x_old = x0;
[~,D]=eig(A'*A);
beta=nu/max(diag(D));
I=eye(1100);
G=I+beta*(A'*A);
% 主循环
T = @(tau, x) max(0, x - tau) + min(0, x + tau);% 软阈值函数
for i = 1:iter
x_bar = T(beta*lambda, x_old - beta*A'*(A*x_old-b));
d=G*(x_old-x_bar);
alpha=((x_old-x_bar)'*(x_old-x_bar))/(d'*d);
x_new = x_old - gama*alpha*d;
% 记录
x_s = [x_s, x_new];
% 检查停止
e = norm(x_new-x_old,inf);
k=i;
if e < eps
timecost=etime(clock,t0);
break
end
% 更新
x_old = x_new;
end
end
PGA_a2
function [x_s,k,timecost] = PGAa2_lasso(A,b,x0,nu,gama,lambda,iter, eps)
% 用PGAa2 解决l_1正则化问题
% min F(x)=1/2*|| Ax - b ||_2^2 + \lambda || x ||_1
%=======================================
% 输入 A b
% x0......... 起始点
% nu......... 常数,确定beta
% eta ....... 常数,确定利普西茨常数L0
% lambda .... l_1范数的正则化参数
% eps ....... 停止准则
% iter ...... 迭代次数
%=======================================
% 输出
% x_s ....... pgaa2生成的序列 {xk}
% k ......... 迭代终止时迭代次数
t0=clock;
x_s = [];
x_old = x0;
[~,D]=eig(A'*A);
beta=nu/max(diag(D));
I=eye(1100);
G=I+beta*(A'*A);
% 主循环
T = @(tau, x) max(0, x - tau) + min(0, x + tau);% 软阈值函数
for i = 1:iter
x_bar = T(beta*lambda, x_old - beta*A'*(A*x_old-b));
d=x_old-x_bar;
alpha=(d'*d)/(d'*G*d);
x_new = x_old - gama*alpha*d;
% 记录
x_s = [x_s, x_new];
% 检查停止
e = norm(x_new-x_old,inf);
k=i;
if e < eps
timecost=etime(clock,t0);
break
end
% 更新
x_old = x_new;
end
end
PGA_b1
function [x_s,k,timecost] = PGAb1_lasso(A,b,x0,nu,gama,lambda,iter, eps)
% 用PGAb1 解决l_1正则化问题
% min F(x)=1/2*|| Ax - b ||_2^2 + \lambda || x ||_1
%=======================================
% 输入 A b
% x0......... 起始点
% nu......... 常数,确定beta
% eta ....... 常数,确定利普西茨常数L0
% lambda .... l_1范数的正则化参数
% eps ....... 停止准则
% iter ...... 迭代次数
%=======================================
% 输出
% x_s ....... pgab1生成的序列 {xk}
% k ......... 迭代终止时迭代次数
t0=clock;
x_s = [];
x_old = x0;
[~,D]=eig(A'*A);
beta=nu/max(diag(D));
I=eye(1100);
G=I+beta*(A'*A);
% 主循环
T = @(tau, x) max(0, x - tau) + min(0, x + tau);% 软阈值函数
for i = 1:iter
x_bar = T(beta*lambda, x_old - beta*A'*(A*x_old-b));
d=G*(x_old-x_bar);
alpha=((x_old-x_bar)'*d)/(d'*d);
x_new = x_old - gama*alpha*d;
% 记录
x_s = [x_s, x_new];
% 检查停止
e = norm(x_new-x_old,inf);
k=i;
if e < eps
timecost=etime(clock,t0);
break
end
% 更新
x_old = x_new;
end
end
PGA_b2
function [x_s,k,timecost] = PGAb2_lasso(A,b,x0,nu,gama,lambda,iter, eps)
% 用PGAb2 解决l_1正则化问题
% min F(x)=1/2*|| Ax - b ||_2^2 + \lambda || x ||_1
%=======================================
% 输入 A b
% x0......... 起始点
% nu......... 常数,确定beta
% eta ....... 常数,确定利普西茨常数L0
% lambda .... l_1范数的正则化参数
% eps ....... 停止准则
% iter ...... 迭代次数
%=======================================
% 输出
% x_s ....... pgab2生成的序列 {xk}
% k ......... 迭代终止时迭代次数
t0=clock;
x_s = [];
x_old = x0;
[~,D]=eig(A'*A);
beta=nu/max(diag(D));
% 主循环
T = @(tau, x) max(0, x - tau) + min(0, x + tau);% 软阈值函数
for i = 1:iter
x_bar = T(beta*lambda, x_old - beta*A'*(A*x_old-b));
d=x_old-x_bar;
x_new = x_old - gama*d;
% 记录
x_s = [x_s, x_new];
% 检查停止
e = norm(x_new-x_old,inf);
k=i;
if e < eps
timecost=etime(clock,t0);
break
end
% 更新
x_old = x_new;
end
end