基於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