加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MATLAB 线性回归与非线性回归以及权重的使用Weight

(2014-07-05 10:30:58)
标签:

matlab回归

线性回归

非线性回归

回归权重

regress

分类: 科研
今天讲解两个MATLAB回归命令 regressnlinfit

regress 适用于 线性 的一元 和 多元回归
nlinfit   可用于 线性、非线性 一元 和 多元回归

命令格式: 1、[b,bint,r,rint,stats]=regress(Y,X)
                   2、[beta,r,J]=nlinfit(x,y,'myfun',beta0,'Weights',w)

解释: 1、b      : 回归系数
                 bint : 回归系数的区间估计,默认 95%。其他区间可以在1式的X后加一个数,如0.05,0.01等
                 r       :  残差
                 rint   : 置信区间
                 stats  :检验回归模型的统计量
            
            2、beta : 回归系数
                 r         :残差
                 J        : 雅可比矩阵

实例:考虑如下一个回归模型

                                         Y=a+b*(z1-6)+c*(z2+d)^2+e*(z3+d)    ----------------  ( 1 )

待定系数: a,b,c,d,e           而 Y,z1,z2,z3 都是已知的观测值

对于(1)式来说,实际上他不是一个线性模型,因为参数 c和d,e和d 都有耦合。那么nlinfit自然可以做,但是想用regress做怎么办呢,简单,给d先赋值即可,就变成了线性的,对吧。

方法一:

先用regress来做。
d=1;                                           % 先给d一个值,使(1)变为线性 
x1=ones(length(Y),1);                 % X矩阵的第一列,因为有a常数项,所以第一列是1
x2=z1-6;                                       % 为了不混淆,我(1)式里用了z来代表自变量
x3=(z2+d)^2;
x4=z3+d;
X=[x1,x2,x3,x4];                          % 定义X,注意 x1到x4 都必须是列向量
Y=Y(:);                                            %将Y变为列向量
[b,bint,r,rint,stats]=regress(Y,X);
xigema=std(r);                             % 这个是模型的残差方差,即残差是正态分布,均值为0,标准差为xigema
disp(b);                                           %显示系数,依次是 a b c e
disp(xigema);                                  % 显示标准差

那先在其实不完全是回归好了,因为你的d是指定的,所以不是个完整的最好系数。那怎么办呢?简单,判断一个回归好不好就看你的残差小不小,也就是说上面的那个xigema如果很大,那就不好了,表明你回归出来的跟观测值相差太远。因此,基于这个原理,我们可以用 for 循环将上面的代码中的 d 取一个范围,然后每个d 都有一个xigema,哪个xigema小,哪个就是对应的 d 值的系数。然后用这个d 去回归 a b c e 懂了吧

回归出来以后,如果想看一下方程的图,可以把系数代入(1)式,然后产生一些列点。注意,这时候方程后面要加一项,就是残差,具体如下

                                          Y=a+b*(z1-6)+c*(z2+d)^2+e*(z3+d)+eps    ----------------  ( 2 )

其中,eps 在 MATLAB里生成为   eps=xigema*randn(1);   xigema就是上面回归出来的标准差

方法二:

用nlinfit来做。首先要自己定义函数文件
Y=myfun(beta,X)
a=beta(1);b=beta(2);c=beta(3);d=beta(4);e=beta(5);        % 将系数都存到beta里
z1=X(:,1);z2=X(:,2);z3=X(:,3);
Y=a+b*(z1-6)+c*(z2+d).^2+e*(z3+d);                                %一定要注意是向量运算,改加 . 的一定加上

把这个函数保存为单独的.m文件

然后,主程序是

Y=Y(:);
x=[z1,z2,z3];                       % z还是列向量
beta0=[0.4;0.3;-0.002;6];     % 这里是定义初始尝试的值
w=ones(length(A),1);        % 定义一个一致权重,即所有的观测值重要性一样
w(4)=0.5;                            % 这个表示将第4个观测值的权重减为其他的一半
[beta,r,J]=nlinfit(x,Y,'myfun',beta0,'Weights',w);  % 一致权重可以不写 'Weights', w
xigema=std(r) ;
disp(beta);
disp(xigema);

beta含有系数 a b c d e, 残差 还是正态分布,均值为0,方差为xigema
这里需要特别说明的就是这个权重。 如果我们的观测值都比较好,就是没有很偏离的现象,那么我们认为每个观测值对回归结果的贡献都是一样的。那么我们就定义w 是一个1向量,长度和Y一样,或者 将 命令中的 'Weights', w 去掉即可。但是,正如上面w(4)描述,我认为第四个点有点偏离,不是那么重要,可以将他的权重下调,使他对结果的影响减小。

可以肯定,定义不同的w,结果是不一样的。权重的意义在于当我们的观测值中有一些很奇怪的点的时候,比如说由于记录数据时候的失误啊,仪器当时失效啊造成的,我们就可以剔除。当然,剔除就相当于把这个点的权重设置为0. 那么有时候我们不想剔除,就想把他的重要性降低一点点,就可以用权重向量来做。方便吧。

MATLAB回归 线性回归 非线性回归 回归权重 regress


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有