在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()
Run Code Online (Sandbox Code Playgroud)
func0()和func1()几乎是相同的二次函数,输入值的精度差异仅为0.001.'L-BFGS-B'方法适用于func0.但是,通过在func1()中添加round()函数,'L-BFGS-B'在第一步后停止搜索最佳值,并直接使用初始值[0,0]作为最佳点.
这不仅限于round().替换func1()中的round()为int()也会导致相同的错误.
有谁知道这个的原因?
非常感谢.