如何通过重复调用 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 序列吗?
如何通过重复调用 random 或 random_base2 来获得独特的 Sobol 序列?
这些序列是唯一的,但它们不是独立的。 Sobol 使用特定策略来填充空间并减少差异,并按特定顺序生成点。在生成第一个 2**14 = 16384
点后,空间已经被很好地填充,因此您尝试将新点放入平均约为 1/2**14 的间隙中,因此每个点都不会接近到至少一个先前生成的点。您会立即注意到这一点,因为 Sobol' 在每次调用时都会以“相同的顺序”生成点。如果您希望序列看起来不同,您可以随机排列它们,而不会破坏低差异特性。