Python算法从正数据集中获取随机负数据集

时间:2012-07-30 13:52:59

标签: python algorithm random

我有一个包含独特蛋白质对的文件,即阳性数据集。我们称之为infile。 下面是一个infile内容的例子:

Q9VRA8  A1ZBB4
Q03043  Q9VX24
B6VQA0  Q7KML2

条目以制表符分隔。 随机数据集,我们称之为outfile,必须包含单个蛋白质的组合,其方式是它们无法以任何顺序匹配的内容。例如,对于上面的第一行,随机化的outfile不能包含以下对:

Q9VRA8  A1ZBB4
A1ZBB4  Q9VRA8

此外,生成的阴性数据集必须包含正数据集中完全相同数量的蛋白质对。 为了解决这个问题,我尝试了以下方法:

# Read original file
data = list(infile.readlines())
ltotal = len(data)
lwritten = 0

# Split original file in words
with open (infilename, 'rt') as infile:
    pairs = set(frozenset(line.split()) for line in infile)
words = list(itertools.chain.from_iterable(pairs))
random.shuffle(words)

# Obtain pairs of words
with open(outfilename, 'wt') as outfile:
    for pair in itertools.izip(*[iter(words)] * 2):
        if frozenset(pair) not in pairs and lwritten != ltotal:
            outfile.write("%s\t%s\n" % pair)
            lwritten += 1

这很有效。然而,infile总共有856471行,outfile获得不同范围的蛋白质对,最小值为713000。

我如何解决这个问题,因此产生的对数与infile完全相同? 另外,我无法解决反向对订单问题。这两个问题都有想法吗?

提前致谢。

1 个答案:

答案 0 :(得分:3)

对于独立于订单的否决对,我只是将两个订单放入我的对列表中: 即我将line.split()line.split()[::-1]添加到对的集合中。

要生成更多对,而不是迭代单词列表,只需选择随机对(可能使用random.choice?)然后根据无效对列表对其进行否决(您可能还需要考虑生成“A1ZBB4 A1ZBB4”对并适当行动的情况。只要你愿意,你就可以继续这样做。由于您需要确保输出仅包含唯一元素,因此输出项可以在生成时添加到否决列表中(或作为单独的否决列表进行维护)。

如果您想减少内存占用,可以设置:

  • pairs是否决对的集合,但每对都在内部排序,即如果您读取“Q9VRA8 A1ZBB4”,则将其存储为“A1ZBB4,Q9VRA8”对。<​​/ li>
  • 您生成上面的随机对,检查该对的排序版本是否在您的否决列表中,如果是,请忽略它。