机器学习中的相似性度量 (转)
在做分類時常常需要估算不同樣本之間的相似性度量(Similarity Measurement),這時通常采用的方法就是計算樣本間的“距離”(Distance)。采用什么樣的方法計算距離是很講究,甚至關系到分類的正確與否。 本文的目的就是對常用的相似性度量作一個總結。
1.?歐氏距離(Euclidean Distance)
? ?? ? 歐氏距離是最易于理解的一種距離計算方法,源自歐氏空間中兩點間的距離公式。
(1)二維平面上兩點a(x1,y1)與b(x2,y2)間的歐氏距離:
<ignore_js_op>?
(2)三維空間兩點a(x1,y1,z1)與b(x2,y2,z2)間的歐氏距離:
<ignore_js_op>?
(3)兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的歐氏距離:
<ignore_js_op>?
也可以用表示成向量運算的形式:
<ignore_js_op>?
(4)Matlab計算歐氏距離
2.?曼哈頓距離(Manhattan Distance)
? ?? ? 從名字就可以猜出這種距離的計算方法了。想象你在曼哈頓要從一個十字路口開車到另外一個十字路口,駕駛距離是兩點間的直線距離嗎?顯然不是,除非你能穿越大樓。實際駕駛距離就是這個“曼哈頓距離”。而這也是曼哈頓距離名稱的來源, 曼哈頓距離也稱為城市街區距離(City Block distance)。
(1)二維平面兩點a(x1,y1)與b(x2,y2)間的曼哈頓距離
<ignore_js_op>?
(2)兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的曼哈頓距離
<ignore_js_op>?
(3) Matlab計算曼哈頓距離
3.?切比雪夫距離?( Chebyshev Distance )?
? ?? ? 國際象棋玩過么?國王走一步能夠移動到相鄰的8個方格中的任意一個。那么國王從格子(x1,y1)走到格子(x2,y2)最少需要多少步?自己走走試試。你會發現最少步數總是max( | x2-x1 | , | y2-y1 | ) 步。有一種類似的一種距離度量方法叫切比雪夫距離。
(1)二維平面兩點a(x1,y1)與b(x2,y2)間的切比雪夫距離
(2)兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的切比雪夫距離
<ignore_js_op>?
這個公式的另一種等價形式是
<ignore_js_op>?
? ?? ? 看不出兩個公式是等價的?提示一下:試試用放縮法和夾逼法則來證明。
(3)Matlab計算切比雪夫距離
4.?閔可夫斯基距離(Minkowski Distance)
閔氏距離不是一種距離,而是一組距離的定義。
(1) 閔氏距離的定義
? ?? ? 兩個n維變量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的閔可夫斯基距離定義為:
<ignore_js_op>?
? ?? ? 根據變參數的不同,閔氏距離可以表示一類的距離。
(2)閔氏距離的缺點
閔氏距離,包括曼哈頓距離、歐氏距離和切比雪夫距離都存在明顯的缺點。
舉個例子:二維樣本(身高,體重),其中身高范圍是150~190,體重范圍是50~60,有三個樣本:a(180,50),b(190,50),c(180,60)。那么a與b之間的閔氏距離(無論是曼哈頓距離、歐氏距離或切比雪夫距離)等于a與c之間的閔氏距離,但是身高的10cm真的等價于體重的10kg么?因此用閔氏距離來衡量這些樣本間的相似度很有問題。
? ?? ? 簡單說來,閔氏距離的缺點主要有兩個:(1)將各個分量的量綱(scale),也就是“單位”當作相同的看待了。(2)沒有考慮各個分量的分布(期望,方差等)可能是不同的。
(3)Matlab計算閔氏距離
5.?標準化歐氏距離?(Standardized Euclidean distance )
(1)標準歐氏距離的定義
標準化歐氏距離是針對簡單歐氏距離的缺點而作的一種改進方案。標準歐氏距離的思路:既然數據各維分量的分布不一樣,好吧!那我先將各個分量都“標準化”到均值、方差相等吧。均值和方差標準化到多少呢?這里先復習點統計學知識吧,假設樣本集X的均值(mean)為m,標準差(standard deviation)為s,那么X的“標準化變量”表示為:
而且標準化變量的數學期望為0,方差為1。因此樣本集的標準化過程(standardization)用公式描述就是:
<ignore_js_op>?
標準化后的值 =??( 標準化前的值??- 分量的均值 ) /分量的標準差
經過簡單的推導就可以得到兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的標準化歐氏距離的公式:
<ignore_js_op>?
如果將方差的倒數看成是一個權重,這個公式可以看成是一種加權歐氏距離(Weighted Euclidean distance)。
(2)Matlab計算標準化歐氏距離
6.?馬氏距離(Mahalanobis Distance)
(1)馬氏距離定義
? ?? ? 有M個樣本向量X1~Xm,協方差矩陣記為S,均值記為向量μ,則其中樣本向量X到u的馬氏距離表示為:
<ignore_js_op>?
? ?? ? 而其中向量Xi與Xj之間的馬氏距離定義為:
<ignore_js_op>?
? ?? ? 若協方差矩陣是單位矩陣(各個樣本向量之間獨立同分布),則公式就成了:
<ignore_js_op>?
? ?? ? 也就是歐氏距離了。
若協方差矩陣是對角矩陣,公式變成了標準化歐氏距離。
(2)馬氏距離的優缺點:量綱無關,排除變量之間的相關性的干擾。
(3) Matlab計算(1 2),( 1 3),( 2 2),( 3 1)兩兩之間的馬氏距離
?
結果: Y = 2.3452? ? 2.0000? ? 2.3452? ? 1.2247? ? 2.4495? ? 1.2247
7.?夾角余弦(Cosine)
? ?? ? 有沒有搞錯,又不是學幾何,怎么扯到夾角余弦了?各位看官稍安勿躁。幾何中夾角余弦可用來衡量兩個向量方向的差異,機器學習中借用這一概念來衡量樣本向量之間的差異。
(1)在二維空間中向量A(x1,y1)與向量B(x2,y2)的夾角余弦公式:
<ignore_js_op>?
(2) 兩個n維樣本點a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夾角余弦
? ?? ? 類似的,對于兩個n維樣本點a(x11,x12,…,x1n)和b(x21,x22,…,x2n),可以使用類似于夾角余弦的概念來衡量它們間的相似程度。
<ignore_js_op>?
即:
<ignore_js_op>?
? ?? ? 夾角余弦取值范圍為[-1,1]。夾角余弦越大表示兩個向量的夾角越小,夾角余弦越小表示兩向量的夾角越大。當兩個向量的方向重合時夾角余弦取最大值1,當兩個向量的方向完全相反夾角余弦取最小值-1。
? ?? ? 夾角余弦的具體應用可以參閱參考文獻[1]。
(3)Matlab計算夾角余弦
8.?漢明距離(Hamming distance)
(1)漢明距離的定義
? ?? ? 兩個等長字符串s1與s2之間的漢明距離定義為將其中一個變為另外一個所需要作的最小替換次數。例如字符串“1111”與“1001”之間的漢明距離為2。
? ?? ? 應用:信息編碼(為了增強容錯性,應使得編碼間的最小漢明距離盡可能大)。
(2)Matlab計算漢明距離
Matlab中2個向量之間的漢明距離的定義為2個向量不同的分量所占的百分比。
? ?? ? 例子:計算向量(0,0)、(1,0)、(0,2)兩兩間的漢明距離
9.?杰卡德相似系數(Jaccard similarity coefficient)
(1) 杰卡德相似系數
? ?? ? 兩個集合A和B的交集元素在A,B的并集中所占的比例,稱為兩個集合的杰卡德相似系數,用符號J(A,B)表示。
<ignore_js_op>?
杰卡德相似系數是衡量兩個集合的相似度一種指標。
(2) 杰卡德距離
? ?? ? 與杰卡德相似系數相反的概念是杰卡德距離(Jaccard distance)。杰卡德距離可用如下公式表示:
<ignore_js_op>?
杰卡德距離用兩個集合中不同元素占所有元素的比例來衡量兩個集合的區分度。
(3) 杰卡德相似系數與杰卡德距離的應用
? ?? ? 可將杰卡德相似系數用在衡量樣本的相似度上。
樣本A與樣本B是兩個n維向量,而且所有維度的取值都是0或1。例如:A(0111)和B(1011)。我們將樣本看成是一個集合,1表示集合包含該元素,0表示集合不包含該元素。
?
那么樣本A與B的杰卡德相似系數可以表示為: 這里p+q+r可理解為A與B的并集的元素個數,而p是A與B的交集的元素個數。 而樣本A與B的杰卡德距離表示為:<ignore_js_op>?
(4)Matlab 計算杰卡德距離
10.?相關系數?( Correlation coefficient )與相關距離(Correlation distance)
(1) 相關系數的定義
<ignore_js_op>?
相關系數是衡量隨機變量X與Y相關程度的一種方法,相關系數的取值范圍是[-1,1]。相關系數的絕對值越大,則表明X與Y相關度越高。當X與Y線性相關時,相關系數取值為1(正線性相關)或-1(負線性相關)。
(2)相關距離的定義
<ignore_js_op>?
? ?? ?其中0.4781就是相關系數,0.5219是相關距離。
11.?信息熵(Information Entropy)
? ?? ? 信息熵并不屬于一種相似性度量。那為什么放在這篇文章中啊?這個。。。我也不知道。 (╯▽╰)
信息熵是衡量分布的混亂程度或分散程度的一種度量。分布越分散(或者說分布越平均),信息熵就越大。分布越有序(或者說分布越集中),信息熵就越小。
? ?? ? 計算給定的樣本集X的信息熵的公式:
<ignore_js_op>?
參數的含義:
n:樣本集X的分類數
pi:X中第i類元素出現的概率
? ?? ? 信息熵越大表明樣本集S分類越分散,信息熵越小則表明樣本集X分類越集中。。當S中n個分類出現的概率一樣大時(都是1/n),信息熵取最大值log2(n)。當X只有一個分類時,信息熵取最小值0
參考資料:
[1]吳軍. 數學之美 系列 12 - 余弦定理和新聞的分類.
http://www.google.com.hk/ggblog/googlechinablog/2006/07/12_4010.html
[2] Wikipedia. Jaccard index.?
http://en.wikipedia.org/wiki/Jaccard_index
[3] Wikipedia. Hamming distance
http://en.wikipedia.org/wiki/Hamming_distance
[4] 求馬氏距離(Mahalanobis distance )matlab版
http://junjun0595.blog.163.com/blog/static/969561420100633351210/
[5] Pearson product-moment correlation coefficient
http://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient
---------------------------------------
http://stblog.baidu-tech.com/?p=1846
相似度計算常用方法綜述
引言? ?? ? 相似度計算用于衡量對象之間的相似程度,在數據挖掘、自然語言處理中是一個基礎性計算。其中的關鍵技術主要是兩個部分,對象的特征表示,特征集合之間的相似關系。在信息檢索、網頁判重、推薦系統等,都涉及到對象之間或者對象和對象集合的相似性的計算。而針對不同的應用場景,受限于數據規模、時空開銷等的限制,相似度計算方法的選擇又會有所區別和不同。下面章節會針對不同特點的應用,進行一些常用的相似度計算方法進行介紹。
2向量空間模型向量空間模型(Vector space model)是應用最廣泛的一個基礎相似度計算模型,在該模型中,每個對象映射為一個特征向量:
<ignore_js_op>?
<ignore_js_op>?
作為一個應用廣泛的模型,向量空間模型在現有的很多應用中仍然起著至關重要的作用,也是很多擴展方法的基礎。
3 基于hash方法的相似計算? ?? ? 基于hash的相似度計算方法,是一種基于概率的高維度數據的維度削減的方法,主要用于大規模數據的壓縮與實時或者快速的計算場景下,基于hash方法的相似度計算經常用于高維度大數據量的情況下,將利用原始信息不可存儲與計算的問題轉化為映射空間的可存儲計算問題,在海量文本重復性判斷方面,近似文本查詢方面有比較多的應用,google的網頁去重[1],google news的協同過濾[2,3]等都是采用hash方法進行近似相似度的計算,比較常見的應用場景Near-duplicate detection、Image similarity identification、nearest neighbor search,常用的一些方法包括I-match,Shingling、Locality-Sensitive Hashing族等方法,下面針對幾種常見的hash方法進行介紹。
3.1 minhash方法介紹? ?? ? Minhash方法是Locality-sensitive hashing[4,5]算法族里的一個常用方法,基本的思想是,對于每一個對象的itemlist,將輸入的item進行hash,這樣相似的item具有很高的相似度被映射到相同的buckets里面,這樣盡量保證了hash之后兩個對象之間的相似程度和原來是高相似的,而buckets的數量是遠遠小于輸入的item的,因此又達到降低復雜度的目的。
? ?? ? minhash方法用Jaccard進行相似度的計算方法,則對于兩個集合和?<ignore_js_op>?,?和?<ignore_js_op>?的相似性的計算方法為:
當兩個集合越相似,則該值越接近1,否則越接近0。用minhash方法,將一個集合映射到[0-R-1]之間的值,以相同的概率隨機的抽取一個[0-R-1[的一個排列,依次排列查找第一次出現1的行。
<ignore_js_op>?
設隨機排列為43201(edcab),對于C1列,第一次出現1的行是R4,所以h(C1) = 3,同理有h(C2)=2, h(C3)=4, h(C4)=3。
通過多次抽取隨機排列得到n個minhash函數h1,h2,…,hn,依此對每一列都計算n個minhash值。對于兩個集合,看看n個值里面對應相等的比例,即可估計出兩集合的Jaccard相似度。可以把每個集合的n個minhash值列為一列,得到一個n行C列的簽名矩陣。因為n可遠小于R,這樣在壓縮了數據規模的同時,并且仍能近似計算出相似度。
3.2 simhash方法介紹simhash方法是在大文本重復識別常用的一個方法,該方法主要是通過將對象的原始特征集合映射為一個固定長度的簽名,將對象之間的相似度的度量轉化為簽名的漢明距離,通過這樣的方式,極大限度地進行了降低了計算和存儲的消耗。
3.2.1 簽名計算過程? ?? ? 該方法通過對輸入特征集合的計算步驟可以描述如下:
- 將一個f維的向量V初始化為0;f位的二進制數S初始化為0;
- 對每一個特征:用傳統的hash算法對該特征產生一個f位的簽名b。對i=1到f:
? ?? ?如果b的第i位為1,則V的第i個元素加上該特征的權重;
否則,V的第i個元素減去該特征的權重。?
- 如果V的第i個元素大于0,則S的第i位為1,否則為0;
- 輸出S作為簽名。
通過上述步驟將輸入的表示對象的特征集合轉化為該對象的一個簽名,在完成簽名之后,度量兩個對象的相似度的差異即變成了對量二者的指紋的K位的差異情況。
3.2.2 漢明距離查找優化對于如何快速查找出某一個簽名是否與其存在最大差異不超過K個bit的指紋,Detecting Near-Duplicates for Web Crawling這篇論文中進行了介紹。該查找方法的基本思想是利用空間換時間的方法,該方法的依據是需要查找的兩個指紋的差異很小,這樣可以通過將原始指紋進行分塊索引,如果兩個指紋的差異很小,則合理的分塊后,根據鴿籠原理,其中存在一定數量的塊是一致的,通過利用相同的塊進行相似的指紋的召回,只需要比對召回的塊中有差異的塊的bit差異,這樣減少了需要比對的數量,節省了比對的時間開銷。
3.3 小結? ?? ? hash方法的相似度計算的主要應用場景,一般是針對大規模數據進行壓縮,在保證效果損失可接受的情況下,節省存儲空間,加快運算速度,針對該方法的應用,在目前的大規模的互聯網處理中,很多相似度的計算都是基于這種近似性的計算,并取得了比較好的效果。
通過多次抽取隨機排列得到n個minhash函數h1,h2,…,hn,依此對每一列都計算n個minhash值。對于兩個集合,看看n個值里面對應相等的比例,即可估計出兩集合的Jaccard相似度。可以把每個集合的n個minhash值列為一列,得到一個n行C列的簽名矩陣。因為n可遠小于R,這樣在壓縮了數據規模的同時,并且仍能近似計算出相似度。
4 基于主題的相似度計算? ?? ? 傳統的BOW(bag-of_words)模型,一般都會建立在特征獨立假設的基礎上,按照特征向量的匹配情況來度量對象之間的相似度,但是在實際的應用中,很多時候特征之間存在著很多的關聯關系,二者在傳統的BOW模型中無法解決,在這個基礎上,引入了主題的概念,通過主題的思想,建立起基本特征與對象的中間層的關聯關系,主題的概念的引入,主要是在原有的基本特征粒度的基礎上,引入了更為豐富的隱含層特征,提高了相似性計算的效果,常用的主題分析方法包括Latent Semantic Analysis (LSA) 、 Probabilitistic Latent Semantic Analysis (PLSA)、Latent Dirichlet Allocation ( LDA)。這些方法在分類,聚類、檢索、推薦等領域都有著很多的應用,并取得了比較好的效果。下面就LSA及PLSA方法進行簡要介紹。
4.1 LSA簡介? ?? ? LSA[6,7]模型認為特征之間存在某種潛在的關聯結構,通過特征-對象矩陣進行統計計算,將高維空間映射到低緯的潛在語義結構上,構建出LSA空間模型,從而提取出潛在的語義結構,并用該結構表示特征和對象,消除了詞匯之間的相關性影響,并降低了數據維度。增強了特征的魯棒性
? ?? ? LSA利用奇異值分解來進行計算,數學過程可以表述如下:
? ?? ? 對于?的矩陣A,其中m為特征數,n為樣本數。令?<ignore_js_op>?,經過奇異值分解,矩陣A可分解成3個矩陣的乘積:
其中,U、V是?<ignore_js_op>?和?<ignore_js_op>?的正交矩陣,分別稱為矩陣A的奇異值對應的左、右奇異向量,?<ignore_js_op>?是?<ignore_js_op>?的對角矩陣,稱為A的奇異標準形,其對角元素為矩陣A的奇異值。奇異值按照遞減的排列構成對角矩陣?<ignore_js_op>?,取?<ignore_js_op>?中前k個最大奇異值構成?的,取U和V最前面的k列構成?<ignore_js_op>?的Uk和?<ignore_js_op>?的Vk,構建A的k-秩矩陣?<ignore_js_op>?
<ignore_js_op>?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?(6)
其中,Uk和Vk 中的行向量分別作為特征向量和對象向量,k是降維后的維數。
4.2 plas介紹? ?? ? PLSA[8,9]模型是由Hofmann提出的用于文本檢索的概率生成模型,與相比較于LSA,PLSA是基于概率模型的,并直接引入了潛在class變量 ,下面的用文本處理語言來描述該模型。
選定一篇文檔的概率p(d),每篇文檔以概率 屬于一個主題,而給定一個主題,每一個詞以概率 產生。將這個過程形成聯合的概率模型表達式:
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?(7)
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???(8)
則:
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?(9)
在PLSA實際的使用過程中,存在著overfit的風險,一般訓練過程是通過EM算法,進行模型參數訓練,獲得p(z|d)、p(w|z)概率。
? ?? ? PLSA和其相關的變形,在分類、聚類、檢索等方面,特征相關性計算等方面,獲得了廣泛的應用,并取得了比較好的效果。
4.2 plas介紹? ?? ? PLSA[8,9]模型是由Hofmann提出的用于文本檢索的概率生成模型,與相比較于LSA,PLSA是基于概率模型的,并直接引入了潛在class變量?z∈Z={Z1…Zk },下面的用文本處理語言來描述該模型。
<ignore_js_op>?
選定一篇文檔的概率p(d),每篇文檔以概率p(z|d)屬于一個主題,而給定一個主題,每一個詞以概率p(w|z) 產生。將這個過程形成聯合的概率模型表達式:
<ignore_js_op>?
在PLSA實際的使用過程中,存在著overfit的風險,一般訓練過程是通過EM算法,進行模型參數訓練,獲得p(z|d)、p(w|z)概率。
? ?? ? PLSA和其相關的變形,在分類、聚類、檢索等方面,特征相關性計算等方面,獲得了廣泛的應用,并取得了比較好的效果。
.3 小結? ?? ? 主題方法的引入,在一定程度上彌補了BOW的假設的獨立性,在工業中,主題的方法也越來越多的應用到實際的機器學習中,包括在圖像處理領域、傳統的分類、聚類、檢索等方面,都取得了比較好的效果。
總結? ?? ? 相似度的計算在數據挖掘方面有著廣泛的應用,根據不同的應用場景,各種方法各有其優劣特點,對于相似度效果的影響,除了方法本身之外,合理有效的特征的選擇和使用也是至關重要的,同時,根據應用場景的不同,選擇合理的方法,對于解決問題,有著重要的作用。
參考文獻:
1. G.S. Manku, A. Jain, A.D. Sarma. Detecting Near-Duplicates for Web Crawling. WWW2007, 2007
2. A. Das, M. Datar, A.Garg. Google News Personalization: Scalable Online Collaborative Filtering. WWW2007, 2007
3.?http://en.wikipedia.org/wiki/MinHash
4. M. S. Charikar. Similarity estimation techniques from rounding algorithms. STOC’02. 2002
5.?http://en.wikipedia.org/wiki/Locality-sensitive_hashing
6. K. Dave, S. Lawrence, and D. Pennock. Mining the peanut gallery: opinion extraction and semantic classification of product reviews. In Proceedings of the 22th International World Wide Web Conference, Budapest, Hungary, 2003
7.?http://en.wikipedia.org/wiki/Latent_semantic_analysis
8. T. Hofmann. Probabilistic Latent Semantic Analysis. In Proceedings of the 15th Conference on Uncertainty in AI(1999).
9. Y. M kim, J. F. Pressiot M. R.Amini etc. An Extension of PLSA for Document Clustering. CIKM’08
---------------------------------------
字符串相似度算法(編輯距離算法 Levenshtein Distance)?
在搞驗證碼識別的時候需要比較字符代碼的相似度用到“編輯距離算法”,關于原理和C#實現做個記錄。
據百度百科介紹:
編輯距離,又稱Levenshtein距離(也叫做Edit Distance),是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數,如果它們的距離越大,說明它們越是不同。許可的編輯操作包括將一個字符替換成另一個字符,插入一個字符,刪除一個字符。
例如將kitten一字轉成sitting:
sitten (k→s)
sittin (e→i)
sitting (→g)
俄羅斯科學家Vladimir Levenshtein在1965年提出這個概念。因此也叫Levenshtein Distance。
例如
- 如果str1="ivan",str2="ivan",那么經過計算后等于 0。沒有經過轉換。相似度=1-0/Math.Max(str1.length,str2.length)=1
- 如果str1="ivan1",str2="ivan2",那么經過計算后等于1。str1的"1"轉換"2",轉換了一個字符,所以距離是1,相似度=1-1/Math.Max(str1.length,str2.length)=0.8
應用 DNA分析
拼字檢查
語音辨識
抄襲偵測
感謝大石頭在評論中給出一個很好的關于此方法應用的連接 補充在此:
小規模的字符串近似搜索,需求類似于搜索引擎中輸入關鍵字,出現類似的結果列表,文章連接:【算法】字符串近似搜索
算法過程
- str1或str2的長度為0返回另一個字符串的長度。 if(str1.length==0) return str2.length; if(str2.length==0) return str1.length;
- 初始化(n+1)*(m+1)的矩陣d,并讓第一行和列的值從0開始增長。
- 掃描兩字符串(n*m級的),如果:str1?== str2[j],用temp記錄它,為0。否則temp記為1。然后在矩陣d[i,j]賦于d[i-1,j]+1 、d[i,j-1]+1、d[i-1,j-1]+temp三者的最小值。
- 掃描完后,返回矩陣的最后一個值d[n][m]即是它們的距離。
計算相似度公式:1-它們的距離/兩個字符串長度的最大值。
為了直觀表現,我將兩個字符串分別寫到行和列中,實際計算中不需要。我們用字符串“ivan1”和“ivan2”舉例來看看矩陣中值的狀況:
1、第一行和第一列的值從0開始增長
| ? | ? | i | v | a | n | 1 |
| ? | 0 | 1 | 2 | 3 | 4 | 5 |
| i | 1 | ? | ? | ? | ? | ? |
| v | 2 | ? | ? | ? | ? | ? |
| a | 3 | ? | ? | ? | ? | ? |
| n | 4 | ? | ? | ? | ? | ? |
| 2 | 5 | ? | ? | ? | ? | ? |
2、i列值的產生 Matrix[i - 1, j] + 1 ; Matrix[i, j - 1] + 1? ?;? ? Matrix[i - 1, j - 1] + t
| ? | ? | i | v | a | n | 1 |
| ? | 0+t=0 | 1+1=2 | 2 | 3 | 4 | 5 |
| i | 1+1=2 | 取三者最小值=0 | ? | ? | ? | ? |
| v | 2 | 依次類推:1 | ? | ? | ? | ? |
| a | 3 | 2 | ? | ? | ? | ? |
| n | 4 | 3 | ? | ? | ? | ? |
| 2 | 5 | 4 | ? | ? | ? | ? |
3、V列值的產生
| ? | ? | i | v | a | n | 1 |
| ? | 0 | 1 | 2 | ? | ? | ? |
| i | 1 | 0 | 1 | ? | ? | ? |
| v | 2 | 1 | 0 | ? | ? | ? |
| a | 3 | 2 | 1 | ? | ? | ? |
| n | 4 | 3 | 2 | ? | ? | ? |
| 2 | 5 | 4 | 3 | ? | ? | ? |
依次類推直到矩陣全部生成
| ? | ? | i | v | a | n | 1 |
| ? | 0 | 1 | 2 | 3 | 4 | 5 |
| i | 1 | 0 | 1 | 2 | 3 | 4 |
| v | 2 | 1 | 0 | 1 | 2 | 3 |
| a | 3 | 2 | 1 | 0 | 1 | 2 |
| n | 4 | 3 | 2 | 1 | 0 | 1 |
| 2 | 5 | 4 | 3 | 2 | 1 | 1 |
最后得到它們的距離=1
相似度:1-1/Math.Max(“ivan1”.length,“ivan2”.length) =0.8
算法用C#實現
showpublic class LevenshteinDistance? ? {? ?? ???/// <summary>? ?? ???/// 取最小的一位數? ?? ???/// </summary>? ?? ???/// <param name="first"></param>? ?? ???/// <param name="second"></param>? ?? ???/// <param name="third"></param>? ?? ???/// <returns></returns>? ?? ???private int LowerOfThree(int first, int second, int third)? ?? ???{? ?? ?? ?? ?int min = Math.Min(first, second);? ?? ?? ?? ?return Math.Min(min, third);? ?? ???}? ?? ???private int Levenshtein_Distance(string str1, string str2)? ?? ???{? ?? ?? ?? ?int[,] Matrix;? ?? ?? ?? ?int n = str1.Length;? ?? ?? ?? ?int m = str2.Length;? ?? ?? ?? ?int temp = 0;? ?? ?? ?? ?char ch1;? ?? ?? ?? ?char ch2;? ?? ?? ?? ?int i = 0;? ?? ?? ?? ?int j = 0;? ?? ?? ?? ?if (n == 0)? ?? ?? ?? ?{? ?? ?? ?? ?? ? return m;? ?? ?? ?? ?}? ?? ?? ?? ?if (m == 0)? ?? ?? ?? ?{? ?? ?? ?? ?? ? return n;? ?? ?? ?? ?}? ?? ?? ?? ?Matrix = new int[n + 1, m + 1];? ?? ?? ?? ?for (i = 0; i <= n; i++)? ?? ?? ?? ?{? ?? ?? ?? ?? ? //初始化第一列? ?? ?? ?? ?? ? Matrix[i, 0] = i;? ?? ?? ?? ?}? ?? ?? ?? ?for (j = 0; j <= m; j++)? ?? ?? ?? ?{? ?? ?? ?? ?? ? //初始化第一行? ?? ?? ?? ?? ? Matrix[0, j] = j;? ?? ?? ?? ?}? ?? ?? ?? ?for (i = 1; i <= n; i++)? ?? ?? ?? ?{? ?? ?? ?? ?? ? ch1 = str1[i - 1];? ?? ?? ?? ?? ? for (j = 1; j <= m; j++)? ?? ?? ?? ?? ? {? ?? ?? ?? ?? ?? ???ch2 = str2[j - 1];? ?? ?? ?? ?? ?? ???if (ch1.Equals(ch2))? ?? ?? ?? ?? ?? ???{? ?? ?? ?? ?? ?? ?? ?? ?temp = 0;? ?? ?? ?? ?? ?? ???}? ?? ?? ?? ?? ?? ???else? ?? ?? ?? ?? ?? ???{? ?? ?? ?? ?? ?? ?? ?? ?temp = 1;? ?? ?? ?? ?? ?? ???}? ?? ?? ?? ?? ?? ???Matrix[i, j] = LowerOfThree(Matrix[i - 1, j] + 1, Matrix[i, j - 1] + 1, Matrix[i - 1, j - 1] + temp);? ?? ?? ?? ?? ? }? ?? ?? ?? ?}? ?? ?? ?? ?for (i = 0; i <= n; i++)? ?? ?? ?? ?{? ?? ?? ?? ?? ? for (j = 0; j <= m; j++)? ?? ?? ?? ?? ? {? ?? ?? ?? ?? ?? ???Console.Write(" {0} ", Matrix[i, j]);? ?? ?? ?? ?? ? }? ?? ?? ?? ?? ? Console.WriteLine("");? ?? ?? ?? ?}? ?? ?? ?? ?? ?? ?return Matrix[n, m];? ?? ???}? ?? ???/// <summary>? ?? ???/// 計算字符串相似度? ?? ???/// </summary>? ?? ???/// <param name="str1"></param>? ?? ???/// <param name="str2"></param>? ?? ???/// <returns></returns>? ?? ???public decimal LevenshteinDistancePercent(string str1, string str2)? ?? ???{? ?? ?? ?? ?//int maxLenth = str1.Length > str2.Length ? str1.Length : str2.Length;? ?? ?? ?? ?int val = Levenshtein_Distance(str1, str2);? ?? ?? ?? ?return 1 - (decimal)val / Math.Max(str1.Length, str2.Length);? ?? ???}? ? }
?
| 1 | <STRONG>調用</STRONG> |
showstatic void Main(string[] args)? ?? ???{? ?? ?? ?? ?string str1 = "ivan1";? ?? ?? ?? ?string str2 = "ivan2";? ?? ?? ?? ?Console.WriteLine("字符串1 {0}", str1);? ?? ?? ?? ?Console.WriteLine("字符串2 {0}", str2);? ?? ?? ?? ?Console.WriteLine("相似度 {0} %", new LevenshteinDistance().LevenshteinDistancePercent(str1, str2) * 100);? ?? ?? ?? ?? ?? ?? ? Console.ReadLine();? ?? ???}
?
| 1 | <STRONG>結果</STRONG> |
<ignore_js_op>?
------------------------------
動態時間彎曲距離 dynamic time warping
1.What is 動態時間彎曲距離?<ignore_js_op>?
在日常的生活中我們最經常使用的距離毫無疑問應該是歐式距離,但是對于一些特殊情況,歐氏距離存在著其很明顯的缺陷,比如說時間序列,舉個比較簡單的例子,序列A:1,1,1,10,2,3,序列B:1,1,1,2,10,3,如果用歐氏距離,也就是distance[j]=(b[j]-a)*(b[j]-a)來計算的話,總的距離和應該是128,應該說這個距離是非常大的,而實際上這個序列的圖像是十分相似的,這種情況下就有人開始考慮尋找新的時間序列距離的計算方法,然后提出了DTW算法,這種方法在語音識別,機器學習方便有著很重要的作用。
這個算法是基于動態規劃(DP)的思想,解決了發音長短不一的模板匹配問題,簡單來說,就是通過構建一個鄰接矩陣,尋找最短路徑和。
還以上面的2個序列作為例子,A中的10和B中的2對應以及A中的2和B中的10對應的時候,distance[3]以及distance[4]肯定是非常大的,這就直接導致了最后距離和的膨脹,這種時候,我們需要來調整下時間序列,如果我們讓A中的10和B中的10 對應 ,A中的1和B中的2對應,那么最后的距離和就將大大縮短,這種方式可以看做是一種時間扭曲,看到這里的時候,我相信應該會有人提出來,為什么不能使用A中的2與B中的2對應的問題,那樣的話距離和肯定是0了啊,距離應該是最小的吧,但這種情況是不允許的,因為A中的10是發生在2的前面,而B中的2則發生在10的前面,如果對應方式交叉的話會導致時間上的混亂,不符合因果關系。
接下來,以output[6][6](所有的記錄下標從1開始,開始的時候全部置0)記錄A,B之間的DTW距離,簡單的介紹一下具體的算法,這個算法其實就是一個簡單的DP,狀態轉移公式是output[j]=Min(Min(output[i-1][j],output[j-1]),output[i-1][j-1])+distance[j];最后得到的output[5][5]就是我們所需要的DTW距離.
2.動態時間彎曲距離程序Matlab??C++
3.在金融工程中的應用根據動態時間距離方法預測市場走勢 理論基礎:歷史重復,使用模式匹配方法,尋找歷史中與現在最接近的時段!!
(1)基于日線--動態時間距離方法預測市場走勢(每日自動更新)
(2)基于日線列出最相似T0p5--動態時間距離方法預測市場走勢(每日自動發送)
(3)基于交易量與價格等等。。。。
轉載于:https://www.cnblogs.com/yangxiao99/p/4754239.html
總結
以上是生活随笔為你收集整理的机器学习中的相似性度量 (转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySql 事务+异常处理+异常抛出
- 下一篇: oracle学习笔记一:用户管理(2)创