多项式拟合曲线

来源:互联网 发布:30岁转行学编程 编辑:程序博客网 时间:2024/06/09 13:50

(别看了吧。。。CSDN上我的博客的图无缘无故全挂了,自己搭建了博客,正在迁移博客中)

运用多项式对一些非多项式曲线进行拟合是数学上一种常用的方法,它的拟合能力直接与多项式的次数相关。在学习完机器学习的相关课程后,我用多项式拟合二维正弦曲线作为多项式拟合实践。并且采用最小二乘法,梯度下降法,和共轭梯度法分别进行了拟合求解。

原理

使用多项式 对正弦函数进行拟合,基本过程是对一组由正弦函数在一个周期内生成的含高斯噪声的点集作为训练集,我们需要建立损失函数L(w)来衡量拟合程度的好坏。


L(w)中添加1/2是为了求导后使结果系数为1。

另外,为了解决当多项式次数过高,模型过于复杂而造成的过拟合(overfitting),我们通过观察发现,当 相对较小时(W=[w0,w1,w2,```wM]),模型拟合效果较好。也就是说,L(w)与 具有翘板关系,我们可以在L(W)中加入 作为惩罚项来对其模型复杂度进行控制。我们得到L’(w):

这里的λ是一个超参数,需要人为的确定,如果λ过小,会大大削弱惩罚项的作用,如果λ过大,函数会走向另一个极端——欠拟合,因此λ是通过不断试验来确定的。

接下来,就是解出一组理想W=[w0,w1,```wM]来拟合正弦函数。很容易联想到,只需要让L(w)尽可能的小,那么拟合结果会很好。从而将问题转化为求L(w)的优化问题。对于添加惩罚项的损失函数L’(w),想法也是相同的。下面要介绍的三种方法正是优化整两个损失函数的方法。

数据生成

首先通过周期为1的正弦函数在0-1区间生成100个点,然后对每个点的横纵坐标分别添加方差为0.03,均值为0的高斯分布随机数,以此作为下述三种方式的训练集。



最小二乘法

首先,我们来使用最小二乘法解决L(w)的优化问题。首先,我们来对L(w)求导并另导数为0。


上述问题求解可以转化为线性方程组的求解问题:


线性方程组的求解问题是可以通过借助python numpy库来解决的,线性方程组的每一项也比较好求,操作简单,这里不再赘述。下面是运行结果:

样本数量:100


这种方法只能解决不含惩罚项的L(w)的优化,因为对L’(w)求导后另导数为0,是没有解析解的,因此只能借助下面两种方法来解决。

梯度下降

首先介绍一下梯度下降的简单原理。我们知道梯度描述了函数增长最快的方向,那么梯度的负方向将会是下降最快的方向。我们在函数上任意选择一点作为起始点,改点若不是极值点,然后沿着梯度的负方向走足够小的一段距离,那么走到点的函数值一定会比这个初始点小。梯度下降基本就是根据这一原理进行的,对 不断迭代更新,直到两次损失函数值变化δ小于最小误差,停止迭代我们具体来看:

先求梯度,对单一变量函数来说,即对上述L’(w)求每个 导:

于是,对于每个 ,我们可以这样更新它:

其中的β就是步长,在一般理论中提到的步长都需要做一次线搜索找到能够使 尽可能小的β。但实际应用中,这种线搜索实现有难度,并消耗大量时间,所以考虑其他设置步长的方法。这次试验中,我实现了两种步长计算的方法:

1. 采用定长步长:选择一个在可运算条件下足较小的定长β,不断更新 直到δ小于最小误差,停止迭代。这种方法的优点是操作简单,而且步长也不用设置特别小,因为在接近最小值时,导数本身也是趋近于0的,并不会走得太远而错过最小值点。缺点是在一开始离最小值点很远时,需要得带多次才能到达最小值点附近,到达最小值点附近以后,由于步长较小,需要大量迭代才能到达最小值点。下面是相应的参数设置和运行结果:

训练样本数量:100

模型复杂度:10次

步长:0.05

惩罚项系数:0.001

最小误差:0.00001

 

迭代次数:3520

耗时:2m6s

最终损失函数值:0.381371422289

2. 采用可变步长:选择一个相对较大的步长,这样,就有可能直接错过最小值点,不过不用担心,当你发现你错过了(用这次损失函数值是否大于上次来判断),就返回到上次迭代,将步长缩小为原来的n倍再更新 ,继续错过则再缩小步长……,直到不再错过最小值点或δ小于最小误差,停止迭代。然后将步长恢复为原来步长,继续迭代,直到δ小于最小误差。这种方法的优势是在离最小值远的地方步长很大,快到最小值了,又会缩减到很小,甚至可以比上面定长的步长还小,显然大大减少了迭代次数,效率得到提升,这就意味着你可以把损函数最小误差设置的足够小,将模型复杂度进一步提升,而得到一个更为精确的拟合。(当然,这取决于参数的设置,大普遍来讲,在相同时耗下可变步长是可以更精准的

下面是运行得到的结果:

训练样本数量:100

模型复杂度:10次

步长初始值:0.1

步长变化倍数:0.25

惩罚项系数:0.001

最小误差:0.00001

 

迭代次数:335

耗时:18s

最终损失函数值:0.991160351248

共轭梯度

梯度下降法有一个缺点,可以证明:任意连续两次方向的选择是相互垂直的,这就会造成梯度下降的方向成Z型,如下图中绿线:

具体过程如下:

首先,任意给定一个初始点x(1),计算出目标函数f(x)在这点的梯度,若||g1|| = 0,则停止计算;否则,令

d(1)= -▽f(x(1)) = -g1

若已知点x(k)和搜索方向d(k),则从x(k)出发,沿d(k)进行搜索,得到

x(k+1) = x(k) + λkd(k)

步长可以通过上述两种方式获得

计算f(x)在x(k+1)处的梯度。若||gk+1|| = 0,则停止计算;否则,用-gk+1和d(k)构造下一个搜索方向d(k+1),并使d(k+1)和d(k)关于A共轭。按此设想,令

d(k+1) = -gk+1 + βkd(k)

上式两端左乘d(k)TA,并令

d(k)TAd(k+1) = -d(k)TAgk+1 + βkd(k)TAd(k) = 0,

由此得到

βk = d(k)TAgk+1 / d(k)TAd(k)

再从x(k+1)出发,沿方向d(k+1)搜索。

过拟合分析

在FR法中,初始搜索方向必须取最速下降方向,这一点决不可忽视。因子βk可以简化为:βk = ||gk+1||2 / ||gk||2

当模型复杂度过大时,就会出现过拟合现象,在最小二乘法中,如果我们设置模型复杂度为10,则可以得到以下图形:

将模型复杂度设置为100后,得到的图形如下:



不加惩罚项的学习过程容易将训练样本中个别属性当做普遍属性加入到模型中,从而使模型发生了过度描述,即过拟合。

一般发生过拟合后,我们需要找到一个能够描述模型复杂度的表达式作为惩罚项,加入到损失函数中,这样当模型过于复杂时,惩罚项值较大,损失函数无法取最小值,控制了模型的复杂度。

另外,惩罚项系数的大小取值也很重要。取值过大,损失函数成了偏向于描述模型复杂度的函数,这样的最小值可能更侧重于简单的模型,造成欠拟合;取值过小,惩罚项的作用也会被弱化,起不到控制模型复杂度的作用。

在梯度下降中由于加入了惩罚项,因此即使模型复杂度等于训练样本数目,依然可以很好的拟合:

样本数目=模型复杂度=30(过大运行太慢)

惩罚项系数:0.001


0 0