我正在尝试使用scipy.stats.levy
对Levy walk进行建模。它工作得很好,除了有几步非常大的事实,我想知道是否有一个适当的方法来限制步长。
下面是我使用的代码:
import numpy as np
from scipy.stats import uniform
from scipy.stats import levy
import matplotlib.pyplot as plt
def levy_walk( n ):
# uniformly distributed angles
angle = uniform.rvs( size=(n,), loc=.0, scale=2.*np.pi )
# levy distributed step length
r = levy.rvs( size=n )
# x and y coordinates (position added to previous coordinate --> cum. sum)
x = np.cumsum( r * np.cos(angle) )
y = np.cumsum( r * np.sin(angle) )
return np.array( (x, y, r, angle) )
# number of steps to simulate
n = 500
# get levy walk (strictly speaking, it seems to be a flight)
foo = levy_walk( n )
# initialize figure
fig = plt.figure( figsize=(14,6) )
# plot 2D random walk with Levy stepsize
ax1 = fig.add_subplot( 1,2,1 )
ax1.plot( foo[0,:], foo[1,:] )
ax1.set_xlabel( 'x' )
ax1.set_ylabel( 'y' )
ax1.set_title( '2D Levy flight' )
# plot histogram
ax2 = fig.add_subplot( 1,2,2 )
num_bins = n/10
ax2.hist( foo[2,:], bins=n/10 )
ax2.set_yscale( 'log' )
ax2.set_xlabel( 'stepsize' )
ax2.set_title( 'histogram' )
plt.show()
这是一个示例输出图,您可以清楚地看到发生的非常少但非常大的步骤:
所以,我的问题是,什么是限制步长的正确方法?(使用scale
选项并没有真正的帮助,因为它只会缩小所有内容)
发布于 2018-06-24 00:28:50
这实际上是它应该做的事情。expected value of a Levy distribution is ∞,它是非常“厚尾”的。如果这就是你正在使用的发行版,那么你将会得到相当数量的巨大的值。如果你截断它们,它就不是Levy分布。因此,在使用Levy分布时,没有一种适当的方法来限制步长。如果你得到的结果与观测数据或直觉不匹配,你的替代方案是使用不同的步长分布。
发布于 2021-07-27 21:19:29
Levy飞行实际上是基于Levy分布函数。您可以调整函数的alpha和beta,以达到所需的模拟效果。此外,您可以尝试在scipy.stats中使用"levy_stable“,而不是"levy",后者可以设置参数,如alpha和beta。这样,旅行的长度就不会很长了。有关函数设置的更多信息,请参阅:https://en.wikipedia.org/wiki/L%C3%A9vy_flight。alpha=2,beta=0alpha=1,beta=0
https://stackoverflow.com/questions/51002508
复制相似问题