论文Fast and accurate short read alignment with Burrows-Wheeler transform

Fast and accurate short read alignment with Burrows-Wheeler transform

BWT(Burrows–Wheeler transform)

1. 按照字典排序

2. 例子,X=googol$

S(i),即按照字典排序后的序号i的suffix,所对应的一开始的序号。
B[i],即按照字典排序后的序号i的suffix,的最后一个字符。

 

 

表明了X的长度为n(包括$),最后一位就是$。

3. 后缀序列区间(SA intervals)

若W为X的子字符串,W在X中的出现位置必然会落在一个后缀区间内。(若落在不同的后缀区间则说明有multi-hits)
例如,W为go,X为上述所说。有go作为前缀的后缀的i为1,2,即后缀区间为[1,2]。
上图中的后缀区间左边界可以这么描述:在按照字典排序后的X后缀集合中,W为其前缀的后缀的新的序号们的最小值。
同理,后缀区间右边界则为最大值。

时刻需要注意的时,查找时,都是查找query是否为subject的前缀,而不是简单的存在与否。

4. 准确匹配:backward search

定义
a指某个字符,字母表中的。
C(a):在X[0,n-2](除了$外的原字符串上),比a字典排序小的字符的数量。
O(a,i):在B[0,i]的字符上,a的出现次数。


结论是


当且仅当上述条件成立时,aW为X的子字符串

 

例如,W为go,a=o,Rmin(aW) = 3 + 0 + 1,Rmax(aW) = 3 +1,所以ogo为X的子字符串。

如何理解反向搜索,在我们有了第一个字符串W的的后缀区间后,如果我们要继续往前添加字符去搜索,相当于在后缀树上的从下到上的搜索。在后缀区间上,由于后缀与B[i]是形成一个圆形的,所以B[i]其实就是i后缀的前一个字符。我们比较B[0,i-1]和B[0,i]其实就只是比较这个B[i]是否是这个a。

i = 0
j = len(X)
for x in range(len(query)):
  newChar = query[-x-1] # 从后往前找
  newI = C(newChar) + O(newChar, i - 1) +1 # 有了第一个后,第二个则在第一个的基础上找aW
  newJ = C(newChar) + O(newChar, J)
  i = newI
  J = newJ 
matches = S[i,J+1] # i>j不等时就已经说明该字符串已经不在X中

5. 模糊匹配:bounded traversal/backtracking(有界的遍历/回溯)

定义

  1. 引入D,按照准确匹配的算法进行计算,但O为反向的X建立的O_reverse的,当I大于J时,则将该字符的位置写入D,作为指示的作用。
  2. 模糊的递归:通过在后缀树上的递归+D以进行模糊匹配。

终止条件为:

  1. D比给定的最大不同字符数z还大
  2. z由于设定的penalty已经被减少的小于0
  3. 整个字符串都被匹配
  1. k和l的作用类似于准确匹配时的i和j。
    def inexact_recursion(self, query, i, z, k, l):
        tempset = set()
        # 2 stop conditions, one when too many differences have been encountered, another when the entire query has been matched, terminating in success
        if (z < self.get_D(i) and use_lower_bound_tree_pruning) or (
                z < 0 and not use_lower_bound_tree_pruning):  # reached the limit of differences at this stage, terminate this path traversal
            if debug: print "too many differences, terminating path\n"
            return set()  # return empty set
        if i < 0:  # empty query string, entire query has been matched, return SA indexes k:l
            if debug: print "query string finished, terminating path, success! k=%d, l=%d\n" % (k, l)
            for m in range(k, l + 1):
                tempset.add(m)
            return tempset

        result = set()
        if indels_allowed:
            result = result.union(self.inexact_recursion(query, i - 1, z - insertion_penalty, k,
                                                                        l))  # without finding a match or altering k or l, move on down the query string. Insertion
        for char in self.alphabet:  # for each character in the alphabet
            # find the SA interval for the char
            newK = self.C[char] + self.OCC(char, k - 1) + 1
            newL = self.C[char] + self.OCC(char, l)
            if newK <= newL:  # if the substring was found
                if indels_allowed: result = result.union(
                    self.inexact_recursion(query, i, z - deletion_penalty, newK, newL))  # Deletion
                if debug: print "char '%s found' with k=%d, l=%d. z = %d: parent k=%d, l=%d" % (
                char, newK, newL, z, k, l)
                if char == query[
                    i]:  # if the char was correctly aligned, then continue without decrementing z (differences)
                    result = result.union(self.inexact_recursion(query, i - 1, z, newK, newL))
                else:  # continue but decrement z, to indicate that this was a difference/unalignment
                    result = result.union(self.inexact_recursion(query, i - 1, z - mismatch_penalty, newK, newL))
        return result

最后感谢Jwomers的代码,毕竟原文章实在写的太晦涩难懂了....

参考

  1. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2705234/
  2. https://github.com/Jwomers/burrows_wheeler_alignment
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值