zoukankan      html  css  js  c++  java
  • 数据预处理:删除零值数据和缺省数据;众数补全(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是排节点)
  • 相关阅读:
    二叉树——Java实现
    Java实现单链表的增删查改及逆置打印
    常见排序——Java实现
    [导入]Interesting Finds: 2007.12.10
    [导入]Interesting Finds: 2007.12.09
    [导入]Interesting Finds: 2007.12.12
    [导入]Interesting Finds: 2007.12.06
    [导入]Interesting Finds: 2007.12.07
    [导入]Interesting Finds: 2007.12.04
    [导入]Interesting Finds: 2007.12.05
  • 原文地址:https://www.cnblogs.com/feynmania/p/12952909.html
Copyright © 2011-2022 走看看