Якобианская матрица: TypeError: объект 'function' не поддерживает назначение элементов - PullRequest
0 голосов
/ 25 января 2020

Я управляю библиотекой автограда и вычисляю матрицу Якоби вектор-функции f и хочу вычислить матрицу Якоби, вычисленную в точке x = (-1,0.2,0.3)

import autograd.numpy as np
from autograd import grad, jacobian

def f(x):
    f = np.zeros(len(x))
    f[0] = np.sin(x[0])+x[1]**2 +np.log(x[2])-7 
    f[1] = 3.0*x[0] + 2.0**x[1] - x[2]**3 + 1.0
    f[2] = x[0] + x[1] + x[2] - 5.0
    return f
x = np.array([-1.0,0.2,0.3])
gradient_cost = grad(f)
jacobian_cost = jacobian(f)

gradient_cost(x)
jacobian_cost(np.array([x,x,x]))

и выдает мне следующую ошибку:

jacobian_cost(np.array([x,x,x]))
C:\ProgramData\Anaconda3\lib\site-packages\autograd\tracer.py:48: RuntimeWarning: invalid value encountered in log
  return f_raw(*args, **kwargs)
Traceback (most recent call last):

  File "<ipython-input-94-f5cd2527501d>", line 1, in <module>
    jacobian_cost(np.array([x,x,x]))

  File "C:\ProgramData\Anaconda3\lib\site-packages\autograd\wrap_util.py", line 20, in nary_f
    return unary_operator(unary_f, x, *nary_op_args, **nary_op_kwargs)

  File "C:\ProgramData\Anaconda3\lib\site-packages\autograd\differential_operators.py", line 57, in jacobian
    vjp, ans = _make_vjp(fun, x)

  File "C:\ProgramData\Anaconda3\lib\site-packages\autograd\core.py", line 10, in make_vjp
    end_value, end_node =  trace(start_node, fun, x)

  File "C:\ProgramData\Anaconda3\lib\site-packages\autograd\tracer.py", line 10, in trace
    end_box = fun(start_box)

  File "C:\ProgramData\Anaconda3\lib\site-packages\autograd\wrap_util.py", line 15, in unary_f
    return fun(*subargs, **kwargs)

  File "<ipython-input-90-1d8956a98276>", line 3, in f
    f[0] = np.sin(x[0])+x[1]**2 +np.log(x[2])-7

TypeError: 'function' object does not support item assignment

1 Ответ

0 голосов
/ 30 января 2020

Из учебника Autograd :

Некоторые вещи еще предстоит реализовать. Например, мы поддерживаем индексирование (x = A [i, j,:]), но не присваивание (A [i, j] = x) в массивах, которые дифференцируются по.

Вместо этого вы можете вернуть что-то вроде

return np.array([np.sin(x[0])+x[1]**2 +np.log(x[2])-7, 3.0*x[0] + 2.0**x[1] - x[2]**3 + 1.0, x[0] + x[1] + x[2] - 5.0])

, которое вы можете принять как якобиан.

...