Python 以正确的方式将参数传递给scipy MINIMizer

Python 以正确的方式将参数传递给scipy MINIMizer,python,optimization,args,kalman-filter,minimization,Python,Optimization,Args,Kalman Filter,Minimization,我正在尝试最小化对数可能性wrt 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))]) Si

我正在尝试最小化对数可能性wrt 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_状态和pred_p作为矩阵列表传递。这些矩阵的大小为1x1,因此通过注释掉的代码,我检索了矩阵中的数字列表。 但是,由于我不确定参数是否可以以这种形式传递,但我了解到可以传递数组,所以现在在我将pred_state和pred_P作为参数传递之前,执行注释掉的代码。因此,我将它们作为numpy数组传递。 我试着用scipy Minimizer做这个

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_标量中。注意,状态的初始猜测值为0,我通过将方差(pred_P)设置为一百万,使用了一种漫反射先验。我使用卡尔曼滤波器对我的F、Q和R进行初始猜测,检索了我的pred_状态和pred_P:

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])

你能分享一下你的
pred_state
pred_P
y
的例子吗?假设T=5。亲爱的安东,我更新/编辑了最初的帖子。谢谢你的提问如果我看得正确,你的
llik_scalars()
会得到
F
Q
R
作为输入,但我只能在实际的函数体中找到
R
。是否需要另外两个参数(
F
Q
)?