LASSO问题matlab

$l_1$正则化问题代码matlab

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值