scipy.stats.qmc.

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.

rngnumpy.random.Generator, опционально

Состояние генератора псевдослучайных чисел. Когда rng равно None, новый numpy.random.Generator создаётся с использованием энтропии из операционной системы. Типы, отличные от numpy.random.Generator передаются в numpy.random.default_rng для создания экземпляра Generator.

Изменено в версии 1.15.0: В рамках SPEC-007 переход от использования numpy.random.RandomState to numpy.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]])