Python LMFIT "object too deep for desired array"



我正在尝试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:对象太深,不适合所需的数组"。

我浪费了很多时间试图解决这个问题,现在却被难住了。我们非常欢迎在这方面提供任何帮助。

Parameter的文档在这里:

http://newville.github.io/lmfit-py/parameters.html#Parameter

它特别指出,参数的值必须是数值,而不是任何类型的array。因此,与其这么做:

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

do:

params.add('x0', 0)
params.add('x1', 0)

然后将残差函数更改为:

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

最新更新