Используя sympy, взять матрицу якобиана wrt symboli c функции, которая возвращает скаляр - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь взять якобиан скалярной функции относительно матрицы

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], что неверно.

Я попытался не символьная c реализация здесь:

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: с 0 дополнительной информацией.

Буду рад любой помощи!

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Это то, что вы хотите?

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 ⎦

Обратите внимание, что в функциях sympy, таких как exp и log, обычно не ожидаются матричные аргументы. Вы можете использовать индексирование, например, M[0, 0] для преобразования матрицы 1x1 в скаляр.

0 голосов
/ 20 апреля 2020

понял это для случая, не являющегося символом c:

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 матрицей.

I Хотелось бы узнать, есть ли способ сделать это с помощью sym.MatrixSymbol, поэтому дайте мне знать

...