【问题标题】:Why am I getting different bootstrap results using different algorithms?为什么我使用不同的算法得到不同的引导结果?
【发布时间】:2021-06-15 23:18:21
【问题描述】:

我正在使用两种不同的方法来尝试生成引导样本

np.random.seed(335)
y=np.random.normal(0,1,5)
b=np.empty(len(y)) #initializes an empty vector
for j in range(len(y)):
    a = np.random.randint(1,len(y)) #Draws a random integer from 1 to n, where n is our sample size
    b[j] = y[a-1] #indicies in python start at zero, the worst part of Python in my opinion
c = np.random.choice(y, size=5)
print(b)
print(c)

对于我的输出,我得到不同的结果

[1.04749432 1.71963433 1.71963433 1.71963433 1.71963433]
[-0.25224454 -0.25224454  0.46604474  1.71963433  0.46604474]

我认为答案与随机数生成器有关,但我对确切原因感到困惑。

【问题讨论】:

    标签: python numpy random statistics seed


    【解决方案1】:

    这归结为使用不同的算法进行随机选择。有许多等效的方法可以使用伪随机生成器随机选择项目并替换(或从任何其他分布生成随机值)。特别是numpy.random.choice的算法理论上不需要使用numpy.random.randint。重要的是这些等效方式应该产生相同的随机值分布。以 NumPy 为例,请看NumPy's source code。

    另一个不太重要的不同结果的原因是两个不同的选择过程(randint 和 choice)本身会产生伪随机数,它们可能彼此不同,因为选择过程不是以相同的开头种子(更准确地说,相同的伪随机数序列)。如果我们在开始每个过程之前将种子设置为相同的值:

    np.random.seed(335)
    y=np.random.normal(0,1,5)
    b=np.empty(len(y))
    np.random.seed(999999)  # Seed selection procedure 1
    for j in range(len(y)):
        a = np.random.randint(1,len(y))
        b[j] = y[a-1]
    np.random.seed(999999)  # Seed selection procedure 2
    c = np.random.choice(y, size=5)
    print(b)
    print(c)
    

    然后每个过程将以相同的伪随机数开始。但即便如此,这两个过程可能使用不同的算法进行随机选择,这些差异仍然可能导致不同的结果。

    (但是,numpy.random.* 函数,例如 randint 和 choice,已成为 NumPy 1.17 的遗留函数,出于向后兼容性的原因,它们的算法预计将保持原样。那个版本没有但是,弃用任何numpy.random.* 函数,因此它们暂时仍然可用。另请参阅this question。在较新的应用程序中,您应该使用1.17 版中引入的新系统,包括numpy.random.Generator,如果您有的话版本或更高版本。新系统的一个优点是应用程序对全局状态的依赖较少。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-06
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多