一种在matlab中有效删除大数组异常值的方法

时间:2015-07-14 13:53:34

标签: arrays matlab sorting

所以在我正在开发的软件中,在某些时候,我有大约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 ...

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

有人能建议一种强有力的方法来消除这些异常值吗?

3 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

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

答案 1 :(得分:1)

通常,强大的估算器可以更好地处理异常值(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或类似值。有时进行转换以使分布类似于正态分布更好地工作。例如,如果分布偏向右侧,则使用对数变换。

答案 2 :(得分:-1)

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