数学建模社区-数学中国

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

作者: 杨利霞    时间: 2019-4-10 15:18
标题: Matlab数学建模学习报告(一)
Matlab数学建模学习报告(一); E  h2 C) u! A0 r  L9 T# c
一、学习目标。

(1)了解Matlab与数学建模竞赛的关系。

(2)掌握Matlab数学建模的第一个小实例—评估股票价值与风险。

(3)掌握Matlab数学建模的回归算法。

2 m2 P4 g+ z7 ]2 ?& u
二、实例演练。  B7 ^( `# E! ^* x; Z% Y
) w) q: Z$ }# J  L9 E, D; s
   1、谈谈你对Matlab与数学建模竞赛的了解。
1 n+ f  U# X' s5 |, D( }: M6 k$ {# F! F: i4 j/ n, Q2 y9 C
        Matlab在数学建模中使用广泛:MATLAB 是公认的最优秀的数学模型求解工具,在数学建模竞赛中超过 95% 的参赛队使用 MATLAB 作为求解工具,在国家奖队伍中,MATLAB 的使用率几乎 100%。虽然比较知名的数模软件不只 MATLAB。* z5 l# Y' _4 t' d/ ]

" |$ k  C1 k  g) V        人们喜欢使用Matlab去数学建模的原因:3 O- n7 |* l4 d& _7 d3 L$ ^7 w

+ u. y  ~: g1 U+ F. O(1)MATLAB 的数学函数全,包含人类社会的绝大多数数学知识。
" [! L* N3 V# K/ A
7 _% F1 r; @; b) c(2)MATLAB 足够灵活,可以按照问题的需要,自主开发程序,解决问题。, o' r+ j/ p" }- Q4 d( f

  U" X4 Z8 q# K! @: _, R4 k(3)MATLAB易上手,本身很简单,不存在壁垒。掌握正确的 MATLAB 使用方法和实用的小技巧,在半小时内就可以很快地变成 MATLAB 高手了。% a$ I) ?9 P8 R0 H$ }

2 c4 }/ J# L$ c8 n# Z        正确且高效的 MATLAB 编程理念就是以问题为中心的主动编程。我们传统学习编程的方法是学习变量类型、语法结构、算法以及编程的其他知识,因为学习时候是没有目标的,也不知道学的知识什么时候能用到,收效甚微。而以问题为中心的主动编程,则是先找到问题的解决步骤,然后在 MATLAB 中一步一步地去实现。在每步实现的过程中,遇到问题,查找知识(互联网时代查询知识还是很容易的),定位方法,再根据方法,查询 MATLAB 中的对应函数,学习函数用法,回到程序,解决问题。在这个过程中,知识的获取都是为了解决问题的,也就是说每次学习的目标都是非常明确的,学完之后的应用就会强化对知识的理解和掌握,这样即学即用的学习方式是效率最高,也是最有效的方式。最重要的是,这种主动的编程方式会让学习者体验到学习的成就感的乐趣,有成就感,自然就强化对编程的自信了。这种内心的自信和强大在建模中会发挥意想不到的力量,所为信念的力量。" @" X* Y$ |% i  ]: X
) l* C4 Y9 J" y0 d5 L0 t
         数学建模竞赛中的 MATLAB 水平要求:
# K- y. R. v( d5 K; n7 j9 t5 Q  K7 Q* g
要想在全国大学生数学建模竞赛中拿到国奖, MATLAB 技能是必备的。 具体的技能水平应达到:
' g# h2 T/ ]9 E5 {* @5 }( T4 }4 D8 j
1)了解 MATLAB 的基本用法,包括几个常用的命令,如何获取帮助,脚本结构,程序的分节与注释,矩阵的基本操作,快捷绘图方式;+ v/ `) d$ H! ?6 a# Z. W8 A
$ ]0 E+ E% F/ ?. f2 j
2)熟悉 MATLAB 的程序结构,编程模式,能自由地创建和引用函数(包括匿名函数);, S% {$ j, p' O& y

; y* L: ?# t- H% R; G7 c3)熟悉常见模型的求解算法和套路,包括连续模型,规划模型,数据建模类的模型;1 n8 s1 H: ~9 J7 w$ Y% H
" Y2 d- n* Q5 S& K. @8 f
4)能够用 MALTAB 程序将机理建模的过程模拟出来,就是能够建立和求解没有套路的数学模型。
$ `9 S8 [" f# H4 C# m. X. H# W1 H& d8 x0 U6 `
要想达到如上要求, 不能按照传统的学习方式一步一步地学习, 而要结合上述提到的学习理念制定科学的训练计划。
/ G( V  Y% Z" Y% W+ y% f% C+ E" i: N( x! Q) `. S8 l" V0 |: n" H
  2、已知股票的交易数据:日期、开盘价、最高价、最低价、收盘价、成交量和换手率,试用某种方法来评价这只股票的价值和风险。如何用MATLAB去求解该问题?(交易数据:点击此处获取数据)3 o8 _. y1 \% c9 k) b8 Y

1 s+ O) u' X& l1 F/ [解题步骤:
* l# u7 O9 C" b
3 b% c& {; ~: X; T) i第一阶段:从外部读取数据
% _  t: c" _3 M$ L  @! K3 N$ @: g$ B0 j# p* W' i- Z* Q
Step1.1:把数据文件sz000004.xls拖曳进‘当前文件夹区’,选中数据文件sz000004.xls,右键,将弹出右键列表,很快可发现有个“导入数据”菜单,如图 1 所示。
4 M. R7 H5 L0 _5 ?3 ^; E$ h
, t- G2 g1 N1 v- M9 C
' g- D8 K' p& K0 v* e- u4 k# J  I! |, G
                                                                  图1. 启动导入数据引擎示意图8 G1 K0 m, B! V. I
' [  [9 D' l+ z' R9 l
Step1.2:单击“导入数据”这个按钮,则很快发现起到一个导入数据引擎,如图 4 所示。* u( B' _8 g5 q' Z9 _

0 r  K0 @( a' Z+ d4 E$ L+ r
& q2 q! B# L1 J& g. H% A: z7 z$ A9 y, L; {- l
                                                                    图2. 导入数据界面
% ~3 z" p! H3 H$ ?9 D
, V) h. `* n5 E6 GStep1.3:观察图 2,在右上角有个“导入所选内容”按钮,则可直接单击之。马上我们就会发现在 MATLAB 的工作区(当前内存中的变量)就会显示这些导入的数据,并以列向量的方式表示,因为默认的数据类型就是“列向量”,当然您可以可以选择其他的数据类型,大家不妨做几个实验,观察一下选择不同的数据类型后会结果会有什么不同。至此,第一步获取数据的工作的完成。
  l& _1 I4 c& V1 O* o5 s' }/ K2 D: @( E
4 c; u3 t) N" j: \/ F. ^/ c
6 Q: [6 y7 L4 L- a+ P1 U
第二阶段:数据探索和建模
4 P4 R' J8 O. h
  G1 |8 p$ m; w  ^( o+ @4 y0 ~现在重新回到问题,对于该问题,我们的目标是能够评估股票的价值和风险,但现在我们还不知道该如何去评估,MATLAB 是工具,不能代替我们决策用何种方法来评估,但是可以辅助我们得到合适的方法,这就是数据探索部分的工作。下面我们就来尝试如何在 MATLAB 中进行数据的探索和建模。
% w# i9 ?7 X! C/ F+ r: p4 F* f8 B9 P4 {- _# J: s
Step2.1:查看数据的统计信息,了解我们的数据。具体操作方式是双击工具区(直接双击这三个字),此时会得到所有变量的详细统计信息。通过查看这些基本的统计信息,有助于快速在第一层面认识我们所正在研究的数据。当然,只要大体浏览即可,除非这些统计信息对某个问题都有很重要的意义。数据的统计信息是认识数据的基础,但不够直观,更直观也更容易发现数据规律的方式就是数据可视化,也就是以图的形式呈现数据的信息。下面我们将尝试用 MATLAB 对这些数据进行可视化。) F/ I+ c  Y% O3 h( _$ X2 ?
0 V0 m. g/ u' |; u8 J
由于变量比较多,所以还有必要对这些变量进行初步的梳理。对于这个问题,我们一般关心收盘价随时间的变化趋势,这样我们就可以初步选定日期(DateNum)和收盘价(Pclose)作为重点研究对象。也就是说下一步,要对这这两个变量进行可视化。
; b4 }# U, j8 o8 e; @2 `
9 W: X: A8 }: u# I0 |对于一个新手,我们还不知道如何绘图。但不要紧,新版 MATLAB 提供了更强大的绘图功能——“绘图”面板,这里提供了非常丰富的图形原型,如图 3 所示。
, A1 M' g" H5 t9 m, T
5 u1 y$ ]& y# Z5 T9 r$ y9 C) v# L; O& c0 F+ b$ e9 f

" U. V; l+ k' g7 @' f  }! E7 M                                                                                 图3 MATLAB绘图面板中的图例8 u+ o, m2 E8 Z/ q
6 |+ Z: K- ]2 H
要注意,需要在工作区选中变量后绘图面板中的这些图标才会激活。接下来就可以选中一个中意的图标进行绘图,一般都直接先选第一个(plot)看一下效果,然后再浏览整个面板,看看有没有更合适的。下面我们进行绘图操作。
8 A" ^% A" g: b7 t& T2 D- a2 H: z1 X3 g. J+ B5 m
Step2.2:选中变量 DataNum 和 Pclose,在绘图面板中单机 plot 图标,马上可以得到这两个变量的可视化结果,如图 4 所示,同时还可以在命令窗口区看到绘制此图的命令:2 o/ G7 B: p% K

0 I" X3 A! B7 l" r0 K9 t>> plot(DateNum,Pclose)
1 ^* Q( N. i- I, Y! x
5 g- V8 b" {9 m/ Z* f3 e0 M0 T1 ^; ?& {0 Q9 R

; o6 e9 E* G0 y: k7 {                                                                                       图4 通过 plot 图标绘制的原图
* }! `% @  @0 {$ ], }5 C' g0 c' G7 }. O( j- A2 [
这样我们就知道了,下次再绘制这样的图直接用 plot 命令就可以了。一般情况下,用这种方式绘图的图往往不能满足我们的要求,比如我们希望更改:) l7 F3 `) W$ w

; I' c6 ^1 ?/ a! x( y+ A; }. ]9 j(1)曲线的颜色、线宽、形状;
+ [6 z2 u2 \- W; h+ e! Z: h4 c( x  J' l
(2)坐标轴的线宽、坐标,增加坐标轴描述;* Q" l7 M7 j% B- |8 A7 c. e
) G0 L7 `- b# K7 K) ]  B' q
(3)在同个坐标轴中绘制多条曲线。/ L8 u4 x( b1 _6 s$ y% G

8 R0 _8 `! i8 \. D9 n4 N/ H7 \; O此时我们就需要了解更多关于命令 plot 的用法,这时就可以通过 MATLAB 强大的帮助系统来帮助我们实现期望的结果。最直接获取帮助的两个命令是 doc 和 help,对于新手来说,推荐使用 doc,因为 doc 直接打开的是帮助系统中的某个命令的用法说明,不仅全,而且有应用实例,这样就可以“照猫画虎”,直接参考实例,从而将实例快速转化成自己需要的代码。7 f9 \7 Y. L, H) Q
" a& M3 @: J- @. c4 @
接下来我们就要考虑如何评估股票的价值和风险呢?' P! P' n( N# U/ ~6 I% @: V8 N2 R
: `/ w' ]' P/ {  [1 s5 K3 B
         对于一只好的股票,我们希望股票的增幅越大越好,体现在数学上,就是曲线的斜率越大越好。
' J1 T& E( |0 Y8 {7 `9 b
. F3 |! O& J' |         对于风险,则可用最大回撤率来描述更合适,什么是最大回撤率?/ @  F4 `2 w' l0 }

: ^& Q( z" T3 e! V: ?         最大回撤率的公式可以这样表达:+ w* ?$ d: G! P% |8 f3 c+ {
! O9 p9 s/ @, C0 K) Z  N9 L
D为某一天的净值,i为某一天,j为i后的某一天,Di为第i天的产品净值,Dj则是Di后面某一天的净值
2 c8 D$ W) D" R+ V' ^9 y! X' I0 i! g' c: Z7 C( ~
drawdown=max(Di-Dj)/Di,drawdown就是最大回撤率。其实就是对每一个净值进行回撤率求值,然后找出最大的。可以使用程序实现。最大回撤率越大,说明该股票的风险越高。所以最大回撤率越小,股票越好。9 ?/ B5 D8 x) ~& {( G

" H' H( V; V7 n. }9 _* r0 N           斜率和最大回撤率不妨一个一个来解决。我们先来看如何计算曲线的斜率。对于这个问题,比较简单,由于从数据的可视化结果来看,数据近似成线性,所以不妨用多项式拟合的方法来拟合该改组数据的方程,这样我们就可以得到斜率。5 `7 Z+ i  b8 a1 ^
1 }0 w9 C$ \; `1 r& H0 L9 T
Step2.3:通过polyfit()多项式拟合的命令,并计算股票的价值,具体代码为:2 G) p* ?3 t" ?% D

. J; v& D' T1 q( l! k5 Q; L>> p = polyfit(DateNum,Pclose,1); % 多项式拟合
. s3 m/ w: x+ l" z1 g1 W% Y3 Y+ e3 B4 m" R" n. o- S
>> value = p(1) % 将斜率赋值给value,作为股票的价值
& E" ]9 k' F- W+ v* s0 _, b
5 i9 R& a- h8 c. F$ d) t2 hvalue =4 S+ M) w3 _6 q. [
; N# c2 P- U( p  t$ T
    0.1212
& W- ~+ s' R2 t/ g2 P
8 [' _! A2 c7 X! X: ?0 X# n代码分析:%后面的内容是注释。polyfit()有三个参数,前两个大家都能明白是什么意思,那第三个参数是什么意思呢?它表示多项式的阶数,也就是最高次数。比如:在本例中,第三个参数为1,说明其为一次项,即一次函数。第三个参数为你要拟合的阶数,一阶直线拟合,二阶抛物线拟合,并非阶次越高越好,看拟合情况而定。polyfit()返回阶数为 n 的多项式 p(x) 的系数,p 中的系数按降幂排列。在本例中的P(1)指的是最高项的系数,即斜率。8 X% ]. m! W* Q" C8 @

) u. j7 R7 d6 S; x8 i4 HStep2.4:用相似的方法,可以很快得到计算最大回撤的代码:) D( D- Y# j3 i+ F% F+ h
- p' t* p: v2 B# Z4 `/ ]
>> MaxDD = maxdrawdown(Pclose); % 计算最大回撤2 N" m+ k1 R, ^
6 }* B- {# F$ o* \
>> risk = MaxDD  % 将最大回撤赋值给risk,作为股票的风险
7 p  A& v# ^% ~6 e" d# _2 e  v4 h5 i6 x" N: B$ j
risk =
" v7 {0 u4 i5 }& ~- c/ C) ~; d7 c
    0.1155. [$ R4 S+ g6 u0 ~! c
0 M; c0 K( i1 G  [
代码分析:最大回撤率当然计算的是每天收盘时的股价。最大回撤率越大,说明该股票的风险越高。所以最大回撤率越小,股票越好。
9 l, ~6 ]9 |: V+ a6 G6 @1 Q. I  o6 j5 j9 N. g: I
到此处,我们已经找到了评估股票价值和风险的方法,并能用 MALTAB 来实现了。但是,我们都是在命令行中实现的,并不能很方便地修改代码。而 MATLAB 最经典的一种用法就是脚本,因为脚本不仅能够完整地呈现整个问题的解决方法,同时更便于维护、完善、执行,优点很多。所以当我们的探索和开发工作比较成熟后,通常都会将这些有用的程序归纳整理起来,形成脚本。现在我们就来看如何快速开发解决该问题的脚本。
1 K# e% v5 `# l$ V2 A
: W! k! N4 B; N  F# y4 \Step2.5:像 Step1.1 一样,重新选中数据文件,右键并单击“导入数据”菜单,待启动导入数据引擎后,选择“生成脚本”,然后就会得到导入数据的脚本,并保存该脚本。5 n) |2 P8 l) F" {5 @( s: H" I

7 e7 P# l: i2 r, [脚本源代码中有些地方要注意:) |' {5 P. V; z4 r( h+ ~

& V: a; e% u7 {) m; o       %%在matlab代码中的作用是将代码分块,上下两个%%之间的部分作为一块,在运行代码的时候可以分块运行,查看每一块代码的运行情况。常用于调试程序。%%相当于jupyter notebook中的cell。2 w9 `! r$ N1 K9 l

# h& Y- _1 |4 }8 s       %后的内容是注释。
# J/ `. H& v: h; y6 e
0 |' c% \2 i; _  \        每句代码后面的分号作用为不在命令窗口显示执行结果。& Y5 s/ z0 D1 S' O

: }( o4 ?4 L; ^$ B/ ]脚本源代码:
4 Q4 u$ c- [3 i! L; U3 i: @7 \+ _9 I3 a  n* c$ M7 ^
%% 预测股票的价值与风险
* D, l) \) Z( A# E
# [3 o( n+ U+ f* Q& p1 z%% 导入数据
& S7 L! h- u& pclc, clear, close all
$ q* j! F2 ], v% clc:清除命令窗口的内容,对工作环境中的全部变量无任何影响
9 J! C* v+ v  k6 Q, C! r* P9 A/ P% clear:清除工作空间的所有变量 9 U$ [+ _$ [: T7 }1 O7 J
% close all:关闭所有的Figure窗口
9 @2 S" W6 Y1 b* Z; ?, G5 h6 V$ |+ c. B! y9 m
% 导入数据4 E7 P7 U! m; @6 d; X$ m$ a* x
[~, ~, raw] = xlsread('sz000004.xlsx', 'Sheet1', 'A2:H7');
2 n# D# O7 V2 U" b7 a! l! q% w% [num,txt,raw],~表示省略该部分的返回值% L4 c$ s5 n$ w5 Z
% xlsread('filename','sheet', 'range'),第二个参数指数据在sheet1还是其他sheet部分,range表示单元格范围
: c5 p7 {5 X3 T# f! \# [2 i9 Q* ^% V* c2 A% `
% 创建输出变量
2 F& V; F( s& Q! e* ~3 _+ Hdata = reshape([raw{:}],size(raw));
7 C' ?/ |6 f: C% [raw{:}]指raw里的所有数据,size(raw):6 x 8 ,该语句把6x8的cell类型数据转换为6x8 double类型数据: [& n2 m4 x* u1 |0 b$ P
1 r) u" O0 b- }  ~) o
% 将导入的数组分配列变量名称
* q3 ?' r+ s% O. EDate = data(:, 1); % 第一个参数表示从第一行到最后一行,第二个参数表示第一列
: m" W* b* B# cDateNum = data(:, 2);( Q% l4 d& m+ e  B( y; [) c
Popen = data(:, 3);6 G: l' `' w2 c+ c- r/ I+ w
Phigh = data(:, 4);
% a) m, {  G2 q% y0 v8 D5 m: TPlow = data(:, 5);: T3 O" H7 b% J4 m. ?: \% v
Pclose = data(:, 6);  ) X% S1 R4 ~+ @% S* D
Volum = data(:, 7); % Volume 表示股票成交量的意思,成交量=成交股数*成交价格 再加权求和/ c: M  V8 c: i( F
Turn = data(:, 8); % turn表示股票周转率,股票周转率越高,意味着该股股性越活泼,也就是投资人所谓的热门股
: Y( ^  K- _7 E, j; M; P( N( m' b- x- s+ O+ u' o
% 清除临时变量data和raw
$ G" T* Q' [/ S* q+ Sclearvars data raw;
' |9 a7 T6 m5 `  {
3 G  f. g9 l6 ]* ]( ]- y%% 数据探索  Y4 M' f  H/ V8 ~& {; {* Q
% O7 ~8 g# ?/ Z0 }1 X& o! k* i
figure % 创建一个新的图像窗口8 ?% u( W! B2 }' Y
plot(DateNum, Pclose, 'k'); % 'k',曲线是黑色的,打印后不失真
: P3 ?2 X! L, j' p$ }datetick('x','mm-dd'); % 更改日期显示类型。参数x表示x轴,mm-dd表示月份和日。yyyy-mm-dd,如2018-10-27
- n& S- K! e% h2 y7 h" sxlabel('日期') % x轴
0 r# ]6 p; @3 `: wylabel('收盘价') % y轴
; [$ f( \, _3 C% Dfigure
! c9 N" C1 D1 I  _+ qbar(Pclose) % 作为对照图形
- I0 X9 K& i) W! J) E& }" E4 p
6 v8 ^. r( r* B0 m9 f%% 股票价值的评估
5 N2 w4 L  W2 b2 J9 \% M4 U" G  r9 a" b3 Q
p = polyfit(DateNum, Pclose, 1); % 多项式拟合
) v' \) \7 d- N/ U% polyfit()返回阶数为 n 的多项式 p(x) 的系数,p 中的系数按降幂排列
/ T; H& _5 h  G& qP1 = polyval(p,DateNum); % 得到多项式模型的结果
9 V: e+ S1 T0 S2 |; |/ ]figure* E0 w5 o$ y' g
plot(DateNum,P1,DateNum,Pclose,'*g'); % 模型与原始数据的对照, '*g'表示绿色的*
9 @$ @* {* \& q4 x/ b, U- u3 S/ ~value = p(1) % 将斜率赋值给value,作为股票的价值。p(1)最高项的次数' O4 O$ s8 ~- T& r3 ?; F* A. h- e
! G, Y* \+ g$ b
%% 股票风险的评估, M) l) ?8 ]9 g3 A3 m( j
MaxDD = maxdrawdown(Pclose); % 计算最大回撤
+ E2 `' W0 Q  ~  qrisk = MaxDD  % 将最大回撤赋值给risk,作为股票的风险
# q# j) S' s* o- K  3、回归算法演练。+ x" o/ v% x; f% ^
6 E# [# ~7 Y8 K( L2 ?+ X
(1)一元线性回归
) V4 H5 I8 S6 q% u& R9 y& J' H6 J& Z- C- ]; s. {3 E5 B- p# p
[ 例1 ] 近 10 年来,某市社会商品零售总额与职工工资总额(单位:亿元)的数据见表1,请建立社会商品零售总额与职工工资总额数据的回归模型。
: x0 r# o+ i: [5 i' Q
; N$ s8 x& ?7 n
6 d4 Z5 m+ ~- r& P( R0 n# B% C: q$ m1 \, K/ K  y, ~, E+ _# a
该问题是典型的一元回归问题,但先要确定是线性还是非线性,然后就可以利用对应的回归方法建立他们之间的回归模型了,具体实现的 MATLAB 代码如下:
0 _7 ~- l. Y0 Q2 S, o9 D" ^! E1 w
2 D$ L' g* Q* \; n' r8 V. _$ u(1)输入数据2 u: c+ O0 W$ B* P, S* |
6 k* e; z& B+ }6 n  b3 l" V) E
%% 输入数据
/ n: \: x8 M- Oclc, clear, close all; t3 b+ S: r+ D7 `; u
% 职工工资总额
) i+ W  W- Y" x. Tx = [23.8,27.6,31.6,32.4,33.7,34.90,43.2,52.8,63.8,73.4];0 S$ w4 V: G; p2 x9 D* Q7 R
% 商品零售总额# b# F& V! p& d% N  ^% l3 W
y = [41.4,51.8,61.7,67.9,68.7,77.5,95.9,137.4,155.0,175.0];
8 \/ ?; b9 h( t) q# A( H(2)采用最小二乘回归9 Q; [* o! N* S9 Y/ l5 i
4 P( O. z, Y5 E
%% 采用最小二乘法回归" H) |' N, [: l7 W3 _
% 作散点图
. W0 r: ^: B; Pfigure) \2 y$ K7 W* K$ @. }( w
plot(x,y,'r*') % 散点图,散点为红色
% y8 q% t: N& U9 U" wxlabel('x(职工工资总额)','fontsize',12)
) W3 R7 z2 E. Y* I6 ]2 Yylabel('y(商品零售总额)','fontsize',12)
: f$ g8 ^. l0 J6 pset(gca, 'linewidth',2) % 坐标轴线宽为2* V& v" C4 T  U
  n. q0 x" m. B  [7 M0 p) Q, h
% 采用最小二乘法拟合2 |3 O% {' w6 l4 Q  n
Lxx = sum((x-mean(x)).^2); %在列表运算中,^与.^不同0 F1 C3 B6 ]5 S% ~/ @% ]$ q
Lxy = sum((x-mean(x)).*(y-mean(y)));
) V: A! _! i4 q$ Sb1 = Lxy/Lxx;4 `5 x, N: g0 f& ~8 z, c
b0 = mean(y) - b1 * mean(x);6 x5 L2 _! y0 E6 l
y1 = b1 * x + b0;3 e. C, H9 C7 b# g
% L' ]* N: j& A, p3 h
hold on % hold on是当前轴及图像保持而不被刷新,准备接受此后将绘制的图形,多图共存2 `+ X, ?6 F% S9 \% d
plot(x,y1, 'linewidth',2);$ f% M9 q2 y& s. ?9 _" E) d
运行本节程序,会得到如图5所示的回归图形。在用最小二乘回归之前,先绘制了数据的散点图,这样就可以从图形上判断这些数据是否近似成线性关系。当发现它们的确近似在一条线上后,再用线性回归的方法进行回归,这样也更符合我们分析数据的一般思路。3 e: T& @! _- n

! Z3 k! _7 j( x& Q8 k/ b9 i. h# |! m- e- ~" b; B4 o6 G" G7 F1 Y3 e. A

! ]  J: j. c1 d* L! P                                                                                                    图56 J9 J: D' u% Y+ ]2 ~' c  J

. V5 E8 l4 g, P(3)采用 LinearModel.fit 函数进行线性回归
# @0 B- ~: u6 _! u5 ~$ F3 y$ E3 a4 I3 U( s: ^  N, |' u. l
%% 采用 LinearModel.fit 函数进行线性回归# v) F: d! q" W, \, m7 s
m2 = LinearModel.fit(x, y)) y1 e2 q9 e! [1 s! v: A* q  ?  c
运行结果如下:. u& ?% y# |5 q% h  G3 m( {3 ^

, ]' R: ]3 z& \+ G; j, a) Y0 q% nm2 =
, v9 i, }& O. x7 }2 T9 D! y" q% ]1 y( f$ C5 @8 H
Linear regression model:
* M% `! d0 d& T& c( J8 E+ g5 @% k  W6 u. Y1 d# j" E
    y ~ 1 + x1
- w% }1 s0 t" |+ m: P# d& KEstimated Coefficients:
( g/ P% X3 t, y3 t
, ]- a" Z" m0 j7 H* c+ P               Estimate      SE       tStat       pValue ; }7 `4 \# H" I: F$ f

! l8 A4 g& h+ B: C% E: a    (Intercept)    -23.549      5.1028    -4.615     0.0017215
2 g- g$ n- E0 D1 j; k" V# A( F9 Y( f3 X* F/ w
    x1           2.7991     0.11456    24.435    8.4014e-09! A$ M3 r: {2 E3 O

) |# G' M: a  Q4 z, R* F3 RR-squared: 0.987,  Adjusted R-Squared 0.985$ ]9 Y  c! k& V. W! r
, ]' v0 K+ s3 M5 Q
F-statistic vs. constant model: 597, p-value = 8.4e-09
% [- K5 E1 ?" j2 Q& ]
6 J) e5 H6 G4 E) F" F如下图,我们只需记住-23.594是一次函数的中x的系数,2.7991是一次函数中的常数项即可,其它的不用理会。; @- f1 q7 k2 X2 L" T
  M) H4 U0 P% g! Z' s! ~
: E# N( _, ]/ D; ~6 U

/ l" i5 j* o& j4)采用 regress 函数进行回归
( ?* k7 [, ?' B4 F, ]$ i3 C& l* r/ s
%% 采用 regress 函数进行回归
9 s9 D7 Y  R' t6 M) BY = y'
0 I8 t) B5 k1 fX = [ones(size(x,2),1),x']
0 |9 O+ E& [" |7 P[b,bint,r,rint,s] = regress(Y,X)
/ {+ z( s' ~) j运行结果如下:+ r( D9 w1 l3 E9 k6 E
" |1 i- x5 ?: V# G) F
b =/ {/ K3 P! c9 e) e9 }" W( v
3 ~1 o6 j! X6 B0 b
  -23.5493: i+ }  i+ E8 H

3 [3 S/ t6 C  m; P2 A. Y8 R    2.7991
6 D/ L9 k8 \5 h6 T) x9 A6 E1 c; U" L8 s1 B7 ~( T
我们只需记住-23.594是一次函数的中x的系数,2.7991是一次函数中的常数项即可,其它的不用理会。8 v) e, p& K* X/ Z5 ~
& m* G3 G: C9 T8 n6 ]  z1 ?9 N3 Z
(2)一元非线性回归( \* S7 L$ n* T, K, _9 e  K; s

( l5 j& a5 N0 g1 ]4 X[ 例2 ] 为了解百货商店销售额 x 与流通率(这是反映商业活动的一个质量指标,指每元商品流转额所分摊的流通费用)y 之间的关系,收集了九个商店的有关数据(见表2)。请建立它们关系的数学模型。  u4 {' U) n2 s$ E* M, b
8 G9 W, x$ Y7 g( b
# U. V! }' g: L
& L( p/ U) t: w  N

) r4 j5 N+ r" G
6 _1 }1 `- c4 |- O, @. l        为了得到 x 与 y 之间的关系,先绘制出它们之间的散点图,如图 2 所示的“雪花”点图。由该图可以判断它们之间的关系近似为对数关系或指数关系,为此可以利用这两种函数形式进行非线性拟合,具体实现步骤及每个步骤的结果如下:
3 t/ p) w  \7 |; ]8 p9 `  T+ x/ F3 b, P: W
(1)输入数据
  {4 h4 ]8 G) B1 |$ h  _5 d9 }* f/ T2 n" e5 d' \7 C4 {' s
%% 输入数据
. q. q2 Q, e+ zclc, clear all, close all2 v& H4 f. K; g
x = [1.5, 4.5, 7.5,10.5,13.5,16.5,19.5,22.5,25.5];
" y: ^; |9 {1 A, C" U- |y = [7.0,4.8,3.6,3.1,2.7,2.5,2.4,2.3,2.2];7 ]3 a, b; j( J7 w! D6 Z
plot(x, y, '*', 'linewidth', 1) % 这里的linewidth指的是散点大小
& G+ d3 X* d# z! U2 z) C$ J% C3 Jset(gca,'linewidth',2) % 设置坐标轴的线宽为2
& f+ a+ ~1 F. Sxlabel('销售额x/万元','fontsize',12)! Y% A' ]* R; i- f' ]% z
ylabel('流通率y/%','fontsize',12)# ^, v$ ]0 A* x# {
(2)对数形式非线性回归( C5 W8 c  l' H; \& Y9 K
6 `9 ~$ \" c2 l2 }- B5 `3 D
%% 对数形式非线性回归
3 ~/ n* @& j- L& u) C8 B0 Z! i# Q- Lm1 = @(b,x) b(1) + b(2)*log(x);) X( ]- m' T5 j
nonlinfit1 = fitnlm(x,y,m1,[0.01;0.01])- j& i* M% G+ {5 c
b = nonlinfit1.Coefficients.Estimate;
3 k! ^3 `! ^; T5 H2 X- s- i6 ]Y1 = b(1,1) + b(2,1)*log(x);
7 I+ R/ m+ _. q" ~$ t/ jhold on
7 k8 n0 F/ u4 q! k9 T6 Vplot(x, Y1, '--k', 'linewidth',2)
' J2 c/ F5 u7 ]/ T运行结果如下:% t  \% p8 O  d0 l/ P
( h- y4 U7 X& q+ u) e# A
nonlinfit1 =( n4 ?* l# e' B! N# {
5 R3 K% j8 t* E; @$ ~8 Y4 d& Z
Nonlinear regression model:* Y" I3 k# ^+ V2 h0 _
7 O' _7 E# a3 \9 v) j: a7 r) G
    y ~ b1 + b2*log(x)
9 e; q, S. j8 y$ N( _3 e0 _3 C- L- u+ M+ y3 @# u. s/ ?; G- p
Estimated Coefficients:+ J' Z. |4 p1 d$ ]  @
3 |& W$ d# `* Q* C# n
          Estimate      SE        tStat       pValue
9 R1 X& r- Y: V  h; |, P1 `$ g" y# G1 t, W7 l" O% M
    b1    7.3979      0.26667     27.742    2.0303e-080 K* V& I$ p! g- S$ y/ V7 j

+ E9 G% c) V, r; p" G) A6 }) a/ n    b2    -1.713      0.10724    -15.974    9.1465e-078 ]+ j4 v) R+ a# g7 a
; s/ C, n# J3 N& o0 g$ A8 I
R-Squared: 0.973,  Adjusted R-Squared 0.969
2 r  h, N1 {4 k9 i$ D
/ U' G! ^8 B  q6 c/ ?F-statistic vs. constant model: 255, p-value = 9.15e-07: h, `  A; l* V1 q5 E: _
- P1 q: K( C4 T. u" P. E" c
(3)指数形式非线性回归
8 f# c# X2 l0 ~) `
& e& o  V6 d+ G# W4 L%% 指数形式非线性回归
' t/ D& f+ j! U4 N2 E7 ?. Xm2 = 'y ~ b1*x^b2';
4 H! x/ E  \+ u# I) ]' hnonlinfit2 = fitnlm(x,y,m2, [1;1])
( g7 G8 }! o& Y! f% z' x1 Pb1 = nonlinfit2.Coefficients.Estimate(1,1);* V& M7 Q* ]1 e( m$ O
b2 = nonlinfit2.Coefficients.Estimate(2,1)" l5 @  E9 X. c% z+ z- o
Y2 = b1*x.^b2;6 F" E1 c$ j" u( I
hold on;
# X( e' Q  g/ y+ f4 @% vplot(x,Y2,'r','linewidth',2)
  d/ i2 ^6 G5 y! U( D1 `legend('原始数据','a+b*lnx','a*x^b') % 图例, E9 l8 o; h) z2 k
运行结果如下:0 ]5 d* z7 ~; t! ~
1 ?" A- S+ ?8 o9 _+ e
nonlinfit2 =4 s1 G0 z+ p) e1 a

6 T* V" {+ ?" wNonlinear regression model:- H3 l& w7 V  _

$ B. O9 a' R8 p) }3 n2 ?1 l    y ~ b1*x^b2
, p, C( I8 c& d" ]8 L1 a" d! x0 n' r/ q2 X6 J1 v, c
Estimated Coefficients:) c. q9 B0 ?% ]* p1 x5 [7 B

1 `& s/ \0 J, ]# M" I! k3 f' b          Estimate       SE        tStat       pValue & P: R$ u: }) G0 R. B* w) Z  M
3 E) @* ~: O, x4 J1 o5 _* d( v
    b1      8.4112     0.19176     43.862    8.3606e-10
! ~8 O8 c7 y/ V+ e8 X& v# g: w9 z  @+ t) |0 P0 s9 }
    b2    -0.41893    0.012382    -33.834    5.1061e-09
& I: V9 K% L) Z; q" X; l0 l
! m( L: m/ U( D; C! U1 A4 tR-Squared: 0.993,  Adjusted R-Squared 0.992- m. r; w$ }7 {* }# L# R4 P
* `" q8 ]# Y4 z  m# k7 L
F-statistic vs. zero model: 3.05e+03, p-value = 5.1e-11
6 w0 }. q7 ~, o6 O* w
  N7 P5 j# K% p- V6 ?在该案例中,选择两种函数形式进行非线性回归,从回归结果来看,对数形式的决定系数为 0.973 ,而指数形式的为 0.993 ,优于前者,所以可以认为指数形式的函数形式更符合 y 与 x 之间的关系,这样就可以确定他们之间的函数关系形式了。
' c  c5 T* ^, S$ o) C" v
3 }5 D; {' L! u* l4 i2.多元回归
# Z) m0 h& o" r4 {% ^4 T
# H$ c% d3 G' g! T' M1.多元线性回归" o9 t" D8 P$ z2 O

! d6 T0 H' ]% Y5 p8 q% Q4 K7 W[ 例3 ] 某科学基金会希望估计从事某研究的学者的年薪 Y 与他们的研究成果(论文、著作等)的质量指标 X1、从事研究工作的时间 X2、能成功获得资助的指标 X3 之间的关系,为此按一定的实验设计方法调查了 24 位研究学者,得到如表3 所示的数据( i 为学者序号),试建立 Y 与 X1 , X2 , X3 之间关系的数学模型,并得出有关结论和作统计分析。! s2 D+ G* a3 ^; P9 r9 p/ s2 z

0 e+ j/ J% Y, Q7 R
# ]/ R: n- E1 o, t8 o1 T" B( V  }1 b2 ^
该问题是典型的多元回归问题,但能否应用多元线性回归,最好先通过数据可视化判断他们之间的变化趋势,如果近似满足线性关系,则可以执行利用多元线性回归方法对该问题进行回归。具体步骤如下:
" F2 E7 v+ M+ \+ ]1 ^9 v- u; E: j' ]* o4 z5 h* m: Q8 D9 t' X
(1)作出因变量 Y 与各自变量的样本散点图% V: E7 t. }0 ]

5 ?+ M& D9 m4 _# M& b) v( e8 Z作散点图的目的主要是观察因变量 Y 与各自变量间是否有比较好的线性关系,以便选择恰当的数学模型形式。图3 分别为年薪 Y 与成果质量指标 X1、研究工作时间 X2、获得资助的指标 X3 之间的散点图。从图中可以看出这些点大致分布在一条直线旁边,因此,有比较好的线性关系,可以采用线性回归。绘制图3的代码如下:2 J  N, L! I# V& p
2 Y/ [5 t! T6 L! Z8 o& D
%% 作出因变量Y与各自变量的样本散点图
2 g: m! n- m0 ^, }% x1,x2,x3,Y的数据; W9 ^0 t$ m' h! b  [
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];
$ a2 ^- _/ W; o# Wx2=[9 20 18 33 31 13 25 30 5 47 25 11 23 35 39 21 7 40 35 23 33 27 34 15];
: w5 D. w- Y" i; c6 I" `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];: x- |/ B. u2 {: _
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];6 Q; {! v9 Q/ e. P1 V7 C7 p# N4 f
% 绘图,三幅图横向并排
4 [% Y2 h4 a1 H6 \3 Y$ ^+ wsubplot(1,3,1),plot(x1,Y,'g*')+ S& T5 q( X) C$ g0 U
subplot(1,3,2),plot(x2,Y,'k+')1 F/ ~+ u& J5 n! G5 K7 @
subplot(1,3,3),plot(x3,Y,'ro')
# O6 T6 ]1 _5 r2 t/ J绘制的图形如下:) K% \1 |3 ?4 @
) V5 V) L  z9 e/ X9 R
. N* H# A2 v& s. r

3 o# P- H. }6 p& w5 T, p6 d(2)进行多元线性回归, |) V  z9 f# J% M
; N7 n2 O! t6 [, R+ z
这里可以直接使用 regress 函数执行多元线性回归,注意以下代码模板,以后碰到多元线性问题直接套用代码,具体代码如下:
, a6 G2 f! U. {3 l( L
  J2 M1 B2 C% W  Q: Q& M%% 进行多元线性回归/ Y& M' v% Q0 p7 U- f$ c" V* a5 o6 f
n = 24; m = 3; % 每个变量均有24个数据,共有3个变量. e- a0 d: R* W8 M! G& v
X = [ones(n,1),x1',x2',x3'];
7 g7 X# t7 f/ E: S[b,bint,r,rint,s]=regress(Y',X,0.05) % 0.05为预定显著水平,判断因变量y与自变量之间是否具有显著的线性相关关系需要用到。( M9 i. D' y: g0 l
运行结果如下:* C* L1 y7 M( B& K8 g

' I5 R  L  I: i5 o" X7 db =+ K, ]. T: ^1 b2 }1 E( a
; ]' I2 @) }% e: d2 B, N7 q
   18.0157, K$ X; l# p, j* l+ W3 V; s
    1.0817
' P* v2 `' ]# m% k    0.3212- P1 v( J! R) F9 W% z9 H* z
    1.2835
& j- c6 N: n9 r% o9 X- v$ i, d
: N! Z4 R( t8 [7 D0 y: M8 i0 o* [. G+ n
$ d6 e" y2 X2 |4 R9 xbint =4 @6 w  b( _* z( E% Q0 u

# [; r3 |! i" ^- c   13.9052   22.1262
: o" j' ^! u" t* k5 E    0.3900    1.7733; `1 w" k* ]4 v3 X' W; D, w8 q
    0.2440    0.3984
+ a/ [9 `* k% c0 Q    0.6691    1.8979$ S1 i% e) H5 ~2 n3 b  L" M7 _
/ E! d9 }* c  t- Y/ ~! P& e

  l- d  q% F9 G% a$ g6 A5 e; vr =
# \$ ]$ ?* X; U- k/ C1 ~1 O$ m3 _) K3 F% O; z6 M  v
    0.6781
  I  Y# l5 [! J5 G, R$ c8 r2 K    1.91293 @5 b: y) `4 b" i$ {
   -0.1119! o7 T2 \4 v% Z( m, A  }
    3.31149 W! d2 Z: R4 s; i: Y5 k# ~
   -0.7424
- H2 }* k1 _7 F6 G& h6 n    1.2459, L) W. i0 v8 v9 T1 R5 h
   -2.1022
- u1 m/ P  m9 m7 Q8 V  Q( i* r$ [    1.9650; U/ |8 }; N7 M( O$ @
   -0.31938 C  a# [, N  ^4 c' l" b6 A
    1.3466
1 |! `; y- H1 L( i  [( L    0.8691
1 u! y# \3 w; F, l" Z7 \   -3.2637
! a7 x: G9 y! A   -0.5115  y8 H5 U3 J1 X4 _- L3 W
   -1.1733
* j! {( W9 ~, J$ F( U   -1.4910& \/ u' g% J& r0 H* F
   -0.2972
# A" U5 Z& s. |7 a3 K    0.1702
6 o5 R( [7 n' G* v/ B$ f    0.5799
9 }. I4 U7 |0 [   -3.2856: M5 N9 e. q: R+ D0 S  a! Y
    1.1368; i$ J/ S7 [; g; Z, T& k8 y
   -0.8864
. Y( D1 Q9 E9 ]; o   -1.4646
! n& O2 H. `! r# ~4 Y    0.80329 M/ t( `- `- f) d* X8 P
    1.6301$ V% Y# e: f1 F0 J/ F& M
* T1 `: d7 C2 ?! T( P) |4 A/ v
! `, m: W! [% `4 e1 |
rint =# [: G* }4 p& B

9 z( M9 J& \$ ~9 }+ d/ `' d/ M   -2.7017    4.0580$ e; M/ S. T0 {% p% L: M
   -1.6203    5.4461
& @) l: A# W+ |   -3.6190    3.3951
( i& s8 R6 ~6 H9 u5 _    0.0498    6.5729
2 e) X5 T. x5 W6 Z0 O   -4.0560    2.5712
& s9 A) A3 M8 K$ S* R, j   -2.1800    4.67171 `# q1 q) O7 V0 Z5 H- u  \
   -5.4947    1.2902/ x9 W( P4 _/ d1 e- P, Z) \! {
   -1.3231    5.2531: }+ ^  }% l* L2 K
   -3.5894    2.9507
) O, W& Z( t% H! D, H3 b& r  _   -1.7678    4.4609
: }0 o6 ^) F' I* \9 D5 m   -2.7146    4.4529
. U1 W# N  e: w: x: W( [% C5 M   -6.4090   -0.1183
0 v, b: x9 }, X) O! O; }: Y4 j" u   -3.6088    2.5859
: ?5 z5 M3 w/ Z   -4.7040    2.3575
9 ~: a1 o) A: `4 z. f   -4.8249    1.8429
1 z" ^# L# D, t. D. B, S( h2 @! D   -3.7129    3.1185
4 @! E0 g9 ?8 a, a. O   -3.0504    3.3907
* u$ T  f9 o, J   -2.8855    4.0453' L. S" \* S4 _* a8 o
   -6.2644   -0.3067' g, i1 L# ^# X9 a6 W
   -2.1893    4.4630
4 c, f# {% d2 q   -4.4002    2.62730 b7 ~, m4 V6 [: N( L% ^; `
   -4.8991    1.9699. p; g5 N' P+ l
   -2.4872    4.0937  a+ v9 Z) `  c8 I5 u
   -1.8351    5.0954
7 j( w6 E; o$ U
; `4 K: v  z& l
# [! `) q1 w. a& G7 T  os =
+ H- m* N; b* y* j* I$ `4 O6 |) o8 C, }) O. r  }
    0.9106   67.9195    0.0000    3.0719
+ O$ }8 d1 Z0 i" m- ]$ x7 c( V看到如此长的运行结果,我们不要害怕,因为里面很多数据是没用的,我们只需提取有用的数据。
1 ^& ]' w9 l) q# P9 Z" c+ L: N
6 w  M) ^7 s, t+ M) F* u在运行结果中,很多数据我们不需理会,我们真正需要用到的数据如下:4 s4 ~# h  j& ]1 b3 g

3 u6 c5 _: K- L% H3 f3 Eb =
% g: S* t" I3 C& U0 e! H1 ?- x* g7 N9 ?- N: I
   18.01571 ]; n* ~+ T% B' ]9 `% x$ V, f
    1.0817
6 i# E2 O0 o" h$ ^7 N    0.32122 [9 ?6 p  t2 t
    1.2835
/ Y8 s- d- F3 P1 t% i# A# Q  Q* v0 C7 |7 {0 c
s =
9 j, h! f7 D0 Y) P. j9 F6 m9 D1 K! w: e3 k$ b3 a. M+ u" O* z
    0.9106   67.9195    0.0000    3.0719' V+ e  ~: [1 y5 m* T" _( @; Q9 s
回归系数 b = (β0,β1,β2,β3) = (18.0157, 1.0817, 0.3212, 1.2835),回归系数的置信区间,以及统计变量 stats(它包含四个检验统计量:相关系数的平方R^2,假设检验统计量 F,与 F 对应的概率 p,s^2 的值)。观察表4的数据,会发现它来源于运行结果中的b和s:* h$ X, u4 k! m
0 f( \+ t8 g0 Y

. P6 k2 a0 |0 q; a8 D3 ]9 w1 q# ~
& M, `* S# {; Y  I& r) R& U" o根据β0,β1,β2,β3,我们初步得出回归方程为:
/ G# P4 k1 U8 `# E' {& K+ I% D% D: t$ ^( x6 Q* T  F

4 J, l  l$ ?2 ^+ {+ `
4 E, q' @9 ], a! K如何判断该回归方程是否符合该模型呢?有以下3种方法:6 Y% Y. x$ @$ y6 ^- X" o3 k. F

: {" L$ \$ }$ E% p) z1)相关系数 R 的评价:本例 R 的绝对值为 0.9542 ,表明线性相关性较强。5 v9 c5 K! j% U% P  b

9 ^8 ~* S# }4 b: ?9 Z4 c2)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。# |8 X! W) o0 W0 H% k, M

3 b& i& Q' P/ Z3)p 值检验:若 p < α(α 为预定显著水平),则说明因变量 y 与自变量 x1,x2,...,xm之间显著地有线性相关关系。本例输出结果,p<0.0001,显然满足 p<α=0.05。
) l0 y1 ~9 J! l# a4 Y5 `
0 l* T. R0 _& G( y以上三种统计推断方法推断的结果是一致的,说明因变量 y 与自变量之间显著地有线性相关关系,所得线性回归模型可用。s^2 当然越小越好,这主要在模型改进时作为参考。
: l( x6 d" \" v# k, u7 X, C9 L8 w9 Q$ p/ d# q
3. 逐步回归0 @7 n' v0 x9 b. d

" U) S; o9 h$ M, b[ 例4 ] (Hald,1960)Hald 数据是关于水泥生产的数据。某种水泥在凝固时放出的热量 Y(单位:卡/克)与水泥中 4 种化学成品所占的百分比有关:8 n  Z! M: ~5 {# @2 T! n
/ d' I3 H2 Q, L

) R4 K* a, F5 k3 l
& g* E6 {' Y8 r5 z( D, ^' y  @3 @+ \在生产中测得 12 组数据,见表5,试建立 Y 关于这些因子的“最优”回归方程。8 w6 z) y; f8 D
' E/ f* m/ A# z( U
- f6 v; ~6 B/ r. c

# r. x( q+ `2 P9 q& J  u. A对于例 4 中的问题,可以使用多元线性回归、多元多项式回归,但也可以考虑使用逐步回归。从逐步回归的原理来看,逐步回归是以上两种回归方法的结合,可以自动使得方程的因子设置最合理。对于该问题,逐步回归的代码如下:
8 B* ?$ |# G" b$ f& g7 ^1 n. Z: Y0 o8 r9 X) `
%% 逐步回归' {# g, J  w* e; V3 I
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];   %自变量数据- p* M4 V- A  w' _+ y; P7 ]. u
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];  %因变量数据' d0 }- `' `# y8 Q/ T6 T7 }
stepwise(X,Y,[1,2,3,4],0.05,0.10)% in=[1,2,3,4]表示X1、X2、X3、X4均保留在模型中5 F/ W1 o3 e* k( ~" G+ x
程序执行后得到下列逐步回归的窗口,如图 4 所示。
2 }7 [+ H) q! C0 E# i7 Q" M6 q4 N  q$ r  d% P2 v2 ~

5 g1 F, p9 O" I6 q, r7 t/ u3 O( n" V8 j1 `- P; _9 @
                                                                                                             图49 u1 w& y* n4 p$ z  G# K( d
  s2 B4 s; K& e8 \+ D
在图 4 中,用蓝色行显示变量 X1、X2、X3、X4 均保留在模型中,窗口的右侧按钮上方提示:将变量X4剔除回归方程(Move X4 out),单击 Next Step 按钮,即进行下一步运算,将第 4 列数据对应的变量 X4 剔除回归方程。单击 Next Step 按钮后,剔除的变量 X3 所对应的行用红色表示,同时又得到提示:将变量 X3 剔除回归方程(Move X3 out),单击 Next Step 按钮,这样一直重复操作,直到 “Next Step” 按钮变灰,表明逐步回归结束,此时得到的模型即为逐步回归最终的结果。最终结果如下:. m4 S: R% L3 Y2 Q+ v
5 B; o9 ?' @3 ~: y# n7 }

% G2 V. [4 p" m) x& \4 E" t( f) c+ E% _, A( ^
4. 逻辑回归
& w) u1 W# {( }3 }5 H; k" u# [# [' I. a) V
[ 例5 ] 企业到金融商业机构贷款,金融商业机构需要对企业进行评估。评估结果为 0 , 1 两种形式,0 表示企业两年后破产,将拒绝贷款,而 1 表示企业 2 年后具备还款能力,可以贷款。在表 6 中,已知前 20 家企业的三项评价指标值和评估结果,试建立模型对其他 5 家企业(企业 21-25)进行评估。
' }5 ~4 O& d" i" S" c- h, ]- k  x3 F+ _* D9 T. H
, Z1 l/ t/ p0 L  D) N
9 W' k& k3 |# n/ z5 F1 p
对于该问题,很明显可以用 Logistic 模型来回归,具体求解程序如下:2 M* J3 Y. F+ X( T/ b! u/ k. P

- R( C: D4 d1 q* a3 [程序中需要用到的数据文件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%92+ b4 _5 L5 E( w2 e- q# E- C3 a1 X, _
8 l* m0 W" J; g) Z$ v' D
% logistic回归2 X7 ~! ?% U' J4 G* t# y  u, o
3 i' v4 H3 }9 Z' r5 D0 M: g
%% 导入数据
- E: |% D: w& Y- C1 oclc,clear,close all5 y- L6 O3 b8 ~5 K  Y
X0 = xlsread('logistic_ex1.xlsx','A2:C21'); % 前20家企业的三项评价指标值,即回归模型的输入
/ f: H, i- U- M$ x' Z0 ?) kY0 = xlsread('logistic_ex1.xlsx','D221'); % 前20家企业的评估结果,即回归模型的输出
5 s" Q, d5 \. u5 ]' l  B. x5 S" ^5 gX1 = xlsread('logistic_ex1.xlsx','A2:C26'); % 预测数据输入0 e' l5 d' M/ ?4 c
0 o4 ?. C1 V7 t& x3 Z% G0 N3 W1 [
%% 逻辑函数* H+ t. }% a! Z8 Y" F! x
GM = fitglm(X0,Y0,'Distribution','binomial');: v4 R7 Y2 ]: N+ M
Y1 = predict(GM,X1);
/ q5 P: l- Q9 G3 {! E/ p! M2 t. Y5 c1 @# u4 |
%% 模型的评估# L0 I( P) C) n2 I1 {( s# g
N0 = 1:size(Y0,1); % N0 = [1,2,3,4,……,20]) z0 H) B3 F  M, p; S& G
N1 = 1:size(Y1,1); % N1 = [1,2,3,4,……,25]
5 ?, F1 d' m5 s  cplot(N0',Y0,'-kd'); % N0'指的是对N0'进行转置,N0'和Y0的形式相同,该行代码绘制的是前20家企业的评估结果
0 U/ E" p* B* ?* K( M' I; |3 v0 s% plot()中的参数'-kd'的解析:-代表直线,k代表黑色,d代表菱形符号# s" ~$ v' r% X" V% D% [4 J1 s5 z
hold on;/ w" e# C. M: Y# ?. q
scatter(N1',Y1,'b'); % N1'指的是对N1'进行转置,N1'和Y1的形式相同
+ `6 Q1 R; P" B! k4 P/ ?! X0 `* R7 Xxlabel('企业编号');
2 K' _+ W6 q, y' b( lylabel('输出值');0 k- b* |: O+ ], z, U
得到的回归结果与原始数据的比较如图5所示。) v( ]( z7 f' W" z
5 }0 ?6 z: {, y! |/ u9 t; s
! E1 K3 |. v3 Z/ w$ N; }
. C! j" m, l  b9 z+ d% z' Y
                                                                   图50 g& j; ]" N* P, T  _# l7 }

5 H0 F; q3 y5 t& q三、总结与感悟。 8 U) M/ [/ c+ m& W4 R- k3 ~
* ^/ U( H* Z$ ~
        总结:通过这次学习,我了解到Matlab在数学建模竞赛中使用广泛;在评估股票价值与风险的小实例中,我掌握了用Matlab去建模的基本方法和步骤;在回归算法的学习过程中,我掌握了一元线性回归、一元非线性回归、多元线性回归、逐步回归、逻辑回归的算法。2 f1 Y% B4 t4 N- M
+ t" ]2 A0 W" a$ d1 p
        感悟:正确且高效的 MATLAB 编程理念就是以问题为中心的主动编程。我们传统学习编程的方法是学习变量类型、语法结构、算法以及编程的其他知识,因为学习时候是没有目标的,也不知道学的知识什么时候能用到,收效甚微。而以问题为中心的主动编程,则是先找到问题的解决步骤,然后在 MATLAB 中一步一步地去实现。在每步实现的过程中,遇到问题,查找知识(互联网时代查询知识还是很容易的),定位方法,再根据方法,查询 MATLAB 中的对应函数,学习函数用法,回到程序,解决问题。在这个过程中,知识的获取都是为了解决问题的,也就是说每次学习的目标都是非常明确的,学完之后的应用就会强化对知识的理解和掌握,这样即学即用的学习方式是效率最高,也是最有效的方式。最重要的是,这种主动的编程方式会让学习者体验到学习的成就感的乐趣,有成就感,自然就强化对编程的自信了。这种内心的自信和强大在建模中会发挥意想不到的力量,所为信念的力量。- }7 @9 Z: h8 x. k( _
# s3 D, j  p% p8 _6 B

) w! j8 W5 n! _4 E




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