Matlab
内置了一个曲线拟合工具箱,即Curve Fitting Toolbox
。今天,我们来使用Curve Fitting Toolbox
曲线拟合工具箱实现多项式的拟合,最高可以实现六次多项式拟合。可以理解为,将一组数据按照给定的多项式函数拟合,进而得出多项式的系数。
此示例说明如何使用Curve Fitting Toolbox™
将最高六次的多项式拟合到某些人口普查数据。它还展示了如何拟合单项指数方程并将其与多项式模型进行比较。
大致的步骤如下:
- 使用不同的库模型加载数据并创建拟合。
- 通过比较图形拟合结果,以及通过比较包括拟合系数和拟合优度统计的数值拟合结果,搜索最佳拟合。
文中所引用的数据为Matlab内置数据,下面开始以实例来说明多项式拟合的过程。
加载和绘制数据
此示例的数据是文件census.mat
。
Matlab
命令行窗口输入如下命令,导入数据,或者导入自己需要拟合的数据。
load census
工作区包含两个新变量:
cdate
是一个列向量,包含 1790 年到 1990 年的 10 年增量。pop
是一个列向量,其中包含与cdate
的年份相对应的美国人口数据。
输入如下命令,可以查看相对应的数据
whos cdate pop
得到如下输出:
Name Size Bytes Class Attributes
cdate 21x1 168 double
pop 21x1 168 double
输入如下命令,将数据绘图:
plot(cdate,pop,'o')
创建并绘制二次曲线
使用该fit
函数将多项式拟合到数据。使用 指定二次或二次多项式poly2
。拟合的第一个输出是多项式,第二个输出gof
包含拟合优度统计信息,您将在后面的步骤中进行检查。
[population2,gof] = fit(cdate,pop, 'poly2' );
要绘制拟合曲线,请使用plot
函数,并在左上角添加图例,代码如下:
plot(population2,cdate,pop);
legend('Location','NorthWest');
创建并绘制多项式曲线
要拟合不同阶的多项式,请更改拟合类型,例如,对于三次或三次多项式,请使用poly3
。输入cdate
的规模相当大,因此可以通过居中和缩放数据来获得更好的结果。为此,请使用Normalize
选项。
population3 = fit(cdate,pop, 'poly3' , 'Normalize' , 'on' );
population4 = fit(cdate,pop, 'poly4' , 'Normalize' , 'on' );
population5 = fit(cdate,pop, 'poly5' , 'Normalize' , 'on' );
population6 = fit(cdate,pop, 'poly6' , 'Normalize' , 'on' );
一个简单的人口增长模型告诉我们,指数方程应该很好地拟合这个人口普查数据。要拟合单项指数模型,请使用exp1
拟合曲线。
populationExp = fit(cdate,pop, 'exp1' );
一次绘制所有拟合,并在图的左上角添加一个有意义的图例。
hold on
plot(population3,'b');
plot(population4,'g');
plot(population5,'m');
plot(population6,'b--');
plot(populationExp,'r--');
hold off
legend('cdate v pop','poly2','poly3','poly4','poly5','poly6','exp1', ...
'Location','NorthWest');
绘制残差以评估拟合
要绘制残差,请在plot
函数中指定residuals
为绘图类型。
plot(population2,cdate,pop,'residuals');
多项式方程的拟合和残差都相似,因此很难选择最佳的。
如果残差显示出系统模式,则很明显表明模型对数据的拟合不佳。
plot(populationExp,cdate,pop,'residuals');
单项指数方程的拟合和残差表明它总体上拟合不佳。因此,这是一个糟糕的选择,您可以从候选者中移除指数拟合以获得最佳拟合。
检查超出数据范围的拟合
检查拟合到2050年的行为。拟合人口普查数据的目标是推断出最佳拟合以预测未来人口值。
默认情况下,拟合是在数据范围内绘制的。要在不同范围内绘制拟合,请在绘制拟合之前设置轴的 x 限制。例如,要查看从拟合推断的值,请将 x 上限设置为2050。
plot(cdate,pop,'o');
xlim([1900, 2050]);
hold on
plot(population6);
hold off
上图不难看出,六次多项式拟合超出数据范围,很明显拟合结果很糟糕,您可以拒绝这种拟合。
绘制预测区间
要绘制预测区间,请使用predobs
或predfun
作为绘图类型。例如,要查看截至2050年的新观测值的五次多项式的预测范围:
plot(cdate,pop,'o');
xlim([1900,2050])
hold on
plot(population5,'predobs');
hold off
绘制截至2050年的三次多项式的预测区间:
plot(cdate,pop,'o');
xlim([1900,2050])
hold on
plot(population3,'predobs')
hold off
拟合优度检验
该结构gof
显示拟合的拟合优度统计信息poly2
。当您在前面的步骤中poly2
使用函数创建拟合时,您指定了fit
的输出参数。
gof
得到如下结果
gof =
sse: 159.0293
rsquare: 0.9987
dfe: 18
adjrsquare: 0.9986
rmse: 2.9724
检查误差平方和SSE
和调整后的R
平方统计数据,以帮助确定最佳拟合。SSE
统计是拟合的最小二乘误差,接近零的值表示拟合更好。当向模型中添加额外系数时,调整后的R
平方统计通常是拟合质量的最佳指标。
exp1
的大SSE
表示拟合较差,您已经通过检查拟合和残差确定了这一点。最低SSE
值与poly6
相关。然而,此拟合超出数据范围的行为使其成为外推的糟糕选择,因此您已经通过检查具有新轴限制的图来拒绝此拟合。
下一个最佳SSE
值与五次多项式拟合poly5
相关联,表明它可能是最佳拟合。然而,剩余多项式拟合的SSE
和调整后的R
平方值都非常接近。你应该选择哪一个?
比较系数和置信限以确定最佳拟合
通过检查其余拟合(五次多项式和二次多项式)的系数和置信界,解决最佳拟合问题。
通过显示模型、拟合系数和拟合系数的置信边界来检查population2
和population5
:
population2
population2 =
Linear model Poly2:
population2(x) = p1*x^2 + p2*x + p3
Coefficients (with 95% confidence bounds):
p1 = 0.006541 (0.006124, 0.006958)
p2 = -23.51 (-25.09, -21.93)
p3 = 2.113e+04 (1.964e+04, 2.262e+04)
population5
population5 =
Linear model Poly5:
population5(x) = p1*x^5 + p2*x^4 + p3*x^3 + p4*x^2 + p5*x + p6
where x is normalized by mean 1890 and std 62.05
Coefficients (with 95% confidence bounds):
p1 = 0.5877 (-2.305, 3.48)
p2 = 0.7047 (-1.684, 3.094)
p3 = -0.9193 (-10.19, 8.356)
p4 = 23.47 (17.42, 29.52)
p5 = 74.97 (68.37, 81.57)
p6 = 62.23 (59.51, 64.95)
您还可以使用confint
获取置信区间:
ci = confint(population5)
ci =
-2.3046 -1.6841 -10.1943 17.4213 68.3655 59.5102
3.4801 3.0936 8.3558 29.5199 81.5696 64.9469
系数的置信边界决定了它们的精度。检查拟合方程(例如f(x)=p1x+p2x…),以查看每个系数的模型项。请注意,p2
是指poly2
中的p2*x
项和poly5
中的p2*x^4
项。不要直接将归一化系数与非归一化系数进行比较。
五次多项式的p1
、p2
和p3
系数的边界为零。这意味着您无法确定这些系数是否不同于零。如果高阶模型项的系数可能为零,则它们对拟合没有帮助,这表明该模型过度拟合人口普查数据。
对于每个归一化多项式方程,与常数项、线性项和二次项相关的拟合系数几乎相同。然而,随着多项式次数的增加,与高次项相关联的系数边界过零,这表明过拟合。
然而,对于二次拟合,p1
、p2
和p3
的小置信限不超过零,这表明拟合系数是相当准确的。
因此,在检查了图形和数字拟合结果之后,您应该选择二次多项式population2
作为推断人口普查数据的最佳拟合。
评估新查询点处的最佳拟合
现在您已经选择了最佳拟合,population2
,用于外推此人口普查数据,请评估一些新查询点的拟合:
cdateFuture = (2000:10:2020).';
popFuture = population2(cdateFuture)
popFuture =
274.6221
301.8240
330.3341
要计算未来人口预测的95%
置信区间,请使用预测方法:
ci = predint(population2,cdateFuture,0.95,'observation')
ci =
266.9185 282.3257
293.5673 310.0807
321.3979 339.2702
根据拟合和数据绘制具有置信区间的预测未来人口。
转载文章,原文出处:MathWorks官网,由古哥整理发布
如若转载,请注明出处:https://iymark.com/articles/2725.html
评论列表(1条)
6