【问题标题】:Why is my python lmfit leastsq fitting function being passed too many arguments?为什么我的 python lmfit leastsq 拟合函数被传递了太多参数?
【发布时间】:2014-07-23 20:52:01
【问题描述】:

我试图寻找和我犯同样错误的人,但没有快乐!这也是我的第一篇文章,所以如果解释或指导不当,我深表歉意。欢迎咨询。

我要解决的问题是:通过测量到多个已知参考点的距离来找到某种接收器的位置。这是基本的三边测量,我使用最小二乘法来做到这一点。

我已经成功地使用了 scipy.optimize lesatsq 函数来做到这一点,所以我很确定我的拟合函数有效。但是,我希望能够使用 lmfit Python 包提供的一些额外功能,并且我正在努力将它翻译过来。完整的尝试代码在这里:http://pastebin.com/4xbfkaCm

lmfit 最小化函数设置对我的拟合函数(称为 residualfunct)的调用如下,其中 stationarray 是一个包含站点位置和范围的 numpy 数组,params 是要在拟合函数中使用的参数字典

position = minimize(residualfunct, params, args=(stationarray))

我的拟合函数定义为

def residualfunct(params, stationarray):

    X = params['solutionX'].value
    Y = params['solutionY'].value
    Z = params['solutionZ'].value
    result = numpy.array([s[3] - linalg.norm(array((X,Y,Z))-array((s[0],s[1],s[2]))) for s in stationarray])
    print result
    return result

当我运行这段代码时,我得到了 TypeError:

residualfunct() 正好接受 2 个参数(给定 5 个)。

由于这个调用是由最小化函数进行的,我看不出我对此有什么控制权。我只能想象这是因为我将 np.array 作为参数传递而引发的,但这似乎是不可避免的。谁能看到我做错了什么?

谢谢

【问题讨论】:

  • 您需要显示完整的回溯,因为它将显示调用函数的内容以及传递的内容。

标签: python scipy least-squares trilateration


【解决方案1】:

在对minimize的调用中,更改

args=(stationarray)

args=(stationarray,)

args 必须是一个序列(通常是一个元组),其元素是传递给函数的参数。要创建长度为 1 的元组,您需要额外的逗号。写args=(stationarray)时(不加逗号),括号没有作用,和写args=stationarray一样。 minimize 然后将函数调用为residualfunct(params, stationarray[0], stationarray[1], ...),这导致您报告的错误。

【讨论】:

  • 非常感谢,这非常有效,并且(在修复了我随后发现的所有其他问题之后 :))代码现在可以按照我的需要运行。如果我有足够的声誉,我会投票。
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多