首页 > 解决方案 > 如何计算 1D 中的 Otsu 阈值

问题描述

我正在尝试识别分析化学数据中的双峰分布。每个数据集是来自 GC-MS 的特定化合物的 3~70 个保留时间列表。某些化合物的 RT 呈双峰分布,其中库搜索已将相同的身份分配给具有不同 RT 的数据中的两个或多个不同特征。这对于具有非常相似质谱的异构体和其他化合物对来说是很常见的。例如。这是显示双峰分布的一种化合物的 RT 直方图。 RT直方图

我想计算 Otsu 阈值以尝试定义双峰数据(也有多峰分布,但一次只有一步)。我很难理解关于计算的维基百科文章,但文本表明可以通过找到最小的类内方差来找到阈值。因此,我尝试从 RT 列表中进行计算,如下所示:

a = list(d['Component RT'])
n = len(a)
b = [a.pop(0)]

varA = []
varB = []

for i in range(1,n-2):
    b.append(a.pop(0))
    varA.append(statistics.stdev(a)**2)
    varB.append(statistics.stdev(b)**2)

我是否认为如果我绘制上述数据的方差总和,我应该能够将 Otsu 阈值识别为最小值? 总方差

在此示例中,阈值很明显,大约有 35 个值可供使用。对于大多数化合物,值较少(通常 <15),数据可能不太明确。这甚至是正确的阈值吗?维基百科关于模态的文章指出了一大堆其他的多模态测试。

标签: threshold

解决方案


推荐阅读