【问题标题】:Define gradient and hessian function in Python在 Python 中定义梯度和 hessian 函数
【发布时间】:2020-05-26 14:27:21
【问题描述】:

我想根据变量xy 计算以下函数的GradientHessian。任何人都可以帮忙吗?非常感谢。

我从github 中找到了一个用于计算 Rosenbrock 函数的代码。

def objfun(x,y):
    return 10*(y-x**2)**2 + (1-x)**2
def gradient(x,y):
    return np.array([-40*x*y + 40*x**3 -2 + 2*x, 20*(y-x**2)])
def hessian(x,y):
    return np.array([[120*x*x - 40*y+2, -40*x],[-40*x, 20]])

更新:

from sympy import symbols, hessian, Function, N

x, y = symbols('x y')
f = symbols('f', cls=Function)

f = (1/2)*np.power(x, 2) + 5*np.power(y, 2) + (2/3)*np.power((x-2), 4) + 8*np.power((y+1), 4)

H = hessian(f, [x, y]).subs([(x,1), (y,1)])
print(np.array(H))
print(N(H.condition_number()))

输出:

[[9.00000000000000 0]
 [0 394]]
43.7777777777778

How to get the Gradient and Hessian | Sympy https://docs.sympy.org/dev/modules/vector/fields.html

【问题讨论】:

  • 您尝试这样做时遇到了什么问题?
  • 我不知道如何计算HessianGradient函数。
  • 您想通过显示您为其他功能找到的代码告诉我们什么?你不能只用你的函数替换公式吗?
  • 然后在数学书上查。
  • 我更新了我的问题。请检查。

标签: python numpy scipy sympy


【解决方案1】:

hessian 函数用于表达式,jacobian 方法用于矩阵。

这里是你的问题的函数和变量:

>>> from sympy.abc import x, y
>>> from sympy import ordered, Matrix, hessian
>>> eq = x**2/2 + 5*y**2 + 2*(x - 2)**4/3 + 8*(y + 1)**4
>>> v = list(ordered(eq.free_symbols)); v
[x, y]

我们可以编写自己的渐变助手,它将创建一个矩阵并在其上使用jacobian 方法:

>>> gradient = lambda f, v: Matrix([f]).jacobian(v)

那么数量可以计算为:

>>> gradient(eq, v)
Matrix([[x + 8*(x - 2)**3/3, 10*y + 32*(y + 1)**3]])
>>> hessian(eq, v)
Matrix([
[8*(x - 2)**2 + 1,                  0],
[               0, 96*(y + 1)**2 + 10]])

【讨论】:

  • 谢谢。它生成:NameError: name 'ordered' is not defined,我是否错过了导入一些包?
  • 是的,@ahbon,你还应该从sympy.utilities.iterables 导入ordered
  • 我应该设置eq = x**2/2 + 5*y**2 + 2*(x - 2)**4/3 + 8*(y + 1)**4吗?如何定义eq
猜你喜欢
  • 2019-05-24
  • 1970-01-01
  • 2015-06-17
  • 2020-03-31
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多