所以说,我有一个 = [2 7 4 9 2 4 999]
我想从矩阵中删除 999 (这是一个明显的异常值)。
有没有一种通用的方法来删除这样的值?我有一组向量,但并非所有向量都有这样的极值。prctile(a,99.5) 将输出向量中的最大数字,无论它有多极端(或非极端)。
所以说,我有一个 = [2 7 4 9 2 4 999]
我想从矩阵中删除 999 (这是一个明显的异常值)。
有没有一种通用的方法来删除这样的值?我有一组向量,但并非所有向量都有这样的极值。prctile(a,99.5) 将输出向量中的最大数字,无论它有多极端(或非极端)。
有几种方法可以做到这一点,但首先你必须定义什么是“极端”?它是否超过某个阈值?超过一定数量的标准偏差?或者,如果你知道你有n
这些极端事件并且它们的值更大比其他的,你可以使用sort
和删除最后的n
元素。等等......
例如a(a>threshold)=[]
,将处理类似定义的阈值,同时a(a>mean(a)+n*std(a))=[]
处理丢弃n
高于平均值的标准差的值a
。
一种完全不同的方法是使用 的中值a
,如果向量像您提到的那样短,您希望查看中值,然后您可以阈值高于该值的某个因子的任何值a(a>n*median(a))=[]
。
最后,评估处理这些峰值的方法的一种方法是获取数据的直方图,然后从那里开始工作......
我能想到两个:
mean +/- (n * standard deviation)
在这两种情况下,n 都必须由用户选择。
过滤你的信号。
%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]
.