2014-10-02 67 views
2

函數的偏導數我有這樣的功能:與numpy.array輸入

def fun(A, B, C): 
    return numpy.sum(numpy.dot(A, B)) + numpy.sum(C) 

其中A,B,C是2維numpy.array,並且返回值是一個float

如何獲得關於ABcfun(A,B,C)的偏導數? (和偏導數也將numpy.array

我已經準備好使用libaries像numpyscipy,而不是象徵性的圖書館。

+0

對於這個特定的功能,你可以手工編寫衍生物並實現三個函數fun_dA,fun_dB和fun_dC。或者你正在尋找一個通用的解決方案來實現任意函數'fun'? – Falko 2014-10-02 07:30:48

+0

我在那裏做了一個簡單的例子,但我想要使用的功能非常複雜。我無法從分析中獲得衍生物。我想要比較一般的解決方案 – theincluder 2014-10-02 07:33:29

回答

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 

你也可以很容易地只是通過少量的增加同時每個元素煮了使用後一種方法自己天真的數值分化程序。

+0

我試過了。它看起來像它的工作,但非常緩慢。有沒有什麼有效的方法? – theincluder 2014-10-04 06:36:35

+0

這是高效的。對N×N矩陣條目的數值區分不可避免地需要對函數進行至少N^2次的評估---這是沒有辦法的。你唯一能做的就是加快評估你的功能。 – 2014-10-09 15:24:42