2016-08-20 42 views
1

我不確定這是否是正確的術語,但我認爲我想要近似一個數據集s̶m̶o̶o̶t̶h̶̶a̶n̶d̶/̶o̶r̶。我有30個數據點,如下圖所示(帶點的紅線) 我想近似數據集,因此可以使用較少的數據點來描述它。黑色線代表我想達到的目標。 chart1如何近似時間序列數據

我希望能夠定義一個近似等級來控制結果數據集與原始數據集有多少不同。 近似的數據集應包含一組數據點,我可以使用直線將它們連接在一起。

什麼是正確的算法或數學函數來解決這個問題?我不希望在這裏實施,而是建議從哪裏開始。

我寫了我的實現近似算法。它適用於大多數情況,但在某些情況下,它會返回非最佳數據。 下面的例子顯示了三條虛線。細紅線是原始數據集,我的算法會生成厚厚的紅黑色虛線,綠線就是我想要實現的。

my implementation

 var previousValue; 
     return array.map(function (dataPoint, index, fullArray) { 
      var approximation = dataPoint; 

      if (index > 0) { 
       if (Math.abs(previousValue - value) < tolerance) { 
        approximation = previousValue; 
       } else { 
        previousValue = dataPoint; 
       } 

      } else { 
       previousValue = dataPoint; 
      } 

      return approximation; 
     }); 
+0

你嘗試過什麼嗎?我懷疑是否有適合黑線的標準算法,因爲您的x軸點間距不均勻。考慮使用「移動平均值」來平滑數據,然後選取每個n點來減少點數。 – bhspencer

+0

爲了簡化,我們假設x軸上的點與紅點對齊,但是它們的數量較少。 我寫了自己的算法來做基本上從左到右的近似,並且忽略了在一定公差水平內的所有點。如果某個值超出公差等級,則會創建一個新數據點並將其設置爲新的比較基準。算法行得通,但有些情況並不完美。這就是爲什麼我問是否有任何通用的解決方案,所以我不必重新發明輪子。我已經添加了上述算法的示例輸出。 – maestr0

回答

1

有兩個選項:

  1. 如果顯示「故障」中的數據是顯著的,這意味着你不能撫平。
  2. 如果顯示的所有數據可以近似和「故障」是微不足道的

在(1)的情況下,可以考慮通過模板近似(如小波)或使用基本的差異分析,以檢測並保持「毛刺「(例如網格)。 在(2)的情況下,您可以使用MA,ARIMA來擬合,其中可以通過根進一步分析「毛刺」

1

好的,澄清的要點是,您希望平滑數據還是近似它?如果您要平滑數據,按照定義,它將擺脫數據系列中的小顛簸和淹沒。另一方面,如果目標是準確描繪所有這些凹陷和顛簸,那麼你不需要平滑。我要談談平滑,你告訴我,如果你想要另一個。

好的,我知道平滑數據的最好方法是使用alpha值。方程式爲:T n + 1 =(1- α)T n + α數據 n + 1。這意味着您可以設置下一個功能點的哪一部分受到您的系列歷史記錄以及受當前數據點影響的部分。

Example graph with alpha = .5 看看這些數據。這裏的α = .5。所以函數符合數據,但不是很多。下面的一個是一樣的,但阿爾法是.25。所以數據更少,但功能更平滑。還有第三種選擇,其中α隨着時間的推移而減少。起初它可能非常高,所以你很快跟蹤數據,但隨着α隨着時間的推移而減少,趨勢變得更加平滑並且隨着時間的推移保持平穩。最後,您可以對最小值設置硬限制α這將確保您始終對數據具有一些最小響應。

Example graph with alpha = .25

+0

好的,謝謝你的解釋。這有助於我理解我真正需要的是一種近似。本質上,我想減少數據點的數量,並儘可能接近圖形的原始形狀。我的第一張圖表顯示了紅色數據集近似爲黑線。我只需要5分來描述那條線(包括起點和終點) – maestr0