前言
- 这是去年底学数学建模老哥的建模课程笔记;
- 未来本人将陆陆续续的更新数学建模相关的一些基础算法,大家可以持续关注一下;
- 提示:数学建模只有实战才能提升🔥🔥🔥🔥🔥,光学算法没有啥意义,也很难学的很懂。
数据预处理
数据集成
- 数据统一化,分散------>集合
数据规约
-
数据降维,前提:数据之间存在相关性
- PCA(最常用),坐标旋转,线性降维,适合数据量较少
- TSNE和UMAP,适合数据量大,其中TSNE画图更好看
-
降数据
数据清洗
缺失值的处理方法主要有三种: 删除记录、数据插补和不处理
- 删除记录:指当该组数据某一个案的数据缺省时,删除这组个案的数据,这种方法的优点是处理方便,但在数据较少时要慎重使用。
- 数据插补:使用不同的插补方法将缺省的数据补齐。主要插补方法有:均值/中位数/众数插补; 使用固定值插补;最近邻插补;回归方法插补;插值法插补。
- 最近邻插补:即在记录中找到与缺失样本最接近的样本的该属性插补,可以通过计算对象间的欧 式距离衡量。
- 回归方法插补:根据已有数据和与其有关的其他变量的数据建立拟合模型来预测缺失值。
- 插值法:常用的插值法有很多,主要有 拉格朗日插值法、牛顿插值法
- 不处理,有时我们可以将所有缺省数据的样本划分为另一组,进行特殊处理。
方法选取
缺失值
拉格朗日插值
原理:
代码求解(函数)
function y = Lagrange(x0,y0,x)
%拉格朗日插值法函数摘要
% x0为已知数据点的x坐标
% y0为已知数据点的y坐标
% x为插值点的x坐标
n=length(x0);
m=length(x);
y=zeros(1:m);
for i=1:m
z=x(i);
s=0;
for j=1:n
l=1;
for k=1:n
if j~=k
l=l*(z-x0(k))/(x0(j)-x0(k));
end
end
s=l*y0(j)+s;
end
y(i)=s;
end
插值处理
一维插值
yi=interp1(x,y,xi,'method')
%x,y为插值点,xi,yi为被插值点和结果,x,y和xi,yi通常为向量
%'method'表示插值方法:常用方法有'nearest''linear''spline''cubic'
‘nearest’——最邻近插值:插入与其距离最近的值
‘linear’——线性插值:构造线性函数进行插值
‘spline
’——三次样条插值,构造三次多项式进行插值
‘cubic
’——立方插值:构造立方函数进行插值
‘method’缺省时默认为线性插值
代码
clc;clear all;
y=[0.31472 0.84549 0.98429 0.81619 0.51237];
x=[1 2 3 4 5];
x1=0:0.1:5;
y1=interp1(x,y,x1,'spline');
plot(x1,y1);
二维插值
Matlab插值:二维插值
yi=interp2(x,y,z,xi,yi,'method')
%x,y,z为插值点,xi,yi为被插值点,zi为输出的插值结果,即插值函数在
(xi,yi)处的值;x,y为向量,xi,yi为向量或矩阵,而z和zi则为矩阵
%'method'表示插值方法:常用方法有'nearest''linear''spline''cubic'
‘nearest’——最邻近插值:插入与其距离最近的值
‘linear’——双线性插值:构造两组线性函数进行插值
‘spline’——双三次样条插值,在每个区间内构造三次多项式进行插值
‘cubic’——双立方插值:构造立方函数进行插值默认为双线性插值
代码
%数据连续
clc;clear all;
x=1:5;
y = 1:3;
temps = [82 81 80 82 84;79 63 61 65 81;84 84 82 85 86];
x1 = 1:.2:5;
y1 = 1:.2:3;
zzi = interp2(x,y,temps,x1',y1,'spline');
mesh(x1,y1,zzi);
%数据离散
clc;clear all;
x=[123 55 89 84 56 54 100];
y=[2 5 8 9 10 16 15];
z=[165 654 852 254 0 456 251];
x1=50:0.1:150;
y1=0:0.1:20;
[x1,y1]=meshgrid(x1,y1);
z1=griddata(x,y,z,x1,y1,'linear');
meshc(x1,y1,z1);
异常值
两种方法:正态分布3σ原则和画箱型图。
3σ原则
数值分布在( μ-3σ, μ+3σ)中的概率为99.73%,其中 μ为平均值, σ为标准差。
1、计算均值 μ和标准差 σ;
2、判断每个数据值是否在( μ-3σ, μ+3σ)内,不在则为异常值。
适用题目:总体符合正态分布,例如人口数据、测量误差、生产加工质量、考试成绩等。
不适用题目:总体符合其他分布,例如公交站人数排队论符合泊松分布
代码
x=[1, 1.1, 1.2, 1.3, 1.4, 2, 1.2, 1.3, 1.5, 0.9, 0.8, 1.1, 11];
inlier = [];outlier = [];
len = length(x);
average1 = mean(x); % x中所有元素的均值
standard1 = std(x); % x的标准差
for i = 1:len % 遍历x向量,判断是否为偏离点,不是偏离点则存入inline
if abs(x(i)-average1)<standard1*3
inlier = [inlier x(i)];
end
end
画箱型图
箱型图中,把数据从小到大排序。四分位数Q1是排第25%的数值,上四分位数Q3是排第75%的数值。 四分位距IQR= Q3-Q1,也就是排名第75%的减去第25%的数值 正态分布类似,设置个合理区间,在区间外的就是异常值。 一般设[Q1-1.5IQR, Q3+1.5IQR]内为正常值。
代码
clc,clear all,close all
x1 = [10 12 9 8 12 11 15 12 34 12 9];
x2 = [13 14 6 9 18 16 47 18 54 13 6];
figure
boxplot([x1' x2'])
%维度不同处理
x = rand(50,1);
y = rand(30,1);
z = rand(55,1);
% group = [repmat(1, size(x,1), 1); repmat(2,
size(y,1), 1); repmat(3, size(z,1), 1)];
group = [repmat('x', size(x,1), 1); repmat('y',size(y,1), 1); repmat('z', size(z,1), 1)];
boxplot([x;y;z], group);
数据变换
一致化处理
在进行数据一致化之前,必须先判断是属于什么类型数据(极大型、极小型、中间型、区间型)
无量纲化处理
- 标准差法:取值区间不固定,一般还有在进行标准化
- 极值差法
- 优点:在[0,1]范围
- 缺点:受极值影响很大
- 功效系数法:能固定区间