使用 numpy.gradient 在任何点查找线的斜率和曲线的斜率是否有效?

数据挖掘 Python scikit-学习 梯度下降 麻木的 推导
2021-10-13 05:34:40

直线的斜率和曲线的斜率有什么区别?numpy.gradient在任意点求直线的斜率和曲线的斜率是否有效?

    #slope of line at any point 
    tanθ= y2-y1/x2-x1

    #slope of curve at any point 
    tanθ  =dy/dx

使用 numpysnp.gradient()获得曲线和直线的斜率是否有效?还是只是为了找到线的斜率?

线与曲线的参考斜率

1个回答

直线斜率和曲线斜率有什么区别

这真的是一个观点问题。一条线的斜率在该线的整个跨度上是相同的,即直到该线改变方向。曲线的斜率就像数百万条细线全部连接的斜率,因此斜率仅在微小跨度上的值相同。所以我们只能谈论曲线在给定点的斜率(例如给定的 x 值),然后我们通常会谈论线在该点的梯度。


用你的话来说,由numpy.gradient计算的梯度是曲线斜率,使用连续值的差异。

但是,您可能想想象,当在越来越小的距离上测量时,您的变化会变成斜率(根据您的定义)。因此,当例如x2 - x1几乎达到零时,您的含义与dX.

10 分的粗略示例

这是一个粗略的例子numpy.gradient,其中dX具有 s 大小1(等间距值):

In [1]: import matplotlib.pyplot as plt
In [2]: import numpy as np
In [3]: N = 10                                  # Use ten samples
In [4]: x = np.linspace(0, np.pi*2, N)          # Equally spaced x values
In [5]: y = np.sin(x)                           # Corresponding sine values
In [6]: grads = np.gradient(y)                  # compute the gradients

绘制值和梯度 - 我将梯度0.5向右移动,因此它们的值与它们描述斜率的段的中间对齐:

In [7]: fig, ax = plt.subplots()           
In [8]: ax.plot(x, y, "-b", label="values")                  # the y values
        ax.plot(x + 0.5, grads, "--r", label="gradients")    # the computed gradients
        plt.legend()
In [9]: plt.show()

只有 10 个样本点的梯度

1,000,000 分的好例子

现在我们做和以前一样的例子,只用一百万个点:N = 1_000_000. 蓝线看起来更像是真正的正弦波,但红线现在以比以前更高的分辨率测量梯度,为我们提供了 1,000,000 点的精确值 - 对于蓝线的每个微小线段。

细粒度梯度

所以梯度值看起来都为零!好吧,这只是因为我们x2-x1几乎为零 ( 1 / 1e6),所以 的值y2 - y1也基本上为零!我们已经开始近似d是的dX.

让我们改变坐标轴比例,看看渐变是否仍然符合我们预期的模式,并且确实非常平滑 - 看起来像一条曲线:

细粒度渐变

好多了 :)

(注意比例差异 - 1e-6)。


以下是对真正np.gradient作用的一些解释。