【问题标题】:Calculating gradient with NumPy使用 NumPy 计算梯度
【发布时间】:2013-04-11 07:46:20
【问题描述】:

我真的不明白numpy.gradient 函数的作用以及如何使用它来计算多变量函数梯度

比如我有这样一个功能:

def func(q, chi, delta):
    return q * chi * delta

我需要计算它的 3 维梯度(换句话说,我想计算关于所有变量(q、chi、delta)的偏导数)。

如何使用 NumPy 计算这个梯度?

【问题讨论】:

    标签: python numpy scipy gradient


    【解决方案1】:

    问题是,numpy 不能直接给你导数,你有两个选择:

    使用 NUMPY

    你本质上要做的,是在三个维度上定义一个网格,并在这个网格上评估函数。之后,您将这个函数值表提供给numpy.gradient,以获得一个数组,其中包含每个维度(变量)的数值导数。

    来自here的示例:

    from numpy import *
    
    x,y,z = mgrid[-100:101:25., -100:101:25., -100:101:25.]
    
    V = 2*x**2 + 3*y**2 - 4*z # just a random function for the potential
    
    Ex,Ey,Ez = gradient(V)
    

    没有 NUMPY

    您也可以使用centered difference quotient 自己计算导数。

    本质上,numpy.gradientis doing 用于预定义网格的每个点。

    【讨论】:

    • 谢谢,斯特凡!事实上,我了解如何手动计算导数(没有任何框架),但我无法理解 np.gradient 是如何工作的。以前我为此目的使用了 C++ 与 gsl 的组合,但这种方法需要太多的编码。
    • 准确地说,公式就是numpy.diff所做的; numpy.gradient 类似,但在边界处有特殊行为。
    • @Mark: numpy.gradientnumpy.diff 更像这个公式(中心差商,$+\Delta x$ 和 $-\Delta x$)
    • 它们非常相似。 gradient 确实使用了 at 网格点的中心差异,这很相似,但对边界的处理方式不同。 diff 可以说是得到了中间between网格点的中心差(delta半个网格间距),并且没有特别处理边界,只是让渐变网格小了1个点.它们都遵循表达式,但具有不同的评估点和增量,以及不同的边界行为。由于答案没有提到如何处理任何这些,我想这是更相似的主观......
    【解决方案2】:

    Numpy 和 Scipy 用于数值计算。由于要计算解析函数的梯度,因此必须使用支持符号数学的 Sympy 包。微分解释here(实际可以在左下角的web控制台中使用)。

    你可以在 Ubuntu 下安装 Sympy

    sudo apt-get install python-sympy
    

    或者在任何带有pip的Linux发行版下

    sudo pip install sympy
    

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        你可以使用scipy.optimize.approx_fprime

        f = lambda x: x**2
        approx_fprime(np.array([2]), f, epsilon=1e-6)  # array([ 4.000001])
        

        【讨论】:

          【解决方案5】:

          Numpy 不直接支持梯度计算而不创建整个点网格。相反,我会使用autodifferentiation 请参阅https://code.activestate.com/recipes/580610-auto-differentiation/ 了解如何在 Python 中执行此操作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-02-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-27
            • 1970-01-01
            相关资源
            最近更新 更多