我正在尝试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:对象太深了所需的数组”。
我浪费了相当多的时间来解决这个问题,现在我很难过。对此的任何帮助都将非常受欢迎。
答案 0 :(得分:1)
Parameter
的文档在这里:
http://newville.github.io/lmfit-py/parameters.html#Parameter
它明确指出参数的值必须是数值,而不是任何类型的array
。所以不要这样做:
x = np.array([0,0])
params.add('x', x)
做的:
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