gpt4 book ai didi

python - Python中多元函数的向量化偏导数

转载 作者:行者123 更新时间:2023-12-03 17:49:11 25 4
gpt4 key购买 nike

alko 发布了一个惊人的答案,用于在 this thread 中以数值方式计算多元函数的偏导数| .

我现在有一个关于增强此函数以接受输入值数组的后续问题。我有一些代码,我在其中循环遍历一长串 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] .当它传递给函数 wraps 时,它似乎被破坏了.它最终传递给函数 derivative 的点是 [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])

最后一行现在返回 array([ 6., 6.])

最佳答案

我对 args[var] = x 有一个小问题:这可能会永远改变 args[var] ,并且所有值都通过引用传递,无论您的更改有多小。因此,您可能无法得到您正在寻找的确切答案。下面是一个例子:

In[67]: a = np.arange(9).reshape(3,3)
In[68]: b = a[:]
In[69]: b[0,0]=42
In[70]: a
Out[70]:
array([[42, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]])

你需要通过例如修复它:
def wraps(x):
tmp = args[var]
args[var] = x
ret= func(*args)
args[var] = tmp
return ret

此外,您可以使用 numdifftools .他们似乎知道自己在做什么。这将完成所有偏导数:
import numpy as np
import numdifftools as nd

def partial_function(f___,input,pos,value):
tmp = input[pos]
input[pos] = value
ret = f___(*input)
input[pos] = tmp
return ret

def partial_derivative(f,input):
ret = np.empty(len(input))
for i in range(len(input)):
fg = lambda x:partial_function(f,input,i,x)
ret[i] = nd.Derivative(fg)(input[i])
return ret
if __name__ == "__main__":
f = lambda x,y: x*x*x+y*y
input = np.array([1.0,1.0])
print ('partial_derivative of f() at: '+str(input))
print (partial_derivative(f,input))

最后:如果您希望您的函数采用参数数组,例如:
f     = lambda x: x[0]*x[0]*x[0]+x[1]*x[1]

然后用(删除'*')替换相应的行
ret = f___(input)

关于python - Python中多元函数的向量化偏导数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25392414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com