Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更改列表最后1000个值的最小值和最大值_Python_Algorithm_Max_Min_Epsilon - Fatal编程技术网

Python 更改列表最后1000个值的最小值和最大值

Python 更改列表最后1000个值的最小值和最大值,python,algorithm,max,min,epsilon,Python,Algorithm,Max,Min,Epsilon,我正在创建一个迭代算法(蒙特卡罗方法)。 该算法在每次迭代时返回一个值,创建一个值流 我需要分析这些值,并在返回的值中包含一些epsilon时停止算法 我决定用它来计算最后一个1000值的max和min值,然后用这个公式(max-min)/min计算错误,并将其与epsilon进行比较:错误,如果你愿意/愿意改变你对错误的定义,您可能需要考虑使用方差>代码>代替(max min)/min >p> 你可以。 如果使用此方法,则不会从流中删除任何值——方差将取决于所有值。那又怎样?有了足够的值,前

我正在创建一个迭代算法(蒙特卡罗方法)。 该算法在每次迭代时返回一个值,创建一个值流

我需要分析这些值,并在返回的值中包含一些
epsilon
时停止算法


我决定用它来计算最后一个
1000
值的
max
min
值,然后用这个公式
(max-min)/min
计算
错误
,并将其与
epsilon
进行比较:
错误,如果你愿意/愿意改变你对
错误的定义,您可能需要考虑使用<代码>方差>代码>代替<代码>(max min)/min  >p>
你可以。
如果使用此方法,则不会从流中删除任何值——方差将取决于所有值。那又怎样?有了足够的值,前几个值对方差影响不大,当足够的值聚集在某个固定值周围时,平均值的方差,
variance/n
,将变得很小


因此,当
方差/n
时,您可以选择暂停。我恐怕现在无法提供一个很好的Python答案,但我将为您提供需要使用的数据结构的概要:


将1000个项目保持在FIFO队列中。保留指向队列中最大和最小项目的指针。如果其中一个离开队列,请在队列中搜索新的最大/最小值(摊余成本取决于您的数据)。如果新的最大/最小值进入队列,只需更新指针(O(1))。假设您的数据正在收敛,这应该可以很好地工作。

创建一个具有minvalue和maxvalue属性的deque子类。添加或删除条目时,请将其与当前最小值和最大值进行比较-如果要删除的值是当前最小值或最大值,则只需重新扫描最小值/最大值的数据。添加时,只需将新值与当前最小值和最大值进行比较,并进行相应更新。这将优化您的数据的最小/最大值扫描。

numpy如何

只是比较一下速度:

import numpy as np
a = range(1000)
b = np.arange(1000)

max(a) # 29.7us
b.max() # 7.29us
您可以无限次地写入此数组:

i = 0
b = np.empty([1000]) + np.nan

your loop:
    b[i % 1000] = value
    i += 1
超过1000次迭代的值将被覆盖。您可以通过
np.nanmin(b)
np.nanmax(b)
获得最小值/最大值


nan
背后的思想是用1000个nan初始化这个数组,然后一个接一个地覆盖它们。<代码>南敏和 NMAX方法忽略了这些Na的

< P>作为Unutu的优秀思想的细化,可以考虑使用指数加权移动方差。它可以在每次观察的
O(1)
时间中计算,需要
O(1)
空间,并且具有随着观察时间的延长自动减少观察权重的优点

以下文件有相关公式:。见其中的方程式(140)-(143)

最后,您可能希望使用标准偏差而不是方差。它只是方差的平方根,具有与原始数据具有相同单位的优点。这将使制定有意义的停止标准变得更容易。

您可以使用两个。在O(1)中添加值,在O(log(n))中删除值。在您的问题中,您已经建议使用heapq模块。我不确定它提供了什么类型的堆,但是一个正常的堆也可以非常顺利地工作


保留两个堆可以解决只能从一个堆中提取最小值而不能提取最大值的问题。由于我不知道heapq模块,您可以为其提供自己的比较函数,或者您可以使用
-value
而不是
value
作为第二个堆的键。

@fredley数据应该是单调的。但这项研究依赖于随机抽样,因此可能会有一些波动。所以我不能完全确定它是单调的“指针”?那是什么?也许可以将索引用于deque,但是每次从前面删除一个项目时,您必须记住减小索引。然后,当其中一个索引变为-1时,意味着是时候重新计算了。另外,在构建初始1000个值时,必须使用特殊的大小写逻辑。@PaulMcGuire抱歉,我使用的是通用数据结构语言而不是python语言,我相信有一种很好的方法可以让它工作(
导入指针
?)嗯。谢谢!假设数据正在收敛,
max
值将在每次迭代中从最后的
1000
值中取出,因此在每次迭代中都会重新扫描。@ovgolovin因此,每1000次迭代一次,就会产生O(n)运算,其中n=1000。摊销=>O(1)摊销成本!如果数据正在收敛,则在每次迭代中,
max
min
值(取决于变量的增加或减少)将从最后的
1000
值中取出。因此,我们需要重新扫描整个
1000
值以更新
max
min
。所以每次迭代都是O(n),也可以很容易地从运行方差中删除掉最后1000个值,方法与包含新值的方法相同,只是符号相反。当然,这仍然需要保留最后1000个值的deque。我喜欢这个答案!不再计算
min
max
我们不需要重新扫描最后的
1000
值。我们甚至可以计算最后
1000
值的方差(感谢@SvenMarnach的想法)。我想我会实现这个算法。但是我想我会去掉
1000
的值,然后计算所有值的方差(因为
1000
是had的最顶端,它可能是
100
10000
。我不知道我应该选择什么数字)。@ovgolovin:小心t