在
this thread中,alko发布了一个用于计算多元函数的偏导数的非凡答案.
我现在有一个关于增强此函数以接受输入值数组的后续问题.我有一些代码,我循环遍历一大堆n维点,计算每个变量的偏导数,这在计算上非常昂贵.
使用np.vectorize向所讨论的函数进行矢量化很容易,但它会导致partial_derivative包装器出现问题:
from scipy.misc import derivative
import numpy as np
def foo(x, y):
return(x**2 + y**3)
def partial_derivative(func, var=0, point=[]):
args = point[:]
def wraps(x):
args[var] = x
return func(*args)
return derivative(wraps, point[var], dx=1e-6)
vfoo = np.vectorize(foo)
>>>foo(3,1)
>>>10
>>>vfoo([3,3], [1,1])
>>>array([10,10])
>>>partial_derivative(foo,0,[3,1])
>>>6.0
>>>partial_derivative(vfoo,0,[[3,3], [1,1]])
>>>TypeError: can only concatenate list (not "float") to list
理想情况下,最后一行应返回[6.0,6.0].在这种情况下,提供给向量化函数vfoo的两个数组基本上是成对拉链的,因此([3,3],[1,1])变换为两个点,[3,1]和[3,1].当它传递给函数包装时,这似乎会受到损害.它最终传递给函数导数的点是[3,3].另外,显然会抛出TypeError.
有没有人有任何建议或建议?有没有人需要做类似的事情?
编辑
有时我认为发布SO就是打破精神障碍所需要的.我想我已经让那些可能感兴趣的人工作了:
vfoo = np.vectorize(foo)
foo(3,1)
X = np.array([3,3])
Y = np.array([1,1])
vfoo(X, Y)
partial_derivative(foo,0,[3,1])
partial_derivative(vfoo,0,[X, Y])
最后一行现在返回数组([6.,6.])