前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言实现LASSO回归——自己编写LASSO回归算法

R语言实现LASSO回归——自己编写LASSO回归算法

作者头像
拓端
发布2020-12-31 10:39:28
1.5K0
发布2020-12-31 10:39:28
举报
文章被收录于专栏:拓端tecdat

原文链接:http://tecdat.cn/?p=18840

这篇文章中我们可以编写自己的代码来计算套索(lasso)回归,

我们必须定义阈值函数

R函数是

代码语言:javascript
复制

thresh = function(x,a){sign(x) * pmax(abs(x)-a,0)}

要解决我们的优化问题,设置

这样就可以等效地写出优化问题

因此

一个得到

同样,如果有权重ω=(ωi),则按坐标更新将变为

计算此分量下降的代码是

代码语言:javascript
复制

lasso = function(X,y,beta,lambda,tol=1e-6,maxiter=1000){
beta0 = sum(y-X%*%beta /(length(y))beta0list[1] = beta0for (j in 1:maxiter){for (k in 1:length beta)){r = y - X[,-k]%*%beta[-k] - beta0*rep(1,length(y )beta[k] = (1/sum(omega*X[,k]^2) *threshog(t(omega*r)%*%X[,k ,length(y *lambda)}beta0 = sum(y-X%*%beta)/(length(y))

obj[j] = (1/2)*(1/length(y))*norm(omega*(y - X%*%beta -beta0*rep(1,length(y))),'F')^2 + lambda*sum(abs(beta))if (norm(rbind(beta0list[j],betalist[[j]]) -rbind(beta0,beta),'F') ) { break }

例如,考虑以下(简单)数据集,其中包含三个协变量

代码语言:javascript
复制


chicago = read.table("data.txt",header=TRUE,sep=";")

我们可以“标准化”

代码语言:javascript
复制


for(j in 1:3) X[,j] = (X[,j]-mean(X[,j]))/sd(X[,j])
y = (y-mean(y))/sd(y)

要初始化算法,使用OLS估算

代码语言:javascript
复制

lm(y~0+.,)$coef

例如

代码语言:javascript
复制



lasso(X,y,beta_init,lambda=.001)$obj[1] 0.001014426 0.001008009 0.001009558 0.001011094 0.001011119 0.001011119
$beta[,1]X_1 0.0000000X_2 0.3836087X_3 -0.5026137
$intercept[1] 2.060999e-16

我们可以通过循环获得标准的lasso图


最受欢迎的见解

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 拓端数据部落 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原文链接:http://tecdat.cn/?p=18840
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档