使用scipy.optimize进行带边界的最小二乘优化

时间:2014-07-15 08:58:26

标签: python numpy mathematical-optimization

我有一个最小二乘的优化问题,我需要帮助解决。到目前为止,我有一些代码可以执行以下功能:

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一起玩?是否有更好的解决方案来为解决方案添加界限?

2 个答案:

答案 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'

相关问题