2013-03-12 158 views
4

所以說,我有一個= [2 7 4 9 2 4 999]在Matlab中刪除矢量中的極值?

而且我想從矩陣中刪除999(這是一個明顯的異常值)。

有沒有一般方法來刪除這樣的值?我有一組向量,並不是所有的都有這樣的極端值。無論它有多麼極端(或非極端),prctile(a,99.5)都將輸出矢量中的最大數。

+1

刪除異常值只需在它們的位置索引中分配一個空矩陣('[]')即可完成。然而,識別異常值是一個完全不同的問題,這實際上取決於你希望你的策略有多寬容。但在這種情況下,這個問題將屬於[math.stackexchange.com](http:// http://math.stackexchange.com),而不是SO。順便說一句,如果將以前的幾個答案標記爲已接受,那麼表明你在乎? – 2013-03-12 23:27:47

+0

[1 2 3 4 ... 998 999]是否具有極端價值? – 2013-03-12 23:30:33

回答

10

有幾種方式做到這一點,但首先你必須定義什麼是「極端「?它上面的一些門檻?上面有些多個標準差的? 或者,如果你知道你有這些極端事件的確切n並且它們的值比其他的大,你可以使用sort和刪除最後n元素。等...

例如a(a>threshold)=[]將採取類似的定義閾值的照顧,而a(a>mean(a)+n*std(a))=[]將丟棄值的護理即n標準差高於平均值a

一個完全不同的方法是使用a的中位數,如果向量與您提到的一樣短,您需要查看中值,然後您可以將任何高於某個因子的值設爲閾值a(a>n*median(a))=[]

末,一種評估治療這些尖峯會採取數據的直方圖,並從那裏工作的做法...

+0

第二種情況與第一種情況有什麼不同(只需將閾值設置爲「mean(a)+ n * std(a))」?順便說一句,我會用'abs(a)> threshold'來解釋大的負值。 – 2013-03-12 23:44:58

+0

取一個向量的平均值,其中你有一個元素在10^9,其餘的在O(1)是一個有偏的度量,特別是如果向量很短。例如,在例子中的向量'a'中,平均值是147,標準值是375.因此,你需要去3 sigma來過濾掉999(我來自哪裏,這是一個很小的數字)。在嘗試處理這些「宇宙尖峯」時,中位數通常是更好的快速候選人,但當然最好的方法是對數據進行直方圖分析,以便了解如何處理數據。 – bla 2013-03-12 23:46:20

+0

是的,當然,如果閾值是「a」的函數,那麼它是有偏見的。我的意思是,從實施的角度來看,第一種情況和第二種情況是相同的。 – 2013-03-12 23:48:03

2

我能想到兩個:

  • 排序的矩陣並從頂部和底部正元素。
  • 計算的平均值和標準偏差,並丟棄落在以外的所有值: mean +/- (n * standard deviation)

在兩種情況下n必須由用戶來選擇。

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]

+1

我相信這確實是最穩健的方法。如果我的信號不是平穩的,因此有很大的數值範圍,異常值不僅被定義爲異常值,而且被定義在信號的歷史記錄中。 – POliveira 2015-04-22 21:16:26