首页 > 编程知识 正文

MATLAB数据预处理,matlab分布拟合工具箱与检验

时间:2023-05-05 14:42:04 阅读:262609 作者:853

笔记整理来自《清风数学建模》

目录

一、打开matlab拟合工具箱

二、拟合工具箱的使用

三、自定义拟合函数——Custom Equation(建模用的较多)

 四、多项式拟合(建模用的较多)

 五、如何导出拟合的高清图像

六、调用拟合工具箱自动生成的代码

七、利用拟合工具箱预测美国人口

1. 题目

2. 使用拟合工具箱进行拟合

 3. 自动生成拟合的代码

 4. 预测未来的人口数

八、优秀论文中cftool的应用


一、打开matlab拟合工具箱

方法1:直接输入“cftool”

方法2:选择“apps”"curve fitting"

拟合工具箱:

二、拟合工具箱的使用

 数据:

x4.25.92.73.83.85.66.93.53.62.94.26.15.56.62.93.35.965.6y8.411.74.26.17.910.213.26.664.68.41210.313.34.66.710.811.59.9

(1)导入数据:load data1.mat

(2) 选择合适的函数进行拟合。

 参数解释:

Linear model Poly1:
     f(x) = p1*x + p2
Coefficients (with 95% confidence bounds):
       p1 =       2.095  (1.886, 2.304) %表明p1有95%的可能性落在[1.886,2.304]这个区间
       p2 =      -1.055  (-2.072, -0.03775)

Goodness of fit:
  SSE: 5.728%误差平方和
  R-square: 0.9635%拟合优度
  Adjusted R-square: 0.9613%调整后的拟合优度
  RMSE: 0.5805%均方误差

在拟合里面,最重要的两个参数是误差平方和SSE和拟合优度R^2,拟合优度越接近于1,说明误差越小,拟合效果越好。

三、自定义拟合函数——Custom Equation(建模用的较多)

在matlab拟合工具箱中,可以自定义函数的参数和表达式,matlab会自动计算出参数的值。

当拟合函数设置成一元二次函数时,可以发现拟合优度变大了,这是不是说明该二次函数比一次函数更好呢?

实际上,二次函数和一次函数的SSE和R^2的值都相差不大。在这种情况下,尽量拟合函数越简单越好,否则很可能出现龙格现象(过拟合)。

 四、多项式拟合(建模用的较多)

多项式拟合可以自定义函数的阶数。

 五、如何导出拟合的高清图像

(1)选择“打印图像”

(2) 选择“导出设置”“导出”或者选择“编辑”“复制图片”

分辨率可以改成“600”,这样图像的清晰度会更高一些。 

 

六、调用拟合工具箱自动生成的代码

 第一步:选择“文件”“自动生成代码”

 第二步:点击保存,保存为函数格式.m的文件

第三步:点击下面的代码执行即可。

[fitresult, gof] = createFit(x, y)

 通过生成的代码,可以更改坐标轴、图像标题等信息。

七、利用拟合工具箱预测美国人口 1. 题目

下表给出了近2个世纪的美国人口统计数据(单位:百万人),请使用最下面给定的拟合函数预测后30年的美国人口。

2. 使用拟合工具箱进行拟合

导入数据,调出拟合工具箱: 

year = 1790:10:2000;population = [3.9,5.3,7.2,9.6,12.9,17.1,23.2,31.4,38.6,50.2,62.9,76.0,92.0,106.5,123.2,131.7,150.7,179.3,204.0,226.5,251.4,281.4];cftool

输入自定义的拟合函数:(需要将f(x)改为f(t))

xm/(1+((xm/3.9)-1)*exp((-r)*(t-1790)))

 发现拟合函数图像有问题,提示:

Fit computation did not converge:拟合计算未收敛:
Fitting stopped because the number of iterations or function evaluations exceeded the specified maximum.拟合停止,因为迭代次数或函数求值次数超过了指定的最大值。

说明拟合参数xm和r的初始值设置有问题,这就需要我们更改拟合参数xm和r的值,我们可以一个个数去试

【结果】:

General model:
     f(t) = xm/(1+((xm/3.9)-1)*exp((-r)*(t-1790)))
Coefficients (with 95% confidence bounds):
       r =     0.02735  (0.0265, 0.0282)
       xm =       342.4  (311, 373.8)

Goodness of fit:
  SSE: 1225
  R-square: 0.9924
  Adjusted R-square: 0.992
  RMSE: 7.826

在这里,由于该函数不是线性函数,所以不用拟合优度解释拟合的效果,而应该用误差平方和SSE进行解释。这里SSE=1225,说明误差还比较小。

 3. 自动生成拟合的代码

和第五点的操作方法一样,自动生成代码,改变一些标题等。

自动生成的代码:

function [fitresult, gof] = createFit(year, population)%% Fit: 'untitled fit 1'.[xData, yData] = prepareCurveData( year, population );% Set up fittype and options.ft = fittype( 'xm/(1+((xm/3.9)-1)*exp((-r)*(t-1790)))', 'independent', 't', 'dependent', 'y' );opts = fitoptions( ft );opts.Display = 'Off';opts.Lower = [-Inf -Inf];opts.StartPoint = [0.757740130578333 41];opts.Upper = [Inf Inf];% Fit model to data.[fitresult, gof] = fit( xData, yData, ft, opts );% Plot fit with data.figure( 'Name', '拟合函数图像' );h = plot( fitresult, xData, yData );legend( h, '样本点', '拟合曲线', 'Location', 'NorthEast' );% Label axesxlabel( '年份' );ylabel( '人口数(百万人)' );grid on

图像:

 4. 预测未来的人口数

【分析】指导预测人口y=f(x)的函数关系式后,可以根据年份算出人口数。需要注意的时,计算预测的人口数时需要用点乘/除的形式,保证一个x对应一个唯一的y值,按照对应的值进行计算。

t = 2001:2030;xm = 342.4; r = 0.02735;predictions = xm./(1+(xm./3.9-1).*exp(-r.*(t-1790))); % 计算预测值(注意这里要写成点乘和点除,这样可以保证按照对应元素进行计算)

计算结果:(predictions即为预测的人口数)

年份200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030人口269.4898271.047272.5795274.0874275.5707277.0295278.4638279.8738281.2595282.621283.9585285.2722286.5621287.8285289.0715290.2913291.4881292.6621293.8136294.9428296.0498297.135298.1986299.2408300.2619301.2622302.2419303.2013304.1407305.0603plot(year,population,'o',t,predictions,'.') % 绘制预测结果图

八、优秀论文中cftool的应用

 

快三大小单双计划qq群ber of iterations or function evaluations exceeded the specified maximum.拟合停止,因为迭代次数或函数求值次数超过了指定的最大值。

说明拟合参数xm和r的初始值设置有问题,这就需要我们更改拟合参数xm和r的值,我们可以一个个数去试

【结果】:

General model:
     f(t) = xm/(1+((xm/3.9)-1)*exp((-r)*(t-1790)))
Coefficients (with 95% confidence bounds):
       r =     0.02735  (0.0265, 0.0282)
       xm =       342.4  (311, 373.8)

Goodness of fit:
  SSE: 1225
  R-square: 0.9924
  Adjusted R-square: 0.992
  RMSE: 7.826

在这里,由于该函数不是线性函数,所以不用拟合优度解释拟合的效果,而应该用误差平方和SSE进行解释。这里SSE=1225,说明误差还比较小。

 3. 自动生成拟合的代码

和第五点的操作方法一样,自动生成代码,改变一些标题等。

自动生成的代码:

function [fitresult, gof] = createFit(year, population)%% Fit: 'untitled fit 1'.[xData, yData] = prepareCurveData( year, population );% Set up fittype and options.ft = fittype( 'xm/(1+((xm/3.9)-1)*exp((-r)*(t-1790)))', 'independent', 't', 'dependent', 'y' );opts = fitoptions( ft );opts.Display = 'Off';opts.Lower = [-Inf -Inf];opts.StartPoint = [0.757740130578333 41];opts.Upper = [Inf Inf];% Fit model to data.[fitresult, gof] = fit( xData, yData, ft, opts );% Plot fit with data.figure( 'Name', '拟合函数图像' );h = plot( fitresult, xData, yData );legend( h, '样本点', '拟合曲线', 'Location', 'NorthEast' );% Label axesxlabel( '年份' );ylabel( '人口数(百万人)' );grid on

图像:

 4. 预测未来的人口数

【分析】指导预测人口y=f(x)的函数关系式后,可以根据年份算出人口数。需要注意的时,计算预测的人口数时需要用点乘/除的形式,保证一个x对应一个唯一的y值,按照对应的值进行计算。

t = 2001:2030;xm = 342.4; r = 0.02735;predictions = xm./(1+(xm./3.9-1).*exp(-r.*(t-1790))); % 计算预测值(注意这里要写成点乘和点除,这样可以保证按照对应元素进行计算)

计算结果:(predictions即为预测的人口数)

年份200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030人口269.4898271.047272.5795274.0874275.5707277.0295278.4638279.8738281.2595282.621283.9585285.2722286.5621287.8285289.0715290.2913291.4881292.6621293.8136294.9428296.0498297.135298.1986299.2408300.2619301.2622302.2419303.2013304.1407305.0603plot(year,population,'o',t,predictions,'.') % 绘制预测结果图

八、优秀论文中cftool的应用

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。