我有一个最小二乘的优化问题,我需要帮助解决。到目前为止,我有一些代码可以执行以下功能:
shankarFunc = lambda p, x: p[0] * (1 - np.exp(-1 * ((x / p[1]) ** p[2])))
errFunc = lambda p, x, y: shankarFunc(p, x) - y
x0 = [max(y), 100 / max(y), 1]
p1, success = optimize.leastsq(errFunc, x0, args=(x, y))
这个几乎适用于所有情况。它对于某些数据没有收敛,因此我需要对拟合参数进行 边界的最小二乘拟合。然后我注意到optimize.minimize有边界,并尝试使用它(最小化错误函数)。
shankarFunc = lambda p, x: p[0] * (1 - np.exp(-1 * ((x / p[1]) ** p[2])))
errFunc = lambda p, x, y: shankarFunc(p, x) - y
x0 = [max(y), 100 / max(y), 1]
b0 = (0, max(y) + 2)
b1 = (1e-4, 5)
b2 = (0, None)
p1 = optimize.minimize(errFunc, x0, args=(x, y), bounds=(b0, b1, b2))
这给我带来了问题,因为它返回以下错误:
File "C:\Anaconda\lib\site-packages\scipy\optimize\optimize.py", line 610, in
approx_fprime
grad[k] = (f(*((xk + d,) + args)) - f0) / d[k]
ValueError: setting an array element with a sequence.
我已尝试输入任意数量的变体,但无法摆脱它。
如何让optimize.minimize一起玩?是否有更好的解决方案来为解决方案添加界限?
答案 0 :(得分:2)
minimize
优化标量函数,返回一个数组(因为leastsq
除外)。要使用minizmize,请尝试将您的功能更改为:
errFunc = lambda p, x, y: np.sum((shankarFunc(p, x) - y)**2)
您还可以使用lmfit http://lmfit.github.io/lmfit-py/,它允许使用带有绑定转换的leastsq。
答案 1 :(得分:1)
如果没有更多信息,我建议您尝试以下部分或全部内容:
您的errFunc
是返回标量还是列表/数组?我花了一些时间让scipy.optimize.minimize工作,看着我的代码,我的错误函数返回一个标量。
使优化方法显式化,以便它知道使用边界,例如method='L-BFGS-B'