《MATLAB数学建模方法与实践(第3版)》第4章学习笔记

第4章 MATLAB常用的数据建模方法

以数据为基础的方法称为数据建模方法,包括回归、统计、机器学习、深度学习、灰色预测、主成分分析、神经网络、时间序列分析等方法。

根据回归方法中因变量个数和回归函数的类型(线性和非线性),可将回归方法分为一元线性回归、一元非线性回归和多元回归。

还有逐步回归即在回归过程中可以调整变量数量的回归方法;Logistic回归即以指数结构函数作为回归模型的回归方法。

4.1 一元回归

4.1.1 一元线性回归

例4-1 近10年,某市社会商品两手总额与职工工资总额的数据如表4-1,请建立两者之间的回归模型。

职工工资总额 23.8 27.6 31.6 32.4 33.7 34.9 43.2 52.8 63.8 73.4
商品零售总额 41.4 51.8 61.7 67.9 68.7 77.5 95.9 137.4 155 175

step1:输入数据,并做出散点图,查看数据走势

%% 清除变量
clc
clear all
close all
%% 输入数据
x=[23.8 27.6 31.6 32.4 33.7 34.9 43.2 52.8 63.8 73.4];
y=[41.4 51.8 61.7 67.9 68.7 77.5 95.9 137.4 155 175];
figure     %新建图
plot(x,y,'r*')   %输出散点图,每个数据点用红色*表示
xlabel('x(职工工资总额)','fontsize',12)   %横坐标,字体大小12
ylabel('y(商品零售总额)','fontsize',12)   %纵坐标,字体大小12
set(gca,'linewidth',2)  %设置边框线宽为2

输出结果:

step2:从散点图可以看出,数据基本符合线性,因变量只有1个,符合一元线性回归拟合

对一元线性回归,有多种方法:自己写最小二乘回归或者用现成的函数,现分别用两种办法拟合。

(1)采用最小二乘法拟合

%% 采用最小二乘拟合
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)

输出:

(2)用polyfit进行拟合

%% 用polyfit,polyval进行拟合
p=polyfit(x,y,1);   %1代表一元回归
y1=polyval(p,x);
hold on
plot(x,y1,'linewidth',2)

输出:

(3)用regress进行拟合

%% 采用regress函数进行回归
Y=y';  %转置
X=[ones(size(Y)),x'];
[b,bint,r,rint,s]=regress(Y,X)
hold on
y1=b(1)+x*b(2);
hold on
plot(x,y1,'linewidth',2)

输出结果:

三种方法结果都一样,regress得到的结果更详细,列成表格。

regress计算结果
参数 参数估计值 置信区间
b1 -23.5493 [-35.3165  -11.7822]
b2 2.7991 [2.535   3.0633]
R^2=0.9868 F=597.0543  p<0  s^2=31.9768

R^2=0.9868,接近1,代表数据线性关系明显,模型有效。F远远大于F分布表查的值,说明y与x有线性关系;p小于0.05,模型可用。s^2的值代表模型是否还有改进,值越小代表模型精度越高。

4.1.2 一元非线性回归

例4-2 为了了解商店销售额x与流通费率y之间的关系,收集了9个商店的数据。

销售额与流通费率数据
样本点 销售额x/万元 流通费率y/%
1 1.5 7
2 4.5 4.8
3 7.5 3.6
4 10.5 3.1
5 13.5 2.7
6 16.5 2.5
7 19.5 2.4
8 22.5 2.3
9 25.5 2.2

step1:画出散点图

%% 清除变量
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 4.8 3.6 3.1 2.7 2.5 2.4 2.3 2.2];
figure     %新建图
plot(x,y,'r*')   %输出散点图,每个数据点用红色*表示
xlabel('销售额x/万元','fontsize',12)   %横坐标,字体大小12
ylabel('流通费率y/%','fontsize',12)   %纵坐标,字体大小12
set(gca,'linewidth',2)  %设置边框线宽为2

输出:

从散点图可用看出,数据没有线性关系,需要用非线性拟合。

step2:非线性拟合有多种方法

(1)用polyfit polyval多项式拟合

分别用n=2和n=3拟合。

%% polyfit polyval拟合
p=polyfit(x,y,2);
y1=polyval(p,x);
hold on
plot(x,y1,'linewidth',2)

输出:

从图中可以看出,n=3的时候效果更好些。

(2)用regress进行三次非线性拟合

%% 采用regress函数进行回归
Y=y';  %转置
x=x';
X=[ones(size(Y)),x x.^2 x.^3];
[b,bint,r,rint,s]=regress(Y,X)
hold on
y1=b(1)+x*b(2)+x.^2*b(3)+x.^3*b(4);
hold on
plot(x,y1,'linewidth',2)

输出:

regress计算结果
参数 参数估计值 置信区间
b1 8.1647 [7.66 8.6693]
b2 -0.9166 [-1.0807 -0.7256]
b3 0.0495 [0.0353 0.0636]
b4 -0.0009 [-0.0012 -0.0005]
R^2=0.9953 f=354.9524 p<0  s^2=0.0187

模型拟合效果很好。

(3)用对数形式非线性拟合

%% 对数形式拟合
m1=@(b,x)b(1)+b(2)*log(x);
nonlinfit1=fitnlm(x,y,m1,[0.01;0.01])
b=nonlinfit1.Coefficients.Estimate;
Y1=b(1,1)+b(2,1)*log(x);
hold on
plot(x,Y1,'--k','linewidth',2)

输出:

nonlinfit1 = 

非线性回归模型:
    y ~ b1 + b2*log(x)

估计系数:
          Estimate      SE        tStat       pValue  
          ________    _______    _______    __________

    b1     7.3979     0.26667     27.742    2.0303e-08
    b2     -1.713     0.10724    -15.974    9.1465e-07

观测值数目: 9,误差自由度: 7
均方根误差: 0.276
R 方: 0.973,调整 R 方 0.969
F 统计量(常量模型): 255,p 值 = 9.15e-07

(4)用指数形式非线性拟合

%% 指数形式拟合
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)

输出:

nonlinfit2 = 

非线性回归模型:
    y ~ b1*x^b2

估计系数:
          Estimate       SE        tStat       pValue  
          ________    ________    _______    __________

    b1      8.4112     0.19176     43.862    8.3606e-10
    b2    -0.41893    0.012382    -33.834    5.1061e-09

观测值数目: 9,误差自由度: 7
均方根误差: 0.143
R 方: 0.993,调整 R 方 0.992
F 统计量(零模型): 3.05e+03,p 值 = 5.1e-11

为了比较,将对数和指数形式曲线放在一张图上比较。

从数据和图可以看出,指数非线性拟合更好一些。

4.2 多元回归

例4-3 某科学基金会希望估计学者的年薪Y与研究成果X1、从事研究工作的实践X2、成功获得资助X3之间的关系。调查了24位研究学者,试建立Y与X1、X2、X3之间数学模型,并得出结论和统计分析。

从事某种研究的学者的相关指标数据
i 1 2 3 4 5 6 7 8 9 10 11 12
xi1 3.5 5.3 5.1 5.8 4.2 6 6.8 5.5 3.1 7.2 4.5 4.9
xi2 9 20 18 33 31 13 25 30 5 47 25 11
xi3 6.1 6.4 7.4 6.7 7.5 5.9 6 4 5.8 8.3 5 6.4
yi 33.2 40.3 38.7 46.8 41.4 37.5 39 40.7 30.1 52.9 38.2 31.8
i 13 14 15 16 17 18 19 20 21 22 23 24
xi1 8 6.5 6.6 3.7 6.2 7 4 4.5 5.9 5.6 4.8 3.9
xi2 23 35 39 21 7 40 35 23 33 27 34 15
xi3 7.6 7 5 4.4 5.5 7 6 3.5 4.9 4.3 8 5.8
yi 43.3 44.1 42.5 33.6 34.2 48 38 35.9 40.4 36.8 45.2 35.1

从问题可以看出,是个多元回归问题,是线性还是非线性要看散点图。

step1:做出y与所有x之间的散点图

%% 清除变量
clc
clear all
close all
%% 输入数据
x1=[3.5 5.3 5.1 5.8 4.2 6 6.8 5.5 3.1 7.2 4.5 4.9 8 6.5 6.6 3.7 6.2 7 4 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 4 5.8 8.3 5 6.4 7.6 7 5 4.4 5.5 7 6 3.5 4.9 4.3 8 5.8];
y=[33.2 40.3 38.7 46.8 41.4 37.5 39 40.7 30.1 52.9 38.2 31.8 43.3 44.1 42.5 33.6 34.2 48 38 35.9 40.4 36.8 45.2 35.1];
subplot(131)
plot(x1,y,'g*')   %输出散点图,每个数据点用绿色*表示
title('y与x1的散点图')
subplot(132)
plot(x2,y,'k+')
title('y与x2的散点图')
subplot(133)
plot(x3,y,'ro')
title('y与x3的散点图')

输出:

从散点图可以看出,数据之间大致符合线性关系,可以采用线性回归。

step2:使用regress多元线性回归

%% 用regress多元回归
y=y';
x1=x1';
x2=x2';
x3=x3';
X=[ones(size(y)) x1 x2 x3];
[b bint r rint s]=regress(y,X)
regress计算结果
回归系数 估计值 置信区间
b1 17.4361 [13.2367  21.6354]
b2 1.1194 [0.4449  1.7938]
b3 0.3215 [0.2453  0.3978]
b4 1.3334 [0.7182  1.9486]
R^2=0.9131 F=70.0454 p<0 s^2=2.9868

得到的初步回归方程为:

\hat{y}=17.4361+1.1194x_{1}+0.3215x_{2}+1.3334x_{3}

判断模型:

由于置信区间不包含离你单表示模型较好;

残差在零点附近,表示模型较好;

R^2=0.9131,表示线性相关性较强;

F检验:F值远大于F值,y与x之间有显著的线性相关关系;

p值检验:p<0.05,y与x之间有显著的线性相关关系。

s^2越小越好。

4.3 逐步回归

例4-4 Hald数据是关于水泥生产的数据。某种水泥在凝固时放的热量Y与水泥中4种化学成分所占的百分比有关:

X1:3CaO.Al2O3

X2:2CaO.SiO2

X3:4CaO.Al2O3.Fe2O3

X4:2CaO.SiO2

在生产中测得12组数据,试建立Y关于这些因子的最优回归方程。

水泥生产的数据
序号 1 2 3 4 5 6 7 8 9 10 11 12
X1 7 1 11 11 7 11 3 1 2 21 1 11
X2 26 29 56 31 52 55 71 31 54 47 40 66
X3 6 15 8 8 6 9 17 22 18 4 23 9
X4 60 52 20 47 33 22 6 44 22 26 34 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

可以用以前的方法画出散点图,然后观察是线性还是非线性,然后拟合。

现在使用逐步回顾,逐步回归是以上两种方法的结合,可以自动使得方程的因子设置最合理。

%% 清除变量
clc
clear all
close all
%% 输入数据
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.1)   %[1,2,3,4]表示X1、X2、X3、X4均保留在模型中。

输出:

图中蓝色线代表X1~X4.右边显示移出X4,点下一步执行,也可以选“全部步骤”,一次执行完成。逐步回归完成图如下图。

4.4 Logistic回归

例4-5 企业贷款,银行需要对企业进行评估。评估结果只有两种情况,贷款或者拒绝。为Logistic回归问题。

现有20家企业三项性价值表和评估结果数据,试建立模型对其他5家企业进行评估。

具体代码:

%% 清除变量
clc
clear all
close all
%% 输入数据
X0=xlsread('logistic_ex1.xlsx','A2:C21');   %读入已知输入数据
Y0=xlsread('logistic_ex1.xlsx','D2:D21');   %读入已知输出数据
X1=xlsread('logistic_ex1.xlsx','A2:C26');   %读入所有预测数据
%% logistics函数回归
GM=fitglm(X0,Y0,'Distribution','binomial')   %logistics回归
Y1=predict(GM,X1)   %对所有值进行预测

输出:

GM = 

广义线性回归模型:
    logit(y) ~ 1 + x1 + x2 + x3
    分布 = Binomial

估计系数:
                   Estimate        SE           tStat       pValue 
                   ________    __________    ___________    _______

    (Intercept)     -92.66     3.9063e+07    -2.3721e-06          1
    x1             0.61671     3.2256e+05     1.9119e-06          1
    x2              4.4304     5.6806e+05     7.7992e-06    0.99999
    x3              59.604      2.147e+07     2.7762e-06          1

20 个观测值,16 个误差自由度
散度: 1
卡方统计量(常量模型): 27.7,p 值 = 4.15e-06

Y1 =

    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
    0.0000
    0.0000
    1.0000
    1.0000
    1.0000
对模型进行评估,可视化。

根据实际值和预测值,对前20个数据可视化。

%% 对前20个评估模型
N0=1:size(Y0,1);
N1=1:size(Y1,1);
plot(N0',Y0,'-kd')

输出:

加入待预测的5个值,进行评估。

%% 对所有25个数据评估
hold on
scatter(N1',Y1,'r')  %输出散点图
xlabel('数据点编号');
ylabel('输出值');

4.5 小结

使用回归时,首先判断自变量的个数,超过2个,需要用到多元回归的方法,否则用一元回归;然后判断时线性还是非线性。对于多元变量,往往其他变量保持不变,将多元转化为一元再去判断时线性还是非线性。

如果变量过多,可以考虑多元线性回归,或者逐步回归。

猜你喜欢

转载自blog.csdn.net/xfsong2012/article/details/112793375
今日推荐