数学建模中常用的数据处理方法
数学建模中常用的数据处理方法
常用的数据处理方法
本文参考 ,只作笔记提纲,想要详细学习具体内容请观看 up 的学习视频。国赛的 C 题一般数据量比较大。
这里介绍以下两种方法:
数据预处理方法
1. 数据清洗
为了提高数据质量和适用所做数据分析的软件
(1) 缺失值
- 删除法:例如调查人口信息,发现“身高”这一项缺失 40%,直接删除该项指标
- 替换法:适用于数据基数较大,对个体精度要求不高(例如人口的数量、年龄、经济产业情况等统计数据)
- 人口的身高、年龄等数据可以用
均值
补缺 - 人口的性别、文化程度、事件调查的满意度可以用出现次数最多的值
(众数)
补缺
- 人口的身高、年龄等数据可以用
- 插值法:适用于对个体精度有要求
- 常用插值法: 分段线性插值、牛顿插值、拉格朗日多项式插值、Hermite插值、三次样条插值和克里金插值
- 牛顿插值
- 根据固定公式,构造近似函数,补上缺失值,适用性强
- 会出现
龙格现象
,即区间边缘处有不稳定振荡,不适合对导数有要求的题目 - 适用赛题:
只追求函数值精确而不关心变化的数据
。例如:热力学温度、地形测量、定位等
- 三次样条插值
- 用分段光滑的曲线去插值,函数曲线连续可导
- 适用赛题:
函数值精确度要求高,有突变的数据
。例如:零件加工,水库水流量,机器人轨迹等
(2) 异常值
- 查找异常数据:
正态分布
3 σ 3\sigma
3
σ 原则
- 适用题目:总体符合正态分布,例如人口身高、测量误差、生产加工质量、考试成绩等
- 不适用题目:总体符合其他分布,例如固定时间内到公交站、地铁站人数符合泊松分布等
箱型图法
- 流程:
- 普遍适用
- 流程:
- 删去异常值,当作缺失值处理
2. 数据变换
数据变换就是转化成适当的形式,以满足软件或分析理论的需要
(1) 简单函数变换
- 将不具有正态分布的数据变成有正态分布的数据,常用的方法有开方、取对数、
Box-Cox变换
等
Box-Cox变换
是一种广泛应用于数据转换和归一化的方法,可以使数据更接近正态分布。与前两种方法不同的是,前两者一般是由经验得出的,而Box-Cox变换
是针对数据得出的。公式如下:y ( λ )
{ y λ − 1 λ , if λ ≠ 0 ln y , if λ
0 y^{(\lambda)}=\begin{cases}\frac{y^\lambda-1}{\lambda},&\text{if }\lambda\neq0\\ln{y},&\text{if }\lambda=0&\end{cases}
y
(
λ
)
=
{
λ
y
λ
−
1
,
ln
y
,
if
λ
=
0
if
λ
=
0
其中,
y y
y 是原始数据,
λ \lambda
λ 是
Box-Cox
变换的参数。当λ
0 \lambda = 0
λ
=
0 时,使用对数变换,否则就使用上述公式进行变换。
python
代码如下:
from scipy import stats
# 假设有一组数据 x
x = [1, 2, 3, 4, 5]
# 指定 lambda 值为 0.5 进行 Box-Cox 变换
convert_res = stats.boxcox(x, lmbda = 0.5)
print(convert_res)
- 利用对数或差分运算将非平稳序列转化成平稳序列
(2) 数据的规范化
规范化就是剔除掉变量量纲上的影响,比如直接比较身高和体重的差异,单位的不同和取值范围的不同让这件事不能直接比较
- 最小 – 最大规范化
- 对数据进行线性变换,将其范围变成 [0,1]
- 规范公式:
(原始值-最小值)/(最大值-最小值)
- 不适用情形:原始数据存在小部分很大或很小的数据时,会造成大部分数据规范化后接近于 0/1,区分度不大
python
代码如下:
# pip install scikit-learn 这里安装包要用这个代码
from sklearn import preprocessing
import numpy as np
# 初始化数据,每一行表示一个样本,每一列表示一个特征
x = np.array([[ 0., -3., 1.],
[ 3., 1., 2.],
[ 0., 1., -1.]])
# 将数据进行 [0,1] 规范化
min_max_scaler = preprocessing.MinMaxScaler()
minmax_x = min_max_scaler.fit_transform(x)
print (minmax_x)
- 零 – 均值规范化
- 处理后的数据均值等于 0,标准差为 1
- 规范公式:
(原始值-平均值)/标准差
- 注意:得到的是给定数据距离其均值多少个标准差,结果没有实际意义,仅用于比较
python
代码如下:
from sklearn import preprocessing
import numpy as np
# 初始化数据
x = np.array([[ 0., -3., 1.],
[ 3., 1., 2.],
[ 0., 1., -1.]])
# 将数据进行 Z-Score 规范化
scaled_x = preprocessing.scale(x)
print(scaled_x)
# 均值
print(scaled_x.mean(axis = 0)) # axis 用来指定计算均值的轴向(0 表示沿列计算均值)
# 方差
print(scaled_x.std(axis = 0))
- 小数定标规范化
移动属性值的小数位数,将属性值映射到 [-1,1]
规范公式:
原始值/10^k
注意:
k k
k 取决于数据属性中数值的最大绝对值
python
代码如下:
from sklearn import preprocessing
import numpy as np
# 初始化数据
x = np.array([[ 0., -3., 1.],
[ 3., 1., 2.],
[ 0., 1., -1.]])
# 小数定标规范化
j = np.ceil(np.log10(np.max(abs(x))))
scaled_x = x/(10**j)
print (scaled_x)
数据分析方法
通过采用合理的数据处理方法,将实际问题化繁为简,将定性分析变为定量分析,获得科学可靠的结论
1. 回归分析
在统计学中,回归分析是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法
- 根据自变量个数,有一元回归和多元回归
- 根据因变量与自变量的关系,有线性回归和非线性回归
2. 插值与拟合
插值问题不一定得到近似函数表达式,仅仅通过插值方法找到未知点对应的值即可。但数据拟合要求得到具体的近似函数表达式。
3. 数据降维
(1) 主成分分析
- 将多个有一定相关性的指标进行线性组合,以最少的维度解释原数据中尽可能多的信息为目标进行以降维
(2) 因子分析
- 将原始变量分解为两部分:一部分是公共因子的线性组合,浓缩了原始变量中的绝大部分信息。另一部分是与公共因子无关的特殊因子,反映了公共因子线性组合与原始变量间的差距。
(3) 二者区别:
示例:现有 10 位同学的语文、数学、英语、物理、化学、政治、历史、地理、生物的成绩数据。
主成分分析:文科和理科
因子分析:计算能力、阅读能力、逻辑能力、记忆能力