scipy中重复绘制Sobol序列的问题

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

如何通过重复调用 random 或 random_base2 来获得独特的 Sobol 序列?

我试图重复生成“随机”Sobol 序列,但每次都得到相同的序列。我对文档的阅读表明,重复调用会给我一个不同的序列(“要继续现有的设计,可以通过再次调用 random_base2 来获得额外的分数。”)。

这是我的代码:

import scipy
engine2 = scipy.stats.qmc.Sobol(d=1, scramble=True)
sample_qmc1 = engine2.random_base2(m=14)
print(sample_qmc1)
sample_qmc2 = engine2.random_base2(m=14)
print(sample_qmc2)

这是示例输出:

[[0.2534843 ]
 [0.884218  ]
 [0.69113704]
 ...
 [0.69106254]
 [0.88420477]
 [0.25347106]]
[[0.25342032]
 [0.88416122]
 [0.69107275]
 ...
 [0.69111674]
 [0.88426601]
 [0.2535251 ]]

如您所见,值几乎相同。

reset() 没有帮助,我得到相同的序列。更改为 random() 也没有帮助。使用较小的样本量似乎确实有效。

如果我添加这一行:

sample_qmc3 = engine2.random_base2(m=14)

我收到此错误:

ValueError: The balance properties of Sobol' points require n to be a power of 2. 24576 points have been previously generated, then: n=24576+2**14=40960. If you still want to do this, the function 'Sobol.random()' can be used.

我尝试了LatinHypercube,没有这个问题。

我正在使用 scipy 1.14.1

有人知道如何生成独特的 Sobol 序列吗?

python scipy montecarlo scipy.stats
1个回答
0
投票

如何通过重复调用 random 或 random_base2 来获得独特的 Sobol 序列?

这些序列是唯一的,但它们不是独立的。 Sobol 使用特定策略来填充空间并减少差异,并按特定顺序生成点。在生成第一个 2**14 = 16384

 点后,空间已经被很好地填充,因此您尝试将新点放入平均约为 1/2**14 的间隙中,因此每个点都不会接近到至少一个先前生成的点。您会立即注意到这一点,因为 Sobol' 在每次调用时都会以“相同的顺序”生成点。如果您希望序列看起来不同,您可以随机排列它们,而不会破坏低差异特性。

© www.soinside.com 2019 - 2024. All rights reserved.