Передача аргументов в правильном пути к scipy minimzer - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь минимизировать логарифмическое правдоподобие по Fsc, Qsc и Rsc:

def llik_scalars(Fsc, Qsc, Rsc, pred_state, pred_P, y):
T = len(pred_P)
#pred_state = np.array([pred_state[t].item() for t in range(len(pred_state))])
#pred_P = np.array([pred_P[t].item() for t in range(len(pred_P))])
Sigmat = np.array(pred_P) + Rsc
Mut = pred_state
for t in range(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

Сначала я попытался передать свои pred_state и pred_P в виде списков матриц. Эти матрицы имеют размер 1x1, поэтому с кодом, который закомментирован, я получил список чисел в матрицах. Однако, поскольку я не был уверен, что аргументы могут быть переданы в этой форме, но я читал, что массивы можно передавать, закомментированный код теперь выполняется ДО того, как я передам pred_state и pred_P в качестве аргументов. Таким образом, я передаю их как массивы. Я попытался сделать это, используя scipy minimzer

x0 = [0.5, np.var(y)/3, np.var(y) *2/3]
minimize(llik_scalars, x0, method = 'nelder-mead', args=(pred_state, pred_P, y))

Я получаю эту ошибку:

llik_scalars() missing 2 required positional arguments: 'pred_P' and 'y'

Следуя другой теме, посвященной stackoverflow, я адаптировал свой код к следующему, надеясь решить мою проблему. :

def llik_scalars(Fsc, Qsc, Rsc, *args):
pred_state = args[0]
pred_P = args[1]
y = args[2]
T = len(pred_P)
#pred_state = np.array([pred_state[t].item() for t in range(len(pred_state))])
#pred_P = np.array([pred_P[t].item() for t in range(len(pred_P))])
Sigmat = np.array(pred_P) + Rsc
Mut = pred_state
for t in range(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

Это, однако, приводит к следующей ошибке:

pred_P = args[1]

IndexError: tuple index out of range

Я не вижу, как это не работает. Пожалуйста, помогите мне:)

- РЕДАКТИРОВАТЬ: - первые несколько записей pred_state и pred_p и y, как я передаю их в llik_scalars. Обратите внимание, что начальное предположение для этого состояния равно 0, и я использую своего рода предварительную диффузию, установив мою дисперсию (pred_P) в миллион. Я получил свои pred_state и pred_P, используя фильтр Калмана с начальными догадками для моих F, Q и R:

pred_state[:5]
Out[121]: array([ 0.        ,  0.6097107 ,  0.29789331,  0.30998801, -0.33307371])

pred_P[:5]
Out[122]: 
array([1.00000000e+06, 1.24999975e+00, 1.13888888e+00, 1.13311688e+00,
       1.13280061e+00])

y[:5]
Out[123]: array([ 1.21942262,  0.58464737,  0.90278035, -1.52760793, -0.80572172])
...