1. 程式人生 > >python3 使用Edit distance(編輯距離)求兩個二進位制序列的相似性

python3 使用Edit distance(編輯距離)求兩個二進位制序列的相似性

編輯距離:

又稱Levenshtein距離(萊文斯坦距離也叫做Edit Distance),是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數,如果它們的距離越大,說明它們越是不同。許可的編輯操作包括將一個字元替換成另一個字元,插入一個字元,刪除一個字元。

具體的執行過程參考點選開啟連結 這篇部落格

import math
def minEditDist(sm,sn):
    m,n = len(sm)+1,len(sn)+1

    # create a matrix (m*n)
    matrix = [[0]*n for i in range(m)]
    #初始化矩陣
    matrix[0][0]=0
    for i in range(1,m):
        matrix[i][0] = matrix[i-1][0] + 1

    for j in range(1,n):
        matrix[0][j] = matrix[0][j-1]+1


    for i in range(m):
        print (matrix[i])


    print ("********************")

    cost = 0

    for i in range(1,m):
        for j in range(1,n):
            if sm[i-1]==sn[j-1]:
                cost = 0
            else:
                cost = 1
            matrix[i][j]=min(matrix[i-1][j]+1,matrix[i][j-1]+1,matrix[i-1][j-1]+cost)


    for i in range(m):
        print (matrix[i])

    return matrix[m-1][n-1]



bit1='11010011010101011001011111011111001110111110111110000000001000100001100100001010011000111010000100101010011000110101110011111000' 
bit2='00111100011111100110100111111100111101111110111111001000001001001110011000011001100100010100110011010111001111100010101011110011'
if __name__ == "__main__":
   mindist=minEditDist(bit1,bit2)
   print (mindist)
   len1=len(bit1)
   len2=len(bit2)
   print('the similarity is ',1-mindist/max(len1,len2 ))

最後輸出兩個序列的相似性。