matlab回归法建模详解 | 《matlab数学建模方法与实践(第三版)》学习笔记

  • Post author:
  • Post category:其他



目录


一元线性回归


一、采用最小二乘回归


二、采用LinearModel.fit函数进行线性回归


三、采用regress函数进行回归


一元非线性回归


一、对数形式


二、指数形式


多元回归


逐步回归


Logistic回归


根据回归方法中因变量个数和回归函数类型(线性和非线性)进行分类:


一元线性回归、一元非线性回归、多元回归

两种特殊的回归方式:


逐步回归

:在回归过程中可以调整变量数量的回归方法。


Logistic回归

:以指数结构函数作为回归模型的回归方法。



一元线性回归


首先从图形判断数据呈线性还是非线性。

代码如下:

%% 一元线性回归实例
%% 输入数据
clc, clear all, close all
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];	
% 绘制散点图,判断是否具有线性关系
figure
plot(x,y,'r*')                         %作散点图
xlabel('x(职工工资总额)','fontsize', 12)           %横坐标名
ylabel('y(商品零售总额)', 'fontsize',12)           %纵坐标名
set(gca,'linewidth',2);

运行结果:可以看出大近似呈线性。

一、采用最小二乘回归

最小二乘法原理:

最小二乘法的目的是通过将样本点拟合为一条直线,进而进行一定的分析和预测,假设这些样本点坐标为(

xi,yi

),红线的长度就是点到直线的距离

di

,由于距离有正有负,我们把计算对象变为距离的平方

di^2

(平方和最小即距离和最小),假设直线方程为y=bx+a,利用偏导数求极值,最后的计算公式为:

a=\bar{y}-b\bar{x}

b=\frac{\sum_{i=1}^{n}(x_{i}-\bar{x})(y_{i}-\bar{y})))}{\sum_{i=1}^{n}(x_{i}-\bar{x})^{2}))}

代码如下:

% 采用最小二乘拟合
Lxx=sum((x-mean(x)).^2);
Lxy=sum((x-mean(x)).*(y-mean(y)));
b1=Lxy/Lxx;
b0=mean(y)-b1*mean(x);
y1=b1*x+b0;
hold on % 添加新绘图时保留当前绘图
plot(x, y1,'linewidth',2);

运行结果:

二、采用LinearModel.fit函数进行线性回归

代码如下:

%% 采用LinearModel.fit函数进行回归
m2 = LinearModel.fit(x,y) % 创建线性回归模型,X、Y是对应数据

运行结果:

意义及用法:


  • Estimate

    –  模型中每个对应项的


    系数估计值



  • SE

    – 系数的


    标准误差



  • tStat

    – 每个系数的


    t 统计量,


    用于基于对应系数不为零的备择假设来检验对应系数为零的原假设(给出了模型中的其他预测变量)。

    tStat = Estimate/SE

  • pValue

    – 假设检验的


    t 统计量的 p 值


    ,该假设检验验证对应系数是否等于零。例如,假设x2 的 t 统计量的 p 值大于 0.05,因此在给定模型中其他项的情况下,该项在 5% 显著性水平上不显著。

  • Error degrees of freedom n-p –

    误差自由度


    其中 n 是观测值数目,p 是模型中系数的数目,包括截距。例如,该模型有四个预测变量,因此 Error degrees of freedom 为 93–4 = 89。

  • Root mean squared error –

    均方根误差







    观测值与真值偏差的平方和观测次数n比值的平方根


    ,在实际测量中,观测次数n总是有限的,真值只能用最可信赖(最佳)值来代替。方根误差对一组测量中的特大或特小误差反映非常敏感,所以,

    均方根误差能够很好地反映出测量的精密度


  • R^2 –

    的值


    越接近1,变量的线性相关性越强


    ,说明模型有效。

  • F统计量

    – 如果满足

    F_{1-\alpha }(1,n-2)<F

    ,则认为


    变量y与x显著的有线性关系


    ,其中
    F_{1-\alpha }(1,n-2)
    的值可查F分布表,MATLAB命令为


    finv(1-alpha,1,n-2)


  • p值 –

    p<alpha


    (alpha为显著水平)表示


    模型可用


    ,三个值可以相互印证。



注:t统计量用来模型中关于参数的单个假设进行检验的一种统计量。一般的t统计量写成t=(估计值-假设值)/标准误,当假设值为0时,便得到通常的t统计量。我们一般用t统计量针对单侧或双侧对立假设做检验。例如:假设H0:a=1,H1:a>1,我们计算t统计量,如果t>c,我们就拒绝H0,接受H1,此时我们便说在适当的显著性水平上,a统计显著地大于1.


补充:模型的其他统计量如下:


  • Number of observations

    – 没有任何 NaN 值的行数。例如,Number of observations 为 93,因为 X 和 MPG 中的行数为 100,但 MPG 数据向量有六个 NaN 值,且 Horsepower 数据向量中有另一不同观测值(即不同的行)也为 NaN 值。

  • R-squared 和 Adjusted R-squared

    – 分别为决定系数和调整决定系数。例如,R-squared 值表明,该模型解释了响应变量 MPG 中大约 75% 的变异。

三、采用regress函数进行回归

代码如下:

%% 采用regress函数进行回归
Y=y';
X=[ones(size(x,2),1),x']; 
% size(x,2)获取x中第二维度的长度
% ones生成全部为1的数组

[b, bint, r, rint, s] = regress(Y, X)
% regress(Y, X,alpha)alpha为显著水平,默认0.05
% 多元线性回归
% [输出 置信区间 残差 残差的置信区间 stats]
% stats其中包含R^2统计量、F统计量及其p值(F(1,n-2)分布大于F的概率)以及剩余方差s^2。
% 矩阵X必须包含一个由 1 组成的列,以便软件正确计算模型统计量。
% 残差:实际观察值与估计值(拟合值)之间的差
% 置信区间:误差范围

运行结果:

意义及用法:


  • R^2

    的值


    越接近1,变量的线性相关性越强


    ,说明模型有效。
  • 如果满足

    F_{1-\alpha }(1,n-2)<F

    ,则认为


    变量y与x显著的有线性关系


    ,其中
    F_{1-\alpha }(1,n-2)
    的值可查F分布表,MATLAB命令为

    finv(1-alpha,1,n-2)

  • p<alpha

    (alpha为显著水平)表示


    模型可用


    ,三个值可以相互印证。

  • s^2

    的值用来比较模型是否有改进,


    其值越小说明模型精度越高




一元非线性回归


首先从图形判断数据呈线性还是非线性。

代码如下:

%% 一元非线性回归实例
%% 输入数据
clc, clear all, close all
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];  
plot(x,y,'*','linewidth',2);
set(gca,'linewidth',2);
xlabel('销售额x/万元','fontsize', 12)           
ylabel('流通费率y/%', 'fontsize',12)    

运行结果:近似为对数关系或指数关系

一、对数形式

代码如下:

%% 对数形式
m1 = @(b,x) b(1) + b(2)*log(x);
% @是定义句柄的运算符,如:f=@(x)acos(x) 相当于建立了一个函数文件
nonlinfit1 = fitnlm(x,y,m1,[0.01;0.01])
% 将m1指定的模型拟合到表或数据集数组中的变量,并返回非线性模型nonlinfit1
% 使用从[0.01;0.01]中的初始值开始的迭代过程估计模型系数

b=nonlinfit1.Coefficients.Estimate;
% 把非线性模型中估计的系数储存到b中
Y1=b(1,1)+b(2,1)*log(x);
hold on
plot(x,Y1,'--k','linewidth',2)

运行结果:

二、指数形式

代码如下:

%% 指数形式拟合
m2 = 'y ~ b1*x^b2';% 函数模型
nonlinfit2 = fitnlm(x,y,m2,[1;1])
b1=nonlinfit2.Coefficients.Estimate(1,1);
b2=nonlinfit2.Coefficients.Estimate(2,1);
Y2=b1*x.^b2;
hold on
plot(x,Y2,'r','linewidth',2)
legend('原始数据','a+b*lnx','a*x^b')

运行结果:

分析:对数形式的决定系数为0.973,指数形势的决定系数为0.993,优于前者。


多元回归

首先从图形判断数据呈线性还是非线性。

代码如下:

%% 作出因变量Y与各自变量的样本散点图
% x1,x2,x3,Y的数据
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.5 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.0 5.5 7.0 6.0 3.5 4.9 4.3 8.0 5.0];
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 = 24; m = 3; % 每个变量均有24个数据,共有3个变量
X = [ones(n,1),x1',x2',x3'];
[b,bint,r,rint,s]=regress(Y',X,0.05) 
% 0.05为预定显著水平,判断因变量y与自变量之间是否具有显著的线性相关关系需要用到。

运行结果:

分析:得到初步回归方程为 y=18.0157+1.0817×1+0.3212×2+1.2835×3


  • 回归置信区间

    不包含零点表示模型较好。

  • 残差

    在零点附近,表示模型较好。

  • R^2

    为0.9106,线性相关性较强。

  • F值

    ——当
    F>F_{1- \alpha }(m,n-m-1)
    (m为自变量个数)时,则认为显著线性相关,本例F=67.9195,
    F_{1-0.05}(3,20)=3.0984

  • p<alpha

    (alpha为预定显著水平),说明显著线性相关,p<0.0001,alpha=0.05

  • s^2

    在模型改进时作参考


逐步回归

逐步回归是多元线性回归和多元多项式回归的结合,可以自动使方程的因子设置最合理。

代码如下 :

%% 逐步回归
X=[7,26,6,60;1,29,15,52;11,56,8,20;11,31,8,47;7,52,6,33;11,55,9,22;3,71,17,6;1,31,22,44;2,54,18,22;21,47,4,26;1,40,23,34;11,66,9,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];  %因变量数据

stepwise(X,Y,[1,2,3,4],0.05,0.10)

% in=[1,2,3,4]表示X1、X2、X3、X4均保留在模型中
% stepwise(X,y,inmodel,penter,premove)还为F统计量的p值指定初始模型(inmodel)和入口(penter)和出口(premove)容差
% inmodel要么是长度等于X的列数的逻辑向量,要么是索引向量,取值范围从1到X的列数。penter的值必须小于或等于premove
% penter为引入变量时设定的最大p值,缺省时为0.05 premove为是移出变量时设定的p值,缺省时为0.10

运行结果:

分析:[1.476,0.6867,0,0]

蓝色行显示变量 X1、X2、X3、X4 均保留在模型中,窗口的右侧按钮上方提示:移除X4,单击下一步按钮,剔除的变量 X3 所对应的行用红色表示,同时又得到提示:移除X3,单击下一步按钮,这样一直重复操作,直到 “下一步” 按钮变灰,表明逐步回归结束,此时得到的模型即为逐步回归最终的结果。


Logistic回归

以指数结构函数作为回归模型的回归方法

代码如下:

%% 导入数据
clc,clear,close all
X0 = xlsread('logistic_ex1.xlsx','A2:C21'); % 前20家企业的三项评价指标值,即回归模型的输入
Y0 = xlsread('logistic_ex1.xlsx','D2:D21'); % 前20家企业的评估结果,即回归模型的输出
X1 = xlsread('logistic_ex1.xlsx','A2:C26'); % 预测数据输入
 
%% 逻辑函数
GM = fitglm(X0,Y0,'Distribution','binomial');
% 创建广义线性回归模型,分布选择'binomial',连接函数为:f(μ) = log(μ/(1–μ))
Y1 = predict(GM,X1);
% 预测使用测量的输入输出数据计算已识别模型的K步提前输出

%% 模型的评估
N0 = 1:size(Y0,1); % N0 = [1,2,3,4,……,20]
N1 = 1:size(Y1,1); % N1 = [1,2,3,4,……,25]
plot(N0',Y0,'-kd'); 
% N0'指的是对N0'进行转置,N0'和Y0的形式相同,该行代码绘制的是前20家企业的评估结果
% plot()中的参数'-kd'的解析:-代表直线,k代表黑色,d代表菱形符号
hold on;
scatter(N1',Y1,'b');
% 绘制散点图
% N1'指的是对N1'进行转置,N1'和Y1的形式相同
xlabel('企业编号');
ylabel('输出值');

运行结果:



版权声明:本文为weixin_42019459原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。