如何用Matlab补齐数据预处理缺失值?【附详细教程】 |
您所在的位置:网站首页 › matlab中tf › 如何用Matlab补齐数据预处理缺失值?【附详细教程】 |
0
分享至
用微信扫码二维码 分享至好友和朋友圈 前言 现实中采集的原始数据不一定满足预测模型的需求,往往在使用之前需要对原始数据进行处理,使得采集的原始数据满足需求,本文主要做的是数据缺失处理方法。 1 加载原始数据 1 load('pm25data.mat')% 原始数据 2 figure 3 t = datetime(2010,1,2,0,0,0) + hours(0:length(pm25data)-1)';% 创建与数据对应的时间向量。 4 plot(pm25data)% 查看波形 5 title('原始数据波形') 6 xlabel('Time/h'); 7 ylabel('PM_{2.5} / (\mu g.m^{-3})'); 如下图所示,可以看到原始数据波形有缺失部分 2 查找缺失值并填充缺失值 2 % 查找缺失值 3 % ------------------------------------------------------------------------- 4 TF1=ismissing(pm25data);% 查找缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值 5 % plot(t,TF1,'*') % TF中的1对应pm25data中的缺失值 6 % pm25data(TF1) % 显示缺失值位置 7 TF = TF1; 8 % ------------------------------------------------------------------------- 9 % 填充缺失值 (pm25dataPre是插补后的数据) 10 % ------------------------------------------------------------------------- 11 pm25dataPre = pm25data; 12 t = datetime(2010,1,2,0,0,0) + hours(0:length(pm25data)-1)';% 创建与数据对应的时间向量。 13 while max(TF) % 如果还存在缺失值就继续插补 14 % pm25data = fillmissing(pm25data,'movmean',30);% 使用窗口长度为 30 的移动均值填充缺失数据。 15 pm25dataPre = fillmissing(pm25dataPre,'movmedian',30); % 使用窗口长度为 30 的移动中位数替换数据中的 NaN 值 16 TF=ismissing(pm25dataPre);% 查找数据中的缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值 17 end 18 % plot(TF) % TF中的1对应pm25data中的缺失值,当数据中的缺失值填充完时,可以看到TF的值全为0 19 plot(t,pm25dataPre,t(TF1),pm25dataPre(TF1),'x')% 查看插补后的数据 pm25dataPre 20 title('插补后的数据波形') 21 xlabel('Time/h'); 22 ylabel('PM_{2.5} / (\mu g.m^{-3})'); 23 legend('原始数据','插补值') 24 % save('pm25dataPre.mat','pm25dataPre');% 保存插补后的数据 可以看到数据缺失部分,已被补全 总结 以上就是今天要讲的内容,数据是pm2.5数据。如有不合理的地方还请指出。 问:如何用缺失值的前两个值的平均值进行插补? 对于一个一维向量 A = [x1,x2,x3,x4,x5,x6],其值如下表所示: 可以看到x3和x6值缺失,对于x3进行插补,则 x 3 = ( x 1 + x 2 ) / 2 = ( 5 + 7 ) / 2 = 6 同理 x 6 = ( x 4 + x 5 ) / 2 = ( 8 + 9 ) / 2 = 8.5 故插值后,可得 MATLAB程序实现:(注意:double 类型数据缺失值指示符为NaN) 1 A = [5,7,NaN,8,9,NaN] 2 F = fillmissing(A,'movmean',[2,0]) 运行结果: 有一点需要注意,如果第一个元素为NaN,则无法对其进行插补。例如: 1 A = [NaN,5,7,NaN,8,9,NaN] 2 F = fillmissing(A,'movmean',[2,0]) 问:如何用缺失值的前一个值和后一个值的均值进行插补? MATLAB程序实现: 1 A = [5,NaN,7,NaN,3]; 2 F = fillmissing(A,'movmean',3) 运行结果: 道理很简单,分析方法和上文相同,诸君可以试着自己分析一下。 有的人可能不会加载数据,针对这个问题,我进行了更新,上文中用到的数据源1,在本次更新中会给出。程序运行后,会自动下载数据2,然后读取数据3,最后直接运行出结果。 1 clear;clc;close all; 2 %% 下载数据 3 4 api = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00381/'; 5 url = [api 'PRSA_data_2010.1.1-2014.12.31.csv']; 6 filename = 'DataSet.csv'; 7 options = weboptions('Timeout',Inf); % 将超时值设置为 Inf 以使连接不会超时。 8 outfilename = websave(filename,url,options); % 数据下载,保存在DataSet.csv中 9 %% 读取表格数据 10 11 AllData = readmatrix(filename); 12 pm25data = AllData(25:43824,6); % 读取pm2.5数据 13 save("pm25data.mat","pm25data") % 保存数据 14 %% 加载原始数据 15 16 load('pm25data.mat')% 原始数据 17 figure 18 subplot(211) 19 t = datetime(2010,1,2,0,0,0) + hours(0:length(pm25data)-1)';% 创建与数据对应的时间向量。 20 plot(t,pm25data)% 查看波形 21 title('原始数据波形') 22 xlabel('Time/h'); 23 ylabel('PM_{2.5} / (\mu g.m^{-3})'); 24 %% 查找缺失值 25 26 TF1=ismissing(pm25data);% 查找缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值 27 TF = TF1; 28 %% 填充缺失值 (pm25dataPre是插补后的数据) 29 30 pm25dataPre = pm25data; 31 while max(TF) % 如果还存在缺失值就继续插补 32 % pm25data = fillmissing(pm25data,'movmean',30);% 使用窗口长度为 30 的移动均值填充缺失数据。 33 pm25dataPre = fillmissing(pm25dataPre,'movmedian',30); % 使用窗口长度为 30 的移动中位数替换数据中的 NaN 值 34 TF=ismissing(pm25dataPre);% 查找数据中的缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值 35 end 36 % plot(TF) % TF中的1对应pm25data中的缺失值,当数据中的缺失值填充完时,可以看到TF的值全为0 37 subplot(212) 38 plot(t,pm25dataPre,t(TF1),pm25dataPre(TF1),'x')% 查看插补后的数据 pm25dataPre 39 title('插补后的数据波形') 40 xlabel('Time/h'); 41 ylabel('PM_{2.5} / (\mu g.m^{-3})'); 42 legend('原始数据','插补值') 43 % save('pm25dataPre.mat','pm25dataPre');% 保存插补后的数据 运行结果: 对于新手来说,将数据保存成.mat格式可能有些困难,本次更新教给新手一个手动操作保存数据的方法。该方法适合数据量较少的情况,简单易行。本次更新增加的内容可以概括为三个步骤:创建变量,复制数据,保存数据。 (1)创建变量 ① 首先在命令行窗口创建一个空变量pm25data,用于存放数据。 1 pm25data = []; ② 在工作区可以看到我们创建的变量pm25data,里面什么数据都没有。 (2)复制数据双击工作区的pm25data变量,如下图①所示,直接将表格中的数据复制到变量中,②中可以看到变量已经有了41757个数据。注意为保证复制成功,请将表格数据中的缺失值指示符全部替换为NaN。 (3)保存数据在命令行窗口利用save保存数据,在当前文件夹窗口可以看到我们保存的数据pm25data.mat。 1 save("pm25data.mat","pm25data") 最后直接运行以下程序即可 1 clear;clc;close all; 2 %% 加载原始数据 3 4 load('pm25data.mat')% 原始数据 5 pm25data = pm25data(:); 6 subplot(211) 7 t = datetime(2010,1,2,0,0,0) + hours(0:length(pm25data)-1)';% 创建与数据对应的时间向量。 8 plot(t,pm25data)% 查看波形 9 title('原始数据波形') 10 xlabel('Time/h'); 11 ylabel('PM_{2.5} / (\mu g.m^{-3})'); 12 %% 查找缺失值 13 14 TF1=ismissing(pm25data);% 查找缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值 15 TF = TF1; 16 %% 填充缺失值 (pm25dataPre是插补后的数据) 17 18 pm25dataPre = pm25data; 19 while max(TF) % 如果还存在缺失值就继续插补 20 % pm25data = fillmissing(pm25data,'movmean',30);% 使用窗口长度为 30 的移动均值填充缺失数据。 21 pm25dataPre = fillmissing(pm25dataPre,'movmedian',30); % 使用窗口长度为 30 的移动中位数替换数据中的 NaN 值 22 TF=ismissing(pm25dataPre);% 查找数据中的缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值 23 end 24 % plot(TF) % TF中的1对应pm25data中的缺失值,当数据中的缺失值填充完时,可以看到TF的值全为0 25 subplot(212) 26 plot(t,pm25dataPre,t(TF1),pm25dataPre(TF1),'x')% 查看插补后的数据 pm25dataPre 27 title('插补后的数据波形') 28 xlabel('Time/h'); 29 ylabel('PM_{2.5} / (\mu g.m^{-3})'); 30 legend('原始数据','插补值') 31 % save('pm25dataPre.mat','pm25dataPre');% 保存插补后的数据 参考资料: 1.UCI Machine Learning Repository: Data Sets. 2.将 RESTful Web 服务中的内容保存到文件 - MATLAB websave - MathWorks 中国. 3.从文件中读取矩阵 - MATLAB readmatrix - MathWorks 中国. (文章来源:CSDN--蛋炒炒) 数模备赛同时,小伙伴们不妨以赛代练来参加这场高含金量的数模竞赛! 2023第八届数维杯数学建模挑战赛等你来战! 或复制下方链接进行报名: 报名官网:http://www.nmmcm.org.cn/match_detail/26 竞赛交流群↓ (进群领取历年赛前真题及优秀论文、招募队友、赛前资讯)进群备注:学校+姓名,不可重复加群。 数学建模竞赛结束后,还需要做这件事!! 特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。 Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services. /阅读下一篇/ 返回网易首页 下载网易新闻客户端 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |