如何在Python中生成正态分布的Sobol序列数组?

问题描述 投票:0回答:1

我想使用 Sobol 序列来生成正态分布序列。特别是,我想生成以下随机数的“等价”:

Z = np.random.normal(0.0, 1.0, [5, 10, 4])

我正在考虑使用 Scipy.Stats.Qmc ,其中有 MultiVariateNormalQMC 函数,但我对如何构造输入以获得形状 = (5,10,4) 的数组感到有点困惑。我在网上找不到任何示例。有什么想法吗?

python scipy
1个回答
0
投票

简短的答案是您可以进行逆变换采样:将

np.random.normal(0.0, 1.0, [5, 10, 4])
的输出传递给正态分布的逆 CDF (
stats.normal.ppf
)。

但是,您必须小心,有两个原因:

  1. Sobol' 序列的长度需要等于 2 的幂才能保留其属性。
  2. 您需要指定不同轴之间的关系。例如,这是一批 (5 x 10) 长度为 4 的独立加扰 Sobol 序列吗?

假设最后一个问题的答案是肯定的,那么一些代码是:

import math
import numpy as np
from scipy import stats

batch_shape = (5, 10)
sequence_length = 4

sequences = []
for i in range(math.prod(batch_shape)):
    qrng = stats.qmc.Sobol(1, seed=i)
    uniform_sequence = qrng.random(sequence_length)
    normal_sequence = stats.norm.ppf(uniform_sequence)
    sequences.append(normal_sequence.ravel())

sequences = np.stack(sequences)
sequences = sequences.reshape(batch_shape + (sequence_length,))
© www.soinside.com 2019 - 2024. All rights reserved.