回归分析
根据回归方法中因变量的个数和回归函数的类型(线性或非线性),可将回归方法分为一元线性回归、一元非线性回归和多元回归。
简单粗暴理解:可以理解为找到一个从特征空间X到输出空间Y的最优的线性映射函数的过程。
(关于定义个人认为没必要去纠结,只要知道这个东西和会用就可以了)
重点说明:关于线性与非线性回归,很多知识点我总结在了代码里面,每段代码开头会有很多说明,参数说明和知识点,建议看的时候多看看代码开头的说明
一元线性回归
对一元线性线性回归,简单粗暴理解就是给出一堆点,(x1,y1),(x2,y2),…(xn,yn),然后根据一元线性回归方程(固定的)求解β0,β1的过程,一元线性回归方程跟高中学的基本一样,只不过之前要人算,现在可以用matlab算。
还不懂的看案例(MATLAB数学建模方法与实践(第3版)第48页):
这是一个经典的一元回归问题,根据所给定的点,求解出回归系数的过程,下面给代码,重点看代码里面的知识点和参数说明,在每一段正式代码开头。
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
% 回归分析就是处理变量之间的相关关系的一种数学方法。其解决问题的大致方法、步骤如下:
% (1)收集一组包含因变量和自变量的数据;
% (2)选定因变量和自变量之间的模型,即一个数学式子,利用数据按照最小二乘准则计算模型中的系数;
% (3)利用统计分析方法对不同的模型进行比较,找出与数据拟合得最好的模型;
% (4)判断得到的模型是否适合于这组数据;
% (5)利用模型对因变量作出预测或解释。
%
% 一元线性回归方程:
% y = β0 + β1*x; β为回归系数
%
%
% matlab模块说明:
% (1)plot(x,y,'r*');
% (2)n = length(x),X=[ones(n,1),x'];
% (3)Y = y';
% (4)[b,bint,r,rint,s]=regress(Y,X,alpha);
% 参数说明:plot(x,y,'r*'):绘制散点图
% X:由给定的x值决定,(X必须为列矩阵,所以如果x是行矩阵的话必须通过x'转置为列向量)
% Y:由给定的y值决定,(Y必须为列矩阵,所以如果y是行矩阵的话必须通过y'转置为列向量)
% alpha:显著性水平(缺省时默认0.05)
% b:相关系数的集合,一元线性回归,b有两个值,b(1,1) = β0,b(2,1) = β1
% bint: 回归系数的区间估计
% r :残差
% rint :残差置信区间
% s :用于检验回归模型的统计量,有四个数值:相关系数R^2、F值、与F对应的概率p,误差方差。
% 注意:s通常用于做模型的检验,1.关系数R^2越接近1,说明回归方程越显著;
% 2.p<alpha时,拒绝H0,回归模型成立
% 3.F > F1-alpha(k,n-k-1)【通过该函数finv(1-,1, n-2)得到】时拒绝H0,F越大,说明回归方程越显著,其中F1-alpha(k,n-k-1)的值可查F分布表,或直接用MATLAB命令finv(1-,1, n-2)计算得到
% (4)残差分析:rcoplot(r,rint)
% 绘制出的图,标红的点为异常数据,可以去掉后再重新做计算一元线性回归分析
%
%
% matlab实现:
% (1)输入:
% x(1*n)矩阵存储x坐标
% y(1*n)矩阵存储y坐标
% (2)输出:
% [b,bint,r,rint,s]=regress(Y,X,alpha);里面的所有参数,回归系数b构成一元回归模型
% 残差图分析
%
% 重点:如果出现错误;"错误使用 horzcat串联的矩阵的维度不一致"可能是X,Y那里的行矩阵和列矩阵的转化出现问题
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
clc
% 数据的存储
% x = [3.5 5.3 5.1 5.8 4.2 6.0 6.8 5.5 3.1 7.2 4.5 4.9 8.0 6.5 6.6 3.7 6.2 7.0 4.0 4.5 5.9 5.6 4.8 3.9];
% y = [33.2 40.3 38.7 46.8 41.4 37.5 39.0 40.7 30.1 52.9 38.2 31.8 43.3 44.1 42.5 33.6 34.2 48.0 38.0 35.9 40.4 36.8 45.2 35.1];
x=[23.80,27.60,31.60,32.40,33.70,34.90,43.20,52.80,63.80,73.40];
y=[41.4,51.8,61.70,67.90,68.70,77.50,95.90,137.40,155.0,175.0];
% 绘制散点图
% plot(x,y,'r*');
% 数据的长度
n=length(x);
% X,Y制作
X=[ones(n,1),x'];
Y = y';
% 线性分析
[b,bint,r,rint,s]=regress(Y,X,0.05);
b
bint
% r
% rint
s
% 残差分析
figure;
rcoplot(r,rint);
fprintf('拟合的函数为:f(x) = %d + %d*x\n',b(1,1),b(2,1));
figure
f = @(x) b(1,1) + b(2,1) * x;
plot(x,y,'r*');
hold on;
ezplot(f, [0, 90]); % 画出函数图像
title('拟合的曲线');
运行结果:
关于运行结果中的参数,b,bint,r,rint,s等在上面代码开头的参数说明那里,这个很重要,建议多看一下。
多元线性回归
在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。对于多元线性回归,相对于一元线性回归只不过是回归系数变多了,自变量变多了,其他基本差不多。同样的道理,给出一堆点,不过这些点对应的自变量比较多(两个以上),求解偏回归系数的过程。
案例(MATLAB数学建模方法与实践(第3版)第52页):
上面第二张图为书里面的解题思路(要是嫌烦可以不看),下面给代码:
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
% 回归分析就是处理变量之间的相关关系的一种数学方法。其解决问题的大致方法、步骤如下:
% (1)收集一组包含因变量和自变量的数据;
% (2)通过绘制散点图,判断是否符合线性回归,决定用哪种线性回归
% (3)选定因变量和自变量之间的模型,即一个数学式子,利用数据按照最小二乘准则计算模型中的系数;
% (4)利用统计分析方法对不同的模型进行比较,找出与数据拟合得最好的模型;
% (5)判断得到的模型是否适合于这组数据;
% (5)利用模型对因变量作出预测或解释。
%
% 多元线性回归方程:y=b0+b1X1+b2X2+…+bnXn
% b0为常数项
% b1,b2,b3,…bn称为y对应于x1,x2,x3,…xn的偏回归系数
%
%
% matlab模块说明:
% (1)subplot(1,3,1),plot(x1,y,'g*'),
% subplot(1,3,2),plot(x2,y,'k+'),
% subplot(1,3,3),plot(x3,y,'ro'),
% ......
% (2)n = length(x1),X=[ones(n,1),x1',x2',x3',...];
% (3)Y = y';
% (4)[b,bint,r,rint,s]=regress(Y,X,alpha);
% 参数说明:subplot(1,3,1),plot(x1,y,'g*'):绘制散点图
% X:由给定的x值决定,(X必须为列矩阵,所以如果x是行矩阵的话必须通过x'转置为列向量)
% Y:由给定的y值决定,(Y必须为列矩阵,所以如果y是行矩阵的话必须通过y'转置为列向量)
% alpha:显著性水平(缺省时默认0.05)
% b:相关系数的集合,一元线性回归,b有两个值,b(1,1) = β0,b(2,1) = β1
% bint: 回归系数的区间估计
% r :残差
% rint :残差置信区间
% s :用于检验回归模型的统计量,有四个数值:相关系数R^2、F值、与F对应的概率p,误差方差。
% 注意:s通常用于做模型的检验,1.关系数R^2越接近1,说明回归方程越显著;
% 2.p<alpha时,拒绝H0,回归模型成立
% 3.F > F1-alpha(k,n-k-1)【通过该函数finv(1-,1, n-2)得到】时拒绝H0,F越大,说明回归方程越显著,其中F1-alpha(k,n-k-1)的值可查F分布表,或直接用MATLAB命令finv(1-,1, n-2)计算得到
% (4)残差分析:rcoplot(r,rint)
% 绘制出的图,标红的点为异常数据,可以去掉后再重新做计算一元线性回归分析
%
%
% matlab实现:
% (1)输入:
% x1(1*n)矩阵存储x1坐标
% x2(1*n)矩阵存储x2坐标
% ......
% y1(1*n)矩阵存储y坐标
% y2(1*n)矩阵存储y2坐标
% ......
% (2)输出:
% [b,bint,r,rint,s]=regress(Y,X,alpha);里面的所有参数,回归系数b构成多元回归模型
% 残差图分析
%
% 重点:如果出现错误;"错误使用 horzcat串联的矩阵的维度不一致"可能是X,Y那里的行矩阵和列矩阵的转化出现问题
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
clc
% 数据的存储
x1 = [3.5 5.3 5.1 5.8 4.2 6.0 6.8 5.5 3.1 7.2 4.5 4.9 8.0 6.5 6.6 3.7 6.2 7.0 4.0 4.5 5.9 5.6 4.8 3.9];
x2 = [9 20 18 33 31 13 25 30 5 47 25 11 23 35 39 21 7 40 35 23 33 27 34 15];
x3 = [6.1 6.4 7.4 6.7 7.5 5.9 6.0 4.0 5.8 8.3 5.0 6.4 7.6 7.0 5.0 4.4 5.5 7.0 6.0 3.5 4.9 4.3 8.0 5.8];
y = [33.2 40.3 38.7 46.8 41.4 37.5 39.0 40.7 30.1 52.9 38.2 31.8 43.3 44.1 42.5 33.6 34.2 48.0 38.0 35.9 40.4 36.8 45.2 35.1];
% 绘制散点图
subplot(1,3,1);plot(x1,y,'g*');
subplot(1,3,2);plot(x2,y,'k+');
subplot(1,3,3);plot(x3,y,'ro');
% 数据的长度
n=length(x1);
% X,Y制作
X=[ones(n,1),x1',x2',x3'];
Y = y';
% 线性分析
[b,bint,r,rint,s]=regress(Y,X,0.05);
b
bint
% r
% rint
s
% 残差分析
rcoplot(r,rint);
运行结果:
关于运行结果中的参数,b,bint,r,rint,s等在上面代码开头的参数说明那里,这个很重要,建议多看一下。
一元非线性回归
非线性回归是回归函数关于未知回归系数具有非线性结构的回归。简单理解就是非线性回归就是曲线回归。
在做非线性回回归时,一般要先确定该非线性回归模型后在做非线性回归;解题思路是先将所给的数据点通过matlab绘图的方式画出来,再看看画出来的散点图比较符合哪个非线性回归模型就选择那个模型,最后再做非线性回归分析。
关于模型,这里给大家整理了一些:
其他的非线性回归模型可以自己网上搜一下。
案例(MATLAB数学建模方法与实践(第3版)第50页):
代码:
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
% matlab模块介绍:
% [beta,r]=nlinfit(x,y,'fun1',beta0);
% beta即所要求的相关系数,
% r为残差
% x为数据的x轴坐标,n*m的矩阵存储,当x有多个时(x1,x2,x3...),每组x为一列,x1为1列,x2为第二列,x3为第三列...组成n*m的矩阵
% y为数据的y轴坐标,以列矩阵的方式存储
% fun1为函数模型的表达式,一般要先确定该模型后在做非线性回回归,该函数一般用单独的.m文件存放,或者自己定义
% beta0为多个相关系数初始值,该系数需要自己猜测,再从初值一步步迭代算出最终系数
%
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
clc
% 数据:
x=[1.5, 4.5, 7.5,10.5,13.5,16.5,19.5,22.5,25.5]';
y=[7.0,4.8,3.6,3.1,2.7,2.5,2.4,2.3,2.2]';
%% 对数模型拟合:f(x) = b(1) + b(2)*log(x)
myfunc = inline('beta(1)+beta(2)*log(x)','beta','x');%三个参数分别为:函数模型(注意需要使用点除和点乘),待定系数,自变量
beta0 = [0.2,0.2]';%待定系数的预估值,可固定不变
% beta为求得的相关系数
beta = nlinfit(x,y,myfunc,beta0);
figure;
plot(x,y,'.');
hold on%保证同时显示
x = 0:0.01:8;
y = beta(1)+beta(2)*log(x);
plot(x,y);
title('对数模型拟合');
%% 指数模型拟合:f(x) = b1*x^b2;
% myfunc = inline('beta(1)*x.^beta(2)','beta','x');%三个参数分别为:函数模型(注意需要使用点除和点乘),待定系数,自变量
%
% beta0 = [0.2,0.2]';%待定系数的预估值,可固定不变
%
% % beta为求得的相关系数
% beta = nlinfit(x,y,myfunc,beta0);
%
% figure;
% plot(x,y,'.');
% hold on%保证同时显示
%
% x = 0:0.01:8;
% y = beta(1)*x.^beta(2);
%
% plot(x,y);
% title('指数模型拟合');
上面两种模型只能单独运行,运行一个得注释另外一个。
运行结果:
关于运行结果中的参数在上面代码开头的参数说明那里,这个很重要,建议多看一下。
以上就是全部内容,如有错误的地方,望大家批评指正。