概述
文章目录
- 前言
- 1 加载原始数据
- 2 查找缺失值并填充缺失值
- 总结
- 2021年4月5日09:51:56更新
- 2021年5月18日10:46:15更新
- 2022年10月15日07:25:01更新
- 参考资料:
前言
现实中采集的原始数据不一定满足预测模型的需求,往往在使用之前需要对原始数据进行处理,使得采集的原始数据满足需求,本文主要做的是数据缺失处理方法。
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');% 保存插补后的数据
参考资料:
UCI Machine Learning Repository: Data Sets. ↩︎
将 RESTful Web 服务中的内容保存到文件 - MATLAB websave - MathWorks 中国. ↩︎
从文件中读取矩阵 - MATLAB readmatrix - MathWorks 中国. ↩︎
最后
以上就是畅快手链为你收集整理的MATLAB数据预处理之缺失值插补前言1 加载原始数据2 查找缺失值并填充缺失值总结2021年4月5日09:51:56更新2021年5月18日10:46:15更新2022年10月15日07:25:01更新参考资料:的全部内容,希望文章能够帮你解决MATLAB数据预处理之缺失值插补前言1 加载原始数据2 查找缺失值并填充缺失值总结2021年4月5日09:51:56更新2021年5月18日10:46:15更新2022年10月15日07:25:01更新参考资料:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复