在没有曲线形状先验知识的情况下识别峰?

问题描述 投票:0回答:1

我有一个数据集,其配置文件会随着时间的推移而变化。它的形状似乎总是大致呈高斯分布,但高斯“指向”的方式(高斯分布是先上升然后下降,还是先下降然后上升)随时间而变化。每个信号都不是纯高斯信号,而是有噪声......我在这里使用高斯信号进行说明。可以使用以下命令生成两条样本曲线:

import numpy as np
from scipy.stats import norminvgauss 

numargs = norminvgauss.numargs  
a, b = 20.32, 5.18
rv = norminvgauss(a, b)  
dist_1 = np.linspace(0, np.minimum(rv.dist.b, 2))
a2, b2 = 10.32, 10.18
rv2 = norminvgauss(a2,b2)
dist_2 = np.linspace(0, np.minimum(rv2.dist.b, 15))

plt.figure()
plt.plot(rv.pdf(dist_1))
plt.plot(-rv.pdf(dist_2),'--r')
plt.show()

产生这些信号:

如果没有先验知道高斯点的走向,我如何才能始终确定主要极值索引和值(例如,青色图的最大值点和红色虚线图的最小值点的位置和大小) )?

python-3.x scipy max min gaussian
1个回答
0
投票

假设峰值是幅度的绝对最大值或最小值,那么您可以取信号的绝对值并找到它的

argmax

import numpy as np
from scipy.stats import norminvgauss 

numargs = norminvgauss.numargs  
a, b = 20.32, 5.18
rv = norminvgauss(a, b)  
dist_1 = np.linspace(0, np.minimum(rv.dist.b, 2))
a2, b2 = 10.32, 10.18
rv2 = norminvgauss(a2,b2)
dist_2 = np.linspace(0, np.minimum(rv2.dist.b, 15))

y1 = rv.pdf(dist_1)
y2 = -rv.pdf(dist_2)

max1 = np.argmax(np.abs(y1))
max2 = np.argmax(np.abs(y2))

peak1 = y1[max1]
peak2 = y2[max2]

print(peak1, peak2) # 1.7462235049271382 -1.6829064093546884
© www.soinside.com 2019 - 2024. All rights reserved.