Python 更新函数并从scipy获取迭代结果

Python 更新函数并从scipy获取迭代结果,python,scipy,Python,Scipy,我试图捕捉目标函数的最佳结果,但它总是显示[1,1]。理想情况下,我应该将两个参数限制在0和1之间,以最大化-LL。我做错什么了吗?我想知道我是否应该在每次迭代后更新目标函数,但我很困惑如何使其工作。我查了好几篇帖子,但还是不确定。其他阅读材料也很受欢迎。非常感谢 这里是结果部分 def f(params): pi12, pi21 = params LL = 10*np.log(40*60/110**2) + 30*np.log(40*50/110**2) + 20*np.log

我试图捕捉目标函数的最佳结果,但它总是显示[1,1]。理想情况下,我应该将两个参数限制在0和1之间,以最大化-LL。我做错什么了吗?我想知道我是否应该在每次迭代后更新目标函数,但我很困惑如何使其工作。我查了好几篇帖子,但还是不确定。其他阅读材料也很受欢迎。非常感谢

这里是结果部分

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]处找到正确的最小值。以下是您的函数图:

这是我用来生成这个图的代码

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

看起来优化器正在[1,1]处找到正确的最小值。以下是您的函数图:

这是我用来生成这个图的代码

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