为了进行蒙特卡罗模拟来估计 $n$ 维空间中两个随机点之间的预期距离,我发现以下两种看起来相似的生成随机点的方法似乎有所不同。我无法弄清楚为什么。
方法一:
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 之间有相同的差异)
最佳答案
在 Python 2 中,列表推导式会泄漏其循环变量。
由于您在列表推导式中循环 i
([u.rvs() for i in range(n)]
),所以这就是 i
用于 dist = (dist*i + euclidean_dist(x,y))/(i+1.0)
。 (i
始终等于 n-1
,而不是主循环变量的值。)
关于python - 两种随机点生成方法的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38310737/