MATLAB数据预处理之缺失值插补

2023-11-18


前言

   现实中采集的原始数据不一定满足预测模型的需求,往往在使用之前需要对原始数据进行处理,使得采集的原始数据满足需求,本文主要做的是数据缺失处理方法。

1 加载原始数据

load('pm25data.mat')% 原始数据
figure
t = datetime(2010,1,2,0,0,0) + hours(0:length(pm25data)-1)';% 创建与数据对应的时间向量。
plot(pm25data)% 查看波形
title('原始数据波形')
xlabel('Time/h');
ylabel('PM_{2.5} / (\mu g.m^{-3})');

   如下图所示,可以看到原始数据波形有缺失部分
在这里插入图片描述

2 查找缺失值并填充缺失值

% -------------------------------------------------------------------------
% 查找缺失值
% -------------------------------------------------------------------------
TF1=ismissing(pm25data);% 查找缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值
%     plot(t,TF1,'*') % TF中的1对应pm25data中的缺失值
%     pm25data(TF1) % 显示缺失值位置
TF = TF1;
% -------------------------------------------------------------------------
% 填充缺失值 (pm25dataPre是插补后的数据)
% -------------------------------------------------------------------------
pm25dataPre = pm25data;
t = datetime(2010,1,2,0,0,0) + hours(0:length(pm25data)-1)';% 创建与数据对应的时间向量。
while max(TF) % 如果还存在缺失值就继续插补
    % pm25data = fillmissing(pm25data,'movmean',30);% 使用窗口长度为 30 的移动均值填充缺失数据。
    pm25dataPre = fillmissing(pm25dataPre,'movmedian',30); % 使用窗口长度为 30 的移动中位数替换数据中的 NaN 值 
    TF=ismissing(pm25dataPre);% 查找数据中的缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值
end
%     plot(TF) % TF中的1对应pm25data中的缺失值,当数据中的缺失值填充完时,可以看到TF的值全为0
plot(t,pm25dataPre,t(TF1),pm25dataPre(TF1),'x')% 查看插补后的数据 pm25dataPre
title('插补后的数据波形')
xlabel('Time/h');
ylabel('PM_{2.5} / (\mu g.m^{-3})');
legend('原始数据','插补值')    
%     save('pm25dataPre.mat','pm25dataPre');% 保存插补后的数据

可以看到数据缺失部分,已被补全
在这里插入图片描述


总结

   以上就是今天要讲的内容,数据是pm2.5数据。如有不合理的地方还请指出。


2021年4月5日09:51:56更新


问:如何用缺失值的前两个值的平均值进行插补?

  对于一个一维向量 A = [x1,x2,x3,x4,x5,x6],其值如下表所示:

A x1 x2 x3 x4 x5 x6
Value 5 7 8 9

  可以看到x3和x6值缺失,对于x3进行插补,则
x 3 = ( x 1 + x 2 ) / 2 = ( 5 + 7 ) / 2 = 6 x3 = {(x1+x2)}/{2} = (5+7)/2 = 6 x3=(x1+x2)/2=(5+7)/2=6
同理
x 6 = ( x 4 + x 5 ) / 2 = ( 8 + 9 ) / 2 = 8.5 x6 = {(x4+x5)}/{2} = (8+9)/2=8.5 x6=(x4+x5)/2=(8+9)/2=8.5
故插值后,可得

A x1 x2 x3 x4 x5 x6
Value 5 7 6 8 9 8.5

MATLAB程序实现:
(注意:double 类型数据缺失值指示符为NaN)

	A = [5,7,NaN,8,9,NaN] 
	F = fillmissing(A,'movmean',[2,0])

运行结果:
在这里插入图片描述

  有一点需要注意,如果第一个元素为NaN,则无法对其进行插补。
例如:

	A = [NaN,5,7,NaN,8,9,NaN]
	F = fillmissing(A,'movmean',[2,0])

在这里插入图片描述


问:如何用缺失值的前一个值和后一个值的均值进行插补?

MATLAB程序实现:

	A = [5,NaN,7,NaN,3];
	F = fillmissing(A,'movmean',3)

运行结果:
在这里插入图片描述

  道理很简单,分析方法和上文相同,诸君可以试着自己分析一下。


2021年5月18日10:46:15更新


  有的人可能不会加载数据,针对这个问题,我进行了更新,上文中用到的数据源1,在本次更新中会给出。程序运行后,会自动下载数据2,然后读取数据3,最后直接运行出结果。

clear;clc;close all;
%% 下载数据

    api = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00381/';
    url = [api 'PRSA_data_2010.1.1-2014.12.31.csv'];
    filename = 'DataSet.csv';
    options = weboptions('Timeout',Inf); % 将超时值设置为 Inf 以使连接不会超时。
    outfilename = websave(filename,url,options); % 数据下载,保存在DataSet.csv中
%% 读取表格数据

    AllData = readmatrix(filename); 
    pm25data = AllData(25:43824,6); % 读取pm2.5数据
    save("pm25data.mat","pm25data") % 保存数据
%% 加载原始数据  

    load('pm25data.mat')% 原始数据
    figure
    subplot(211)
	t = datetime(2010,1,2,0,0,0) + hours(0:length(pm25data)-1)';% 创建与数据对应的时间向量。
    plot(t,pm25data)% 查看波形
    title('原始数据波形')
    xlabel('Time/h');
    ylabel('PM_{2.5} / (\mu g.m^{-3})');
%% 查找缺失值

    TF1=ismissing(pm25data);% 查找缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值
    TF = TF1;
%% 填充缺失值 (pm25dataPre是插补后的数据)

    pm25dataPre = pm25data;
    while max(TF) % 如果还存在缺失值就继续插补
        % pm25data = fillmissing(pm25data,'movmean',30);% 使用窗口长度为 30 的移动均值填充缺失数据。
        pm25dataPre = fillmissing(pm25dataPre,'movmedian',30); % 使用窗口长度为 30 的移动中位数替换数据中的 NaN 值 
        TF=ismissing(pm25dataPre);% 查找数据中的缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值
    end
    % plot(TF) % TF中的1对应pm25data中的缺失值,当数据中的缺失值填充完时,可以看到TF的值全为0
    subplot(212)
    plot(t,pm25dataPre,t(TF1),pm25dataPre(TF1),'x')% 查看插补后的数据 pm25dataPre
    title('插补后的数据波形')
    xlabel('Time/h');
    ylabel('PM_{2.5} / (\mu g.m^{-3})');
    legend('原始数据','插补值')
    % save('pm25dataPre.mat','pm25dataPre');% 保存插补后的数据

运行结果:
在这里插入图片描述


2022年10月15日07:25:01更新


  对于新手来说,将数据保存成.mat格式可能有些困难,本次更新教给新手一个手动操作保存数据的方法。该方法适合数据量较少的情况,简单易行。本次更新增加的内容可以概括为三个步骤:创建变量,复制数据,保存数据。

(1)创建变量
① 首先在命令行窗口创建一个空变量pm25data,用于存放数据。

    pm25data = [];

② 在工作区可以看到我们创建的变量pm25data,里面什么数据都没有。
在这里插入图片描述
(2)复制数据
  双击工作区的pm25data变量,如下图①所示,直接将表格中的数据复制到变量中,②中可以看到变量已经有了41757个数据。注意为保证复制成功,请将表格数据中的缺失值指示符全部替换为NaN。

在这里插入图片描述
(3)保存数据
  在命令行窗口利用save保存数据,在当前文件夹窗口可以看到我们保存的数据pm25data.mat。

    save("pm25data.mat","pm25data")

在这里插入图片描述
最后直接运行以下程序即可

clear;clc;close all;
%% 加载原始数据  

    load('pm25data.mat')% 原始数据
    pm25data = pm25data(:);
    subplot(211)
	t = datetime(2010,1,2,0,0,0) + hours(0:length(pm25data)-1)';% 创建与数据对应的时间向量。
    plot(t,pm25data)% 查看波形
    title('原始数据波形')
    xlabel('Time/h');
    ylabel('PM_{2.5} / (\mu g.m^{-3})');
%% 查找缺失值

    TF1=ismissing(pm25data);% 查找缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值
    TF = TF1;
%% 填充缺失值 (pm25dataPre是插补后的数据)

    pm25dataPre = pm25data;
    while max(TF) % 如果还存在缺失值就继续插补
        % pm25data = fillmissing(pm25data,'movmean',30);% 使用窗口长度为 30 的移动均值填充缺失数据。
        pm25dataPre = fillmissing(pm25dataPre,'movmedian',30); % 使用窗口长度为 30 的移动中位数替换数据中的 NaN 值 
        TF=ismissing(pm25dataPre);% 查找数据中的缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值
    end
    % plot(TF) % TF中的1对应pm25data中的缺失值,当数据中的缺失值填充完时,可以看到TF的值全为0
    subplot(212)
    plot(t,pm25dataPre,t(TF1),pm25dataPre(TF1),'x')% 查看插补后的数据 pm25dataPre
    title('插补后的数据波形')
    xlabel('Time/h');
    ylabel('PM_{2.5} / (\mu g.m^{-3})');
    legend('原始数据','插补值')
    % save('pm25dataPre.mat','pm25dataPre');% 保存插补后的数据

参考资料:


  1. UCI Machine Learning Repository: Data Sets. ↩︎

  2. 将 RESTful Web 服务中的内容保存到文件 - MATLAB websave - MathWorks 中国. ↩︎

  3. 从文件中读取矩阵 - MATLAB readmatrix - MathWorks 中国. ↩︎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB数据预处理之缺失值插补 的相关文章

  • MATLAB 是否已有 YAML 库/解析器?

    我想使用 YAML 跨多种语言交流一些数据 将其视为 与语言无关的序列化 其中一种语言是 MATLAB 但我似乎找不到该语言的 YAML 库 我在 Google 上检查了 matlab yaml 和 matlab yaml parse 似乎
  • 将输出从符号数学 (sym) 转换为浮点型

    我的问题类似于这个问题 https stackoverflow com questions 11114101 how to convert mupad symbol i sqrt 1 to i in matlab 11114959 1111
  • 图像增强 - 从书写中清除给定图像

    我需要清理这张照片 删除 清理我 的字样并使其变亮 作为图像处理课程作业的一部分 我可能会使用 matlab 函数 ginput 来查找图像中的特定点 当然 在脚本中您应该对所需的坐标进行硬编码 您可以使用 conv2 fft2 ifft2
  • 使用 python 在网络上部署 matlab 应用程序

    您好 我想使用 python 在网络上部署 matlab 应用程序 有没有办法做到这一点 我已按照数学工作网站上的文档将我的应用程序转换为 jar 文件 java 类 有人能指出我前进的正确方向吗 事实上 您的 Matlab 代码打包为 J
  • 将单元格转换为双精度

    gt gt C 1 2 CF 2 C 1 2 CF 2 gt gt whos C Name Size Bytes Class Attributes C 2x2 478 cell 我怎样才能转换C into double以便 gt gt C
  • 同时重新排序和旋转图像的高效方法

    为了快速加载 jpeg 我为turbojpeg 实现了一个 mex wrapper 以有效地将 大 jpeg 读入 MATLAB 对于 4000x3000px 的图像 实际解码只需要大约 120 毫秒 而不是 5 毫秒 然而 像素顺序是 R
  • 作为动画的八度情节点

    我有以下八度脚本 TOTAL POINTS 100 figure 1 for i 1 TOTAL POINTS randX rand 1 randY rand 1 scatter randX randY hold on endfor 当我运
  • 定义自定义 Mupad 程序的一般相对搜索路径

    假设我有一个 mupad 笔记本myMupadNotebook mn在路径上 C projectFolder ABC abc 它调用程序MyMupadProcedure mu它位于 C DEF GHI 现在我有一个 Matlab 脚本mai
  • 如何加载具有可变文件名的 .mat 文件?

    select all mat files oar dir oar mat n oar name loop through files for l 1 length oar load pat oar l lt this is the mat
  • 为什么 mex 文件中的 OpenMP 仅产生 1 个线程?

    我是 OpenMP 新手 我有以下代码 使用配置了 MSVS2010 的 Matlab mex 可以正常编译 计算机有 8 个可用处理器 我也使用 matlabpool 检查过 include mex h include
  • 在Matlab中选择图像上的像素时,索引指的是什么?

    当在Matlab中查看图像的单个像素时 该索引指的是什么 X Y 指的是像素的坐标 RGB 指的是颜色 但是关于索引是什么有什么想法吗 为了澄清一下 当我在 Matlab 中查看图形并使用数据光标选择一个点时 显示的三行是 X Y 指数 R
  • MATLAB 可执行文件太慢

    我使用以下命令将 MATLAB 程序转换为基于控制台的应用程序deploytool在 MATLAB 中 MATLAB m文件执行大约需要 2 秒 但在我将其转换为可执行文件并调用 exe 执行需要45秒 太长了 我想将 MATLAB 程序与
  • 从筛查乳腺 X 光检查数字数据库 (DDSM) 获取数据

    我正在尝试以可读格式获取 DDSM 数据集 有谁有 DDSM heathusf 程序的工作版本 可以在 Linux 或 Windows 上正常运行吗 我知道 DDSM 的 jpeg 程序有一个适用于 linux 的工作版本 位于http w
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • 如何为已编译的 MATLAB 创建安装程序并要求用户接受我们的许可条款?

    我正在 MATLAB 中编写程序分发给 Windows 用户 我使用 MATLAB 编译器和 MATLAB r2014a 版本来创建程序 我可以使用 MATLAB 应用程序编译器创建 Windows 安装程序 并且它的工作效果可以接受 但是
  • 直方图均衡结果

    I am trying to code histogram equalization by my self but the results are different from the built in function in matlab
  • getappdata 在 MATLAB 中返回空矩阵

    我有一段代码 我在其中使用setappdata然后我使用以下方式调用数据getappdata即使它不为空 它也会返回一个空矩阵 我的一段简化代码如下 function edit1 Callback hObject eventdata han
  • for 循环中的绘图没有可见点

    我正在努力解决我想使用 for 循环制作的情节 我知道当我在循环之后添加它时它会起作用 只是一个简单的图 但我想用另一种方式尝试一下 fib ones 1 10 for k 3 10 hold on fib k fib k 1 fib k
  • Matlab:条形图中缺少标签

    使用 Matlab 2012 和 2013 我发现设置XTickLabel on a bar图表最多只能使用 15 个柱 如果条形较多 则标签会丢失 如下所示 绘制 15 个条形图 N 15 x 1 N labels num2str x d
  • Numpy 相当于 MATLAB 的 hist [重复]

    这个问题在这里已经有答案了 由于某种原因 Numpy 的 hist 总是返回比 MATLAB 的 hist 少 1 个 bin 例如在 MATLAB 中 x 1 2 2 2 1 4 4 2 3 3 3 3 Rep Val hist x un

随机推荐