使用numpy.array作为输入的函数的偏导数

3

我有一个类似这样的函数:

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) 对于 ABC 的偏导数?(而且这些偏导数也将是 numpy.array)。

我准备使用像 numpyscipy 这样的库,但不使用符号库。


对于这个特定的函数,您可以手动编写导数并实现三个函数fun_dAfun_dBfun_dC。或者您正在寻找任意函数fun的通用解决方案? - Falko
我在那里做了一个简单的例子,但我想要使用的函数相当复杂。我无法通过分析得到导数。我希望得到一个更一般的解决方案。 - theincluder
1个回答

3

对于数值微分,您可以使用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

您还可以通过后一种方法轻松地编写自己的朴素数值微分程序,只需要逐个将矩阵元素增加一小部分。


我已经尝试过了。看起来可以工作,但是非常慢。有没有更高效的方法? - theincluder
1
这是高效的。对于NxN矩阵条目的数值微分不可避免地需要至少评估N^2次函数 - 没有其他方法。你唯一能做的就是加速函数的评估。 - pv.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接