有许多经典的峰值检测方法,其中任何一种都可能有效。您需要查看特定数据质量的限制。以下是基本描述:
1. 在数据的任意两个点之间(x(0), y(0))和(x(n), y(n)),对于0 <= i < n, 将y(i+1)-y(i)相加,并将其称为T(“travel”),并适当设置k,将R(“rise”)设置为y(n)-y(0)+k。 T / R> 1表示峰值。如果噪声产生的大幅度波动不太可能或噪音在基础曲线形状周围对称分布,则此方法可行。对于您的应用程序,请接受早期得分高于给定阈值的峰值,或者分析每个升值值的旅行曲线以获取更有趣的属性。
2. 使用匹配滤波器来评估与标准峰形状的相似性得分(基本上,使用某些形状的归一化点积来获得余弦指标的相似性)。
3. 对标准峰值形状进行反卷积,并检查高值(尽管我通常发现简单仪器输出的噪音对2不敏感)。
4. 平滑数据并检查三个等间距点的三元组,如果x0 < x1 < x2 且 y1 > 0.5 *(y0 + y2),或者检查像这样的欧几里得距离:D((x0,y0),(x1,y1))+ D((x1,y1),(x2,y2))> D((x0,y0),(x2,y2)),它依赖于三角形不等式。再次使用简单比率将为您提供得分机制。
5. 对数据进行非常简单的两个高斯混合模型拟合(例如,Numerical Recipes有一段漂亮的现成代码)。取较早的峰值。这将正确处理重叠的峰值。
6. 在数据中找到与简单的高斯,柯西,泊松或其他任何曲线最佳匹配的位置。在广泛范围内评估该曲线并从数据的副本中减去它的峰值位置之后重复此操作。采用最早的峰值,其模型参数(可能是标准差,但某些应用程序可能关心峰度或其他特征)符合某些条件。注意,在峰值从数据中减去时留下的人工效应。
我以前也做过您正在做的事情:在DNA序列数据中查找峰值,在从测量曲线估计的导数中查找峰值,并在直方图中查找峰值。
我建议您仔细进行适当的基线处理。在存在噪声的情况下,Wiener过滤或其他过滤器或简单的直方图分析通常是一种简单的基线处理方法。
最后,如果您的数据通常存在噪声,并且您从卡片上获取的数据是未参考的单端输出(甚至是参考的,但不是差分的),并且如果您将大量观测值平均到每个数据点中,请尝试对这些观测值进行排序,并且删除前后四分之一,并对剩余部分进行平均。有许多这样的异常值消除策略可以真正有用。