如何用Python检测图形的转折点

如何用Python检测图形的转折点,python,python-3.x,Python,Python 3.x,我有一张x和y值的指数衰减图,下图中标记了一个转折点。我的问题是,无论有无噪声,我如何使用Python检测转折点的区域或中间点?这些值在本文件中给出的csv文件中 更新:这是一张更清晰的图表,显示了转折点/变化点 一种简单的方法是使用np.gradient和阈值 将numpy导入为np 从matplotlib导入pyplot作为plt #生成一些玩具数据 n=600 t=np.linspace(0600,n) y=(300*np.exp(-0.1*t)+1)+20*(np.random.rand

我有一张x和y值的指数衰减图,下图中标记了一个转折点。我的问题是,无论有无噪声,我如何使用Python检测转折点的区域或中间点?这些值在本文件中给出的csv文件中

更新:这是一张更清晰的图表,显示了转折点/变化点


一种简单的方法是使用
np.gradient
和阈值

将numpy导入为np
从matplotlib导入pyplot作为plt
#生成一些玩具数据
n=600
t=np.linspace(0600,n)
y=(300*np.exp(-0.1*t)+1)+20*(np.random.random(n))
#得到梯度
dy=np.梯度(y)
#搜索阈值第一次出现的梯度:
thresh=0.01
idx_thresh=np.argmax(dy>thresh)
#y[idx_thresh]将是“转折点”
#形象化
plt.plot(t,y,'b',label='y')
plt.plot(t,dy,'g',label='dy')
plt.plot(t[idx_thresh:],y[idx_thresh:],'r',label=f'y[dy>{thresh}])
plt.legend()

但是,找到阈值的地方很大程度上取决于噪声!因此,您可能需要进行一些平滑处理,例如

来自scipy.signal import savgol_过滤器
y_filtered=savgol_filter(y,11,3)
dy_f=np.梯度(y_过滤)
idx_thresh=np.argmax(dy_f>thresh)
plt.plot(t,y_过滤,'k',label='y_过滤')
plt.plot(t,dy_f,'g',label='dy_f')
plt.plot(t[idx_thresh:],y[idx_thresh:],'r',label=f'y[dy>{thresh}])
plt.legend()


请注意,渐变现在更加平滑重要提示:这取决于输入数据的过滤器是否合适

请你澄清“转折点”到底是什么?你能给出它的数学定义吗?这会有很大帮助。此外,很难看到您所附图表上的数据发生了什么变化。请尽可能清楚地显示“转折点”。@我这里指的转折点是图形的弯曲,大约在X的3到10之间,忽略噪音。不幸的是,我没有任何数学公式来支持这个模式,但可能附加的数据可以给你一张图片。你试过什么吗?使用并设置阈值来计算渐变怎么样?虽然…@MrFuppes我是Python的新手,但您可能需要应用某种平滑内核来消除噪声,因此演示代码将有助于从感谢您的代码开始。现在还不清楚,哪个值/变量代表转折点?我在第一个代码部分添加了一条注释
idx_thresh
标记“转折点”的索引,因为此时
dy
(类似于一阶导数,但不是数学意义上的)大于阈值
thresh
。也许可以稍微玩弄一下这些参数来获得一种感觉;-)