numpy 如何通过将一个多变量sympy函数转换为一个lambda函数来最小化它?

jchrr9hc  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(101)

我试图写一个函数,实现最小二乘回归的“有效方差法”。在这个公式中,模型的导数需要在最小二乘和中使用。我试图写这个函数,这样人们就可以把一个用symy写的模型交给它,这样函数就可以自动将其区分为正确的变量,并将其给予scipy最小化函数,以在多个变量中最小化它。
我在尝试这个时遇到了很多错误,例如:
当我尝试使用simpy mandify函数时,“_mandifygenerated()missing 1 required positional argument”,比如:

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])

字符串
和“ufunc 'isfinite' not supported for the input types,and the inputs could not be safely coerced to any supported types according to casting rule ''safe''"当我尝试使用sp.N来尽可能简单地对函数进行数值评估时,我然后以类似于以下的方式返回到最小化器(我假设):

minimize(lambda t: sp.N((t + x).subs(x, sp.pi)), [1])


(在这个特定的情况下,它返回“'numpy.ndarray' object has no attribute 'subs'”,但在我的函数中实现时会出现上述错误)。

63lcw9qa

63lcw9qa1#

问题是g期望接收两个单独的参数,xy,但scipy.optimize.minimize需要一个接受单个数组参数的可调用对象,一个简单的解决方案是创建一个新的函数h,它接受一个参数z,并将其拆分为参数xy。调用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])

字符串

相关问题