岭回归与lasso

原创 2015年07月06日 19:47:49

作者:金良(golden1314521@gmail.com) csdn博客: http://blog.csdn.net/u012176591

岭回归(ridge regression)

回忆 LR 的优化目标

L=(YXw)T(YXw)

为防止过拟合,增加正则化项 λ||w||2 ,目标函数就变成

L=(YXw)T(YXw)+λ||w||2

对其进行求导,得到

Lw=2XT(YXw)+2λw

令导数为0,得

w=(XTX+λI)1XTY

这就是岭回归的公式。

岭回归具有以下优点:

  • 在特征数M大于样本数N时,XTX 不可逆,故不能直接用LR,而岭回归就可以。
  • 通过引入λ惩罚项,防止过拟合。

Lasso

与岭回归不同,lasso增加的正则化项是 λ||w||1 ,目标函数就变成

L=(YXw)T(YXw)+λ||w||1

这个细微的变化,极大增加了计算复杂度,因为其不可直接求导。

前向逐步回归(Forward Stagewise Linear Regression)

前向逐步回归的伪代码:

这里写图片描述

这里写图片描述
相关代码:

datas = []
values = []
with open('abalone','r') as f: 
    for line in f: 
        linedata =  line.split('\t')
        datas.append(linedata[0:-1]) #前4列是4个属性的值
        values.append(linedata[-1].replace('\n',''))  #最后一列是类别       
datas = np.array(datas)
datas = datas.astype(float) 
values = np.array(values)
values = values.astype(float) 

N,M =  datas.shape #N是样本数,M是参数向量的维
means = datas.mean(axis=0) #各个属性的均值
stds = datas.std(axis=0) #各个属性的标准差
datas = (datas-means)/stds #标准差归一化
values = (values-values.mean())/values.std() #标准差归一化


fig,axes = plt.subplots(nrows=2,ncols=2,figsize=(8,8))
plt.suptitle(u'Forward Stepwise Regression Example',fontsize = 18) #用中文会出错,不知为何
plt.subplots_adjust(wspace = 0.25,hspace=0.25)
lambds = [0.05,0.5,1.0,3.0]

axes = axes.flatten()
for i in range(4):
    numIt = 600 #迭代次数
    delta = 0.01 # 调整系数
    wlog = np.zeros((numIt,M)) #记录weights的变化
    weights = np.zeros(M) #系数向量
    lambd = lambds[i]

    for it in range(1,numIt):
        Lmin = {'value':np.inf,'loc':np.nan,'sign':np.nan} #记录本次迭代的目标函数最小值
        for m in range(M-1,0,-1):
            for sign in (-1,1):
                wbak = cp.deepcopy(weights)
                wbak[m] += delta*sign
                Lcur = np.linalg.norm(values-np.dot(datas,wbak),2)+ lambd*np.linalg.norm(wbak,1)
                #print m,sign,Lcur
                if Lmin['value'] > Lcur: # 如果目标函数值比当前最优值小
                    Lmin['value'] = Lcur
                    Lmin['loc'] = m
                    Lmin['sign'] = sign
        weights[Lmin['loc']] += delta*Lmin['sign']
        wlog[it,:] = weights[:]
    ax = axes[i]
    for m in range(M):
        ax.plot(wlog[:,m])  
    ax.set_title('lambda='+np.str(lambd),{'fontname':'STFangsong','fontsize':10})
    ax.set_xlabel(u'迭代次数',{'fontname':'STFangsong','fontsize':10})
    ax.set_ylabel(u'各权值系数',{'fontname':'STFangsong','fontsize':10})
savefig('lasso1.png',dpi=300,bbox_inches='tight')

Lasso Shooting Algorithm

如下求导

L(w)wk=2i=1Nxik(yiwTxi)=2i=1Nxik(yiwkTxik(wTxiwkTxik))=wk2i=1Nx2ik2i=1Nxik(yiwTxi+wkxik)

令其中

αk=2i=1Nx2ik,ck=2i=1Nxik(yiwTxi+wkxik)
,

则可写成

L(w)wk=αkwkck

L(w,λ)=L(w)+λ||w||1

L(w,λ)wk=αkwkckλ[ckλ,ck+λ]αkwkck+λwk<0wk=0wk>0

这里写图片描述

进而可得wk的更新公式

wk=(ck+λ)/αk0(ckλ)/αkck<λck[λ,λ]ck>λ

这里写图片描述

fig,axes = plt.subplots(nrows=2,ncols=2,figsize=(8,8))
plt.suptitle(u'Lasso Shooting Algorithm Example',fontsize = 18) #用中文会出错,不知为何
plt.subplots_adjust(wspace = 0.25,hspace=0.25)
lambds = [0.05,3.5,50,100]
axes = axes.flatten()

for i in range(4):
    lambd = lambds[i]
    numIt = 600 #迭代次数
    wlog = np.zeros((numIt,M)) #记录weights的变化
    weights = np.zeros(M) #系数向量

    XX2 = 2*np.dot(datas.transpose(),datas)
    XY2 = 2*np.dot(datas.transpose(),values)
    for it in range(numIt):
        for k in range(M):
            ck = XY2[k]-np.dot(XX2[k,:],weights)+XX2[k,k]*weights[k]
            ak = XX2[k,k]
            #print ck,lambd
            if ck < -lambd:
                weights[k] = (ck+lambd)/ak
            elif ck > lambd:
                weights[k] = (ck-lambd)/ak
            else:
                weights[k] = 0
        wlog[it,:] = weights[:]
    ax = axes[i]
    for m in range(M):
        ax.plot(wlog[:,m])  
    ax.set_title('lambda='+np.str(lambd),{'fontname':'STFangsong','fontsize':10})
    ax.set_xlabel(u'迭代次数',{'fontname':'STFangsong','fontsize':10})
    ax.set_ylabel(u'各权值系数',{'fontname':'STFangsong','fontsize':10})   
savefig('lasso2.png',dpi=300,bbox_inches='tight')

L1 vs L2

岭回归正则化项是L2约束,而lasso的正则化项是L1约束。
下表展示了L1,L2的区别。
这里写图片描述

L1 具有的特征选择(稀疏性)的作用可以用下图来解释:
左侧的正方形表示L1约束,等高线图先与正方形的角上的点相切的可能性大,这时β1=0β20,这起到了选择特征的目的;右侧的圆形表示L2约束,等高线图与圆上任一点相切的概率相同,故起不到特征选择的效果。
这里写图片描述

版权声明:作者:Jinliang's Hill(金良山庄),欲联系请评论博客或私信,CSDN博客: http://blog.csdn.net/u012176591

相关文章推荐

机器学习:特征缩减技术(shrinkage): lasso和岭回归

1. 理论 概述:通过对损失函数(即优化目标)加入惩罚项,使得训练求解参数过程中会考虑到系数的大小,通过设置缩减系数(惩罚系数),会使得影响较小的特征的系数衰减到0,只保留重要的特征。常用的缩减系数方...

岭回归,Lasso和LAR学习(一)

概要:我们要区分岭回归和lasso以及LAR的关系,岭回归是用于消除多重共线性问题,也可以用于删除无效变量(贡献率低或打酱油变量,后面会提及)。Lasso是岭回归的改进算法,对删除无效变量有帮助,而L...

机器学习3-课后题:使用岭回归与lasso算法选择变量

1.题目分别使用岭回归和Lasso解决薛毅书第279页(PDF为p331)例6.10的回归问题 2.准备2.1.准备安装和加载包使用到R语言的函数和对应包 函数 功能 包 lm.rid...

岭回归、lasso、ElasticNet、正则化、L1、L2小结

前期看过很多有关岭回归、lasso、ElasticNet以及L1、L2的资料,但时间久了还是容易混淆、记忆错误。本次根据前段时间学习的资料做了整理并总结如下,如有不对的地方请拍砖。...

SparkML之回归(二)岭回归和Lasso阐述及OLS,梯度下降比较

岭回归(RidgeRegression)它的上一级称之为Tikhonov regularization,是以Andrey Tikhonov命名的。 Lasso(least absolute shrin...

机器学习读书笔记之11 - 岭回归 & LASSO回归

回归 就是 对数据进行拟合,我们常说的 线性回归、高斯回归、SVR、Softmax 都是属于 回归。         最小二乘大家再熟悉不过了,作为入门级的线性回归,可能会遇到的一些问题: (1)参...

回归,岭回归。LASSO回归

矩阵表示多元线性回归 Y=BX+a Q(B)=(Y-BX)T(Y-BX)达到最小时的B值。 也即是残差平方和最小时。B(Bi)的值。可以证明B的最小二乘估计=(XTX)-1XTy 其中(XTX...
  • HHTNAN
  • HHTNAN
  • 2016年12月27日 10:45
  • 525

用R建立岭回归和lasso回归

1 分别使用岭回归和Lasso解决薛毅书第279页例6.10的回归问题 例6.10的问题如下: 输入例题中的数据,生成数据集,并做简单线性回归,查看效果 cement     29, ...

从线性回归谈到岭回归lasso回归再到结构风险最小化和参数缩减

回归和分类是机器学习算法所要解决的两个主要问题。分类大家都知道,模型的输出值是离散值,对应着相应的类别,通常的简单分类问题模型输出值是二值的,也就是二分类问题。但是回归就稍微复杂一些,回归模型的输出值...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:岭回归与lasso
举报原因:
原因补充:

(最多只允许输入30个字)