MatLab内置了很多拟合的功能,比如分布、指数、多项式等拟合。对应的函数是fit。基本用法是:
cfun = fit(xdata, ydata, libname)
其中xdata是自变量x序列,ydata是因变量,libname 是模型名,比如’power1’是 y= a* x ^b 形式,Matlab内置了很多模型,可以从帮助文档里看到。对于这些拟合,MatLab有个图形工作叫 cftool,在命令行里敲入可以打开。
然而我们有时候需要做二元、多元拟合。
二元拟合,即使用模型 z = f(x, y),在MatLab也叫面拟合 (Surface fitting),有专门的图形工具 sftool,命令敲入sftool可以打开。
但如果是多元拟合,这时我们需要懂一点代码的工作。
其实不管一元、二元,代码级别是一致的。使用的都是fit命令。
对于使用 y = a* x^b这样内置的指数一元拟合,我们可以看到其libname 叫’power1’。所以采用以下命令:
cfun = fit(x, y, ‘power1’)
即从已知x、序列是得到拟合函数。coeffvalues(cfun)可以得到拟合参数,即这个例子里的a、b。如果还需要得到拟合指标,使用[cfun gof] = fit(x,y, ‘power1’),返回的gof包括了R squre、RMSE等多种指标。
对于二元拟合,比如 使用 z= a + b*sin(m*pi*x*y) + c*exp(-(w*y)^2模型进行拟合,采用类似的代码:
ft = fittype( ‘a + b*sin(m*pi*x*y) + c*exp(-(w*y)^2)’, ‘indep’, {‘x’, ‘y’}, ‘depend’, ‘z’ );
opts = fitoptions( ft );
opts.Display = ‘Off’;
opts.Lower = [-Inf -Inf -Inf -Inf -Inf];
opts.StartPoint = [0.741864193163802 0.681571628918889 0.811658042300087 0.275716137656952 0.738979809065491];
opts.Upper = [Inf Inf Inf Inf Inf];
opts.Weights = zeros(1,0);
[fitresult, gof] = fit( [x, y], z, ft, opts );
其中fittype自定义了需要的二元函数。其中’indep’指明自变量、’depend’指明因变量。即通过fittype构造一个二元拟合模型,说明其中的自变量和因变量,定义拟合的选项,这些选项经常可以不要专门指定,采用默认的即可。然后使用 fit的扩展形式得到拟合函数。
对于多元拟合,一个函数是 regress多元线性回归,另一个是nlinfit 非线性回归。两者都在statistic toolbox里。regress的基本形式是
b = regress(y, X)
其中X是多个自变量,y是因变量。
对于多元非线性拟合,可以使用nlinfit,基本形式是:
beta = nlinfit(X,Y,modelfun,beta0)
其中modelfun构造非线性多元模型,比如以下例子:
beta = nlinfit(X,y,@hougen,beta0)
使用一个hougen函数作为拟合模型,这个函数可以自行构建。
Matlab也提供了非线性多元拟合的图形化工具nlintool。
此外类似的还有 fitnlm函数提供了类似nlinfit的非线性回归,用法与nlinfit类似,但对返回结果进行包装,可以更简便的使用诸如predict等函数对非线性模型进行预报计算。