如何编写提升实验室工作效率的样本混样pooling算法
混样检测最优Pooling算法实现方案
最优混样组合计算方案
你描述的场景属于分组检测(Group Testing)的经典优化问题,核心目标是基于给定的阳性发生率最小化总检测次数,实现逻辑如下:
- 首先计算单池最优容量:已知阳性发生率p=0.036,单样本期望检测次数的计算公式为
E = 1/k + 1 - (1-p)^k,其中k为单池样本量。遍历计算可得,当k=17时E取最小值0.28,即单样本平均仅需0.28次检测,比单检降低72%的工作量。 - 跨种群分组策略:你支持任意拆分种群的前提下,无需按种群维度绑定分组,直接将所有207株样本按17株/池的最优大小拆分即可,初始仅需跑13次检测。如果需要保留种群溯源维度,可以优先将同种群样本凑满最优池大小,不足部分再跨种群拼接,降低后续阳性拆分的溯源成本。
阳性池高效拆分策略
根据实验室的运行模式可以二选一:
- 递归二分拆分(适合小通量、逐轮出结果的场景):
- 阳性池容量≤4时直接单检所有样本,该规模下拆分的检测成本高于直接单检
- 阳性池容量>4时平均拆为2个子池分别检测,子池阴性则整组排除,子池阳性则继续按上述规则拆分,直到定位到阳性单株
0.036的阳性率下,单个17样本的阳性池平均仅含0.6个阳性,二分法平均仅需额外5次检测即可定位阳性,加上初始1次池检测,总次数远低于全池单检。
- 二进制编码矩阵法(适合高通量、单轮出结果的场景):
给每个样本分配唯一的二进制编码,编码的每一位对应一个检测池的入组标识,编码位为1则加入对应池。最终根据阳性池的组合匹配编码即可直接定位所有阳性样本,无需等待上一轮检测结果。207个样本仅需8次检测即可一次性定位所有阳性,适合需要快速出结果的场景。
参考实现代码
最优池大小计算
import math p = 0.036 min_expected = float('inf') best_pool_size = 1 for k in range(2, 50): # 计算单样本期望检测次数 expected = (1 / k) + 1 - pow(1 - p, k) if expected < min_expected: min_expected = expected best_pool_size = k print(f"最优池大小:{best_pool_size},单样本期望检测次数:{round(min_expected, 3)}")
样本自动分组实现(基于给定种群数据)
data = {'pop':[1,2,3,4,5], 'size':[23,45,65,31,43]} # 生成带种群标识的全量样本列表 all_samples = [] for pop_id, count in zip(data['pop'], data['size']): all_samples.extend([f"pop{pop_id}_sample_{idx}" for idx in range(count)]) # 按最优池大小拆分 best_pool_size = 17 pools = [all_samples[i:i+best_pool_size] for i in range(0, len(all_samples), best_pool_size)] print(f"初始池总数:{len(pools)}")
内容的提问来源于stack exchange,提问作者Kuehlschrank
相关产品推荐
相关产品推荐

