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