4

所以说,我有一个 = [2 7 4 9 2 4 999]

我想从矩阵中删除 999 (这是一个明显的异常值)。

有没有一种通用的方法来删除这样的值?我有一组向量,但并非所有向量都有这样的极值。prctile(a,99.5) 将输出向量中的最大数字,无论它有多极端(或非极端)。

4

3 回答 3

11

有几种方法可以做到这一点,但首先你必须定义什么是“极端”?它是否超过某个阈值?超过一定数量的标准偏差?或者,如果你知道你有n这些极端事件并且它们的值更大比其他的,你可以使用sort和删除最后的n元素。等等......

例如a(a>threshold)=[],将处理类似定义的阈值,同时a(a>mean(a)+n*std(a))=[]处理丢弃n高于平均值的标准差的值a

一种完全不同的方法是使用 的中值a,如果向量像您提到的那样短,您希望查看中值,然后您可以阈值高于该值的某个因子的任何值a(a>n*median(a))=[]

最后,评估处理这些峰值的方法的一种方法是获取数据的直方图,然后从那里开始工作......

于 2013-03-12T23:31:36.097 回答
2

我能想到两个:

  • 对矩阵进行排序并从顶部和底部删除 n 个元素。
  • 计算平均值和标准差并丢弃所有超出的值: mean +/- (n * standard deviation)

在这两种情况下,n 都必须由用户选择。

于 2013-03-12T23:28:12.903 回答
1

过滤你的信号。

%choose the value
N = 10;
filtered = filter(ones(1,N)/N, 1, signal);

找到噪音

noise = signal - filtered;

去除嘈杂的元素

THRESH = 50;
signal = signal(abs(noise) < THRESH);

它比mean+-n*stddev方法更好,因为它会查找本地更改,因此不会在缓慢变化的信号(例如[1 2 3 ... 998 998].

于 2013-03-12T23:44:25.847 回答