两种随机点生成方法的区别
Difference between two methods of random point generation
为了进行 monte carlo 模拟以估计 $n$ 维度中两个随机点之间的预期距离 space 我发现以下两种看起来相似的生成随机点的方法似乎有所不同。我不知道为什么。
方法一:
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
方法二:
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 中,列表理解泄漏了它们的循环变量。
由于您在列表推导 ([u.rvs() for i in range(n)]
) 中循环 i
,这就是 dist = (dist*i + euclidean_dist(x,y))/(i+1.0)
中使用的 i
。 (i
总是等于 n-1
而不是主循环变量的值。)
为了进行 monte carlo 模拟以估计 $n$ 维度中两个随机点之间的预期距离 space 我发现以下两种看起来相似的生成随机点的方法似乎有所不同。我不知道为什么。
方法一:
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
方法二:
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 中,列表理解泄漏了它们的循环变量。
由于您在列表推导 ([u.rvs() for i in range(n)]
) 中循环 i
,这就是 dist = (dist*i + euclidean_dist(x,y))/(i+1.0)
中使用的 i
。 (i
总是等于 n-1
而不是主循环变量的值。)