I have added a link to the data set here.第一个脚本使用信号输出数据生成折线图。我的下一步是确定折线图上出现的峰值。第二个脚本有一个算法来识别折线图上存在的所有峰值。然而,它太敏感了。它将图形上最轻微的凹凸不平归类为峰值。我不想这样。我只希望将明显(大)的凸起识别为山峰。如何修改第二个脚本来完成此操作?
import matplotlib.pyplot as plt
import numpy as np
X, Y = [], []
X = np.zeros((10, 4096))
Y = np.zeros((10, 4096))
n=0
m=0
for line in open('data_set2.txt', 'r'):
values = [float(s) for s in line.split()]
X[n,0] = values[0]-1566518691968
for m in range(4096):
Y[n,m]=values[m+1]
n=n+1
plt.plot(Y[1,0:4095])
plt.show()
b = (X[1:]-X[:-1])[:-1]
c = (X[:-1]-X[1:])[1:]
minima = np.where(np.bitwise_and(b<0, c<0))[0]+1
maxima = np.where(np.bitwise_and(b>0, c>0))[0]+1
all_peaks = np.where((b*c)>0)[0]+1
del b,c
print(minima)
print(maxima)
print(all_peaks)发布于 2020-07-29 10:57:27
我希望你已经附加了数据集,这样我就可以在我在这里发布之前尝试我的解决方案。我认为你正在做的是寻找所有比之前的点更高的点,以及它们之后的点,这就是为什么你会得到太多的点。你的代码应该寻找的是一些最高峰。不管这个点是不是一个峰,峰的高度本身也不重要,重要的是峰的“唯一性”,或者它比平均值高多少。想象一下,删除示例中最高的三个峰并放大,您会发现新的峰数量看起来比其他峰高得多;以此类推。对你来说,棘手的事情是找出这些峰值的数量,这取决于你希望你的代码有多敏感。
发布于 2020-07-29 12:48:52
有一些用于识别峰值的软件包。scypi提供了scipy.signal.find_peaks函数(https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks.html)。也有matlab,octave等的峰值识别。所有这些都需要一些定量的标准来识别峰。没有一种方法只适用于“明显(大)的颠簸”。
UPD。所以,如果你想自己写代码,你必须选择一些过滤功能。可能有一些非常明显的原因:
值大于x;
x最大峰值的x <总峰值数量。改变参数x,你可以得到满足你的“明显(大)凹凸”标准的解决方案。
另外,可能还有其他的滤波函数,但看起来在你的情况下,峰值的宽度和形式并不重要。
发布于 2020-07-30 16:09:51
我不知道这里有人提出的算法;如果我是你,我会检查它们,因为它们的方式应该更有效。然而,如果你想变得懒惰,这里有一个解决方案:首先我收集所有的峰值(和你得到的相同的峰值):
x_range = range(4096)
peaks = []
for line in open('data_set2.txt', 'r'):
values = [float(s) for s in line.split()]
X[n, 0] = values[0] - 1566518691968
for m in range(4096):
Y[n, m] = values[m + 1]
# only work with the plotted row starting from the third value
if n != 1 or m in (0, 1):
continue
# if a point is higher than the point before and point after
if Y[n, m - 2] < Y[n, m - 1] > Y[n, m]:
peaks.append((x_range[m-1], Y[n, m - 1]))
n = n + 1
plt.plot(Y[1, 0:4095])
plt.show()然后我遍历每个100个点(假设在100个点范围内不能出现两个峰值,否则其中一个将被丢弃)并找到最大值。如果分段最大值是绝对最大值的某个百分比,则将其包括在内。
max_ = max(peaks, key=lambda x: x[1])[1]
# If the graph does not have peaks
if max_ < np.mean(Y) * 10: # Tweak point 1
print("No peaks")
sys.exit()
highest = []
sensitivity = 0.2 # Tweak point 2
for i in range(0, len(peaks), 100):
try:
segment = peaks[i: i + 100]
except IndexError:
segment = peaks[i:]
finally:
segment_max = max(segment, key=lambda x: x[1])[1]
if segment_max >= max_ * sensitivity:
highest.append(segment_max)
print(highest)https://stackoverflow.com/questions/63145530
复制相似问题