機器學習是時下流行AI技術中一個很重要的方向,不管是有監督學習仍是無監督學習都使用各類「度量」來獲得不一樣樣本數據的差別度或者不一樣樣本數據的類似度。良好的「度量」能夠顯著提升算法的分類或預測的準確率,本文中將介紹機器學習中各類「度量」,「度量」主要由兩種,分別爲距離、類似度和相關係數,距離的研究主體通常是線性空間中點;而類似度研究主體是線性空間中向量;相關係數研究主體主要是分佈數據。本文主要介紹字符串距離。算法
在信息論中,兩個等長字符串之間的漢明距離(Hamming distance)是兩個字符串對應位置的不一樣字符的個數。換句話說,它就是將一個字符串變換成另一個字符串所須要替換的字符個數。機器學習
漢明重量是字符串相對於一樣長度的零字符串的漢明距離,也就是說,它是字符串中非零的元素個數:對於二進制字符串來講,就是1的個數,因此11101的漢明重量是4。例如:函數
1017101與1007001之間的漢明距離是2
9143896與9233796之間的漢明距離是3。
karolin與kathrin之間的漢明距離是3。學習
如圖1給出了漢明距離幾何意義,所示任意兩個頂點之間的最小距離是兩個二進制字符串之間的漢明距離。編碼
漢明距離是以理查德·衛斯里·漢明的名字命名的,漢明在偏差檢測與校訂碼的基礎性論文中首次引入這個概念。在通訊中累計定長二進制字中發生翻轉的錯誤數據位,因此它也被稱爲信號距離。漢明重量分析在包括信息論、編碼理論、密碼學等領域都有應用。可是,若是要比較兩個不一樣長度的字符串,不只要進行替換,並且要進行插入與刪除的運算,在這種場合下,一般使用更加複雜的編輯距離等算法。下面介紹另外一個經常使用的字符串距離——編輯距離。blog
編輯距離是針對二個字符串(例如英文字)的差別程度的量化量測,量測方式是看至少須要多少次的處理才能將一個字符串變成另外一個字符串,處理只包括插入一個字符、刪除一個字符、新增一個字符。編輯距離能夠用在天然語言處理中,例如拼寫檢查能夠根據一個拼錯的字和其餘正確的字的編輯距離,判斷哪個(或哪幾個)是比較可能的字。如下爲編輯距離的例子
"kitten" and "sitting"的編輯距離是3,這是由於:字符串
第一次處理:kitten → sitten (替換一個字符,"s" 替換了 "k")it
第二次處理:sitten → sittin (替換一個字符, "i" 替換了 "e")基礎
第三次處理:sittin → sitting (插入一個字符, 字符串末尾插入了 "g").二進制
那麼編輯距離如何計算了?假定函數dist(A, B)表示字串A轉變到字串B的編輯距
離,那麼對於下面3種極端狀況,咱們很容易給出解答(NULL表示空串)。
dist(NULL, NULL) = 0
dist(NULL, s) = s的長度
dist(s, NULL) = s的長度
對於通常的狀況,dist(A, B)咱們應該如何求解呢?假定咱們如今正在求解dist(A+c1, B+c2),在這裏A和B是字符串,c1和c2都是字符。dist(A+c1, B+c2)也就是把"A+c1"轉變成"B+c2"。在這個轉變過稱中,咱們要分狀況討論:
(1) A能夠直接轉變成B。這時咱們只要把c1轉成c2就能夠了(若是c1 != c2)。
(2) A+c1能夠直接轉變成B。這時咱們處理的方式是插入c2。
(3) A能夠直接轉成B+c2。這時的狀況是咱們須要刪除c1。
綜合上面三種狀況,dist(A+c1, B+c2)應該是三者的最小值。所以咱們能夠定義這樣一個函數——edit(i, j),它表示第一個字符串的長度爲i的子串到第二個字符串的長度爲j的子串的編輯距離。顯然能夠有以下動態規劃公式:
if i = 0 且 j = 0,edit(i, j) = 0
if i = 0 且 j > 0,edit(i, j) = j
if i > 0 且j =0,edit(i, j) = i
if i ≥ 1 且 j ≥ 1, 若A第i個字符等於B第j個字符edit(i, j)=min{edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1)};不然edit(i, j)=min{edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + 1}。
結合"kitten" and "sitting"可得圖2編輯距離矩陣,矩陣右下角數值就是兩個字符串編輯距離。