%%場景二 %%節點數據預處理 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是排節點)