【问题标题】:A way to effectively remove outliers from a big array in matlab一种从matlab中的大数组中有效去除异常值的方法
【发布时间】:2015-07-14 13:53:33
【问题描述】:

因此,在我正在开发的软件中,有时,我拥有大约 250 个元素的大数组。我取这些元素的平均值以获得一个平均值。问题是我在这个大数组的开头和结尾都有异常值。因此,例如数组可以是:

A = [150 200 250 300 1100 1106 1130 1132 1120 1125 1122 1121 1115 2100 2500 2400 2300]

所以在这种情况下,我想从数组中删除 150 200 250 300 2100 2500 2400 2300...

我知道我可以将这些索引设置为零,但是,我需要一种方法来自动对软件进行编程以删除这些异常值,无论在开始或结束时有多少。

任何人都可以提出一种消除这些异常值的可靠方法吗?

【问题讨论】:

  • 问题是定义什么是异常值

标签: arrays matlab sorting


【解决方案1】:

你可以这样做:

A(A>(mean(A)-std(A)) & A<(mean(A)+std(A)))
> ans = 1100 1106 1130 1132 1120 1125 1122 1121 1115

【讨论】:

  • 谢谢...实际上我确实尝试过这种方法,但不幸的是在某些情况下,并不是所有的异常值都被删除了。
  • 您需要回答的正确问题是:什么是异常值?这取决于您的数据
【解决方案2】:

通常,稳健的估计器更适合处理异常值 (https://en.wikipedia.org/wiki/Robust_statistics)。如果异常值非常大,估计的均值和标准差会发生很大变化。我更喜欢使用中位数和中位数绝对偏差(https://en.wikipedia.org/wiki/Median_absolute_deviation)。

med = median(A) mad = median(abs(med-A)) out = (A <med - 3*mad) | (A > med + 3*mad) A[out] = []

这在很大程度上取决于您的数据代表什么以及分布的外观(hist(A))。例如,如果您的数据偏向较大的值,您可以删除前 0.95 个值或类似的值。有时进行转换以使分布类似于正态分布效果更好。例如,如果分布向右倾斜,请使用对数变换。

【讨论】:

    【解决方案3】:

    在这种情况下,我使用推荐方法。我可以拿起例如来自数组中间的 15 个元素,计算平均值/中位数,然后将其与 std 或 diff(A(end-1:end)) 进行比较。实际上尝试使用中位数而不是平均值。

    【讨论】:

      猜你喜欢
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-18
      • 2011-03-12
      • 2021-05-03
      • 2021-05-03
      • 1970-01-01
      相关资源
      最近更新 更多