2013-08-07 22 views
8

Próbuję zastosować algorytm Smitha-Watermana do lokalnego wyrównania sekwencji za pomocą funkcji kary luki afinicznej. Myślę, że rozumiem, jak inicjować i obliczać macierze wymagane do obliczania wyników wyrównania, ale nie mam pojęcia, jak to zrobić, by znaleźć wyrównanie. W celu uzyskania macierzy 3 wymagane I mają następujące oznaczeniaPrześledzenie w algorytmie Smitha-Watemana z karą w postaci luki afektywnej

for j in range(1, len2): 
    for i in range(1, len1): 
     fxOpen = F[i][j-1] + gap 
     xExtend = Ix[i][j-1] + extend 
     Ix[i][j] = max(fxOpen, xExtend) 

     fyOpen = F[i-1][j] + gap 
     yExtend = Iy[i-1][j] + extend 
     Iy[i][j] = max(fyOpen, yExtend) 

     matchScore = (F[i-1][j-1] + simMatrixDict[seq1[i-1]+seq2[j-1]]) 
     xScore = Ix[i-1][j-1] + simMatrixDict[seq1[i-1]+seq2[j-1]] 
     yScore = Iy[i-1][j-1] + simMatrixDict[seq1[i-1]+seq2[j-1]] 
     F[i][j] = max(0, matchScore, xScore, yScore) 

Ja pewności, jeśli trzeba pojedynczą matrycę stosie z, lub po 1? Będziemy wdzięczni za wszelkie wyjaśnienia dotyczące sposobu śledzenia wyniku maks. W punkcie F.

+0

Czy próbujesz wdrożyć algorytm tak jak ćwiczenie? Możesz znaleźć implementacje Pythona online. Przykłady: [jeden] (https://github.com/alevchuk/pairwise-alignment-in-python), [dwa] (https://pypi.python.org/pypi/swalign/0.2), [trzy] (https://github.com/kevinakwok/bioinfo/tree/master/Smith-Waterman), [cztery] (http://forrestbao.blogspot.com/2007/09/smith-waterman-algorithm-in-process.html). –

+1

dziękuję za odpowiedź, ale tylko jeden z nich (dwa) zawiera funkcję kary luki afinicznej, której tak naprawdę jestem po. Niestety kod w tym jest nieco poza mną, tylko w nim przez kilka miesięcy. – jonwells

Odpowiedz

4

Ważną rzeczą, o której należy pamiętać w związku ze śladami w Smith-Waterman, jest to, że macierz, której wartość określa, określa kierunek, w którym się poruszasz. Tak więc, jeśli jesteś w F poruszasz się po przekątnej, jeśli jesteś w Ix, poruszasz się poziomo, a jeśli jesteś w Iy, poruszasz się w pionie. Oznacza to, że wszystko, co musisz przechowywać w matrycy wskaźnika, to macierz, z której przybyłeś do kwadratu. Macierz, z której się wywodzisz, a nie ta, do której zmierzasz, wyznacza kierunek, z którego chcesz jechać.

Na przykład:

że jesteś w F[5][5]:

  • Jeśli matryca wskaźnik mówi, aby przejść do Ix, przejdź do Ix[4][4]
  • Jeśli matryca wskaźnik mówi, aby przejść do Iy, przejdź do Iy[4][4]
  • Jeśli matryca wskaźnika mówi, aby przejść do F, przejdź do F[4][4]

natomiast jeśli jesteś w Ix[5][5]:

  • Jeśli matryca wskaźnik mówi, aby przejść do Ix, przejdź do Ix[4][5]
  • Jeśli matryca wskaźnik mówi, aby przejść do F, przejdź do F[4][5]

Lub jeśli jesteś na Iy[5][5]:

  • Jeśli matryca wskaźnik mówi, aby przejść do Iy, przejdź do Iy[5][4]
  • Jeśli matryca wskaźnik mówi, aby przejść do F, przejdź do F[5][4]

Zakładając, że pierwszy indeks jest współrzędna x, a drugi współrzędna y.

Kontynuuj śledzenie wstecz aż komórkę o maksymalnej wartości 0.

Budowanie matrycę wskaźnik: Musisz jedną matrycę wskaźnik za każdą F, Ix i Iy. Te macierze muszą jedynie wskazać, z jakiej matrycy pochodzi wartość, ponieważ to wskazuje kierunek, w którym się poruszasz.Tak więc, kiedy przechodzisz przez fazę programowania dynamicznego algorytmu, powinieneś także budować matryce wskaźnikowe. Za każdym razem, gdy przechowujesz nową maksymalną wartość w komórce w F, Ix lub Iy, powinieneś zaktualizować odpowiednią macierz, aby wskazać, skąd pochodzi. Jeśli na przykład najwyższa wartość, jaką można uzyskać w F[5][5], polega na wyrównaniu dwóch następnych zasad, gdy jesteś w F[4][4], Fpointer [5] [5] powinien być ustawiony na F, ponieważ dostałeś się tam z macierzy F.

+0

dzięki za szybką odpowiedź, z czym walczę, to jak zbudować matrycę wskaźnika. Wygląda na to, że trzy macierze wyników są zbudowane niezależnie od siebie, więc nie widzę, w jaki sposób podjąłbyś decyzję, kiedy przejść z jednego do drugiego? przypuszczalnie potrzebowałbyś wskazanego na lewo, na górę, na przekątnej, a następnie na dodatkowe wskaźniki mówiące, do której matrycy się poruszać? – jonwells

+1

Dobra, zredagowałem swoją odpowiedź, aby podać więcej informacji na ten temat. Zasadniczo potrzebujesz innej matrycy wskaźnika dla każdej z twoich trzech matryc, ale musisz tylko zarejestrować matrycę, z której pochodzisz, kiedy uzyskałeś najwyższą wartość w tej komórce, ponieważ to mówi ci wszystko, co musisz wiedzieć o kierunku ruchu . Ponieważ pytasz o traceback, zakładam, że masz już działające dynamiczne programowanie, dzięki czemu możesz znaleźć najlepszą możliwą wartość w każdej komórce. Konfigurowanie matrycy wskaźnika to tylko kwestia śledzenia, w jaki sposób uzyskałeś tę wartość. – seaotternerd

+0

Nadal mam wątpliwości. Jeśli masz czas, czy mógłbyś pokazać, nawet w pseudokodach, dlaczego trzy macierze są potrzebne? Sposób, w jaki myślałem, że jest taki: traceback po prostu zapisuje wskazówki. Naprawdę nie rozumiem, dlaczego musimy przeskakiwać do innych macierzy podczas śledzenia. Kiedy jesteśmy w DP, przechowujemy kierunek, z którego pochodzi ta wartość, więc śledzimy ją z powrotem (DIAG, LEFT lub UP). jeśli maksymalna wartość x, y pochodzi od F, to DIAG, jeśli od Ix, LEFT i tak dalej. Nie mówię, że to prawda - jestem po prostu zdezorientowany :) Jak mogę zapisać skąd pochodzę i gdzie jestem? – francisaugusto