, k, q1 `8 T" G6 L数学建模 ————统计问题之预测(一)7 q6 Z% b$ e/ v. J: H8 k
该资料是笔者根据自身理解一点点写出来的,希望各位能尊重这一份来之不易的劳动成果。因个人水平有限,资料中难免会出现不足与错误,欢迎各位的批评指正。(笔者曾获得2015年全国大学生数学建模国家一等奖,2015研究生数学建模竞赛国家二等奖,2016年美国大学生数学建模竞赛M奖)" g+ d) P% b2 F! Y
. r* \/ X# l2 K
统计算法总览: o) k3 H/ X1 d1 q G
. ~1 x* l) b( f2 @' \: _# E 统计一词源于国情调查,一般来说包括三个含义:统计工作、统计资料和统计科学。其中统计工作是指的搜集、整理和分析客观事物总体数量方面的资料,统计资料则是由统计工作所获得的各项数字或文字资料,一般反映在图表、分析报告、统计年鉴里面,而统计科学则是指导统计工作的原理、原则和方法。6 N: u& g! U, t# e0 Q
因此,在数学建模比赛中统计问题一定要有文献资源和数据资源的搜集,并且这一部分内容也要反映在论文中,而整理通常来说是将搜集到的资料以图表的形式呈现在论文中,最后分析自然就是数据预处理和统计算法建模求解。% u2 |% \9 B. @0 g. R
5 M- ?2 P; z& [6 B8 A& a, z3 A* L 非线性拟合:9 B' j1 a7 D" N% E. l
& d2 J: N; h3 G! k1 \: |, W+ x 多元拟合: ) T; r# k; b3 H! ]8 g0 d% ?8 g+ r; f ~6 K5 a H
如下图所示,该图像是利用了非线性函数对原有数据进行了逼近,有了函数自然也就可以根据输入计算出接下来的数据,所以回归分析也只适用于单输出问题。而回归分析的关键问题就是对某一函数模型的参数进行求解,matlab中有专门的拟合工具箱polyfit和lsqcurvefit: 0 z2 `' k1 i3 h$ F. [--------------- * G; m; u0 `2 c# z9 q - G, Q- G' ~" {$ _2 j( n) f6 K7 N/ n6 g8 {2 W0 a6 o# |
这里给出matlab两种基础的回归分析代码: ! r, k* C: b6 Y# T' t 8 U& Y0 m; [# B/ ~! E- p# m* k ( r, q. l' I4 ^( S" }: `4 Yclc; 1 l$ Z' R3 H7 j# E! Oclear; + u/ W8 x4 p: g) oclose all; # {* {5 ~/ e$ U r, I0 I" a%% 线性最小二乘拟合 8 `) w: [" {9 g0 J. H2 wx = 0 : 0.1 : 1;%输入 - j5 s' ?" Q2 k# n2 ny = [-0.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2];%输出1 p2 v; l- r% U, f. ^; P. I2 E# c
A = polyfit(x, y, 2);%设定多项式最高次为2,且输入输出长度要一致,并输出多项式系数A% U: b4 A3 V3 o1 O
z = polyval(A,x);%将多项式系数导入,即得到函数,然后输入数据x,得到输出数据z # @" E! g3 u. [ yfigure(1)) M. s" G" K9 f& G* @
plot(x, y, 'k+', x, z, 'r') %将原数据以“黑色十字”散点绘出,然后将函数以红色曲线绘出 ; }$ U2 N& `5 x! x% ]# P- Etitle('线性最小二乘拟合');" g' _$ n9 A9 _$ B) n8 c
% h* `: s9 \) l" R2 S; Z$ ?%% 非线性最小二乘回归 - v9 p& S: O/ h8 Lf = inline('a(1)*x+a(2)*x.^2.*exp(-a(3)*x)+a(4)','a','x');%定义一个非线性函数,变量为系数a和自变量x: x3 _% O9 b( j' @
a = lsqcurvefit(f, [1;2;2;2], x, y);%设定系数a的初值为1 2 2 2,然后开始求解;- J- Y( U8 w! ~ f! X% t
figure(2). H- w7 P1 o* M( I' ?
plot(x, y, 'k+', x, f(a,x), 'r') %将原数据以“黑色十字”散点绘出,然后将函数以红色曲线绘出 * o b; X! y9 t! B& p# ^title('非线性最小二乘拟合'); ) g& z3 ]: x& C' l0 D) }7 P! N! R/ A& s
( F0 E; A4 l" o. g ~/ {! S C/ x
效果如下: + M$ Y3 c) ^- T2 n2 z " y5 C! s- z5 S6 _1 }& b7 h (2)概率估计7 O' c8 i& S/ w
% d/ T3 h' a/ Z 而对于概率估计,其中的代表是马尔科夫链算法,即先给数据划分状态,然后将数据的分布规律用状态转移来解释。最后对于当时数据的状态,利用根据状态间的转移概率可以求得未来的状态概率分布,自然也能求得下一状态的预测值。 + E6 N8 w. G3 \, J- ^4 \4 n$ a ! [* Z' V: x/ E, X" x5 M) c 比方说,我只去A,B,C,D四个食堂吃饭,现在告诉你我吃饭的记录,现在就需要计算我在这四个食堂中的转移概率,如我去食堂A吃过后再去四个食堂吃饭的概率是多少?通过这些转移概率不断推算我下一个要去的食堂,再根据四个转移概率得到最大可能去的食堂。但是这只是离散问题的预测,对于连续问题,自然也就需要将连续数据划分为若干个离散的状态,在使用此方法。 6 @7 Q& l9 q' h1 d( Q2 o - n& L' `* c4 W 此方法对于初学者来说掌握会比较困难,不过如果能成功使用会为论文添色不少,有兴趣的同学可以自行查找资料了解。(《数学建模算法与应用》一书上有讲解)& k) c9 f+ s o7 g6 W& U' x
* F: u. B0 ^* h( |$ ~2 @(3)时间序列/ J9 u% b9 z2 F4 q# n
3 C: C. o) |% Y" ]# d1 K% u 第三类称其为时间序列,因为输入是按顺序的离散值,大多数情况下就是时间,针对此类问题,由于输入以稳定步长增长的,所以不用考虑输入,直接研究输出的变化规律,这一点类似于高中学的数列,比方说有名的斐波那契数组:1,1,2,3,5...,它的数据特征是f(n+2)=f(n)+f(n+1),现在我们要求后面的数就直接利用该数据特征就行了,当然也可以求出其通项公式,有兴趣的同学可以求着试试。 1 m$ q8 C4 z; J- D" o' ^7 ?8 K* R5 v9 ~+ ^" y H) F
而时间序列方面的算法其实就是猜测数据前后存在着什么关系,比如说:一次移动平均算法就是猜测每一个数据 与最近的部分数据的均值存在着某种关系,指数平滑法就是猜测每个数据都跟之前的历史数据的加权平均存在着某种关系。这些算法都可以算作是时间序列算法,不过以上算法都是对数据特征简单的猜测,而对于更复杂的数据特征则可能会用到微分方程,利用微分方程,即可以直接预测,还能用于灰色系统,从而将无规则数据转化为有规律的生成序列。 ( V2 K' T& F2 W) @% W8 @; s k/ c1 M. \& R2 J' X& m
(4)机器学习" S, G9 x1 |; y3 E; H- S' x
+ R Y j9 G r* g) a, j/ @(5)模型检验 5 k! z: \1 |, N. M6 c6 h& r5 v) U2 u+ E* T% p, b
预测问题中尤其还要注意的是对结果的检验,通常使用残差和后验误差等作为概率统计的检验,也可以用均方误差MSE检验。& e$ {! Y& I" N% v0 Y
$ ?) Z) ^0 o! T' W5 h F 残差值反映了预测值和原始数据的相对差距:- j9 k) h% ?" D3 t5 n
: Z4 A9 y* t$ k- R