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

用Python中的Levenberg-Marquardt算法优化方程组,python,numpy,scipy,levenberg-marquardt,Python,Numpy,Scipy,Levenberg Marquardt,我希望使用scipy中的scipy.optimize.leastsq()方法来优化三个参数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+

我希望使用scipy中的
scipy.optimize.leastsq()
方法来优化三个参数
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
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
14返回结果-函数(x0[0],x0[1],x0[2],t)
15
--->16 erg=optimize.leastsq(func=残差,x0=(a0,b0,c0),args=(结果,t),maxfev=10000)
17
18函数(erg[0][0],erg[0][1])
//anaconda/lib/python3.5/site-packages/scipy/optimize/minpack.py在leastsq中(func、x0、args、Dfun、full_输出、col_deriv、ftol、xtol、gtol、maxfev、epsfcn、factor、diag)
378米=形状[0]
379如果n>m:
-->380 raise TypeError('不正确的输入:N=%s不能超过M=%s'(N,M))
381如果epsfcn为无:
382 epsfcn=finfo(dtype).eps
类型错误:输入不正确:N=3不得超过M=2

我如何让它找到最小值?我知道这只是一个局部最小值,但我会很高兴的。

错误告诉您您已经知道的,即系统未充分确定,
n
是参数的数量,
m
是约束的数量

如果您修复其中一个参数,使
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))

为了回答这个问题,你如何做你想做的事,我不确定是否可以用scipy来做。我发现scipy不能处理不确定的系统:

有趣的是,我假设MINPACK例程也能处理m 所以,对于为欠定最小二乘问题添加一个小规模的解算器,毕竟会有一些兴趣

尽管那篇文章是3年前写的,但我仍然无法在文档中找到任何证据证明scipy可以做你想做的事情。然而,我发现了一个如此令人信服的答案,但我还没有完全掌握数学知识,以确定它是否适用于你的案例。因为我觉得很难对这篇文章进行总结,所以我将引用最重要的部分

A·x=b被低估的情况下

x1, res, rnk, s = np.linalg.lstsq(A, b)
将选择一个将| |x最小化|L2的解决方案 受制于|A·x-b|L2=0。这种情况会发生 不是我们正在寻找的特定解决方案,但我们可以 线性变换它以得到我们想要的。为了做到这一点,我们将 首先计算A的 刻画A·x的所有可能解的空间= b。我们可以使用


错误是告诉您您已经知道的,即系统未充分确定,
n
是参数的数量,
m
是约束的数量

如果您修复其中一个参数,使
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))

为了回答这个问题,你如何做你想做的事,我不确定是否可以用scipy来做。我发现scipy不能处理不确定的系统:

有趣的是,我假设MINPACK例程也能处理m 所以,对于为欠定最小二乘问题添加一个小规模的解算器,毕竟会有一些兴趣

尽管那篇文章是3年前写的,但我仍然无法在文档中找到任何证据证明scipy可以做你想做的事情。然而,我发现了一个如此令人信服的答案,但我还没有完全掌握数学知识,以确定它是否适用于你的案例。因为我觉得很难对这篇文章进行总结,所以我将引用最重要的部分

A·x=b被低估的情况下

x1, res, rnk, s = np.linalg.lstsq(A, b)
将选择一个将| |x最小化|L2的解决方案 受制于|A·x
-b|L2=0。这种情况会发生 不是我们正在寻找的特定解决方案,但我们可以 线性变换它以得到我们想要的。为了做到这一点,我们将 首先计算A的 刻画A·x的所有可能解的空间= b。我们可以使用


请添加完整的错误回溯,而不仅仅是最后一行。请添加完整的错误回溯,而不仅仅是最后一行。非常感谢,这帮了大忙!非常感谢,这帮了大忙!