數據預處理:刪除零值數據和缺省數據;眾數補全(matlab)


%%場景二
%%節點數據預處理
function [X,Y]=nodedata_pro()
%導入班節點數據
[num_2ban1,~,raw_2ban1]=xlsread('sen2ban1.xlsx');
[num_2ban2,~,raw_2ban2]=xlsread('sen2ban2.xlsx');
[num_2ban3,~,raw_2ban3]=xlsread('sen2ban3.xlsx');
[num_2ban4,~,raw_2ban4]=xlsread('sen2ban4.xlsx');
[num_2ban5,~,raw_2ban5]=xlsread('sen2ban5.xlsx');
[num_2ban6,~,raw_2ban6]=xlsread('sen2ban6.xlsx');
[num_2ban7,~,raw_2ban7]=xlsread('sen2ban7.xlsx');
[num_2ban8,~,raw_2ban8]=xlsread('sen2ban8.xlsx');
%導入排節點數據
[num_2pai1,~,raw_2pai1]=xlsread('sen2pai1.xlsx');
[num_2pai2,~,raw_2pai2]=xlsread('sen2pai2.xlsx');
[num_2pai3,~,raw_2pai3]=xlsread('sen2pai3.xlsx');
%將ban1~ban3前三行無效信息刪去,使得ban1~ban3節點與其余節點格式保持一致
num_2ban1=num_2ban1(:,4:end);
num_2ban2=num_2ban2(:,4:end);
num_2ban3=num_2ban3(:,4:end);
raw_2ban1=raw_2ban1(:,4:end);
raw_2ban2=raw_2ban2(:,4:end);
raw_2ban3=raw_2ban3(:,4:end);
[m,n]=size(num_2ban1);
k=[5,8,11,14,17,20];             %有效信息所在的列數
feature=cell(1,length(k));       %提取有效特征名稱
feature_data=zeros(11*m,length(k)+1);  %創建存儲特征數據的數組feature_data;11為節點總個數
% original_data為(刪去了ban1~ban3前三列后的)原始數據;
ban_table=3*ones(m,1);                 %加入節點類別,班級別為3
pai_table=2*ones(m,1);                 %加入節點類別,排級別為2
original_data=[num_2ban1,ban_table;num_2ban2,ban_table;num_2ban3,ban_table;num_2ban4,ban_table;num_2ban5,ban_table;num_2ban6,ban_table;num_2ban7,ban_table;num_2ban8,ban_table;
    num_2pai1,pai_table;num_2pai2,pai_table;num_2pai3,pai_table];
for i=1:length(k)+1
    if i<length(k)+1                      %輸入特征
    feature{1,i}=raw_2ban1{1,k(i)};     
    feature_data(:,i)=original_data(:,k(i));
    else
         feature_data(:,i)=original_data(:,end);  %輸入節點類別
    end      
end
% 按行(時間點)遍歷
% ①利用Flag判斷每個時間點數據是否有效,每個時間點擁有一個Flag,初始Flag=0;
% 判斷第一個特征是否是NAN 【isnan(feature(:,1))】,是則Flag=Flag+1;
% ②除了特征1以外的特征,若為0,Falg=Flag+1;若為NAN,Flag=Flag+1;
% ③判斷Flag是否大於等於特征數目的一半,若是,則刪去該時間點的數據;if Flag>=size(feature_data,2)-1
% ④得到最終數據【保留有有效信息的數據】
%% 遍歷所有時間點的特征數據,開始刪除0和nan過多的無效數據
[m1,n1]=size(feature_data);
Flag=zeros(m1,1);
data_pro1=[];
count=1;
for j=1:m1                      
    Flag(j)=0;
    if isnan(feature_data(j,1))==1
        Flag(j)=Flag(j)+1;
    end
    rest_feature=feature_data(j,2:end-1);    %剩余特征為除了第一列外的其他特征
    Flag(j)=Flag(j)+sum(isnan(rest_feature))+length(find(rest_feature==0)); 
    %Flag為第一列是否為NAN,sum()為統計剩余特征中nan的個數;length()為統計剩余特征中0的個數
    if Flag(j)<(n1-1)/2 %Flag<特征總數的一半,保留該特征
        data_pro1(count,:)=feature_data(j,:);
        count=count+1;
    end       
end

%% 刪除無效特征(按列)(無意義的零值和NAN數據數目超過總樣本數一半的)
[m2,n2]=size(data_pro1);
nan_0_num=zeros(1,n2-1);  %統計特征1的nan個數;統計其他特征0+nan的個數
count1=1;
count2=1;
data_pro2=[];             %存儲刪除無效特征后的數據
for k=1:n2-1              %n2的最后一行為類別,不計入特征,所以為n2-1
    if k==1
        nan_0_num(k)=sum(isnan(data_pro1(:,k)));
    else
        nan_0_num(k)=sum(isnan(data_pro1(:,k)))+length(find(data_pro1(:,k)==0));
    end
        if nan_0_num(k)<m2/2                  % 特征中的無效數據數目小於總樣本數的一半,則該特征予以保留
        data_pro2(:,count1)=data_pro1(:,k);
        count1=count1+1;
        else
            feature_delete_index(count2)=k;   % 特征中的無效數據數目大於等於總樣本數的一半,則刪除該特征,並返回特征序號,存儲子啊feature_delete_index中
            count2=count2+1;
        end
end    
%數據補全:對零值數據和NAN數據進行眾數補全
data_pro3=data_pro2;
for i=1:size(data_pro2,2)
    if i==1
        index_1_nan=find(isnan(data_pro2(:,1))==1);       %返回第一列中為nan數值的樣本序號;
        data_pro3(index_1_nan,1)=mode(data_pro2(:,1));    %用眾數補全的方法補全第一列的nan缺省數據
    else
        index_1_nan=find(isnan(data_pro2(:,i))==1); 
        data_pro3(index_1_nan,i)=mode(data_pro2(:,i));    %用眾數補全的方法補全第i列的nan缺省數據,也可以替換成拉格朗日補全
        index_2_nan=find(data_pro2(:,i)==0); 
        data_pro3(index_2_nan,i)=mode(data_pro2(:,i));    %用眾數補全的方法補全第i列的nan缺省數據
    end
end
data_pro3=[data_pro3,data_pro1(:,end)];                   %加入各個樣本的類別
X=data_pro3(:,1:end-1);                                   %X是補全后的特征數據
Y=data_pro3(:,end);                                       %Y是X對應的類別(3是班節點,2是排節點)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM