EDITED2:重新制定了精确的问题。 编辑:代码中的错字:
我想生成1000个10 INDEPENDANT Random VARIABLE(这里是高斯)的样本。
在数学观点上是否为2当量(10个随机变量之间的独立性)。
直接:10个随机变量的1000个样本。
import numpy as np
np.random.seed(123)
x= np.random.normal(0,1 (10, 1000))
使用循环:通过样本生成10个随机变量的矢量样本。
import numpy as np
np.random.seed(123)
for(i in range(0,1000)):
x[:,i]= np.random.normal(0,1,(10, 1))
原因是要进行并行取样...... 这两种方法是否产生了10个独立高斯随机变量的1000个样本? (我不确定样品是否独立)。
我调查了其他问题,没有迹象表明Mersenne Twister是如何在numpy中实施的。因此,问题是指如果连续2次调用random.normal产生独立的值(即random.normal的实现)。
(想象一下“手动”的情况,我在调用之间重置种子......这显然不是独立的......(没有兴趣去做)。
当然,我们可以检查A POSTERIORI,通过查看统计数据可能是真的....它不能证明它....
答案 0 :(得分:3)
是的,它们在统计上是等价的。只要您为相同的正态分布生成数字,它们将具有相同的统计特征。也就是说,平均值和标准偏差应该非常接近于它们的分布。例如,
import numpy as np
mu, sigma = 2.0, 0.5
# A and B will have different seeds and so different numbers
A = np.random.normal(mu, sigma, size=(1000, 1000))
B = np.random.normal(mu, sigma, size=(1000, 1000))
# But their statistical characteristics should be similar enough
print(mu, np.mean(A), np.mean(B))
print(sigma, np.std(A), np.std(B))
从同一种子开始生成的随机数将始终相同,假设我们当然使用相同的函数,我们在这种情况下执行。所以,这意味着你的两个数组将包含相同的元素,但不是以相同的顺序。我们可以用一个足够小的例子来观察它,以适应我们的屏幕。
size = (3, 5)
def method1():
np.random.seed(123)
return np.random.normal(0, 1, size)
def method2():
np.random.seed(123)
x = np.zeros(size, dtype=float)
for i in range(size[1]):
x[:,i] = np.random.normal(0, 1, size[0])
return x
输出
# method 1
array([[-1.0856306 , 0.99734545, 0.2829785 , -1.50629471, -0.57860025],
[ 1.65143654, -2.42667924, -0.42891263, 1.26593626, -0.8667404 ],
[-0.67888615, -0.09470897, 1.49138963, -0.638902 , -0.44398196]])
#method 2
array([[-1.0856306 , -1.50629471, -2.42667924, -0.8667404 , 1.49138963],
[ 0.99734545, -0.57860025, -0.42891263, -0.67888615, -0.638902 ],
[ 0.2829785 , 1.65143654, 1.26593626, -0.09470897, -0.44398196]])
两种方法都生成相同的3 * 5数字。但是,第一种方法将前5行放在第一行,接下来的5放在第二行,等等。而第二种方法将前3列放在第一列,第二列放在第二列中,等等。事实上,如果method2()
被重写为以下内容,它会以相同的方式(逐行)将数字设为method1()
。
# same result as `method1()`
def method3():
np.random.seed(123)
x = np.zeros(size, dtype=float)
for i in range(size[0]):
x[i,:] = np.random.normal(0, 1, size[1])
return x
不言而喻,如果每种方法生成相同数字但顺序不同,则两者之间每行/列的统计特征将不相同(因为它们具有不同的数字)。但是,如果每行/每列的样本足够大,即大小,它们应该遵循它们的分布统计特征。
修改:采样独立
从documentation看,我们numpy实现了Mersenne Twister算法(MT)。它创建了一个容器,所有其他发行版都使用该容器,例如normal()
,exponential()
等。
MT是一种广泛使用的PRNG,并已进行了广泛的研究。任何有价值的PRNG都会在一系列测试算法统计属性的测试中表现良好。阅读Diehard tests和TestU01。在这些页面上搜索关键词 normal 和 uniform (即独立)以阅读特定测试。
您还可以阅读this post关于真正随机数生成器的理论方法。
底线,我们使用的生成器,我们使用它们,因为它们被认为足够好用于我们想要做的事情。如果您担心MT无法解决您的问题,您可能希望选择(并可能实现)不同的东西。但是,如果不知道你想要做什么,就不可能提供更多可靠的建议。