回归 ---- 多项式拟合正弦曲线
回归----多项式拟合正弦曲线
做了什么?
使用多项式拟合一个周期内、加入噪声的正弦曲线。
具体过程如下:
-
数据生成:
在正弦函数sin(x)一个周期中均匀产生N个数据点,并在y轴上加入标准高斯分布的噪声,即
yi= sin(xi)+e,
e服从N(0,1),i<=N && i>=1, (xi, yi)表示第i个数据
-
假设空间:
这里使用多项式:
h(x,w) = w0+w1*x+w2*x2+…
即h(x) = wT*X,w为多项式系数(M维列向量),X的形式如下,
X= [ 1 x x2 x3 … ]T
-
优化目标:
首先求解不加正则项的多项式,接着再求加入正则项的;
我们想要使多项式尽可能的经过数据点,必须有某种指标去衡量多项式的好坏,这里使用每个数据点相对拟合多项式的偏差的平方和来衡量,当然希望这个损失越小越好。如果多项式的阶数越大,则损失会越小,但是这只是在训练集上的损失越来越小,即较好的拟合了训练集,这在训练集数量足够多的情况下是没有问题的;但是如果数据集数量较少,有可能在训练集上拟合的较好,但是有可能会出现过学习问题,即在验证集上的泛化能力降低,因此希望降低模型的复杂度,即通过加入正则项对模型复杂度进行惩罚(这里正则项采用二范式,也可使用一范式或者平方和等等)。下面对两种优化目标分别求解:
1. 不加正则项的最小二乘法:
2. 加入正则项的最小二乘法:
其中为w的二范式,y为N维列向量,X为N×M矩阵, X具体形式如下:
-
求解策略:
1. 对于第一种目标,即不加正则项的最小二乘,我们要最小化J(w),用J(w)对w求导并令导数为零,可以得到w的解析解:
2. 对于第二种目标,即加入正则项的最小二乘,我们无法通过求导为零求出w的解析解,必须使用优化方法去逼近最优解,这里使用梯度下降法来逼近最优解;正则项系数的选取,若过小,模型还是会过学习,若过大,模型会过于简单,一般采用交叉验证的方法寻找最好的。
梯度下降过程:
(1) 首先选取w的初始值;(2) 求梯度,并更新w值,
(3) 循环迭代第二步,直到前后两次J(w)的变化足够小。
-
模型评价与选择
在给定多项式次数M和正则项系数情况的最优模型能够求出,怎么评价不同M,的好坏呢?可以用模型在验证集上的损失来衡量它的好坏。
具体做法可以采用交叉验证来遍历M和,最小损失对应的M和就是最好的,具体如下:
对于每一对(M,),采用交叉验证可以求得一个损失,那么:
-
实验结果
1. 不加正则项的拟合
从图中可以看出,随着次数的增加,模型经过更多的点,变得越来越复杂,7次多项式经过最多的点,但没有刻画出正弦曲线的轮廓,产生了过拟合;反而更低次数,3次多项式更能反映正弦曲线。
2. 加入正则项拟合
下面第一幅图是,各个次数的多项式的最优的拟合曲线(没有给出),圆圈对应的是所有中最优的曲线
根据结果,最优M=4,当M=4时,不同 对应的损失loss如中间图所示,有一个最好的=0.3,此时的曲线在最右边的图
3. 因为自己编写的梯度下降函数收敛太慢,上面是调用matlab 库中梯度下降函数,下图是使用共轭梯度方法求得结果:
上一篇: python 绘制正弦曲线
下一篇: 数学图形 (2.15) 球形正弦曲线