# GENLASSO: Generalized LASSO In kisungyou/ADMM: Algorithms using Alternating Direction Method of Multipliers

## Description

Generalized LASSO is solving the following equation,

\textrm{min}_x ~ \frac{1}{2}\|Ax-b\|_2^2 + λ \|Dx\|_1

where the choice of regularization matrix D leads to different problem formulations.

## Usage

 1 2 admm.genlasso(A, b, D = diag(length(b)), lambda = 1, rho = 1, alpha = 1, abstol = 1e-04, reltol = 0.01, maxiter = 1000) 

## Arguments

 A an (m\times n) regressor matrix b a length-m response vector D a regularization matrix of n columns lambda a regularization parameter rho an augmented Lagrangian parameter alpha an overrelaxation parameter in [1,2] abstol absolute tolerance stopping criterion reltol relative tolerance stopping criterion maxiter maximum number of iterations

## Value

a named list containing

x

a length-n solution vector

history

dataframe recording iteration numerics. See the section for more details.

## Iteration History

When you run the algorithm, output returns not only the solution, but also the iteration history recording following fields over iterates,

objval

object (cost) function value

r_norm

norm of primal residual

s_norm

norm of dual residual

eps_pri

feasibility tolerance for primal feasibility condition

eps_dual

feasibility tolerance for dual feasibility condition

In accordance with the paper, iteration stops when both r_norm and s_norm values become smaller than eps_pri and eps_dual, respectively.

Xiaozhi Zhu

## References

\insertRef

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ## generate sample data m = 100 n = 200 p = 0.1 # percentange of non-zero elements x0 = matrix(Matrix::rsparsematrix(n,1,p)) A = matrix(rnorm(m*n),nrow=m) for (i in 1:ncol(A)){ A[,i] = A[,i]/sqrt(sum(A[,i]*A[,i])) } b = A%*%x0 + sqrt(0.001)*matrix(rnorm(m)) D = diag(n); ## set regularization lambda value regval = 0.1*Matrix::norm(t(A)%*%b, 'I') ## solve LASSO via reducing from Generalized LASSO output = admm.genlasso(A,b,D,lambda=regval) # set D as identity matrix ## visualize ## report convergence plot niter = length(output$history$s_norm) par(mfrow=c(1,3)) plot(1:niter, output$history$objval, "b", main="cost function") plot(1:niter, output$history$r_norm, "b", main="primal residual") plot(1:niter, output$history$s_norm, "b", main="dual residual")