我有一个优化问题(1d),用两种方式编码-一种使用for循环,另一种使用numpy数组。for循环版本工作正常,但numpy版本失败。实际上,它是一个有点复杂,它可以与不同的起点(!!)或者如果我选择其他优化算法,如CG。
这两个版本(函数和渐变)给出了相同的结果,据我所知,返回的类型也是相同的。
这是我的例子,我错过了什么?
import numpy as np
from scipy.optimize import minimize
# local params
v1 = np.array([1., 1.])
v2 = np.array([1., 2.])
# local functions
def f1(x):
s = 0
for i in range(len(v1)):
s += (v1[i]*x-v2[i])**2
return 0.5*s/len(v1)
def df1(x):
g = 0
for i in range(len(v1)):
g += v1[i]*(v1[i]*x-v2[i])
return g/len(v1)
def f2(x):
return 0.5*np.sum((v1*x-v2)**2)/len(v1)
def df2(x):
return np.sum(v1*(v1*x-v2))/len(v1)
x0 = 10. # x0 = 2 works
# tests...
assert np.abs(f1(x0)-f2(x0)) < 1.e-6 and np.abs(df1(x0)-df2(x0)) < 1.e-6 \
and np.abs((f1(x0+1.e-6)-f1(x0))/(1.e-6)-df1(x0)) < 1.e-4
# BFGS for f1: OK
o = minimize(f1, x0, method='BFGS', jac=df1)
if not o.success:
print('FAILURE', o)
else:
print('SUCCESS min = %f reached at %f' % (f1(o.x[0]), o.x[0]))
# BFGS for f2: failure
o = minimize(f2, x0, method='BFGS', jac=df2)
if not o.success:
print('FAILURE', o)
else:
print('SUCCESS min = %f reached at %f' % (f2(o.x[0]), o.x[0]))
我得到的错误是
A1 = I - sk[:, numpy.newaxis] * yk[numpy.newaxis, :] * rhok
IndexError: invalid index to scalar variable.
但我并没有真正帮助我,因为它可以与其他一些起始值一起工作。
我正在使用全新的Python安装(Python 3.5.2,scipy 0.18.1和numpy 1.11.3)。
1条答案
按热度按时间z8dt9xmd1#
求解器期望雅可比df2的返回值与其输入x的形状相同。即使你在这里传递了一个标量,它实际上也被转换成了一个单一的元素ndarray。因为你使用了np.sum,你的结果变成了标量,这会导致奇怪的事情发生。
用np.array封装df2的标量结果,您的代码应该可以工作。