数学建模社区-数学中国

标题: Matlab数学建模学习报告(一) [打印本页]

作者: 杨利霞    时间: 2019-4-10 15:43
标题: Matlab数学建模学习报告(一)
Matlab数学建模学习报告(一)  ]! s: F- K8 ]( G
. ^. z7 W" e! ?9 n6 M% e4 z  G

. y% J0 p; R/ I! U) C1. 二维数据曲线图
1.1 绘制二维曲线的基本函数

1.plot()函数 6 X; q- U$ X1 Q( B+ M# S
plot函数用于绘制二维平面上的线性坐标曲线图,要提供一组x坐标和对应的y坐标,可以绘制分别以x和y为横、纵坐标的二维曲线。
6 e3 Z) D" `' h5 L- q7 a1 M1 o& p例:

二、实例演练。) M! l! {: m, t4 J+ f! u

' Z6 `& [' F* u/ \/ X   1、谈谈你对Matlab与数学建模竞赛的了解。$ S- F# |5 A; b4 @& N) v1 Y+ q6 ]
! }1 O! W1 |+ a9 g
        Matlab在数学建模中使用广泛:MATLAB 是公认的最优秀的数学模型求解工具,在数学建模竞赛中超过 95% 的参赛队使用 MATLAB 作为求解工具,在国家奖队伍中,MATLAB 的使用率几乎 100%。虽然比较知名的数模软件不只 MATLAB。
  C# T, K7 x! G) J& s4 C3 {# }9 M2 O4 w0 ^4 C; e$ [
        人们喜欢使用Matlab去数学建模的原因:
5 z9 _5 U1 i9 y9 G! d2 i+ O0 ]9 j) I1 Q
(1)MATLAB 的数学函数全,包含人类社会的绝大多数数学知识。
# J' D- L7 K. z: o+ s4 P. i6 M. d4 n+ W* ]8 w/ G
(2)MATLAB 足够灵活,可以按照问题的需要,自主开发程序,解决问题。
& q$ U4 C5 V% M" M4 e; g+ H
+ C, t8 ]) P* P$ \* {, w1 H(3)MATLAB易上手,本身很简单,不存在壁垒。掌握正确的 MATLAB 使用方法和实用的小技巧,在半小时内就可以很快地变成 MATLAB 高手了。
+ w' o5 J* O# l
7 T( P& u% x& R9 e  R: r8 o        正确且高效的 MATLAB 编程理念就是以问题为中心的主动编程。我们传统学习编程的方法是学习变量类型、语法结构、算法以及编程的其他知识,因为学习时候是没有目标的,也不知道学的知识什么时候能用到,收效甚微。而以问题为中心的主动编程,则是先找到问题的解决步骤,然后在 MATLAB 中一步一步地去实现。在每步实现的过程中,遇到问题,查找知识(互联网时代查询知识还是很容易的),定位方法,再根据方法,查询 MATLAB 中的对应函数,学习函数用法,回到程序,解决问题。在这个过程中,知识的获取都是为了解决问题的,也就是说每次学习的目标都是非常明确的,学完之后的应用就会强化对知识的理解和掌握,这样即学即用的学习方式是效率最高,也是最有效的方式。最重要的是,这种主动的编程方式会让学习者体验到学习的成就感的乐趣,有成就感,自然就强化对编程的自信了。这种内心的自信和强大在建模中会发挥意想不到的力量,所为信念的力量。
! C# `# }$ G; P: D! y9 l* Y( B" j: e5 u8 h& _
         数学建模竞赛中的 MATLAB 水平要求:
5 ^: V6 U" ~* F' O
. [6 U% l8 U% }% m+ Z# H  R) U要想在全国大学生数学建模竞赛中拿到国奖, MATLAB 技能是必备的。 具体的技能水平应达到:8 {1 m" b- ^2 T
( R5 B6 t* |2 m
1)了解 MATLAB 的基本用法,包括几个常用的命令,如何获取帮助,脚本结构,程序的分节与注释,矩阵的基本操作,快捷绘图方式;
( R: w& B0 f7 e: U
2 o7 C1 }4 V5 D3 k9 [3 i( e  G8 \& y+ g2)熟悉 MATLAB 的程序结构,编程模式,能自由地创建和引用函数(包括匿名函数);! P" L  z1 V5 @5 S0 h% P& p' j

& d! ~5 V* t/ w& x6 k: o3)熟悉常见模型的求解算法和套路,包括连续模型,规划模型,数据建模类的模型;
- J2 v4 v# y- K0 }4 w: Q8 T. Q) y# o. s1 ?  R: X
4)能够用 MALTAB 程序将机理建模的过程模拟出来,就是能够建立和求解没有套路的数学模型。
% G+ }+ V! v. N' w" Z
: f) @" s; V1 m# L) g要想达到如上要求, 不能按照传统的学习方式一步一步地学习, 而要结合上述提到的学习理念制定科学的训练计划。/ u6 \1 s! P" t4 O; G; J* \: Z

, M7 j7 y1 @! U8 ~4 M  2、已知股票的交易数据:日期、开盘价、最高价、最低价、收盘价、成交量和换手率,试用某种方法来评价这只股票的价值和风险。如何用MATLAB去求解该问题?(交易数据:点击此处获取数据)3 L9 d- V. D+ j! `

: ]& w) ?0 k3 I, R- d解题步骤:
5 u2 ^. B. T& D% i
" `* S+ d/ k  c! m第一阶段:从外部读取数据6 r% _4 }, K; ~8 M7 A) x

/ Z- |- l1 ~4 ?8 mStep1.1:把数据文件sz000004.xls拖曳进‘当前文件夹区’,选中数据文件sz000004.xls,右键,将弹出右键列表,很快可发现有个“导入数据”菜单,如图 1 所示。
( |9 u5 A4 x& h+ O
' S9 j9 n& r; V) a0 I! \0 G  [: _7 a. V% P- R
* W: u& _# G8 W* w* d0 w0 a
                                                                  图1. 启动导入数据引擎示意图
( s+ Y. n) ~5 R& o+ s3 |
7 z& b. ^% ]3 Y8 k- VStep1.2:单击“导入数据”这个按钮,则很快发现起到一个导入数据引擎,如图 4 所示。# N' K, K$ t+ r+ R

4 K& ^1 Y2 A, H& A- o" z3 x6 C5 `# E. P) V1 Q" \

2 C4 Z5 p4 o9 @  W' Y- I+ F% d. G1 C                                                                    图2. 导入数据界面! j; H$ i0 I$ ?" h$ t. N

+ g; t. Q. \) x8 x  B/ \Step1.3:观察图 2,在右上角有个“导入所选内容”按钮,则可直接单击之。马上我们就会发现在 MATLAB 的工作区(当前内存中的变量)就会显示这些导入的数据,并以列向量的方式表示,因为默认的数据类型就是“列向量”,当然您可以可以选择其他的数据类型,大家不妨做几个实验,观察一下选择不同的数据类型后会结果会有什么不同。至此,第一步获取数据的工作的完成。! B; m% \' A: _0 f
) i% w  D4 Z% K* ^5 W
" a7 N1 |3 i& t3 k
& h  D# k5 k6 H, q' h# q
第二阶段:数据探索和建模( |0 O; U4 m" \! _& v4 @) C4 J
( c# F/ P( m: _1 \0 n5 \, k
现在重新回到问题,对于该问题,我们的目标是能够评估股票的价值和风险,但现在我们还不知道该如何去评估,MATLAB 是工具,不能代替我们决策用何种方法来评估,但是可以辅助我们得到合适的方法,这就是数据探索部分的工作。下面我们就来尝试如何在 MATLAB 中进行数据的探索和建模。
- g1 `4 V3 q* g/ @8 o" A( ?, O5 R2 O0 C* a  c
Step2.1:查看数据的统计信息,了解我们的数据。具体操作方式是双击工具区(直接双击这三个字),此时会得到所有变量的详细统计信息。通过查看这些基本的统计信息,有助于快速在第一层面认识我们所正在研究的数据。当然,只要大体浏览即可,除非这些统计信息对某个问题都有很重要的意义。数据的统计信息是认识数据的基础,但不够直观,更直观也更容易发现数据规律的方式就是数据可视化,也就是以图的形式呈现数据的信息。下面我们将尝试用 MATLAB 对这些数据进行可视化。
* H' S6 K8 z3 \, T6 T/ b) _$ [3 U3 ~8 `+ q
由于变量比较多,所以还有必要对这些变量进行初步的梳理。对于这个问题,我们一般关心收盘价随时间的变化趋势,这样我们就可以初步选定日期(DateNum)和收盘价(Pclose)作为重点研究对象。也就是说下一步,要对这这两个变量进行可视化。. K' b+ F8 u* ?6 M6 [0 `# W
* y( R, r9 D/ f  N* ]% B) w5 B7 ~
对于一个新手,我们还不知道如何绘图。但不要紧,新版 MATLAB 提供了更强大的绘图功能——“绘图”面板,这里提供了非常丰富的图形原型,如图 3 所示。6 o7 S$ ]  {* @- I. |+ P/ @2 z

+ b& ]- n" D# e
2 x. J/ |& R0 ~4 M9 c$ L& W0 B0 u3 R( q/ s1 F! c; ]
                                                                                 图3 MATLAB绘图面板中的图例, s+ b* w( h% P( S; ?
1 \* ]- F- u+ y& l; s
要注意,需要在工作区选中变量后绘图面板中的这些图标才会激活。接下来就可以选中一个中意的图标进行绘图,一般都直接先选第一个(plot)看一下效果,然后再浏览整个面板,看看有没有更合适的。下面我们进行绘图操作。
8 H- x; \7 S. A  C* o1 b
$ j9 `% S- Z+ \* o+ Z' v6 yStep2.2:选中变量 DataNum 和 Pclose,在绘图面板中单机 plot 图标,马上可以得到这两个变量的可视化结果,如图 4 所示,同时还可以在命令窗口区看到绘制此图的命令:$ z1 \9 m" o6 j0 n; `2 ~
2 h, \0 b8 c4 }" M6 G1 W/ N
>> plot(DateNum,Pclose)
/ D. t( M3 u) U: Q" u
! c8 D+ K% y4 _+ x  ]0 j, [% L9 a/ L( n4 M+ a; w. a& _3 Q

3 ^' N7 n  h; |$ Z                                                                                       图4 通过 plot 图标绘制的原图
+ c4 B( X2 ^6 K0 \+ Y- V, `( Q9 f) E9 c+ y9 s; R; U
这样我们就知道了,下次再绘制这样的图直接用 plot 命令就可以了。一般情况下,用这种方式绘图的图往往不能满足我们的要求,比如我们希望更改:9 L, l. X* j- B3 k$ C) `$ `

% }) C! V& I' G2 F' o/ F(1)曲线的颜色、线宽、形状;
: P* U" @9 ~" F( m, c0 G5 G5 X) C8 E- ]$ A- }, Y0 }8 @
(2)坐标轴的线宽、坐标,增加坐标轴描述;
% C' R4 u* i7 [1 D* }- j
: a' `9 ]4 a7 u' d  w! p* X(3)在同个坐标轴中绘制多条曲线。7 r5 l7 f  @2 Z  O! o! _# @" Y
( @; k) g2 m6 M, C- W, t3 a7 G/ Z, u
此时我们就需要了解更多关于命令 plot 的用法,这时就可以通过 MATLAB 强大的帮助系统来帮助我们实现期望的结果。最直接获取帮助的两个命令是 doc 和 help,对于新手来说,推荐使用 doc,因为 doc 直接打开的是帮助系统中的某个命令的用法说明,不仅全,而且有应用实例,这样就可以“照猫画虎”,直接参考实例,从而将实例快速转化成自己需要的代码。$ Q" D  H* o1 I

: W- [6 ], V' ]' O; r+ v3 x接下来我们就要考虑如何评估股票的价值和风险呢?: y" |0 j" r+ F8 n7 t* ?
7 g8 R" E/ z* K9 P/ f5 W
         对于一只好的股票,我们希望股票的增幅越大越好,体现在数学上,就是曲线的斜率越大越好。9 }6 p% X( x" F4 ~( g6 A
4 |' H5 x7 [  y, j( K3 t) B
         对于风险,则可用最大回撤率来描述更合适,什么是最大回撤率?
8 I, a( C& L/ x, x6 s* V$ B
; o3 h- W/ F# R         最大回撤率的公式可以这样表达:2 V/ Y- }8 H8 |- Z
4 ]: N- I7 i, d3 y& x- ]" U0 M
D为某一天的净值,i为某一天,j为i后的某一天,Di为第i天的产品净值,Dj则是Di后面某一天的净值
% }! P: L5 I' {$ ?: ?& M5 H; w1 N2 s# {" A( h& `3 F
drawdown=max(Di-Dj)/Di,drawdown就是最大回撤率。其实就是对每一个净值进行回撤率求值,然后找出最大的。可以使用程序实现。最大回撤率越大,说明该股票的风险越高。所以最大回撤率越小,股票越好。. D) ?1 T: @) z+ E4 N2 U; ^

5 d) i/ K: j* d# Z8 K           斜率和最大回撤率不妨一个一个来解决。我们先来看如何计算曲线的斜率。对于这个问题,比较简单,由于从数据的可视化结果来看,数据近似成线性,所以不妨用多项式拟合的方法来拟合该改组数据的方程,这样我们就可以得到斜率。
: f; L3 n& ?; Z& _8 J+ \+ S9 q1 B2 o2 a) U' @
Step2.3:通过polyfit()多项式拟合的命令,并计算股票的价值,具体代码为:
1 G/ g- y# ?1 x0 A; J0 M1 V. P! x5 v( K' e
>> p = polyfit(DateNum,Pclose,1); % 多项式拟合
5 |+ Q( I" |+ y
8 Y+ u8 ^( U# M& X4 F>> value = p(1) % 将斜率赋值给value,作为股票的价值
; f# h+ J1 K2 ~  l$ B) z/ d
( r0 q5 f1 [: `2 R( N* d9 Nvalue =
) S$ X9 Y( i: P* P, g: a3 a7 c8 W' U. {0 [( Z; w, `
    0.1212
: S2 J/ ]- G* u
( r+ H6 @% U  {% d代码分析:%后面的内容是注释。polyfit()有三个参数,前两个大家都能明白是什么意思,那第三个参数是什么意思呢?它表示多项式的阶数,也就是最高次数。比如:在本例中,第三个参数为1,说明其为一次项,即一次函数。第三个参数为你要拟合的阶数,一阶直线拟合,二阶抛物线拟合,并非阶次越高越好,看拟合情况而定。polyfit()返回阶数为 n 的多项式 p(x) 的系数,p 中的系数按降幂排列。在本例中的P(1)指的是最高项的系数,即斜率。
  u( U! u- R% A/ n+ ]8 g! O3 L8 s+ y. W5 L8 Q' x
Step2.4:用相似的方法,可以很快得到计算最大回撤的代码:
+ H, m' ?( j1 C9 b: B; O
) g2 o5 ?7 E  [1 Q, T>> MaxDD = maxdrawdown(Pclose); % 计算最大回撤! D7 Z8 v/ z) }6 X
3 A& \5 S% k* V+ R) k* B3 q
>> risk = MaxDD  % 将最大回撤赋值给risk,作为股票的风险6 c$ M* \7 j0 }' W% g

4 f( i+ `2 r1 E7 e8 [risk =
* V* g3 o: ~  n2 P3 T% s9 D/ e! O7 D. |% ?6 L2 Y
    0.1155, d/ ]2 a0 i& [9 S/ B) w
6 R6 z$ N/ u# C; E% q9 b
代码分析:最大回撤率当然计算的是每天收盘时的股价。最大回撤率越大,说明该股票的风险越高。所以最大回撤率越小,股票越好。* N! ^7 I$ G  e

3 W# s4 ?$ W* O2 j' M: L6 ]到此处,我们已经找到了评估股票价值和风险的方法,并能用 MALTAB 来实现了。但是,我们都是在命令行中实现的,并不能很方便地修改代码。而 MATLAB 最经典的一种用法就是脚本,因为脚本不仅能够完整地呈现整个问题的解决方法,同时更便于维护、完善、执行,优点很多。所以当我们的探索和开发工作比较成熟后,通常都会将这些有用的程序归纳整理起来,形成脚本。现在我们就来看如何快速开发解决该问题的脚本。. V& e/ N* f% r/ U8 E& F+ G! F! H) c

5 K1 A: B! ?/ ^9 a) v# h% L4 aStep2.5:像 Step1.1 一样,重新选中数据文件,右键并单击“导入数据”菜单,待启动导入数据引擎后,选择“生成脚本”,然后就会得到导入数据的脚本,并保存该脚本。
4 b6 ?4 e: m! \! ~" ~7 @# S9 k* {- Q0 j0 \- I) ?3 @2 j7 P
脚本源代码中有些地方要注意:
/ T/ o; F/ @& h! S
, O2 h. R0 Q+ j: w, D, k4 I! G       %%在matlab代码中的作用是将代码分块,上下两个%%之间的部分作为一块,在运行代码的时候可以分块运行,查看每一块代码的运行情况。常用于调试程序。%%相当于jupyter notebook中的cell。
% U% e% }5 F8 `/ u; X
4 C- B3 @2 ?& k" c  F+ s       %后的内容是注释。5 [# z+ n9 r( s
/ }9 R% J) B7 T1 b, z9 i) h
        每句代码后面的分号作用为不在命令窗口显示执行结果。
0 o4 m0 K/ x, a+ }, c- U: L8 H* Q1 [! I( `" f6 z+ y
脚本源代码:- @- z4 H# E% ^# S; n& T% i

2 v+ i' d/ I, X9 |; R2 [%% 预测股票的价值与风险6 t! S# d* m' R" Z1 {

! ^3 `- F/ C) }1 H$ A%% 导入数据
: k9 f( U3 n' z2 s& m( Lclc, clear, close all
8 h' K7 R, x# u8 I9 u! P% clc:清除命令窗口的内容,对工作环境中的全部变量无任何影响 5 H* O2 j+ U2 ]7 n
% clear:清除工作空间的所有变量
5 N) M' r7 r7 Y% close all:关闭所有的Figure窗口
8 W* R+ @! \! U: w. j# y3 ~0 K5 a
% 导入数据" Q' x0 Z  z' l
[~, ~, raw] = xlsread('sz000004.xlsx', 'Sheet1', 'A2:H7');
! d9 m9 J7 ^( j6 }: V) P% [num,txt,raw],~表示省略该部分的返回值0 n" B, @" F* A
% xlsread('filename','sheet', 'range'),第二个参数指数据在sheet1还是其他sheet部分,range表示单元格范围
" y* \% r$ `8 _8 Z/ W) w+ ]; o1 Q# j$ `0 ~  R; X
% 创建输出变量
, w* G2 c  k! [- V1 {( udata = reshape([raw{:}],size(raw));4 L8 I' [7 w" b% N( ^- T) j
% [raw{:}]指raw里的所有数据,size(raw):6 x 8 ,该语句把6x8的cell类型数据转换为6x8 double类型数据
$ E2 `* H( U7 V5 m1 a, L, L9 v7 i0 [
% 将导入的数组分配列变量名称
& M+ ^1 \7 @! R$ {7 g6 M$ bDate = data(:, 1); % 第一个参数表示从第一行到最后一行,第二个参数表示第一列
! U  i+ E- U  s! D* C5 M  k4 VDateNum = data(:, 2);
# M7 u! p# b9 QPopen = data(:, 3);
3 E8 I, ?  n! O% N& PPhigh = data(:, 4);; J+ E$ w0 k6 X4 l2 b
Plow = data(:, 5);. k8 G& f" B& P4 w7 Z$ c1 n6 F
Pclose = data(:, 6);  
0 W4 M- P# Q0 x! T( C4 E) d9 AVolum = data(:, 7); % Volume 表示股票成交量的意思,成交量=成交股数*成交价格 再加权求和
$ A) ^( m  S8 N5 f  r, qTurn = data(:, 8); % turn表示股票周转率,股票周转率越高,意味着该股股性越活泼,也就是投资人所谓的热门股6 G2 W8 ~6 I& `0 T8 G

' Z% b7 m6 o: t. q% 清除临时变量data和raw
* x- q* }- N2 b4 p3 A8 [/ C( n  i! \clearvars data raw;
) o6 ~7 e) t0 P# ~6 i) \; i
% X: J/ O4 P6 M- H: V! {%% 数据探索
0 n' w. @4 h+ v3 l  x9 H$ l
' F# K. b$ s! |5 ]6 lfigure % 创建一个新的图像窗口
" h, \0 i/ ~1 s4 Nplot(DateNum, Pclose, 'k'); % 'k',曲线是黑色的,打印后不失真
& s: J9 Q# ^+ \! b+ u  g6 Zdatetick('x','mm-dd'); % 更改日期显示类型。参数x表示x轴,mm-dd表示月份和日。yyyy-mm-dd,如2018-10-27* m) c. \! x7 X" p* P- S
xlabel('日期') % x轴
) [- w% r- l# ?; Q# f* Bylabel('收盘价') % y轴5 c$ `5 L6 G1 L
figure6 j7 g" B9 y7 O# T: C8 n6 z+ j
bar(Pclose) % 作为对照图形
3 w# k- ~( H' k& w; ^# a( U1 v; u  s+ |9 W1 D
%% 股票价值的评估3 J) M- m% `0 [8 I2 a  L
$ g3 \- t* ?9 m6 s: F3 K/ A( C
p = polyfit(DateNum, Pclose, 1); % 多项式拟合
3 f7 h; ~& C7 L( k% polyfit()返回阶数为 n 的多项式 p(x) 的系数,p 中的系数按降幂排列' S4 L% B+ M  F! [5 a. G
P1 = polyval(p,DateNum); % 得到多项式模型的结果
4 h; V/ E: ~: g6 g$ s' g1 b/ ?0 sfigure- h4 }& e( y5 ?; f1 u6 {
plot(DateNum,P1,DateNum,Pclose,'*g'); % 模型与原始数据的对照, '*g'表示绿色的*
# ^' Z* g% }+ i( J6 wvalue = p(1) % 将斜率赋值给value,作为股票的价值。p(1)最高项的次数
! _" L/ H/ l6 B
( Z) a9 \/ u3 {: j%% 股票风险的评估# X5 E& O# M" w& H) Y, K
MaxDD = maxdrawdown(Pclose); % 计算最大回撤
" M$ w3 L! {# {0 X! E7 c! [risk = MaxDD  % 将最大回撤赋值给risk,作为股票的风险, w. _0 f+ j5 s1 O, V
  3、回归算法演练。
4 W! S9 j6 y9 T% X% U+ F2 V
9 w4 H& f# M* h* G4 J0 E7 M0 ~% P& T% f(1)一元线性回归/ U0 y, m3 u% c' P; n

% u8 }- f  n' x- N! f# N[ 例1 ] 近 10 年来,某市社会商品零售总额与职工工资总额(单位:亿元)的数据见表1,请建立社会商品零售总额与职工工资总额数据的回归模型。, x- F/ f; S9 m9 m( ?

% h" Z% a: C. R1 P6 K: n7 V# M* l6 Q- Q: ]

9 R- I- d7 n; U1 A: ^该问题是典型的一元回归问题,但先要确定是线性还是非线性,然后就可以利用对应的回归方法建立他们之间的回归模型了,具体实现的 MATLAB 代码如下:2 k5 r2 V7 S# ~9 x

3 V/ _% f8 T2 o' A$ N(1)输入数据, E& [7 y% b& v6 i8 t$ k4 T

6 J. L3 s& r7 q% p* t7 s- U%% 输入数据
. `; O- a5 I" D5 H- i: @clc, clear, close all$ J, n8 O% [& p% R2 h9 G
% 职工工资总额, k: U  K1 C' X8 E# s: X
x = [23.8,27.6,31.6,32.4,33.7,34.90,43.2,52.8,63.8,73.4];4 a  x2 L: W1 ]# C" K) H) L
% 商品零售总额
  O' b% l% d0 xy = [41.4,51.8,61.7,67.9,68.7,77.5,95.9,137.4,155.0,175.0];: J0 D9 s9 a; M( D( w2 v) |3 n! z
(2)采用最小二乘回归% h4 s! _: z+ b$ I( W( q6 I4 D. z0 z

% e* o2 V$ A( F: |1 `%% 采用最小二乘法回归; N, t1 x( e" t8 m3 ?% U
% 作散点图. a3 i/ E- `% w
figure
' R" g" X( o. l7 E2 Splot(x,y,'r*') % 散点图,散点为红色+ N" ~+ J6 X; I- K9 _3 Z3 O
xlabel('x(职工工资总额)','fontsize',12)& m4 W8 G* S" M( r0 Q5 T
ylabel('y(商品零售总额)','fontsize',12)
( Z* U6 K) }2 eset(gca, 'linewidth',2) % 坐标轴线宽为2: n$ w7 ?3 g" \: ]( r* m. c' i
* h  B  t7 f- {2 h: |; J
% 采用最小二乘法拟合
9 C+ m8 B7 ~' ^2 FLxx = sum((x-mean(x)).^2); %在列表运算中,^与.^不同5 x& `; Q2 K  {) F$ k4 _( ]
Lxy = sum((x-mean(x)).*(y-mean(y)));4 Z/ _7 O, e* e" }5 g! P
b1 = Lxy/Lxx;; H+ t; O+ J) E6 Y  ?" R+ B
b0 = mean(y) - b1 * mean(x);
7 J2 {' K. y! S5 O9 ey1 = b1 * x + b0;6 t1 ]% a& }7 J" S  L2 f& q' V

* G1 F+ _9 I0 u/ o8 m9 F$ ahold on % hold on是当前轴及图像保持而不被刷新,准备接受此后将绘制的图形,多图共存8 t1 L) y. m1 G: L# |$ g
plot(x,y1, 'linewidth',2);. z9 @8 `; O7 B, `3 W& J$ l, C4 Y$ U
运行本节程序,会得到如图5所示的回归图形。在用最小二乘回归之前,先绘制了数据的散点图,这样就可以从图形上判断这些数据是否近似成线性关系。当发现它们的确近似在一条线上后,再用线性回归的方法进行回归,这样也更符合我们分析数据的一般思路。6 D" T# o; I, D. Y8 e4 j! L
6 {8 g% T1 o/ x, x5 _
1 o" S5 |0 |% j; \+ T7 f

- W8 {* b& t$ P, |% m0 R                                                                                                    图5
  R6 y  b0 ^6 `4 ]0 b7 r- a9 e5 r  n- {. ?9 C0 g" b& F0 B3 @6 h3 Q1 x! n
(3)采用 LinearModel.fit 函数进行线性回归5 V  n& q, R! h: b6 ]
  Y4 M. B: J% m5 J5 j5 B2 o
%% 采用 LinearModel.fit 函数进行线性回归
5 I! c% S7 X  e0 [m2 = LinearModel.fit(x, y)
: k8 T) n& L7 Q+ l( I, O运行结果如下:7 C- a: }' n# s. x' B8 U

. f1 v- ?; R$ vm2 =8 h8 b9 F% ^, ~8 v' @" n

. w" }$ \5 @6 MLinear regression model:+ z, U( a% p- V1 J3 ]4 B9 v

' D; J+ }0 \6 f0 L) ^% b) \    y ~ 1 + x1
: o# p9 T" R4 MEstimated Coefficients:
) m# W& r4 q) Q0 a
% h0 a# c. m1 h9 k0 T( N               Estimate      SE       tStat       pValue
% v3 F2 x. S1 I- i; E6 I4 W- ]7 l; Y8 {7 u2 E2 R0 l
    (Intercept)    -23.549      5.1028    -4.615     0.0017215
& o  L. D, P2 d0 o( j. s3 v7 i
* P) l. P7 {/ |! p+ M1 M    x1           2.7991     0.11456    24.435    8.4014e-094 v* ]2 f7 M  s+ ?4 x: s) x6 r
# f4 o$ X8 G9 u& M% Z! k2 {
R-squared: 0.987,  Adjusted R-Squared 0.985$ G) L3 Y0 k* ~- F( Q

# t7 x2 k/ M3 {4 P6 S1 t+ d/ t! mF-statistic vs. constant model: 597, p-value = 8.4e-09
8 p$ _) b9 K; J& R+ y0 K) M# ?* v  u# l
如下图,我们只需记住-23.594是一次函数的中x的系数,2.7991是一次函数中的常数项即可,其它的不用理会。9 B# Q3 ^0 }$ M% C8 l* y
2 U. T3 ~3 p% R; u
! @0 I4 ]/ e9 s8 Y: U

( d2 ~, k5 U& A- G4)采用 regress 函数进行回归" a( {& `. e+ o- R; A6 E

% @( O  k/ t6 d0 m" \. Z* t%% 采用 regress 函数进行回归8 M$ ^. J! C! k
Y = y'. c3 I% B- D% C; Q
X = [ones(size(x,2),1),x']' h* N5 P" T- W( b7 s( w
[b,bint,r,rint,s] = regress(Y,X)5 W3 C  ]% @4 p2 b
运行结果如下:
" e' i' [( g3 x' D4 [2 }
2 g# I1 q; n, p5 i2 o) gb =
  L/ x( R. o+ H$ U% K: H* e$ R& {; v  Q/ l7 X6 P5 p
  -23.54937 L# u2 U6 ]0 n; D, v* b

4 S4 [0 ?8 _6 z+ a9 M/ B: K    2.7991. F3 e7 J# u1 ~  O
5 T% x5 [3 g+ J$ K  M; u
我们只需记住-23.594是一次函数的中x的系数,2.7991是一次函数中的常数项即可,其它的不用理会。3 K. I% I0 {, L! B& f
0 n  o. Y0 P% J; C8 e
(2)一元非线性回归
; [# x! i1 x8 C# O, F( G  R+ S9 P- S. @2 N! @
[ 例2 ] 为了解百货商店销售额 x 与流通率(这是反映商业活动的一个质量指标,指每元商品流转额所分摊的流通费用)y 之间的关系,收集了九个商店的有关数据(见表2)。请建立它们关系的数学模型。" l! ~. R6 s% c1 ^4 z1 n

; y0 M6 o- p" q$ I/ u2 |1 }" x! U: U4 o4 V% C

- Z/ ]1 m3 W  n- a( Y: P8 x5 x0 ?( u; i

. X; y0 ]8 w3 p        为了得到 x 与 y 之间的关系,先绘制出它们之间的散点图,如图 2 所示的“雪花”点图。由该图可以判断它们之间的关系近似为对数关系或指数关系,为此可以利用这两种函数形式进行非线性拟合,具体实现步骤及每个步骤的结果如下:1 \  b1 t6 G; u: c

& N- j# K: M" l  m4 O8 g(1)输入数据
5 B* |: P$ I/ @# h* a- j' y% e& A! c& g, _) U
%% 输入数据
" m* A" r& O; e: Y1 p: j! t' j  Bclc, clear all, close all
* t  J7 y" a4 L, D" H; d" @0 wx = [1.5, 4.5, 7.5,10.5,13.5,16.5,19.5,22.5,25.5];
! d/ C' R% [+ oy = [7.0,4.8,3.6,3.1,2.7,2.5,2.4,2.3,2.2];
" o- @9 n: v$ ?) B; Z, e/ uplot(x, y, '*', 'linewidth', 1) % 这里的linewidth指的是散点大小; f: p  s- \+ n& O" S. l2 n; ]. @& h
set(gca,'linewidth',2) % 设置坐标轴的线宽为2; J7 p  A1 O' c9 t% R
xlabel('销售额x/万元','fontsize',12)
! ^6 w( A: h, U& ]! v% kylabel('流通率y/%','fontsize',12)" x+ i, }  v" }; r
(2)对数形式非线性回归
7 w' H7 N" \# R  u. L
5 j- z9 j) x6 S+ C! V%% 对数形式非线性回归2 J: w  L2 ^3 H6 {
m1 = @(b,x) b(1) + b(2)*log(x);
" W( B: W% j8 X3 w: i' S5 ?& {. G' Enonlinfit1 = fitnlm(x,y,m1,[0.01;0.01])
+ ~  K, D& R. ^& w# ~, zb = nonlinfit1.Coefficients.Estimate;! W& x: A& s& T/ |8 p+ V
Y1 = b(1,1) + b(2,1)*log(x);
8 M% H: E5 {4 Y2 \' d8 \" F% |hold on , d4 L/ D' D  X1 m4 ?4 s
plot(x, Y1, '--k', 'linewidth',2)
' N& N; t; O- @0 m* r! F运行结果如下:
8 X6 Q3 {& j; N! H- p$ k0 F0 L6 T- `% @! s+ u$ u
nonlinfit1 =7 f( i0 x4 ?0 H0 O' n
" y; ~- L$ d; x1 k
Nonlinear regression model:; q! J* y8 g( |2 N$ D7 v2 X( B
0 A: K# C9 ~6 J0 r" j6 \( i. g
    y ~ b1 + b2*log(x)6 p3 ~9 g5 B- r! b5 X

6 h* b% L2 v, S% @' M$ [3 iEstimated Coefficients:
; i# y- z/ B6 g0 A  Q$ v
! D. A  A0 w% q5 C# V$ z: J- g          Estimate      SE        tStat       pValue 7 \  |, @1 j& c5 Q/ H3 `

+ ^2 \8 k7 R* o8 j6 d9 T    b1    7.3979      0.26667     27.742    2.0303e-08- E4 C* v: F9 Q) u0 q/ P, E. M

; A+ A/ h; _7 i" [7 L6 Z    b2    -1.713      0.10724    -15.974    9.1465e-07
" _' J; Y2 {2 ~- h2 k8 D" c
, C- v; P: z( xR-Squared: 0.973,  Adjusted R-Squared 0.969$ _: p: U5 f; ^& d+ o6 p
  \- E/ N! [& d0 E
F-statistic vs. constant model: 255, p-value = 9.15e-072 |0 Y. a+ r; d6 {
! Z/ q  s, [* F) C7 K6 u
(3)指数形式非线性回归/ K) d/ Y7 W: m: J9 x/ A. J
# }0 R! Z0 t& E4 Z' W" I6 N' D
%% 指数形式非线性回归* E8 e+ p- ~% s6 W
m2 = 'y ~ b1*x^b2';3 [' [" L/ P5 ]& q8 |; G. v% t
nonlinfit2 = fitnlm(x,y,m2, [1;1])
4 X; N- z9 W7 X7 D( G4 n, Qb1 = nonlinfit2.Coefficients.Estimate(1,1);
7 E& B4 d: L) ]* \, vb2 = nonlinfit2.Coefficients.Estimate(2,1)
$ k" T3 T1 b6 q* R+ }Y2 = b1*x.^b2;: g: ~/ b! H6 h- C" ^
hold on;7 |0 [. |8 q) U
plot(x,Y2,'r','linewidth',2)
" `" J6 K( r+ M3 Plegend('原始数据','a+b*lnx','a*x^b') % 图例- i) q( i: N% s' _6 w6 r
运行结果如下:
. o" _9 M/ T# A5 G/ e' }6 ]1 Y; z* g' _
nonlinfit2 =% Z" }; w2 w: s- B+ `3 l3 _

8 [) t1 \7 Y9 `7 M$ P& G9 K2 NNonlinear regression model:5 E3 {/ n, \: E2 K  X

: K$ g" _+ `1 k$ e* B3 A9 G    y ~ b1*x^b2  U# A  O9 |2 W# e
6 \, L2 I* @4 ]$ q, \5 {
Estimated Coefficients:9 R) ?) o% d1 [3 q& \, Z

" b, C8 `2 p) w  m6 Z* U          Estimate       SE        tStat       pValue
- |0 P' U+ S3 k- C3 V1 l6 G( m0 [3 ~/ r9 [0 K) J
    b1      8.4112     0.19176     43.862    8.3606e-10
. y$ C. e, C( a- g# Q7 x$ ^
! v' _$ F8 K( f! {! s. ]    b2    -0.41893    0.012382    -33.834    5.1061e-09
* [) s6 u% }: r3 J
, Q; H  B% _! ]2 t' N2 KR-Squared: 0.993,  Adjusted R-Squared 0.992; c% N9 v; }* W# ]4 l  I
1 R- R. P& Z$ p! K$ q7 g, Y
F-statistic vs. zero model: 3.05e+03, p-value = 5.1e-11& ?7 P' K+ R5 d! B; j

9 S# P* \0 X2 V( N在该案例中,选择两种函数形式进行非线性回归,从回归结果来看,对数形式的决定系数为 0.973 ,而指数形式的为 0.993 ,优于前者,所以可以认为指数形式的函数形式更符合 y 与 x 之间的关系,这样就可以确定他们之间的函数关系形式了。
6 D1 U- X, t! u4 E
  M/ Q1 d; {* t. T2.多元回归
  O) ]$ g  H+ M* }2 M- B; o1 a  o% F1 P; A; n3 g# n
1.多元线性回归1 {1 r5 {$ k/ B5 w3 K! ~  Z

' |; s- T  n; D- X$ @  C) M[ 例3 ] 某科学基金会希望估计从事某研究的学者的年薪 Y 与他们的研究成果(论文、著作等)的质量指标 X1、从事研究工作的时间 X2、能成功获得资助的指标 X3 之间的关系,为此按一定的实验设计方法调查了 24 位研究学者,得到如表3 所示的数据( i 为学者序号),试建立 Y 与 X1 , X2 , X3 之间关系的数学模型,并得出有关结论和作统计分析。
) P; Z4 v1 o. S1 B: p0 @% m1 e9 Q: S7 f; t

5 N+ E' ]0 V& j, p8 D
0 i% H0 m' o8 M4 K5 j' r& W该问题是典型的多元回归问题,但能否应用多元线性回归,最好先通过数据可视化判断他们之间的变化趋势,如果近似满足线性关系,则可以执行利用多元线性回归方法对该问题进行回归。具体步骤如下:! Z. D' _( C* {3 Z  q
8 m; q: O- l: t) h7 m1 t3 w
(1)作出因变量 Y 与各自变量的样本散点图
( V! p" C( Y! X8 h; M3 T# v' q; I! r$ Y) g; l! l; R7 Q$ R" z
作散点图的目的主要是观察因变量 Y 与各自变量间是否有比较好的线性关系,以便选择恰当的数学模型形式。图3 分别为年薪 Y 与成果质量指标 X1、研究工作时间 X2、获得资助的指标 X3 之间的散点图。从图中可以看出这些点大致分布在一条直线旁边,因此,有比较好的线性关系,可以采用线性回归。绘制图3的代码如下:
5 l5 f  v/ k8 z& N  W3 u& @0 e5 N3 C0 o* j! X- s
%% 作出因变量Y与各自变量的样本散点图# n  g1 g  s5 j8 x9 ~0 A
% x1,x2,x3,Y的数据
& \( S3 [8 s) @/ O; C; k/ Xx1=[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];, U5 J" q$ N7 x! g6 H
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];
8 F& m! |# x) x  Nx3=[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];
5 i7 K! W8 M, ^9 `& B! BY=[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];  b# c  S7 N/ n: ~' Y. }$ g
% 绘图,三幅图横向并排
, j6 @, [! ^7 t4 {subplot(1,3,1),plot(x1,Y,'g*')9 R! ~+ B9 H) @6 m
subplot(1,3,2),plot(x2,Y,'k+')+ s: {0 {: _2 N% i, ]3 N) h
subplot(1,3,3),plot(x3,Y,'ro')
1 P9 Z! S' k- f* u: b绘制的图形如下:
2 j, t" y6 K: M7 b1 s8 u
( h7 C6 `5 B! \8 W7 b9 V4 G
$ J9 j. N. X9 W$ D9 g6 M5 W2 W/ `, W2 Y8 m9 L) a
(2)进行多元线性回归5 B, j+ G! X6 _4 }$ l7 l) B2 x

' N+ ~) {: Q# R这里可以直接使用 regress 函数执行多元线性回归,注意以下代码模板,以后碰到多元线性问题直接套用代码,具体代码如下:; T  Z, z3 C8 T) t
6 `" S7 D" c6 j3 O, k1 `
%% 进行多元线性回归
! u+ c. [& f  k* I+ t1 B/ n( p. yn = 24; m = 3; % 每个变量均有24个数据,共有3个变量1 f; h  `! m7 x
X = [ones(n,1),x1',x2',x3'];
* {8 \7 M2 f* h( A2 @[b,bint,r,rint,s]=regress(Y',X,0.05) % 0.05为预定显著水平,判断因变量y与自变量之间是否具有显著的线性相关关系需要用到。
, o& D4 j, U( K! M运行结果如下:
$ t5 I  V7 |- Q5 }" |( V6 H8 M6 b( ~3 z. n: _/ ?& \, P
b =
2 B/ M( t8 i, [6 M% R1 Z2 C7 ]% t! _
   18.0157
/ M' w4 d; Q' W1 X5 p    1.0817' ?* o; O7 ~* \# }4 Y! G' P
    0.3212
' x  T# A, j9 t3 C. {$ b* `    1.2835+ v# b0 E% o8 V8 i! a* p
/ B4 x0 X% h% K( T
, k$ {- q/ g- C7 d
bint =: S9 U5 w# ~" w2 S  B( p

% I* R1 |' V# X+ Q2 g7 @- k   13.9052   22.1262# G) d" J& r6 N+ `0 T
    0.3900    1.77332 J9 X4 s7 S0 b$ D/ ~
    0.2440    0.3984
) k  D, }  b0 ?5 z    0.6691    1.8979
4 ^' D: s6 U" _* m$ [4 {4 {! d. g2 D
. K& I( `  N% `% j0 @+ J
r =
0 q/ G0 L8 h% A% a! y) V0 \4 e6 z; a$ {3 |' u) @  n5 e/ p
    0.6781
& p) Q0 H" l2 b: P; e, r/ ~    1.9129% |, `: Z" j, \, _
   -0.1119, L. r( W0 B' S9 u+ |; h' N
    3.3114
& [. B/ V$ o' s3 t7 F   -0.7424
6 Y- x! B6 D: Q7 o* z  P! w    1.2459
" _: {4 J! P% C+ O# }   -2.1022* s3 L' q, Y; B% X% c) i
    1.9650
7 r0 c6 y9 S9 G7 m! L9 ?   -0.31937 {" Z; o5 O( m: @/ e7 D
    1.34662 i9 R2 ]9 U8 l& p: O3 g
    0.8691  h) V$ R% o+ z, B6 \5 ~1 c
   -3.2637  A  T) k7 G8 E
   -0.5115# _' U8 u3 D4 u
   -1.1733
0 Z0 z  g5 ?& u9 B4 n# O9 O   -1.4910' |, H% f7 b1 h
   -0.2972/ l7 E( n3 h; ?9 \5 f) D
    0.1702
0 ~! C6 G4 Y# W, d1 h7 U! v    0.5799, g6 [, X- Y, B4 H6 Y
   -3.2856
# l! i* Z4 Y, q/ C1 T+ ^    1.1368
0 v) J! ^4 h# m2 Y, P   -0.8864. q3 G) I  `: _$ `
   -1.46464 ~5 [3 d( j" Y# E" a& ?
    0.8032
; c* m5 z; v2 W- H$ ~    1.6301
& P' I& [' f8 r4 D$ {& D. J% n1 n- W# ~, |& A2 x) E, p4 n

( w% t2 D$ g: g2 d9 _9 d+ Rrint =
6 Q8 {" n2 V8 b7 @* S( a, r: W2 s
   -2.7017    4.0580
9 X$ f4 _  m- R( _" i3 b   -1.6203    5.4461' @9 L: W9 q# u
   -3.6190    3.3951
# k: T- x$ U$ P/ x    0.0498    6.5729) ?7 o9 ~& k1 B3 c7 Q! {0 v) E
   -4.0560    2.5712/ A6 `$ f' v# J, [
   -2.1800    4.6717, [: O1 e* y' S/ G- d
   -5.4947    1.2902
" \+ a+ l9 p) L3 E( B' _" }- @+ n* W   -1.3231    5.2531
+ S) i* b! l; o# i   -3.5894    2.9507, J& Q& P& N: \  y6 i: ~5 A
   -1.7678    4.4609
1 j$ b3 [8 T9 {5 M; c/ M. g   -2.7146    4.4529) u2 @, a) U2 W- P) D- J  ~. O, \
   -6.4090   -0.1183
0 M/ q2 |" h3 G5 t7 }   -3.6088    2.5859) m* i3 x" ^, [7 a
   -4.7040    2.35758 H- ]7 z2 r2 _* q( [
   -4.8249    1.8429$ a' N" C/ E/ i! ~$ B' T& g
   -3.7129    3.1185. j0 D! \4 e6 t7 E8 E( r
   -3.0504    3.3907
" V; w  o" L+ [$ K/ J# d: g/ G3 A   -2.8855    4.0453
4 p4 K$ `4 E, R: y7 d- W   -6.2644   -0.3067* _7 a6 m' F  H4 w/ A0 w: ]
   -2.1893    4.4630( H) b4 k' ?( b
   -4.4002    2.62735 D9 r2 e( M, a* P
   -4.8991    1.9699+ ^0 u* P. b3 C0 ~4 l6 ]# y
   -2.4872    4.0937$ M: K* {! P  ]7 ]
   -1.8351    5.09542 E5 ?  T& `) @) A+ G6 B' j2 J
% f$ [  U6 U8 R: d% Y
0 `' h+ t+ Q" E9 E6 S) N
s =
' X1 _1 @6 `7 W+ K. D# X3 \) y+ C7 n8 l* ^  W
    0.9106   67.9195    0.0000    3.0719+ `2 b# g/ s. Z. e
看到如此长的运行结果,我们不要害怕,因为里面很多数据是没用的,我们只需提取有用的数据。
. Y4 N, J0 x9 D, `0 E3 E' M7 C
- U% Z4 d% \0 O4 c) V; o在运行结果中,很多数据我们不需理会,我们真正需要用到的数据如下:9 Z' c9 r7 I& `3 S( n
/ j! |2 x+ ^/ E4 s3 E
b =
2 y3 J" a1 m% {/ H- [+ u
! {4 [/ y4 W8 p   18.0157
5 c. Q$ r* W6 R6 Z9 ^# Q) ~! E    1.0817
* s: m, M5 `0 f' i9 [5 A    0.3212
- s" p  }- p. |# U    1.2835
! ^+ u# g0 u6 @5 |: g0 B; o( G9 q- e7 K% ]2 T7 A; X
s =
' K- J0 |8 x- C- y9 q5 y, M# N- G' N1 j, N: z; s/ `
    0.9106   67.9195    0.0000    3.0719
  B/ @' W# d  W4 P' F! J% g& T回归系数 b = (β0,β1,β2,β3) = (18.0157, 1.0817, 0.3212, 1.2835),回归系数的置信区间,以及统计变量 stats(它包含四个检验统计量:相关系数的平方R^2,假设检验统计量 F,与 F 对应的概率 p,s^2 的值)。观察表4的数据,会发现它来源于运行结果中的b和s:
1 E1 J$ {0 L2 D: q, U4 W. Y( k) @/ u1 q+ k
) t$ X! ?  N1 Z1 |3 d4 F
5 G* {8 Z! A# w+ \
根据β0,β1,β2,β3,我们初步得出回归方程为:
1 Q, v5 S+ U$ M, Y( v# j& d6 S7 ~3 p) s+ s

( a, v9 `# m, W' {  C
5 z' E! i( z8 B% f7 {& b8 y如何判断该回归方程是否符合该模型呢?有以下3种方法:8 d$ C. e' t* ^, G( Q

) g& ]" a; r% \/ h2 L% d" I1)相关系数 R 的评价:本例 R 的绝对值为 0.9542 ,表明线性相关性较强。
0 d) M1 l  _) d5 i
# @) w0 B0 b: t* e/ N7 Q2)F 检验法:当 F > F1-α(m,n-m-1) ,即认为因变量 y 与自变量 x1,x2,...,xm 之间有显著的线性相关关系;否则认为因变量 y 与自变量 x1,x2,...,xm 之间线性相关关系不显著。本例 F=67.919 > F1-0.05( 3,20 ) = 3.10。
6 K9 x, z/ W2 V; B7 ]; b8 a! g0 M3 O( }6 I: {; l! ], F
3)p 值检验:若 p < α(α 为预定显著水平),则说明因变量 y 与自变量 x1,x2,...,xm之间显著地有线性相关关系。本例输出结果,p<0.0001,显然满足 p<α=0.05。& s/ t' N) o7 Q  O; d) g- _- s

& s; Q0 k; ^; C: h以上三种统计推断方法推断的结果是一致的,说明因变量 y 与自变量之间显著地有线性相关关系,所得线性回归模型可用。s^2 当然越小越好,这主要在模型改进时作为参考。& T$ `( i- _$ C6 H. U$ [( C
/ K# a* `" ?" Z2 ~5 R( M, E/ ]
3. 逐步回归! N5 Y8 ]6 Y. @8 y

7 `9 R3 x$ ?8 J3 v* m[ 例4 ] (Hald,1960)Hald 数据是关于水泥生产的数据。某种水泥在凝固时放出的热量 Y(单位:卡/克)与水泥中 4 种化学成品所占的百分比有关:
! h' K! c8 v9 o3 H3 {
- G0 j( ^8 W8 N/ k' Y
* a9 F) T- C8 M' m+ F+ Z  B" l# C8 y! i% `' m
在生产中测得 12 组数据,见表5,试建立 Y 关于这些因子的“最优”回归方程。
$ C! s6 P  L$ ]& R6 ?: ?4 V  Z% N" N) E7 ^% ~9 M

: q; Z4 ~8 l7 E1 c/ A) G) B5 t# \
对于例 4 中的问题,可以使用多元线性回归、多元多项式回归,但也可以考虑使用逐步回归。从逐步回归的原理来看,逐步回归是以上两种回归方法的结合,可以自动使得方程的因子设置最合理。对于该问题,逐步回归的代码如下:
) \4 o" j0 S  w9 y
+ O. K# W0 e/ {" n# K# {" {%% 逐步回归- K' o+ V4 |% ^  X: `+ ~9 f/ g
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];   %自变量数据" u( y2 H& T% e/ r  }, {
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];  %因变量数据9 @3 S1 J9 v1 B8 \9 }0 H- F' t
stepwise(X,Y,[1,2,3,4],0.05,0.10)% in=[1,2,3,4]表示X1、X2、X3、X4均保留在模型中
0 z2 w0 J+ k! ?$ ^程序执行后得到下列逐步回归的窗口,如图 4 所示。
8 q  h$ d- O8 F; `% b: z1 J
+ B5 G, r- L% B& [
3 t2 C$ H$ N- t7 h+ t/ e( f
* P) w0 V* d( h- ?" w8 P5 E                                                                                                             图4" Y( O3 @+ k2 N

; b! H% w! f7 L1 k& p4 @% A9 S! u在图 4 中,用蓝色行显示变量 X1、X2、X3、X4 均保留在模型中,窗口的右侧按钮上方提示:将变量X4剔除回归方程(Move X4 out),单击 Next Step 按钮,即进行下一步运算,将第 4 列数据对应的变量 X4 剔除回归方程。单击 Next Step 按钮后,剔除的变量 X3 所对应的行用红色表示,同时又得到提示:将变量 X3 剔除回归方程(Move X3 out),单击 Next Step 按钮,这样一直重复操作,直到 “Next Step” 按钮变灰,表明逐步回归结束,此时得到的模型即为逐步回归最终的结果。最终结果如下:9 N5 W! u& b0 a2 f2 o2 B

4 Q4 [7 d/ _" n  g- w
+ M: J* ^& F, J& |- c% j5 Z) a9 q& Q5 i- s
4. 逻辑回归
% z; Z+ N7 }' C: ~% N
/ O5 E) Q& v, E8 H( x3 p[ 例5 ] 企业到金融商业机构贷款,金融商业机构需要对企业进行评估。评估结果为 0 , 1 两种形式,0 表示企业两年后破产,将拒绝贷款,而 1 表示企业 2 年后具备还款能力,可以贷款。在表 6 中,已知前 20 家企业的三项评价指标值和评估结果,试建立模型对其他 5 家企业(企业 21-25)进行评估。
7 g& N5 `" J5 K+ B: b1 C" |
2 ?3 r9 {. ]% u. v1 N$ b8 f
& c" d4 e; r# ?" a. `8 ^$ m' S3 R# b/ J$ f+ ~$ Y+ t' C/ W& l5 @
对于该问题,很明显可以用 Logistic 模型来回归,具体求解程序如下:1 ?" _  B9 |' [5 U" Z) K" x
' O0 h2 {* I9 p" F! Y6 L# g
程序中需要用到的数据文件logistic_ex1.xlsx已上传github:https://github.com/xiexupang/mathematical-modeling/tree/master/%E5%9B%9E%E5%BD%92/%E9%80%BB%E8%BE%91%E5%9B%9E%E5%BD%925 Z" z* B6 p  D0 P
5 i  ^/ @1 o' ]* D1 |
% logistic回归
) z1 \$ M, f/ L- Z# }! l; R
% K: ~5 d1 q& G$ F. @8 M( ]% x%% 导入数据% u, ]  C; J2 l. |
clc,clear,close all! h, m/ i; Y9 a2 T! [. X3 q5 f
X0 = xlsread('logistic_ex1.xlsx','A2:C21'); % 前20家企业的三项评价指标值,即回归模型的输入' |, X- F" d& E# L9 E9 Y
Y0 = xlsread('logistic_ex1.xlsx','D221'); % 前20家企业的评估结果,即回归模型的输出: T9 o/ G5 s( {
X1 = xlsread('logistic_ex1.xlsx','A2:C26'); % 预测数据输入
* j( Z9 F0 A( x% N3 k6 K: j4 J/ w$ \9 e- f' P% V3 ?
%% 逻辑函数. d2 E$ ?: k4 p4 r- y) G; d& ]
GM = fitglm(X0,Y0,'Distribution','binomial');7 i( X& X9 P5 R; R* q6 @
Y1 = predict(GM,X1);
6 h* x8 `# a, d( |3 {% |7 M8 I
0 D( w; w3 h' F9 z& J  Z3 \2 k%% 模型的评估
' F6 [1 R! `" Z2 L( ]* ~/ FN0 = 1:size(Y0,1); % N0 = [1,2,3,4,……,20]6 z# W, I$ q( R0 K
N1 = 1:size(Y1,1); % N1 = [1,2,3,4,……,25]# q5 G3 d3 P* j- _9 _
plot(N0',Y0,'-kd'); % N0'指的是对N0'进行转置,N0'和Y0的形式相同,该行代码绘制的是前20家企业的评估结果1 [5 o: Q/ }5 z, u& R% Y8 T
% plot()中的参数'-kd'的解析:-代表直线,k代表黑色,d代表菱形符号
3 [; o" \. q$ C, f2 s1 a$ c4 F; _. Zhold on;
& B% @" A4 ~) e5 @# J) p% Escatter(N1',Y1,'b'); % N1'指的是对N1'进行转置,N1'和Y1的形式相同
5 O. _7 V  _/ D' t4 Axlabel('企业编号');6 B& v+ Y( Z" r  j9 b
ylabel('输出值');1 [& P, ~5 {0 _5 w
得到的回归结果与原始数据的比较如图5所示。
  G6 G3 Y$ r5 Y- F3 q  ?/ H
: }) R5 ?& x, p4 m0 l$ P" q9 L# j: g
! n! }2 N0 w# u0 L9 O8 O* {
                                                                   图58 _4 H3 m" i) N2 P6 Q

1 o0 H8 i; [) q, q4 u  |三、总结与感悟。
. }+ r4 X2 @' i" \1 s' Q0 A4 {8 ?6 p+ r5 G
        总结:通过这次学习,我了解到Matlab在数学建模竞赛中使用广泛;在评估股票价值与风险的小实例中,我掌握了用Matlab去建模的基本方法和步骤;在回归算法的学习过程中,我掌握了一元线性回归、一元非线性回归、多元线性回归、逐步回归、逻辑回归的算法。" U* f2 W3 i* v- _! L. x' |8 x+ r
  S0 {8 u  Y* f
        感悟:正确且高效的 MATLAB 编程理念就是以问题为中心的主动编程。我们传统学习编程的方法是学习变量类型、语法结构、算法以及编程的其他知识,因为学习时候是没有目标的,也不知道学的知识什么时候能用到,收效甚微。而以问题为中心的主动编程,则是先找到问题的解决步骤,然后在 MATLAB 中一步一步地去实现。在每步实现的过程中,遇到问题,查找知识(互联网时代查询知识还是很容易的),定位方法,再根据方法,查询 MATLAB 中的对应函数,学习函数用法,回到程序,解决问题。在这个过程中,知识的获取都是为了解决问题的,也就是说每次学习的目标都是非常明确的,学完之后的应用就会强化对知识的理解和掌握,这样即学即用的学习方式是效率最高,也是最有效的方式。最重要的是,这种主动的编程方式会让学习者体验到学习的成就感的乐趣,有成就感,自然就强化对编程的自信了。这种内心的自信和强大在建模中会发挥意想不到的力量,所为信念的力量。' {% i( X! X* Q) O

. o$ m0 S% f- U8 v6 D2 \+ a% L* r5 C1 j2 V& e
7 {+ p4 r% x  }3 j
8 D2 E1 p( E, T4 Y# Z( _

: v0 T2 i7 S) ~' r6 Z+ O6 i




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5