校正運行平均值中的異常值
我們有一個從一些傳感器讀取數據的守護進程,它計算的內容(除了簡單地報告狀態)是傳感器從一個值變為另一個值所需的平均時間。它保持 64 個數據點的運行平均值,並假設運行時間相當恆定。
不幸的是,如下圖所示,輸入數據並不是最原始的:
(每條線代表一組不同的數據;x 軸除了模糊的歷史時間軸之外並沒有真正的意義)。
我處理這個問題的明顯解決方案是創建數據的直方圖,然後選擇模式。但是,我想知道是否有其他方法可以產生更好的性能或更適合運行平均值的操作。一些快速的 Wikipedia 搜索表明檢測異常值的算法也可能是合適的。簡單是加分項,因為守護程序是用 C 編寫的。
編輯:我搜索了維基百科並想出了這些不同的技術:
- Chauvenet 的標準:使用平均值和標準差,計算特定數據點發生的概率,然後如果概率實際上是壞的小於 50%,則將其排除。雖然這似乎非常適合動態校正運行平均值,但我不太相信它的功效:對於大型數據集,它似乎不想丟棄數據點。
- Grubbs 檢驗:另一種使用均值與標準差的差值的方法,當“沒有異常值”的假設被拒絕時有一些表達
- 庫克距離:衡量數據點對最小二乘回歸的影響;如果超過 1,我們的應用程序可能會拒絕它
- 截斷均值:丟棄低端和高端,然後取均值作為正常值
任何人都有任何具體經驗並且可以評論這些統計技術嗎?
另外,關於物理情況的一些評論:我們正在測量機械洗衣機完成之前的平均時間,因此它的運行時間應該是相當恆定的。我不確定它是否實際上具有正態分佈。
編輯 2:另一個有趣的問題:當守護程序正在引導時,例如,沒有任何以前的數據要分析,它應該如何處理傳入的數據?根本不做任何異常值修剪?
編輯3:還有一件事……如果硬件確實發生了變化使得運行時確實變得不同,是否值得讓算法足夠健壯以至於它不會丟棄這些新的運行時,我應該只記得刷新發生這種情況時的緩存?
如果您擁有的示例圖是典型的,那麼您列出的任何標準都將起作用。這些統計方法中的大多數都是為了在“這真的是一個錯誤嗎?”的模糊級別上找到錯誤的邊緣。但是您的問題看起來非常簡單..您的錯誤不僅僅是與標準的幾個標準偏差,它們是 20+。這對你來說是個好消息。
所以,使用最簡單的啟發式。始終接受前 5 個點左右,以防止啟動峰值破壞您的計算。保持平均值和標準差。如果您的數據點超出標準 5 個標準差,則丟棄它並重複之前的數據點作為填充物。
如果您事先知道您的典型數據行為,您甚至可能不需要計算平均值和標準差,您可以硬連線絕對“拒絕”限制。這實際上更好,因為初始錯誤不會炸毀您的檢測器。