scipy.stats.qmc.Halton¶
- class scipy.stats.qmc.Halton(d, *, scramble=True, seed=None)[source]¶
Halton sequence.
Pseudo-random number generator that generalize the Van der Corput sequence for multiple dimensions. The Halton sequence uses the base-two Van der Corput sequence for the first dimension, base-three for its second and base-\(n\) for its n-dimension.
- Parameters
- dint
Dimension of the parameter space.
- scramblebool, optional
If True, use Owen scrambling. Otherwise no scrambling is done. Default is True.
- seed{None, int,
numpy.random.Generator
}, optional If seed is None the
numpy.random.Generator
singleton is used. If seed is an int, a newGenerator
instance is used, seeded with seed. If seed is already aGenerator
instance then that instance is used.
Notes
The Halton sequence has severe striping artifacts for even modestly large dimensions. These can be ameliorated by scrambling. Scrambling also supports replication-based error estimates and extends applicabiltiy to unbounded integrands.
References
- 1
Halton, “On the efficiency of certain quasi-random sequences of points in evaluating multi-dimensional integrals”, Numerische Mathematik, 1960.
- 2
A. B. Owen. “A randomized Halton algorithm in R”, arXiv:1706.02808, 2017.
Examples
Generate samples from a low discrepancy sequence of Halton.
>>> from scipy.stats import qmc >>> sampler = qmc.Halton(d=2, scramble=False) >>> sample = sampler.random(n=5) >>> sample array([[0. , 0. ], [0.5 , 0.33333333], [0.25 , 0.66666667], [0.75 , 0.11111111], [0.125 , 0.44444444]])
Compute the quality of the sample using the discrepancy criterion.
>>> qmc.discrepancy(sample) 0.088893711419753
If some wants to continue an existing design, extra points can be obtained by calling again
random
. Alternatively, you can skip some points like:>>> _ = sampler.fast_forward(5) >>> sample_continued = sampler.random(n=5) >>> sample_continued array([[0.3125 , 0.37037037], [0.8125 , 0.7037037 ], [0.1875 , 0.14814815], [0.6875 , 0.48148148], [0.4375 , 0.81481481]])
Finally, samples can be scaled to bounds.
>>> l_bounds = [0, 2] >>> u_bounds = [10, 5] >>> qmc.scale(sample_continued, l_bounds, u_bounds) array([[3.125 , 3.11111111], [8.125 , 4.11111111], [1.875 , 2.44444444], [6.875 , 3.44444444], [4.375 , 4.44444444]])
Methods
fast_forward
(n)Fast-forward the sequence by n positions.
random
([n])Draw n in the half-open interval
[0, 1)
.reset
()Reset the engine to base state.