岭回归与lasso
来源:互联网 发布:最好的视频软件 编辑:程序博客网 时间:2024/04/27 12:00
作者:金良(golden1314521@gmail.com) csdn博客: http://blog.csdn.net/u012176591
- 岭回归ridge regression
- Lasso
- 前向逐步回归Forward Stagewise Linear Regression
- Lasso Shooting Algorithm
- L1 vs L2
岭回归(ridge regression)
回忆 LR 的优化目标
为防止过拟合,增加正则化项
对其进行求导,得到
令导数为0,得
这就是岭回归的公式。
岭回归具有以下优点:
- 在特征数
M 大于样本数N 时,XTX 不可逆,故不能直接用LR ,而岭回归就可以。 - 通过引入
λ 惩罚项,防止过拟合。
Lasso
与岭回归不同,lasso增加的正则化项是
这个细微的变化,极大增加了计算复杂度,因为其不可直接求导。
前向逐步回归(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
如下求导
令其中
则可写成
令
则
进而可得
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
岭回归正则化项是
下表展示了
左侧的正方形表示
2 0
- 岭回归与lasso
- 岭回归与LASSO算法
- 岭回归与lasso详解
- 岭回归 & lasso 回归
- lasso 回归 & 岭回归
- 回归,岭回归。LASSO回归
- 岭回归、LASSO与elastic net
- R---岭回归 & lasso回归
- 岭回归、LASSO与LAR的几何意义
- Ridge Regression岭回归,lasso
- 岭回归、Lasso及其分析
- 最小二乘 岭回归 lasso回归
- Lasso回归
- 多元线性回归方程建模:使用岭回归与lasso算法选择变量
- 机器学习总结(一):线性回归、岭回归、Lasso回归
- 岭回归,Lasso和LAR学习(一)
- 机器学习3-课后题:使用岭回归与lasso算法选择变量
- 多重共线性的解决方法之——岭回归与LASSO
- KMP算法
- POJ3694 Network 割边+LCA
- C语言中输入输出重定,freopen()妙用
- Android 5.0 之 Material Desigin初步窥探及Android Studio项目搭建[一]
- POJ 3250 Bad Hair Day 模拟单调栈
- 岭回归与lasso
- 好几天不来了
- 一、Oracle分析函数入门
- Compare Version Numbers
- ZOJ 3772 Calculate the Function(矩阵线段树)
- C++ Traits技术
- 利用vlc插件将IP摄像头嵌入网页和网页播放RTSP流
- Oracle pl/sql中的group by子句不能使用别名,应该这样写。
- object-c的异常处理机制