python用fmin, fmin_powell, fmin_cg, fmin_bfgs求解无约束极小值点

来源:互联网 发布:私人做网络小贷平台 编辑:程序博客网 时间:2024/06/03 04:29

背景:

作求解无约束极小值点范例。

代码:

import scipy.optimize as optimport numpy as npdef test_fmin(fminfunc,x0,a):    """    x0为优化算法的初始值,各种优化算法必须    a为目标函数的参数    """    def targetfunc(x):        """        fminfunc将求使得函数targetfunc值最小的x,这里的目标函数选的是各种优化算法中常用的一个函数        """        return 100*(x[0]**2-x[1])**2+(x[0]-a)**2    print("=========================")    print('求解函数名称:',fminfunc.__name__)    print()    # 优化算法求解    h0 = fminfunc(targetfunc,x0)        print()    #输出求解出的极小值点    print("极小值点:",h0)    print()#初始值点x0 = np.array([12.,32.])a = 9test_fmin(opt.fmin,x0,a)test_fmin(opt.fmin_powell,x0,a)test_fmin(opt.fmin_cg,x0,a)test_fmin(opt.fmin_bfgs,x0,a)

结果:

=========================
求解函数名称: fmin


Optimization terminated successfully.
         Current function value: 0.000000
         Iterations: 113
         Function evaluations: 216


极小值点: [  8.99999737  80.9999528 ]


=========================
求解函数名称: fmin_powell


Optimization terminated successfully.
         Current function value: 0.000000
         Iterations: 37
         Function evaluations: 1072


极小值点: [  9.  81.]


=========================
求解函数名称: fmin_cg


Warning: Desired error not necessarily achieved due to precision loss.
         Current function value: 114.368222
         Iterations: 16
         Function evaluations: 243
         Gradient evaluations: 59


极小值点: [-1.55212512  2.5828991 ]


=========================
求解函数名称: fmin_bfgs


Warning: Desired error not necessarily achieved due to precision loss.
         Current function value: 0.000000
         Iterations: 58
         Function evaluations: 608
         Gradient evaluations: 149


极小值点: [  8.99980808  80.99654173]

分析:

  1. 可以看出各优化算法得到的最小值点不尽相同,而fmin_cg函数并不能求出最小值点。这里并不是说明这种优化算法不好,各种求最小值的算法都有一定的适用范围,可能对这个问题fmin_cg函数不是很好。
  2. 参与过公司开发优化的项目,目标函数带参数的问题一直不是很好处理,用全局变量又耗时间,后来直接写了一个类解决了,如果在python中该不会有这个问题。


原创粉丝点击