第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 |
得到的初步回归方程为:
判断模型:
由于置信区间不包含离你单表示模型较好;
残差在零点附近,表示模型较好;
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个,需要用到多元回归的方法,否则用一元回归;然后判断时线性还是非线性。对于多元变量,往往其他变量保持不变,将多元转化为一元再去判断时线性还是非线性。
如果变量过多,可以考虑多元线性回归,或者逐步回归。