Как использовать новый генератор случайных чисел NumPy? - PullRequest
0 голосов
/ 08 мая 2020

Тот факт, что NumPy теперь рекомендует, чтобы новый код использовал экземпляр defacult_rng() вместо numpy.random для нового кода, заставил меня задуматься о том, как его следует использовать для получения хороших результатов, как с точки зрения производительности, так и статистически.

В этом первом примере я сначала хотел написать:

import numpy as np

class fancy_name():
  def __init__(self):
    self.rg = np.random.default_rng()
    self.gamma_shape = 1.0
    self.gamma_scale = 1.0

  def public_method(self, input):
    # Do intelligent stuff with input
    return self.rg.gamma(self.gamma_shape, slef.gamma_scale)

Но я также подумал о создании нового экземпляра при каждом вызове функции:

import numpy as np

class fancy_name():
  def __init__(self):
    self.gamma_shape = 1.0
    self.gamma_scale = 1.0

  def public_method(self, input):
    # Do intelligent stuff with input
    rg = np.random.default_rng()
    return rg.gamma(self.gamma_shape, slef.gamma_scale)

A Третья альтернатива - передать rng в качестве аргумента при вызове функции. Таким образом, тот же rng может использоваться и в других частях кода.

Это используется в среде моделирования, которая будет часто вызываться для выборки, например, времен перехода.

Думаю, вопрос в том, есть ли аргументы в пользу любого из этих трех методов и существует ли какая-то практика?

Кроме того, очень интересны любые ссылки на более подробные объяснения использования этих генераторов случайных чисел (за исключением статьи NumPy do c и случайной выборки)!

1 Ответ

1 голос
/ 08 мая 2020

default_rng() не является одиночным. Он создает новый Генератор, поддерживаемый новым экземпляром класса BitGenerator по умолчанию. Цитата из docs :

Создайте new Generator с помощью BitGenerator по умолчанию (PCG64).

...

Если начальное значение не является BitGenerator или Generator, создается экземпляр new BitGenerator. Эта функция не управляет глобальным экземпляром по умолчанию.

Это также можно проверить эмпирически:

In [1]: import numpy

In [2]: numpy.random.default_rng() is numpy.random.default_rng()
Out[2]: False

Это дорого. Обычно вы должны вызвать default_rng() один раз в своей программе и передать генератор всему, что в нем нуждается. (Да, это неудобно.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...