数学建模Matlab之数据预处理方法

本文综合代码来自文章http://t.csdnimg.cn/P5zOD


异常值与缺失值处理

%% 数据修复
% 判断缺失值和异常值并修复,顺便光滑噪音,渡边笔记
clc,clear;close all;
x = 0:0.06:10;
y = sin(x)+0.2*rand(size(x));
y(22:34) = NaN; % 模拟缺失值
y(89:95) = 50;% 模拟异常值
testdata = [x' y'];subplot(2,2,1);
plot(testdata(:,1),testdata(:,2)); %subplot在一个图窗中创建多个子图,然后使用plot函数将原始数据可视化
title('原始数据');

异常值检验

作者通常首先判断是否具有异常值,因为如果有异常值的话,咱们就会剔除异常值,使其变成缺失值,然后再做缺失值处理会好很多。

%% 判断数据中是否存在异常值
% 1.mean 三倍标准差法 2.median 离群值法 3.quartiles 非正态的离群值法
% 4.grubbs 正态的离群值法 5.gesd 多离群值相互掩盖的离群值法
choice_1 = 5;
yichangzhi_fa = char('mean', 'median', 'quartiles', 'grubbs','gesd');
yi_chang = isoutlier(y,strtrim(yichangzhi_fa(choice_1,:))); %选择的是gesd多离群值……
if sum(yi_chang)disp('数据存在异常值');
elsedisp('数据不存在异常值');
end

对于上面的异常值检验法做讲解与扩展:

1. Mean 三倍标准差法(3σ原则)

  • 描述:在正态分布数据中,任何一个数值如果偏离平均值超过3倍的标准差,就被认为是异常值。
  • 应用条件数据基本呈正态分布。(非常重要,需要进行正态性检验)
  • 场景:适用于各种连续数据的分析,例如金融、生物统计等领域。

2. Median 离群值法

  • 描述:基于中位数和四分位数范围来识别异常值。
  • 应用条件不需要数据完全符合正态分布。
  • 场景:适用于偏态分布或者非正态分布的数据。

3. Quartiles 非正态的离群值法

  • 描述:通过计算数据的四分位数范围(IQR)和上下四分位数来检测异常值。
  • 应用条件:适用于非正态分布的数据
  • 场景:在各种非正态分布的数据分析中都可以使用。

4. Grubbs 正态的离群值法

  • 描述:基于正态分布假设,测试数据集中最大或最小值是否显著偏离其余的观测值。
  • 应用条件:数据应该是正态分布。
  • 场景:广泛应用于各种领域,尤其是实验数据分析

5. GESD(Generalized Extreme Studentized Deviate)

  • 描述:用于检测多个异常值,即使它们相互掩盖
  • 应用条件:不特定于某一分布。
  • 场景:当异常值可能相互掩盖时使用,例如在时间序列分析中。

其他方法

  • Tukey’s Fences

    • 通过四分位数范围(IQR)和“fences”(上下界)识别异常值。
    • 适用于各种分布的数据。
  • DBSCAN(Density-Based Spatial Clustering of Applications with Noise):

    • 一种基于密度的聚类算法,能够识别簇内和簇外点。
    • 用于大数据集和空间数据。
  • Isolation Forests

    • 用于高维数据集的异常检测。
    • 通过随机分离点来检测异常值。

正态性检验

读者不难发现,异常值检验通常与数据是否符合正态分布有关,所以,我们一起讨论一下如何使用matlab进行正态性检验。

初步判断

利用图像进行初步的正态性判断,涉及到常见的两种图:Q-Q图和P-P图。

  1. PP图

    • PP图是用于比较两个数据集的累积分布函数(CDF)。
    • 当你有一个样本数据集和一个理论分布(如正态分布)时,PP图会比较样本数据的CDF和理论CDF。
    • 在正态PP图中,如果样本数据来自正态分布,那么数据点应该大致沿着45度线。
  2. QQ图

    • QQ图是用于比较两个数据集的分位数。QQ图更常用于正态性检验,因为它对尾部的差异更敏感。
    • 当你有一个样本数据集和一个理论分布时,QQ图会比较样本数据的分位数和理论分布的分位数。
    • 在正态QQ图中,如果样本数据来自正态分布,那么数据点应该大致沿着一条直线,这条线不一定是45度线,但是应该是线性的。

其实上面最重要的一点就是,数据点在两个图中都沿着标准正态分布直线近似分布的话,我们就可以初步判断数据具有正态分布性。

% 正态检验
% 生成一些随机数据
data = randn(100, 1);% 创建一个新的图形窗口
figure;% 使用 normplot 创建正态概率图 (QQ图)
subplot(1,2,1);
normplot(data);
title('Normal Q-Q Plot');% 使用 probplot 创建PP图
subplot(1,2,2);
probplot('normal', data);
title('Normal P-P Plot');

可以在论文中这样写:

为了对数据集的分布特性进行深入理解和分析,本文采用了QQ图和PP图两种方法进行了初步的正态性检验,旨在从不同角度全面评估数据的分布状态。其结果如图1所示。

图1 xx数据PP图(左)和QQ图(右)

图1结果显示:在QQ图中,xx数据的尾部行为和中心趋势没有发现显著的异常值或者偏态现象,表现出良好的正态分布特征;在PP图中,xx数据的整体分布与正态分布非常接近,进一步证实了数据的正态性。综合以上分析结果可初步得知:xx数据集呈现出较强的正态分布特性。

尽管PP图和QQ图都是强大的工具,但它们主要用于探索性数据分析,并不能代替更正式的正态性检验方法,如Jarque-Bera测试或Lilliefors测试。

正式判断

% 正态检验
% 生成一些随机数据
data = randn(100, 1);% 使用 jbtest 进行 Jarque-Bera 测试
[h_jb, p_jb] = jbtest(data);% 使用 lillietest 进行 Lilliefors 测试
[h_lil, p_lil] = lillietest(data);% 显示测试结果
fprintf('Jarque-Bera Test: h = %d, p = %f\n', h_jb, p_jb);
fprintf('Lilliefors Test: h = %d, p = %f\n', h_lil, p_lil);

在上述代码中,hp 分别代表假设检验的结果和 p 值,可以用来判断数据是否符合正态分布。

  • h = 0 表示在给定的显著性水平下,不拒绝数据来自正态分布的原假设。即,数据可以被认为是正态分布的。
  • p 值是一个概率值,它表示观察到的数据与正态分布之间的差异是偶然产生的概率。一般来说,如果 p 值大于预定的显著性水平(例如,0.05),则接受原假设,认为数据是正态分布的。

故对上图结果进行数据分析(论文中写的多一点啊,这是简要版):

  1. Jarque-Bera 测试结果:

    • h = 0, p = 0.361618
    • 因为h为0,并且p值为0.361618(大于通常的显著性水平0.05),所以我们接受原假设,认为数据是正态分布的。
  2. Lilliefors 测试结果:

    • h = 0, p = 0.500000
    • 同样,h为0,并且p值为0.5,这也指示数据是正态分布的。

异常值处理与缺失值判断

作者所有异常值处理都是先赋空值,不知道还有没有其他的方法……

%% 对异常值赋空值
F = find(yi_chang == 1);
y(F) = NaN; % 令数据点缺失
testdata = [x' y'];

然后就可以和缺失值一起处理了,但是,为了保证文章的严谨性,咱还是需要判断一下是否存在缺失值。并且,不仅仅只判断,如果题目数据特征尤其多,并且有的特征缺失样本太多了,咱建议还是把这些特征删了,这就涉及到最省力法则

% 假设testdata是一个n行m列的矩阵,每一列代表一个特征
[n, m] = size(testdata);
threshold = 0.8 * n;  % 设置阈值,80%的总样本量% 遍历每一个特征
for i = 1:m% 计算每一列(特征)中非缺失值的数量nonMissingCount = sum(~isnan(testdata(:, i)));% 如果非缺失值的数量少于阈值,则删除该列(特征)if nonMissingCount < thresholdtestdata(:, i) = [];  % 删除特征m = m - 1;  % 更新特征数量i = i - 1;  % 更新当前索引end
end% 显示处理后的数据
disp('处理后的数据:');
disp(testdata);

填充缺失值

%% 对数据进行补全
% 数据补全方法选择
% 1.线性插值 linear 2.分段三次样条插值 spline 3.保形分段三次样条插值 pchip
% 4.移动滑窗插补 movmean
chazhi_fa = char('linear', 'spline', 'pchip', 'movmean');
choice_2 = 3;
if choice_2 ~= 4testdata_1 = fillmissing(testdata,strtrim(chazhi_fa(choice_2,:))); % strtrim 是为了去除字符串组的空格
elsetestdata_1 = fillmissing(testdata,'movmean',10); % 窗口长度为 10 的移动均值
endsubplot(2,2,3);
plot(testdata_1(:,1),testdata_1(:,2));
title('数据补全结果');

作者通常喜欢(让队友)使用K最近邻法填补,而且都是用python搞的,so这里不讲。


平滑处理

当然,可以根据实际情况进行数据的平滑处理:

%% 进行数据平滑处理
% 滤波器选择 1.Savitzky-golay 2.rlowess 3.rloess
choice_3 = 2;
lvboqi = char('Savitzky-golay', 'rlowess', 'pchip', 'rloess');
% 通过求 n 元素移动窗口的中位数,来对数据进行平滑处理
windows = 8;
testdata_2 = smoothdata(testdata_1(:,2),strtrim(lvboqi(choice_3,:)),windows) ;

那么,实际情况到底是什么?

平滑数据对于某些机器学习模型的训练和性能是有益的,尤其是对于那些对数据中的噪声敏感的模型。下面是一些可能受益于数据平滑的算法:

决定是否进行数据平滑应该基于对上述因素的综合考虑,而不仅仅是基于特征的数量。在决定平滑之前,最好通过交叉验证来评估平滑对模型性能的实际影响。属于锦上添花的作用。


总结

最终的代码综合一下:

% 判断缺失值和异常值并修复,顺便光滑噪音,渡边笔记
clc,clear;close all;
x = 0:0.06:10;
y = sin(x)+0.2*rand(size(x));
y(22:34) = NaN; % 模拟缺失值
y(89:95) = 50;% 模拟异常值
testdata = [x' y'];subplot(2,2,1);
plot(testdata(:,1),testdata(:,2)); %subplot在一个图窗中创建多个子图,然后使用plot函数将原始数据可视化
title('原始数据');%% 判断数据中是否存在缺失值,并使用最省力法则
% 假设testdata是一个n行m列的矩阵,每一列代表一个特征
[n, m] = size(testdata);
threshold = 0.8 * n;  % 设置阈值,80%的总样本量% 遍历每一个特征
for i = 1:m% 计算每一列(特征)中非缺失值的数量nonMissingCount = sum(~isnan(testdata(:, i)));% 如果非缺失值的数量少于阈值,则删除该列(特征)if nonMissingCount < thresholdtestdata(:, i) = [];  % 删除特征m = m - 1;  % 更新特征数量i = i - 1;  % 更新当前索引end
end% 显示处理后的数据
disp('处理后的数据:');
disp(testdata);%% 判断数据中是否存在异常值
% 1.mean 三倍标准差法 2.median 离群值法 3.quartiles 非正态的离群值法
% 4.grubbs 正态的离群值法 5.gesd 多离群值相互掩盖的离群值法
choice_1 = 5;
yichangzhi_fa = char('mean', 'median', 'quartiles', 'grubbs','gesd');
yi_chang = isoutlier(y,strtrim(yichangzhi_fa(choice_1,:))); %选择的是gesd多离群值……
if sum(yi_chang)disp('数据存在异常值');
elsedisp('数据不存在异常值');
end%% 对异常值赋空值
F = find(yi_chang == 1);
y(F) = NaN; % 令数据点缺失
testdata = [x' y'];subplot(2,2,2);
plot(testdata(:,1),testdata(:,2));
title('去除差异值');%% 对数据进行补全
% 数据补全方法选择
% 1.线性插值 linear 2.分段三次样条插值 spline 3.保形分段三次样条插值 pchip
% 4.移动滑窗插补 movmean
chazhi_fa = char('linear', 'spline', 'pchip', 'movmean');
choice_2 = 3;
if choice_2 ~= 4testdata_1 = fillmissing(testdata,strtrim(chazhi_fa(choice_2,:))); % strtrim 是为了去除字符串组的空格
elsetestdata_1 = fillmissing(testdata,'movmean',10); % 窗口长度为 10 的移动均值
endsubplot(2,2,3);
plot(testdata_1(:,1),testdata_1(:,2));
title('数据补全结果');%% 进行数据平滑处理
% 滤波器选择 1.Savitzky-golay 2.rlowess 3.rloess
choice_3 = 2;
lvboqi = char('Savitzky-golay', 'rlowess', 'pchip', 'rloess');
% 通过求 n 元素移动窗口的中位数,来对数据进行平滑处理
windows = 8;
testdata_2 = smoothdata(testdata_1(:,2),strtrim(lvboqi(choice_3,:)),windows) ;subplot(2,2,4);
plot(x,testdata_2)
title('数据平滑结果');

至此,数据预处理完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/146992.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

POJ 3109 Inner Vertices 离散化+树状数组

一、题目大意 围棋棋盘&#xff0c;如果某个坐标上下左右的四个方向都存在棋子&#xff0c;那么ans1&#xff0c;根据输入的棋子数量&#xff0c;求出ans的数量。 二、解题思路 题目中有说到如果程序不会结束&#xff0c;那么输出-1&#xff0c;这其实是无源之水&#xff0c…

Linux下基本指令(上)

文章内容&#xff1a; 1. ls 指令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 单个ls显示当前目录下的文件和目录 常用选项&#…

Vue iconfont-阿里巴巴矢量图标库用法

一、vue使用 选择心仪的图标 加入购物车 点击右上角购物车&#xff0c;点击添加至项目 在资源管理 可以看到我的项目 进入项目设置勾选彩色 点击下载到本地 解压压缩包 在main.js文件内导入css文件 import "/assets/font_icon/iconfont.css"; 使用&#xff1a; 复…

Java开源工具库使用之Lombok

文章目录 前言一、常用注解1.1 AllArgsConstructor/NoArgsConstructor/RequiredArgsConstructor1.2 Builder1.3 Data1.4 EqualsAndHashCode1.5 Getter/Setter1.6 Slf4j/Log4j/Log4j2/Log1.7 ToString 二、踩坑2.1 Getter/Setter 方法名不一样2.2 Builder 不会生成无参构造方法2…

Ubuntu Qt 5.15.2 支持 aarch64

概述 AArch64是ARMv8 架构的一种执行状态。 为了更广泛地向企业领域推进&#xff0c;需要引入64 位构架。 同时也需要在ARMv8 架构中引入新的AArch64 执行状态。 AArch64 不是一个单纯的32 位ARM 构架扩展&#xff0c;而是ARMv8 内全新的构架&#xff0c;完全使用全新的A64 指令…

黑豹程序员-架构师学习路线图-百科:Git/Gitee(版本控制)

文章目录 1、什么是版本控制2、特点3、发展历史4、SVN和Git比较5、Git6、GitHub7、Gitee&#xff08;国产&#xff09;8、Git的基础命令 1、什么是版本控制 版本控制系统&#xff08; Version Control &#xff09;版本控制是一种管理和跟踪软件开发过程中的代码变化的系统。它…

【Python】time模块和datetime模块的部分函数说明

时间戳与日期 在说到这俩模块之前&#xff0c;首先先明确几个概念&#xff1a; 时间戳是个很单纯的东西&#xff0c;没有“时区”一说&#xff0c;因为时间戳本质上是经过的时间。日常生活中接触到的“日期”、“某点某时某分”准确的说是时间点&#xff0c;都是有时区概念的…

C#,数值计算——Ranq1的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Recommended generator for everyday use.The period is 1.8E19. Calling /// conventions same as Ran, above. /// </summary> public class Ranq1 { …

2023版 STM32实战4 滴答定时器精准延时

SysTick简介与特性 -1- SysTick属于系统时钟。 -2- SysTick定时器被捆绑在NVIC中。 -3- SysTick可以产生中断,且中断不可屏蔽。 SysTick的时钟源查看 通过时钟树可以看出滴答的时钟最大为72MHZ/89MHZ 通过中文参考手册也可以得到这个结论 代码编写&#xff08;已经验证&a…

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石②

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石② 第十九章 驱动程序基石②19.3 异步通知19.3.1 适用场景19.3.2 使用流程19.3.3 驱动编程19.3.4 应用编程19.3.5 现场编程19.3.6 上机编程19.3.7 异步通知机制内核代码详解 19.4 阻塞与非阻塞19.4.1 应用编程19.4.2 驱动编程…

【算法分析与设计】回溯法(上)

目录 一、学习要点1.1 回溯法1.2 问题的解空间1.3 0-1背包问题的解空间1.4 旅行售货员问题的解空间1.5 生成问题状态的基本方法 二、回溯法的基本思想三、回溯算法的适用条件四、递归回溯五、迭代回溯六、子集树与排列树七、装载问题八、批处理作业调度问题 一、学习要点 理解回…

【数据结构与算法】通过双向链表和HashMap实现LRU缓存 详解

这个双向链表采用的是有伪头节点和伪尾节点的 与上一篇文章中单链表的实现不同&#xff0c;区别于在实例化这个链表时就初始化了的伪头节点和伪尾节点&#xff0c;并相互指向&#xff0c;在第一次添加节点时&#xff0c;不需要再考虑空指针指向问题了。 /*** 通过链表与HashMa…

92、Redis ------- 使用 Lettuce 操作 Redis 的方法和步骤----(文字讲解无代码)

lettuce &#xff1a;英语的意思&#xff1a;生菜 是一个用来操作redis的框架&#xff0c;springboot内置默认支持的也是 lettuce &#xff0c;也可以自己改成 jedis Jedis 也是一个用来操作redis的框架 ★ Lettuce的核心API RedisURI&#xff1a;用于封装Redis服务器的URI信息…

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石⑤

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石⑤ 第十九章 驱动程序基石⑤19.9 mmap19.9.1 内存映射现象与数据结构19.9.2 ARM架构内存映射简介19.9.2.1 一级页表映射过程19.9.2.2 二级页表映射过程 19.9.3 怎么给APP新建一块内存映射19.9.3.1 mmap调用过程19.9.3.2 cach…

数据结构:简单记录顺序表、链表、栈、队列

初学者很容易认为顺序表、链表、栈、队列是四种并列的数据结构&#xff0c;其实仔细想想并不是。 注意区分&#xff1a; 顺序表和链表是指数据的存储结构&#xff0c;是线性表的一种&#xff0c;顺序表一般指的就是数组&#xff0c;数据存储的逻辑顺序和物理顺序都是连续的&a…

nodejs+vue交通违章查询及缴费elementui

第三章 系统分析 10 3.1需求分析 10 3.2可行性分析 10 3.2.1技术可行性&#xff1a;技术背景 10 3.2.2经济可行性 11 3.2.3操作可行性&#xff1a; 11 3.3性能分析 11 3.4系统操作流程 12 3.4.1管理员登录流程 12 3.4.2信息添加流程 12 3.4.3信息删除流程 13 第四章 系统设计与…

Django模板加载与响应

前言 Django 的模板系统将 Python 代码与 HTML 代码解耦&#xff0c;动态地生成 HTML 页面。Django 项目可以配置一个或多个模板引擎&#xff0c;但是通常使用 Django 的模板系统时&#xff0c;应该首先考虑其内置的后端 DTL&#xff08;Django Template Language&#xff0c;D…

Git使用【下】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;标签管理理解标签标签运用 …

Grander因果检验(格兰杰)原理+操作+解释

笔记来源&#xff1a; 1.【传送门】 2.【传送门】 前沿原理介绍 Grander因果检验是一种分析时间序列数据因果关系的方法。 基本思想在于&#xff0c;在控制Y的滞后项 (过去值) 的情况下&#xff0c;如果X的滞后项仍然有助于解释Y的当期值的变动&#xff0c;则认为 X对 Y产生…

插入排序与希尔排序

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; 这两个排序在思路上有些相似&#xff0c;所以有人觉得插入排序和希尔排序差别不大&#xff0c;事实上&#xff0c;他们之间的差别不小&#xff0c;插入排序只是希尔排序的最后一步。 目录 前言&#xff1a;…