Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python DNA序列编辑距离的计算_Python_Dynamic Programming_Bioinformatics_Dna Sequence - Fatal编程技术网

Python DNA序列编辑距离的计算

Python DNA序列编辑距离的计算,python,dynamic-programming,bioinformatics,dna-sequence,Python,Dynamic Programming,Bioinformatics,Dna Sequence,因此,我的任务是在两个DNA序列之间以最低的成本对齐。失败的输入之一是: CGCAATTCTGAAGCGCTGGGGAAGACGGGT & TATCCCATCGAACGCCTATTCTAGGAT 正确的对齐需要24美元,但我需要23美元 我必须阅读转换基地的成本,比如A->T,G->C等。。。。我得到的成本文件是: *,-,A,T,G,C -,0,1,2,1,3 A,1,0,1,5,1 T,2,1,0,9,1 G,1,5,9,0,1 C,3,1,1,1,0 我制作了一个python

因此,我的任务是在两个DNA序列之间以最低的成本对齐。失败的输入之一是:

CGCAATTCTGAAGCGCTGGGGAAGACGGGT & TATCCCATCGAACGCCTATTCTAGGAT 
正确的对齐需要24美元,但我需要23美元

我必须阅读转换基地的成本,比如A->T,G->C等。。。。我得到的成本文件是:

*,-,A,T,G,C
-,0,1,2,1,3
A,1,0,1,5,1
T,2,1,0,9,1
G,1,5,9,0,1
C,3,1,1,1,0
我制作了一个python字典,它完美地链接了所有的基础,如下所示:

{'AT': '1', '-C': '3', 'TG': '9', '-G': '1', 'AC': '1', 'C-': '3', 'CA': '1', 'AA': '0', '--': '0', 'TA': '1', 'T-': '2', 'CG': '1', '-T': '2', 'CC': '0', 'GG': '0', 'A-': '1', 'CT': '1', 'AG': '5', 'GC': '1', 'GT': '9', 'GA': '5', 'G-': '1', '-A': '1', 'TC': '1', 'TT': '0'}
目前,我的实现在某些情况下有效,而在其他情况下,我以+/-1的速度关闭

以下是我的代码片段:

def align(one_Line, costBook):
    Split_Line = one_Line.split(",")
    array = [[0] * len(Split_Line[1]) for i in Split_Line[0]]  # Zero fill array,

    xLine = Split_Line[0]
    yLine = Split_Line[1]

    for i in range(1, len(xLine)):
        array[i][0] = array[i - 1][0] + int(costBook['-' + xLine[i - 1]])
    for i in range(1, len(yLine)):
        array[0][i] = array[0][i - 1] + int(costBook[yLine[i - 1] + '-'])

    for i in range(1, len(xLine)):
        for j in range(1, len(yLine)):
            array[i][j] = min(array[i - 1][j] + diff('-', xLine[i], costBook), 
                              array[i][j - 1] + diff(yLine[j], '-', costBook), 
                              array[i - 1][j - 1] + diff(yLine[j], xLine[i], costBook))
其中,diff函数为:

def diff(x, y, cost):
    if x == y:
        return 0
    keyStr = x + y
    return int(costBook[keyStr])
我哪里做错了?它是在实际的数组填充本身,还是我做的基本情况是错误的

编辑: 这是一个半工作版本,至少编辑成本是正确的:

AGTTGTGAAAGAACAAGCGCACAATATTGCCGCGCCGAAAGCT,TTCTTTCATTATTCAA‌​ATGTATAGTTTAGAGCGTTA‌​A

我相信你的算法失败的原因是你没有考虑数组中的“差距”行(记分矩阵)

考虑两个序列
A
B
,每个序列的长度
n
。如果我们看一下维基百科中关于和算法的文章,我们会发现在它们各自的“评分”矩阵中,开头有一行额外的内容。这表示
A
B
的第一个字符与间隙配对。我建议您快速查看这些页面,以了解我的意思

当您将数组定义为:

array = [[0] * len(Split_Line[1]) for i in Split_Line[0]]
您没有包括这一额外的行

您需要修改
align
函数来添加这一额外的行,并更改计算分数的逻辑。i、 e:

def align(one_Line, costBook):
    Split_Line = one_Line.split(",")

    # Defining an array with an extra row and col to represent a leading gap
    array = [[0] * (len(Split_Line[1])+1) for i in range(len(Split_Line[0])+1)]  # Zero fill array,

    xLine = Split_Line[0]
    yLine = Split_Line[1]

    # Changed so we include our extra line in the loop
    for i in range(1, len(xLine)+1):
        array[i][0] = array[i - 1][0] + int(costBook['-' + xLine[i - 1]])
    for i in range(1, len(yLine)+1):
        array[0][i] = array[0][i - 1] + int(costBook[yLine[i - 1] + '-'])

    # Changed so we include our extra row/col in the loop
    for i in range(1, len(xLine)+1):
        for j in range(1, len(yLine)+1):
            # The references to the original string now need -1 (i.e. i-1)
            array[i][j] = min(array[i - 1][j] + diff('-', xLine[i-1], costBook), 
                              array[i][j - 1] + diff(yLine[j-1], '-', costBook), 
                              array[i - 1][j - 1] + diff(yLine[j-1], xLine[i-1], costBook))
    return array

这应该是Needleman-Wunsch算法吗?另外,您如何知道正确的对齐成本应该是多少?相似但不完全相同,每个序列的长度可以是任何长度。匹配、不匹配或差距的成本可能会有所不同。哦,并且给出了适当的成本