matlab最小二乘拟合问题
matlab中用最小二乘拟合的常用函数有polyfit(多项式拟合)、nlinfit(非线性拟合)以及regress(多元线性回归)。自变量有2个或以上时,应变量一个,可以使用的有nlinfit和regress,线性时用regress,非线性时用nlinfit。对于进阶matlab使用者还有更多的选择,如拟合工具箱、fit函数、interp系列插值拟合等等。
关于regress,已经在http://zhidao.baidu.com/question/624121831961197044作了说明,所以这里讲讲nlinfit,使用与链接里面相同的数据与模型:(%后面的是注释)
clc;clear;
load carsmall%此数据样本matlab自带
x=Weight;y=Horsepower;z=MPG;%取这3个变量作为拟合对象,x、y自变量,z应变量
plot3(x,y,z,'p');
hold on;
f=@(b,t)t*b(1:2)+b(3);%纯线性拟合 模型z=b(1)*x+b(2)*y+b(3),t为[x y]
b=nlinfit([x,y],z,f,[1;1;1]);
[X,Y]=meshgrid(linspace(1500,5000,10),linspace(40,240,10));
C=ones(10);
mesh(X,Y,b(1)*X+b(2)*Y+b(3)*C);
grid on;
得到下图:
f=@(b,t)t*b(1:5)+b(6);%添加非线性项进行拟合,t为[x.^2,y.^2,x.*y,x,y]
b=nlinfit([x.^2,y.^2,x.*y,x,y],z,f,ones(6,1));
figure
plot3(x,y,z,'p');
hold on;
mesh(X,Y,b(1)*X.^2+b(2)*Y.^2+b(3)*X.*Y+b(4)*X+b(5)*Y+b(6)*C);
grid on;
得到下图:
由于所用模型一样,结果与用regress类似。
>> x=[1; 2; 5; 10 ];
y=[3;2;3/2;1];
p=fittype('a+b/x','coefficients',{'a','b'});
p0=ones(2,1);
cf=fit(x,y,p, 'StartPoint', p0)
cf =
General model:
cf(x) = a+b/x
Coefficients (with 95% confidence bounds):
a = 0.9337 (0.4177, 1.45)
b = 2.092 (1.187, 2.997)
2题:
>> x=[1; 2; 3; 4 ];
y=[60;30;20;15];
p=fittype('a*exp(b*x)','coefficients',{'a','b'});
p0=ones(2,1);
cf=fit(x,y,p, 'StartPoint', p0)
cf =
General model:
cf(x) = a*exp(b*x)
Coefficients (with 95% confidence bounds):
a = 100.8 (48.57, 153.1)
b = -0.5442 (-0.8612, -0.2272)