动态规划-序列联配问题(1)最优对齐

引言

序列联配是生物信息学最基础的概念,例如基因序列。
大多数数据分析分析策略都需要使用联配得到的信息。

例如输入法场景,我们有一个字典词库,用户输入的单词S(可能输错),我们需要尽快地找到字典词库中与它最像的单词,修正用户的输入。

问题

问题描述

两个字符串序列 S = S 1 S 2 . . . S n , T = T 1 T 2 . . . T n , S = S_1S_2...S_n,T = T_1T_2...T_n, S=S1S2...Sn,T=T1T2...Tn,计算联配(S′,T′),使得编辑操作数目s(S′,T′)最小。

问题分析

我们可以转化成对齐字符串。两个字符串T和S,我们对字符串每个对应位置的元素做以下定义,因为这样之后我们就可以进行补齐到等长:
在这里插入图片描述

  • S′[i] = ’-’:S[i] 相比于T[i]少了一个字母,称作删除
  • T′[i] = ‘-’: S′[i] 相比于T[i]多了一个字母,称作插入
  • S[i] 与 T[i] 位置元素相同,称作匹配

等长之后,方便我们就可以计算两个字符串之间的相似度(如果对齐需要的操作越少,理论上相似度越高),做出如下递推式,其中s(T‘,S’)为预定义的一个score函数,在这里就是匹配则score+1,如果没有匹配就扣分,遗漏字符或者多余了字符,这种严重性我们认为比输错字符更大,所以这里暂时规定输错-1,遗漏和多余-3。

O P T ( i , j ) = max ⁡ { s ( T i , S j ) + O P T ( i − 1 , j − 1 ) ; s ( ′ − ′ , S j ) + O P T ( i , j − 1 ) ; s ( T i , ′ − ′ ) + O P T ( i − 1 , j ) OPT(i,j)= \max \begin{cases} s(T_i,S_j) +OPT(i-1,j-1);\text{} \\ s('-',S_j) + OPT(i,j-1);\text{} \\ s(T_i,'-')+OPT(i-1,j) \end{cases} OPT(i,j)=maxs(Ti,Sj)+OPT(i1,j1);s(,Sj)+OPT(i,j1);s(Ti,)+OPT(i1,j)

这样之后,你会发现有多种对齐方案,原问题转化为如何找出最优的对齐方案(即使得s(T′,S′)分数最高)。

解决思路

用一个动态数组存储当前最优情况,不断更新决策,在当前状态下找到下一步最优。

举例说明
在这里插入图片描述
首先初始化0行和0列,先解释一下这个二维数组的意义,以红圈-9的位置为例,代表OPT("",“OCU”),即T为空,S为"OCU",因为T为空,S中每一个值只能和空格对齐,而和一次空格对齐就是-3,最终得分-9。我们可以计算第0行和第0列的元素,他们只能和空格对齐,因此都是-3的倍数。然后我们就能依据前面的递推公式进行计算了。
例如最后右下角max{3+1,0-3,0-3} = 4,这样我们可以获得最好的对齐分数是4。
max ⁡ { 1 + O P T ( " O C C U R R E N C " , " O C U R R A N C " ) − 3 + O P T ( " O C C U R R E N C " , " O C U R R A N C E " ) − 3 + O P T ( " O C C U R R E N C E " , " O C C U R R A N C " ) \max \begin{cases} 1+OPT("OCCURRENC","OCURRANC")\\ -3+OPT("OCCURRENC","OCURRANCE") \\ -3 + OPT("OCCURRENCE","OCCURRANC") \end{cases} max1+OPT("OCCURRENC","OCURRANC")3+OPT("OCCURRENC","OCURRANCE")3+OPT("OCCURRENCE","OCCURRANC")
在这里插入图片描述
伪代码如下:
在这里插入图片描述
要想知道实际的对齐方案是怎么样的,换句话说,即从右下角到左上角的路径(这个路径告诉我们S’与T’是如何生成的)。

这个过程用回溯方法即可解决。从4开始考虑,它是左上角三个格子通过加上一个score得到,那么我们也很容易通过让4扣除这个得分回到原来的格子,看其是否与格子实际分数相同,如果相同,则说明4是从该格子而来。下图例子可以看出只可能是4-1=3,所以是从3来的。
在这里插入图片描述

问题的最优是否最好?

在实际应用中,我们不一定按照最优的方案回溯,我们依据分数给每个决策方向设定一个概率,依据概率随机进行回溯。这样找到的解不一定是最优解,但是一个不错(次优)的解。例如输入法敲单词,用户可能存在记忆偏差,最优解不一定是用户想敲的词。在一个有问题的打分方案下,寻找最优并没有意义。我们依据概率对回溯做多次决策进行聚类,聚类的中心则是最优的联配方案。

如下图圈里,斜着走和向上走都是可以的。在这里插入图片描述

总结

  • 对于动态规划中的序列联配问题,第一点先思考如何将其转换成一个多步决策问题。本文中采用将原问题将S与T对齐转换成S如何从T中得出,分别列举了三种可能情况,这三种情况的划分是依据S和T递归下标的变化得出的,同时-1(匹配),S-1(插入),T-1(删除)。
  • 划分好依据后,就有三种不同的决策方向,如何选择决策方向是动态规划的特点,寻找最优解。
  • 如何初始化,和写好状态边界。

猜你喜欢

转载自blog.csdn.net/qq_32505207/article/details/108037011