LatinHypercube#
- класс scipy.stats.qmc.LatinHypercube(d, *, scramble=True, сила=1, оптимизация=None, rng=None, seed=None)[источник]#
Латинский гиперкубический сэмплинг (LHS).
Латинский гиперкубический сэмпл [1] генерирует \(n\) точки в \([0,1)^{d}\). Каждое одномерное маргинальное распределение стратифицировано, размещая ровно одну точку в \([j/n, (j+1)/n)\) для \(j=0,1,...,n-1\). Они все еще применимы, когда \(n << d\).
- Параметры:
- dint
Размерность пространства параметров.
- scramblebool, необязательно
Когда False, центрирует выборки внутри ячеек многомерной сетки. В противном случае выборки размещаются случайным образом внутри ячеек сетки.
Примечание
Установка
scramble=Falseне гарантирует детерминированный вывод. Для этого используйте rng параметр.По умолчанию True.
Добавлено в версии 1.10.0.
- оптимизация{None, "random-cd", "lloyd"}, опционально
Использовать ли схему оптимизации для улучшения качества после выборки. Обратите внимание, что это постобработка, которая не гарантирует сохранение всех свойств выборки. По умолчанию None.
random-cd: случайные перестановки координат для уменьшения центрированной несоответствия. Лучшая выборка на основе центрированной несоответствия постоянно обновляется. Выборка на основе центрированной несоответствия демонстрирует лучшую устойчивость заполнения пространства для 2D и 3D подпроекций по сравнению с использованием других мер несоответствия.lloyd: Возмущение выборок с использованием модифицированного алгоритма Ллойда-Макса. Процесс сходится к равноотстоящим выборкам.
Добавлено в версии 1.8.0.
Изменено в версии 1.10.0: Добавить
lloyd.- сила{1, 2}, необязательно
Сила LHS.
strength=1создает простой LHS, в то время какstrength=2создает ортогональный массив на основе LHS силы 2 [7], [8]. В этом случае толькоn=p**2точки могут быть выбраны, сpпростое число. Также ограничиваетd <= p + 1. По умолчанию: 1.Добавлено в версии 1.8.0.
- rng
numpy.random.Generator, опционально Состояние генератора псевдослучайных чисел. Когда rng равно None, новый
numpy.random.Generatorсоздаётся с использованием энтропии из операционной системы. Типы, отличные отnumpy.random.Generatorпередаются вnumpy.random.default_rngдля создания экземпляраGenerator.Изменено в версии 1.15.0: В рамках SPEC-007 переход от использования
numpy.random.RandomStatetonumpy.random.Generator, этот ключевое слово было изменено с seed to rng. В течение переходного периода оба ключевых слова будут продолжать работать, хотя можно указать только одно за раз. После переходного периода вызовы функций с использованием seed ключевое слово будет выдавать предупреждения. После периода устаревания, seed ключевое слово будет удалено.
Методы
fast_forward(n)Быстрая перемотка последовательности на n позиции.
integers(l_bounds, *[, u_bounds, n, ...])Генерировать n целые числа от l_bounds (включительно) до u_bounds (исключительно), или если endpoint=True, l_bounds (включительно) до u_bounds (включительно).
random([n, workers])Генерировать n в полуоткрытом интервале
[0, 1).reset()Сбросить движок в базовое состояние.
Смотрите также
Примечания
Когда LHS используется для интегрирования функции \(f\) над \(n\), LHS чрезвычайно эффективен для подынтегральных выражений, которые почти аддитивны [2]. С левой частью \(n\) точках, дисперсия интеграла всегда ниже, чем при обычном Монте-Карло на \(n-1\) точки [3]. Существует центральная предельная теорема для LHS на среднее и дисперсию интеграла [4], но не обязательно для оптимизированного LHS из-за рандомизации.
\(A\) называется ортогональным массивом силы \(t\) если в каждой n-строке-на-t-столбцов подматрице \(A\): все \(p^t\) возможные различные строки встречаются одинаковое количество раз. Элементы \(A\) находятся в множестве \(\{0, 1, ..., p-1\}\), также называемые символами. Ограничение, что \(p\) должно быть простым числом, чтобы позволить модулярную арифметику. Увеличение силы добавляет некоторую симметрию в подпроекции выборки. При силе 2 выборки симметричны вдоль диагоналей 2D подпроекций. Это может быть нежелательно, но, с другой стороны, дисперсия выборки улучшается.
Сила 1 (простой LHS) дает преимущество над силой 0 (MC), а сила 2 является полезным улучшением по сравнению с силой 1. Переход к силе 3 дает меньшее улучшение, и скремблированные QMC, такие как Sobol', Halton, работают более эффективно [7].
Чтобы создать латинский гиперкуб силы 2, ортогональный массив \(A\) рандомизируется применением случайного биективного отображения множества символов на само себя. Например, в столбце 0 все 0 могут стать 2; в столбце 1, все 0 могут стать 1 и т.д. Затем, для каждого столбца \(i\) и символ \(j\), мы добавляем простую одномерную LHS размера \(p\) в подмассив, где \(A^i = j\). Полученная матрица, наконец, делится на \(p\).
Ссылки
[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]параметры:
[3]A. B. Owen, "Метод Монте-Карло для дисперсии скремблированной сеточной квадратуры." 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.
[5]Fang et al. “Design and modeling for computer experiments”. Computer Science and Data Analysis Series, 2006.
[6]Damblin et al., “Numerical studies of space filling designs: optimization of Latin Hypercube Samples and subprojection properties.” Journal of Simulation, 2013.
[7] (1,2)А. Б. Оуэн, «Ортогональные массивы для компьютерных экспериментов, интегрирования и визуализации.» Statistica Sinica, 1992.
[8]Б. Танг, "Ортогональные массивы на основе латинских гиперкубов." Журнал Американской статистической ассоциации, 1993.
[9]Seaholm, Susan K. et al. (1988). Latin hypercube sampling and the sensitivity analysis of a Monte Carlo epidemic model. Int J Biomed Comput, 23(1-2), 97-112. DOI:10.1016/0020-7101(88)90067-0
Примеры
Генерировать выборки из генератора латинского гиперкуба.
>>> 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]])
Вычислите качество выборки с помощью критерия расхождения.
>>> qmc.discrepancy(sample) 0.0196... # random
Выборки могут быть масштабированы к границам.
>>> 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]])
Ниже приведены другие примеры, показывающие альтернативные способы построения LHS с ещё лучшим покрытием пространства.
Использование базового LHS в качестве базовой линии.
>>> sampler = qmc.LatinHypercube(d=2) >>> sample = sampler.random(n=5) >>> qmc.discrepancy(sample) 0.0196... # random
Используйте оптимизация ключевой аргумент для создания LHS с меньшим расхождением при более высоких вычислительных затратах.
>>> sampler = qmc.LatinHypercube(d=2, optimization="random-cd") >>> sample = sampler.random(n=5) >>> qmc.discrepancy(sample) 0.0176... # random
Используйте сила ключевой аргумент для создания ортогонального массива на основе LHS силы 2. В этом случае количество точек выборки должно быть квадратом простого числа.
>>> sampler = qmc.LatinHypercube(d=2, strength=2) >>> sample = sampler.random(n=9) >>> qmc.discrepancy(sample) 0.00526... # random
Опции могут быть объединены для создания оптимизированного центрированного ортогонального массива на основе LHS. После оптимизации результат не будет гарантированно иметь силу 2.
Пример из реальной жизни
В [9], стратегия латинского гиперкуба (LHS) использовалась для выборки пространства параметров для изучения важности каждого параметра эпидемиологической модели. Такой анализ также называется анализом чувствительности.
Поскольку размерность задачи высока (6), вычислительно дорого покрыть пространство. Когда численные эксперименты затратны, QMC позволяет проводить анализ, который может быть невозможен при использовании сетки.
Шесть параметров модели представляли вероятность заболевания, вероятность отказа и четыре вероятности контакта. Авторы предположили равномерные распределения для всех параметров и сгенерировали 50 выборок.
Используя
scipy.stats.qmc.LatinHypercubeчтобы воспроизвести протокол, первым шагом является создание выборки в единичном гиперкубе:>>> from scipy.stats import qmc >>> sampler = qmc.LatinHypercube(d=6) >>> sample = sampler.random(n=50)
Затем выборка может быть масштабирована до соответствующих границ:
>>> l_bounds = [0.000125, 0.01, 0.0025, 0.05, 0.47, 0.7] >>> u_bounds = [0.000375, 0.03, 0.0075, 0.15, 0.87, 0.9] >>> sample_scaled = qmc.scale(sample, l_bounds, u_bounds)
Такая выборка использовалась для запуска модели 50 раз, и была построена полиномиальная поверхность отклика. Это позволило авторам изучить относительную важность каждого параметра в диапазоне возможных значений всех остальных параметров.
В этом компьютерном эксперименте они показали 14-кратное сокращение количества выборок, необходимых для поддержания ошибки ниже 2% на их поверхности отклика, по сравнению с сеточной выборкой.