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

标签 python algorithm random

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

Q9VRA8  A1ZBB4
Q03043  Q9VX24
B6VQA0  Q7KML2

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

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 完全相同? 另外,我无法解决反向配对顺序问题。对这两个问题有什么想法吗?

提前致谢。

最佳答案

要否决与顺序无关的对,我只需将两个顺序都放入我的对列表中: 即我会添加:line.split()line.split()[::-1] 到对组。

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

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

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

关于Python算法从正数据集中获得随机的负数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11722972/

相关文章:

python - 使用 Python 从目录中读取所有 csv 文件

python - 如何删除 2D 矩阵中值为 0 的前 n 列/行?

在树中查找最大独立集的算法

python - Numba 和泊松分布的随机数

python - 如何在 Django 表单 ChoiceField 中获取选项标签?

python - 在 python-webkit WebView 中使用 HTML 访问 zip 存档中的大文件,无需解压

java - 在Java中使用3个堆栈对未排序的数组进行排序

c++ - 去除连通图中的边的算法

python - python 中自制随机数生成器的问题。 (使用时间.时间())

java - 生成随机数,但必须使用不重复的唯一数字生成