我的基本想法是創建一個鏈表,並且隨着每個新值進來,添加新值的1/N並減去第一個值的1/N,然後將指針先移動一個,然後釋放與第一個關聯的內存。如何創建時間序列中最後N個項目的運行平均值?
這不會最終在Python中實現,但只是爲了讓我的頭腦清楚這個過程,我試圖用Python編寫它,但是我的實現是有缺陷的。我需要一個雙向鏈表嗎?是否有替代方法(不是基於鏈表)更好?
這裏是我的嘗試至今:
class Link:
def __init__(self,val):
self.next = None
self.value = val
class LinkedList:
def __init__(self,maxlength):
self.current_link = None
self.maxlength = maxlength
self.sum = 0.
self.average = None
self.length = 0
self._first_link = None
def add_link(self,val):
new_link = Link(val)
new_link.next = self.current_link
self.current_link = new_link
if self._first_link is None:
self._first_link = self.current_link
self.sum += val
if self.length < self.maxlength:
self.length += 1
else:
self.sum -= self._first_link.value
self._first_link = self._first_link.next # this line is flawed
self.average = self.sum/self.length
def get_first(self):
return self._first_link.value
# Main
ll = LinkedList(5)
for ii in xrange(10):
ll.add_link(ii)
print ii,ll.get_first(),ll.average
的問題是,_first_link被設置爲不明確下一個值。也就是說,_first_link被設置爲添加的第一個項目,但其下一個是None,所以我不知道如何按照我的意願將它移動1。這是什麼讓我想知道是否需要一個雙向鏈表。
我會很感激任何建議。
什麼你試圖解決的實際問題?我經常發現使用這種指數移動平均值可以很好地工作,並且易於以簡單和高效的方式實現:http://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average – NPE 2014-10-05 16:04:40
此外,如果您的值可以因爲在浮點數學中,((A + B)-A)-B'不一定爲零,所以你的方法可能容易受到數值問題的影響。 – NPE 2014-10-05 16:06:40
是的,我同意補償總和或其他可能有助於數值的準確性,但我並不擔心(動態範圍不是很大)。 我試圖解決的問題很簡單,我想要計算一個時間序列中最後1000個數字的平均值,這個時間序列中將有數千億的值,所以我不想存儲數組中的所有值。它比指數移動平均線更簡單 - 它只是我想要的平滑移動平均線。 – dslack 2014-10-05 16:12:59