Из документации неясно, как работает scipy.dist.rvs()

#python #scipy #time-complexity

#питон #scipy #временная сложность

Вопрос:

В настоящее время я делаю выборку из пользовательского дискретного распределения следующим образом:

 discrete_dist = stats.rv_discrete(name='discrete_dist', values=(np.arrange(1,N), p))

samples = discrete_dist.rvs(size = m)
 

где p — список вероятностей длины N.

Я не могу понять, когда просматриваю документацию, какова вычислительная сложность, поскольку единственное, что говорится в документации о функции rvs(), это следующее:

 def rvs(self, *args, **kwargs):
            kwargs['discrete'] = True
    return super().rvs(*args, **kwargs)
 

Ссылка на документацию здесь. Как работает эта функция?

Бонусный вопрос: Есть ли более быстрый способ сделать это?

Ответ №1:

Код для дискретных распределений с явным values выражением находится здесь: https://github.com/scipy/scipy/blob/v1.7.1/scipy/stats/_distn_infrastructure.py#L3710

По сути, это выборка обратной функции распределения, которая преобразует равномерную переменную в (0, 1), используя обратную к cdf.