python - 在 Python 中定义梯度和 hessian 函数
问题描述
我想计算以下函数关于变量Gradient
and的and 。任何人都可以帮忙吗?非常感谢。Hessian
x
y
我从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
如何获得梯度和 Hessian | Sympy https://docs.sympy.org/dev/modules/vector/fields.html
解决方案
有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]])
推荐阅读
- audio - bpm 的图像表示要与频谱图进行比较
- c# - 带有 Azure OAuth 的 ASP.NET Core MVC 在入口后进入无限登录循环
- matlab - bwboundaries 和轴 - Matlab
- javascript - 使用firebase在快照forEach之后调用一个函数
- javascript - 在接受数字或数组作为参数的函数内部,如何有效地操作这些参数而不管类型如何?
- javascript - 博览会永无止境,不断闪烁下载 java-script 包
- python - 如何从表单检索数据到视图
- sql - 我的查询有问题,我不知道是什么问题?
- angular - Angular - 路由路径抛出控制台错误
- python - Mask R-CNN 中的预训练权重和初始化权重是什么?