光滑化:构建低阶多项式模型

来源:互联网 发布:mac怎么导入铃声 编辑:程序博客网 时间:2024/04/29 05:27

高阶多项式能够完美的拟合所提供的数据,但如我们们上一章,其摆动的倾向过大,超过实测点的函数图像变化幅度过大,这点一直令人所诟病。因此,需要寻找一种方式来减少多项式模型的摆动,或者称为光滑化多项式模型
关于光滑化,一个通用的技术是选取一个低阶多项式,而不管数据点的个数。由于数据点的个数大于多项式的阶数,这就导致了我们建立的多项式不会如高阶多项式般,完全的拟合所有数据点。我们使用低阶多项式的目的是降低高阶多项式摆动的倾向,以及它对数据微小变化的敏感性。所以能够实现数据光滑化。
进行光滑化的过程意味着我们要选取一个低阶多项式,这就带来了两个问题。

  • 如何确定多项式的阶
  • 应用哪个准则对最佳拟合多项式系数进行确定

均差

我们先来对二次多项式进行探究。二次多项式有一个特性,它的二阶导数是常数,三阶导数则为零。我们先回忆下导数的定义

dydx=limΔx0ΔyΔx

x=x1dy/dx可以几何的解释为去曲线在该点的切线的斜率,当然,除非Δx 很小,否则这并不是一个很好的估计。但我们能够粗略的应用yi+1yi=Δy来了解一阶导数的状况。
类似的,如果一阶导数也是个函数,我们可以重复这个过程来估计二阶导数,也就是说,能通过计算一阶导数的相继估计值间的差分来近似估计二阶导数。
举个简单的例子,我们知道曲线y=x2通过(0, 0), (2, 4), (4, 16), (6, 36), (8, 64)。我们能够构建以下差分表

数据 差分 xi yi Δ Δ2 Δ3 Δ4 0 0 2 4 4 4 16 12 8 6 36 20 8 0 8 64 28 8 0 0

我们计算yi+1yi构成一阶差分,记为Δ, 从Δ列的相继的一阶差分间算出二阶差分Δ2,再依次计算三阶,直至计算出Δn1,从这个例子中我们能够看出二阶差分是常数,三阶差分为零,这一结果与二次式函数求导结果是一致的。
我们在前面的计算中仅仅计算了Δy,但我们还需要考虑到Δx的影响,所以我们在差分表的基础上,再次构建了均差表

数据 一阶均差 二阶均差 x1 y1     x2 y2 y2y1x2x1   x3 y3 y3y2x3x2 y3y2x3x2y2y1x2x1x3x1

上表考虑了三个数据点和一阶和二阶导数的估计,对应的估计分别称为一阶和二阶均差。在实践中构造均差表是非常容易的,只需要在当前的阶相继估计值间取差分,然后再除以发生这一变化的区间的长度即可。

构建均差表的提示

对于均差表,我们在构建的时候需要注意几点。
首先,xi的值必须是不同的,且必须按照增序排列。而且还需要注意xiyi两者之间的尺度关系,以免再进行相除的时候,得到一个过于小的值而被忽略掉。
其次,我们还需要注意,构建均差表的时候,必须灵敏的感觉数据中间出现的误差和不规则变化,一处的误差,不仅仅会影响到这一列,还会层层递进,自行扩大,在整个表中传播,我们考虑下面的一个差分表

Δn1 Δn Δn+1 6.01 6.00 -0.01 6.01 0.0 0.02

我们可以发现,Δn1处确实是出现了常数,但是因为中间的一个小小的误差,导致后面Δn出现了一个负数,从而导致Δn+1的值比Δn的还要大。
这些误差在之后的计算中,会被逐渐的放大到一个难以接受的状态。所以在构建均差表时要额外注意表中可能出现的误差,尽力将其排除。

再探车辆停止距离

这个问题我们之前已经探讨过了,但是现在我们应用光滑化的低阶多项式模型来拟合数据。我们的目的是预测车辆的停止距离,以此作为速率的一个函数。现在我们决定抛弃之前所建立的模型,仅有下表给出的数据。

速率 20 25 30 35 40 45 50 55 60 65 70 75 80 距离 42 56 73.5 91.5 116 142.5 173 209.5 248 292.5 343 401 464

对于这个模型,我们并不清楚该用几阶的多项式来构造,所以我们现行构造一个均差表。(此处省略)。从均差表中我们可以看出,在计算三阶均差时便出现了负号,如前面的讨论。负数说明了数据中存在着测量误差或低阶多项式不能追踪的变化。所以我们在此便可以认为,一个二阶多项式能够用于拟合这个模型。但我们这里的判断仅仅是定性的,更高阶的多项式能够更加完美的拟合这个模型,但是同时也带来个更加不稳定的摆动性,对数据误差的敏感性和模型的复杂性
我们构建的模型的二阶多项式为下式:

P(v)=a+bv+cv2

我们现在的问题是确定abc三者的值,产生一个最佳拟合数据的二次式模型。虽然有其他可用的模型,但我们将运用最小二乘准则来对确定abc的值。
minS=i=1m[di(a+bvi+cv2i]2

极小化的必要条件是该方程的导数为0,产生了下列方程
ma+(vi)b+(v2i)c=d(vi)a+(v2i)b+(v3i)c=vid(v2i)a+(v3i)b+(v4i)c=i2d

这里方程的求解是极其困难的,所以我们直接运用python对其进行求解,并作图代码如下

x = np.arange(20, 85, 5)y = [42, 56, 73.5, 91.5, 116, 142.5, 173, 209.5, 248, 292.5, 343, 401, 464]p = np.polyfit(x, y, 2)p1 = np.poly1d(p)fig = plt.figure()plt.scatter(x, y, c='r')fig.show()

这里写图片描述
我们得到的该二次项的函数为 P(v)=50.061.97v+0.0886v6,这个函数关系比我们之前所建立的 P(v)=1.104+0.0542v2相对的要好一些,因为多了一个参数用于吸收一些误差。我们做出该模型的残差图,如下
这里写图片描述
可以看出,这个模型所预测的值有正有负,相比于前一个模型,拟合的程度大大的提高了。

原创粉丝点击