Sobol#
- класс scipy.stats.qmc.Sobol(d, *, scramble=True, биты=None, rng=None, оптимизация=None, seed=None)[источник]#
Движок для генерации (скремблированных) последовательностей Соболя.
Последовательности Соболя — это низкодисперсные квазислучайные числа. Точки можно генерировать двумя методами:
random_base2: безопасно рисовать \(n=2^m\) точек. Этот метод гарантирует свойства баланса последовательности.random: извлечь произвольное количество точек из последовательности. См. предупреждение ниже.
- Параметры:
- dint
Размерность последовательности. Максимальная размерность — 21201.
- scramblebool, необязательно
Если True, использовать скремблирование LMS+shift. В противном случае скремблирование не выполняется. По умолчанию True.
- битыint, необязательный
Количество бит генератора. Контролирует максимальное количество точек, которые могут быть сгенерированы, что составляет
2**bits. Максимальное значение 64. Это не соответствует типу возвращаемого значения, который всегдаnp.float64чтобы предотвратить повторение точек. По умолчанию — None, что для обратной совместимости соответствует 30.Добавлено в версии 1.9.0.
- оптимизация{None, "random-cd", "lloyd"}, опционально
Использовать ли схему оптимизации для улучшения качества после выборки. Обратите внимание, что это постобработка, которая не гарантирует сохранение всех свойств выборки. По умолчанию None.
random-cd: случайные перестановки координат для уменьшения центрированной несоответствия. Лучшая выборка на основе центрированной несоответствия постоянно обновляется. Выборка на основе центрированной несоответствия демонстрирует лучшую устойчивость заполнения пространства для 2D и 3D подпроекций по сравнению с использованием других мер несоответствия.lloyd: Возмущение выборок с использованием модифицированного алгоритма Ллойда-Макса. Процесс сходится к равноотстоящим выборкам.
Добавлено в версии 1.10.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).random_base2(m)Выбрать точку(и) из последовательности Соболя.
reset()Сбросить движок в базовое состояние.
Примечания
Последовательности Соболя [1] предоставить \(n=2^m\) точки с низкой дисперсией в \([0,1)^{d}\). Перемешивание их [3] делает их подходящими для сингулярных подынтегральных функций, предоставляет средство оценки ошибки и может улучшить их скорость сходимости. Реализованная стратегия скремблирования — это (левое) линейное матричное скремблирование (LMS) с последующим цифровым случайным сдвигом (LMS+shift) [2].
Существует много версий последовательностей Соболя в зависимости от их 'направляющих чисел'. Этот код использует направляющие числа из [4]Следовательно, максимальное количество измерений равно 21201. Направленные числа были предварительно вычислены с критерием поиска 6 и могут быть получены по адресу https://web.maths.unsw.edu.au/~fkuo/sobol/.
Предупреждение
Последовательности Соболя — это квадратурное правило, и они теряют свои балансные свойства, если использовать размер выборки, не являющийся степенью двойки, пропустить первую точку или проредить последовательность. [5].
Если \(n=2^m\) точек недостаточно, тогда следует взять \(2^M\) точки для \(M>m\). При скремблировании количество R независимых реплик не обязательно должно быть степенью 2.
Последовательности Соболя генерируются до некоторого числа \(B\) битов. После \(2^B\) точки были сгенерированы, последовательность будет повторяться. Поэтому возникает ошибка. Количество битов можно контролировать с помощью параметра биты.
Ссылки
[1]И. М. Соболь, "Распределение точек в кубе и точное вычисление интегралов." Ж. Вычисл. Мат. и Мат. Физ., 7:784-802, 1967.
[2]J. Matousek, “On the L2-discrepancy for anchored boxes.” J. of Complexity 14, 527-556, 1998.
[3]Арт Б. Оуэн, «Перемешивание точек Соболя и Нидеррайтера-Ксинга». Journal of Complexity, 14(4):466-489, декабрь 1998.
[4]S. Joe и F. Y. Kuo, «Constructing sobol sequences with better two-dimensional projections.» SIAM Journal on Scientific Computing, 30(5):2635-2654, 2008.
[5]Арт Б. Оуэн, "О пропуске первой точки Соболя." arXiv:2008.08051, 2020.
Примеры
Генерация выборок из последовательности Соболя с низким расхождением.
>>> from scipy.stats import qmc >>> sampler = qmc.Sobol(d=2, scramble=False) >>> sample = sampler.random_base2(m=3) >>> sample array([[0. , 0. ], [0.5 , 0.5 ], [0.75 , 0.25 ], [0.25 , 0.75 ], [0.375, 0.375], [0.875, 0.875], [0.625, 0.125], [0.125, 0.625]])
Вычислите качество выборки с помощью критерия расхождения.
>>> qmc.discrepancy(sample) 0.013882107204860938
Чтобы продолжить существующий дизайн, дополнительные точки можно получить, вызвав снова
random_base2. В качестве альтернативы можно пропустить некоторые точки, например:>>> _ = sampler.reset() >>> _ = sampler.fast_forward(4) >>> sample_continued = sampler.random_base2(m=2) >>> sample_continued array([[0.375, 0.375], [0.875, 0.875], [0.625, 0.125], [0.125, 0.625]])
Наконец, выборки могут быть масштабированы до границ.
>>> l_bounds = [0, 2] >>> u_bounds = [10, 5] >>> qmc.scale(sample_continued, l_bounds, u_bounds) array([[3.75 , 3.125], [8.75 , 4.625], [6.25 , 2.375], [1.25 , 3.875]])