我正在尝试编写一个函数来实现最小二乘回归的“有效方差法”。在此公式中,需要在最小二乘和中使用模型的导数。我试图编写该函数,以便可以将一个用 sympy 编写的模型交给它,以便该函数自动将其微分为正确的变量,并将其提供给 scipy 最小化函数以在多个变量中最小化它。
尝试此操作时遇到很多错误,例如:
当我尝试使用简单的lambdaify函数时,“_lambdify generated() 缺少 1 个必需的位置参数”,例如:
A = sp.Function("A")
x, y = sp.symbols("x y")
A = 1 + x**2 + y**2
g = sp.lambdify([x, y], A, "numpy")
minimize(g, [1, 1])
和 当我尝试使用 sp.N 进行数值评估时,“ufunc 'isfinite' 不支持输入类型,并且根据转换规则 ''safe'',无法将输入安全地强制为任何受支持的类型”然后我可以将函数返回到最小化器吗,以类似于此的方式(我想):
minimize(lambda t: sp.N((t + x).subs(x, sp.pi)), [1])
(在这种特定情况下返回“'numpy.ndarray'对象没有属性'subs'”,但在我的函数中实现时出现上述错误)。
问题是
g
期望接收两个单独的参数,x
和 y
,但是 scipy.optimize.minimize
需要一个接受单个数组参数的可调用函数,比如 z
。一个简单的解决方案是创建一个新函数 h
,它接受单个参数 z
,并在调用 x
之前将其拆分为参数 y
和 g(x, y)
。然后你可以使用minimize
来优化h
。
from sympy import symbols, lambdify
from scipy import optimize
x, y = symbols("x y")
A = 1 + x**2 + y**2
g = lambdify([x, y], A, "numpy")
# this is shorthand for
# def h(z):
# x, y = z
# return g(x, y)
# res = optimize.minimize(h, [1, 1])
res = optimize.minimize(lambda z: g(*z), [1, 1])