【问题标题】:Outlier Analysis on a 2D array in MatlabMatlab中二维数组的异常值分析
【发布时间】:2018-07-21 04:55:59
【问题描述】:

我正在尝试对二维数组值进行异常值分析,我的数据如下所示:

10.836126    6.342457    6.359280    4.865735   11.332891
13.228078   17.779455   11.021488   10.057800   13.371285
11.350769   15.052270   10.556633    7.909101    7.627935
11.841888    4.655980    8.363947   10.808192   12.761605
2.534398    6.189042    6.987835    8.412396    8.166305

根据我的作业要求,我需要消除所有与平均值相差 1 个标准差的值,我遇到的问题是:

这组的平均值是 = 9.9900 10.0057 10.0180 10.0051 9.9312 和

标准差 = 3.0257 3.0208 3.0119 2.9924 2.9868

我不知道如何根据这个平均值和标准差计算异常值。非常感谢这方面的任何帮助。

P.S:我对 Matlab 和数据分析都是全新的。所以,请原谅我提供任何不相关的信息。

【问题讨论】:

  • 添加 s.d.平均并消除那些更大的值。此外,减去标准差。从平均值中剔除那些小于的值。
  • 您是否需要消除所有与每列或整个数据的平均值相差 1 个标准差的值?
  • @MehrdadZandigohar 实际上,我不清楚这一点,但我相信我需要从整个数据中消除值。非常感谢阿农的帮助。您能否也分享一些示例代码。

标签: arrays matlab outliers


【解决方案1】:

通常,Matlab 上的此操作使用isoutlier function 执行。当method 参数作为mean 传递给函数调用时,用于检测异常值(您在问题中提到的方法)的均值方差方法应用于观察:

method — 确定异常值“中值”的方法(默认)| '意思' | '四分位数' | '蛴螬' | 'gesd'

'mean' 对于超过三个标准差的元素返回 true 从平均数。这种方法比“中值”更快,但不够稳健。

不幸的是,它基于3 与平均值的标准差,而不是仅1 与平均值的标准差。因此,必须实现自定义代码。给定观察矩阵A,这应该可以正常工作:

m = nanmean(A,1);
s = nanstd(A,1);    
lb = m - s;
ub = m + s;
is_outlier = ((A < lb) | (A > ub));

is_outlier 变量将是与A 大小相同的逻辑值矩阵,其中true 值表示异常值:

A = [
  10.836126  6.342457  6.359280  4.865735 11.332891;
  13.228078 17.779455 11.021488 10.057800 13.371285;
  11.350769 15.052270 10.556633  7.909101  7.627935;
  11.841888  4.655980  8.363947 10.808192 12.761605;
   2.534398  6.189042  6.987835  8.412396  8.166305
];

m = nanmean(A,1);
s = nanstd(A,1);    
lb = m - s;
ub = m + s;

is_outlier = ((A < lb) | (A > ub))

is_outlier =
   0   0   1   1   0
   0   1   1   0   1
   0   0   1   0   1
   0   1   0   1   0
   1   0   0   0   1

我唯一的疑问是您提供的方法和差异。它们与您根据给定数据计算的不同:

A = [
  10.836126  6.342457  6.359280  4.865735 11.332891;
  13.228078 17.779455 11.021488 10.057800 13.371285;
  11.350769 15.052270 10.556633  7.909101  7.627935;
  11.841888  4.655980  8.363947 10.808192 12.761605;
   2.534398  6.189042  6.987835  8.412396  8.166305
];

m = nanmean(A,1)
s = nanstd(A,1)

m =
    9.9582518 10.0038408 8.6578366 8.4106448 10.6520042


s =
    3.79639885205053 5.33862997268428 1.86284269833871 2.062972979429 2.35083838144151

因此,如果您必须使用它们,您可以简单地进行如下操作:

A = [
  10.836126  6.342457  6.359280  4.865735 11.332891;
  13.228078 17.779455 11.021488 10.057800 13.371285;
  11.350769 15.052270 10.556633  7.909101  7.627935;
  11.841888  4.655980  8.363947 10.808192 12.761605;
   2.534398  6.189042  6.987835  8.412396  8.166305
];

m = [9.9900 10.0057 10.0180 10.0051 9.9312];
s = [3.0257  3.0208  3.0119  2.9924 2.9868];

lb = m - s;
ub = m + s;

is_outlier = ((A < lb) | (A > ub))

is_outlier =
   0   1   1   1   0
   1   1   0   0   1
   0   1   0   0   0
   0   1   0   0   0
   1   1   1   0   0

一旦您知道必须将 A 的哪些元素视为异常值,您就可以继续按照自己的喜好处理它们。例如,您可以将它们设置为NaN,如下所示:

A(is_outlier) = NaN;

或者您可以删除所有包含一个或多个异常值的列,如下所示:

A(any(is_outlier),:) = [];

请考虑,您对均值的容差增加得越多,离群值就越少。使用内置的isoutlier function,它基于远离均值的3 标准差,检测到的异常值非常少:

A = [
  10.836126  6.342457  6.359280  4.865735 11.332891;
  13.228078 17.779455 11.021488 10.057800 13.371285;
  11.350769 15.052270 10.556633  7.909101  7.627935;
  11.841888  4.655980  8.363947 10.808192 12.761605;
   2.534398  6.189042  6.987835  8.412396  8.166305
];

isoutlier(A) % lb = m - (3 * s) AND ub = m + (3 * s)

ans =
   0   0   0   0   0
   0   1   0   0   0
   0   1   0   0   0
   0   0   0   0   0
   1   0   0   0   0

【讨论】:

  • 非常感谢您的详细解释!这真的很有帮助!实际上,我的数据大小为 10000 * 5,因为我无法满足问题中的所有值,我只给出了数据样本。 mean 和 sigma 是原始 10000 * 5 数据的值,很抱歉造成混淆。
  • 好的,那么你可以使用第一个代码sn -p来完成工作。
【解决方案2】:

整个数据的平均值是:data_mu=mean(mean(data)) 其中数据是所有值的矩阵。

标准差为:data_std=std(std(data))。

唯一的事情是你应该检查数据是在上下键之间。

您应该编写如下代码:

data_mu=mean(mean(data));
data_std=std(std(data));    
counter=0;
upper_bond=data_mu+data_std;
lower_bond=data_mu-data_std;
for i=1:size(data,1)
   for j=1:size(data,2)
      if data(i,j)>lower_bond && data(i,j)<upper_bond
         counter=counter+1;
         standard_data(counter)=data(i,j);
      end
   end
end

【讨论】:

    猜你喜欢
    • 2021-01-17
    • 2017-01-13
    • 2019-11-02
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多