• Matlab入门:实现简单的数据剔除


    时间仓促,仅为了数学建模入门使用

    代码简单描述:

    随机生成一组数据

    手动添加奇怪的数据值

    使用数据判断对数据进行清洗

    生成直方图、求平均值对处理前、处理后的数据进行对比

    代码如下:

     1 >> aa=randn(1000,1)/10;
     2 >> aa(100)=aa(100)+3;
     3 >> aa(301)=aa(301)+5;
     4 >> aa(501)=aa(501)+7;
     5 >> aa(701)=aa(701)-14;
     6 >> plot(aa);
     7 >> hist(aa,100);
     8 >> a=mean(aa)
     9 
    10 a =
    11 
    12    -0.0023
    13 
    14 >> c=std(aa)
    15 
    16 c =
    17 
    18     0.5318
    19 
    20 >> num=find(aa>(a+3*c)|aa<(a-3*c))
    21 
    22 num =
    23 
    24    100
    25    301
    26    501
    27    701
    28 
    29 >> std(aa)
    30 
    31 ans =
    32 
    33     0.5318
    34 
    35 >> for i = 1:1000
    36 if((aa(i)>(a+3*c)|aa(i)<(a-3*c)))
    37 aa(i)=0;
    38 else continue;
    39 end
    40 end
    41 >> len=length(aa);
    42 >> std(aa)
    43 
    44 ans =
    45 
    46     0.0996
    47 
    48 >> plot(aa);
    49  
    50 >> mean(aa)
    51 
    52 ans =
    53 
    54    -0.0033
    55 
    56 >> hist(aa,100);

    删除重复的行

    使用unique函数

     1 >> A=[1,2,3;4,5,6;3,5,7;1,2,3]
     2 
     3 A =
     4 
     5      1     2     3
     6      4     5     6
     7      3     5     7
     8      1     2     3
     9 
    10 >> unique(A,'rows','stable')
    11 
    12 ans =
    13 
    14      1     2     3
    15      4     5     6
    16      3     5     7

    9/15更新

    异常数据的处理

    若确认数据在同一个样本当中,绝大部分数据应该在均值为4or5个标准偏差之内

    对坏数据的处理

    ①个别处理

    ②按照一定百分比剔除最大与最小的一部分数据,exp(上下各剔除百分之2.5%),坏数据去除以后对统计量重新计算

    这里是对②实现的简单例子


    使用trimmean函数对坏数据进行剔除
    调用格式
    m=trimmean(X,percent)
    忽略数据上下各percent/2 %后的均值

    可以使用下列m函数去除坏数据

    % trim.c 文件
    function data=trim(data,outval)
    %去除坏数据 包括NaN、Inf和异常大小数据
    
    if nargin<2
        outval=4;
    end
    outliers = (isnan(data)|abs(data)==inf);
    [n,m]=size(data);
    if m>1,
        data(any(outliers'),:)=[];
    else
        data(find(outliers'),:)=[];
    end
    [n,m]=size(data);
    mu=mean(data);
    sigma=std(data);
    outliers=(abs(data-ones(n,1)*mu)>outval*ones(n,1)*sigma);
    if m>1,
        data(any(outliers'),:)=[];
    else
        data(find(outliers'),:)=[];
    end

    下面是函数调用实例

    >> clear all;
    >> c=[nan;ones(100,1);inf;100] %含有nan inf和一个不正常大的数100
    
    c =
    
       NaN
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
       Inf
       100
    
    >> mean(c),trimmean(c,5)
    
    ans =
    
       NaN
    
    
    ans =
    
         1
    
    >> c=trim(c)
    
    c =
    
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
    
    >> 
  • 相关阅读:
    实验12——java取整、猜数和猜拳
    实验11——java线程模拟卖票
    实验10—— java读取歌词文件内容动画输出
    实验09——java基于TCP实现客户端与服务端通信
    JavaSE第十四天
    javaSE第十一天
    JavaSE第十天
    JavaSE第十天
    JavaSE第九天
    JavaSE第八天
  • 原文地址:https://www.cnblogs.com/AKsnoopy/p/11483369.html
Copyright © 2020-2023  润新知