Я пытаюсь минимизировать логарифмическое правдоподобие по 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])