我想知道,是否有一个算法,计算最佳组合的样本,以创建池,以分析每一个样本。
例如:
我有5个不同大小的植物种群
data = {'pop':[1,2,3,4,5],
'size':[23,45,65,31,43]}
目的是分析每种植物的一个基因。我能做些什么来单独分析每一家工厂,但这可能涉及到太多的劳动。因此,我正考虑集中人口,以尽量减少所涉及的劳工。
例如,我可以简单地做pool1 = pop1,pop2,pop3 x pool2 = pop4,pop5,然后我在想为什么不做pool1 = pop2,pop5,pool2 = pop1,pop3和pool3 = pop4,所以我想知道是否有一种方法来计算种群或甚至植物的最佳组合(可以用每一种理想的方式来划分种群)。
因此,当pool1 (pop1,pop2,pop3)是阳性的(理想的基因发现)时,如何才能到达阳性的个体植物,即如何最有效地分割池以识别阳性的植物。一个种群的多个植物很可能是阳性的。
总的来说,我想尽量减少“运行”的次数。
据了解,阳性的预期频率为0.036。
我希望这个想法是明确的,有人对如何做到这一点有自己的想法。
谢谢
发布于 2021-09-06 15:33:51
由于最初将植物划分为种群与这个问题无关,我将忽略它。
由于阳性的频率很低,我认为简单的二分法搜索应该是有效的。偶尔,我们会遇到这样的情况:我们将一个正的池分成两个子池,两个子池都是正的,但是由于阳性的频率很低,我们可以希望它不会发生得太频繁。
import random
# random data
n = 23+45+65+31+43
data = [{'id': random.random(),
'positive': random.choices([True, False], weights=[36, 1000-36])[0]
} for _ in range(n)]
def test_pool(pool): # tests if a pool is positive
# serious science in the lab happens here
return any(d['positive'] for d in pool)
def get_positives(data):
result = []
nb_tests = 0
pools = [data]
while pools:
pool = pools.pop()
if len(pool) == 1:
result.append(pool[0])
else:
for subpool in [pool[:len(pool)//2], pool[len(pool)//2:]]:
nb_tests += 1
if test_pool(subpool):
pools.append(subpool)
return result, nb_tests
results, nb_tests = get_positives(data)
ground_truth = [d for d in data if d['positive']]
print('NUMBER OF TESTS: {}'.format(nb_tests))
print('FOUND POSITIVES:')
print([d['id'] for d in results])
print('GROUND TRUTH:')
print([d['id'] for d in ground_truth])
# NUMBER OF TESTS: 46
# FOUND POSITIVES:
# [0.2505629359502266, 0.46483641024238254, 0.8786751274491258, 0.250765592789725]
# GROUND TRUTH:
# [0.250765592789725, 0.8786751274491258, 0.46483641024238254, 0.2505629359502266]
https://stackoverflow.com/questions/69076378
复制相似问题