多项式曲线拟合(Polynomial Curve Fitting)
监督学习
@ author : duanxxnj@163
@ time : 2016-06-19
原文链接
多项式特征生成
在机器学习算法中,基于针对数据的非线性函数的线性模型是非常常见的,这种方法即可以像线性模型一样高效的运算,同时使得模型可以适用于更为广泛的数据上,多项式拟合就是这类算法中最为简单的一个。
关于多项式回归的应用,这里举个非常简单的例子:一般的线性回归,模型既是参数的线性函数,同时也是输入变量的线性函数,对于一个二维的数据而言,模型的数学表达式如下:
如果想要拟合一个抛物面,而不是拟合一个平面的话,那么就需计算输入变量二次项的线性组合,则模型更新为下面这个形式:
注意:这里需要说明的是,更新后的模型,虽然是输入变量的二次函数,但是,由于它仍然是参数的一次线性函数,所以它仍然是一个线性模型。为了说明这个问题,可以假设有一个新的变量
,那么就可以将上面的模型重写为下面的这个形式:
1. #!/usr/bin/python
2. # -*- coding: utf-8 -*-
3.
4. """
5. author :****************
6. time : 2016-06-04_14-00
7.
8. 多项式特征生成
9.
10. """
11.
12. from sklearn.preprocessing import PolynomialFeatures
13. import numpy as np
14.
15. # 首先生成3x2的原始特征矩阵
16. # 即样本数为3,特征数为2
17. X = np.arange(6).reshape(3,2)
18.
19. print'原始数据:'
20. print X
21.
22. # 特生变换/特征生成
23. # 将原始一阶数据升维到二阶数据
24. # 升维方式是: [x_1, x_2] 变为 [1, x_1, x_2, x_1^2, x_1 x_2, x_2^2]
25. polyFeat =PolynomialFeatures(degree=2)
26. X_transformed = polyFeat.fit_transform(X)
27.
28. print'特征变换后的数据:'
29. print X_transformed
1. 原始数据:
2. [[01]
3. [23]
4. [45]]
5. 特征变换后的数据:
6. [[  1.0.  1.0.0.  1.]
7. [  1.  2.  3.  4.  6.9.]
8. [  1.  4.  5.16.20.25.]] 1. #!/usr/bin/python
2. # -*- coding: utf-8 -*-
3.
4.
5. """
6. author :****************
7. time : 2016-06-04_16-38
8.
9. 这个例子展示了多项式曲线拟合的特性
10.
11. 多项式曲线拟合分为两个步骤:
12. 1、根据多项式的最高次数,对输入特征向量做特征生成
13. 对原来的每一个特征向量而言,可以生成一个范特蒙德矩阵( Vandermonde matrix)
14.
15. 范特蒙德矩阵的尺寸为:[n_samples , n_degree+1]
16.
17. 其形式为:
18.    [[1, x_1, x_1 ** 2, x_1 ** 3, ...],
19.      [1, x_2, x_2 ** 2, x_2 ** 3, ...],
20.      ...]
21.
22. 2、基于第一步生成的范特蒙德矩阵,直接使用已有线性回归模型,就可以实现多项式回归
23.
24. 这个例子展示了如何基于线性回归模做非线性回归,其实这个也是核函数的基本思想。
25. """
26. print(__doc__)
27.
28. import numpy as np
29. import matplotlib.pyplot as plt
30.
31. from sklearn.linear_model import LinearRegression
32.
33. from sklearn.preprocessing import PolynomialFeatures
34. from sklearn.pipeline import make_pipeline
35.
36. # 多项式回归需要拟合的函数
37. def f(x):
38. return x * np.sin(x)
39.
40.
41. # 产生绘图用的原始数据点
42. # 这里产生的点的范围比实际拟合所采用的点的范围要宽一些
43. # 其目的是为了展示当多项式拟合的次数过高时,过拟合的现象
44. # 过拟合的模型在训练数据范围内,拟合效果非常好
45. # 在训练数据范围外,模型的拟合效果特别误差
46. x_plot = np.linspace(-1,13,140)
47.
48. # 训练用数据范围
49. x = np.linspace(0,10,100)
50.
51. # 随机取训练数据中的10个点作为拟合用的点
52. rng = np.random.RandomState(0)
53. rng.shuffle(x)
54. x = np.sort(x[:10])
55. y = f(x)
56.
57. # 将数据从行向量换为列向量,这样每一行就能代表一个样本
58. X = x[:, np.newaxis]
59. X_plot = x_plot[:, np.newaxis]
60.
61. # 从次数为1一直到次数变为17,模型的次数增长步长为3
62. # 下面会绘制出不同的次数所对应的图像
63. # 需要注意的是,这6个图的坐标系的y轴的数据范围相差是非常大的
64. # 模型的次数越高,在训练数据外的测试点上,y的数据和原始数据相差越大
65. # 即:过拟合现象越明显
66. #
67. # 同时,下面还输出了不同次数下,模型对应的参数向量w
68. # 可以看到,模型次数越大,模型所对应的参数向量的模||w||也越大
69. # 即:过拟合现象越明显,模型所对应的参数向量的模||w||也越大
70. #
71. # 在损失函数后面,加上模型所对应的参数向量的模||w||
72. # 那么,在最小化损失函数的同时,也限制了参数向量的模||w||的增长
73. # 这就是正则化可以防止过拟合的原因
74. #
75. # 但是在实际测试中发现,如果随机取训练数据的时候,选取的是20个点
76. # 那么参数向量的模||w||并不是随着模型复杂度的增加而增加
77. # 这个是因为训练的样本足够大的时候,能够有效的描述原始数据分布
78. # 那么过拟合的这一套理论就不是特别的适用了
79. # 所以,方法的选择还是要建立在对数据分布充分的认识上才行
80. #
81. for degree in range(9):
82.
83. # 基于不同的次数生成多项式模型
84.    model = make_pipeline(PolynomialFeatures(degree),LinearRegression()
)
85.    model.fit(X, y)
86.正则化可以防止过拟合
87. # 不同次数下,多项式模型的参数
88. print'模型次数为:', degree,' 时,模型的参数向量的模:'
89. print np.dot(np.array(model.steps[1][2].coef_),
90.                  np.array(model.steps[1][3].coef_))
91.
92. print'模型的参数为:'

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。