数据回归分析和拟合的Matlab实现.docx
《数据回归分析和拟合的Matlab实现.docx》由会员分享,可在线阅读,更多相关《数据回归分析和拟合的Matlab实现.docx(16页珍藏版)》请在冰豆网上搜索。
![数据回归分析和拟合的Matlab实现.docx](https://file1.bdocx.com/fileroot1/2023-2/3/26c5155f-4b16-472a-9bf0-36562abb062d/26c5155f-4b16-472a-9bf0-36562abb062d1.gif)
数据回归分析和拟合的Matlab实现
数据回归分析和拟合的Matlab实现
本次将教程的主要内容包含:
一、多元线性回归 2#
多元线性回归:
regress
二、多项式回归 3#
一元多项式:
polyfit或者polytool
多元二项式:
rstool或者rsmdemo
三、非线性回归 4#
非线性回归:
nlinfit
四、逐步回归 5#
逐步回归:
stepwise
一、多元线性回归
多元线性回归:
1、b=regress(Y,X) 确定回归系数的点估计值
2、[b,bint,r,rint,stats]=regress(Y,X,alpha) 求回归系数的点估计和区间估计、并检验回归模型
①bint表示回归系数的区间估计.
②r表示残差
③rint表示置信区间
④stats表示用于检验回归模型的统计量,有三个数值:
相关系数r2、F值、与F对应的概率p
说明:
相关系数r2越接近1,说明回归方程越显著;时拒绝H0,F越大,说明回归方程越显著;与F对应的概率p<α时拒绝H0
⑤alpha表示显著性水平(缺省时为0.05)
3、rcoplot(r,rint) 画出残差及其置信区间
具体参见下面的实例演示
4、实例演示,函数使用说明
(1)输入数据
>>x=[143145146147149150153154155156157158159160162164]';
>>X=[ones(16,1)x];
>>Y=[8885889192939395969897969899100102]';
回归分析及检验
复制内容到剪贴板
代码:
>>[b,bint,r,rint,stats]=regress(Y,X)
b=
-16.0730
0.7194
bint=
-33.7071 1.5612
0.6047 0.8340
r=
1.2056
-3.2331
-0.9524
1.3282
0.8895
1.1702
-0.9879
0.2927
0.5734
1.8540
0.1347
-1.5847
-0.3040
-0.0234
-0.4621
0.0992
rint=
-1.2407 3.6520
-5.0622 -1.4040
-3.5894 1.6845
-1.2895 3.9459
-1.8519 3.6309
-1.5552 3.8955
-3.7713 1.7955
-2.5473 3.1328
-2.2471 3.3939
-0.7540 4.4621
-2.6814 2.9508
-4.2188 1.0494
-3.0710 2.4630
-2.7661 2.7193
-3.1133 2.1892
-2.4640 2.6624
stats=
0.9282 180.9531 0.0000 1.7437
运行结果解读如下
参数回归结果为,对应的置信区间分别为[-33.7017,1.5612]和[0.6047,0.834]
r2=0.9282(越接近于1,回归效果越显著),F=180.9531,p=0.0000,由p<0.05,可知回归模型y=-16.073+0.7194x成立
(3)残差分析作残差图
rcoplot(r,rint)
从残差图可以看出,除第二个数据外,其余数据的残差离零点均较近,且残差的置信区间均包含零点,这说明回归模型y=-16.073+0.7194x能较好的符合原始数据,而第二个数据可视为异常点。
(4)预测及作图
z=b
(1)+b
(2)*x
plot(x,Y,'k+',x,z,'r')
x=[10971284150213941303155519172051211122862311200324352625294831553372];%因变量时间序列数据
y=[698872988807738102513161539156117651762196019022013244627362825];%自变量时间序列数据
X=[ones(size(x')),x'];
[b,bint,r,rint,stats]=regress(y',X,0.05);%调用一元回归分析函数
rcoplot(r,rint)%画出在置信度区间下误差分布.
[bbintrrints]=regress(y,x,alpha);
%y=[....]'
%x=[ones(n,1)x1x2x3....xn];
[b,bint,r,rint,stats]=regress(y,X,alpha)
这是regress最完整的用法,其中y为要拟合的因变量
X为对应于你要求的系数的系数矩阵
alpha为显著水平
输出的b是你要求的系数组成的矩阵
bint是置信区间
r是用来诊断奇异点的
stats会返回四个变量
theR2statistic,相关系数
theFstatisticanditsp-value,F检验及p值
andanestimateoftheerrorvariance.误差方差估计
二、多项式回归
一元多项式回归
1、一元多项式回归函数
(1)[p,S]=polyfit(x,y,m) 确定多项式系数的MATLAB命令
说明:
x=(x1,x2,…,xn),y=(y1,y2,…,yn);p=(a1,a2,…,am+1)是多项式y=a1xm+a2xm-1+…+amx+am+1的系数;S是一个矩阵,用来估计预测误差
(2)polytool(x,y,m) 调用多项式回归GUI界面,参数意义同polyfit
2、预测和预测误差估计
(1)Y=polyval(p,x) 求polyfit所得的回归多项式在x处的预测值Y
(2)[Y,DELTA]=polyconf(p,x,S,alpha) 求polyfit所得的回归多项式在x处的预测值Y及预测值的显著性为1-alpha的置信区间Y±DELTA,alpha缺省时为0.5
3、实例演示说明
观测物体降落的距离s与时间t的关系,得到数据如下表,求s的表达式(即回归方程s=a+bt+ct2)
t(s)1/302/303/304/305/306/307/30
s(cm)11.8615.6720.6026.6933.7141.9351.13
t(s)8/309/3010/3011/3012/3013/3014/30
s(cm)61.4972.9085.4499.08113.77129.54146.48
解法一:
直接作二次多项式回归
:
>>t=1/30:
1/30:
14/30;
>>s=[11.8615.6720.6026.6933.7141.9351.1361.4972.9085.4499.08113.77129.54146.48];
>>[p,S]=polyfit(t,s,2)
p=
489.2946 65.8896 9.1329
S=
R:
[3x3double]
df:
11
normr:
0.1157
故回归模型为
解法二:
化为多元线性回
>>t=1/30:
1/30:
14/30;
>>s=[11.8615.6720.6026.6933.7141.9351.1361.4972.9085.4499.08113.77129.54146.48];
>>T=[ones(14,1)t'(t.^2)'];
>>[b,bint,r,rint,stats]=regress(s',T)
b=
9.1329
65.8896
489.2946
bint=
9.0614 9.2044
65.2316 66.5476
488.0146 490.5747
r=
-0.0129
-0.0302
-0.0148
0.0732
0.0040
0.0474
-0.0165
-0.0078
-0.0363
-0.0222
0.0046
-0.0059
-0.0237
0.0411
rint=
-0.0697 0.0439
-0.0956 0.0352
-0.0876 0.0580
0.0182 0.1283
-0.0709 0.0789
-0.0192 0.1139
-0.0894 0.0563
-0.0813 0.0658
-0.1062 0.0335
-0.0955 0.0511
-0.0704 0.0796
-0.0793 0.0675
-0.0904 0.0429
-0.0088 0.0910
stats=
1.0e+007*
0.0000 1.0378 0 0.0000
故回归模型为:
预测及作图
Y=polyconf(p,t,S);
plot(t,s,'k+',t,Y,'r')
多元二项式回归
1、多元二项式回归Matlab命令
rstool(x,y,'model',alpha)
输入参数说明:
x:
n*m矩阵;
Y:
n维列向量;
alpha:
显著性水平(缺省时为0.05);
mode:
由下列4个模型中选择1个(用字符串输入,缺省时为线性模型)
2、实例演示说明
设某商品的需求量与消费者的平均收入、商品价格的统计数据如下,建立回归模型,预测平均收入为1000、价格为6时的商品需求量
需求量10075807050659010011060
收入1000600 1200500300400130011001300300
价格5766875439
解法一:
选择纯二次模型
复制内容到剪贴板
代码:
%直接用多元二项式回归如下
x1=[10006001200500300400130011001300300];
x2=[5766875439];
y=[10075807050659010011060]';
x=[x1'x2'];
rstool(x,y,'purequadratic')
在x1对应的文本框中输入1000,X2中输入6,敲回车键,此时图形和相关数据会自动更新
此时在GUI左边的“PredictedY1”下方的数据变为88.47981,表示平均收入为1000、价格为6时商品需求量为88.4791
点击左下角的Export按钮,将会导出回归的相关参数beta、rmse和residuals到工作空间(workspace)
在Export按钮下面可以选择回归类型
在Matlab命令窗口中输入
复制内容到剪贴板
代码:
>>beta,rmse
将得到如下结果
复制内容到剪贴板
代码:
beta=
110.5313
0.1464
-26.5709
-0.0001
1.8475
rmse=
4.5362
故回归模型为
解法二:
将上面饿模型转换为多元线性回归
复制内容到剪贴板
代码:
>>X=[ones(10,1)x1'x2'(x1.^2)'(x2.^2)'];
>>[b,bint,r,rint,stats]=regress(y,X);
>>b,stats
b=
110.5313
0.1464
-26.5709
-0.0001
1.8475
stats=
0.9702 40.6656 0.0005 20.5771
三、非线性回归
1、非线性回归
[beta,r,J]=nlinfit(x,y,'modelfun',beta0) 非线性回归系数的命令
nlintool(x,y,'modelfun',beta0,alpha) 非线性回归GUI界面
参数说明
beta:
估计出的回归系数;
r:
残差;
J:
Jacobian矩阵;
x,y:
输入数据x、y分别为矩阵和n维列向量,对一元非线性回归,x为n维列向量;
modelfun:
M函数、匿名函数或inline函数,定义的非线性回归函数;
beta0:
回归系数的初值;
2、预测和预测误差估计
[Y,DELTA]=nlpredci('modelfun',x,beta,r,J)
获取x处的预测值Y及预测值的显著性为1-alpha的置信区间Y±DELTA
3、实例演示说明
解:
(1)对将要拟合的非线性模型,建立M函数如下
复制内容到剪贴板
代码:
functionyhat=modelfun(beta,x)
%beta是需要回归的参数
%x是提供的数据
yhat=beta
(1)*exp(beta
(2)./x);
(2)输入数据
复制内容到剪贴板
代码:
x=2:
16;
y=[6.428.209.589.59.7109.939.9910.4910.5910.6010.8010.6010.9010.76];
beta0=[82]';
(3)求回归系数
复制内容到剪贴板
代码:
[beta,r,J]=nlinfit(x',y',@modelfun,beta0);
beta
beta=
11.6036
-1.0641
即得回归模型为
(4)预测及作图
复制内容到剪贴板
代码:
[YY,delta]=nlpredci('modelfun',x',beta,r,J);
plot(x,y,'k+',x,YY,'r')
四、逐步回归
1、逐步回归的命令
stepwise(x,y,inmodel,alpha) 根据数据进行分步回归
stepwise 直接调出分步回归GUI界面
输入参数说明
x:
自变量数据,阶矩阵;
y:
因变量数据,阶矩阵;
inmodel:
矩阵的列数的指标,给出初始模型中包括的子集(缺省时设定为全部自变量);
alpha:
显著性水平(缺省时为0.5);
2、实例演示分析
水泥凝固时放出的热量y与水泥中4种化学成分x1、x2、x3、x4有关,今测得一组数据如下,试用逐步回归法确定一个线性模型
序号 1 2 3 4 5 6 7 8 9 10 11 12 13
x1 7 1 11 11 7 11 3 1 2 21 1 11 10
x2 26 29 56 31 52 55 71 31 54 47 40 66 68
x3 6 15 8 8 6 9 17 22 18 4 23 9 8
x4 60 52 20 47 33 22 6 44 22 26 34 12 12
y 78.5 74.3 104.3 87.6 95.9 109.2 102.7 72.5 93.1 115.9 83.8 113.3 109.4
(1)数据输入
复制内容到剪贴板
代码:
x1=[7111117113122111110]';
x2=[26295631525571315447406668]';
x3=[615886917221842398]';
x4=[6052204733226442226341212]';
y=[78.574.3104.387.695.9109.2102.772.593.1115.983.8113.3109.4]';
x=[x1x2x3x4];
(2)逐步回归
①先在初始模型中取全部自变量
复制内容到剪贴板
代码:
stepwise(x,y)
Matlab问题!
逐步多元非线性回归以及求极值问题
悬赏分:
55-解决时间:
2008-10-817:
31
1.013.01.50.330
1.419.03.00.366
1.825.01.00.294
2.210.02.50.476
2.616.00.50.209
3.022.02.00.451
3.428.03.50.482
这是文献上的一组均匀试验的设计和结果。
从左至右:
自变量x1,x2,x3;因变量y;试验次数7次。
请问能否用Matlab进行多元非线性的回归?
(二次多项式)可能的模型y=a+b1*x1+b2*x2+b3*x3+b4*x1*x2+b5*x1*x3+b6*x2*x3+b7*x1^2+b8*x2^2+b9*x3^2;最好可以用逐步回归技术或其他技术剔除一些影响小的变量或项。
请给出具体的方法。
谢谢。
其实最终的目的是找出极大值点和极大值(优化),所以,除了用上述多元非线性回归方法外,如有其他方法如用人工神经网络结合遗传算法、SNTO(序贯优化方法)等进行有效处理的,也可,并烦请给出具体命令、方法。
多谢!
!
!
%%引言
%%你的变量是10个,而方程只有7个,做的效果可能会比较差
%%神经网络等我没接触过
%%下面只弄那个多项式
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%第一步
data=[1.013.01.50.330;
1.419.03.00.366;
1.825.01.00.294;
2.210.02.50.476;
2.616.00.50.209;
3.022.02.00.451;
3.428.03.50.482];
x1=data(:
1);
x2=data(:
2);
x3=data(:
3);
y=data(:
4);
mat=[ones(size(x1)),x1,x2,x3,x1.*x2,x1.*x3,x2.*x3,x1.^2,x2.^2,x3.^2];
%下面的A就是我们要的常数,分别对应于a,b1,b2,b3,b4,b5,b6,b7,b8,b9
A=mat\y
%%%%%%%%%第一步结束
%%%%%%%%得到的结果是:
A=
0
0
0.0149
0.1844
-0.0024
0.0510
-0.0024
0
-0.0002
-0.0448
发现第一个,第二个以及第8个等于0。
先去掉这三个。
即a,b1,b7=0
%%%%第二步。
去掉上述三项再次拟合
%%你好好比较一下两步之间的mat矩阵的构造就知道怎么弄了。
data=[1.013.01.50.330;
1.419.03.00.366;
1.825.01.00.294;
2.210.02.50.476;
2.616.00.50.209;
3.022.02.00.451;
3.428.03.50.482];
x1=data(:
1);
x2=data(:
2);
x3=data(:
3);
y=data(:
4);
mat=[x2,x3,x1.*x2,x1.*x3,x2.*x3,x2.^2,x3.^2];%去掉a,b1,b7对应的项
%下面的A就是我们要的常数,分别对应于b2,b3,b4,b5,b6,b8,b9
A=mat\y
%%%%%%%%%第二步结束
得到的结果是:
A=
0.0149
0.1844
-0.0024
0.0510
-0.0024
-0.0002
-0.0448
上述几项,你觉得哪一项可以去掉,你仿上面第二步。
就可以了。
祝你成功。