网易首页 > 网易号 > 正文 申请入驻

如何用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.

相关推荐
热点推荐
“日本鬼子”变成违禁词,动了谁的利益,为何有如此大的争议?

“日本鬼子”变成违禁词,动了谁的利益,为何有如此大的争议?

历史微鉴
2024-06-19 22:45:12
刘洋:上太空前丈夫对她撒谎、玩失踪,返回地球她才知道真相

刘洋:上太空前丈夫对她撒谎、玩失踪,返回地球她才知道真相

君好伴读
2024-06-18 11:05:43
三件事:中朝关系生变?中国收到“战书”,不是美;俄乌大结局?

三件事:中朝关系生变?中国收到“战书”,不是美;俄乌大结局?

星辰故事屋
2024-06-18 17:35:57
汪小菲新店深圳开业,马晓梅改口叫张兰妈,大S模仿者被拒之门外

汪小菲新店深圳开业,马晓梅改口叫张兰妈,大S模仿者被拒之门外

牧歌侃娱
2024-06-19 15:48:29
镜报:曼联告知埃弗顿,对布兰斯韦特的报价要实际一些

镜报:曼联告知埃弗顿,对布兰斯韦特的报价要实际一些

直播吧
2024-06-19 22:32:13
美国三大车企应该退出中国市场?福特称:恰恰相反

美国三大车企应该退出中国市场?福特称:恰恰相反

观察者网
2024-06-19 15:49:16
华春莹推介!张家界这一幕爆火,外国人都被硬控住了

华春莹推介!张家界这一幕爆火,外国人都被硬控住了

潇湘晨报
2024-06-18 22:53:07
上海这一夜,由王中磊牵头的明星聚会,将华谊的落魄展现淋漓尽致

上海这一夜,由王中磊牵头的明星聚会,将华谊的落魄展现淋漓尽致

先人后记
2024-06-19 00:01:03
我花2万找小姐要求处女,在酒店以为遇到仙人跳,最后动了真心

我花2万找小姐要求处女,在酒店以为遇到仙人跳,最后动了真心

叶天辰故事会
2024-06-07 18:02:04
这女孩竟然是陈妍希!!!不过照片中这位男士是谁啊?

这女孩竟然是陈妍希!!!不过照片中这位男士是谁啊?

牛叨小史
2024-06-17 18:25:36
现在月薪1万在中国是什么水平?

现在月薪1万在中国是什么水平?

陌小尘桑
2024-01-03 18:50:03
“生孩子”别乱演!头发黏腻、青筋暴起,刘亦菲带来教科书式演技

“生孩子”别乱演!头发黏腻、青筋暴起,刘亦菲带来教科书式演技

咖啡店的老板娘
2024-06-19 21:02:24
金正恩和普京举行大范围会谈

金正恩和普京举行大范围会谈

花非花008
2024-06-19 15:07:18
王健林接走王思聪女儿!黄一鸣直播撕葱,孩子有千千万万电子爸爸

王健林接走王思聪女儿!黄一鸣直播撕葱,孩子有千千万万电子爸爸

八卦王者
2024-06-19 10:00:58
广汽本田裁员名额被抢空,部分员工早已计划跳槽到造车新势力

广汽本田裁员名额被抢空,部分员工早已计划跳槽到造车新势力

界面新闻
2024-06-19 16:37:15
一对情侣与领导吃烧烤,领导把男方灌醉,与女方去厕所偷偷接吻

一对情侣与领导吃烧烤,领导把男方灌醉,与女方去厕所偷偷接吻

一个岛岛
2024-06-18 22:52:05
直肠癌看大便就知?忠告:上厕所时发现4个怪象,尽早做下肠镜

直肠癌看大便就知?忠告:上厕所时发现4个怪象,尽早做下肠镜

39健康网
2024-06-18 22:05:02
注销又有新规定!6月17日起,企业注销必须这样办,否则后果严重!

注销又有新规定!6月17日起,企业注销必须这样办,否则后果严重!

祥顺财税俱乐部
2024-06-19 09:10:39
浙江便利店行业“排头兵”:已开出3879家门店,一年进账66亿元

浙江便利店行业“排头兵”:已开出3879家门店,一年进账66亿元

火星人杂谈
2024-06-17 18:49:16
更多细节曝光!中国海警“大刀队”给菲律宾特种部队缴械了?

更多细节曝光!中国海警“大刀队”给菲律宾特种部队缴械了?

军武次位面
2024-06-19 18:06:32
2024-06-19 23:30:44
数模乐园官方
数模乐园官方
专注于数学建模,分享干货知识
1135文章数 793关注度
往期回顾 全部

科技要闻

618观察:谁为高强度的低价竞争买单?

头条要闻

广东梅州多地因洪水成"孤岛" 救援人员徒步六小时抵达

头条要闻

广东梅州多地因洪水成"孤岛" 救援人员徒步六小时抵达

体育要闻

欧洲杯最大的混子,非他莫属

娱乐要闻

黄一鸣“杀疯了” 直播间卖大葱养孩子

财经要闻

深化科创板改革 证监会发布八条措施

汽车要闻

双肾格栅变化大/内饰焕新 新一代宝马X3官图发布

态度原创

游戏
房产
数码
教育
公开课

小强不imba,欧皇人imba

房产要闻

17.9亿!终于,有民企在三亚大手笔拿地了!周边房价10万+!

数码要闻

苹果调整头显产品线 标准版将主打降低成本与减重增效

教育要闻

高考生苦练意大利斜体,作文像医生处方,阅卷老师给0分就老实了

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版