首页 > 解决方案 > 计算包含矩阵的符号函数的梯度和 Hessian

问题描述

我有以下功能:

功能

我想用它做几件事:

  1. 将其转换为 SymPy 函数(完成)

    x = MatrixSymbol('x', 2, 1)
    fx = x.T * MatMul(Matrix([[1, 2], [4, 7]]), x) + x.T * Matrix([3, 5]) + 6*Identity(1)
    
    • 使用的输出display()似乎确认它正在工作:

      在此处输入图像描述

  2. 计算点 处的梯度和 Hessian 观点

    • 在这一点上,我已经尝试了以下渐变功能:

      v = list(ordered(fx.free_symbols))
      gradient = lambda f, v: Matrix([f]).jacobian(v)
      fxd = gradient(fx, v)
      

      但是,这输出[0, 0]为不正确的结果。结果应该是:

      梯度结果

    • 对于粗麻布,我使用 SymPy 的内置函数尝试了以下操作:

      v = list(ordered(fx.free_symbols))
      fxdd = hessian(fx, v)
      

      但是,这个函数给了我以下错误:

      ShapeError: Matrix size mismatch: (2, 2) + (2, 1)

      输出应该是:

      粗麻布结果

那么,我的问题是,如何执行第二步中的操作?

标签: python-3.xsympy

解决方案


您可以使用 获得渐变diff。我不确定如何在不经过的情况下获得 Hessian as_explicit

In [49]: x = MatrixSymbol('x', 2, 1)
    ...: fx = x.T * MatMul(Matrix([[1, 2], [4, 7]]), x) + x.T * Matrix([3, 5]) + 6*Identity(1)

In [50]: fx.diff(x) # gradient
Out[50]: 
⎡1  2⎤     ⎡1  4⎤     ⎡3⎤
⎢    ⎥⋅x + ⎢    ⎥⋅x + ⎢ ⎥
⎣4  7⎦     ⎣2  7⎦     ⎣5⎦

In [51]: hessian(fx.as_explicit(), x.as_explicit())  # Hessian
Out[51]: 
⎡2  6 ⎤
⎢     ⎥
⎣6  14⎦

推荐阅读