使用scipy优化的python失败了
我想用scipy最小化来最小化似然函数。我需要对所有这些函数求和,以得到alpha1,alpha2,alpha3,alpha4,beta1,beta2的最佳值。我的代码是:使用scipy优化的python失败了,python,scipy,statistics,mle,Python,Scipy,Statistics,Mle,我想用scipy最小化来最小化似然函数。我需要对所有这些函数求和,以得到alpha1,alpha2,alpha3,alpha4,beta1,beta2的最佳值。我的代码是: def infected_prob_lh(params): alpha1,alpha2,alpha3,alpha4,beta1,beta2=params[0], params[1],params[2], params[3],params[4], params[5] return -np.sum([ Nij_3
def infected_prob_lh(params):
alpha1,alpha2,alpha3,alpha4,beta1,beta2=params[0], params[1],params[2], params[3],params[4], params[5]
return -np.sum([ Nij_339034*np.log(Pj_339034)+ (N_339034-Nij_339034)*np.log(1-Pj_339034),
Nij_436000*np.log(Pj_436000)+ (N_436000-Nij_436000)*np.log(1-Pj_436000),
Nij_436000*np.log(Pj_436000)+ (N_436000-Nij_436000)*np.log(1-Pj_436000),
Nij_817037*np.log(Pj_817037)+ (N_817037-Nij_817037)*np.log(1-Pj_817037),
Nij_1282000*np.log(Pj_1282000)+ (N_1282000-Nij_1282000)*np.log(1-Pj_1282000),
Nij_4014000*np.log(Pj_4014000)+ (N_4014000-Nij_4014000)*np.log(1-Pj_4014000)])
init_params = [1, 1,1,1,1,1]
minimize(infected_prob_lh,x0=init_params,method='Nelder-Mead')
我明白了:
fun: nan
message: 'Maximum number of function evaluations has been exceeded.'
nfev: 1207
nit: 151
status: 1
success: False
x: array([1., 1., 1., 1., 1., 1.])
我试图设置另一个初始值,但没有成功。它似乎只对return语句中的一个函数有效,但我需要找到所有这些函数之和的最佳值。
乐于助人。
谢谢您的返回函数没有输入参数。因此,改变参数不会改变输出。在最大迭代次数之后,优化器停止 将返回函数更改为alpha1、alpha2、alpha3、alpha4、beta1、beta2的函数 作为对你评论的回应: I使用
alpha1,…beta2
内部Pj_I
变量
我们没有如何定义(读取计算)Pj_i的代码,但可以肯定的是,Pj_i
是一个具有固定值的变量,因此在极小值的迭代过程中不会更新。
您需要执行某种
Pi_j=calculatePi_j(alpha1,…beta2)
以使用当前alpha1,…beta2
重新计算值,然后再使用它来计算拟合函数的返回值。不清楚您的函数在做什么。参数和返回值之间的关系是什么?据我所知,您实际上并没有在函数中的任何位置使用alpha1,…,beta2
,因此当您调用minimize(…)
时,算法会更改参数的值,但它实际上并没有改变似然函数的输出值。作为旁注,最小化函数输出中的nfev
告诉您,它对似然函数进行了1207次评估,而不是一次。我在Pj_I变量中使用alpha1,…beta 2。@nay:变量不能使用参数