基于numpy用滑窗方差的办法确定曲线拐点
基于numpy用滑窗方差的办法确定曲线拐点
需要确定一条抖动的数据的拐点
1 #!usr/bin/env python 2 #-*- coding:utf-8 -*- 3 import matplotlib.pyplot as plt 4 import numpy as np 5 from scipy.signal import savgol_filter 6 7 8 def val_eb(x,y,gap): 9 # 转折点前后数据的离散程度相差很大,用这个离散差异拟合一条曲线,可能会有奇效。 10 11 # 对每一个数据点(离散数据点拟合的曲线),向前向后分别取一段等长区间,分别求方差,用方差表示离散程度。用向前区间的方差/向后区间的方差,表示离散差异。 12 13 # 每个数据点求得的离散差异形成的曲线如下,极值点x=790,正是转折点。 14 col=[] 15 y_col = [] 16 for i in range(gap, len(y) - gap): 17 col.append(np.var(y[i - gap:i]) / np.var(y[i:i + gap])) 18 y_col.append(i) 19 return col,y_col 20 pass 21 22 23 def pl(): 24 n = 1000 25 x = np.linspace(1,10,n) 26 27 # 绘制曲线 28 noise = np.random.normal(0, 0.008, 1000) 29 # print(noise) 30 y =np.tanh(x)+noise 31 32 plt.plot(x,y,color="red",linewidth = '0.1') 33 34 # x_smooth = savgol_filter(y, 101, 3) 35 y = savgol_filter(y, 201, 3) 36 # 方差求拐点 37 v,y_v = val_eb(x,y,100) 38 i = y_v[v.index(max(v))] 39 print("the ebow is ",v,y_v[v.index(max(v))]) 40 print(x[i],y[i],x[i+1],y[i+1],x[i-1],y[i-1]) 41 # plt.plot(y_v,v,color="blue") 42 plt.plot(x,y,color="green",linewidth = '0.1') 43 plt.show() 44 45 pl()
能够识别到x=2.79为拐点,y=0.99