def f(params):
pi12, pi21 = params
LL = 10*np.log(40*60/110**2) + 30*np.log(40*50/110**2) + 20*np.log(20/110*(50/110 + 60/110*pi12)) + \
50*np.log(50/110*(60/110 + 50/110*pi21)) - 110*np.log(40*60/110**2 + 40*50/110**2 + \
20/110*(50/110 + 60/110*pi12) + 50/110*(60/110 + 50/110*pi21))
return -LL
def callbackF(Xi):
global Nfeval
print('pass callback',str(Nfeval))
print(Nfeval, Xi[0], Xi[1], f(Xi))
Nfeval += 1
initial_guess = [0, 0]
b = (0.0, 1.0)
b0 = b1 = b
bnb = [b0, b1]
res = minimize(f, initial_guess, bounds=bnb, method='bfgs', callback=callbackF, options={'disp':True})
print (res)
我试图捕获目标函数的最佳结果,但它总是显示 [1, 1]。理想情况下,我应该将两个参数限制在 0 和 1 之间,以最大化 -LL。我做错了什么吗?我想知道是否应该在每次迭代后更新目标函数,但我很困惑如何使其发挥作用。我检查了几个帖子但仍然不确定。其他阅读材料也非常受欢迎。多谢!
pass callback 25
25 0.6870283538140954 0.7403323855238932 143.98656641020855
pass callback 26
26 0.7935216169001177 0.7090801503785442 143.93658208323882
pass callback 27
27 0.8314173041320377 0.7666686643426496 143.84748818067345
pass callback 28
28 0.9264732632840973 0.8980814706430704 143.7237871814941
pass callback 29
29 0.9885339111975429 0.9836968132795704 143.69759782341296
pass callback 30
30 0.999243206123829 0.9988036732413753 143.69694856450647
pass callback 31
31 1.0000109917713558 0.9999811482899945 143.6969451785149
pass callback 32
32 1.0000049364520325 0.99999836986115 143.6969451768374
pass callback 33
33 1.000000303283094 1.000000360615374 143.6969451767528
Optimization terminated successfully.
Current function value: 143.696945
Iterations: 9
Function evaluations: 44
Gradient evaluations: 11
fun: 143.6969451767528
hess_inv: array([[0.2255719 , 0.08676943],
[0.08676943, 0.21320636]])
jac: array([1.90734863e-06, 3.81469727e-06])
message: 'Optimization terminated successfully.'
nfev: 44
nit: 9
njev: 11
status: 0
success: True
x: array([1.0000003 , 1.00000036])
弑天下
相关分类