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

news2024/11/30 0:29:54

本文综合代码来自文章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('数据存在异常值');
else
    disp('数据不存在异常值');
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 < threshold
        testdata(:, 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 ~= 4
    testdata_1 = fillmissing(testdata,strtrim(chazhi_fa(choice_2,:))); % strtrim 是为了去除字符串组的空格
else
    testdata_1 = fillmissing(testdata,'movmean',10); % 窗口长度为 10 的移动均值
end

subplot(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 < threshold
        testdata(:, 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('数据存在异常值');
else
    disp('数据不存在异常值');
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 ~= 4
    testdata_1 = fillmissing(testdata,strtrim(chazhi_fa(choice_2,:))); % strtrim 是为了去除字符串组的空格
else
    testdata_1 = fillmissing(testdata,'movmean',10); % 窗口长度为 10 的移动均值
end

subplot(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.coloradmin.cn/o/1055053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mars3d的graphic/entity/model示例的glb的ModelEntity修改颜色失效说明

1.Mars3d的graphic/entity/model示例的glb的ModelEntity修改颜色失效说明 2.测试时发现示例的glb的ModelEntity使用setStyle()修改颜色没成功 setTimeout(() > { graphicModel.setStyle({ color: "red" }) }, 500) 相关链接 1.http://mars3d.cn/editor-vue.html?…

使用sqlmap总是提示需要302跳转重新登录的解决方法

如果在命令中不指定cookie&#xff0c;sqlmap在执行时会提示需要重新登录 如果给了cookie但发现还是提示需要重新登录&#xff0c;且按它给的提示发现还是找不到注入点&#xff0c;原因是url没有加引号 url加了双引号后解决问题

MySQL在线修改表结构-PerconaTookit工具

在线修改表结构必须慎重 在业务系统 运行 过程中随意删改字段&#xff0c;会 造成重大事故。 常规的做法是&#xff1a;业务停机&#xff0c;再 维护表结构 比如&#xff1a;12306 凌晨 0 点到早上 7 点是停机维护 如果是不影响正常业务的表结构是允许在线修改的。 比如&…

16数据处理

plotly 设置x/y轴名称 yaxis_title‘金额(元)’,xaxis_title‘日期’ fig px.line(df_grouped, x"Order_time", y"Money", title日销图) fig.update_layout(yaxis_title金额(元),xaxis_title日期, xaxis_tickformat%Y-%m-%d,yaxis_tickformat 0.2f) fig…

多线程案例 - 单例模式

单例模式 ~~ 单例模式是常见的设计模式之一 什么是设计模式 你知道象棋,五子棋,围棋吗?如果,你想下好围棋,你就不得不了解一个东西,”棋谱”,设计模式好比围棋中的 “棋谱”. 在棋谱里面,大佬们,把一些常见的对局场景,都给推演出来了,照着棋谱来下棋,基本上棋力就不会差到哪…

面试必考精华版Leetcode437. 路径总和 III

题目&#xff1a; 代码&#xff08;首刷看解析&#xff0c;暴力法&#xff09;&#xff1a; class Solution { public:long rootSum(TreeNode* root,long targetSum){if(!root) return 0;long res0;if(root->valtargetSum){res;} resrootSum(root->left,targetSum-root-…

2022年9月及10月

9月 1.Halcon12的HObject和Hobject halcon12 可以用HObject&#xff0c;也可以用Hobject&#xff0c;用法都一样 包括HalconCpp.h 如果附加目录中&#xff1a; C:\Program Files\MVTec\HALCON-12.0\include\halconcpp\ 在前面&#xff0c;则用 HalconCpp::HObject 如果附加目录…

【论文阅读】DiffusionDet: Diffusion Model for Object Detection

原文链接&#xff1a;https://arxiv.org/abs/2211.09788 1. 引言 过去的目标检测方法依赖手工设计的候选对象&#xff08;如滑动窗口、区域提案、锚框和参考点&#xff09;&#xff1b;或是依赖可学习的物体查询。   本文使用更加简单的方法&#xff0c;随机初始化边界框&am…

防火墙基础之H3C防火墙和三层交换机链路聚合的配置

H3C防火墙和三层交换机链路聚合的配置 原理概述&#xff1a; 防火墙&#xff08;英语&#xff1a;Firewall&#xff09;技术是通过有机结合各类用于安全管理​与筛选的软件和硬件​设备&#xff0c;帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障&#xff0c;以保…

Docker从认识到实践再到底层原理(七)|Docker存储卷

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

如何让你网站统计的更加精准?

引言 最近对比了自己网站在Cloudflare Analytics和51.la统计的数据&#xff0c;结果发现数值差距的比较大&#xff0c;这是为什么&#xff1f; 经过了摸索&#xff0c;发现了以下几个情况&#xff1a; 广告插件的拦截&#xff0c;大部分广告插件都会拦截网站统计&#xff0c…

select实现服务器并发

select的TCP服务器代码 #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <sys/select.h> #include…

【教学类-36-10】20230908方脸爷爷和圆脸奶奶(midjounery-niji)(中班:《我爱我家》数:连线、涂色)

背景需求&#xff1a; 领导们鼓动我去参加上海市高级职称评审&#xff08;科研成果比较多&#xff09;&#xff0c;为下一轮保教主任评高级“探探路”。虽然自我感觉道行浅薄&#xff0c;无缘高级&#xff0c;但领导给机会&#xff0c;自然要参与一下&#xff0c;努力了解整个…

10.1select并发服务器以及客户端

服务器&#xff1a; #include<myhead.h>//do-while只是为了不让花括号单独存在&#xff0c;并不循环 #define ERR_MSG(msg) do{\fprintf(stderr,"%d:",__LINE__);\perror(msg);\ }while(0);#define PORT 8888//端口号1024-49151 #define IP "192.168.2.5…

10月1日作业

汇编指令合集 用select实现服务器并发代码 #include<myhead.h> #define IP "192.168.0.106" #define PORT 8888int main(int argc, const char *argv[]) {//新建套接字文件int sfd socket(AF_INET, SOCK_STREAM, 0);if(sfd < 0){ERR_MSG("socket&quo…

imgui开发笔记<4>、image-slider online

在线滑条二值化。 // // Created by sry on 2021/6/30. //#include"imgui.h" #include "imgui_impl_glfw.h" #include "imgui_impl_opengl3.h" #include <stdio.h> // Initialize with gl3wInit() #include<GL/gl3w.h> // Include …

【MATLAB第78期】基于MATLAB的VMD-SSA-LSTM麻雀算法优化LSTM时间序列预测模型

【MATLAB第78期】基于MATLAB的VMD-SSA-LSTM麻雀算法优化LSTM时间序列预测模型 一、LSTM data xlsread(数据集.xlsx);% [x,y]data_process(data,15);%前15个时刻 预测下一个时刻 %归一化 [xs,mappingx]mapminmax(x,0,1);xxs; [ys,mappingy]mapminmax(y,0,1);yys; %划分数据 n…

Android进阶——Handler底层fd监听之epoll机制

文章大纲 引言一、从网卡接收数据说起二、如何知道接收了数据&#xff1f;三、进程阻塞为什么不占用cpu资源&#xff1f;四、那么阻塞的原理是什么&#xff1f;1、工作队列2、等待队列3、唤醒进程 五、内核接收网络数据全过程六、同时监视多个socket的简单方法七、epoll的设计思…

Redis入门到精通——00数据类型

1、String 1.1、介绍 String 是最基本的 key-value 结构&#xff0c;key 是唯一标识&#xff0c;value 是具体的值&#xff0c;value其实不仅是字符串&#xff0c; 也可以是数字&#xff08;整数或浮点数&#xff09;&#xff0c;value 最多可以容纳的数据长度是 512M 1.2、…

聊天、会议、多媒体一体化:多平台支持的即时通讯系统 | 开源日报 No.44

harness/gitness Stars: 28.2k License: Apache-2.0 Gitness 是一个建立在 Drone 之上的新型开源开发者平台&#xff0c;具备代码托管和流水线功能。它提供了以下核心优势&#xff1a; 轻量级、超快速的代码托管和持续集成服务支持 Docker 容器化部署可以在本地环境中构建和…