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

 相关指导 :https://zhuanlan.zhihu.com/p/109348995

posted on 2020-09-24 11:43  lexn  阅读(4738)  评论(0编辑  收藏  举报

导航