gpt4 book ai didi

python - 随机游走 - 并行处理

转载 作者:太空狗 更新时间:2023-10-30 01:34:07 26 4
gpt4 key购买 nike

我目前正在实现蒙特卡洛方法来求解扩散方程。该解可以表示为 phi(W) 的数学期望值,其中 phi 是一个函数(根据扩散方程而变化),W 是停止在域边界的对称随机游走。要在点 x 处评估函数,我需要从 x 的期望值开始每次行走。

我想在大量点上评估函数。所以这就是我所做的:

  1. 我从每个点同时开始步行
  2. 我对每个点都使用相同的步骤
  3. 一旦走到边界,我就停下来
  4. 我重复这些操作 N 次,以便通过 N 次模拟的频率来近似数学期望。

我的代码(Python)是这样的:

for k in range(N): #For each "walk"
step = 0
while not(every walk has reach the boundary):
map(update_walk,points) #update the walk starting from each x in points
incr(step)

问题是:它非常长,因为 N 可以很大而且点数也很大。我正在寻找任何可以帮助我优化此代码的解决方案。

我曾想过用 IPython 进行并行处理(每次行走都是独立的),但我没有成功,因为它在函数内部(它返回了一个错误,如

"could not launch function 'f' because it was not found as 'file.f' " but 'f' is define within file.big_f)

最佳答案

这是我可能不会使用并行计算的少数情况之一。我认为只使用 numpy 会更快。

>>> import numpy as np
>>> def walk(x, n=100, box=.5, delta=.2):
... np.random.seed()
... w = np.cumsum(x + np.random.uniform(-delta,delta,n))
... w = np.where(abs(w) > box)[0]
... return w[0] if len(w) else n
...
>>> pwalk = np.vectorize(walk)
>>> pwalk(np.zeros(10))
array([10, 25, 4, 5, 100, 6, 28, 6, 25, 23])

我想你应该知道如何从那里获得期望值。

您也可以将一个元组传递给 np.random.uniform 的最后一个参数,然后就不需要使用 np.vectorize

当然,如果你想使用并行计算,那么你可以选择一个好的map函数,然后从map中调用walk而不是像上面那样使用 vectorize

>>> from pathos.multiprocessing import ProcessingPool as Pool
>>> p = Pool(4)
>>> p.map(walk, [0]*10)
[8, 7, 39, 7, 36, 7, 22, 27, 18, 31]

使用 pathos,因此可以从解释器轻松调用 map 。 https://github.com/uqfoundation/pathos

关于python - 随机游走 - 并行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24291319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com