【问题标题】:Statistical outlier detection in MATLABMATLAB 中的统计异常值检测
【发布时间】:2014-10-06 12:25:24
【问题描述】:

假设我们有这个矩阵:

main = [10000   5   3   1;
5   5677    0   134;
1   1   456 3];

这种方法是计量经济学和统计问题中使用最广泛的方法。X 是我们在其中寻找异常值的数据。

X-mean(X)>= n*std(X)

因此,如果这个不等式为真,则该样本为异常值,否则我们将保留该样本。

现在我的问题。我想用这些代码找出异常值:

meann = mean(main);
stdd = std(main);
out = find(main-repmat(meann,size(main,1),1)>=repmat(2*stdd,size(main,1),1));

我们正在每一列中搜索异常值。 Out 应该是异常值的索引。在最后一步中,我们应该删除每列中的异常值。有没有更简单的函数或方法可以在 MAtLAB 中做到这一点?

谢谢。

【问题讨论】:

  • 该矩阵或每列的全局异常值?
  • 我编辑了我的问题。
  • 我认为你应该解释你的逻辑,因为我觉得你的代码没有正确实现你所追求的。您是说要找到与平均值(每列)相差 2 个标准差的任何数字吗?
  • 是的。确实如此。我正在每一列中寻找异常值。我知道这段代码不完整。这只是一个想法。谢谢。
  • 谢谢。我在我的问题中添加了更多信息。

标签: matlab std mean outliers


【解决方案1】:

如果您想从不同的列中删除某些元素,请使用元胞数组。

main = rand(100,4);
main(10,1) = 10000;
main(40,2) = 4321;
main([10,20,30],3)=[938;10;4];


mu = num2cell(mean(main));
sig = num2cell(std(main));

m = num2cell(main,1);
ind = cellfun(@(x,m,s) find( bsxfun(@lt, abs( bsxfun(@minus,x,m) ), 2*s) ),...
    m, mu, sig, 'uni', 0);
data = cellfun(@(x,m,s) x( bsxfun(@lt, abs( bsxfun(@minus,x,m) ), 2*s) ),...
    m, mu, sig, 'uni', 0);

ps。您的示例尺寸太小,因此可能没有足够的样本来建立阈值。

【讨论】:

    【解决方案2】:

    如果您想在每列的基础上找到与平均值相差 2 个标准差,我会使用 bsxfun 而不是 repmat,如下所示:

    meann = mean(main)
    stdd = std(main)
    
    I = bsxfun(@gt, abs(bsxfun(@minus, main, meann)), 2*stdd)
    

    我会在I 停下来,因为这将允许您删除异常值。不过你可以打电话给find你喜欢的:

    out = find(I)
    

    虽然对我来说这样做更直观:

    I = bsxfun(@lt, meann + 2*stdd, main) | bsxfun(@gt, meann - 2*stdd, main)
    

    我认为您的repmat 解决方案缺少abs 顺便说一句

    【讨论】:

      【解决方案3】:

      2*sigma 标准当然很简单,但均值和标准差对异常值非常敏感。由此可见,out 变量将因此受到影响,实际上您的代码在给定矩阵中没有发现任何异常值。

      要检测异常值,您只需将矩阵中出现的值与中位数进行比较,或采用更精细的标准。 https://www.mne.psu.edu/me345/Lectures/outliers.pdf

      有一篇精彩的讲座对此进行了解释

      【讨论】:

      • 不是真的,但使用X-mean(X)> 2(or 3,...)*std 是计量经济学和统计问题中使用最广泛的方法。
      • 讲座建议使用|X-mean| > 1.9x * std,大约是2。
      • @user2991243 你在那里失踪了,而且绝对在那里,即 Yvon 评论中的 |·|。这很重要!
      • 是的。确实如此。感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 2017-03-10
      • 2021-05-25
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      • 2018-12-06
      • 2019-03-09
      • 2011-05-22
      相关资源
      最近更新 更多