我一直试图计算出蓝色峰值的半高宽(FWHM)(见图)。绿色峰值和洋红峰值组合构成蓝色峰值。我一直在使用以下公式来计算绿色和洋红峰值的半高宽:其中sd =标准偏差。我创建了绿色和洋红色的峰值,我知道标准差,这就是为什么我可以使用这个方程。
我使用以下代码创建了绿色和洋红色峰值:
def make_norm_dist(self, x, mean, sd):
import numpy as np
norm = []
for i in range(x.size):
norm += [1.0/(sd*np.sqrt(2*np.pi))*np.exp(-(x[i] - mean)**2/(2*sd**2))]
return np.array(norm)
字符串
如果我不知道蓝峰是由两个峰组成的,并且我的数据中只有蓝峰,那么我如何找到FWHM?
的数据
我一直在用这段代码来寻找峰顶:
peak_top = 0.0e-1000
for i in x_axis:
if i > peak_top:
peak_top = i
型
我可以将peak_top
除以2以找到半高,然后尝试找到对应于半高的y值,但是如果没有x值完全匹配半高,我就会遇到麻烦。
我很确定有一个更优雅的解决方案,我正在尝试的一个。
9条答案
按热度按时间omtl5h9j1#
您可以使用样条曲线拟合[blue curve - peak/2],然后找到它的根:
字符串
结果如下:
x1c 0d1x的数据
nhaq1z212#
这在iPython中对我有效(快速而肮脏,可以减少到3行):
字符串
可以进行一些添加以使分辨率更准确,但是在X轴沿着有许多样本并且数据没有太多噪声的限制下,这很有效。
即使当数据不是高斯的并且有点嘈杂时,它也对我有效(我只是取第一次和最后一次半最大值穿过数据)。
ltskdhd13#
如果您的数据有噪声(在真实的世界中总是如此),则更可靠的解决方案是将高斯拟合到数据并从中提取FWHM:
字符串
的数据
可通过以下方式生成打印图像:
型
更好的近似方法是在拟合之前滤除低于给定阈值的噪声数据。
lc8prwob4#
这里有一个很好的小函数使用样条方法。
字符串
kxxlusnw5#
你应该使用scipy来解决它:先find_peaks,然后peak_widths。默认值为 rel_height(0.5),您测量的是峰的半峰宽。
ryhaxcpt6#
如果您更喜欢插值而不是拟合:
字符串
nhjlsmyf7#
对于具有许多数据点的单调函数,如果不需要完美的精度,我会用途:
字符串
6ovsh4lw8#
我在
haggis.math.full_width_half_max
中实现了一个经验解决方案,它可以很好地处理噪声和非高斯数据。用法非常简单:字符串
该函数具有鲁棒性:它使用所请求的内插方案简单地找到数据的最大值和与“向下一半”阈值交叉的最近点。
这里有几个例子使用其他答案的数据。
@HYRY的平滑数据
型
对于平滑数据,结果非常精确:
型
x1c 0d1x的数据
@Hooked's Noisy Data
型
对于噪声数据(具有有偏基线),结果并不一致。
型
一方面,高斯拟合对于数据不是非常优的,但另一方面,拾取与半最大阈值相交的最近点的策略可能也不是最优的。
的
pbossiut9#
一个有效的python实现是
values
是一个列表:字符串