matlab函数输入参数不足(matlab中输入参数不足)

matlab函数输入参数不足(matlab中输入参数不足)p id 1L5NBL57 strong 前言 strong p p id 1L5NBL5C 现实中采集的原始数据不一定满足预测模型的需求 往往在使用之前需要对原始数据进行处理 使得采集的原始数据满足需求 本文主要做的是数据缺失处理方法 p

大家好,我是讯享网,很高兴认识大家。




讯享网

 <p id="1L5NBL57"><strong>前言</strong></p><p id="1L5NBL5C">现实中采集的原始数据不一定满足预测模型的需求,往往在使用之前需要对原始数据进行处理,使得采集的原始数据满足需求,本文主要做的是数据缺失处理方法。</p><p><strong>1 加载原始数据</strong></p><p id="1L5NBL5I">1 load('pm25data.mat')% 原始数据</p><p id="1L5NBL5J">2 figure</p><p id="1L5NBL5K">3 t = datetime(2010,1,2,0,0,0) + hours(0:length(pm25data)-1)';% 创建与数据对应的时间向量。</p><p id="1L5NBL5L">4 plot(pm25data)% 查看波形</p><p id="1L5NBL5M">5 title('原始数据波形')</p><p id="1L5NBL5N">6 xlabel('Time/h');</p><p id="1L5NBL5O">7 ylabel('PM_{2.5} / (mu g.m^{-3})');</p><p id="1L5NBL5U">如下图所示,可以看到原始数据波形有缺失部分</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0319%2Ffj00rrqwyx0015d200et00b4g00it00e4.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p><strong>2 查找缺失值并填充缺失值</strong></p><p id="1L5NBL66">2 % 查找缺失值</p><p id="1L5NBL67">3 % -------------------------------------------------------------------------</p><p id="1L5NBL68">4 TF1=ismissing(pm25data);% 查找缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值</p><p id="1L5NBL69">5 % plot(t,TF1,'*') % TF中的1对应pm25data中的缺失值</p><p id="1L5NBL6A">6 % pm25data(TF1) % 显示缺失值位置</p><p id="1L5NBL6B">7 TF = TF1;</p><p id="1L5NBL6C">8 % -------------------------------------------------------------------------</p><p id="1L5NBL6D">9 % 填充缺失值 (pm25dataPre是插补后的数据)</p><p id="1L5NBL6E">10 % -------------------------------------------------------------------------</p><p id="1L5NBL6F">11 pm25dataPre = pm25data;</p><p id="1L5NBL6G">12 t = datetime(2010,1,2,0,0,0) + hours(0:length(pm25data)-1)';% 创建与数据对应的时间向量。</p><p id="1L5NBL6H">13 while max(TF) % 如果还存在缺失值就继续插补</p><p id="1L5NBL6I">14 % pm25data = fillmissing(pm25data,'movmean',30);% 使用窗口长度为 30 的移动均值填充缺失数据。</p><p id="1L5NBL6J">15 pm25dataPre = fillmissing(pm25dataPre,'movmedian',30); % 使用窗口长度为 30 的移动中位数替换数据中的 NaN 值</p><p id="1L5NBL6K">16 TF=ismissing(pm25dataPre);% 查找数据中的缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值</p><p id="1L5NBL6L">17 end</p><p id="1L5NBL6M">18 % plot(TF) % TF中的1对应pm25data中的缺失值,当数据中的缺失值填充完时,可以看到TF的值全为0</p><p id="1L5NBL6N">19 plot(t,pm25dataPre,t(TF1),pm25dataPre(TF1),'x')% 查看插补后的数据 pm25dataPre</p><p id="1L5NBL6O">20 title('插补后的数据波形')</p><p id="1L5NBL6P">21 xlabel('Time/h');</p><p id="1L5NBL6Q">22 ylabel('PM_{2.5} / (mu g.m^{-3})');</p><p id="1L5NBL6R">23 legend('原始数据','插补值')</p><p id="1L5NBL6S">24 % save('pm25dataPre.mat','pm25dataPre');% 保存插补后的数据</p><p id="1L5NBL72">可以看到数据缺失部分,已被补全</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0319%2Fb02c8e05j00rrqwyy002id200et00b4g00it00e4.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p><strong>总结</strong></p><p id="1L5NBL74">以上就是今天要讲的内容,数据是pm2.5数据。如有不合理的地方还请指出。</p><p id="1L5NBL75"><strong>问:如何用缺失值的前两个值的平均值进行插补?</strong></p><p id="1L5NBL76">对于一个一维向量 A = [x1,x2,x3,x4,x5,x6],其值如下表所示:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0319%2F9ecd5fdep00rrqwyy0001d200fs001rg00it0023.png&thumbnail=660x&quality=80&type=jpg"/><br/></p><p id="1L5NBL78">可以看到x3和x6值缺失,对于x3进行插补,则</p><p id="1L5NBL79"><strong>x 3 = ( x 1 + x 2 ) / 2 = ( 5 + 7 ) / 2 = 6</strong></p><p id="1L5NBL7A">同理</p><p id="1L5NBL7B"><strong>x 6 = ( x 4 + x 5 ) / 2 = ( 8 + 9 ) / 2 = 8.5</strong></p><p id="1L5NBL7D">故插值后,可得</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0319%2F53cbbfa3p00rrqwyz0001d200fr001sg00it0024.png&thumbnail=660x&quality=80&type=jpg"/><br/></p><p id="1L5NBL7G">MATLAB程序实现:<br/>(注意:double 类型数据缺失值指示符为NaN)</p><p id="1L5NBL7M">1 A = [5,7,NaN,8,9,NaN]</p><p id="1L5NBL7N">2 F = fillmissing(A,'movmean',[2,0])</p><p id="1L5NBL7T">运行结果:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0319%2F1f700d66j00rrqwyz000ad200e4006rg00it008z.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p id="1L5NBL7V">有一点需要注意,如果第一个元素为NaN,则无法对其进行插补。<br/>例如:</p><p id="1L5NBL85">1 A = [NaN,5,7,NaN,8,9,NaN]</p><p id="1L5NBL86">2 F = fillmissing(A,'movmean',[2,0])</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0319%2Ff2c8747dj00rrqwz00009d200fe006xg00it008g.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p id="1L5NBL8G"><strong>问:如何用缺失值的前一个值和后一个值的均值进行插补?</strong><br/></p><p id="1L5NBL8H">MATLAB程序实现:</p><p id="1L5NBL8N">1 A = [5,NaN,7,NaN,3];</p><p id="1L5NBL8O">2 F = fillmissing(A,'movmean',3)</p><p id="1L5NBL8U">运行结果:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0319%2Faaj00rrqwz00004d2007n006mg007n006m.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p id="1L5NBL90">道理很简单,分析方法和上文相同,诸君可以试着自己分析一下。</p><p id="1L5NBL91">有的人可能不会加载数据,针对这个问题,我进行了更新,上文中用到的数据源1,在本次更新中会给出。程序运行后,会自动下载数据2,然后读取数据3,最后直接运行出结果。</p><p id="1L5NBL97">1 clear;clc;close all;</p><p id="1L5NBL98">2 %% 下载数据</p><p id="1L5NBL99">3</p><p id="1L5NBL9A">4 api = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00381/';</p><p id="1L5NBL9B">5 url = [api 'PRSA_data_2010.1.1-2014.12.31.csv'];</p><p id="1L5NBL9C">6 filename = 'DataSet.csv';</p><p id="1L5NBL9D">7 options = weboptions('Timeout',Inf); % 将超时值设置为 Inf 以使连接不会超时。</p><p id="1L5NBL9E">8 outfilename = websave(filename,url,options); % 数据下载,保存在DataSet.csv中</p><p id="1L5NBL9F">9 %% 读取表格数据</p><p id="1L5NBL9G">10</p><p id="1L5NBL9H">11 AllData = readmatrix(filename);</p><p id="1L5NBL9I">12 pm25data = AllData(25:43824,6); % 读取pm2.5数据</p><p id="1L5NBL9J">13 save("pm25data.mat","pm25data") % 保存数据</p><p id="1L5NBL9K">14 %% 加载原始数据</p><p id="1L5NBL9L">15</p><p id="1L5NBL9M">16 load('pm25data.mat')% 原始数据</p><p id="1L5NBL9N">17 figure</p><p id="1L5NBL9O">18 subplot(211)</p><p id="1L5NBL9P">19 t = datetime(2010,1,2,0,0,0) + hours(0:length(pm25data)-1)';% 创建与数据对应的时间向量。</p><p id="1L5NBL9Q">20 plot(t,pm25data)% 查看波形</p><p id="1L5NBL9R">21 title('原始数据波形')</p><p id="1L5NBL9S">22 xlabel('Time/h');</p><p id="1L5NBL9T">23 ylabel('PM_{2.5} / (mu g.m^{-3})');</p><p id="1L5NBL9U">24 %% 查找缺失值</p><p id="1L5NBL9V">25</p><p id="1L5NBLA0">26 TF1=ismissing(pm25data);% 查找缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值</p><p id="1L5NBLA1">27 TF = TF1;</p><p id="1L5NBLA2">28 %% 填充缺失值 (pm25dataPre是插补后的数据)</p><p id="1L5NBLA3">29</p><p id="1L5NBLA4">30 pm25dataPre = pm25data;</p><p id="1L5NBLA5">31 while max(TF) % 如果还存在缺失值就继续插补</p><p id="1L5NBLA6">32 % pm25data = fillmissing(pm25data,'movmean',30);% 使用窗口长度为 30 的移动均值填充缺失数据。</p><p id="1L5NBLA7">33 pm25dataPre = fillmissing(pm25dataPre,'movmedian',30); % 使用窗口长度为 30 的移动中位数替换数据中的 NaN 值</p><p id="1L5NBLA8">34 TF=ismissing(pm25dataPre);% 查找数据中的缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值</p><p id="1L5NBLA9">35 end</p><p id="1L5NBLAA">36 % plot(TF) % TF中的1对应pm25data中的缺失值,当数据中的缺失值填充完时,可以看到TF的值全为0</p><p id="1L5NBLAB">37 subplot(212)</p><p id="1L5NBLAC">38 plot(t,pm25dataPre,t(TF1),pm25dataPre(TF1),'x')% 查看插补后的数据 pm25dataPre</p><p id="1L5NBLAD">39 title('插补后的数据波形')</p><p id="1L5NBLAE">40 xlabel('Time/h');</p><p id="1L5NBLAF">41 ylabel('PM_{2.5} / (mu g.m^{-3})');</p><p id="1L5NBLAG">42 legend('原始数据','插补值')</p><p id="1L5NBLAH">43 % save('pm25dataPre.mat','pm25dataPre');% 保存插补后的数据</p><p id="1L5NBLAN">运行结果:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0319%2F0784e05cj00rrqwz0001zd200et00b4g00it00e4.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p id="1L5NBLAP">对于新手来说,将数据保存成.mat格式可能有些困难,本次更新教给新手一个手动操作保存数据的方法。该方法适合数据量较少的情况,简单易行。本次更新增加的内容可以概括为三个步骤:创建变量,复制数据,保存数据。</p><p id="1L5NBLAQ"><strong>(1)创建变量</strong></p><p id="1L5NBLAR">① 首先在命令行窗口创建一个空变量pm25data,用于存放数据。</p><p id="1L5NBLB1">1 pm25data = [];</p><p id="1L5NBLB7">② 在<strong>工作区</strong>可以看到我们创建的变量pm25data,里面什么数据都没有。</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0319%2F0b326cccj00rrqwz1000ld200lo007yg00it006w.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p id="1L5NBLB9"><strong>(2)复制数据</strong><br/>双击<strong>工作区</strong>的pm25data变量,如下图①所示,直接将表格中的数据复制到变量中,②中可以看到变量已经有了41757个数据。注意为保证复制成功,请将表格数据中的缺失值指示符全部替换为NaN。</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0319%2Fb35297fcj00rrqwz2000md200n9006ug00it005i.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p id="1L5NBLBB"><strong>(3)保存数据</strong><br/>在命令行窗口利用save保存数据,在当前文件夹窗口可以看到我们保存的数据pm25data.mat。</p><p id="1L5NBLBH">1 save("pm25data.mat","pm25data")</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0319%2F9bj00rrqwz5001hd200sh00evg00it009t.jpg&thumbnail=660x&quality=80&type=jpg"/><br/></p><p id="1L5NBLBR">最后直接运行以下程序即可</p><p id="1L5NBLC1">1 clear;clc;close all;</p><p id="1L5NBLC2">2 %% 加载原始数据</p><p id="1L5NBLC3">3</p><p id="1L5NBLC4">4 load('pm25data.mat')% 原始数据</p><p id="1L5NBLC5">5 pm25data = pm25data(:);</p><p id="1L5NBLC6">6 subplot(211)</p><p id="1L5NBLC7">7 t = datetime(2010,1,2,0,0,0) + hours(0:length(pm25data)-1)';% 创建与数据对应的时间向量。</p><p id="1L5NBLC8">8 plot(t,pm25data)% 查看波形</p><p id="1L5NBLC9">9 title('原始数据波形')</p><p id="1L5NBLCA">10 xlabel('Time/h');</p><p id="1L5NBLCB">11 ylabel('PM_{2.5} / (mu g.m^{-3})');</p><p id="1L5NBLCC">12 %% 查找缺失值</p><p id="1L5NBLCD">13</p><p id="1L5NBLCE">14 TF1=ismissing(pm25data);% 查找缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值</p><p id="1L5NBLCF">15 TF = TF1;</p><p id="1L5NBLCG">16 %% 填充缺失值 (pm25dataPre是插补后的数据)</p><p id="1L5NBLCH">17</p><p id="1L5NBLCI">18 pm25dataPre = pm25data;</p><p id="1L5NBLCJ">19 while max(TF) % 如果还存在缺失值就继续插补</p><p id="1L5NBLCK">20 % pm25data = fillmissing(pm25data,'movmean',30);% 使用窗口长度为 30 的移动均值填充缺失数据。</p><p id="1L5NBLCL">21 pm25dataPre = fillmissing(pm25dataPre,'movmedian',30); % 使用窗口长度为 30 的移动中位数替换数据中的 NaN 值</p><p id="1L5NBLCM">22 TF=ismissing(pm25dataPre);% 查找数据中的缺失值,TF是逻辑矩阵,利用TF可以找到pm25data内的缺失值</p><p id="1L5NBLCN">23 end</p><p id="1L5NBLCO">24 % plot(TF) % TF中的1对应pm25data中的缺失值,当数据中的缺失值填充完时,可以看到TF的值全为0</p><p id="1L5NBLCP">25 subplot(212)</p><p id="1L5NBLCQ">26 plot(t,pm25dataPre,t(TF1),pm25dataPre(TF1),'x')% 查看插补后的数据 pm25dataPre</p><p id="1L5NBLCR">27 title('插补后的数据波形')</p><p id="1L5NBLCS">28 xlabel('Time/h');</p><p id="1L5NBLCT">29 ylabel('PM_{2.5} / (mu g.m^{-3})');</p><p id="1L5NBLCU">30 legend('原始数据','插补值')</p><p id="1L5NBLCV">31 % save('pm25dataPre.mat','pm25dataPre');% 保存插补后的数据</p><p id="1L5NBLD5">参考资料:<br/></p><p id="1L5NBLD8">1.UCI Machine Learning Repository: Data Sets.</p><p id="1L5NBLD9">2.将 RESTful Web 服务中的内容保存到文件 - MATLAB websave - MathWorks 中国.</p><p id="1L5NBLDA">3.从文件中读取矩阵 - MATLAB readmatrix - MathWorks 中国.</p><p id="1L5NBLDD">(文章来源:CSDN--蛋炒炒)</p><p id="1L5NBLDH">数模备赛同时,小伙伴们不妨以赛代练来参加这场高含金量的数模竞赛!</p><p id="1L5NBLDI"><strong>2023第八届数维杯数学建模挑战赛等你来战</strong><strong>!</strong></p><p id="1L5NBLDO">或复制下方链接进行报名:</p><p id="1L5NBLDP">报名官网:http://www.nmmcm.org.cn/match_detail/26</p><p id="1L5NBLDQ">竞赛交流群↓</p><p id="1L5NBLDS">(进群领取历年赛前真题及优秀论文、招募队友、赛前资讯)进群备注:学校+姓名,不可重复加群。</p><p id="1L5NBLE0">数学建模竞赛结束后,还需要做这件事!!</p> 

讯享网
小讯
上一篇 2025-06-12 10:55
下一篇 2025-05-18 14:54

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/145497.html