脊回归(Ridge Regression)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.58565451]
25. # 这里设计矩阵是一个10x5的矩阵,即有10个样本,5个变量
26. X = 1. / (np.arange(1, 6) + np.arange(0, 10)[:, np.newaxis])
27. y = np.ones(10)
28.
29. print '设计矩阵为:'
30. print X
31.
32. # alpha 取值为10^(-10)到10^(-2)之间的连续的200个值
33. n_alphas = 200
34. alphas = np.logspace(-10, -2, n_alphas)
35. print '\n alpha的值为:'
36. print alphas
37.
38. # 初始化一个Ridge Regression
55. ax.plot(alphas, coefs) 56. ax.set_xscale('log') #x轴使用对数表示 57. ax.set_xlim(ax.get_xlim()[::-1]) # 将x轴反转,便于显示 58. plt.grid() 59. plt.xlabel('alpha') 60. plt.ylabel('weights') 61. plt.title('Ridge coefficients as a function of the regularization') 62. plt.axis('tight') 63. plt.show()
脊回归(Ridge Regression)
监督学习
@ author : duanxxnj@ @ time : 2016-06-19
原文链接
在《线性回归(Linear Regression)》中提到过,当使用最小二乘法计算 线性回归模型参数的时候,如果数据集合矩阵(也叫做设计矩阵(design matrix)) ,存在多重共线性,那么最小二乘法对输入变量中的噪声非常 的敏感,其解会极为不稳定。为了解决这个问题,就有了这一节脊回归 (Ridge Regression )。
பைடு நூலகம்
的,如果
,则损失函数只有正则项,此时其最小化的结果必然是

关于alpha的数值具体的选择,归于“模型选择”章节,具体的方法可以参 见“模型选择”。
其实,这个式子和拉格朗日乘子法的结果差不多,如果逆用拉格朗日乘子法 的话,那么,上面的损失函数可以是下面的这种优化模型:
在《线性回归》中,给出了线性回归的损失函数可以写为:
为了限制模型参数 的数值大小,就在模型原来的目标函数上加上一个惩罚 项,这个过程叫做正则化(Regularization)。
如果惩罚项是参数的 范数,就是脊回归(Ridge Regression)
如果惩罚项是参数的 范数,就是套索回归(Lasso Regrission) 正则化同时也是防止过拟合有效的手段,这在“多项式回归”中有详细的说 明。
46.
clf.fit(X, y)
47.
coefs.append(clf.coef_)
48.
49. # 获得绘图句柄
50. ax = plt.gca()
51. # 参数中每一个维度使用一个颜色表示
52. ax.set_color_cycle(['b', 'r', 'g', 'c', 'k'])
53.
54. # 绘制alpha和对应的参数之间的关系图
0.09090909 0.08333333]
10.
[ 0.11111111 0.1
0.09090909 0.08333333 0.07692308]
11.
[ 0.1
0.09090909 0.08333333 0.07692308 0.07142857]]
12.
13. alpha的数值 : 0.1
14. 参数的数值: [-0.43816548 1.19229228 1.54118834 1.60855632
当设计矩阵 存在多重共线性的时候(数学上称为病态矩阵),最小二乘 法求得的参数 在数值上会非常的大,而一般的线性回归其模型是
,显然,就是因为 在数值上非常的大,所以,如果输入变量 有一个微小的变动,其反应在输出结果上也会变得非常大,这就是对输入变 量总的噪声非常敏感的原因。
如果能限制参数 的增长,使 不会变得特别大,那么模型对输入 中噪声 的敏感度就会降低。这就是脊回归和套索回归(Ridge Regression and Lasso Regrission)的基本思想。
20.
21. # 这里设计矩阵X是一个希尔伯特矩阵(Hilbert matrix)
22. # 其元素A(i,j)=1(i + j -1),i和j分别为其行标和列标
23. # 希尔伯特矩阵是一种数学变换矩阵,正定,且高度病态
24. # 即,任何一个元素发生一点变动,整个矩阵的行列式的值和逆矩阵都会发生巨大变化
其运行结果如下:
1. 设计矩阵为:
2. [[ 1.
0.5
0.33333333 0.25
0.2
]
3.
[ 0.5
0.33333333 0.25
0.2
0.16666667]
4.
[ 0.33333333 0.25
0.2
0.16666667 0.14285714]
5.
[ 0.25
0.2
0.16666667 0.14285714 0.125
39. clf = linear_model.Ridge(fit_intercept=False)
40.
41. # 参数矩阵,即每一个alpha对于的参数所组成的矩阵
42. coefs = []
43. # 根据不同的alpha训练出不同的模型参数
44. for a in alphas:
45.
clf.set_params(alpha=a)
脊回归(Ridge Regression)
所谓脊回归,就是对于一个线性模型,在原来的损失函数加入参数的 范数 的惩罚项,其损失函数为如下形式:
这里 是平法损失和正则项之间的一个系数,

的数值越大,那么正则项,也是惩罚项的作用就越明显; 的数值越小,
正则项的作用就越弱。极端情况下,
则和原来的损失函数是一样
10. 脊回归中最重要的就是参数alpha的选择,本例显示了不同的alpha下
11. 模型参数omega不同的结果
12.
13. """
14.
15. print(__doc__)
16.
17. import numpy as np
18. import matplotlib.pyplot as plt
19. from sklearn import linear_model
关于参数 求导之后:
其解为:
这里,脊回归的损失函数为:
关于参数 求导之后:
其解为:
下面给出一个脊回归简单的代码示例,这个代码显示了不同的alpha对模型 参数 的影响程度。alpha越大,则 的数值上越小;alpha越小,则 的数 值上越大,注意所生成的图片为了更好的观察,将x轴做了反转。
1. #!/usr/bin/python 2. # -*- coding: utf-8 -*3. 4. """ 5. author : duanxxnj@ 6. time : 2016-06-03-14-34 7. 8. 脊回归测试代码 9. 这里需要先生成一个线性相关的设计矩阵X,再使用脊回归对其进行建模
]
6.
[ 0.2
0.16666667 0.14285714 0.125
0.11111111]
7.
[ 0.16666667 0.14285714 0.125
0.11111111 0.1
]
8.
[ 0.14285714 0.125
0.11111111 0.1
0.09090909]
9.
[ 0.125
0.11111111 0.1
基于交叉验证的脊回归
在前面提到过,脊回归中,alpha的选择是一个比较麻烦的问题,这其实是 一个模型选择的问题,在模型选择中,最简单的模型选择方法就是交叉验证 (Cross-validation),将交叉验证内置在脊回归中,就免去了alpha的人
工选择,其具体实现方式如下:
1. #!/usr/bin/python 2. # -*- coding: utf-8 -*3. 4. """ 5. author : duanxxnj@ 6. time : 2016-06-19-20-59 7. 8. 基于交叉验证的脊回归alpha选择 9. 可以直接获得一个相对不错的alpha 10. 11. """ 12. 13. 14. print(__doc__) 15. 16. import numpy as np 17. import matplotlib.pyplot as plt 18. from sklearn import linear_model 19. 20. 21. # 这里设计矩阵X是一个希尔伯特矩阵(Hilbert matrix) 22. # 其元素A(i,j)=1(i + j -1),i和j分别为其行标和列标 23. # 希尔伯特矩阵是一种数学变换矩阵,正定,且高度病态 24. # 即,任何一个元素发生一点变动,整个矩阵的行列式的值和逆矩阵都会发生巨大变化 25. # 这里设计矩阵是一个10x5的矩阵,即有10个样本,5个变量 26. X = 1. / (np.arange(1, 6) + np.arange(0, 10)[:, np.newaxis]) 27. y = np.ones(10) 28. 29. print '设计矩阵为:' 30. print X 31. 32. # 初始化一个Ridge Cross-Validation Regression 33. clf = linear_model.RidgeCV(fit_intercept=False) 34. 35. # 训练模型 36. clf.fit(X, y) 37. 38. print 39. print 'alpha的数值 : ', clf.alpha_ 40. print '参数的数值:', clf.coef_
相关文档
最新文档