2016-02-27 7 views
6

मैं प्रोग्रामिंग और जैव सूचना विज्ञान दोनों में एक नौसिखिया हूं। तो, मैं आपकी समझ की सराहना करता हूं। मैंने Courbsera कक्षा में वर्णित अनुसार गिब्स नमूनाकरण का उपयोग करके मोटीफ खोज के लिए एक पायथन लिपि विकसित करने की कोशिश की, "डीएनए में छिपे हुए संदेश ढूंढना"। पाठ्यक्रम में प्रदान की स्यूडोकोड है:गिब्स नमूने के साथ मोटीफ खोज

GIBBSSAMPLER(Dna, k, t, N) 
    randomly select k-mers Motifs = (Motif1, …, Motift) in each string 
     from Dna 
    BestMotifs ← Motifs 
    for j ← 1 to N 
     i ← Random(t) 
     Profile ← profile matrix constructed from all strings in Motifs 
        except for Motifi 
     Motifi ← Profile-randomly generated k-mer in the i-th sequence 
     if Score(Motifs) < Score(BestMotifs) 
      BestMotifs ← Motifs 
    return BestMotifs 

समस्या का वर्णन:

कोड चुनौती: लागू GIBBSSAMPLER।

इनपुट: पूर्णांकों कश्मीर, टी, और एन, तार डीएनए का एक संग्रह किया गया। आउटपुट: 20 यादृच्छिक प्रारंभ के साथ GIBBSSAMPLER (Dna, k, t, N) चलाने के परिणामस्वरूप बेस्टमोटीफ्स स्ट्रिंग्स। स्यूडोकॉइंट्स का उपयोग करना याद रखें!

नमूना इनपुट:

8 5 100 
CGCCCCTCTCGGGGGTGTTCAGTAACCGGCCA 
GGGCGAGGTATGTGTAAGTGCCAAGGTGCCAG 
TAGTACCGAGACCGAAAGAAGTATACAGGCGT 
TAGATCAAGTTTCAGGTGCACGTCGGTGAACC 
AATCCACCAGCTCCACGTGCAATGTTGGCCTA 

नमूना आउटपुट:

TCTCGGGG 
CCAAGGTG 
TACAGGCG 
TTCAGGTG 
TCCACGTG 

मैं अपने ज्ञान के अनुसार स्यूडोकोड का पालन किया।

def BuildProfileMatrix(dnamatrix): 
    ProfileMatrix = [[1 for x in xrange(len(dnamatrix[0]))] for x in xrange(4)] 
    indices = {'A':0, 'C':1, 'G': 2, 'T':3} 
    for seq in dnamatrix: 
    for i in xrange(len(dnamatrix[0])):    
     ProfileMatrix[indices[seq[i]]][i] += 1 
    ProbMatrix = [[float(x)/sum(zip(*ProfileMatrix)[0]) for x in y] for y in ProfileMatrix] 
    return ProbMatrix 
def ProfileRandomGenerator(profile, dna, k, i): 
    indices = {'A':0, 'C':1, 'G': 2, 'T':3} 
    score_list = [] 
    for x in xrange(len(dna[i]) - k + 1): 
     probability = 1 
     window = dna[i][x : k + x] 
    for y in xrange(k): 
     probability *= profile[indices[window[y]]][y] 
    score_list.append(probability) 
    rnd = uniform(0, sum(score_list)) 
    current = 0 
    for z, bias in enumerate(score_list): 
     current += bias 
     if rnd <= current: 
      return dna[i][z : k + z] 
def score(motifs): 
    ProfileMatrix = [[0 for x in xrange(len(motifs[0]))] for x in xrange(4)] 
    indices = {'A':0, 'C':1, 'G': 2, 'T':3} 
    for seq in motifs: 
     for i in xrange(len(motifs[0])):    
      ProfileMatrix[indices[seq[i]]][i] += 1 
    score = len(motifs)*len(motifs[0]) - sum([max(x) for x in zip(*ProfileMatrix)]) 
    return score 
from random import randint, uniform  
def GibbsSampler(k, t, N): 
    dna = ['CGCCCCTCTCGGGGGTGTTCAGTAACCGGCCA', 
    'GGGCGAGGTATGTGTAAGTGCCAAGGTGCCAG', 
    'TAGTACCGAGACCGAAAGAAGTATACAGGCGT', 
    'TAGATCAAGTTTCAGGTGCACGTCGGTGAACC', 
    'AATCCACCAGCTCCACGTGCAATGTTGGCCTA'] 
    Motifs = [] 
    for i in [randint(0, len(dna[0])-k) for x in range(len(dna))]: 
     j = 0 
     kmer = dna[j][i : k+i] 
     j += 1 
     Motifs.append(kmer) 
    BestMotifs = [] 
    s_best = float('inf') 
    for i in xrange(N): 
     x = randint(0, t-1) 
    Motifs.pop(x) 
    profile = BuildProfileMatrix(Motifs) 
    Motif = ProfileRandomGenerator(profile, dna, k, x) 
    Motifs.append(Motif) 
    s_motifs = score(Motifs) 
    if s_motifs < s_best: 
     s_best = s_motifs 
     BestMotifs = Motifs 
return [s_best, BestMotifs] 

k, t, N =8, 5, 100    
best_motifs = [float('inf'), None] 

# Repeat the Gibbs sampler search 20 times. 
for repeat in xrange(20): 
    current_motifs = GibbsSampler(k, t, N) 
    if current_motifs[0] < best_motifs[0]: 
     best_motifs = current_motifs 
# Print and save the answer. 
print '\n'.join(best_motifs[1])    

दुर्भाग्य से, मेरी कोड कभी नहीं सुलझ उदाहरण के रूप में एक ही आउटपुट देता है: यहाँ मेरी कोड है। इसके अलावा, कोड को डीबग करने का प्रयास करते समय मैंने पाया कि मुझे अजीब अंक मिलते हैं जो प्रारूपों के बीच विसंगतियों को परिभाषित करते हैं। हालांकि, जब मैंने स्कोर फ़ंक्शन को अलग से चलाने की कोशिश की, तो यह पूरी तरह से काम किया।

हर बार जब मैं वैसे भी यहाँ स्क्रिप्ट, उत्पादन परिवर्तन चलाते हैं, लेकिन निवेश के लिए आउटपुट कोड में मौजूद एक का एक उदाहरण है:

मेरी कोड के

उदाहरण आउटपुट

TATGTGTA 
TATGTGTA 
TATGTGTA 
GGTGTTCA 
TATACAGG 

क्या आप कृपया मुझे इस कोड को डीबग करने में मदद कर सकते हैं? !! मैंने पूरा दिन यह पता लगाने की कोशिश की कि इसमें क्या गड़बड़ है, हालांकि मुझे पता है कि यह कुछ मूर्खतापूर्ण गलती हो सकती है, लेकिन मेरी आंख इसे पकड़ने में नाकाम रही।

सभी को धन्यवाद !!

+0

हाय। कृपया अपने इनपुट के कुछ उदाहरण और "गलत" आउटपुट पोस्ट करें। – themantalope

+0

हैलो मैट! आपके कमेंट के लिए धन्यवाद। इनपुट कोड में पहले से ही है। यह पाठ्यक्रम में दिए गए उदाहरण के समान है।जब भी मैं स्क्रिप्ट चलाता हूं, आउटपुट बदलता है, लेकिन किसी भी तरह से मैंने आउटपुट का उदाहरण शामिल करने के लिए प्रश्न संपादित किया। –

+0

कृपया StackOverflow के "motif" टैग के लिए विषय विवरण नोट करें: "एक ग्राफिकल यूजर इंटरफेस टूलकिट सॉफ्टवेयर विकास में उपयोग किया जाता है (सी में लिखे गए एक्स/मोटीफ जीयूआई पैकेज)"। आपकी पोस्ट इस विषय के भीतर फिट नहीं है। – FredK

उत्तर

1

अंत में, मुझे पता चला कि मेरे कोड में क्या गलत था! यह लाइन 54 में किया गया था:

Motifs.append(Motif) 

बेतरतीब ढंग से रूपांकनों में से एक है, इन रूपांकनों तो बेतरतीब ढंग से एक नया इस प्रोफाइल के आधार पर मूल भाव के चयन के बाहर एक प्रोफ़ाइल का निर्माण के बाद हटाने के बाद, मैं में चयनित आकृति को शामिल किया है चाहिए हटाने से पहले एक ही स्थिति प्रारूप सूची के अंत में शामिल नहीं है।

अब, सही कोड है:

Motifs.insert(x, Motif) 

नए कोड अपेक्षित ढंग से काम किया।

+0

मैंने परिवर्तन की कोशिश की लेकिन उत्तर अभी भी ऊपर नमूना आउटपुट से अलग है। यहां एक नज़र डालें: http://ideone.com/3kbirU –

संबंधित मुद्दे