为了进行蒙特卡罗模拟以估计$ n $维空间中两个随机点之间的预期距离,我发现以下两个相似的生成随机点的方法似乎有所不同。我无法弄明白为什么。
方法1:
def expec_distance1(n, N = 10000):
u = uniform(0,1)
dist = 0
for i in range(N):
x = np.array([u.rvs() for i in range(n)])
y = np.array([u.rvs() for i in range(n)])
dist = (dist*i + euclidean_dist(x,y))/(i+1.0)
return dist
方法2:
def expec_distance2(n, N = 10000):
u = uniform(0,1)
dist = 0
for i in range(N):
x = u.rvs(n)
y = u.rvs(n)
dist = (dist*i + euclidean_dist(x,y))/(i+1.0)
return dist
统一分布为scipy.stats.uniform
,np
代表numpy。
对于两种方法的100次运行(对于n = 2),使用方法1,我得到$ \ mu = 0.53810011995126483,\ sigma = 0.13064091613389378 $ 方法2,$ \ mu = 0.52155615672453093,\ sigma = 0.0023768774304696902 $
为什么两种方法的std dev之间存在如此大的差异?
以下是要尝试的代码: https://gist.github.com/swairshah/227f056e6acee07db6778c3ae746685b (我用numpy替换了scipy,导致它更快,但它在std dev之间有相同的差异)
答案 0 :(得分:2)
在Python 2中,列表推导泄漏了它们的循环变量。
由于您在列表推导(i
)中循环[u.rvs() for i in range(n)]
,因此i
中使用的是dist = (dist*i + euclidean_dist(x,y))/(i+1.0)
。 (i
总是等于n-1
而不是主循环变量的值。)