高阶多项式能够完美的拟合所提供的数据,但如我们们上一章,其摆动的倾向过大,超过实测点的函数图像变化幅度过大,这点一直令人所诟病。因此,需要寻找一种方式来减少多项式模型的摆动,或者称为光滑化多项式模型。
关于光滑化,一个通用的技术是选取一个低阶多项式,而不管数据点的个数。由于数据点的个数大于多项式的阶数,这就导致了我们建立的多项式不会如高阶多项式般,完全的拟合所有数据点。我们使用低阶多项式的目的是降低高阶多项式摆动的倾向,以及它对数据微小变化的敏感性。所以能够实现数据光滑化。
进行光滑化的过程意味着我们要选取一个低阶多项式,这就带来了两个问题。
- 如何确定多项式的阶
- 应用哪个准则对最佳拟合多项式系数进行确定
均差
我们先来对二次多项式进行探究。二次多项式有一个特性,它的二阶导数是常数,三阶导数则为零。我们先回忆下导数的定义
在 x=x1 处 dy/dx 可以几何的解释为去曲线在该点的切线的斜率,当然,除非 Δx 很小,否则这并不是一个很好的估计。但我们能够粗略的应用 yi+1−yi=Δ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+1−yi
构成一阶差分,记为
Δ
, 从
Δ
列的相继的一阶差分间算出二阶差分
Δ2
,再依次计算三阶,直至计算出
Δn−1
,从这个例子中我们能够看出二阶差分是常数,三阶差分为零,这一结果与二次式函数求导结果是一致的。
我们在前面的计算中仅仅计算了
Δy
,但我们还需要考虑到
Δx
的影响,所以我们在差分表的基础上,再次构建了均差表
数据 | 一阶均差 | 二阶均差 | |
x1 | y1 | ||
x2 | y2 | y2−y1x2−x1 | |
x3 | y3 | y3−y2x3−x2 | y3−y2x3−x2−y2−y1x2−x1x3−x1 |
上表考虑了三个数据点和一阶和二阶导数的估计,对应的估计分别称为一阶和二阶均差。在实践中构造均差表是非常容易的,只需要在当前的阶相继估计值间取差分,然后再除以发生这一变化的区间的长度即可。
构建均差表的提示
对于均差表,我们在构建的时候需要注意几点。
首先,
xi
的值必须是不同的,且必须按照增序排列。而且还需要注意
xi
和
yi
两者之间的尺度关系,以免再进行相除的时候,得到一个过于小的值而被忽略掉。
其次,我们还需要注意,构建均差表的时候,必须灵敏的感觉数据中间出现的误差和不规则变化,一处的误差,不仅仅会影响到这一列,还会层层递进,自行扩大,在整个表中传播,我们考虑下面的一个差分表
Δn−1 | Δn | Δn+1 |
---|---|---|
6.01 | ||
6.00 | -0.01 | |
6.01 | 0.0 | 0.02 |
我们可以发现,
Δn−1
处确实是出现了常数,但是因为中间的一个小小的误差,导致后面
Δ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 |
对于这个模型,我们并不清楚该用几阶的多项式来构造,所以我们现行构造一个均差表。(此处省略)。从均差表中我们可以看出,在计算三阶均差时便出现了负号,如前面的讨论。负数说明了数据中存在着测量误差或低阶多项式不能追踪的变化。所以我们在此便可以认为,一个二阶多项式能够用于拟合这个模型。但我们这里的判断仅仅是定性的,更高阶的多项式能够更加完美的拟合这个模型,但是同时也带来个更加不稳定的摆动性,对数据误差的敏感性和模型的复杂性。
我们构建的模型的二阶多项式为下式:
我们现在的问题是确定 a,b,c 三者的值,产生一个最佳拟合数据的二次式模型。虽然有其他可用的模型,但我们将运用最小二乘准则来对确定 a,b,c 的值。
极小化的必要条件是该方程的导数为0,产生了下列方程
这里方程的求解是极其困难的,所以我们直接运用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.06−1.97v+0.0886v6
,这个函数关系比我们之前所建立的
P(v)=1.104+0.0542v2
相对的要好一些,因为多了一个参数用于吸收一些误差。我们做出该模型的残差图,如下
可以看出,这个模型所预测的值有正有负,相比于前一个模型,拟合的程度大大的提高了。