乘余(残差)标准差(RMSE)越小越好(此处是残差的方差,还没有开方)(前两个越大越好,后两个越小越好)
regress多元(可通过变形而适用于任意函数),15/23顺序(y,x---结果是先常数项,与polyfit相反)y为列向量;x为矩阵,第一列为全1列(即对应于常数项),其余每一列对应于一个变量(或一个含变量的项),即x要配成目标函数的形式(常数项在最前)x中有多少列则结果的函数中就有多少项
首先要确定要拟合的函数形式,然后确定待定的系,从常数项开始排列,须构造x(每列对应于函数中的一项,剔除待定系数),拟合就是确定待定系数的过程(当然需先确定函数的型式)
重点:
regress(y,x)重点与难点是如何加工处理矩阵x。
y是函数值,一定是只有一列。
也即目标函数的形式是由矩阵X来确定
如s=a+b*x1+c*x2+d*x3+e*x1^2+f*x2*x3+g*x1^2,
一定有一个常数项,且必须放在最前面(即x的第一列为全1列)
X中的每一列对应于目标函数中的一项(目标函数有多少项则x中就有多少列)
X=[ones,x1,x2,x3,x1.^2,x2.*x3,x1.ˆ2](剔除待定系数的形式)
regress:
y/x顺序,矩阵X需要加工处理
nlinfit:
x/y顺序,X/Y就是原始的数据,不要做任何的加工。
(即regress靠矩阵X来确定目标函数的类型形式(所以X很复杂,要作很多处理)而nlinfit是靠程序来确定目标函数的类型形式(所以X就是原始数据,不要做任何处理)
例1
测16名成年女子的身高与腿长所得数据如下:
身高
143
145
146
147
149
150
153
154
155
156
157
158
159
160
162
164
腿长
88
85
88
91
92
93
93
95
96
98
97
96
98
99
100
102
配成y=a+b*x形式
>>x=[143145146147149150153154155156157158159160162164]';
>>y=[8885889192939395969897969899100102]';
>>plot(x,y,'r+')
>>z=x;
>>x=[ones(16,1),x];----常数项
>>[b,bint,r,rint,stats]=regress(y,x);---处结果与polyfit(x,y,1)相同
>>b,bint,stats
得结果:
b=bint=
-16.0730-33.70711.5612------每一行为一个区间
0.71940.60470.8340
stats=0.9282180.95310.0000
即
;
的置信区间为[-33.7017,1.5612],
的置信区间为[0.6047,0.834];r2=0.9282,F=180.9531,p=0.0。
p<0.05,可知回归模型y=-16.073+0.7194x成立.
>>[b,bint,r,rint,stats]=regress(Y,X,0.05);-----结果相同
>>[b,bint,r,rint,stats]=regress(Y,X,0.03);
>>polyfit(x,y,1)-----当为一元时(也只有一组数),则结果与regress是相同的,只是
命令中x,y要交换顺序,结果的系数排列顺序完全相反,x中不需要全1列。
ans=0.7194-16.0730--此题也可用polyfit求解,杀鸡用牛刀,脖子被切断。
3、残差分析,作残差图:
>>rcoplot(r,rint)
从残差图可以看出,除第二个数据外,其余数据的残差离零点均较近,且残差的置信区间均包含零点,这说明回归模型y=-16.073+0.7194x能较好的符合原始数据,而第二个数据可视为异常点(而剔除)
4、预测及作图:
>>plot(x,y,'r+')>>holdon
>>a=140:
165;>>b=b
(1)+b
(2)*a;
>>plot(a,b,'g')
例2
观测物体降落的距离s与时间t的关系,得到数据如下表,求s关于t的回归方程
t(s)
1/30
2/30
3/30
4/30
5/30
6/30
7/30
s(cm)
11.86
15.67
20.60
26.69
33.71
41.93
51.13
t(s)
8/30
9/30
10/30
11/30
12/30
13/30
14/30
s(cm)
61.49
72.90
85.44
99.08
113.77
129.54
146.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.294665.88969.1329
得回归模型为:
方法二----化为多元线性回归:
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,stats
b=9.1329
65.8896
489.2946
stats=1.0e+007*
0.00001.037800.0000
得回归模型为:
%结果与方法1相同
>>T=[ones(14,1),t,(t.^2)']%是否可行等验证...
polyfit------一元多次
regress----多元一次---其实通过技巧也可以多元多次
regress最通用的,万能的,表面上是多元一次,其实可以变为多元多次且任意函数,如x有n列(不含全1列),则表达式中就有n+1列(第一个为常数项,其他每项与x的列序相对应)此处的说法需进一步验证证……………………………
例3
设某商品的需求量与消费者的平均收入、商品价格的统计数据如下,建立回归模型,预测平均收入为1000、价格为6时的商品需求量.
需求量
100
75
80
70
50
65
90
100
110
60
收入
1000
600
1200
500
300
400
1300
1100
1300
300
价格
5
7
6
6
8
7
5
4
3
9
选择纯二次模型,即
----用户可以任意设计函数
>>x1=[10006001200500300400130011001300300];
>>x2=[5766875439];
>>y=[10075807050659010011060]';
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.970240.66560.000520.5771
故回归模型为:
剩余标准差为4.5362,说明此回归模型的显著性较好.
--------(此题还可以用rstool(X,Y)命令求解,详见回归问题详解)
>>X=[ones(10,1)x1'x2'(x1.^2)'(x2.^2)',sin(x1.*x2)',(x1.*exp(x2))'];
>>[b,bint,r,rint,stats]=regress(y,X);
>>b,stats
(个人2011年认为,regress只能用于函数中的每一项只能有一个待定系数的情况,不能用于aebx等的情况)
regress(y,x)
----re是y/x逆置的
---y是列向量
---须确定目标函数的形式
---x须构造(通过构造来反映目标函数)
---x中的每一列与目标函数的一项对应(剔除待定系数)
----首项为常数项(x的第一列为全1)
----有函数有n项(待定系数),则x就有n列
----regress只能解决每项只有一个待定系数的情况且必须有常数项的情况(且每项只有一个待定系数,即项数与待定系数数目相同)
***其重(难、关键)点:
列向量、构造矩阵(X):
目标函数中的每项与X中的一列对应。
(由X来确定目标函数的类型/形式)
三、非线性回归(拟合)
使用格式:
beta=nlinfit(x,y,‘程序名’,beta0)[beta,r,J]=nlinfit(X,y,fun,beta0)
X给定的自变量数据,Y给定的因变量数据,fun要拟合的函数模型(句柄函数或者内联函数形式),beta0函数模型中待定系数估计初值(即程序的初始实参)beta返回拟合后的待定系数其中beta为估计出的回归系数;r为残差;J为Jacobian矩阵
输入数据x、y分别为n*m矩阵和n维列向量,对一元非线性回归,x为n维列向量。
’model’为是事先用m-文件定义的非线性函数;beta0为回归系数的初值
可以拟合成任意函数。
最通用的,万能的命令
x,y顺序,x不需要任何加工,直接用原始数据。
(也不需要全1列)---所编的程序一定是两个形参(待定系数/向量,自变量/矩阵:
每一列为一个自变量)
结果要看残差的大小和是否有警告信息,如有警告则换一个b0初始向量再重新计算。
本程序中也可能要用.*./.^如结果中有警告信息,则必须多次换初值来试算难点是编程序与初值
nlinfit多元任意函数,(自己任意设计函数,再求待定系数)顺序([b,r,j]=nlinfit(x,y,’…’,b0)y为列向量;x为矩阵,无需加全1列,x,y就是原始的数据点,(x/y正顺序,所以x不要加全1列)需预先编程(两个参数,系数向量,各变量的矩阵/每列为一个变量)
存在的问题:
不同的beta0,则会产生不同的结果,如何给待定系数的初值以及如何分析结果的好坏,如出现警告信息,则换一个待定系数试一试。
因为拟合本来就是近似的,可能有多个结果。
1:
重点(难点)是预先编程序(即确定目标函数的形式,而regress的目标函数由x矩阵来确定,其重难点为构造矩阵a)
2:
x/y顺序—列向量----x/y是原始数据,不要做任何修改
3:
编程:
一定两个形参(beta,x)a=beta
(1);b=beta
(2);c=beta(3);…x1=x(:
1);x2=x(:
2);x3=x(:
3);即每一列为一个自变量
4:
regress/nlinfit都是列向量
5:
regress:
有n项(n个待定系数),x就有n列;nlinfit:
有m个变量则x就有m列
例1
已知数据:
x1=[0.5,0.4,0.3,0.2,0.1]; x2=[0.3,0.5,0.2,0.4,0.6];
x3=[1.8,1.4,1.0,1.4,1.8];y=[0.785,0.703,0.583,0.571,0.126]’;且y与x1,x2,x3关系为多元非线性关系(只与x2,x3相关)为:
y=a+b*x2+c*x3+d*(x2.^2)+e*(x3.^2)—此函数是由用户根据图形的形状等所配的曲线,即自己选定函数类型求非线性回归系数a,b,c,d,e。
(1)对回归模型建立M文件model.m如下:
functionyy=myfun(beta,x)%一定是两个参数:
系数和自变量---一个向量/一个矩阵
a=beta
(1)
b=beta
(2)
c=beta(3)
x1=x(:
1);%系数是数组,b
(1),b
(2),…b(n)依次代表系数1,系数2,……系数n
x2=x(:
2);%自变量x是一个矩阵,它的每一列分别代表一个变量,有n列就可以最多n
x3=x(:
3);
yy=beta
(1)+beta
(2)*x2+beta(3)*x3+beta(4)*(x2.^2)+beta(5)*(x3.^2);
(b(i)与待定系数的顺序关系可以任意排列,并不是一定常数项在最前,只是结果与自己指定的相对应)(x一定是一列对应一个变量,不能x1=x
(1),x2=x
(2),x3=x(3)……)
(2)主程序如下:
x=[0.5,0.4,0.3,0.2,0.1;0.3,0.5,0.2,0.4,0.6;1.8,1.4,1.0,1.4,1.8]';-----每一列为一个变量
y=[0.785,0.703,0.583,0.571,0.126]';
beta0=[1,1,1,1,1,1]';%有多少个待定系数,就给多少个初始值。
[beta,r,j]=nlinfit(x,y,@myfun,beta0)
beta=-0.44205.51110.3837-8.1734-0.1340
此题也可用regress来求解,但结果是不一样的
>>x1=[0.5,0.4,0.3,0.2,0.1];
>>x2=[0.3,0.5,0.2,0.4,0.6];
>>x3=[1.8,1.4,1.0,1.4,1.8];
>>y=[0.785,0.703,0.583,0.571,0.126]';
>>n=length(x1);
>>x=[ones(n,1),x2',x3',(x2.^2)',(x3.^2)'];
>>[b,bint,r,rint,stats]=regress(y,x);
>>b,stats
b=
-3.3844
-1.8450
6.5137
0
-2.1773
stats=0.78591.22320.56740.0557
2011年题目改为:
y=a+b*x1+c*x2+d*(x3.^2)+e*(x1.^2)+f*sin(x2)
求非线性回归系数a,b,c,d,e,f
functionf=fxxnh(beta,x)%所编的程序一定是两个形参,第一个为待定系数向量,第二个为自变量矩阵
a=beta
(1);
b=beta
(2);
c=beta(3);
d=beta(4);
e=beta(5);
f=beta(6);%系数向量中的一个元素代表一个待定系数
x1=x(:
1);%自变量矩阵每一列代表一个自变量
x2=x(:
2);
x3=x(:
3);
f=a+b.*x1+c.*x2+d.*(x3.^2)+e.*(x1.^2)+f.*sin(x2);
但计算出现了问题
例2
混凝土的抗压强度随养护时间的延长而增加,现将一批混凝土作成12个试块,记录了养护日期(日)及抗压强度y(kg/cm2)的数据:
养护时间:
x=[234579121417212856]抗压强度:
y=[35+r42+r47+r53+r59+r65+r68+r73+r76+r82+r86+r99+r]建立非线性回归模型,对得到的模型和系数进行检验。
注明:
此题中的+r代表加上一个[-0.5,0.5]之间的随机数模型为:
y=a+k1*exp(m*x)+k2*exp(-m*x);------有四个待定系数
Matlab程序:
x=[234579121417212856];
r=rand(1,12)-0.5;
y1=[354247535965687376828699];
y=y1+r;
myfunc=inline('beta
(1)+beta
(2)*exp(beta(4)*x)+beta(3)*exp(-beta(4)*x)','beta','x');-----
beta=nlinfit(x,y,myfunc,[0.50.50.50.5]);---初值为0.2也可以,如为1则不行,则试着换系数初值----此处为一元,x’,y’行/列向量都可以
a=beta
(1),k1=beta
(2),k2=beta(3),m=beta(4)%testthemodel
xx=min(x):
max(x);-----2:
56
yy=a+k1*exp(m*xx)+k2*exp(-m*xx);
plot(x,y,'o',xx,yy,'r')
结果:
a=87.5244
k1=0.0269
k2=-63.4591
m=0.1083
图形:
此题不能用regress求解,因为有些式子中含有两个待定系数
例3
出钢时所用的盛钢水的钢包,由于钢水对耐火材料的侵蚀,容积不断增大.我们希望知道使用次数与增大的容积之间的关系.对一钢包作试验,测得的数据列于下表:
使用次数
增大容积
使用次数
增大容积
2
3
4
5
6
7
8
9
6.42
8.20
9.58
9.50
9.70
10.00
9.93
9.99
10
11
12
13
14
15
16
10.49
10.59
10.60
10.80
10.60
10.90
10.76
对将要拟合的非线性模型y=aeb/x,(如再加y=c*sin(x)+aeb/x)
建立m-文件volum.m如下:
functionyhat=volum(beta,x)
yhat=beta
(1)*exp(beta
(2)./x);或
functionf=zhang1(beta,x)
a=beta
(1);
b=beta
(2);
f=a*exp(b./x);---
2、输入数据:
>>x=2:
16;
>>y=[6.428.209.589.59.7109.939.9910.4910.5910.6010.8010.6010.9010.76];
>>beta0=[82]';----初值[1,1]也可以
3、求回归系数:
>>[beta,r,J]=nlinfit(x',y','volum',beta0);%beta0初值为列/行向量都可以,还是为列吧。
>>beta
beta=
11.6037
-1.0641
即得回归模型为:
4、预测及作图:
>>[YY,delta]=nlpredci('volum',x',beta,r,J)
>>plot(x,y,'k+',x,YY,'r')
或>>plot(x,y,'ro')
>>holdon
>>xx=2:
0.05:
16;
>>yy=beta
(1)*exp(beta
(2)./xx);
>>plot(xx,yy,'g')
又或>>plot(x,y,'r