Matlab使用曲线拟合工具箱拟合多项式曲线

4.3
(3)

Matlab内置了一个曲线拟合工具箱,即Curve Fitting Toolbox。今天,我们来使用Curve Fitting Toolbox曲线拟合工具箱实现多项式的拟合,最高可以实现六次多项式拟合。可以理解为,将一组数据按照给定的多项式函数拟合,进而得出多项式的系数。

此示例说明如何使用Curve Fitting Toolbox™将最高六次的多项式拟合到某些人口普查数据。它还展示了如何拟合单项指数方程并将其与多项式模型进行比较。

Matlab使用曲线拟合工具箱拟合多项式曲线

大致的步骤如下:

  • 使用不同的库模型加载数据并创建拟合。
  • 通过比较图形拟合结果,以及通过比较包括拟合系数和拟合优度统计的数值拟合结果,搜索最佳拟合。

文中所引用的数据为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')
Matlab使用曲线拟合工具箱拟合多项式曲线

创建并绘制二次曲线

使用该fit函数将多项式拟合到数据。使用 指定二次或二次多项式poly2。拟合的第一个输出是多项式,第二个输出gof包含拟合优度统计信息,您将在后面的步骤中进行检查。

[population2,gof] = fit(cdate,pop, 'poly2' );

要绘制拟合曲线,请使用plot函数,并在左上角添加图例,代码如下:

plot(population2,cdate,pop);
legend('Location','NorthWest');
Matlab使用曲线拟合工具箱拟合多项式曲线

创建并绘制多项式曲线

要拟合不同阶的多项式,请更改拟合类型,例如,对于三次或三次多项式,请使用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');
Matlab使用曲线拟合工具箱拟合多项式曲线

绘制残差以评估拟合

要绘制残差,请在plot函数中指定residuals为绘图类型。

plot(population2,cdate,pop,'residuals');
Matlab使用曲线拟合工具箱拟合多项式曲线

多项式方程的拟合和残差都相似,因此很难选择最佳的。

如果残差显示出系统模式,则很明显表明模型对数据的拟合不佳。

plot(populationExp,cdate,pop,'residuals');
Matlab使用曲线拟合工具箱拟合多项式曲线

单项指数方程的拟合和残差表明它总体上拟合不佳。因此,这是一个糟糕的选择,您可以从候选者中移除指数拟合以获得最佳拟合。

检查超出数据范围的拟合

检查拟合到2050年的行为。拟合人口普查数据的目标是推断出最佳拟合以预测未来人口值。

默认情况下,拟合是在数据范围内绘制的。要在不同范围内绘制拟合,请在绘制拟合之前设置轴的 x 限制。例如,要查看从拟合推断的值,请将 x 上限设置为2050。

plot(cdate,pop,'o');
xlim([1900, 2050]);
hold on
plot(population6);
hold off
Matlab使用曲线拟合工具箱拟合多项式曲线

上图不难看出,六次多项式拟合超出数据范围,很明显拟合结果很糟糕,您可以拒绝这种拟合。

绘制预测区间

要绘制预测区间,请使用predobspredfun作为绘图类型。例如,要查看截至2050年的新观测值的五次多项式的预测范围:

plot(cdate,pop,'o');
xlim([1900,2050])
hold on
plot(population5,'predobs');
hold off
Matlab使用曲线拟合工具箱拟合多项式曲线

绘制截至2050年的三次多项式的预测区间:

plot(cdate,pop,'o');
xlim([1900,2050])
hold on
plot(population3,'predobs')
hold off
Matlab使用曲线拟合工具箱拟合多项式曲线

拟合优度检验

该结构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平方值都非常接近。你应该选择哪一个?

比较系数和置信限以确定最佳拟合

通过检查其余拟合(五次多项式和二次多项式)的系数和置信界,解决最佳拟合问题。

通过显示模型、拟合系数和拟合系数的置信边界来检查population2population5

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项。不要直接将归一化系数与非归一化系数进行比较。

五次多项式的p1p2p3系数的边界为零。这意味着您无法确定这些系数是否不同于零。如果高阶模型项的系数可能为零,则它们对拟合没有帮助,这表明该模型过度拟合人口普查数据。

对于每个归一化多项式方程,与常数项、线性项和二次项相关的拟合系数几乎相同。然而,随着多项式次数的增加,与高次项相关联的系数边界过零,这表明过拟合。

然而,对于二次拟合,p1p2p3的小置信限不超过零,这表明拟合系数是相当准确的。

因此,在检查了图形和数字拟合结果之后,您应该选择二次多项式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

根据拟合和数据绘制具有置信区间的预测未来人口。

Matlab使用曲线拟合工具箱拟合多项式曲线

共计3人评分,平均4.3

到目前为止还没有投票~

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?

文章目录

转载文章,原文出处:MathWorks官网,由古哥整理发布

如若转载,请注明出处:https://iymark.com/articles/2725.html

(1)
微信公众号
古哥的头像古哥管理团队
上一篇 2022年08月29日 22:10
下一篇 2022年08月31日 20:49

你可能感兴趣的文章

发表回复

登录后才能评论

评论列表(1条)

    微信小程序
    微信公众号