我有描述这样的系列的数据:
我对计算强烈下降的起点和终点感兴趣。像那样:
因此,我计算了函数的二阶导数,并在出现最小值最小值(开始减小)和最大值最大值时得到了分数。
但是我在大多数情况下所获得的类似于:
我哪里错了?
这是我的python代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import InterpolatedUnivariateSpline
# set x and y
y = data_series
x = range(len(data_series))
# interpolation
f = InterpolatedUnivariateSpline(x, y)
# gen function points
new_x = np.linspace(min(x), max(x), num=1000, endpoint=True)
new_y = f(new_x)
# calculate second derivative
y_df1 = np.insert(np.diff(y), 0, 0)
y_df2 = np.insert(np.diff(y_df1), 0, 0)
# points where the decrease starts and ends
# (where the second derivative is minimum and maximum)
x_dec = np.where(y_df2 == min(y_df2))[0][0]
x_inc = np.where(y_df2 == max(y_df2))[0][0]
# plot
plt.plot(new_x, new_y, 'b', lw=3, alpha=0.7)
plt.plot(x_dec, f(x_dec), 'ro', ms= 8)
plt.plot(x_inc, f(x_inc),'ro', ms=8)
plt.show()
最佳答案
你没做错什么您获得的图形上的第一点实际上是一阶导数停止减少的点,因此二阶导数为(最接近)零。
关于python - 查找函数在哪里开始和结束在哪里减少,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36474725/