在 scipy.optimize.minimize 中使用“L-BFGS-B”方法时,我得到了一些令人费解的结果:
import scipy.optimize as optimize
import numpy as np
def testFun():
prec = 1e3
func0 = lambda x: (float(x[0]*prec)/prec+0.5)**2+(float(x[1]*prec)/prec-0.3)**2
func1 = lambda x: (float(round(x[0]*prec))/prec+0.5)**2+(float(round(x[1]*prec))/prec-0.3)**2
result0 = optimize.minimize(func0, np.array([0,0]), method = 'L-BFGS-B', bounds=((-1,1),(-1,1)))
print result0
print 'func0 at [0,0]:',func0([0,0]),'; func0 at [-0.5,0.3]:',func0([-0.5,0.3]),'\n'
result1 = optimize.minimize(func1, np.array([0,0]), method = 'L-BFGS-B', bounds=((-1,1),(-1,1)))
print result1
print 'func1 at [0,0]:',func1([0,0]),'; func1 at [-0.5,0.3]:',func1([-0.5,0.3])
def main():
testFun()
func0() 和 func1() 是几乎相同的二次函数,输入值的精度差异仅为 0.001。'L-BFGS-B' 方法适用于 func0。然而,通过在func1()中添加一个round()函数,'L-BFGS-B'在第一步之后停止搜索最优值并直接使用初始值[0,0]作为最优点。
这不仅限于round()。将 func1() 中的 round() 替换为 int() 也会导致相同的错误。
有谁知道这是什么原因?
非常感谢。