微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决更新函数并从scipy获取迭代结果

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

解决方法

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

enter image description here

这是我用来生成该图的代码。

from scipy.optimize import minimize
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm

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 g(X,Y):
    return f([X,Y])

initial_guess = [0,0]
b = (0.0,1.0)
b0 = b1 = b
bnb = [b0,b1]
res = minimize(f,initial_guess,bounds=bnb,method='bfgs')

print (res)


X = np.arange(0,1,0.05)
Y = np.arange(0,0.05)
X,Y = np.meshgrid(X,Y)
Z = g(X,Y)

fig = plt.figure()
ax = fig.gca(projection='3d')

# Plot the surface.
surf = ax.plot_surface(X,Y,Z,cmap=cm.coolwarm,linewidth=0,antialiased=False)

plt.show()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。