数学建模社区-数学中国

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

作者: 杨利霞    时间: 2019-4-10 15:18
标题: Matlab数学建模学习报告(一)
Matlab数学建模学习报告(一)5 c9 t; G' O% t7 b" C% I+ v
一、学习目标。

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

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

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

. l% a" A4 P. Z0 u* t$ q( p% m8 A
二、实例演练。6 P* A5 p7 B" t4 o

% D- f2 j! M, ]2 s3 d- E+ w2 F6 V: P   1、谈谈你对Matlab与数学建模竞赛的了解。
( f0 T# q2 y5 f: u6 b; S& e0 i9 k
8 H! E8 ?* O, E        Matlab在数学建模中使用广泛:MATLAB 是公认的最优秀的数学模型求解工具,在数学建模竞赛中超过 95% 的参赛队使用 MATLAB 作为求解工具,在国家奖队伍中,MATLAB 的使用率几乎 100%。虽然比较知名的数模软件不只 MATLAB。
" L0 |$ ]# q) k" H) O9 X
2 \( A4 X% P) d% [$ |( O! V2 f' O, A        人们喜欢使用Matlab去数学建模的原因:  ~! n, D4 l2 f( Q9 \! l

$ I7 Z  w- O/ \$ D2 O(1)MATLAB 的数学函数全,包含人类社会的绝大多数数学知识。9 h$ y" R+ V- B; H
& d8 ]6 c8 d1 w
(2)MATLAB 足够灵活,可以按照问题的需要,自主开发程序,解决问题。
& ?" G" j4 T4 y1 t/ a( S
2 @; Y' t0 M, m(3)MATLAB易上手,本身很简单,不存在壁垒。掌握正确的 MATLAB 使用方法和实用的小技巧,在半小时内就可以很快地变成 MATLAB 高手了。
$ J7 O& V* K( d
' Z- Q2 \* }: C! ~3 e; V$ t        正确且高效的 MATLAB 编程理念就是以问题为中心的主动编程。我们传统学习编程的方法是学习变量类型、语法结构、算法以及编程的其他知识,因为学习时候是没有目标的,也不知道学的知识什么时候能用到,收效甚微。而以问题为中心的主动编程,则是先找到问题的解决步骤,然后在 MATLAB 中一步一步地去实现。在每步实现的过程中,遇到问题,查找知识(互联网时代查询知识还是很容易的),定位方法,再根据方法,查询 MATLAB 中的对应函数,学习函数用法,回到程序,解决问题。在这个过程中,知识的获取都是为了解决问题的,也就是说每次学习的目标都是非常明确的,学完之后的应用就会强化对知识的理解和掌握,这样即学即用的学习方式是效率最高,也是最有效的方式。最重要的是,这种主动的编程方式会让学习者体验到学习的成就感的乐趣,有成就感,自然就强化对编程的自信了。这种内心的自信和强大在建模中会发挥意想不到的力量,所为信念的力量。$ R* j4 |1 c* {. _  q2 G

: v! I8 a) c- g: e& a         数学建模竞赛中的 MATLAB 水平要求:
, ?2 J, K( O  H& ?4 g5 ~) Y. c1 V# b! I3 Q# I! l. y9 A2 i* B) W- g
要想在全国大学生数学建模竞赛中拿到国奖, MATLAB 技能是必备的。 具体的技能水平应达到:
3 l2 z9 X9 X& \, K+ p, T+ I  T  ^2 {& }; z
1)了解 MATLAB 的基本用法,包括几个常用的命令,如何获取帮助,脚本结构,程序的分节与注释,矩阵的基本操作,快捷绘图方式;; d* K: a  `# V

/ ^0 {+ n$ m7 O2)熟悉 MATLAB 的程序结构,编程模式,能自由地创建和引用函数(包括匿名函数);( ]" P8 s) r3 a7 n

+ K5 J) F; _* Q% a' Y# L. Z3)熟悉常见模型的求解算法和套路,包括连续模型,规划模型,数据建模类的模型;( K* E* L5 k  l3 ?% a1 b
6 e( Z, Y8 |8 s! y- V7 ?* ]* D( L
4)能够用 MALTAB 程序将机理建模的过程模拟出来,就是能够建立和求解没有套路的数学模型。
) C. Y' U% K" a9 r0 p; A2 Q5 d" }/ W+ t' e, [
要想达到如上要求, 不能按照传统的学习方式一步一步地学习, 而要结合上述提到的学习理念制定科学的训练计划。
! ~6 t; L# Z) ~( c# |/ |
; }. }: w; F% j9 ^" \5 V  2、已知股票的交易数据:日期、开盘价、最高价、最低价、收盘价、成交量和换手率,试用某种方法来评价这只股票的价值和风险。如何用MATLAB去求解该问题?(交易数据:点击此处获取数据)7 @5 |, h- Q* Q# J. t
, \: [6 H- F% l- r
解题步骤:( X6 g9 O' P0 j1 |
& b" R/ u' @! }' c3 h
第一阶段:从外部读取数据# |! O! c: j0 z" m9 x# r- S; G

' t4 H1 v  F4 _! ?" l* w) o  ZStep1.1:把数据文件sz000004.xls拖曳进‘当前文件夹区’,选中数据文件sz000004.xls,右键,将弹出右键列表,很快可发现有个“导入数据”菜单,如图 1 所示。9 K1 m) N* ^6 b
5 l4 f: p7 j0 s; A

0 N# @. y2 i+ g! b0 m; @
3 G6 J% b- \, t1 O" |9 L) x' L& H                                                                  图1. 启动导入数据引擎示意图; R, g7 F9 L) [0 m
5 _9 Q6 i% f* F5 D" m& ?% ^4 ^' \
Step1.2:单击“导入数据”这个按钮,则很快发现起到一个导入数据引擎,如图 4 所示。* Y4 q; A# Z1 f; h) f% m; w
  `0 C! O- m& [

2 U. O: ?8 M  y# w1 c4 w2 H" b  `% t
                                                                    图2. 导入数据界面; K( u3 N& `7 ?$ x( }
7 o' n- @% L2 r. N7 B$ b1 b, t2 S
Step1.3:观察图 2,在右上角有个“导入所选内容”按钮,则可直接单击之。马上我们就会发现在 MATLAB 的工作区(当前内存中的变量)就会显示这些导入的数据,并以列向量的方式表示,因为默认的数据类型就是“列向量”,当然您可以可以选择其他的数据类型,大家不妨做几个实验,观察一下选择不同的数据类型后会结果会有什么不同。至此,第一步获取数据的工作的完成。
9 C2 U& o) G( T0 C( A$ E5 U% @' b8 t$ O2 F/ B0 l  z3 t

% X' S9 C0 P; x# M& G# ~9 d
0 `. J* _/ B4 {3 s% L% h; l" |第二阶段:数据探索和建模' L4 u, L' q. k5 O6 H- y$ G0 c6 _3 Y
% @- a* \2 r: n" D% A$ F
现在重新回到问题,对于该问题,我们的目标是能够评估股票的价值和风险,但现在我们还不知道该如何去评估,MATLAB 是工具,不能代替我们决策用何种方法来评估,但是可以辅助我们得到合适的方法,这就是数据探索部分的工作。下面我们就来尝试如何在 MATLAB 中进行数据的探索和建模。; v5 g" z8 t& _. K

0 U3 ]: m6 r" e& t: c8 n2 D* WStep2.1:查看数据的统计信息,了解我们的数据。具体操作方式是双击工具区(直接双击这三个字),此时会得到所有变量的详细统计信息。通过查看这些基本的统计信息,有助于快速在第一层面认识我们所正在研究的数据。当然,只要大体浏览即可,除非这些统计信息对某个问题都有很重要的意义。数据的统计信息是认识数据的基础,但不够直观,更直观也更容易发现数据规律的方式就是数据可视化,也就是以图的形式呈现数据的信息。下面我们将尝试用 MATLAB 对这些数据进行可视化。8 j" \' T" O+ Q' b

& l$ a- B5 U9 K0 n! F# @由于变量比较多,所以还有必要对这些变量进行初步的梳理。对于这个问题,我们一般关心收盘价随时间的变化趋势,这样我们就可以初步选定日期(DateNum)和收盘价(Pclose)作为重点研究对象。也就是说下一步,要对这这两个变量进行可视化。
( j- E1 l- \: s4 }5 K0 U' K) ^, g
4 i- L% n% o% [5 x& n, G! {/ M对于一个新手,我们还不知道如何绘图。但不要紧,新版 MATLAB 提供了更强大的绘图功能——“绘图”面板,这里提供了非常丰富的图形原型,如图 3 所示。  d  t+ |* N+ T; ~1 D# T- ?+ D6 R2 C$ |

9 J) \2 x, c. ]2 R& D" ~3 \: b, H9 g3 [
& \0 K( q3 u% f. f) Q
                                                                                 图3 MATLAB绘图面板中的图例
  X+ Y; [9 u2 m" H. O# a1 n- s1 X0 G9 O( V! S
要注意,需要在工作区选中变量后绘图面板中的这些图标才会激活。接下来就可以选中一个中意的图标进行绘图,一般都直接先选第一个(plot)看一下效果,然后再浏览整个面板,看看有没有更合适的。下面我们进行绘图操作。! n/ h6 _0 {3 L- x( m# j
$ r8 n5 g0 V$ a( B5 V- ]- U' ~9 }
Step2.2:选中变量 DataNum 和 Pclose,在绘图面板中单机 plot 图标,马上可以得到这两个变量的可视化结果,如图 4 所示,同时还可以在命令窗口区看到绘制此图的命令:
; f, d  f6 `6 ]$ a, z: A8 r9 C4 M" ~3 {4 z& N4 K4 g
>> plot(DateNum,Pclose): o$ _* p' |# K8 k& E

0 H" @  a$ p/ S, X
, R1 j9 |( d7 i1 L% C7 t" O) A. ~
2 f' p) {6 H& x& U, f% H( Q5 V                                                                                       图4 通过 plot 图标绘制的原图
* x- b/ C2 F6 @' s, Q* f1 C4 W8 f
2 L& W/ J. Z. }1 b) Y: d( |2 E这样我们就知道了,下次再绘制这样的图直接用 plot 命令就可以了。一般情况下,用这种方式绘图的图往往不能满足我们的要求,比如我们希望更改:- r1 N) Z& _7 c6 g

7 N9 j9 g$ g' k(1)曲线的颜色、线宽、形状;
5 o1 E+ J+ r# A9 s; |
8 U4 X; [1 S( H( O* w(2)坐标轴的线宽、坐标,增加坐标轴描述;( \: L$ }& X# Y6 \3 w
9 a2 _0 p% c9 W2 M% F/ w) H
(3)在同个坐标轴中绘制多条曲线。3 B( w; f& }) L9 a: ]4 o9 j$ Q

8 Q4 {# b: {4 p  }2 b; g此时我们就需要了解更多关于命令 plot 的用法,这时就可以通过 MATLAB 强大的帮助系统来帮助我们实现期望的结果。最直接获取帮助的两个命令是 doc 和 help,对于新手来说,推荐使用 doc,因为 doc 直接打开的是帮助系统中的某个命令的用法说明,不仅全,而且有应用实例,这样就可以“照猫画虎”,直接参考实例,从而将实例快速转化成自己需要的代码。$ N# k1 Z* t- M

% B! {1 t, r/ @2 s* t3 Z接下来我们就要考虑如何评估股票的价值和风险呢?/ M2 ?3 w! N1 j. b# _8 @
* d* _" p( O2 M% x3 z8 b  Q9 C
         对于一只好的股票,我们希望股票的增幅越大越好,体现在数学上,就是曲线的斜率越大越好。
1 F" \/ z0 L. }4 I! g% @" n( n( f6 I; o
9 y+ B/ z; o& l  y9 [         对于风险,则可用最大回撤率来描述更合适,什么是最大回撤率?, t- [; n3 [. C! M

0 F! r! P+ R8 u6 Z6 T3 |& T         最大回撤率的公式可以这样表达:
" s. `/ E  ~2 \5 Z) d/ [
3 d( U0 N, G# }8 ]D为某一天的净值,i为某一天,j为i后的某一天,Di为第i天的产品净值,Dj则是Di后面某一天的净值
4 n% W4 z" @5 G1 w; z
( e* N% x5 N- \" o% z( Odrawdown=max(Di-Dj)/Di,drawdown就是最大回撤率。其实就是对每一个净值进行回撤率求值,然后找出最大的。可以使用程序实现。最大回撤率越大,说明该股票的风险越高。所以最大回撤率越小,股票越好。. y9 ^0 W/ a. b
% |* ~- _, m: j& N" [
           斜率和最大回撤率不妨一个一个来解决。我们先来看如何计算曲线的斜率。对于这个问题,比较简单,由于从数据的可视化结果来看,数据近似成线性,所以不妨用多项式拟合的方法来拟合该改组数据的方程,这样我们就可以得到斜率。- }$ k7 i9 W! F* R5 ?
* ~4 s4 V" a( h4 B8 F
Step2.3:通过polyfit()多项式拟合的命令,并计算股票的价值,具体代码为:+ F# V, O6 l+ W; }9 W
2 A8 p2 z. N) @3 s5 Q
>> p = polyfit(DateNum,Pclose,1); % 多项式拟合
; z5 {; C+ f% O* b5 Q, E1 F. H4 i% R- c) W  I( J9 O
>> value = p(1) % 将斜率赋值给value,作为股票的价值
, b  d3 b6 D, k( i
+ P  P7 u: B2 M  Zvalue =" k$ z/ `9 x& V. f" G, g3 R
: V' g: O/ c: F- s  D( W
    0.1212$ c! S& M, a  \4 q, w; f

5 Q4 @; C! q- j0 x代码分析:%后面的内容是注释。polyfit()有三个参数,前两个大家都能明白是什么意思,那第三个参数是什么意思呢?它表示多项式的阶数,也就是最高次数。比如:在本例中,第三个参数为1,说明其为一次项,即一次函数。第三个参数为你要拟合的阶数,一阶直线拟合,二阶抛物线拟合,并非阶次越高越好,看拟合情况而定。polyfit()返回阶数为 n 的多项式 p(x) 的系数,p 中的系数按降幂排列。在本例中的P(1)指的是最高项的系数,即斜率。
' Q4 b" U3 j7 n- h+ |
* m/ l7 L- |% d( U5 m. SStep2.4:用相似的方法,可以很快得到计算最大回撤的代码:& g' i& u( L5 O8 `
* L( M9 S7 k- M- k% ?* {& P
>> MaxDD = maxdrawdown(Pclose); % 计算最大回撤0 c* W) k$ _* Y( ^2 ]) r# @

' l; W4 L" b, |* G( q  p6 j>> risk = MaxDD  % 将最大回撤赋值给risk,作为股票的风险
( ]! O" l8 }' k% r6 O
% L' N* x; l; ~$ l! n' u/ arisk =
% _! P# i& K, d2 B/ M1 k9 b4 l% r0 y
' O# s6 Q$ m! B" c- F4 I( }    0.1155$ n- D/ s. m- P; {* n9 H, T# q" k

8 |- @, u9 M1 A6 D  k) n代码分析:最大回撤率当然计算的是每天收盘时的股价。最大回撤率越大,说明该股票的风险越高。所以最大回撤率越小,股票越好。
) \" l8 U8 E+ h8 M* ~* J' C1 o2 d1 F& L7 b3 t( W9 o& a
到此处,我们已经找到了评估股票价值和风险的方法,并能用 MALTAB 来实现了。但是,我们都是在命令行中实现的,并不能很方便地修改代码。而 MATLAB 最经典的一种用法就是脚本,因为脚本不仅能够完整地呈现整个问题的解决方法,同时更便于维护、完善、执行,优点很多。所以当我们的探索和开发工作比较成熟后,通常都会将这些有用的程序归纳整理起来,形成脚本。现在我们就来看如何快速开发解决该问题的脚本。
5 _8 \, ^; v( w7 N. w8 b
' K2 V6 S6 X9 L; d/ U, ]9 `: AStep2.5:像 Step1.1 一样,重新选中数据文件,右键并单击“导入数据”菜单,待启动导入数据引擎后,选择“生成脚本”,然后就会得到导入数据的脚本,并保存该脚本。
6 K: S& o5 e( O3 a4 f0 ?+ ^5 M0 r! ]/ T0 [
脚本源代码中有些地方要注意:
% j9 ~) Q/ [! u, L9 X) m
  ?7 W" x" l7 J; ~/ l8 h       %%在matlab代码中的作用是将代码分块,上下两个%%之间的部分作为一块,在运行代码的时候可以分块运行,查看每一块代码的运行情况。常用于调试程序。%%相当于jupyter notebook中的cell。8 m! a# T& m# Z! A, ^" j& T0 }

' c4 H* [" g. ~2 u9 X) v2 p) I       %后的内容是注释。
9 a# g  v7 |# p
+ i, t9 ^) L1 Q1 v        每句代码后面的分号作用为不在命令窗口显示执行结果。
* H- V# z' }# D; L3 B6 s& y( J# Z$ Y. e
脚本源代码:
1 _1 w! Z! ~- X' A3 i1 z9 |3 B/ l2 C3 @4 N3 K* V
%% 预测股票的价值与风险
: i- T7 f% Q. ~6 B0 m/ z& S- v! K4 n
%% 导入数据
. _% P$ v5 F1 b1 A0 \clc, clear, close all' s- s8 y, Z" z" w0 @
% clc:清除命令窗口的内容,对工作环境中的全部变量无任何影响 0 L+ K8 e# Y& j& e6 L
% clear:清除工作空间的所有变量
) ]6 l( [4 s/ K1 O' A# v- A% close all:关闭所有的Figure窗口
' g5 T6 T9 [3 u$ Q3 J7 o
. ]& Q+ U9 A' A% j% 导入数据6 Q& U! I& }4 G" Y
[~, ~, raw] = xlsread('sz000004.xlsx', 'Sheet1', 'A2:H7');
5 I6 B. P, n! P: P% Z$ W" B- m% [num,txt,raw],~表示省略该部分的返回值2 q: I+ `2 u2 \. d
% xlsread('filename','sheet', 'range'),第二个参数指数据在sheet1还是其他sheet部分,range表示单元格范围
# c% i) }5 K2 C! g9 `6 Z" n( ^5 r; a) q6 l  K, v1 R" ]
% 创建输出变量5 ~% r) R5 b$ m8 R& Q  {" v8 x! x
data = reshape([raw{:}],size(raw));
, e& t3 a9 W  L* `! ^+ i% [raw{:}]指raw里的所有数据,size(raw):6 x 8 ,该语句把6x8的cell类型数据转换为6x8 double类型数据9 e1 \1 ?. N7 F% Y

! z$ @" [. a+ M4 i, G$ ~% 将导入的数组分配列变量名称1 A0 F5 |# o8 v/ v; h
Date = data(:, 1); % 第一个参数表示从第一行到最后一行,第二个参数表示第一列
% P6 K! |  @! ~' o6 a' r( e+ hDateNum = data(:, 2);
/ _* p: L0 h1 ?: y* ^  ~  nPopen = data(:, 3);. l: J% L1 E5 Z( o7 D9 `8 [
Phigh = data(:, 4);
0 a0 F" B, B2 ?/ WPlow = data(:, 5);# \) Y, b2 r1 W0 j1 ^6 e- j
Pclose = data(:, 6);  ! x$ K! V: D" q
Volum = data(:, 7); % Volume 表示股票成交量的意思,成交量=成交股数*成交价格 再加权求和
& B" y% t4 @0 K& E4 m( nTurn = data(:, 8); % turn表示股票周转率,股票周转率越高,意味着该股股性越活泼,也就是投资人所谓的热门股9 v1 p9 ]( U* o, a/ g5 n& p

3 J0 Q6 C, L( ~# p& h% 清除临时变量data和raw0 i* M- Q1 M$ P, ?8 u# T
clearvars data raw;
, R0 r! s+ _' V8 q' d/ T* K
9 k8 M! M1 H& r) p%% 数据探索
0 C1 U5 _& j" Z$ g: d3 u6 B" S5 ^  Y; d( B3 I6 G
figure % 创建一个新的图像窗口! R2 C; F) D4 Q& [3 Y
plot(DateNum, Pclose, 'k'); % 'k',曲线是黑色的,打印后不失真( I! a7 m% X2 P) i
datetick('x','mm-dd'); % 更改日期显示类型。参数x表示x轴,mm-dd表示月份和日。yyyy-mm-dd,如2018-10-27$ X; s" C' _' i2 V
xlabel('日期') % x轴4 T' _" @8 D0 x( O
ylabel('收盘价') % y轴
+ G& L9 c% E0 h+ G% ofigure
  h4 u7 }2 T) H* f5 e# ^, sbar(Pclose) % 作为对照图形
8 ^( U, ^3 L" y" N4 ^; n+ K% U! d) k  c9 a% y( p) _+ g' R% O4 E
%% 股票价值的评估  Q% N) M/ G( Z; M

- d& p0 n" [3 q* q$ d5 n% N5 Up = polyfit(DateNum, Pclose, 1); % 多项式拟合& R+ l. e. t0 A
% polyfit()返回阶数为 n 的多项式 p(x) 的系数,p 中的系数按降幂排列$ Z! S% ?* {6 Z2 X7 V  ]# {
P1 = polyval(p,DateNum); % 得到多项式模型的结果3 M/ Q& L( k! c: L- w
figure
1 }6 X' C0 c: ~plot(DateNum,P1,DateNum,Pclose,'*g'); % 模型与原始数据的对照, '*g'表示绿色的*
9 m7 a% z4 h, x- c9 U+ `8 u8 S, {value = p(1) % 将斜率赋值给value,作为股票的价值。p(1)最高项的次数2 I' G) K2 _/ W

! A. H( f6 k) Y1 b+ w7 ]1 s* u%% 股票风险的评估
+ u$ F" Q! w- YMaxDD = maxdrawdown(Pclose); % 计算最大回撤
- Z/ d" r. i' T8 s. L" f+ crisk = MaxDD  % 将最大回撤赋值给risk,作为股票的风险
, G* ~$ t3 M+ l! X  3、回归算法演练。
* x5 g2 ^/ P/ x. ?
- S/ u% x7 l$ K9 v4 a(1)一元线性回归
5 |7 K: q2 ~& n* u# a! L' j! c- E6 z  k
[ 例1 ] 近 10 年来,某市社会商品零售总额与职工工资总额(单位:亿元)的数据见表1,请建立社会商品零售总额与职工工资总额数据的回归模型。
" d4 h( c( R1 t# l# T( v$ i' X& X  Y
3 N& q" k5 {8 Z# ?6 W6 ]

$ @, e* `+ W3 [, {, D  o+ j该问题是典型的一元回归问题,但先要确定是线性还是非线性,然后就可以利用对应的回归方法建立他们之间的回归模型了,具体实现的 MATLAB 代码如下:
4 Y1 y& \! O; ^( \6 N. @+ \* S: I
(1)输入数据
# ]3 r& e. r& k7 D- t) X' ~9 T& S. L4 _4 t) T# s9 B1 H3 q# d; I
%% 输入数据
& R+ x+ [% e& G8 a2 l/ ?: Pclc, clear, close all& p4 K& Y! Z+ r, w: J+ a, F
% 职工工资总额+ a6 I- P# [" u
x = [23.8,27.6,31.6,32.4,33.7,34.90,43.2,52.8,63.8,73.4];
4 j/ l$ _/ n0 W7 ^% 商品零售总额
2 Y/ R( ^4 d$ R4 a- g! Py = [41.4,51.8,61.7,67.9,68.7,77.5,95.9,137.4,155.0,175.0];
3 a; v8 M# O6 a0 A8 z, [(2)采用最小二乘回归
5 Q' R/ a& D3 W0 |7 r
* ~) u" J8 v% z, ]* N%% 采用最小二乘法回归& M& {- `2 G- ?9 R9 c
% 作散点图* v' L" A" e1 s. Z+ t
figure
) s! D+ @( |9 \8 K9 F4 l/ r: fplot(x,y,'r*') % 散点图,散点为红色$ [+ U& }7 Z* `5 N/ w
xlabel('x(职工工资总额)','fontsize',12)
& Q; L/ l) i5 dylabel('y(商品零售总额)','fontsize',12)
3 @7 k! `7 o. Z+ L: Mset(gca, 'linewidth',2) % 坐标轴线宽为2' @: r  |. p3 p
4 M; g# N3 a' G7 j) |
% 采用最小二乘法拟合
/ e! O! q4 k- s+ `# g  [, J0 kLxx = sum((x-mean(x)).^2); %在列表运算中,^与.^不同9 L2 @5 F9 `. s, w" s
Lxy = sum((x-mean(x)).*(y-mean(y)));$ r  c  `. k  i* u" @0 j
b1 = Lxy/Lxx;
/ {" p; Q; I8 |& B; n$ sb0 = mean(y) - b1 * mean(x);; N/ T' m' n) Z9 i, q3 l0 P, S6 u
y1 = b1 * x + b0;
5 U* v- R. o: ?" e, ]0 J* i  s
, N9 \' ^  X  A6 s, [hold on % hold on是当前轴及图像保持而不被刷新,准备接受此后将绘制的图形,多图共存+ p8 d' e& z& l+ m; Y, k4 r7 ^
plot(x,y1, 'linewidth',2);% x3 X4 l* G( k& c
运行本节程序,会得到如图5所示的回归图形。在用最小二乘回归之前,先绘制了数据的散点图,这样就可以从图形上判断这些数据是否近似成线性关系。当发现它们的确近似在一条线上后,再用线性回归的方法进行回归,这样也更符合我们分析数据的一般思路。
1 k- Y" j0 n7 t+ A1 I6 v7 @+ s2 K9 O6 M# U

0 {3 C; s4 ]  I2 }+ h) u$ J) r% J$ Z' G7 r8 q
                                                                                                    图5, t% ^) T  J3 f& M0 h7 U( N& B

4 I& ~6 w- P! J+ z0 G4 a(3)采用 LinearModel.fit 函数进行线性回归
( W) d& t. j" o+ K! V6 t; V9 J- p; f* u2 ]2 H" A  l) L9 v
%% 采用 LinearModel.fit 函数进行线性回归
0 h& a2 h$ |$ u4 P6 e# v3 xm2 = LinearModel.fit(x, y)
) e% T2 E* y$ T5 i2 ~. K运行结果如下:) a+ z! _! p# t9 i" ?8 l
1 P, W4 j) K  b. R; A! N, Z. ^7 v
m2 =) z2 |, W( @- I3 l( _
# Y) D: a+ c5 t# D
Linear regression model:3 L/ r& @/ T5 [
- S- F5 |6 l' `' ?: _1 ^
    y ~ 1 + x1
7 s7 T9 U1 a- h7 R9 I  F2 ZEstimated Coefficients:
' r* ~, j+ i7 m8 a' Y5 {
5 m0 X& J- _# r) t               Estimate      SE       tStat       pValue : x/ R( e1 t! n$ m# [( J2 P
% M$ Q. D! ?' }! {" g: W
    (Intercept)    -23.549      5.1028    -4.615     0.0017215; q2 o) V2 S# I3 f+ i

5 z$ i( R6 \6 d+ B& B    x1           2.7991     0.11456    24.435    8.4014e-09
# i/ L- M$ S$ G6 {" d2 \1 P- x1 m3 c# c* ~" ]# D
R-squared: 0.987,  Adjusted R-Squared 0.985& m3 a, J( N4 {: L" s/ e" e4 ]8 B

% h, C) {( e4 x1 |; u" ]F-statistic vs. constant model: 597, p-value = 8.4e-09
% Q+ q  I- u4 H0 c! j1 m' w6 j; ]  Z5 s9 u( A" b
如下图,我们只需记住-23.594是一次函数的中x的系数,2.7991是一次函数中的常数项即可,其它的不用理会。0 r# m9 M! Y: P, }/ l
7 P- S, ^/ o. W7 V7 d4 j

0 l- O% C5 `8 @
  T* L+ u) j) W. q) P4)采用 regress 函数进行回归4 M9 d/ ?1 |8 R: \7 N  G0 G
& P1 H6 P$ ]' ?' F
%% 采用 regress 函数进行回归. S* S; ?. v( M3 r9 W! R
Y = y'" k7 J6 g7 K) e6 B6 N3 L
X = [ones(size(x,2),1),x']# \% E. Y1 H, D$ x* j6 r" ?
[b,bint,r,rint,s] = regress(Y,X)
* f2 ~& A) S; b2 A! o7 F运行结果如下:
  {; M9 @9 o8 A* D, D5 j& Y8 g& b, t+ {& h* d
b =
; H% w, Y* d# n( e! ^
( r# m6 t1 F6 Y  -23.5493
+ O) W1 n& |1 J+ m) A2 {9 j& i+ Q9 I- B+ M  ]0 ^
    2.7991
2 ~& ?& B" \+ D  f
+ u0 O/ ]! {1 }我们只需记住-23.594是一次函数的中x的系数,2.7991是一次函数中的常数项即可,其它的不用理会。4 v8 j, q4 M! g& Q
4 [, ~1 O/ h( A  |9 I# T
(2)一元非线性回归
1 {/ v5 N4 x# t" R% F/ {1 x- O# S
9 y+ A% P* G( t$ `  s[ 例2 ] 为了解百货商店销售额 x 与流通率(这是反映商业活动的一个质量指标,指每元商品流转额所分摊的流通费用)y 之间的关系,收集了九个商店的有关数据(见表2)。请建立它们关系的数学模型。
2 P' S0 C" n" ~% H1 K2 u
3 B) A) A% \8 \  P" y# p. F# k# ~( E% o8 B0 w& A# B
8 B. Q8 i& c& P- \, O/ A! H2 e# m" j

0 m7 o, M$ Z! ?6 C3 c7 G( ^% k" n2 ^& e4 ~. a4 {
        为了得到 x 与 y 之间的关系,先绘制出它们之间的散点图,如图 2 所示的“雪花”点图。由该图可以判断它们之间的关系近似为对数关系或指数关系,为此可以利用这两种函数形式进行非线性拟合,具体实现步骤及每个步骤的结果如下:& I/ u8 i& j3 ^7 i

' ]  R, A3 k" Z! Z) V(1)输入数据8 z( k6 f* [  v+ {& O- \2 P2 v& \
: b& c1 y4 I4 V4 l5 {/ J
%% 输入数据/ Z. k2 [& T% C! E+ l6 i$ H
clc, clear all, close all6 H5 d7 K+ Q, n% `8 }! D
x = [1.5, 4.5, 7.5,10.5,13.5,16.5,19.5,22.5,25.5];
8 F7 T5 K9 t% b0 L4 ay = [7.0,4.8,3.6,3.1,2.7,2.5,2.4,2.3,2.2];. T' H$ H5 c% E9 Q
plot(x, y, '*', 'linewidth', 1) % 这里的linewidth指的是散点大小
2 B$ _  z1 R7 J0 ]" V7 ~* dset(gca,'linewidth',2) % 设置坐标轴的线宽为2# v) }; I# s7 M$ F8 l) R
xlabel('销售额x/万元','fontsize',12). q- @0 K  Y$ E% K: F; l
ylabel('流通率y/%','fontsize',12)
( g' |0 w* E9 {" T, A/ Y7 F(2)对数形式非线性回归* ^/ P" S# J$ `  L% G
! M* {0 E4 @& ?/ [/ l
%% 对数形式非线性回归
4 i3 p3 J, g- s. b" Vm1 = @(b,x) b(1) + b(2)*log(x);
$ Y3 _% b- t6 k  Dnonlinfit1 = fitnlm(x,y,m1,[0.01;0.01]). W5 t- |7 x: {5 V0 B1 W
b = nonlinfit1.Coefficients.Estimate;
, A" g, j8 e4 z/ r$ o! tY1 = b(1,1) + b(2,1)*log(x);5 V8 v/ S0 a2 l5 h7 j' e0 ]
hold on 4 m6 K( S. d* S8 b* E, W+ C
plot(x, Y1, '--k', 'linewidth',2)
1 N% J% m: N) k- z( i运行结果如下:8 n3 H" j9 b/ p! }3 t/ T- Q  [

* D/ V/ B4 z; d4 y  inonlinfit1 =
$ l7 L: |) Z; l) w2 }
+ c0 Z' V; a: M; ENonlinear regression model:8 y( S5 Z. X% E; j$ B

# N% ]: q6 K0 n6 v- `8 S0 F, e5 @    y ~ b1 + b2*log(x)
# |6 U( s: Q  N3 O6 I- D; v9 ^6 d' K% z/ X
Estimated Coefficients:
1 K; O0 B9 O& S- M. g& J3 n. [' E( m
          Estimate      SE        tStat       pValue   F2 `8 h, b4 D3 u- `  h3 x
5 ^3 i2 h1 F) h9 S: L, Y& J* w9 X9 P! _
    b1    7.3979      0.26667     27.742    2.0303e-083 X$ K& n  h9 z

% T& i# C% F& M! r; e- i    b2    -1.713      0.10724    -15.974    9.1465e-07) u3 j0 j: K3 A+ s' C# b

& t  a2 f; k4 H' aR-Squared: 0.973,  Adjusted R-Squared 0.969* q/ t# i7 o/ y; A8 ?1 `
# H, B0 N5 i. `; D. R' t3 e
F-statistic vs. constant model: 255, p-value = 9.15e-07
5 N' F; V: k: Y; ]+ P6 }& A% E
" A4 r- C6 a5 I0 l$ i/ n* Z(3)指数形式非线性回归
' s" ~6 i% Y$ d9 W4 ~. p# w5 o/ G4 V# p+ h/ U# ^8 v6 h
%% 指数形式非线性回归& I2 {/ S& L1 X  x3 E
m2 = 'y ~ b1*x^b2';
, b  y7 {# F2 T9 {5 K8 _4 ^0 E8 Xnonlinfit2 = fitnlm(x,y,m2, [1;1])
  j6 D; o1 J% Cb1 = nonlinfit2.Coefficients.Estimate(1,1);9 L" ]: X0 q- O( {
b2 = nonlinfit2.Coefficients.Estimate(2,1)  Q+ C$ J8 H9 v: k, q
Y2 = b1*x.^b2;6 d  F1 ]+ f) j: J
hold on;
& a/ r  b3 x$ I' c, ]plot(x,Y2,'r','linewidth',2)
7 C9 [+ W5 q8 N7 c3 [: G( k  Llegend('原始数据','a+b*lnx','a*x^b') % 图例
+ F8 ^. }& l( W运行结果如下:
9 l8 C1 m, g$ f  r
$ P+ {6 k& {9 b0 Bnonlinfit2 =& V2 @. ~1 J: Z8 w0 V& t' A
. [* ^9 j" Y, \0 U) S8 r( \# ~
Nonlinear regression model:( R1 N- N1 [; e4 m) u6 L" A
2 W, ~8 _6 f/ U1 F( \$ \1 T  e
    y ~ b1*x^b2
+ I: V! c2 n2 B8 B5 f  v
4 w+ }/ U: R) \Estimated Coefficients:
6 ]- u7 f: W# b, r2 y/ j  D* l. A1 Q" y1 u) O
          Estimate       SE        tStat       pValue $ |0 [# P* M' v. i" _$ L

1 U1 e' ~# [: h/ ~    b1      8.4112     0.19176     43.862    8.3606e-10
8 L8 N/ {9 S, d% Q# x/ x0 M1 T5 I* O: m. }+ F8 \0 {$ T$ ~* I) k
    b2    -0.41893    0.012382    -33.834    5.1061e-09
+ M$ ?) }- O* i. ?- R( h8 |  F/ m: g1 z5 j( r
R-Squared: 0.993,  Adjusted R-Squared 0.992
8 |! s+ k! J2 |& O. V  x
0 h+ [$ p5 ?3 d5 B( W% Q$ b6 [F-statistic vs. zero model: 3.05e+03, p-value = 5.1e-11
4 v9 z" w8 s  L$ E8 t
; X2 U$ c! p+ t* h6 C& P# Q在该案例中,选择两种函数形式进行非线性回归,从回归结果来看,对数形式的决定系数为 0.973 ,而指数形式的为 0.993 ,优于前者,所以可以认为指数形式的函数形式更符合 y 与 x 之间的关系,这样就可以确定他们之间的函数关系形式了。
: R, }# Z% l: n3 E" m; i7 P* L2 E) Q) M# @% H* G
2.多元回归  I! q$ U# f, Y) ~0 ~3 q" I4 q
6 W- Z! Y, a) B5 R' @1 I
1.多元线性回归$ Z  D# ~, f- {2 r) N

  T" U1 b% k8 Z6 O: z- b[ 例3 ] 某科学基金会希望估计从事某研究的学者的年薪 Y 与他们的研究成果(论文、著作等)的质量指标 X1、从事研究工作的时间 X2、能成功获得资助的指标 X3 之间的关系,为此按一定的实验设计方法调查了 24 位研究学者,得到如表3 所示的数据( i 为学者序号),试建立 Y 与 X1 , X2 , X3 之间关系的数学模型,并得出有关结论和作统计分析。* A8 d1 R: z1 U6 w0 |
9 e: r7 Y" K( i0 {

8 Y% I7 T+ D( X' `  X
7 n, W0 K: p! ~- |9 x/ i该问题是典型的多元回归问题,但能否应用多元线性回归,最好先通过数据可视化判断他们之间的变化趋势,如果近似满足线性关系,则可以执行利用多元线性回归方法对该问题进行回归。具体步骤如下:/ Q* T; Z! M/ {" L

" |7 c, Y3 e$ `(1)作出因变量 Y 与各自变量的样本散点图) x" a; p6 f$ v' r/ i# c8 s
7 V' g. r' \% l) O
作散点图的目的主要是观察因变量 Y 与各自变量间是否有比较好的线性关系,以便选择恰当的数学模型形式。图3 分别为年薪 Y 与成果质量指标 X1、研究工作时间 X2、获得资助的指标 X3 之间的散点图。从图中可以看出这些点大致分布在一条直线旁边,因此,有比较好的线性关系,可以采用线性回归。绘制图3的代码如下:
$ u: [! z' h& p4 ]1 e) k/ L
* t$ t* P( M: M# A( L. S%% 作出因变量Y与各自变量的样本散点图; n9 `8 U$ a+ F* f
% x1,x2,x3,Y的数据
5 W! Z5 \$ f" V2 f8 I5 d4 v. J6 S( ex1=[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];" H7 ?- G/ P3 m9 W  P
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];( N5 u* b  C3 }3 L" S0 j
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];" ~, M0 g/ A% h' d, c4 ]4 `
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];, O8 p6 S) F3 J; W3 m
% 绘图,三幅图横向并排
" P& h2 c* C. T8 r, X& ysubplot(1,3,1),plot(x1,Y,'g*')+ p* }% f; |3 h: A
subplot(1,3,2),plot(x2,Y,'k+')  \8 W" G  M/ Y- ~% G# f" d
subplot(1,3,3),plot(x3,Y,'ro')! P, I4 ~8 z$ ?$ `- O
绘制的图形如下:
1 b: s# X5 b, L* x0 V; t% B2 c# G. B8 K" g& K5 |$ u5 Q
" x% o. `( h/ t3 D' J5 S

" u' X# Q6 h* ]: z1 u9 Z$ E7 x7 P(2)进行多元线性回归
! k; ^  Z. n0 q- C6 ^* C+ X: S
7 a* [2 l2 ]1 ?# Y& t/ {( }这里可以直接使用 regress 函数执行多元线性回归,注意以下代码模板,以后碰到多元线性问题直接套用代码,具体代码如下:
- _9 m& F% ^4 [  J/ E5 l' v6 I
! Q$ N. m0 j7 r1 ~, _3 H%% 进行多元线性回归
$ a7 ?# _/ V* g% K% Dn = 24; m = 3; % 每个变量均有24个数据,共有3个变量4 H5 e+ E/ ~: E2 \* y: q: }$ L
X = [ones(n,1),x1',x2',x3'];
: U4 O/ v5 ]2 C' ~3 K+ v7 Q5 I- X9 Q& C+ M[b,bint,r,rint,s]=regress(Y',X,0.05) % 0.05为预定显著水平,判断因变量y与自变量之间是否具有显著的线性相关关系需要用到。$ u+ \& A4 M9 n) S) u
运行结果如下:
' Q2 M3 C6 C3 R6 `% y
( l/ V3 o( O& U5 M' vb =
; I; l1 k" `2 D* U3 G2 y; X' J$ e5 D' ]% y% J. W% Y
   18.0157
9 w  @7 n- {" f; A    1.0817
9 D( {" a$ |/ O. W! P9 U4 [) h' Z/ L    0.3212. b0 h& W* N/ g0 C3 u- C2 e) B
    1.2835
5 [  o: E4 b" h3 b% F1 T: |
9 U0 j1 _* _7 D5 i
( A( Y' E; ^6 h+ x, Xbint =4 D: U" Y' I6 f& c& ~
  @- g" U' |7 q% n
   13.9052   22.1262
+ a% F4 |) c, P: B) [* q    0.3900    1.7733
2 {# }% v- N% ~2 Z8 N% d$ M0 Z    0.2440    0.3984
% R1 N' f7 T5 T* i8 Y    0.6691    1.8979
) O/ ?2 c) o' e+ F! g. Y
* `5 x4 c0 b: b! X/ M9 ^
; k+ F* k- Q9 M; s' q% I  ]r =6 P+ {+ k" _+ @5 e" d7 u
- N8 L- y& a1 \# k& _; B+ ^3 M5 d
    0.67817 C; H, u! Y/ a2 Z- i, Z& k  X3 S
    1.9129
3 f2 ]$ u7 p3 s" r. a: J- P) _- m   -0.1119
, i; e% u9 P( N    3.3114: C1 h  x: a) C' r
   -0.74244 S  ]4 P+ |# t& L7 }" l" g
    1.2459
/ \. `1 z* M) b& l" n2 s6 W   -2.1022  o5 ?4 \4 a5 X% r9 B2 g# q1 L( j
    1.9650) U/ L; Z% a5 w' l
   -0.3193
9 x$ {0 L. {3 s4 l    1.3466
& t3 X3 c4 @/ P- k5 t$ c    0.8691( m5 ~/ Z: G1 I* k- d7 N- C
   -3.2637
1 C5 D1 L" d0 Q" B0 q. ?   -0.51159 @' B. G  U9 g$ m
   -1.1733
2 Q4 m2 ?" b3 F( j   -1.4910* L  D4 t9 X  _9 A" t3 m5 J  N
   -0.2972
& y( T# J0 l( s1 V: A    0.1702
- {% e' c9 D4 ?) }0 s3 e    0.5799
! f) q. q9 \; O% m# S) Z  m   -3.2856% Q7 O1 ?# t4 X
    1.1368
2 D4 e, i5 ~2 |  G* ^3 A   -0.8864
' W! s4 a* ~3 k- ?/ }; a  a   -1.4646
. F" y" n" t' u9 b) p    0.8032, G5 U8 R$ i$ U! Z( B
    1.6301/ D3 C7 W+ x3 N, d

) s$ a- l' ]7 S2 _" N7 ~# p
2 x+ \% H' |) E9 ?5 o5 o. ~rint =5 P3 Q7 s" M) F8 r/ i
: n4 I$ A7 s( ~
   -2.7017    4.0580
. {# {) m, x) n- q& R6 I$ Z   -1.6203    5.4461
4 l/ R6 `( f2 X8 K. J  I1 z   -3.6190    3.3951
9 Y  C7 K, V' s  |    0.0498    6.5729
# Q  g  ^) ^5 I   -4.0560    2.5712
1 m7 H: [9 z3 Y/ _9 b5 c   -2.1800    4.6717
( v1 j& H. J' J6 Z. _5 l   -5.4947    1.2902
3 G& R# M+ b! M% I4 x: U9 G1 h' H   -1.3231    5.2531" r4 v& [7 Z7 ?
   -3.5894    2.9507
! q# i+ {" [7 s. w" J" H4 X   -1.7678    4.4609
& @5 b/ r# V) Q! B1 z   -2.7146    4.4529
0 C2 @$ @% C' l9 B% P7 L1 L1 _# A. D   -6.4090   -0.1183
1 z# J( Z$ ~0 H- o   -3.6088    2.5859
) }7 _* D6 B' t   -4.7040    2.3575
! z* f/ _# b% C1 E3 }   -4.8249    1.8429
$ ~0 a3 c1 h# Z$ u8 U8 M   -3.7129    3.1185; }- [* t; ]3 I% X! ?8 h1 o
   -3.0504    3.3907+ Y7 M: o/ c: g' n7 l! `8 d
   -2.8855    4.04531 k/ R0 Z# I! l& C1 V
   -6.2644   -0.3067
9 y5 V- J3 F9 I2 y9 G3 u   -2.1893    4.46303 }' O2 I) ]# D! f4 x
   -4.4002    2.6273
" Q# n$ Z2 X6 Z$ R+ m   -4.8991    1.9699- |4 D$ y# R8 T' v0 |3 e
   -2.4872    4.09377 _$ L: ^0 M* v
   -1.8351    5.09541 K6 K; D( L3 K+ B* ~' i
+ k- S- E* K" O7 K
0 `1 {$ _6 y' _  E0 `3 {# m
s =
" x+ [  A% ?* |& b6 c7 M# J. z. K5 @
' F4 S4 ?5 \- H2 y    0.9106   67.9195    0.0000    3.07191 E- i( s% [+ P7 H  Y
看到如此长的运行结果,我们不要害怕,因为里面很多数据是没用的,我们只需提取有用的数据。
$ D* O7 {; p& W6 L, k) E; `4 B# U4 w) n
在运行结果中,很多数据我们不需理会,我们真正需要用到的数据如下:
* x) H8 H4 Z( C* H
" w- g) p5 W- s1 Gb =$ b* D' g- o( R7 K. M3 t. i9 j
2 e4 B' X- F1 m% v/ @: f
   18.0157; J# i1 g+ R" m6 y! m0 A
    1.0817
; g3 A& ]; `/ P3 v; D1 W/ |' T4 ~    0.3212
1 d+ P7 _: a8 l# L/ n. r    1.2835
& q: ~8 o' i! _/ U& ]  F
2 R4 E% V8 `& d' f3 Qs =
" S, Y+ `( G  ^- [& L! @% r& t9 D4 X" o1 R
    0.9106   67.9195    0.0000    3.0719, u$ L& k$ i$ c5 t3 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:
- [+ T2 k( \3 C1 I4 x. t3 B* E; z

4 P6 J8 P4 ?/ e, a5 d" R- D" Y! f3 ^5 h) Z. v
根据β0,β1,β2,β3,我们初步得出回归方程为:% F1 m  S4 t$ }& W: G
$ B1 B- m5 \2 P2 X2 ~% ]. @

' J8 {" i- @2 \4 x# A) P: G0 D! T
" V: y/ ~! M4 E" I3 |* W) C如何判断该回归方程是否符合该模型呢?有以下3种方法:
& j! R, S5 O" X# s7 Q8 _3 g: {/ n* u; h- E& T. z+ k# S0 _7 W
1)相关系数 R 的评价:本例 R 的绝对值为 0.9542 ,表明线性相关性较强。% i7 ^5 c+ ~1 j; B( J

; R* M7 L! [1 ^& b2)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。! V1 c4 X- W* ~) t& W# d/ c0 \

; E' G( }" A0 Z5 B3)p 值检验:若 p < α(α 为预定显著水平),则说明因变量 y 与自变量 x1,x2,...,xm之间显著地有线性相关关系。本例输出结果,p<0.0001,显然满足 p<α=0.05。3 o; r7 z, I+ @# W' Z& H& ]
$ \: G# m9 @* u! O
以上三种统计推断方法推断的结果是一致的,说明因变量 y 与自变量之间显著地有线性相关关系,所得线性回归模型可用。s^2 当然越小越好,这主要在模型改进时作为参考。
* q2 ]. r! ^% V7 v( ~* V: F
/ b/ }+ ]7 R! D+ t" `# f( M3. 逐步回归( ~7 C7 a! j+ m6 Y

) T6 f6 O5 G& k' p0 u0 R[ 例4 ] (Hald,1960)Hald 数据是关于水泥生产的数据。某种水泥在凝固时放出的热量 Y(单位:卡/克)与水泥中 4 种化学成品所占的百分比有关:
, K- P5 Q' L3 u+ ]" P+ z: i9 u- E  f3 T0 C9 V
8 o. O3 N% t# S9 }

  b; c$ G; n8 U0 p! V4 a5 j' w2 D在生产中测得 12 组数据,见表5,试建立 Y 关于这些因子的“最优”回归方程。
5 X5 F2 P( u) y$ M2 [( N
; Z4 N6 X7 `/ b% d
- |* a* r/ o$ c$ c
% t5 v! }9 X9 I4 x* v5 t对于例 4 中的问题,可以使用多元线性回归、多元多项式回归,但也可以考虑使用逐步回归。从逐步回归的原理来看,逐步回归是以上两种回归方法的结合,可以自动使得方程的因子设置最合理。对于该问题,逐步回归的代码如下:) p$ j- x& i5 q9 P% |- X
: q5 X, L* d, d+ B( @
%% 逐步回归
5 n1 v3 H# q  t- K, S/ Z' N5 r4 hX=[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];   %自变量数据
  _6 b5 R# E) nY=[78.5,74.3,104.3,87.6,95.9,109.2,102.7,72.5,93.1,115.9,83.8,113.3];  %因变量数据, Q* b& A" T3 `6 t; w* U
stepwise(X,Y,[1,2,3,4],0.05,0.10)% in=[1,2,3,4]表示X1、X2、X3、X4均保留在模型中+ }3 n5 |8 }6 J, J8 a  _; p
程序执行后得到下列逐步回归的窗口,如图 4 所示。% n: G  E6 P/ H; M
/ L6 n7 v# D  j& U2 X5 ^
1 x( ~2 _9 [; n5 R0 u

, a! r0 B! q# y# @- A4 m                                                                                                             图40 e5 d0 {; g9 [" {# r* y* A3 Q

. V* A2 [) P% Y/ o2 v在图 4 中,用蓝色行显示变量 X1、X2、X3、X4 均保留在模型中,窗口的右侧按钮上方提示:将变量X4剔除回归方程(Move X4 out),单击 Next Step 按钮,即进行下一步运算,将第 4 列数据对应的变量 X4 剔除回归方程。单击 Next Step 按钮后,剔除的变量 X3 所对应的行用红色表示,同时又得到提示:将变量 X3 剔除回归方程(Move X3 out),单击 Next Step 按钮,这样一直重复操作,直到 “Next Step” 按钮变灰,表明逐步回归结束,此时得到的模型即为逐步回归最终的结果。最终结果如下:
' f, c+ [# y5 g, \' o+ I. k! V( U* H0 C# ^2 r

4 R' t2 s, P, a$ @! X
, i; {8 C: c: A9 d1 D4. 逻辑回归1 C# v4 ^8 x) k% G  [( [

$ p, r" u  n' g$ D4 W+ f[ 例5 ] 企业到金融商业机构贷款,金融商业机构需要对企业进行评估。评估结果为 0 , 1 两种形式,0 表示企业两年后破产,将拒绝贷款,而 1 表示企业 2 年后具备还款能力,可以贷款。在表 6 中,已知前 20 家企业的三项评价指标值和评估结果,试建立模型对其他 5 家企业(企业 21-25)进行评估。% }) h: w, _  }9 `5 S

2 h+ c/ s# G$ w0 E; `3 v" X. i; T% |1 ?. O8 j5 t8 ]

# I- X+ q; A& P- p- C- y; b+ N对于该问题,很明显可以用 Logistic 模型来回归,具体求解程序如下:, G  a$ s9 f% ^8 B) ?, b

2 L; ], V$ A# K- j) o. F7 N程序中需要用到的数据文件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
! ^! U. L$ `5 c: p& R3 }# L+ r( _! z* {- C, Q- y
% logistic回归" F% |1 U9 r- ^3 ]( t4 {8 [4 G

- f) o/ L% M6 }%% 导入数据  R4 Y5 m# `. C+ x- A: R  c
clc,clear,close all/ G$ L4 u( V: q4 U( n% p
X0 = xlsread('logistic_ex1.xlsx','A2:C21'); % 前20家企业的三项评价指标值,即回归模型的输入9 K+ i) J9 M, H5 Y9 ]( g' L4 D
Y0 = xlsread('logistic_ex1.xlsx','D221'); % 前20家企业的评估结果,即回归模型的输出
4 i- d" }/ }5 F0 H& EX1 = xlsread('logistic_ex1.xlsx','A2:C26'); % 预测数据输入6 n5 O$ u0 I+ A/ ^% c1 J2 [4 r& }
% h. \) l! l6 K4 c, v2 \/ s7 C
%% 逻辑函数3 I& ]" ]' C& p/ W' F7 m
GM = fitglm(X0,Y0,'Distribution','binomial');  Q/ \; j( X. z7 r
Y1 = predict(GM,X1);( \9 |  J* o& U# [5 W

' c- |  T5 F$ d+ E; H6 }%% 模型的评估
6 F3 m2 u/ u7 J) x, cN0 = 1:size(Y0,1); % N0 = [1,2,3,4,……,20]# c, w! I% \$ r5 H& V
N1 = 1:size(Y1,1); % N1 = [1,2,3,4,……,25]1 w$ {2 m% P* c8 l  ~/ @0 X) d
plot(N0',Y0,'-kd'); % N0'指的是对N0'进行转置,N0'和Y0的形式相同,该行代码绘制的是前20家企业的评估结果! p3 J2 Z# H$ \7 r$ C
% plot()中的参数'-kd'的解析:-代表直线,k代表黑色,d代表菱形符号# f2 w- p. B; D5 H: A8 U( z
hold on;  V8 q! ^# x. n* w: k0 w9 r6 X
scatter(N1',Y1,'b'); % N1'指的是对N1'进行转置,N1'和Y1的形式相同9 B1 Q8 }# p7 @' }% P2 L
xlabel('企业编号');! l; c; a) h. I+ D& ~
ylabel('输出值');2 |1 {  g9 k1 r0 p  ?5 c# ?5 k
得到的回归结果与原始数据的比较如图5所示。
4 n! Y% Z4 P, V0 H5 b
9 h( L- m1 H7 Q6 A, W7 z. [
( X/ }" X; L; X% {4 S% \) C8 ^% c8 a) L3 Q& Y! [
                                                                   图5
9 ?0 j1 y4 _% ]' @
% ?  g2 C% @, T1 w3 D+ e4 }( D三、总结与感悟。 % Y: L- x! d) ^( a3 h

& D+ Y2 a1 S0 {3 p# d6 N2 D$ @! c        总结:通过这次学习,我了解到Matlab在数学建模竞赛中使用广泛;在评估股票价值与风险的小实例中,我掌握了用Matlab去建模的基本方法和步骤;在回归算法的学习过程中,我掌握了一元线性回归、一元非线性回归、多元线性回归、逐步回归、逻辑回归的算法。
; Y4 w* \: e# |8 x4 L
% k: F9 I7 ~1 K; m        感悟:正确且高效的 MATLAB 编程理念就是以问题为中心的主动编程。我们传统学习编程的方法是学习变量类型、语法结构、算法以及编程的其他知识,因为学习时候是没有目标的,也不知道学的知识什么时候能用到,收效甚微。而以问题为中心的主动编程,则是先找到问题的解决步骤,然后在 MATLAB 中一步一步地去实现。在每步实现的过程中,遇到问题,查找知识(互联网时代查询知识还是很容易的),定位方法,再根据方法,查询 MATLAB 中的对应函数,学习函数用法,回到程序,解决问题。在这个过程中,知识的获取都是为了解决问题的,也就是说每次学习的目标都是非常明确的,学完之后的应用就会强化对知识的理解和掌握,这样即学即用的学习方式是效率最高,也是最有效的方式。最重要的是,这种主动的编程方式会让学习者体验到学习的成就感的乐趣,有成就感,自然就强化对编程的自信了。这种内心的自信和强大在建模中会发挥意想不到的力量,所为信念的力量。  U9 {. m2 L% p
9 E# I& k+ S! ~. Q' g
7 f- b/ ?" s  `5 H4 q! U$ S% N





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