【问题标题】:numpy random usage validitynumpy 随机使用有效性
【发布时间】:2016-01-10 01:52:20
【问题描述】:

EDITED2:重新制定了精确的问题。 编辑:代码中的错字:

我想生成 10 个独立随机变量(此处为高斯)的 1000 个样本。

从数学的角度来看,这 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 中实现的。因此,问题是指 random.normal 的 2 次连续调用是否产生独立值(即 random.normal 的实现)。

(想象一下“手动”的情况,我在调用之间重置了种子......这显然不是独立的......(没有兴趣这样做)。

当然,我们可以检查A POSTERIORI,看统计数据可能是真的……它不能证明它……

【问题讨论】:

标签: python numpy random


【解决方案1】:

是的,它们在统计上是等效的。只要您为相同的正态分布生成数字,它们就会具有相同的统计特征。也就是说,均值和标准差应该非常接近它们所来自的分布。例如,

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 个放在第一列,接下来的 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。在这些页面上搜索关键字 normaluniform(即独立)以了解特定测试。

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

归根结底,我们使用的生成器,我们之所以使用它们是因为它们被认为足够好可以满足我们的需求。如果您担心 MT 无法解决您的问题,您可能想要选择(并且可能实施)不同的东西。但是,如果不知道您要做什么,就不可能给出更可靠的建议。

【讨论】:

  • 谢谢,我在代码中打错了...我用正确的更正了
  • @quantCode 我已修改我的答案以匹配您更新的问题。
  • 谢谢。但;随机数是否相互独立? (我将在帖子中重新提出我的问题)
  • @quantCode 自己想一想:一个实现的发生会影响另一个实现的发生吗?
  • @quantCode 任何广泛使用的 PRNG 都要经过大量的统计测试 (for example) 以确保它表现出尽可能多的随机属性。这包括抽样的独立性。您可以阅读更多关于 MT 算法的信息here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 2019-01-24
  • 2021-08-05
  • 1970-01-01
  • 2020-10-27
  • 2018-12-27
  • 2021-10-24
相关资源
最近更新 更多