4

正のデータセットであるタンパク質の一意のペアを含むファイルがあります。と呼びましょう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 とまったく同じになるようにするには、どうすればこれを回避できますか? また、逆ペア順序の問題に対処できませんでした。両方の質問について何か考えはありますか?

前もって感謝します。

4

1 に答える 1

3

順序に関係なくペアを拒否するには、両方の順序をペアのリストに入れます。つまり、ペアのセットに追加line.split()line.split()[::-1]ます。

より多くのペアを生成するには、単語のリストを反復処理する代わりに、ランダムなペアを選択し (random.choice多分? を使用)、無効なペアのリストに基づいてそれらを拒否します (ペア「A1ZBB4」を生成する場合も考慮する必要がある場合があります)。 A1ZBB4」と適切に行動します)。好きなだけこれを続けることができます。出力に一意の要素のみが含まれていることを確認する必要があるため、出力項目を生成時に拒否リストに追加 (または別の拒否リストとして維持) できます。

メモリフットプリントを減らしたい場合は、次のように設定できます。

  • pairs拒否するペアのセットですが、各ペアは内部でソートされます。つまり、「Q9VRA8 A1ZBB4」を読み取ると、ペア「A1ZBB4、Q9VRA8」として保存されます。
  • 上記のランダムなペアを生成し、そのペアのソートされたバージョンが拒否リストにあるかどうかを確認し、そうであれば無視します。
于 2012-07-30T14:10:21.313 に答える