Matlab:最小二乘曲线拟合
问题:给定一批数据点(输入变量与输出变量的数据),需确定满足特定要求的曲线或
曲面。如果输入变量和输出变量都只有一个,则属于一元函数的拟合和插值;而若输入变量
有多个,则为多元函数的拟合和插值(有点回归分析的意思)
解决方案:
(1)若要求所求曲线(面)通过所给所有数据点,就是插值问题;
(2)若不要求曲线(面)通过所有数据点,而是要求它反映对象整体的变化趋势,这
就是数据拟合,又称曲线拟合或曲面拟合。
注意:插值和拟合都是要根据一组数据构造一个函数作为近似,由于近似的要求不同,
二者的数学方法上是完全不同的。而面对一个实际问题,究竟应该用插值还是拟合,有时容
易确定,有时则并不明显
数据拟合的具体作法是:对给定数据
),(
ii
yx
(i=0,1,…,m),在取定的函
数类
中,求
)(xp
,使误差iii
yxpr)(
(i=0,1,…,m)的平方和最小,即
m
i
i
r
0
2
=
m
i
ii
yxp
0
2min)(
从几何意义上讲,就是寻求与给定点
),(
ii
yx
(i=0,1,…,m)的距离平方和为最
小的曲线
)(xpy
(图6-1)。函数
)(xp
称为拟合函数或最小二乘解,求拟
合函数
)(xp
的方法称为曲线拟合的最小二乘法。
在曲线拟合中,函数类
可有不同的选取方法.
6—1
1.“”命令
t函数
arch函数
4.曲线拟合工具箱
1.非线性拟合nlinfit函数
5.例子
1.1.直线型例子
2.2.多项式型
3.非线性(多元情况)
最小二乘法在曲线拟合中比较普遍。拟合的模型主要有
1.直线型
2.多项式型
3.分数函数型
4.指数函数型
5.对数线性型
6.高斯函数型
......
一般对于LS问题,通常利用反斜杠运算“”、fminarch或优化工具箱提供的极小化函数求解。在Matlab
中,曲线拟合工具箱也提供了曲线拟合的图形界面操作。在命令提示符后键入:cftool,即可根据数据,
选择适当的拟合模型。
“”命令
1.假设要拟合的多项式是:y=a+b*x+c*x^2.首先建立设计矩阵X:
X=[ones(size(x))xx^2];
执行:
para=Xy
para中包含了三个参数:para(1)=a;para(2)=b;para(3)=c;
这种方法对于系数是线性的模型也适应。
2.假设要拟合:y=a+b*exp(x)+cx*exp(x^2)
设计矩阵X为
X=[ones(size(x))exp(x)x.*exp(x.^2)];
para=Xy
3.多重回归(乘积回归)
设要拟合:y=a+b*x+c*t,其中x和t是预测变量,y是响应变量。设计矩阵为
X=[ones(size(x))xt]%注意x,t大小相等!
para=Xy
polyfit函数
polyfit函数不需要输入设计矩阵,在参数估计中,polyfit会根据输入的数据生成设计矩阵。
1.假设要拟合的多项式是:y=a+b*x+c*x^2
p=polyfit(x,y,2)
然后可以使用polyval在t处预测:
y_hat=polyval(p,t)
polyfit函数可以给出置信区间。
[pS]=polyfit(x,y,2)%S中包含了标准差
[y_fit,delta]=polyval(p,t,S)%按照拟合模型在t处预测
在每个t处的95%CI为:(y_fit-1.96*delta,y_fit+1.96*delta)
2.指数模型也适应
假设要拟合:y=a+b*exp(x)+c*exp(x.^2)
p=polyfit(x,log(y),2)
fminarch函数
fminarch是优化工具箱的极小化函数。LS问题的基本思想就是残差的平方和(一种范数,由此,LS产
生了许多应用)最小,因此可以利用fminarch函数进行曲线拟合。
假设要拟合:y=a+b*exp(x)+c*exp(x.?2)
首先建立函数,可以通过m文件或函数句柄建立:
x=[......]';
y=[......]';
f=@(p,x)p(1)+p(2)*exp(x)+p(3)*exp(x.?2)%注意向量化:p(1)=a;p(2)=b;p(3)=c;
%可以根据需要选择是否优化参数
%opt=options()
p0=ones(3,1);%初值
para=fminarch(@(p)(y-f(p,x)).^2,p0)%可以输出Hessian矩阵
res=y-f(para,x)%拟合残差
曲线拟合工具箱
提供了很多拟合函数,对大样本场合比较有效!
非线性拟合nlinfit函数
clearall;
x1=[0.42920.42690.3810.40150.41170.3017]';
x2=[0.000140.000590.01260.00610.004250.0443]';
x=[x1x2];
y=[0.5170.5090.440.4660.4790.309]';
f=@(p,x)
2.350176*p(1)*(1-1/p(2))*(1-(1-x(:,1).^(1/p(2))).^p(2)).^2.*(x(:,1).^(-1/p(2))-1).^(-p
(2)).*x(:,1).^(-1/p(2)-0.5).*x(:,2);
p0=[80.5]';
opt=optimt('TolFun',1e-3,'TolX',1e-3);%
[pR]=nlinfit(x,y,f,p0,opt)
例子1.直线型例子
2.多项式型
1900-2000年的总人口情况的曲线拟合
clearall;cloall;
%cftool提供了可视化的曲线拟合!
t=[19302000]';
y=[75.99591.972105.711123.203131.669150.697179.323203.212226.505249.633
281.4220]';
%t太大,以t的幂作为基函数会导致设计矩阵尺度太差,列变量几乎线性相依。变换为[-11]上
s=(t-1950)/50;
%plot(s,y,'ro');
%回归线:y=a+bx
mx=mean(s);my=mean(y);
sx=std(s);sy=std(y);
r=corr(s,y);
b=r*sy/sx;
a=my-b*mx;
rline=a+b.*s;
figure;
subplot(3,2,[12])
plot(s,y,'ro',s,rline,'k');%
title('多项式拟合');
t(gca,'XTick',s,'XTickLabel',sprintf('%d|',t));
%holdon;
n=4;
PreYear=[2];%预测年份
tPreYear=(PreYear-1950)/50;
Y=zeros(length(t),n);
res=zeros(size(Y));
delta=zeros(size(Y));
PrePo=zeros(length(PreYear),n);
Predelta=zeros(size(PrePo));
fori=1:n
[pS(i)]=polyfit(s,y,i);
[Y(:,i)delta(:,i)]=polyval(p,s,S(i));%拟合的Y
[PrePo(:,i)Predelta(:,i)]=polyval(p,tPreYear,S(i));%预测
res(:,i)=y-Y(:,i);%残差
end
%plot(s,Y);%2009a自动添加不同颜色
%legend('data','regressionline','1stpoly','2ndpoly','3rdpoly','4thpoly',2)
%plot(tPreYear,PrePo,'>');
%holdoff
%plot(Y,res,'o');%残差图
r=corr(s,Y).^2%R^2
%拟合误差估计CI
YearAdd=[t;PreYear'];
tYearAdd=[s;tPreYear'];
CFtit={'一阶拟合','二阶拟合','三阶拟合','四阶拟合'};
forcol=1:n
subplot(3,2,col+2);
plot(s,y,'ro',s,Y(:,col),'g-');%原始数据和拟合数据
legend('Original','Fitted',2);
holdon;
plot(s,Y(:,col)+2*delta(:,col),'r:');%95%CI
plot(s,Y(:,col)-2*delta(:,col),'r:');
plot(tPreYear,PrePo(:,col),'>');%预测值
plot(tPreYear,PrePo(:,col)+2*Predelta(:,col));%预测95%CI
plot(tPreYear,PrePo(:,col)-2*Predelta(:,col));
axis([-1.21.80400]);
t(gca,'XTick',tYearAdd,'XTickLabel',sprintf('%d|',YearAdd));
title(CFtit{col});
holdoff;
end
figure;%残差图
forcol=1:n
subplot(2,2,col);
plot(Y(:,i),res(:,i),'o');
end
非线性(多元情况)
在百度知道中,要拟合y=a*x1^n1+b*x2^n2+c*x3^n3
%注:只是作为应用,模型不一定正确
%x2=x3
y=[1080.941083.031162.801155.611092.821099.261161.061258.051299.031298.30
1440.221641.301672.211612.731658.641752.421837.992099.292675.472786.33
2881.07]';
x1=[11.051.11.151.21.251.31.351.41.451.51.551.61.651.71.751.81.851.91.95
2]';
x2=[11.0251.051.0751.11.1251.151.1751.21.2251.2501.2751.31.3251.3501.375
1.41.4251.451.4751.5]';
x3=[11.0251.051.0751.11.1251.151.1751.21.2251.2501.2751.31.3251.3501.375
1.41.4251.451.4751.5]';
x=[x1x2x3];
f=@(p,x)p(1)*x(:,1).^p(2)+p(3)*x(:,2).^p(4)+p(5)*x(:,3).^p(6);
p0=ones(6,1);
p=fminarch(@(p)sum(y-f(p,x)).^2,p0)
res=y-f(p,x);
res2=res.^2%失败的模型
本文发布于:2022-12-04 06:42:48,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/49464.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |