# scipy.stats.qmc.LatinHypercube

class scipy.stats.qmc.LatinHypercube(d, *, centered=False, seed=None)

  Latin hypercube sampling (LHS).

  A Latin hypercube sample [1] generates \(n\) points in \([0,1)^{d}\). Each univariate marginal distribution is stratified, placing exactly one point in \([j/n, (j+1)/n)\) for \(j=0,1,...,n-1\). They are still applicable when \(n << d\). LHS is extremely effective on integrands that are nearly additive [2]. LHS on \(n\) points never has more variance than plain MC on \(n-1\) points [3]. There is a central limit theorem for LHS [4], but not necessarily for optimized LHS.

  Parameters
    d int

      Dimension of the parameter space.

    centered bool, optional

      Center the point within the multi-dimensional grid. Default is False.

    seed{None, int, `numpy.random.Generator`}, optional

      If seed is None the `numpy.random.Generator` singleton is used. If seed is an int, a new `Generator` instance is used, seeded with seed. If seed is already a `Generator` instance then that instance is used.

  References

  1

    Mckay et al., “A Comparison of Three Methods for Selecting Values of Input Variables in the Analysis of Output from a Computer Code”, Technometrics, 1979.

  2

    M. Stein, “Large sample properties of simulations using Latin hypercube sampling.” Technometrics 29, no. 2: 143-151, 1987.

  3

    A. B. Owen, “Monte Carlo variance of scrambled net quadrature.” SIAM Journal on Numerical Analysis 34, no. 5: 1884-1910, 1997

  4

    Loh, W.-L. “On Latin hypercube sampling.” The annals of statistics 24, no. 5: 2058-2080, 1996.

  Examples

  Generate samples from a Latin hypercube generator.

      >>> from scipy.stats import qmc
      >>> sampler = qmc.LatinHypercube(d=2)
      >>> sample = sampler.random(n=5)
      >>> sample
      array([[0.1545328 , 0.53664833],  # random
             [0.84052691, 0.06474907],
             [0.52177809, 0.93343721],
             [0.68033825, 0.36265316],
             [0.26544879, 0.61163943]])

  Compute the quality of the sample using the discrepancy criterion.

      >>> qmc.discrepancy(sample)
      0.019558034794794565  # random

  Finally, samples can be scaled to bounds.

      >>> l_bounds = [0, 2]
      >>> u_bounds = [10, 5]
      >>> qmc.scale(sample, l_bounds, u_bounds)
      array([[1.54532796, 3.609945  ],  # random
             [8.40526909, 2.1942472 ],
             [5.2177809 , 4.80031164],
             [6.80338249, 3.08795949],
             [2.65448791, 3.83491828]])

  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.

scipy.stats.qmc.Halton.reset scipy.stats.qmc.LatinHypercube.fast_forward