python - 如何编写池化算法以提高实验室工作效率?

标签 python algorithm sorting

我想知道使用算法计算样本的最佳组合来创建池以分析每个样本是否有意义。

例如

我有 5 个不同大小的植物种群

data = {'pop':[1,2,3,4,5],
        'size':[23,45,65,31,43]}

目标是分析每株植物的一个基因。 我可以单独分析每株植物,但这可能需要太多的劳动力。 因此,我正在考虑将人口集中起来,以尽量减少所涉及的劳动力。

例如我可以简单地做 pool1 = pop1,pop2,pop3 |池2 = 弹出4,弹出5 但是,然后我在想为什么不这样做 pool1 = pop2,pop5, pool2 = pop1,pop3, and pool3 = pop4 所以我想知道是否有一种方法可以计算种群甚至植物的最佳组合(可以以每种所需的方式分割种群)。

所以当例如pool1 (pop1,pop2,pop3) 是阳性的(找到所需的基因),那么如何继续以获取阳性的个体植物,即如何最有效地分割池以识别阳性植物。一个种群的多株植物很可能呈阳性

总的来说,我想尽量减少“运行”次数

已知阳性的预期频率为 0.036

我希望这个想法很清楚,并且有人对如何做到这一点有想法

谢谢

最佳答案

如果你有 N 株植物,阳性频率为 0.036,那么你获得的信息总量为 -N(0.036 log2 0.036 + 0.964 log2 0.964) = 0.224N 位。请参阅https://en.wikipedia.org/wiki/Entropy_(information_theory)

理想情况下,由于每次运行都会给你一个二进制答案,因此你会希望从每个答案中获得完整的一点,或者至少尽可能接近它(因此你将在 N/4 次运行下运行)总共)。当阳性结果的概率为 50% 时,您将获得满分。这需要 19 个植物,因此您的初始运行需要 19 个植物批处理。

之后,通过将每个批处理分成两半并测试每一半,您可能会足够接近最佳值。

初始批处理需要 N/19 次运行。

然后您有 N/19 个大小为 10 的批处理需要测试。

您将有 N/16 个尺寸为 5 的批处理进行测试

N/15,尺寸 2.5。

对于大小为 2.5 的 N/30 个阳性批处理,测试每个植物。

总共,你有 N(2/19+1/16+1/15+2.5/30) = 0.32N 一起运行 - 还不错。

(请注意,@Stef 的回答似乎更有效,但他很幸运,在预期有 7 个阳性结果时只发现了 4 个阳性结果:)

让我们尝试一下:

import random

plants = [random.random() < 0.036 for _ in range(10000)]

nbuckets = len(plants)//19

buckets = [plants[i * len(plants)//nbuckets : (i+1) * len(plants)//nbuckets] for i in range(nbuckets)]

ntests = 0

def count_recursive(ar):
    global ntests
    if (len(ar)<=3):
        # run each plant
        ntests += len(ar)
        return ar.count(True)
    # run the batch
    ntests += 1
    if (ar.count(True) < 1):
        return 0
    mid = len(ar)//2
    return count_recursive(ar[:mid]) + count_recursive(ar[mid:])

print("Num plants: {}".format(len(plants)))
print("Num Positives: {}".format(plants.count(True)))
foundPositives = sum(count_recursive(b) for b in buckets)
print("Found positives: {} ".format(foundPositives))
print("Num tests: {}".format(ntests))

结果:

Num plants: 10000
Num Positives: 368
Found positives: 368
Num tests: 3310

Num plants: 10000
Num Positives: 325
Found positives: 325
Num tests: 3076

Num plants: 10000
Num Positives: 387
Found positives: 387
Num tests: 3526

是的,正如预期的那样。

当结果保证为阳性时,我们还可以通过跳过测试来做得更好,因为阳性批处理中的所有其他东西都测试为阴性。该优化使测试总数降至 0.26N,非常接近最佳值。

关于python - 如何编写池化算法以提高实验室工作效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69076378/

相关文章:

python - Kivy 使用 kv 文件中的 ScreenManager

python - 使用 Python Plotly 绘制气泡大小图例

algorithm - 求一个递归算法的复杂度

java - 堆排序获取父级

c# - 对包含坐标 x 和 y 的 List<String> 进行排序

mysql - MySQL 中的默认排序顺序(ALTER TABLE ... ORDER BY ...;)

python - 使用 Python 从 Box 下载文件

python - 为什么模型预测在 tensorflow (python)中没有更新?

multithreading - 为什么比较和交换 (CAS) 算法是无锁同步的好选择?

algorithm - 国际象棋-算法,指定跳跃