如何通过将多元 sympy 函数转换为 lambda 函数来最小化它?

问题描述 投票:0回答:1

我正在尝试编写一个函数来实现最小二乘回归的“有效方差法”。在此公式中,需要在最小二乘和中使用模型的导数。我试图编写该函数,以便可以将一个用 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'”,但在我的函数中实现时出现上述错误)。

python numpy lambda scipy sympy
1个回答
0
投票

问题是

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])
© www.soinside.com 2019 - 2024. All rights reserved.