数据预处理——matlab拟合⼯具箱
笔记整理来⾃《清风数学建模》
⽬录
⼀、打开matlab拟合⼯具箱
⽅法1:直接输⼊“cftool”
⽅法2:选择“apps”"curve fitting"
拟合⼯具箱:
⼆、拟合⼯具箱的使⽤
数据:
x  4.2  5.9  2.7  3.8  3.8  5.6  6.9  3.5  3.6  2.9  4.2  6.1  5.5  6.6  2.9  3.3  5.96  5.6 y8.411.7  4.2  6.17.910.213.2  6.66  4.68.41210.313.3  4.6  6.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' );
matlab定义函数表达式% Label axes
xlabel( '年份' );
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即为预测的⼈⼝数)
份2001200220032004200520062007200820092010201120122013201420152016
⼝269.4898271.047272.5795274.0874275.5707277.0295278.4638279.8738281.2595282.621283.9585285.2722286.5621287.8285289.0715290.2913 plot(year,population,'o',t,predictions,'.')  % 绘制预测结果图
⼋、优秀论⽂中cftool的应⽤

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。