如何在某些点找到曲线的斜率

数据挖掘 Python 聚类 k-均值 梯度下降 麻木的
2022-02-28 15:37:59

如何在下面曲线中以蓝色圈出的某些点找到斜率?以下两种方法是否有效?尽管他们给出了不同的结果。如何自动找到斜率在曲线中急剧变化的点,例如下图中的点 5,6

x=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ]

y=[512, 256, 128, 64 , 32 , 16 , 8  , 7  , 6  , 5  , 4  , 3  , 2  , 1  ]
  1. Numpy梯度给出以下结果

np.gradient(y)

[-256. , -192. ,  -96. ,  -48. ,  -24. ,  -12. ,   -4.5,   -1. ,-1. ,   -1. ,   -1. ,   -1. ,   -1. ,   -1. ]

我们可以使用 numpy.gradient 找到曲线的斜率吗?因为找到直线和曲线的斜率有点不同显示在这个链接中

2.使用自定义斜率功能

def slope(x1, y1, x2, y2):
    m = (y2-y1)/(x2-x1)
    return m


slope_value=[]
for i in range(len(y)):
    i += 1
    v=slope(y[i], x[i], y[i-1], x[i-1])
    print(i,v)
    slope_value.append(v)



result: [-0.00390625,  -0.0078125,  -0.015625,  -0.03125,  -0.0625,  -0.125,  -1.0,  -1.0,  -1.0,  -1.0,  -1.0,  -1.0,  -1.0]

在此处输入图像描述

1个回答

numpy 计算是正确使用的计算,但可能有点难以理解它是如何计算的

您的自定义计算意外返回了反斜率,x 和 y 值在斜率函数中反转(x1 -> y[i] 等)。斜率应该是 delta_y/delta_x

def slope(x1, y1, x2, y2):
v=slope(y[i], x[i], y[i-1], x[i-1])

此外,您正在计算 x = 1.5、2.5 等处的斜率,但 numpy 正在计算 x = 1、2、3 处的斜率

在梯度计算中,numpy 正在计算每个 x 值的梯度,方法是使用 x-1 和 x+1 值并除以 x 的差值,即 2。您正在计算 x + .5 值的倒数。

x=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ]

y=[512, 256, 128, 64 , 32 , 16 , 8  , 7  , 6  , 5  , 4  , 3  , 2  , 1  ]

麻木的答案:

[-256. , -192. ,  -96. ,  -48. ,  -24. ,  -12. ,   -4.5,   -1. ,-1. ,   -1. ,   -1. ,   -1. ,   -1. ,   -1. ]

numpy 函数中的每个计算:

-256 = (-256)/1 没有 x-1 值所以默认使用 x
-192 = (128-512)/2
-96 = (64-256)/2
...