2013-08-07 1 views
8

아핀 갭 패널티 함수를 사용하여 로컬 시퀀스 정렬을위한 Smith-Waterman 알고리즘을 구현하려고합니다. 나는 정렬 점수를 계산하는 데 필요한 행렬을 시작하고 계산하는 방법을 이해하지만 정렬을 찾기 위해 역 추적하는 방법을 알지 못한다고 생각합니다. 필요한 3 행렬을 생성하려면 다음 코드를 사용하십시오.아핀 갭 페널티가있는 Smith-Wateman 알고리즘의 추적

for j in range(1, len2): 
    for i in range(1, len1): 
     fxOpen = F[i][j-1] + gap 
     xExtend = Ix[i][j-1] + extend 
     Ix[i][j] = max(fxOpen, xExtend) 

     fyOpen = F[i-1][j] + gap 
     yExtend = Iy[i-1][j] + extend 
     Iy[i][j] = max(fyOpen, yExtend) 

     matchScore = (F[i-1][j-1] + simMatrixDict[seq1[i-1]+seq2[j-1]]) 
     xScore = Ix[i-1][j-1] + simMatrixDict[seq1[i-1]+seq2[j-1]] 
     yScore = Iy[i-1][j-1] + simMatrixDict[seq1[i-1]+seq2[j-1]] 
     F[i][j] = max(0, matchScore, xScore, yScore) 

역 추적을위한 단일 행렬이 필요한지 확실하지 않습니까? F에서 최대 점수를 추적하는 방법에 대한 명확한 설명을 주시면 감사하겠습니다.

+0

연습으로 알고리즘을 구현하려고합니까? Python 구현을 온라인에서 찾을 수 있습니다. 예 : [one] (https://github.com/alevchuk/pairwise-alignment-in-python), [two] (https://pypi.python.org/pypi/swalign/0.2), [three] (https://github.com/kevinakwok/bioinfo/tree/master/Smith-Waterman), [four] (http://forrestbao.blogspot.com/2007/09/smith-waterman-algorithm-in-process.html). –

+1

답장을 보내 주셔서 감사 합니다만 그 중 하나 (2 개) 중 하나만이 제가 아는 affine gap penalty 기능을 포함하고 있습니다. 불행히도 그 코드는 저를 넘어서 조금 있습니다. 단지 2 개월 정도만있었습니다. – jonwells

답변

4

Smith-Waterman의 추적에 대해 기억해야 할 중요한 점은 값이있는 행렬이 이동하는 방향을 결정한다는 것입니다. 따라서 F에 있으면 대각선으로 이동합니다. Ix이면 가로로 이동하고, Iy이면 세로로 이동합니다. 즉, 포인터 행렬에 저장해야하는 것은 사각형에 도착한 행렬입니다. 당신이가는 행렬이 아닌 당신이 오는 행렬이 갈 방향을 결정합니다.

예를 들어

:

당신이 F[5][5]에있다 말 : 포인터 매트릭스 Ix로 이동 말한다

  • 경우 포인터 행렬 Iy에 가서 말한다면, Ix[4][4]
  • 로 이동, 이동 ~ Iy[4][4]
  • 포인터 행렬이 F으로 이동한다고하면로 이동하십시오. 당신이 Ix[5][5]에있는 경우 반면

: 포인터 매트릭스 F에 가서 말한다면

  • 포인터 행렬 Ix에 가서 말한다면

    Ix[4][5]
  • 로 이동 F[4][5]
로 이동

또는 Iy[5][5] 인 경우 :

012 포인터 행렬 Iy로 이동라고하면 포인터 행렬 F로 이동라고하면 3,516,
  • , Iy[5][4]
  • 이동, 첫 번째 인덱스는이 X 좌표라고 가정 F[5][4]

로 이동하여 상기 제는 y 좌표

는 포인터 행렬을 구축 0

의 최대 값을 셀에 도달 할 때까지 다시 추적을 계속 : 당신은 F, IxIy에 대해 하나의 포인터 매트릭스 각이 필요합니다. 이 행렬은 어느 행렬에서 값이 왔는지 나타낼 필요가 있습니다. 이는 행렬이 어느 방향으로 이동했는지 알려주기 때문입니다.따라서 알고리즘의 동적 프로그래밍 단계를 실행하면서 포인터 행렬을 구축해야합니다. F, Ix 또는 Iy의 셀에 새로운 최대 값을 저장할 때마다 해당 행렬을 업데이트하여 해당 출처를 나타냅니다. 예를 들어 F[5][5]에있을 수있는 가장 높은 값이 F[4][4]에있을 때 두 개의 다음 기지를 정렬하면 F 행렬에 있기 때문에 Fpointer [5] [5]를 F으로 설정해야합니다.

+0

빠른 답장을 보내 주셔서 감사합니다.하지만 포인터 매트릭스를 작성하는 방법은 고민 중입니다. 3 가지 점수 매트릭스가 서로 독립적으로 만들어져있는 것 같아서, 내가 어떻게 움직일 지 결정할 방법을 알 수는 없습니까? 아마도 당신은 왼쪽, 위, 대각선을 가리킬 필요가있을 것입니다. 그러면 어떤 행렬로 이동할 것인지 알려주는 추가 포인터가 있습니까? – jonwells

+1

좋아, 나는 그것에 대한 더 많은 정보를 포함하도록 나의 대답을 편집했다. 기본적으로 3 개의 행렬 각각에 대해 서로 다른 포인터 행렬이 필요하지만 그 행렬에서 가장 높은 값을 얻었을 때 나온 행렬 만 기록하면됩니다. 이동 행렬에 대해 알아야 할 모든 것을 알려주기 때문에 . 트레이스 백 (traceback)에 대해 묻는 중이므로 동적 프로그래밍이 작동한다고 가정하고 있으므로 각 셀에서 가능한 최상의 값을 찾을 수 있습니다. 포인터 매트릭스를 설정하는 것은 그 값을 얻는 방법을 추적하는 일입니다. – seaotternerd

+0

나는 아직도 여기에 의심의 여지가있다. 시간이 있다면 의사 코드에서 3 행렬이 필요한 이유를 보여줄 수 있습니까? 내가 이렇게 생각한 방식 : 추적은 단순히 방향을 저장하는 것입니다. 역 추적하는 동안 왜 다른 행렬로 점프해야하는지 이해가되지 않습니다. DP에서, 우리는이 값이 왔던 방향을 저장하여 되돌아 가도록합니다 (DIAG, LEFT 또는 UP). x, y의 최대 값이 F에서 왔을 경우 1x, LEFT 등의 경우 DIAG입니다. 나는 이것이 옳다는 것을 말하지 않고있다 - 나는 단지 혼란 스럽다. 내가 어디서 왔고 어디에서 왔는지 어떻게 저장합니까? – francisaugusto

관련 문제