最近学了不少回归分析的知识,用到了几个常用的Matlab命令,写在这里做个总结。
回归分析,就是研究几种变量之间的关系。如果你也很喜欢分析数据,这种技巧是基本的一项。(PS:高级的是机器学习。)
用于一元及多元线性回归,本质上是最小二乘法。在Matlab 2014a中,输入help regress ,会弹出和regress的相关信息,一一整理。
调用格式:
B = regress(Y,X)[B,BINT] = regress(Y,X)[B,BINT,R] = regress(Y,X)[B,BINT,R,RINT] = regress(Y,X)B,BINT,R,RINT,STATS] = regress(Y,X)[...] = regress(Y,X,ALPHA)
参数解释:
B:回归系数,是个向量(“the vector B of regression coefficients in the linear model Y = X*B”)。BINT:回归系数的区间估计(“a matrix BINT of 95% confidence intervals for B”)。R:残差( “a vector R of residuals”)。RINT:置信区间(“a matrix RINT of intervals that can be used to diagnose outliers”)。STATS:用于检验回归模型的统计量。有4个数值:判定系数R^2,F统计量观测值,检验的p的值,误差方差的估计。ALPHA:显著性水平(缺少时为默认值0.05)。
目标函数:y=Ax1^2+Bx1^2+Cx1+Dx2+Ex1*x2+F (这是一个二次函数,两个变量,大写的字母是常数)
[cpp] view plain copy print ? %导入数据 y=[7613.51 7850.91 8381.86 9142.81 10813.6 8631.43 8124.94 9429.79 10230.81 ... 10163.61 9737.56 8561.06 7781.82 7110.97]'; x1=[7666 7704 8148 8571 8679 7704 6471 5870 5289 3815 3335 2927 2758 2591]'; x2=[16.22 16.85 17.93 17.28 17.23 17 19 18.22 16.3 13.37 11.62 10.36 9.83 9.25]'; X=[ones(size(y)) x1.^2 x2.^2 x1 x2 x1.*x2]; %开始分析 [b,bint,r,rint,stats] = regress(y,X);
结果截图:
b为对应的参数 b(1)为F(最后那个常数项) ,b(2)为A(第一个参数),b(3)为B,b(4)为C,b(4)为D,b(5)为E。bint为b的95%置信区间。
比较重要的stats分析:
stats的第三个参数为F检测的P值,p值很小(P<0.001),说明拟合模型有效。(这里的分析技巧,以后有时间的话,会专门总结。)
(注:*号是乘法的意思,*前面的数是矩阵的系数。)
下面数据可视化看下。
[cpp] view plain copy print ? %以下绘图查看拟合效果 <pre name="code" class="cpp"> scatter3(x1,x2,y,'filled') %scatter可用于画散点图
截图:
后续的分析如下:
[cpp] view plain copy print ? %拟合,三维视图显示 hold on %在刚刚那副散点图上接着画 x1fit = min(x1):100:max(x1); %设置x1的数据间隔 x2fit = min(x2):1:max(x2); %设置x2的数据间隔 [X1FIT,X2FIT] = meshgrid(x1fit,x2fit); %生成一个二维网格平面,也可以说生成X1FIT,X2FIT的坐标 YFIT=b(1)+b(2)*X1FIT.^2+b(3)*X2FIT.^2+b(4)*X1FIT ... +b(5)*X2FIT+b(6)*X1FIT.*X2FIT; %代入已经求得的参数,拟合函数式 mesh(X1FIT,X2FIT,YFIT) %X1FIT,X2FIT是网格坐标矩阵,YFIT是网格点上的高度矩阵 view(10,10) %改变角度观看已存在的三维图,第一个10表示方位角,第二个表示俯视角。 %方位角相当于球坐标中的经度,俯视角相当于球坐标中的纬度 xlabel('x1') %设置X轴的名称 ylabel('x2') %设置y轴的名称 zlabel('y') %设置z轴的名称</span>
最终结果截图:
预测国民收入和钢材消耗量的的代码:
x=[1097 1284 1502 1394 1303 1555 1917 2051 2111 2286 2311 2003 2435 2625 2948 3155 3372]; y=[698 872 988 807 738 1025 1316 1539 1561 1765 1762 1960 1902 2013 2446 2736 2825]; X=[ones(size(x')),x'],pause [b,bint,r,rint,stats]=regress(y',X,0.05),pause rcoplot(r,rint)
x1(1)=3372; for i=1:5 x1(i+1)=1.045*x1(i); y1(i+1)=-460.5282+0.9840*x1(i+1); end x1,y1
参考文献:
http://wenku.baidu.com/link?url=HkCnQVFa7s0TR1_I7GOrH_jBitSG3Cgg8rDxhn-1ac3rsGhbCWCe2BYKVUDL6jh2n84qv_gdn2ZHBj1CoGHhLNrR84Fc8hvmnVT8aF8ybCu