赞
踩
动态规划 (Dynamic programming, DP) 是通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。
#f(n)=f(n-1)+f(n-2); f(0)=0; f(1)=1 #directly, inefficient, O(2^n) def f(n): if n==0: return 0 elif n==1: return 1 else: return f(n-1)+f(n-2) #top-down, O(n) def f(n): memo=[-1]*(n+1) if n == 0: return 0 if n == 1: return 1 if memo[n] == -1: memo[n]=f(n-1)+f(n-2) return memo[n] #down-top, O(n) def f(n): memo=[-1]*(n+1) memo[0]=0 memo[1]=1 for i in range(2,n+1): memo[i]=memo[i-1]+memo[i-2] return memo[n]
全局是指对两条序列所有残基进行比对。分别求三种比对状态的得分,最大值即为该位置最优比对。通过回溯,得到最佳比对结果。
F
(
i
,
j
)
=
{
F
(
i
−
1
,
j
−
1
)
+
s
(
x
i
,
y
j
)
,
x
i
:
y
j
F
(
i
−
1
,
j
)
+
d
,
x
i
:
−
F
(
i
,
j
−
1
)
+
d
,
y
j
:
−
F(i,j)=
公式1. Needleman-Wunch 算法的状态转移方程
相较全局比对,局部比对状态转移方程中引入了一个最小值0,这意味着由于回溯过程可以被最小值中断,及比对是局部的。这更符合只有部分片段相似的生物学现象·,如结构域、内含子等。
F
(
i
,
j
)
=
{
F
(
i
−
1
,
j
−
1
)
+
s
(
x
i
,
y
j
)
,
x
i
:
y
j
F
(
i
−
1
,
j
)
+
d
,
x
i
:
−
F
(
i
,
j
−
1
)
+
d
,
y
j
:
−
0
F(i,j)=
公式2. Smith-Waterman算法的状态转移方程
无论是数据库中存储、还是NGS产生的序列都具有数量庞大的特点。因而对于数据库搜索和NGS短序列比对问题,单纯使用双序列比对方法的开销巨大。为了降低开销到可用水平,此类问题一般先根据索引将query或reads定位到大致区间,然后再使用基于动态规划的算法进行比对。
data structure | size (human genome) | organize |
---|---|---|
suffix array | >=12GB | ordering |
suffix tree | >=45GB | grouping |
FM index | ~1GB | BWT |
#burrows-wheeler transform
#rotation
str+='$'
matrix=[]
for i in range(len(str)):
str=str[1:len(str)]+str[0]
matrix.append(str)
#sort according right context
bw_matrix=sorted(matrix)
#bwt,i.e. last column
last_column=[ i[-1] for i in bw_matrix]
lc=''.join(last_column)
由于第一列和最后一列的相邻关系(Last/First Mapping),可以将bwt逆转换,得到原始字符串。以下代码从概念上展示了这一过程。
#first column and count first_column=[ i[0] for i in bw_matrix] fc=''.join(first_column) count={} [count.setdefault(k,fc.count(k)) for k in set(fc)] #last column subscript array sub_D={'a':0,'c':0,'g':0,'t':0,'$':0} sub=[] for i in lc: sub_D[i]+=1 sub.append(sub_D[i]) #mapping def fc_index(c): global idx if c == 'a': idx=0 elif c == 'c': idx=count['a'] elif c == 'g': idx=count['a']+count['c'] elif c == 't': idx=count['a']+count['c']+count['g'] else: pass return idx ch=lc[0];ori=ch i=0 n=0 while n < len(lc)-2: print(ch) print(i,fc_index(ch),sub[i]) i=fc_index(ch)+sub[i] print(i,fc_index(ch),sub[i]) ch=lc[i] ori+=ch n+=1 ori=ori[::-1]
下图总结了上述的BWT算法过程。在了解BWT的概念后,紧接着的一个问题就是如何将之用做索引呢?
… …
参考
[1]【陈巍翻译】A42:基因组研究中用到的索引
[2]【陈巍翻译】A44:FM索引
[3] 陈凤珍,李玲,操利超,严志祥.四种常用的生物序列比对软件比较[J].生物信息学,2016,14(01):56-60.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。