2017-02-12 2 views
2

Я хочу, чтобы генерировать гамма-распределенные случайные величины с scipy.stats.gamma.rvsфункции Оберточной использовать различные paremetres в Python

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

Я мог бы написать обертку, которая будет получать среднее значение и std в качестве входных данных, вычисленный масштаб и форму, а не использовать gamma.rvs для генерации случайной переменной. Но я ожидаю много вызовов этой функции, поэтому я предпочел бы, если бы мне не приходилось делать вычисления каждый раз.

я придумал следующее решение:

from scipy.stats import gamma 


def gamma_rvs_generator(mu, sigma): 
    var = sigma ** 2 
    scale = var/mu 
    a = mu/scale 
    return lambda: gamma.rvs(a=a, scale=scale) 


if __name__ == '__main__': 
    gen = gamma_rvs_generator(10, 10) 
    print(gen()) 

, который работает точно так же, как я хочу, чтобы работать. Но я хотел спросить, были ли какие-нибудь лучшие/более питонические решения.

+0

альтернативный способ редактирования API, но это не так. Кстати, почему вы используете 'lambda'? – magicleon

+1

@magicleon Это делает его функцией с аргументами '0', которые можно многократно вызывать, производя разные случайные числа каждый раз. Без «лямбды» он возвратил бы одно случайное число и, следовательно, потребовал, чтобы обертка была повторена с каждым новым случайным числом. –

+0

о, как конструктор? Ницца! – magicleon

ответ

3

Я чувствую - но это дело вкуса - это было бы более Pythonic воспользоваться rv_frozen объектов:

from scipy.stats import gamma 


def gamma_alt(mu, sigma): 
    var = sigma ** 2 
    scale = var/mu 
    a = mu/scale 
    return gamma(a=a, scale=scale) 


if __name__ == '__main__': 
    gen = gamma_alt(10, 10) 
    print(gen.rvs()) 

Обратите внимание на вызов к gamma сам, не gamma.rvs. Преимущество: ваш gamma_alt ведет себя скорее как «нормальный» scipy stats civil. Например, вы получаете не только rvs, но автоматически также pfd, cfd и т. Д.

Смежные вопросы