2

我正在尝试 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: object too deep for required array”。我在这里和网络上发现了类似问题的实例。一般来说,最常引用的理由是 A、x 和 y 应该是数组而不是矩阵。同样在某些解决方案中,要求 x 和 y 保持为具有形状 (len(v),) 的向量。以上已经符合这些建议,但我仍然收到“ValueError:object too deep for desired array”。

我浪费了很多时间试图解决这个问题,现在我很难过。对此的任何帮助都将受到欢迎。

4

1 回答 1

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
于 2013-07-26T20:30:22.990 回答