Numpy 梯度是做什么的?

所以我知道(数学)函数的梯度是什么,所以我觉得我应该知道 numpy.gradient是做什么的。但我没有。文件也没什么帮助:

返回 N 维数组的梯度。

数组的渐变是什么? 什么时候 numpy.gradient有用?

91474 次浏览

也在文件中:

>>> y = np.array([1, 2, 4, 7, 11, 16], dtype=np.float)
>>> j = np.gradient(y)
>>> j
array([ 1. ,  1.5,  2.5,  3.5,  4.5,  5. ])
  • 梯度定义为(y的变化)/(x的变化)。

  • 这里的 x是列表索引,因此相邻值之间的差为1。

  • 在边界处,计算第一个差。这意味着在数组的每一端,给出的梯度是简单的,即两端值之间的差(除以1)

  • 在边界之外,特定索引的梯度是通过取两边值之间的差除以2得到的。

因此,上面的 y的梯度是这样计算的:

j[0] = (y[1]-y[0])/1 = (2-1)/1  = 1
j[1] = (y[2]-y[0])/2 = (4-1)/2  = 1.5
j[2] = (y[3]-y[1])/2 = (7-2)/2  = 2.5
j[3] = (y[4]-y[2])/2 = (11-4)/2 = 3.5
j[4] = (y[5]-y[3])/2 = (16-7)/2 = 4.5
j[5] = (y[5]-y[4])/1 = (16-11)/1 = 5

例如,您可以找到结果数组中所有绝对值的最小值,以找到曲线的转折点。


1 在文档的示例中,这个数组实际上被称为 x,为了避免混淆,我将其更改为 y

把 N 维数组想象成一个矩阵。 那么梯度就是矩阵微分

有关详细说明,请参阅 matlab 文档中的 渐变描述。

梯度是使用内部的中心差和 最初的分歧在边界上。

还有

默认距离为1

这个 手段在内部被计算为

enter image description here

其中 h = 1.0

在边界

enter image description here

事情是这样的。泰勒级数展开式指导我们如何近似导数,给定在接近点的值。最简单的来自 C ^ 2函数(两个连续导数)的一阶泰勒级数展开式..。

  • F (x + h) = f (x) + f’(x) h + f”(xi) h ^ 2/2。

可以求 f’(x) ..。

  • F’(x) = [ f (x + h)-f (x)]/h + O (h)。

我们能做得更好吗? 是的,确实如此。如果我们假设 C ^ 3,那么泰勒展开是

  • F (x + h) = f (x) + f’(x) h + f”(x) h ^ 2/2 + f’”(xi) h ^ 3/6
  • F (x-h) = f (x)-f’(x) h + f”(x) h ^ 2/2-f’”(xi) h ^ 3/6。

减去这些(h ^ 0和 h ^ 2项都不算!) ,求出 f’(x) :

  • F’(x) = [ f (x + h)-f (x-h)]/(2h) + O (h ^ 2)。

所以,如果我们有一个定义在等距离分区上的离散函数: X = x _ 0,x _ 0 + h (= x _ 1) ,... ... ,x _ n = x _ 0 + h * n,那么 numpy 梯度将产生一个“导数”数组,使用两端的一阶估计和中间较好的估计。

例1. 如果没有指定任何间距,则假定间隔为1

f = np.array([5, 7, 4, 8])

你的意思是 f (0) = 5,f (1) = 7,f (2) = 4,f (3) = 8

np.gradient(f)

将是: f’(0) = (7-5)/1 = 2,f’(1) = (4-5)/(2 * 1) = -0.5,f’(2) = (8-7)/(2 * 1) = 0.5,f’(3) = (8-4)/1 = 4。

示例2. 如果指定单个间距,则间距是均匀的,但不是1。

例如,如果您调用

np.gradient(f, 0.5)

这意味着 h = 0.5,而不是1,也就是说,函数实际上是 f (0) = 5,f (0.5) = 7,f (1.0) = 4,f (1.5) = 8。最终的结果是用 h = 0.5代替 h = 1,所有的结果都会翻倍。

例子3。假设离散化函数 f (x)不是定义在均匀间隔的区间上,例如 f (0) = 5,f (1) = 7,f (3) = 4,f (3.5) = 8,那么有一个更混乱的离散化微分函数,数字梯度函数使用,你将通过调用

np.gradient(f, np.array([0,1,3,3.5]))

最后,如果您的输入是一个2d 数组,那么您将考虑一个在网格上定义的 x,y 的函数 f。数字梯度将输出 x 和 y 中“离散化”的偏导数阵列。