lassoshooting.m
来自「lasso变量选择方法」· M 代码 · 共 68 行
M
68 行
function [w,wp,m] = LassoShooting(X, y, lambda,varargin)% This function computes the Least Squares parameters% with a penalty on the L1-norm of the parameters%% Method used:% The Shooting method of [Fu, 1998]%% Modifications:% We precompute the Hessian diagonals, since they do not % change between iterations[maxIter,verbose,optTol,zeroThreshold] = process_options(varargin,'maxIter',10000,'verbose',2,'optTol',1e-5,'zeroThreshold',1e-4);[n p] = size(X);% Start from the Least Squares solutionbeta = (X'*X + lambda*eye(p))\(X'*y);% Start the logif verbose==2 w_old = beta; fprintf('%10s %10s %15s %15s %15s\n','iter','shoots','n(w)','n(step)','f(w)'); k=1; wp = beta;endm = 0;XX2 = X'*X*2;Xy2 = X'*y*2;while m < maxIter beta_old = beta; for j = 1:p % Compute the Shoot and Update the variable S0 = sum(XX2(j,:)*beta) - XX2(j,j)*beta(j) - Xy2(j); if S0 > lambda beta(j,1) = (lambda - S0)/XX2(j,j); elseif S0 < -lambda beta(j,1) = (-lambda - S0)/XX2(j,j); elseif abs(S0) <= lambda beta(j,1) = 0; end end m = m + 1; % Update the log if verbose==2 fprintf('%10d %10d %15.2e %15.2e %15.2e\n',m,m*p,sum(abs(beta)),sum(abs(beta-w_old)),... sum((X*beta-y).^2)+lambda*sum(abs(beta))); w_old = beta; k=k+1; wp(:,k) = beta; end % Check termination if sum(abs(beta-beta_old)) < optTol break; end endif verbosefprintf('Number of iterations: %d\nTotal Shoots: %d\n',m,m*p);endw = beta;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?