2012-07-30 32 views
4

我有一個文件包含唯一的蛋白質對,正數據集。我們稱之爲infile。 下面有infile中內容的一個例子:Python算法從正數據集中獲取隨機化的負數據集

Q9VRA8 A1ZBB4 
Q03043 Q9VX24 
B6VQA0 Q7KML2 

的條目是製表符分隔。 隨機數據集,我們稱之爲outfile,必須包含各種蛋白質的組合,其方式是它們不能以任何順序與infil 的內容匹配。作爲一個例子,對於上面的第一,隨機OUTFILE不能包含以下對:

Q9VRA8 A1ZBB4 
A1ZBB4 Q9VRA8 

此外,所產生的負數據集必須包含在正極集完全相同的數目蛋白對。 爲了ADRESS這個我試過如下:

# 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完全相同? 此外,我無法解決反向對訂單問題。這兩個問題有什麼想法?

在此先感謝。

+0

你能重複一下值嗎?每個文件中每種蛋白質的總數是否必須匹配? – 2012-07-30 14:04:24

+0

哦,對不起,錯過了這一點。是的,我可以重複個人參賽作品。但是我不能有重複的對。所有組合必須是唯一的。不,蛋白質的總數不必與每個文件匹配。雖然應該有一些平衡,或者當我使用SVM時可能會造成一些偏差。 – 2012-07-30 14:07:53

+0

我得到的印象是,您正在爲SVM生成一個「背景」(排序爲零假設)分佈。你爲什麼否決在這個人造數據集中已經發生的對? – Dave 2012-07-30 14:20:24

回答

3

否決對獨立的順序,我只是把訂單都到我對名單: 即我想補充:line.split()line.split()[::-1]設定的對。

要生成更多對,而不是遍歷單詞列表,只需選取隨機對(使用random.choice也許?),然後根據無效對列表進行否決(您可能還需要考慮您的情況生成一對「A1ZBB4 A1ZBB4」並適當運行)。只要你喜歡,你可以繼續這樣做。由於您需要確保輸出僅包含唯一元素,因此輸出項目可以在生成時添加到否決列表(或作爲單獨的否決權列表維護)。

如果你想減少內存佔用,你可以設置:

  • pairs是一組對否決權的,但每對內部排序,也就是說,如果你看過「Q9VRA8 A1ZBB4」你存儲它作爲一對「A1ZBB4,Q9VRA8」。
  • 您在上面生成隨機對,檢查該對的排序版本是否在您的否決清單中,如果這樣的話忽略它。
+0

哦,我喜歡這個否決的想法。謝謝,這真的很有用! – 2012-07-30 14:13:21