Проблемы со Scipy. Минимизация, включая границы - PullRequest
0 голосов
/ 30 января 2019

Я хочу минимизировать отрицательное логарифмическое правдоподобие, чтобы максимально приблизиться к ранее рассчитанному распределению.Мой дистрибутив является бета-биномиальным, и мне нужно выбрать параметры a (lpha) и b (eta) .Я основал свою функцию, которая вычисляет отрицательное логарифмическое правдоподобие на основе одного из ответов другой темы .

def nll(a, b):
    k = players['Goals'].sum() # equal to the number of successes
    n = players['Shots'].sum() # equal to the number of trials
    log = gammaln(n + 1) + gammaln(k + a) + gammaln(n - k + b) + gammaln(a + b) - (gammaln(k + 1) + gammaln(n - k + 1) + gammaln(a) + gammaln(b) + gammaln(n + a + b))
    return -(np.exp(log))

Далее, я хочу минимизировать логарифмическое правдоподобие.В R это можно сделать с помощью следующего скрипта:

# maximum likelihood estimation
m <- mle(ll, start = list(alpha = 1, beta = 10), 
method = "L-BFGS-B", lower = c(0.0001, 0.1))

ab <- coef(m) 

Я пытаюсь воспроизвести R-скрипт на Python следующим образом:

 init_params = [1, 10] # This is equal to the start-argument in R

 res = minimize(nll, x0=init_params, method='L-BFGS-B', options={'disp' : True, 'maxiter': 250})

Запустив это, выдает следующую ошибку:

функция возврата (* (wrapper_args + args)) TypeError: nll () отсутствует 1 обязательный позиционный аргумент: 'b'

Что я именно делаю неправильно?Я вставил б = 10 правильно?

1 Ответ

0 голосов
/ 30 января 2019

optimize.minimize ожидает, что его первый аргумент будет функцией этой формы:

def func(params, args):
    ...

, где params представляет все параметры, optimize.minimize пытается минимизировать.args может использоваться для передачи дополнительных аргументов, которые не следует минимизировать;они, по сути, являются константами в отношении optimize.minimize.

В этом случае params представляет два значения, a и b, поэтому напишите nll следующим образом:

def nll(params):
    a, b = params
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...