我的功能如下:
def fun(A, B, C):
return numpy.sum(numpy.dot(A, B)) + numpy.sum(C)
其中A,B,C为二维numpy.array
,返回值为float
值
如何针对fun(A,B,C)
,A
或B
获取c
的偏导数?
(并且偏导数也将是numpy.array
)
我已准备好使用numpy
和scipy
这样的库,但不能使用符号库。
答案 0 :(得分:1)
对于数字差异,您可以使用numdifftools。
import numpy as np
import numdifftools
def fun(A, B, C):
return numpy.sum(numpy.dot(A, B)) + numpy.sum(C)
def fun_A(A, B, C):
J = numdifftools.Jacobian(lambda z: fun(z.reshape(A.shape), B, C).ravel())
return J(A.ravel()).reshape(A.shape)
np.random.seed(1234)
A = np.random.rand(30,30)
B = np.random.rand(30,30)
C = np.random.rand(30,30)
print fun_A(A,B,C)[3,5]
# -> 14.9081790839
# Verify result manually
Ap = A.copy()
Ap[3,5] += 1e-6
print (fun(Ap,B,C) - fun(A,B,C)) / 1e-6
# -> 14.908178855
您也可以使用后一种方法轻松烹饪您自己的幼稚数值差异例程,只需每次递增少量矩阵元素。