Передача дополнительных аргументов numdifftools Hessian - PullRequest
0 голосов
/ 11 ноября 2019

Я хочу получить гессиан из следующей функции:

def llik_scalars(param_vector, *args):
    Fsc = param_vector[0]
    Qsc = param_vector[1]
    Rsc = param_vector[2]

    y = args[0]
    burnin = args[1]

    F = np.matrix(Fsc)
    Q = np.matrix(Qsc)
    R = np.matrix(Rsc)

    predstate, predp, _, _ = kalmanfilter(F=F, Q=Q, R=R, y=y, plot = False)
    T = len(predp)
    predstate = np.array([predstate[t].item() for t in range(len(predstate))])
    predp = np.array([predp[t].item() for t in range(len(predp))])

    Sigmat = predp + Rsc
    Mut = predstate

    LL = 0
    for t in range(burnin, T):
        exponent = -0.5 * (y[t]-Mut[t])**2 / Sigmat[t]
        cc = 1 / math.sqrt(2*math.pi*Sigmat[t])
        LL -= math.log(cc*math.exp(exponent))
    return LL

Я пытаюсь сделать это с помощью функции Гессиана пакета numdifftools. В документации я нашел следующую информацию. Если вы хотите, например, гессиан функции Розенброка, который определяется как Розен, гессиан рассчитывается следующим образом:

> H = nd.Hessian(rosen)([1, 1])

Где гессиан вычисляется в точке [1,1]

Следуя документации, должна быть возможность дать аргументы функции Гессиана:

class Hessian(f, step=None, method=’central’, order=2, full_output=False, **step_options)
Parameters
fun [function] function of one array fun(x, *args, **kwds)

Я попробовал это следующим образом:

hess = nd.Hessian(kf.llik_scalars(themin.x, (y,burnin)))(themin.x)

themin.xэто точка, где я хочу оценить гессиан.

themin.x
Out[49]: array([0.67605231, 0.7457089 , 0.72205726])

Ошибка, которую я получаю, когда запускаю приведенный выше код:

burnin = args[1]

IndexError: tuple index out of range

Я не понимаю, как кортеж выходит за пределы диапазона

...