【问题标题】:Reduce time of computing partial derivatives减少计算偏导数的时间
【发布时间】:2016-06-06 19:38:06
【问题描述】:

我正在计算具有三个未知值的函数(使用 numdifftools)的一阶和二阶偏导数,以找到我的函数具有最小值的值。这是代码:

def gaussian(x, mu, sig):
    return np.exp(-np.power(x - mu, 2.) / (2 * np.power(sig, 2.)))

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

def derivative(f,input):
    # f - function I want to derive
    # input - points where I want to calculate the derivative
    first = np.empty(len(input))
    second = np.empty(len(input))
    for i in range(len(input)):
        fg = lambda x:partial_function(f,input,i,x)
        first[i] = nd.Derivative(fg)(input[i])                 #first deriv
        second[i] = nd.Derivative(nd.Derivative(fg))(input[i]) #second deriv
    deriv = np.vstack((first,second))
    return deriv

我想最小化的函数是这样的:

func = lambda w,m,s: sum((gamma_[k,:]-w*gaussian(x,m,s))**2)

其中gamma_[k,:] 是一个已知向量。

我这样调用导数方法:

d = derivative(func,param0)

其中param0 是初始猜测(在本例中为 1x3 向量)

问题是我多次运行优化算法,每次迭代的时间很长,这是由于导数计算。我可以采用哪种方法来减少计算这些导数的时间?

【问题讨论】:

  • 我认为second[i] = nd.Derivative(nd.Derivative(fg))(input[i])应该是second[i] = nd.Derivative(fg, n=2)(input[i]) #second deriv
  • @RootTwo 是的,这就是问题所在。谢谢你的回答。
  • @RootTwo 它仍然很慢:我的优化算法的 300 次迭代大约需要 20 秒,但使用我的答案的有限差分方法,它需要不到 3 秒。

标签: python derivative


【解决方案1】:

我使用有限差分编写了自己的导数函数:

def firstDerivative(f, param):
    h = 1e-5
    deriv = np.zeros(len(param))
    for i in range(len(param)):
        rise = np.copy(param)
        rise[i] = rise[i] + h
        deriv[i] = (f(rise) - f(param))/h
    return deriv

在这个函数中,f 是我计算导数的表达式,param 是值。 这些函数的性能比我在问题中使用的函数要好得多。对于二阶导数几乎相同,只需检查:https://en.wikipedia.org/wiki/Finite_difference

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2015-05-03
    • 2018-07-12
    • 2017-06-17
    相关资源
    最近更新 更多