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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM