UNIVERSITA’ DI MILANO-BICOCCA LAUREA MAGISTRALE IN BIOINFORMATICA Corso di BIOINFORMATICA: TECNICHE DI BASE Prof. Giancarlo Mauri Lezione 4 Distanza di edit e programmazione dinamica
Confronto di sequenze Il confronto tra sequenze in biologia computazionale è la base per: misurare la “similarità” tra le sequenze allineamento misurare la “diversità” tra le sequenze distanza di edit trovare parti comuni alle sequenze pattern discovery allineamento locale
Capire da dove possono nascere le differenze: Confronto di sequenze Perché si confrontano sequenze in biologia? Capire da dove possono nascere le differenze: errori di trascrizione mutazioni inserimento cancellazione sostituzione di basi
Distanza tra due sequenze Distanza tra due sequenze S1 e S2 (Levenshtein 66): numero minimo di “operazioni di modifica” necessarie per trasformare S1 in S2 Esempio GETTO GATTO una sostituzione BRODO BRRDO BARDO due sostituzioni o un’inversione e una sostituzione TINTA TINTRE TINTAE TINORE COLORE TOLORE TILORE cinque sostituzioni e una cancellazione TCTGGC TCTGCC TCTGGG GGGTCT TGACCC AGACCC TCACCC TCTCCC complemento inverso
Edit transcript I = inserisci C = cancella S = sostituisci N = lascia invariato SINCNCNNI v intner wri t ers Rappresenta una particolare trasformazione di una stringa in un’altra
Distanza di edit: il problema INPUT: due sequenze S1 e S2 definite su un alfabeto S OUTPUT: distanza di edit tra S1 e S2 e edit transcript ottimale che fornisce la trasformazione da S1 a S2 TECNICA UTILIZZATA: Programmazione Dinamica (PD)
Programmazione Dinamica Perché si usa la Programmazione Dinamica? Per rendere efficiente l’implementazione di procedure ricorsive Esempio: procedura ricorsiva per il calcolo della somma dei numeri da 1 a n Procedura SOMMA(n) begin if n=1 then somma:=n; else somma:=SOMMA(n-1)+n; return somma; end Esempio di chiamata SOMMA(4) SOMMA(4) SOMMA(3) +4 SOMMA(2) +3 SOMMA(1) +2
Programmazione Dinamica Quali sono le procedure ricorsive da sostituire con un algoritmo di PD? Quelle in cui si presentano sottoproblemi ripetuti Esempio: i numeri di Fibonacci Obiettivo dare un modello matematico della crescita di una popolazione di conigli Assunzioni: Si parte (tempo 0) con una coppia di conigli neonati Ogni coppia genera una nuova coppia ad ogni unità di tempo, a partire dalla seconda unità dopo la nascita I conigli non muoiono mai Modello matematico per calcolare il numero di coppie al tempo n: F(n) := se (n=0) o (n=1), allora 1 altrimenti F(n-1)+F(n-2)
Programmazione Dinamica Esempio di chiamata FIB(4) Esempio: procedura ricorsiva per il calcolo dei numeri di Fibonacci FIB(3) FIB(2) FIB(4) FIB(1) FIB(0) FIB(3) FIB(2) FIB(4) FIB(1) FIB(0) FIB(3) FIB(2) FIB(4) FIB(3) FIB(2) FIB(4) FIB(1) NB: nella chiamata FIB(4), il numero di Fibonacci per n=2 viene calcolato 2 volte Procedura FIB(n) begin if n=0 or n=1 then return 1; a:=n-1;b:=n-2; f1:=FIBONACCI(a); f2:=FIBONACCI(b); return f1+f2; end
Programmazione Dinamica Algoritmo alternativo a FIB(n) Procedura FIB2(n) begin F:=(); i:=0; for i=0 to n do if i=0 then F[i]:=0; else if i=1 then F[i]:=1; F[i]:=F[i-1]+F[i-2]; end return F(n); NB: nella chiamata FIB2(4), il valore F[2] viene sfruttato 2 volte ma calcolato 1 volta
Programmazione Dinamica Passi fondamentali della Programmazione Dinamica Riduzione del problema in sottoproblemi Risoluzione di tutti i sottoproblemi possibili Risoluzione del problema originale tramite l’utilizzo delle soluzioni dei suoi sottoproblemi
Calcolo della distanza di edit Si considerino le sequenze : S1 = a1 a2 ... ai-1 ai ai+1 ... an S2 = b1 b2 ...... bj-1 bj bj+1... bm Costruiamo l’array: D(i,j) = distanza tra il prefisso a1a2…ai e il prefisso b1b2…bj Calcoliamo D(n,m) risolvendo il problema più generale di calcolare D(i,j) per qualunque combinazione di valori di i e j. La progr din ha tre componenti: relaz di ricorrenza, calcolo tabulare, risalita. Il risultato cercato sarà: D(n,m) = distanza tra a1 a2 ... an e b1 b2 ...bm
Calcolo della distanza di edit Si hanno tre possibilità per calcolare D(i,j), noto D(k,l) per k<i e l<j: il carattere ai va sostituito con il carattere bj e quindi: D(i,j) = D(i-1,j-1)+t(ai,bj) il carattere ai va cancellato e quindi: D(i,j) = D(i-1,j)+1 il carattere bj va inserito e quindi: D(i,j) = D(i,j-1)+1 Si hanno tre possibilità per calcolare D(i,j), noto D(k,l) per k<i e l<j: il carattere ai va sostituito con il bj e quindi: D(i,j) = distanza di edit tra i prefissi a1a2…ai-1 e b1b2…bj-1 + una operazione di sostituzione il carattere ai va cancellato e quindi: D(i,j) = distanza di edit tra i prefissi a1a2…ai-1 e b1b2…bj + una operazione di cancellazione il carattere bj va inserito e quindi: D(i,j) = distanza di edit tra i prefissi a1a2…ai e b1b2…bj-1 + una operazione di inserimento t(ai,bj)=1 se ai diverso da bj, altrimenti t(ai,bj)=0 Calcoliamo D(n,m) risolvendo il problema più generale di calcolare D(i,j) per qualunque combinazione di valori di i e j. La progr din ha tre componenti: relaz di ricorrenza, calcolo tabulare, risalita.
Calcolo della distanza di edit Si richiama quindi il calcolo di: a1 a2 ... ai-1 ai ai+1 ... an b1 b2 ...... bj-1 bj ... bm D(i-1,j-1) a1 a2 ... ai-1 ai ai+1 ... an b1 b2 ...... bj-1 bj ... bm D(i-1,j) a1 a2 ... ai-1 ai ai+1 ... an b1 b2 ...... bj-1 bj ... bm D(i,j-1)
Calcolo della distanza di edit Dal momento che si vuole un valore minimo, si ottiene la ricorrenza D(i,j) = MIN D(i-1,j-1)+t(ai,bj) D(i-1,j)+1 D(i,j-1)+1 Calcoliamo D(n,m) risolvendo il problema più generale di calcolare D(i,j) per qualunque combinazione di valori di i e j. La progr din ha tre componenti: relaz di ricorrenza, calcolo tabulare, risalita. che stabilisce un legame tra il generico sottoproblema D(i,j) e i sottoproblemi D(i-1,j-1), D(i-1,j) e D(i,j-1)
Calcolo della distanza di edit Ricorrenza: stabilisce un legame ricorsivo tra il valore di D(i,j) e i valori per indici più piccoli, fino a un valore base. BASE: D(i,0) = i D(0,j) = j PASSO: D(i,j) = min{D(i-1,j)+1; D(i,j-1)+1; D(i-1,j-1)+t(i,j)} con t(i,j) = 1 se ai ≠ bj 0 altrimenti
Calcolo della distanza di edit In particolare: per i=n e j=m, si ottiene la distanza di edit D(n,m) tra le sequenze S1 e S2 per i=0 e j>0, si ottiene la distanza di edit D(0,j) tra la sequenza nulla e e il prefisso b1b2…bj (D(0,j)=j) per i>0 e j=0, si ottiene la distanza di edit D(i,0) tra il prefisso a1a2…ai e la sequenza nulla e (D(i,0)=i) Calcoliamo D(n,m) risolvendo il problema più generale di calcolare D(i,j) per qualunque combinazione di valori di i e j. La progr din ha tre componenti: relaz di ricorrenza, calcolo tabulare, risalita.
Calcolo della distanza di edit I casi base, per i quali il valore di D è calcolabile immediatamente, sono: D(0,0) = 0 D(i,0) = i (i cancellazioni) D(0,j) = j (j cancellazioni) Calcoliamo D(n,m) risolvendo il problema più generale di calcolare D(i,j) per qualunque combinazione di valori di i e j. La progr din ha tre componenti: relaz di ricorrenza, calcolo tabulare, risalita.
Calcolo della distanza di edit Correttezza D(i,j) = D(i-1,j)+1, D(i,j-1)+1 oppure D(i-1,j-1)+t(ai,bj) Non ci sono altre possibilità 1.1 - Sia I l’ultima operazione per ottenere S2 da S1 Allora D(i,j) = D(i,j-1)+1 1.2 - Sia C l’ultima operazione per ottenere S2 da S1 Allora D(i,j) = D(i-1,j)+1 …… 2. D(i,j) ≤ min {D(i-1,j)+1, D(i,j-1)+1, D(i-1,j-1)+t(i,j)}
Calcolo della distanza di edit Esempio: calcolo della distanza di edit per S1=“winter” (n=6) e S2=“writers” (m=7) w r i t e s n Si costruisca la matrice D di n+1 (6+1) righe e m+1 (7+1) colonne La cella (1,1) avrà valore D(1,1) dato dal minimo tra: - D(0,0)+t(w,w)=0 - D(0,1)+1=2 - D(1,0)+1=2 Quindi: D(1,1)=0 La cella (1,2) avrà valore D(1,2) dato dal minimo tra: - D(0,1)+t(w,r)=2 - D(0,2)+1=3 - D(1,1)+1=1 Quindi: D(1,2)=1 …e così di seguito Si riempiano le celle D(0,j) e D(i,0) con i rispettivi valori dei casi base j e i Nella cella D(6,7) è memorizzata la distanza di edit tra S1 e S2 1 2 3 4 5 6 7 1 1 2 3 4 5 6 2 1 1 1 2 3 4 5 3 2 2 2 2 3 4 5 4 3 3 3 2 3 4 5 5 4 4 4 3 2 3 4 6 5 4 5 4 3 2 3 3
Calcolo della distanza di edit La trasformazione da S1 a S2 relativa alla cella (i,j) è di sostituzione del carattere ai con il carattere bj se D(i,j)=D(i-1,j-1)+t(ai,bj) cancellazione del carattere ai se D(i,j)=D(i-1,j)+1 inserimento del carattere bj se D(i,j)=D(i,j-1)+1 Se ai è uguale a bj, l’operazione di sostituzione è nulla Calcoliamo D(n,m) risolvendo il problema più generale di calcolare D(i,j) per qualunque combinazione di valori di i e j. La progr din ha tre componenti: relaz di ricorrenza, calcolo tabulare, risalita. NB: può esistere più di una trasformazione relativa alla cella (i,j)
Calcolo della distanza di edit Esempio: ricostruzione della trasformazione da S1=“winter” a S2=“writers” w r i t e s n 1 2 3 4 5 6 7 …e così di seguito La cella (6,6) è stata prodotta a partire dalla cella (5,5) La cella (6,7) è stata prodotta a partire dalla cella (6,6) 1 writers writers winters wiiters winters winters winter winters 2 Operazioni: Operazioni: ? 2 - inserimento di s 2 - sostituzione n i - sostituzione i r 2
Calcolo della distanza di edit La complessità in tempo dell’algoritmo è O(nm) per il riempimento della matrice di calcolo della distanza di edit O(n+m) per la ricostruzione della trasformazione da S1 a S2 Calcoliamo D(n,m) risolvendo il problema più generale di calcolare D(i,j) per qualunque combinazione di valori di i e j. La progr din ha tre componenti: relaz di ricorrenza, calcolo tabulare, risalita.