TypeError: объект 'float' не может быть подписан во время минимизации scipy - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь оценить модель максимального правдоподобия в python. Я настроил и функцию правдоподобия, и аналитический якобиан. Когда я запускаю scipy minimal, я получаю странную ошибку (показанную ниже). Эта ошибка, по-видимому, не возникает, когда я опускаю якобиан, но не могу понять, почему.

from numpy import log,sum,var
from numba import njit

@njit
def log_likelihood(params,surg_fx,surg_fx_ses):
    mu_var = params[0]
    exp_var = mu_var + surg_fx_ses**2
    log_lik = -((surg_fx)**2 / (2*exp_var)) - .5*log(exp_var)
    neg_sum_log_lik = -sum(log_lik)
    print(mu_var)
    print(neg_sum_log_lik)
    if np.isnan(neg_sum_log_lik):
        return 1e20
    else:
        return neg_sum_log_lik

@njit
def log_lik_jac(params,surg_fx,surg_fx_ses):
    mu_var = params[0]
    exp_var = mu_var + surg_fx_ses**2
    jc = -sum(((surg_fx)**2 / (2*(exp_var**2))) - (.5/exp_var))
    print(mu_var)
    print(jc)
    return jc

x0 = [np.var(cost_params3)]
shrinkage_est = minimize(log_likelihood,x0,args=(cost_params3,cost_SEs3),jac=log_lik_jac,options={'disp':True},method='BFGS')

cost_params3 и cost_SEs3 являются (205,) -образными массивами numpy.

И возврат:

0.10423462356390442
-580.1534424527905
0.10423462356390442
-67.02947836460727
[ 1.11423462]
26.84532144252225
[ 1.11423462]
77.95606471086792
[ 0.3741784]
-54.28224588483895
[ 0.3741784]
150.90730570822998
[ 0.19152581]
-79.19268133113846
[ 0.19152581]
68.81484893304786
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/anaconda3/lib/python3.5/site-packages/scipy/optimize/_minimize.py", line 444, in minimize
    return _minimize_bfgs(fun, x0, args, jac, callback, **options)
  File "/usr/local/anaconda3/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 973, in _minimize_bfgs
    A1 = I - sk[:, numpy.newaxis] * yk[numpy.newaxis, :] * rhok
TypeError: 'float' object is not subscriptable

Я не совсем уверен, почему это выполняется в течение нескольких итераций и просто дает сбой, особенно учитывая, что здесь ничего не подписывается. Я также не уверен, почему он становится списком после первой итерации? Я попытался запустить его без Numba, но он остановился в том же месте с другой ошибкой:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/anaconda3/lib/python3.5/site-packages/scipy/optimize/_minimize.py", line 444, in minimize
    return _minimize_bfgs(fun, x0, args, jac, callback, **options)
  File "/usr/local/anaconda3/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 973, in _minimize_bfgs
    A1 = I - sk[:, numpy.newaxis] * yk[numpy.newaxis, :] * rhok
IndexError: invalid index to scalar variable.

Любая помощь будет высоко ценится!

...