用Python中的Levenberg-Marquardt算法优化方程组

时间:2016-04-12 15:25:06

标签: python numpy scipy levenberg-marquardt

我希望使用scipy中的a,b,c方法来优化三个参数1*a+2*b+3*c = x1 4*a+5*b+6*c = x2 。我所拥有的是这两个方程式。

a,b,c

分析上这组方程是不确定的,但在数字上我试图找到[2,2]来最小化测量1*a+2*b+3*c - 2 = 0 4*a+5*b+6*c - 2 = 0 给定结果的误差:

def function(a,b,c,t):
    return np.array([1*a+2*b+3*c+t[1],4*a+5*b+6*c+t[1]])

a0 = 1
b0 = 1
c0 = 1
measdata = np.array([2,2])
t = [1,2]

def residual(x0,measdata,t):
    return measdata - function(x0[0],x0[1],x0[2],t)

erg = optimize.leastsq(func=residual,x0=(a0,b0,c0),args=(measdata,t))

因此我写了一些代码。

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-296-ab0fc90a2253> in <module>()
     14     return result - function(x0[0],x0[1],x0[2],t)
     15 
---> 16 erg = optimize.leastsq(func = residual, x0 = (a0,b0,c0) , args=(result,t), maxfev=10000)
     17 
     18 function(erg[0][0],erg[0][1])

    //anaconda/lib/python3.5/site-packages/scipy/optimize/minpack.py in leastsq(func, x0, args, Dfun, full_output, col_deriv, ftol, xtol, gtol, maxfev, epsfcn, factor, diag)
        378     m = shape[0]
        379     if n > m:
    --> 380         raise TypeError('Improper input: N=%s must not exceed M=%s' % (n, m))
        381     if epsfcn is None:
        382         epsfcn = finfo(dtype).eps
    TypeError: Improper input: N=3 must not exceed M=2

它总是导致:

{{1}}

如何让它找到最低限度?我知道它只是当地的最低限度,但我会很高兴。

1 个答案:

答案 0 :(得分:1)

错误告诉您您已经知道的内容,即系统未确定,n > m是参数数量,False约束数量。

如果您修复其中一个参数以使def residual(x0,measdata,t): return measdata - function(x0[0],x0[1],x0[2],t) erg = optimize.leastsq(func=residual,x0=(a0,b0,c0),args=(measdata,t)) def residual(x0,measdata,t): # we fix the value of `c` here return measdata - function(x0[0],x0[1],5,t) # only two parameters for `x0` erg = optimize.leastsq(func=residual,x0=(a0,b0),args=(measdata,t)) ,则代码将停止投诉。例如,更改

x1, res, rnk, s = np.linalg.lstsq(A, b)

{{1}}

要回答你如何能做你想做的事,我不确定是否可以用scipy完成。我发现这个issue说scipy无法处理欠定系统:

  

有趣的是,我假设MINPACK例程也处理m&lt; ñ,但显然不是。他们不这样做的原因可能是m&lt; n最小值是一些点,这会导致终止条件出现问题。

     

所有人都有兴趣为欠定最小二乘问题添加一个小规模求解器。

即使该帖子是3年前发布的,我仍然无法在文档中找到任何证据表明scipy可以做你想做的事情。然而,我找到了一个声称you can solve for an underdetermined matrix的答案,但我还没有完全掌握数学,以确定它是否适用于你的情况。由于我发现很难总结这篇文章,我只想引用一些看似最重要的部分。

  

如果 A·x = b 未定,

{{1}}
     

将选择 x' 的解决方案,最小化 || x || L2   受 || A·x - b || L2 = 0 的约束。有时候是这样的   不是我们正在寻找的特定解决方案,但我们可以   线性转换它以获得我们想要的东西。为了做到这一点,我们会   首先计算 A right null space,其中   表征 A·x =的所有可能解决方案的空间   的 B'/强> 的。我们可以使用rank-revealing QR decomposition

来获取此信息