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

本文探讨了使用低阶多项式进行数据光滑化的方法,旨在减少高阶多项式的过度拟合问题。文中详细介绍了利用差分和均差来确定多项式阶数的过程,并通过实例展示了如何构建均差表及避免误差累积的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

均差

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

dydx=limΔx0ΔyΔx

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

数据差分
xi yi Δ Δ2 Δ3 Δ4
00
244
416128
6362080
86428800

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

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

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

构建均差表的提示

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

Δn1 Δn Δn+1
6.01
6.00-0.01
6.010.00.02

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

再探车辆停止距离

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

速率20253035404550556065707580
距离425673.591.5116142.5173209.5248292.5343401464

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

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 相对的要好一些,因为多了一个参数用于吸收一些误差。我们做出该模型的残差图,如下
这里写图片描述
可以看出,这个模型所预测的值有正有负,相比于前一个模型,拟合的程度大大的提高了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值