1. 程式人生 > >字串的非精確匹配

字串的非精確匹配

字串的非精確匹配問題(inexact matching),也就是字串的對齊問題(string alignment)。對於字串的exact matching問題,KMP、Suffix Tree等方法是利器,但是對於inexact matching,這些方法就有些吃力了,雖然也能使用Suffix Tree解決一些錯配問題或萬用字元問題,但是使用範圍很有限。對於inexact matching,一般使用動態規劃( Dynamic Programming )處理。DP是老朋友了,時隔6年,好久不見。這裡使用的DP比較簡單,轉移方程容易理解,畢竟是簡單的線性DP。

編輯距離(Edit distance)

這道題很經典啊,當初刷這道題時真的沒想到今天會從生信的角度來重溫,切身體會見證了演算法的實用性。

轉移方程: D(i, j) = min[D(i - 1, j) + 1, D(i, j - 1) + 1, D(i -i, j-i) + t(i, j)].

初始條件:D(i, 0) = i ,D(0, j) = j.  

注:當Si(i) !=S2(j)時,t(i, j)=1;  當S1(i) = S2(j)時,t(i, j)=0. 


帶權重的編輯距離(Weighted edit distance)

匹配是需要代價或獎勵的。所謂權重,有兩種型別,第一種是基於基本操作的權重,第二種是基於代價表格的權重。

基於基本操作的權重。對於insertion或deletion給定代價d、對於substitution(replacement)給定代價r,對於match給定獎勵e,在此基礎上計算編輯距離。

轉移方程:D(i, j) = min[D(i, j - 1) + d, D(i - 1, j) + d, D(i - 1, j - 1) + t(i, j)]. 

初始條件:D(i, 0) = i x d ,D(0, j) = j x d. 

基於代價表格的權重。將insertion或deletion看成分別向兩個字串增加空格space(或破折號dash),將兩個字串出現過的所有字元和space(或破折號dash)組成新的集合,對於該集合中的任意兩個字元,給出匹配代價s(x,y),得到代價表格s。令V(i,j)表示兩個字首S1[1...i]和S2[1...j]的最優匹配代價。(常常將錯配代價記為負值,匹配獎勵記為正值,那麼此處的匹配代價說成匹配值比較好,並且需要使這個匹配值最大化)

轉移方程:V(i, j) = max[ V(i -1,j-1)+ s(S1(i), S2(j)), V(i - 1, j) + s(S1(i), - ), V(i, j-1)+s( _ , S2(j) ) ].

初始條件:

   


區域性匹配(Local alignment)

區域性匹配可能是更為常見的問題,比如蛋白質具有特定的功能片段(舉例:motif ),有的蛋白質在種間具有進化保守片段,等等問題實際上可以轉化為區域性匹配的問題。

先看一個定義:區域性字尾匹配(Local suffix alignment)。尋找字首S1[1...i]的字尾a 和字首S2[1...j]的字尾b,使得匹配值V(a,b)最大化,並記錄這個最大化的值為v(i, j)。可以證明,最佳區域性匹配的匹配值 vmax = max[v(i, j) : i <= n, j <= m]. 

轉移方程:v(i, j) = max[0, v(i - 1, j - 1) + s(S1(i), S2(j)), v(i -1,j) + s(S1(i),-), v(i, j - 1) + s(-, S2(j)) ].

初始條件:v(i, 0) = 0, v(0, j) = 0.


間隔問題(Gaps)

Gaps也是十分常見的問題,因為在生物序列匹配時,我們可能更關心匹配過程出現了多少個間隔,而不那麼關心每個間隔裡有多少空格。若出現一個Gap需要代價Wg,出現一個空格需要代價Ws,則出現一個連續m個空格形成的Gap需要代價Wg+m×Ws。利用Gaps模型,我們可以通過調整Wg和Ws的值,來實現不同的匹配效果:當增大Wg時,匹配結果更傾向於Gaps更少、片段更集中; 當增大Ws時,匹配結果更傾向於Gaps更多、片段更零散。

Gaps的權重有四種類型:常數型(constant)、仿射型(affine)、凸面型(convex)、任意型(arbitrary)。

常數型:maximize [Wm(# matches) - Wms(# mismatches) -Wg (# gaps)]. 

仿射型:maximize [Wm(# matches) - Wms(# mismatches) - Wg(# gaps) - Ws(# spaces)]. (仿射即:y=a+bx)

凸面型:在同一個Gap中,後面增加的space所需的代價比前面的space的代價小。如:Wg+log q(q表示Gap長度)。

任意型:根據Gap的長度不同,Gap總代價值w(q)為任意值(q表示Gap長度),即w(q+1)-w(q)不一定是常數。放射型是任意型的特例。


任意型

首先將匹配情況分為以下三種:


第一種情況,S1[i]與S2[k]對齊(其中k<j),也就是說,此時在S1的第i個位置後增加 (j-k)個空格實現對齊,記這種情況的最優匹配值為E(i ,j)。

第二種情況,S1[k]與S2[j]對齊(其中k<i),也就是說,此時在S2的第j個位置後增加 (i-k)個空格實現對齊,記這種情況的最優匹配值為F(i ,j)。

第三種情況,S1[i]與S2[j]對齊,記這種情況的最優匹配值為G(i ,j)。

記V(i ,j) 為 E(i ,j)、F(i ,j)、G(i ,j)的最大值。

轉移方程:


注意:w(q+1)-w(q)不一定是常數。

初始條件:



仿射型

轉移條件:


理解:若E(i ,j)由E(i ,j-1)轉移而來,則無需新建Gap,也就不需要花費代價Wg。F(i ,j)的理解同理。

初始條件:



凸面型

請參考Algorithms on Strings, Trees and Sequences一書的12.6章節,方法也是基於動態規劃。