我正在尝试求一个标量函数相对于一个矩阵的雅可比矩阵。
w = sym.MatrixSymbol('w',2,1)
g = sym.Matrix([sym.log(1 + sym.exp(sym.MatMul(w.T,w)))])
grad_g = g.jacobian(w)这将返回一个不正确的[0,0]雅可比向量。
我在这里尝试了一个非符号实现:
w1, w2 = sym.symbols('w_1, w_2')
w = sym.Matrix([w1, w2])
g = sym.Matrix([sym.log(sym.Matrix([1]) + sym.exp(w.T * w))])
grad_g = g.jacobian(w)在那里我得到了一个错误:NotImplementedError: with 0进一步的信息。
愿意提供任何帮助的人!
发布于 2020-04-20 05:40:47
在非符号化的情况下解决了问题:
w1, w2 = sym.symbols('w_1 w_2')
w = sym.Matrix([w1, w2])
g = sym.log(1 + sym.exp(w.T * w)[0])
grad_g = sym.Matrix([g]).jacobian(w)必须索引由sym.exp返回的矩阵,而不是使1成为矩阵。
我很想知道有没有办法用sym.MatrixSymbol做到这一点,所以请让我知道
发布于 2020-04-20 06:29:06
这是你想要的吗?
In [130]: w = sym.MatrixSymbol('w',2,1)
...: g = sym.Matrix([sym.log(1 + sym.exp(sym.MatMul(w.T,w)[0, 0]))])
...: grad_g = g.jacobian(w)
In [131]: grad_g
Out[131]:
⎡ 2 2 2 2 ⎤
⎢ w₀₀ + w₁₀ w₀₀ + w₁₀ ⎥
⎢2⋅ℯ ⋅w₀₀ 2⋅ℯ ⋅w₁₀⎥
⎢────────────────── ──────────────────⎥
⎢ 2 2 2 2 ⎥
⎢ w₀₀ + w₁₀ w₀₀ + w₁₀ ⎥
⎣ ℯ + 1 ℯ + 1 ⎦注意,像exp和log这样的函数通常不需要矩阵参数。您可以使用索引,例如M[0, 0]将1x1矩阵转换为标量。
https://stackoverflow.com/questions/61311865
复制相似问题