背景:
作求解无约束极小值点范例。
代码:
import scipy.optimize as opt
import numpy as np
def 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 = 9
test_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]
求解函数名称: 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]
分析:
- 可以看出各优化算法得到的最小值点不尽相同,而fmin_cg函数并不能求出最小值点。这里并不是说明这种优化算法不好,各种求最小值的算法都有一定的适用范围,可能对这个问题fmin_cg函数不是很好。
- 参与过公司开发优化的项目,目标函数带参数的问题一直不是很好处理,用全局变量又耗时间,后来直接写了一个类解决了,如果在python中该不会有这个问题。