美文网首页网课生物信息学与基因组学生物信息教程
【哈佛大学:计算生物学 & 生物信息学】学习记录(三)

【哈佛大学:计算生物学 & 生物信息学】学习记录(三)

作者: 陈有朴 | 来源:发表于2022-04-14 09:49 被阅读0次

局部比对算法 —— Smith-Waterman Algorithm

Swimt-Waterman算法本质上是一种Dynamic Programming(动态规划算法),和Needleman算法有许多相同之处。其分为3个步骤:Initialization —— Matrix Filling —— Trace Back。

Swith-Waterman算法相较于Needleman-Wunsch算法最大的区别就在于,在“matrix preparation阶段”,其用0表示mismatch的数值和比对过程中产生的gap数值。

SW算法,先构建一个(i+1)×(j+1)的矩阵。从左上角开始,以0作为其初始值,计算第一行和第一列的数值(此步骤计算为gap penalty的累加)。
【标注】此过程主要就是填充矩阵的第一行和第一列


由于SW算法将所有的负值用0进行替换,在进行上述计算步骤过后,其结果如下:

下一步进行的操作,称为“matrix filling”。将原始矩阵划分为4个一组2×2矩阵,每一个矩阵内右下角可以有3种相对位置,分别为left、diagonal、upper。

每一种相对位置的移动,代表着不同的序列比对方式,如下:

1、垂直方向上的移动 & 水平方向上的移动,其含义为Indel & gap

2、对角线移动,其含义为“substitution”,其可能为match 或 mismatch

之前给出的位置为A-A,因此为“match”的情况,且又因垂直和水平方向上的移动,其对应的数值为0,因此在该2×2矩阵内右下角位置对应的数值为1。

最终就可以将矩阵填充为如下结果:

SW比对的最后一步为“Trace Back”。整体过程可以描述为,从矩阵中的最大值开始,依次往回推,得到序列比对的结果。

全局比对算法 —— Needleman-Wunsch算法

作者提了一嘴,为什么需要做序列比对

  • Functionnal Relationship
  • Structural Relationship
  • Evolutionary Relationship

2种算法(ND & SW)之间的区别:

ND算法,并不会像SW算法一样,将比对过程中得到的gap penalty和mismatch负值转化为0,而是保留了对应负值,最终得到的矩阵结果为:


在Trace Back过程中,如果矩阵对应位置的碱基是匹配关系(相同),则下一步继续走对角线,如果矩阵对应位置的碱基不是相同的,则下一步需要走到的位置是2×2矩阵中最大值的方向。


可能出现的情况如下:


Needleman-Wunsch算法的Python实现,可以通过这个视频来学习学习:
https://www.youtube.com/watch?v=um8h3P216Fk

代码我也附带敲好了,如下:

#----------------Needleman-Wunsch-------------------#
# Importiing Modules
from threading import main_thread
import numpy as np
from pip import main

# Ask for sequences from the user
# sequence_1 = input("Enter or paste sequence 1:")
# sequence_2 = input("Enter or paste sequence 2:")


sequence_1 = "ATCGT"
sequence_2 = "ACGT"

# Create Matrices
main_matrix = np.zeros((len(sequence_1)+1, len(sequence_2)+1))
match_checker_matrix = np.zeros((len(sequence_1), len(sequence_2)))

# Providing the scores for match, mismatch and gap
match_reward = 1
mismatch_penalty = -1
gap_penalty = -2

# Fill the match checker matrix according to match or mismatch
for i in range(len(sequence_1)):
    for j in range(len(sequence_2)):
        if sequence_1[i] == sequence_2[j]:
            match_checker_matrix[i][j] = match_reward
        else:
            match_checker_matrix[i][j] = mismatch_penalty

# print(match_checker_matrix)

# Filling up the matrix using Needleman_Wunsch algorithm
# STEP 1: Initialization
for i in range(len(sequence_1)+1):
    main_matrix[i][0] = i*gap_penalty
for j in range(len(sequence_2)+1):
    main_matrix[0][j] = j*gap_penalty

# STEP 2: Matrix Filling
for i in range(1, len(sequence_1)+1):
    for j in range(1, len(sequence_2)+1):
        main_matrix[i][j] = max(main_matrix[i-1][j-1] + match_checker_matrix[i-1][j-1],
        main_matrix[i-1][j] + gap_penalty,
        main_matrix[i][j-1] + gap_penalty)

# print(main_matrix)

# STEP 3: TraceBack
aligned_1 = ""
aligned_2 = ""

ti = len(sequence_1)
tj = len(sequence_2)

while(ti > 0 and tj > 0):

    if (ti > 0 and tj > 0 and main_matrix[ti][tj] == main_matrix[ti-1][tj-1] + match_checker_matrix[ti-1][tj-1]):

        aligned_1 = sequence_1[ti - 1] + aligned_1
        aligned_2 = sequence_2[tj - 1] + aligned_2

        ti = ti - 1
        tj = tj - 1

    elif (ti > 0 and main_matrix[ti][tj] == main_matrix[ti-1][tj] + gap_penalty):
        aligned_1 = sequence_1[ti-1] + aligned_1
        aligned_2 = "-" + aligned_2
        
        ti = ti - 1
    else:
        aligned_1 = "-" + aligned_1
        aligned_2 = sequence_2[tj-1] + aligned_2

# test
print(aligned_1)
print(aligned_2)

序列比对算法

(1)Read Mapping

(2)Seed —— Kmer

(3)BLAST

在BLAST序列比对过程中,可以得到HSP(high-scoring segment pairs),同时在最后得到的结果中,我们只想保留“statistically significant HSPs”,此步骤的筛选,参考序列比对的得分。

Based on the scores of aligning 2 random seqs

在2条序列比对过程中,可能会出现多个HSP,如下:


参考文献:

http://www.sciencedirect.com/science/article/pii/S0022283605803602
https://academic.oup.com/nar/article/25/17/3389/1061651/

(4)Suffix Array

【标注】该方法用于构建基因组的索引(e.g. STAR)

1、Suffix Tree

软件:MUMmer
给定一条序列,并基于该序列,生成其对应的子序列。
e.g. BANANA


2、Suffix Array

软件:STAR

(5)Borrows-Wheeler transformation & LF mapping

软件:bwa,bowtie


1、Burrows-Wheeler Transform

BW算法概述:

  • 给定一条序列T(acaacg$);
  • 将序列尾部的字符转移至序列头部,循环该过程直到得到原序列;
  • 将序列进行排序($最小,其他按字母表排序)
  • 记录最后一列序列,舍弃其余信息

为什么使用BW算法?

将上述给定序列转化之后,可以达到对字符进行压缩(text compression)的目的(acaacg—— gc3ac)

2、LF mapping

LF mapping算法可以将BW算法记录的算法还原。


3、使用BW算法进行序列比对

e.g. Query Q = aac, DB = T acaacg, BWT(T) = gc3ac

给出的序列第一位是a,第两位是ac。需要注意的是,这边的查找是倒序的,即caa。

首先,基于最后一列数据找到第一列序列c的坐标范围(5 & 6),且由于c前2个字符为两个a,以此作为条件进行缩小搜索范围的前提。


以字符c作为开头的序列,对应字符a在第一列的坐标范围为(3 & 4)。此步骤找到了query序列中第二个a的范围,下一步基于此过程的比对结果,确定最后一个a的位置。

相关文章

网友评论

    本文标题:【哈佛大学:计算生物学 & 生物信息学】学习记录(三)

    本文链接:https://www.haomeiwen.com/subject/vzqtertx.html