Blast比对算法原理与实现形式
做生物的同学必定据说过blast比对这个办法,个别在NCBI等网站上能够在线进行比对,也能够在本地服务器进行比对,那么blast算法到底是怎么实现对不同序列的比对呢?
本文分享经典blast算法的根底原理,以及通过R语言和Python实现这个算法,不依赖网站本人进行序列比对。
什么是BLAST比对?
BLAST(Basic Local Alignment Search Tool)是一种罕用的生物信息学算法,用于比对两个或多个序列。BLAST通过寻找两个序列之间的最大匹配来确定它们之间的相似性。
算法原理
BLAST算法的原理:
将查问序列与数据库中的序列进行比对,找到最佳匹配。
BLAST算法的逻辑:首先将查问序列进行分段,而后将这些分段与数据库中的序列进行比对。
K-mer小片段
在比对过程中,BLAST算法应用一种称为K-mer的技术,将查问序列和数据库序列分成长度为K的小片段,而后将这些小片段进行比对。
如果两个小片段具备类似的序列,BLAST算法就会将它们合并成更长的序列,以便进行更精确的比对。
特点与利用
BLAST算法的长处是速度快、准确度高,能够在大型数据库中疾速查找类似序列。BLAST算法在生物信息学畛域中被广泛应用,用于基因正文、蛋白质构造预测、序列比对等方面。
不同序列blast比拟算法
- 将查问序列和数据库序列别离转换为碱基对应的数字编码,例如A示意为1,C示意为2,G示意为3,T示意为4。
- 将查问序列划分成长度为k的小片段,称为k-mer。
- 将数据库序列划分成长度为k的小片段,称为k-mer。
- 对于每个查问序列的k-mer,查找数据库序列中所有与之匹配的k-mer。
- 对于每个匹配的k-mer,计算查问序列和数据库序列之间的类似度得分。
- 对于每个查问序列的k-mer,抉择类似度得分最高的匹配序列,并将其作为最佳匹配。
- 对于每个最佳匹配,计算匹配序列的长度、类似度得分、E值等参数。
- 依据E值和类似度得分,对匹配后果进行排序,输入最终的比对后果。
BLAST算法的具体实现可能会有所不同,上述算法仅作为一个示例,理论利用中须要依据具体情况进行调整。
此外,BLAST算法的计算复杂度较高,如果对于理论生物数据处理,须要应用高性能计算机或云计算平台进行计算。
R语言中实现blast算法
以下是一个基于R语言的BLAST比对算法示例,用于比对两个DNA序列:
# 导入Biostrings包library(Biostrings)# 定义查问序列和数据库序列query_seq <- DNAString("ATCGATCGATCGATCG")db_seq <- DNAString("CGATCGATCGATCGATC")# 定义k-mer的长度k <- 3# 将查问序列和数据库序列别离转换为数字编码query_seq_num <- as.numeric(query_seq)db_seq_num <- as.numeric(db_seq)# 将查问序列和数据库序列别离划分成k-merquery_kmer <- kmer(query_seq_num, k)db_kmer <- kmer(db_seq_num, k)# 对于每个查问序列的k-mer,查找数据库序列中所有与之匹配的k-mermatches <- matchPattern(query_kmer, db_kmer)# 对于每个匹配的k-mer,计算查问序列和数据库序列之间的类似度得分scores <- pmatch(query_kmer, db_kmer, fixed=FALSE)# 对于每个查问序列的k-mer,抉择类似度得分最高的匹配序列,并将其作为最佳匹配best_matches <- maxMatches(matches)# 对于每个最佳匹配,计算匹配序列的长度、类似度得分、E值等参数match_length <- width(best_matches)match_score <- scores[best_matches]e_value <- length(db_kmer) * (1 - exp(-match_score))# 依据E值和类似度得分,对匹配后果进行排序,输入最终的比对后果result <- data.frame(query_seq, db_seq, match_length, match_score, e_value)result <- result[order(result$e_value),]
Python实现blast算法
首先,须要装置Biopython库来实现BLAST比对算法。您能够应用以下命令在终端中装置Biopython:
pip install biopython
接下来,能够应用以下代码来实现BLAST比对算法:
from Bio.Blast import NCBIWWWfrom Bio.Blast import NCBIXML# 进行BLAST比对result_handle = NCBIWWW.qblast("blastn", "nt", "ACGTGAGGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGC")# 读取BLAST比对后果blast_record = NCBIXML.read(result_handle)# 输入比对后果for alignment in blast_record.alignments: for hsp in alignment.hsps: print('****Alignment****') print('sequence:', alignment.title) print('length:', alignment.length) print('e value:', hsp.expect) print(hsp.query[0:75] + '...') print(hsp.match[0:75] + '...') print(hsp.sbjct[0:75] + '...')
这段代码会将序列"ACGTGAGGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGC"与NCBI的nt数据库进行比对。
本文由mdnice多平台公布