您的位置:首页 > 编程语言 > MATLAB

MATLAB感悟(1)--数据切割与插值拟合

2018-02-28 00:00 10 查看
摘要: 笔者最近参加了2018年的comap(Consortium for Mathematics and Its' Application),这也是笔者第一次参加这类型的比赛,在当中也收获到了许多的技巧和知识,为了与各位分享,笔者准备了一个系列博客分段记录,笔者会将自己的代码的一部分贴出来,多有不正之处,欢迎指正。由于笔者这次选的题目是C题所以只提供做题中用到的方法的代码与思路。如果有读者愿意欢迎联系本人共同探讨进步。

目的描述

​ 笔者拿到的C题其实质是一道大数据分析的题目,需要通过已经给出的数据推测出各种东西,但是给出的数据的参数种类很多,需要自行选择,其中个数的考究就留给大家自己去琢磨。

​ 拿到选取出来的
label
之后就需要将这些
label
对应的数据从大量的数据中切割出来。

​ 当时主办方当然不会让你这么容易就通过了,因为你选取的数据大部分是残缺不全的,而且缺的年份甚至有可能是不同的,这就比较蛋疼ing。

解决思路

​ MATLAB提供的从各种各样的材料导入数据的方法是非常强大的,所以并不用担心导入的问题。所以我们要解决的其实是以下几个问题。

怎样在大量的数据中准确的找到自己选取的
label
所对应的数据?

如果数据缺失怎样处理?

怎样选取出数据的办法因人而异,笔者将自己的代码贴出,希望给大家一点灵光。

​ 至于数据缺失,要么就放弃这个
label
,选取数据完整的
label
,要么就想办法把缺失的数据补齐。

​ 说到补齐很多人自然想到的是
插值与拟合或者回归
,这几种方法中间的微妙差异是读者该去考虑的问题,笔者就不多赘述。但是把数据补齐这点要注意的是
NaN和0
的区别,同时需要注意的是补齐的数据要放到对应的年份,不然会影响到会面的分析。

代码展示

#param_cell是读者自己的lab,MSN是总的lab
function OUTPUT=select_MSN_Index(param_cell,MSN)
temp=[];
sizeNum=size(param_cell);
sizeNum=sizeNum(2);
for ind=1:sizeNum
if MSN==param_cell{ind}{1}
temp=cat(2,temp,param_cell{ind}{4});
end
end
OUTPUT=temp;

function DataSet=Split_Data(ProblemData,MSN)
MSN=unique(MSN)
%MSN 是行向量
TX=(1960:2009)';
#...
for i=1:4
TEMP=select_Code_Index(ProblemData,CODE(i*2-1:2*i),2);
for j=1:583
TTEMP=select_MSN_Index(TEMP,char(MSN{j}));
SIZE=size(TTEMP);
if SIZE<50
MX=zeros(1,50-SIZE(2));
MX(:,:)=NaN;
TTEMP=cat(2,MX,TTEMP);
end
switch(i)
case 1
TX(:,j+1)=TTEMP';
#...
end
end
switch(i)
case 1
DataSet(1)={TX};
#   ...
end
end

#切割出对应的地方因子(区域)的数据
function [FData_M,LOCATION,Lab]=Split_Factor_Data(title,F_title,DataSet,index)
LOCATION=[];
Lab={};
NUM=1;
for i=1:index
OBJECT=F_title{i,1};
for j=1:584
MSN=title{1,j};
if j~=1
if  MSN==OBJECT
LOCATION(:,NUM)=j;
Lab(i,1)={MSN};
Lab(i,2)={OBJECT};
NUM=NUM+1;
end
end
end
FData_M=DataSet(:,LOCATION);
end

#将选取切割好的数据做数据的补齐
function Data=FitData_Cubicinterp(DataSet,index)
Data_X=[1960:2009]';
for i=1:index
Data_Y=DataSet(:,i);

LOCATION=find(Data_Y==0|isnan(Data_Y));
TEMP=Data_Y;
Data_X(LOCATION)=[];
Data_Y(LOCATION)=[];

Param=fit(Data_X,Data_Y,'exp1' );
RESULT=Param(LOCATION+1959);
TEMP(LOCATION)=RESULT;
Data(:,i)=TEMP;
Data_X=[1960:2009]';

figure
plot(Data_X,TEMP)
end

结果展示

由于结果有多种多样的,直接给出MATLAB的工作空间,有兴趣的读者可以自行下载。

链接 密码:dsj3
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息