python-lmfit“;对象对于所需数组太深“;

python-lmfit“;对象对于所需数组太深“;,python,python-2.7,optimization,scipy,Python,Python 2.7,Optimization,Scipy,我正在尝试lmfit,并将其用作下面的示例问题。在这个例子中,我只是求解系统Ax=y中的x。这里A是一个3*2数组,y是一个3*1数组。我已经将它们全部声明为数组 import numpy as np from lmfit import minimize, Parameters A = np.array([1,2,-1,3,-2,5]) A = A.reshape(3,2) y = np.array([12, 13, 21]) def residual(params, A, y, eps_y

我正在尝试lmfit,并将其用作下面的示例问题。在这个例子中,我只是求解系统Ax=y中的x。这里A是一个3*2数组,y是一个3*1数组。我已经将它们全部声明为数组

import numpy as np
from lmfit import minimize, Parameters

A = np.array([1,2,-1,3,-2,5])
A = A.reshape(3,2)
y = np.array([12, 13, 21])

def residual(params, A, y, eps_y=1):
    x = params['x'].value
    y_hat = np.dot(A, x)
    return (y - y_hat)/eps_y

x = np.array([0,0])
params = Parameters()
params.add('x', x)
out = minimize(residual, params, args=(A,y))
print out.value
运行此命令时,我得到一个错误:“ValueError:对象对于所需数组太深”。 我在这里和网上都发现了类似的问题。通常,最常引用的理由是A、x和y应该是数组而不是矩阵。同样在一些解中,x和y被要求保持为一个具有形状(len(v),)的向量。以上已经符合这些建议,但我仍然得到“ValueError:对象对于所需数组来说太深”


我已经浪费了相当多的时间试图解决这个问题,现在被难倒了。在这方面的任何帮助都是非常欢迎的

参数
的文档如下所示:

它特别指出参数的值必须是数值,而不是任何类型的
数组。因此,不要这样做:

x = np.array([0,0])
params.add('x', x)
做:

然后将残差函数更改为:

def residual(params, A, y, eps_y=1):
    x0 = params['x0'].value
    x1 = params['x1'].value
    y_hat = np.dot(A, [x0, x1])
    return (y - y_hat)/eps_y

请显示回溯(即完整的错误消息)。它应该准确地告诉您哪一行引发异常,以及它前面的调用。这将有助于缩小问题的范围。@WarrenWeckesser感谢您的评论。阿什温能够为我指明正确的方向,我也能够让它发挥作用。虽然正如我在给他的评论中提到的,对于尺寸为1300*30的A、尺寸为1300*1的y和尺寸为30*1的x,优化速度非常慢。我不知道是否还有其他库可以用于非线性约束反演,提供了不同的方法。谢谢你为我指明了正确的方向。我阅读了Parameter类的文档,但随后假设它怎么能不接受向量作为输入。我重新编码,自动指定一个向量作为minimize()的参数,并在残差函数中将其自动分解为优化参数。它现在正在工作。对于尺寸为1300*30的A、尺寸为1300*1的y和尺寸为30*1的x,优化速度非常慢。我期待着更好的表现。在尝试让它工作了近半天之后,我非常失望。分解占用了大部分额外的时间,还是
np.dot
占用了大部分时间?Ashwin感谢您的提问。I checked and minimize()每次优化大约需要4秒,而np.dot每次在“残数”函数中调用它都需要约0.00013秒。因此,对于大小为1300*30的A、大小为1300*1的y和大小为30*1的x,平均需要约33000次对残数()的调用才能找到上述问题的最小二乘解。问题本身的规模约为5000个这样的观测值,因此总反演时间约为5.5小时:(。
def residual(params, A, y, eps_y=1):
    x0 = params['x0'].value
    x1 = params['x1'].value
    y_hat = np.dot(A, [x0, x1])
    return (y - y_hat)/eps_y