threshold - 如何计算 1D 中的 Otsu 阈值
问题描述
我正在尝试识别分析化学数据中的双峰分布。每个数据集是来自 GC-MS 的特定化合物的 3~70 个保留时间列表。某些化合物的 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),数据可能不太明确。这甚至是正确的阈值吗?维基百科关于模态的文章指出了一大堆其他的多模态测试。
解决方案
推荐阅读
- php - 如何配置重写基础以支持使用 htaccess 包含 php 文件(例如在子目录中找到的 css 脚本)
- javascript - 无法识别来自类扩展的 JavaScript 函数
- sum - 通过在 Power BI 中将日期分组为周来计算总和
- reactjs - 如何使用 Hooks 将 Image Slider Javascript 代码转换为 reactjs
- javascript - 从 JavaScript 文件自动生成时,标签在标签内不起作用
- node.js - Electron:主进程和渲染器进程之间的竞争条件
- python - 出现错误:形状未对齐,带有 statsmodels 和简单的二维线性回归
- matlab - 绘制多个案例的 Newton-Raphson 解的结果
- reactjs - 反应原生使用状态
- java - Playstore 漏洞 HostnameVerifier 接口的不安全实现