我的基本想法是创建一个链表,并且随着每个新值进来,添加新值的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