>>zdata= [95.09 23.11 60.63 48.59 89.12 76.97 45.68 1.84 82.17 44.47]; >> data=[xdata; ydata];
>> a0= [10, 10, 10]; % 初识揣测
>> [a, resnorm] = lsqcurvefit(@myfun,a0,data,zdata) Maximum number of function evaluations exceeded; increase options.MaxFunEvals a = 0.0088 -34.2886 -0.0000 resnorm = 2.2636e+004 >>format long >>a
a = 0.00881645527493 -34.28862491919983 -0.00000655131499 >>option=optimset('MaxFunEvals',800);
>> [a, resnorm] = lsqcurvefit(@myfun,a0, data, zdata, [], [], option) Optimization terminated successfully:
Relative function value changing by less than OPTIONS.TolFun a = 0.00740965259653 -20.21201417111138 -0.00000502014964 resnorm = 2.195886958305428e+004 统计工具箱函数 函数名 描 述
nlinfit(非线性回归) 采用Gauss-Newton法进行非线性最小二乘数据拟合 lscov(线性回归) 根据已知协方差矩阵进行最小二乘估计
regress regstats ridge rstool
stepwise 多元线性回归 回归诊断 脊回归(?Ridge regress) 多维响应表面可视化(RSV) 交互式逐步回归
具体例子请参阅相应文档
曲线拟合向导 Genial @ USTC 2004-4-18
第3节 加权曲线回归方法
当拟合数据包含随机变量时,通常在针对误差有两个主要假设: ● 误差只在响应数据中存在,而不在预测数据中存在; ● 误差是满足零均值常数方差正态分布的数据变量。
第二条假设方差为常数严重影响野点的出现。因为野点原来真实模式数据,他们可能引起真实拟合的潜在错误。为了改善拟合,你可以领用附加的尺度因子(也就是权值)来提高拟合的质量。将野点的权值设置得比较小,因此可以获得较好的拟合。
你可以利用下面的三个工具箱来实施加权拟合。 a. Curve Fitting Toolbox
此工具箱对线性与非线性数据有通用的最小二乘拟合能力。权值是操作数设置
中的一部分,你可以通过fitoptions进行设置。在曲线拟合工具箱中,权值可以
是与数据相联系的一个权向量。 b. Statistics Toolbox
统计工具箱中的robustfit 函数具有加权自动回归的能力。robustfit采用robust
回归对数据进行拟合,其输出为回归系数。它也可以进行线性加权回归。调用
语法结构是: ROBUSTFIT(X,Y,'WFUN',TUNE,'CONST') c. Optimization Toolbox
你也可以利用优化工具箱的最小二乘求解器-----LSQNONLIN和LSQCURVEFIT
函数实施加权最小二乘拟合。为了利用LSQNONLIN和LSQCURVEFIT实现加 权最小二乘拟合,你需要针对你的拟合数据建立起一个方程。你可以在Solution
27840中找到相应的例子。 附: Solution 27840
如何利用优化工具箱的LSQNONLIN函数实现加权最小二乘拟合 例子:
1. 制造准备拟合的样本数据。在本例子中,数据是叠加了噪声的负指数模型:
>>xdata=0:.01:1;
>>ydata=exp(-3*xdata)+randn(size(xdata))*.05;
2. 在图形中查看数据,即用plot画出xdata与ydata,用蓝色的点表示: >>plot(xdata,ydata,'b.');
曲线拟合向导 Genial @ USTC 2004-4-18
3. 建立一个函数作为LSQNONLIN的输入,该函数包含你打算拟合的数据的方程。
建立名为Mycurve.m的m文件:
function err_weithted = mycurv(parameter, real_x,real_y) % 想拟合的方程是: exp(parameter*xdata) % 其中,parameter是未知的 % fit = exp(parameter*real_x); fit = exp(parameter*real_x); err = fit -real_y; % 对误差进行加权
% 在本例子中,,我们只对最后一项进行加权,并设置其他的项为0(这将 %使得例子根据清楚)
weight = [zeros(1,length(real_x)-1) 1]; % 误差向量的权重 err_weithted = err.*weight;
4. 调用优化程序,返回parameter_hat 参数
>> parameter_hat = lsqnonlin(@mycurv,3,[],[],[],xdata,ydata) Optimization terminated successfully:
First-order optimality less than OPTIONS.TolFun, and no negative/zero curvature detected parameter_hat = -11.18559914772636
parameter_hat 返回利用m文件Mycurv的指定方程的产生值。
5. 获取了拟合的方程式,将parameter_hat带入指数方程,并在同一张图上画出。
>> fitted = exp(parameter_hat*xdata); hold on >>plot(xdata,fitted,'ro');
>>parameter_hat2 = lsqnonlin(@mycurv,3,[],[],[],xdata,ydata) %不加权拟合
>>fitted2 = exp(parameter_hat2*xdata); >>plot(xdata,fitted2,'y-');
>>legend('待拟合数据','加权拟合结果','直接拟合结果');
比较拟合结果可以看出不加权时,曲线从所有数据点的中间穿过去(如黄色的线所
示)。加权的时候,拟合曲线只通过最后一个点(因为只有该点权值非0)。 曲线拟合向导 Genial @ USTC 2004-4-18
第4节:利用Curve Fitting Toolbox改善拟合结果
很多因素对曲线拟合造成影响。下面列出各种提示有助于你提高拟合质量: ● 模型的选择:或者从MATLAB的模型库、或者用户自定义的模型的选择,是最主
要的一个因素,试着用各种不同的模型对你的数据进行拟合比较; ● 数据预处理:在拟合前对数据进行预处理也很有用。这包括: ▲ 对响应数据进行变换 ▲ 剔除Infs,NaNs,以及野点
更多的细节请查阅Curve Fitting Toolbox的文档。
● 合理的拟合应该具有处理出现奇异而使得预测趋于无穷大的时候的能力。
具体细节请查阅Curve Fitting Toolbox的文档
● 如果你提供越多的系数的估计信息,你的拟合越容易收敛。下面的提示有利于你
加快拟合的速度,提高拟合的精度:
▲ 在开始拟合的时候进行一些智能的揣测。如果你认为系数可能是某些值, 那么就用那些值作为起始值
▲ 如果缺少起始值的信息,试着用大量不同的起始值
▲ 尽量重复训练参数。例如,如果你知道参数必须是正的,那么设置它的下
限是0使得循环拟合过程。 ▲ 调整各种拟合操作数,例如: a. 采用不同的算法
b. 增加迭代与函数评价的次数 c. 减小容许误差
▲ 将数据分解为几个子集,对不同的子集采用不同的曲线拟合
● 复杂的问题最好通过进化的方式解决,即一个问题的少量独立变量先解决。低阶
问题的解通常通过近似映射作为高阶问题解的起始点。例如,如果你的模型最好被描述为:
y = c + a * exp(b*x) +d * sin(f*x)
那么它经常最好每次拟合一个项,通常从最重要的项开始。你可以先拟合: y = c1 + a1 * exp(b1*x)
然后利用拟合出的结果系数作为上式中的a,b,c的起始值进行完整的拟合。 曲线拟合向导 Genial @ USTC 2004-4-18 第5节 : 其他相近方法
或许MATLAB 2002年2月的News and Notes 杂志中有关曲线拟合的文章:Atmospheric Carbon Di-Oxide Modeling and the Curve Fitting Toolbox 或许对你有用。
附:一个用fminsearch进行园的拟合的例子: