我想使用 Sobol 序列来生成正态分布序列。特别是,我想生成以下随机数的“等价”:
Z = np.random.normal(0.0, 1.0, [5, 10, 4])
我正在考虑使用 Scipy.Stats.Qmc ,其中有 MultiVariateNormalQMC 函数,但我对如何构造输入以获得形状 = (5,10,4) 的数组感到有点困惑。我在网上找不到任何示例。有什么想法吗?
简短的答案是您可以进行逆变换采样:将
np.random.normal(0.0, 1.0, [5, 10, 4])
的输出传递给正态分布的逆 CDF (stats.normal.ppf
)。
但是,您必须小心,有两个原因:
假设最后一个问题的答案是肯定的,那么一些代码是:
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,))