MATLAB感悟(1)--數據切割與插值擬合

目的描述

​ 筆者拿到的C題其實質是一道大數據分析的題目,須要經過已經給出的數據推測出各類東西,可是給出的數據的參數種類不少,須要自行選擇,其中個數的考究就留給你們本身去琢磨。大數據

​ 拿到選取出來的label以後就須要將這些label對應的數據從大量的數據中切割出來。code

​ 當時主辦方固然不會讓你這麼容易就經過了,由於你選取的數據大部分是殘缺不全的,並且缺的年份甚至有多是不一樣的,這就比較蛋疼ing。ci

解決思路

​ MATLAB提供的從各類各樣的材料導入數據的方法是很是強大的,因此並不用擔憂導入的問題。因此咱們要解決的實際上是如下幾個問題。get

  • 怎樣在大量的數據中準確的找到本身選取的label所對應的數據?
  • 若是數據缺失怎樣處理?

怎樣選取出數據的辦法因人而異,筆者將本身的代碼貼出,但願給你們一點靈光。數據分析

​ 至於數據缺失,要麼就放棄這個label,選取數據完整的label,要麼就想辦法把缺失的數據補齊。it

​ 說到補齊不少人天然想到的是插值與擬合或者回歸,這幾種方法中間的微妙差別是讀者該去考慮的問題,筆者就很少贅述。可是把數據補齊這點要注意的是NaN和0的區別,同時須要注意的是補齊的數據要放到對應的年份,否則會影響到會面的分析。io

代碼展現

#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的工做空間,有興趣的讀者能夠自行下載。function

連接 密碼:dsj3class

相關文章
相關標籤/搜索