我有一个类似这样的函数:
def fun(A, B, C):
return numpy.sum(numpy.dot(A, B)) + numpy.sum(C)
输入参数 A、B、C 是 2 维的 numpy.array
,返回值是一个 float
值。
如何求出函数 fun(A, B, C)
对于 A
、B
或 C
的偏导数?(而且这些偏导数也将是 numpy.array
)。
我准备使用像 numpy
和 scipy
这样的库,但不使用符号库。
我有一个类似这样的函数:
def fun(A, B, C):
return numpy.sum(numpy.dot(A, B)) + numpy.sum(C)
输入参数 A、B、C 是 2 维的 numpy.array
,返回值是一个 float
值。
如何求出函数 fun(A, B, C)
对于 A
、B
或 C
的偏导数?(而且这些偏导数也将是 numpy.array
)。
我准备使用像 numpy
和 scipy
这样的库,但不使用符号库。
对于数值微分,您可以使用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
您还可以通过后一种方法轻松地编写自己的朴素数值微分程序,只需要逐个将矩阵元素增加一小部分。
fun_dA
,fun_dB
和fun_dC
。或者您正在寻找任意函数fun
的通用解决方案? - Falko