numpy随机使用有效性

时间:2016-01-08 09:09:24

标签: python numpy random

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,通过查看统计数据可能是真的....它不能证明它....

1 个答案:

答案 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 testsTestU01。在这些页面上搜索关键词 normal uniform (即独立)以阅读特定测试。

您还可以阅读this post关于真正随机数生成器的理论方法。

底线,我们使用的生成器,我们使用它们,因为它们被认为足够好用于我们想要做的事情。如果您担心MT无法解决您的问题,您可能希望选择(并可能实现)不同的东西。但是,如果不知道你想要做什么,就不可能提供更多可靠的建议。