基因序列算法:编辑距离( Levenshtein 距离)和LD算法
一、 Levenshtein 距離
? ? ? ? 許多基因算法(如Wagner-Fischer 算法)基于以下觀察計算編輯距離:如果我們構造一個矩陣來保存第一個字符串和第二個字符串的所有前綴,以及所有前綴之間的編輯距離(局部最優距離),那么我們可以通過填充填充來計算矩陣中的值,從而找到兩個完整字符串之間的距離作為計算的最后一個值。
????????下面用簡單的偽代碼實現,描述編輯距離的法則。它接受兩個字符串a和b,?之間的 Levenshtein 距離(長度分別為 ? 和 )由 ? 其中
? ? ? ? 其中某個字符串?的??是除了 的第一個字符之外的所有字符的字符串,并且 是字符串的第 個字符,從 0 開始計數。
????????請注意,最小值中的第一個元素對應于刪除(從 到 ),第二個對應于插入,第三個對應于替換。這個定義直接對應于樸素的遞歸實現。
例如,“kitten”和“sitting”之間的 Levenshtein 距離為 3,因為以下 3 次編輯將一個更改為另一個,并且少于 3 次編輯沒有辦法做到這一點:
- kitten → sitten(用“s”代替“k”),
- sitten → sittin(用“i”代替“e”),
- sitten→sitting(在末尾插入“g”)。
二、上限和下限
????????Levenshtein 距離有幾個簡單的上限和下限。這些包括:
- 至少是兩個字符串大小的差異。
- 它最多是較長字符串的長度。
- 當且僅當字符串相等時它才為零。
- 如果字符串具有相同的大小,則漢明距離是 Levenshtein 距離的上限。
- 漢明距離是兩個字符串中對應符號不同的位置數。
- 兩個字符串之間的 Levenshtein 距離不大于它們與第三個字符串的 Levenshtein 距離之和(三角不等式)。
????????兩個相同長度的弦之間的 Levenshtein 距離嚴格小于 Hamming 距離的示例由“flaw”和“lawn”對給出。這里 Levenshtein 距離等于 2(從前面刪除“f”;在末尾插入“n”)。漢明距離為 4。
三、Levenshtein 距離應用
????????在近似字符串匹配中,目標是在預期會有少量差異的情況下,在許多較長文本中找到短字符串的匹配項。例如,短字符串可能來自字典。在這里,一根弦通常很短,而另一根則任意長。這具有廣泛的應用,例如拼寫檢查器、光學字符識別的校正系統以及基于翻譯記憶庫輔助自然語言翻譯的軟件。
????????Levenshtein 距離也可以在兩個較長的字符串之間計算,但是計算它的成本大致與兩個字符串長度的乘積成正比,這使得這不切實際。因此,當用于在記錄鏈接等應用程序中幫助模糊字符串搜索時,比較字符串通常很短,以幫助提高比較速度。[需要引用]
????????在語言學中,Levenshtein 距離被用作量化語言距離或兩種語言彼此之間差異程度的度量。 [3]它與互懂度有關:語言距離越大,互懂度越低,語言距離越小,互懂度越高。
四、與其他編輯距離指標的關系
????????還有其他流行的編輯距離度量,它們是使用一組不同的允許編輯操作來計算的。例如,
- Damerau-Levenshtein 距離允許兩個相鄰字符的換位以及插入、刪除、替換;
- 最長公共子序列(LCS)距離只允許插入和刪除,不允許替換;
- 漢明距離只允許替換,因此,它只適用于相同長度的字符串。
- Jaro 距離只允許換位。
????????編輯距離通常定義為使用一組特定的允許編輯操作計算的可參數化度量,并且為每個操作分配一個成本(可能是無限的)。這通過 DNA 序列比對算法(例如 Smith-Waterman 算法)進一步推廣,該算法使操作的成本取決于其應用的位置。
五、全矩陣迭代
(注意:本節使用從 1 開始的字符串,而不是從 0 開始的字符串。)計算 Levenshtein 距離是基于以下觀察:如果我們保留一個矩陣來保存第一個字符串的所有前綴和第二個字符串的所有前綴之間的 Levenshtein 距離,那么我們可以以動態編程方式計算矩陣中的值,并且因此找到兩個完整字符串之間的距離作為計算的最后一個值。該算法是自下而上動態規劃的一個示例,在 1974 年由 Robert A. Wagner 和 Michael J. Fischer 撰寫的文章 The String-to-string correction problem 中討論了變體。 [4]這是函數 LevenshteinDistance 的簡單偽代碼實現,它接受兩個字符串,長度為 m 的 s 和長度為 n 的 t,并返回它們之間的 Levenshtein 距離: function LevenshteinDistance(char s[1..m], char t[1..n]):// for all i and j, d[i,j] will hold the Levenshtein distance between// the first i characters of s and the first j characters of tdeclare int d[0..m, 0..n]set each element in d to zero// source prefixes can be transformed into empty string by// dropping all charactersfor i from 1 to m:d[i, 0] := i// target prefixes can be reached from empty source prefix// by inserting every characterfor j from 1 to n:d[0, j] := jfor j from 1 to n:for i from 1 to m:if s[i] = t[j]:substitutionCost := 0else:substitutionCost := 1d[i, j] := minimum(d[i-1, j] + 1, // deletiond[i, j-1] + 1, // insertiond[i-1, j-1] + substitutionCost) // substitutionreturn d[m, n]六、LD算法
6.1 LD算法原理
算法目的:計算出兩字符序列的編輯距離,同時也能求出兩序列的匹配序列
假設:
比對的倆序列為:
則兩序列的長度分別為len(A) = n,Len(B)=m;
LD(A,B):字符串A和字符串B的編輯距離,即將字符串A轉換為字符串B所用的最少字符操作數。
LD(A,B)=0表示兩個字符串完全一樣。
LD(i,j)=LD(a1a2……ai,b1b2……bj),其中0≤i≤N,0≤j≤M
算法步驟:
1 初始化算法分數矩陣H,使行i表示字符ai,列j表示字符bj;
2 計算矩陣中每一項的LD(i, j):
若ai = bj,則LD(i, j) = LD(i-1, j-1) 取左上角的值
若ai ≠ bj,則LD(i, j) = Min( LD(i-1, j-1), LD(i-1, j), LD(i, j-1) ) +1
3 回溯,從矩陣右下角開始:
若ai=bj,則回溯到左上角單元格;
若ai≠bj,回溯到左上角、上邊、左邊中值最小的單元格,若有相同最小值的單元格,優先級按照左上角、上邊、左邊的順序。
4 根據回溯路徑,寫出匹配字符串:
若回溯到左上角單元格,將ai添加到匹配字串A‘,將bj添加到匹配字串B’;
若回溯到上邊單元格,將ai添加到匹配字串A’,將_添加到匹配字串B’;
若回溯到左邊單元格,將_添加到匹配字串A’,將bj添加到匹配字串B’。
5 矩陣右下角的值即為倆序列的編輯距離,回溯結果為全部匹配序列。
6.2 示例
給定字符串:A=GGATCGA,B=GAATTCAGTTA,評分矩陣:
| G | A | A | T | T | C | A | G | T | T | A | ||
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
| G | 1 | |||||||||||
| G | 2 | |||||||||||
| A | 3 | |||||||||||
| T | 4 | |||||||||||
| C | 5 | |||||||||||
| G | 6 | |||||||||||
| A | 7 |
在分數表中表示空字符串;比如第二行,與串GAATTCAGTTA距離從1到11隨位置而遞增。
第二列,表示串A=GGATCGA與之間的位置距離遞增。
| G | ||
| 0 | 1 | |
| G | 1 | X |
?如果X的位置為【i,j】那么X的值將為:
if i ==j :if? text(i,0) == text(0,j):fit(i,j) = 0elseif?text(i,0) != text(0,j):fit(i,j) = 1 elsefit(i,j) = 1因此上例中:X = 0 + 0 = 0
將全部矩陣填滿后,如下圖。紅線代表回溯,找出匹配路徑。
???? ? ? ? LD算法的流程和needleman wunsch算法是很類似的,區別在于LD算法使用的是最小值,NW算法使用的是最大值。
總結
以上是生活随笔為你收集整理的基因序列算法:编辑距离( Levenshtein 距离)和LD算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像处理:python实现canny算子
- 下一篇: 恢复错误:\anaconda3\lib\