❶ 【数学建模算法】(29)数据的统计描述和分析(上)
数理统计 研究的对象是受随机因素影响的数据,以下数理统计就简称统计,统计是以概率论为基础的一门应用学科。
数据样本少则几个,多则成千上万,人们希望能用少数几个包含其最多相关信息的数值来体现数据样本总体的规律。描述性统计就是搜集、整理、加工和分析统计数据,使之系统化、条理化,以显示出数据资料的趋势、特征和数量关系。它是统计推断的基础,实用性较强,在统计工作中经常使用。
面对一批数据如何进行描述与分析,需要掌握 参数估计 和 假设检验 这两个数理统计的最基本方法。
我们将用 Matlab 的统计工具箱(Statistics Toolbox)来实现数据的统计描述和分析。
一组数据(样本)往往是杂乱无章的,做出它的频数表和直方图,可以看作是对这组数据的一个初步整理和直观描述。
将数据的取值范围划分为若干个区间,然后统计这组数据在每个区间中出现的次数,称为 频数 ,由此得到一个频数表。以数据的取值为横坐标,频数为纵坐标,画出一个阶梯形的图,称为 直方图 ,或 频数分布图 。
若样本容量不大,能够手工做出频数表和直方图,当样本容量较大时则可以借助Matlab这样的软件了。让我们以下面的例子为例,介绍频数表和直方图的作法。
(1)数据输入
数据输入通常有两种方法,一种是在交互环境中直接输入,如果在统计中数据量比较大,这样作不太方便;另一种办法是先把数据写入一个纯文本数据文件data.txt中,数据列之间用空格和Tab键分割,之后以data.txt为文件名存放在某个子目录下,用Matlab中的load命令读入数据,具体做法是:
先把txt文件移入Matlab的工作文件夹中,之后在Matlab命令行或脚本中输入:
这样就在内存中建立了一个变量data它是一个包含有 个数据的矩阵。
为了得到我们需要的100个身高和体重均为一列的数据,我们对矩阵做如下处理:
(2)作频数表及其直方图
求频数用hist函数实现,其用法是:
得到数组(行列均可) 的频数表。它将区间 等分为 份(缺省时 为10), 返回 个小区间的频数, 返回 个小区间的中点。
同样的一个函数名hist还可以用来画出直方图。
对于本例的数据,可以编写如下程序画出数据的直方图。
得直方图如下:
下面我们介绍几种常用的统计量。
算术平均值 (简称均值)描述数据取值的平均位置,记作 ,
中位数 是将数据由小到大排序后位于中间位置的那个数值。
Matlab 中 mean(x)返回 x 的均值,median(x)返回中位数。
标准差 定义为:
它是各个数据与均值偏离程度的度量,这种偏离不妨称为 变异 。
方差 是标准差的平方 。
极差 是 的最大值与最小值之差。
Matlab 中 std(x)返回 x 的标准差,var(x)返回方差,range(x)返回极差。
你可能注意到标准差 s 的定义(2)中,对 的平方求和却被 除,这是出于无偏估计的要求。若需要改为被 除,Matlab 可用 std(x,1)和 var(x,1)来实现。
随机变量 的 阶 中心距 为 。
随机变量 的 偏度 和 峰度 指的是 的标准化变量 的三阶中心矩和四阶中心矩:
偏度反映分布的对称性, 称为右偏态,此时数据位于均值右边的比位于左边的多; 称为左偏态,情况相反;而 接近 0 则可认为分布是对称的。
峰度是分布形状的另一种度量,正态分布的峰度为 3,若 比 3 大得多,表示分布有沉重的尾巴,说明样本中含有较多远离均值的数据,因而峰度可以用作衡量偏离正态分布的尺度之一。
Matlab 中 moment(x,order)返回 x 的 order 阶中心矩,order 为中心矩的阶数。skewness(x)返回 x 的 偏度 ,kurtosis(x)返回 峰度 。
在以上用 Matlab 计算各个统计量的命令中,若 x 为矩阵,则作用于 x 的列,返回一个行向量。
对例1给出的学生身高和体重,用Matlab 计算这些统计量,程序如下:
统计量中最重要、最常用的是均值和标准差,由于样本是随机变量,它们作为样本的函数自然也是随机变量,当用它们去推断总体时,有多大的可靠性就与统计量的概率分布有关,因此我们需要知道几个重要分布的简单性质。
随机变量的特性完全由它的(概率)分布函数或(概率)密度函数来描述。设有随机变量 ,其分布函数定义为 的概率,即 。若 是连续型随机变量,则其密度函数 与 的关系为:
上 分位数是下面常用的一个概念,其定义为:对于 ,使某分布函数 的 ,称为这个分布的上 分位数,记作 。
我们前面画过的直方图是频数分布图,频数除以样本容量 ,称为频率, 充分大时频率是概率的近似,因此直方图可以看作密度函数图形的(离散化)近似。
正态分布可以说是最常见的(连续型)概率分布,成批生产时零件的尺寸,射击中弹着点的位置,仪器反复量测的结果,自然界中一种生物的数量特征等,多数情况下都服从正态分布,这不仅是观察和经验的总结,而且有着深刻的理论依据, 即在大量相互独立的、作用差不多大的随机因素影响下形成的随机变量,其极限分布为正态分布 。
鉴于正态分布的随机变量在实际生活中如此地常见,记住下面 3 个数字是有用的:
若 为相互独立的、服从标准正态分布 的随机变量,则它们的平方和 服从 分布,记作 , 称为自由度,它的期望 ,方差 。
若 ,且相互独立,则 服从 分布,记作 称自由度。
分布的密度函数曲线和 曲线形状相似。理论上 时, ,实际上当 时它与 就相差无几了。
若 ,且相互独立,则 服从 分布,记作 称自由度。
Matlab统计工具箱中有27种概率分布,这里只对上面所述4中分布列出命令的字符:
工具箱对每一种分布都提供五类函数,其命令的字符是:
当需要一种分布的某一种函数时,将以上所列的分布命令字符与函数命令字符接起来,并输入自变量(可以是标量、数组或矩阵)和参数就行了,如:
设总体 , 为一容量 的样本,其均值 和标准差 由式(1),(2)确定,则用 和 构造的下面两个分布在统计中是非常有用的。
或
设有两个总体 和 ,及由容量分别为 的两个样本确定的均值 和标准差 ,则:
其中:
且要求
❷ 数学建模算法有哪些
1. 蒙特卡罗算法。 该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同时可以通过模拟来检验自己模型的正确性,几乎是比赛时必用的方法。
2. 数据拟合、参数估计、插值等数据处理算法。 比赛中通常会遇到大量的数据需要处理,而处理数据的关键就在于这些算法,通常使用MATLAB 作为工具。
3. 线性规划、整数规划、多元规划、二次规划等规划类算法。 建模竞赛大多数问题属于最优化问题,很多时候这些问题可以用数学规划算法来描述,通常使用Lindo、Lingo 软件求解。
4. 图论算法。 这类算法可以分为很多种,包括最短路、网络流、二分图等算法,涉及到图论的问题可以用这些方法解决,需要认真准备。
5. 动态规划、回溯搜索、分治算法、分支定界等计算机算法。 这些算法是算法设计中比较常用的方法,竞赛中很多场合会用到。
6. 最优化理论的三大非经典算法:模拟退火算法、神经网络算法、遗传算法。 这些问题是用来解决一些较困难的最优化问题的,对于有些问题非常有帮助,但是算法的实现比较困难,需慎重使用。
7. 网格算法和穷举法。 两者都是暴力搜索最优点的算法,在很多竞赛题中有应用,当重点讨论模型本身而轻视算法的时候,可以使用这种暴力方案,最好使用一些高级语言作为编程工具。
8. 一些连续数据离散化方法。 很多问题都是实际来的,数据可以是连续的,而计算机只能处理离散的数据,因此将其离散化后进行差分代替微分、求和代替积分等思想是非常重要的。
9. 数值分析算法。 如果在比赛中采用高级语言进行编程的话,那些数值分析中常用的算法比如方程组求解、矩阵运算、函数积分等算法就需要额外编写库函数进行调用。
10. 图象处理算法。 赛题中有一类问题与图形有关,即使问题与图形无关,论文中也会需要图片来说明问题,这些图形如何展示以及如何处理就是需要解决的问题,通常使用MATLAB 进行处理。
以下将结合历年的竞赛题,对这十类算法进行详细地说明。
以下将结合历年的竞赛题,对这十类算法进行详细地说明。
2 十类算法的详细说明
2.1 蒙特卡罗算法
大多数建模赛题中都离不开计算机仿真,随机性模拟是非常常见的算法之一。
举个例子就是97 年的A 题,每个零件都有自己的标定值,也都有自己的容差等级,而求解最优的组合方案将要面对着的是一个极其复杂的公式和108 种容差选取方案,根本不可能去求解析解,那如何去找到最优的方案呢?随机性模拟搜索最优方案就是其中的一种方法,在每个零件可行的区间中按照正态分布随机的选取一个标定值和选取一个容差值作为一种方案,然后通过蒙特卡罗算法仿真出大量的方案,从中选取一个最佳的。另一个例子就是去年的彩票第二问,要求设计一种更好的方案,首先方案的优劣取决于很多复杂的因素,同样不可能刻画出一个模型进行求解,只能靠随机仿真模拟。
2.2 数据拟合、参数估计、插值等算法
数据拟合在很多赛题中有应用,与图形处理有关的问题很多与拟合有关系,一个例子就是98 年美国赛A 题,生物组织切片的三维插值处理,94 年A 题逢山开路,山体海拔高度的插值计算,还有吵的沸沸扬扬可能会考的“非典”问题也要用到数据拟合算法,观察数据的走向进行处理。此类问题在MATLAB中有很多现成的函数可以调用,熟悉MATLAB,这些方法都能游刃有余的用好。
2.3 规划类问题算法
竞赛中很多问题都和数学规划有关,可以说不少的模型都可以归结为一组不等式作为约束条件、几个函数表达式作为目标函数的问题,遇到这类问题,求解就是关键了,比如98年B 题,用很多不等式完全可以把问题刻画清楚,因此列举出规划后用Lindo、Lingo 等软件来进行解决比较方便,所以还需要熟悉这两个软件。
2.4 图论问题
98 年B 题、00 年B 题、95 年锁具装箱等问题体现了图论问题的重要性,这类问题算法有很多,包括:Dijkstra、Floyd、Prim、Bellman-Ford,最大流,二分匹配等问题。每一个算法都应该实现一遍,否则到比赛时再写就晚了。
2.5 计算机算法设计中的问题
计算机算法设计包括很多内容:动态规划、回溯搜索、分治算法、分支定界。比如92 年B 题用分枝定界法,97 年B 题是典型的动态规划问题,此外98 年B 题体现了分治算法。这方面问题和ACM 程序设计竞赛中的问题类似,推荐看一下《计算机算法设计与分析》(电子工业出版社)等与计算机算法有关的书。
2.6 最优化理论的三大非经典算法
这十几年来最优化理论有了飞速发展,模拟退火法、神经网络、遗传算法这三类算法发展很快。近几年的赛题越来越复杂,很多问题没有什么很好的模型可以借鉴,于是这三类算法很多时候可以派上用场,比如:97 年A 题的模拟退火算法,00 年B 题的神经网络分类算法,象01 年B 题这种难题也可以使用神经网络,还有美国竞赛89 年A 题也和BP 算法有关系,当时是86 年刚提出BP 算法,89 年就考了,说明赛题可能是当今前沿科技的抽象体现。03 年B 题伽马刀问题也是目前研究的课题,目前算法最佳的是遗传算法。
2.7 网格算法和穷举算法
网格算法和穷举法一样,只是网格法是连续问题的穷举。比如要求在N 个变量情况下的最优化问题,那么对这些变量可取的空间进行采点,比如在[a; b] 区间内取M +1 个点,就是a; a+(b-a)/M; a+2 (b-a)/M; …… ; b 那么这样循环就需要进行(M + 1)N 次运算,所以计算量很大。比如97 年A 题、99 年B 题都可以用网格法搜索,这种方法最好在运算速度较快
的计算机中进行,还有要用高级语言来做,最好不要用MATLAB 做网格,否则会算很久的。穷举法大家都熟悉,就不说了。
2.8 一些连续数据离散化的方法
大部分物理问题的编程解决,都和这种方法有一定的联系。物理问题是反映我们生活在一个连续的世界中,计算机只能处理离散的量,所以需要对连续量进行离散处理。这种方法应用很广,而且和上面的很多算法有关。事实上,网格算法、蒙特卡罗算法、模拟退火都用了这个思想。
2.9 数值分析算法
这类算法是针对高级语言而专门设的,如果你用的是MATLAB、Mathematica,大可不必准备,因为象数值分析中有很多函数一般的数学软件是具备的。
2.10 图象处理算法
01 年A 题中需要你会读BMP 图象、美国赛98 年A 题需要你知道三维插值计算,03 年B 题要求更高,不但需要编程计算还要进行处理,而数模论文中也有很多图片需要展示,因此图象处理就是关键。做好这类问题,重要的是把MATLAB 学好,特别是图象处理的部分。