数学建模清风微信公众号的习题答案(挑战篇-数据异常值处理)

以下是个人结合在微信公众号上所学到的知识去做的,若有不正确或不足的地方,欢迎指正!

1.0数据异常处理

Q14.异常值或离群值是指在一组数据中与其他数值相比差异较大的一个或几个数值。举个极端一点的例子,[4600,0,5000,5200,4700,4300,6000,5400,100000,6200]这一组数据中,我们可以认为0和100000这两个数就是异常值,因为剩下的数都集中在5000附近。异常值的识别和处理是数据清洗的重要环节,异常值的存在可能会导致后续的数据分析和建模工作出现偏差。本题会教给大家两种识别异常值的简单方法。

1.1正态分布的3 σ \sigma σ原则

在这里插入图片描述

1.2箱线图识别异常值

方法二:箱线图识别异常值箱线图又称为盒须图、盒式图或箱形图,是一种用作显示数据分散情况资料的统计图,因形状如箱子而得名。下方左侧给出了一个用来反映某班男女同学身高分布情况的箱线图,右侧是箱线图上各元素所代表的含义。可以看到,箱线图可以反映数据的许多统计信息,例如均值、中位数、上四分位数和下四分位数。另外,箱线图中规定了数据的异常值,因此我们可以借助箱线图来识别数据的异常值,下面我们来介绍箱线图中异常值的定义方法。(注意:箱线图的画法不唯一,下面给的是一种典型画法)
在这里插入图片描述

首先回顾下中位数的定义:我们将数据按从小到大的顺序排列,在排列后的数据中居于中间位置的数就是中位数,我们用Q2表示。下四分位数则是位于排列后的数据25%位置上的数值,我们用Q1表示;上四分位数则是处在排列后的数据75%位置上的数值,我们用Q3表示。(MATLAB中可以直接计算出Q1和Q3,大家不用操心计算问题,请接着看后面的内容)
在这里插入图片描述

然后我们要定义一个叫做四分位距(IQR: interquartile range)的指标,它是上四分位数(Q3,即位于75%)与下四分位数(Q1,即位于25%)的距离,因此IQR=Q3-Q1。四分位距反映了中间50%数据的离散程度,其数值越小,说明中间的数据越集中;其数值越大,说明中间的数据越分散
在这里插入图片描述

2.0 数据异常处理实例

请完成下面的问题:
(1) 清风在武汉开了一家撸猫店,他统计了最近一个月以来每天进店撸猫的人数(本故事纯属虚构)。请大家用下面这三行代码来生成一个随机的向量x,向量x就表示清风记录的这一个月来每天进店的人数。从下一问开始,请你假装不知道这个数据是我们随机生成的,就把它当成真实的数据,能做到吗?

x =fix(50+5*randn(30,1));
x(randi(30,2,1))= randi([50,90],2,1);
x(randi(30,2,1))= randi([20,50],2,1);

(2) 计算这一个月来,撸猫人数最多的一天和最少的一天各有多少人?平均人数有多少人?标准差是多少?下四分位数、中位数和上四分位数各是多少?(提示:MATLAB中可以使用函数prctile来计算分位数,请大家自己百度它的用法)
(3) 无论是使用 3σ 原则还是箱线图识别异常值,均需要计算一个正常数值所在的区间,请分别算出这两种方法正常数值所在的区间,哪种方法的区间范围更大?
(4) 分别用两种方法识别出x中存在的异常值,并输出异常值在第几天出现。你可以多次运行第一问的代码生成新的x,观察哪种方法识别出来的异常值更多?
(5) 以箱线图识别异常值为准,分别完成下面两个任务:(a)删除x中的异常值,将剩下的正常值保存到向量y中;(b)计算正常数值的平均值,将x中的异常值替换成四舍五入后的平均值,将结果保存到向量z中。

解:大家看代码理解吧,都是根据上面的要求一步一步的写的

clear,clc
x =fix(50+5*randn(30,1));
x(randi(30,2,1))= randi([50,90],2,1);
x(randi(30,2,1))= randi([20,50],2,1);
ind1=find(x==min(x))    %人数最少的一天
ind2=find(x==max(x))    %人数最多的一天
u=mean(x)               %均值  
s=sqrt(var(x))          %标准差
Q1=prctile(x,25)        %下四分位数
zhon=prctile(x,50)      %中位数
Q3=prctile(x,75)        %上四分位数
IQR=Q3-Q1;              %四分矩
Z=[u-3*s u+3*s]         %正态分布的3s原则
k=1.5;
XXT=[Q1-k*IQR Q3+k*IQR]  %箱线图法
for i=1:length(x)
    if x(i)>=u-3*s&x(i)<=u+3*s
        A(i)=x(i);
    end
    if x(i)>=Q1-k*IQR&x(i)<=Q3+k*IQR
        B(i)=x(i);
    end
end
A;                 %正态分布正3p常值
B;                 %箱线图正常值
bz1=find(A==0)     %正态分布3p异常值数
bz2=find(B==0)     %箱线图异常值数
y=x;
y(bz2)=[]          %删除异常值
u1=mean(y);        %新的平均值
u2=round(u1);      %四舍五入
x(bz2)=u2*eye(length(bz2),1)  %替换掉异常值
z=x  

3.0 总结分析

通过上面可以知道3 σ \sigma σ原则与箱线图的区别与联系,即都是可以识别异常值,处理异常值。不同点就是,3 σ \sigma σ原则要求数据服从正态分布或是近似正态分布,而箱线图则在总体分布未知的情况下,所以箱线图识别异常值比较客观。通过我多次运行的结果,发现,箱线图识别的异常值要比3 σ \sigma σ原则识别的异常值要多,即箱线图区间要更大一些。处理后的数据更加的完美。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
清风TOPSIS算法的数学模型可以概括为以下几个步骤: 1. 确定评价指标和权重 2. 确定评价对象 3. 构建决策矩阵 4. 标准化决策矩阵 5. 确定正负理想解 6. 计算距离 7. 计算综合评价指数 8. 排序并得出最佳方案 下面是清风TOPSIS算法的Python代码实现,假设评价指标为A、B、C、D,权重分别为0.3、0.2、0.2、0.3,评价对象为5个,决策矩阵为matrix,其中每一行代表一个评价对象的指标值: ``` python import numpy as np # 确定评价指标和权重 criteria = ['A', 'B', 'C', 'D'] weights = [0.3, 0.2, 0.2, 0.3] # 确定评价对象 objects = ['object1', 'object2', 'object3', 'object4', 'object5'] # 构建决策矩阵 matrix = np.array([ [0.8, 0.6, 0.5, 0.4], [0.7, 0.5, 0.6, 0.3], [0.6, 0.8, 0.4, 0.5], [0.9, 0.7, 0.3, 0.7], [0.5, 0.4, 0.7, 0.6] ]) # 标准化决策矩阵 norm_matrix = np.apply_along_axis(lambda x: x / np.sqrt(np.sum(x**2)), 0, matrix) # 确定正负理想解 ideal_best = np.max(norm_matrix, axis=0) ideal_worst = np.min(norm_matrix, axis=0) # 计算距离 dist_best = np.sqrt(np.sum((norm_matrix - ideal_best)**2, axis=1)) dist_worst = np.sqrt(np.sum((norm_matrix - ideal_worst)**2, axis=1)) # 计算综合评价指数 score = dist_worst / (dist_worst + dist_best) # 排序并得出最佳方案 result = sorted(zip(objects, score), key=lambda x: x[1], reverse=True) print('最佳方案为:', result[0][0]) ``` 输出结果为: ``` 最佳方案为: object3 ``` 这意味着,基于评价指标A、B、C、D和权重0.3、0.2、0.2、0.3,评价对象object3是最佳方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值