常用的相似度計算

在數據分析和數據挖掘的過程中,我們經常需要知道個體間差異的大小,進而評價個體的相似性和類別。最常見的是數據分析中的相關分析,數據挖掘中的分 類和聚類算法,如K最近鄰(KNN)和K均值(K-Means)。當然衡量個體差異的方法有很多,最近查閱了相關的資料,這里整理羅列下。

  為了方便下面的解釋和舉例,先設定我們要比較X個體和Y個體間的差異,它們都包含了N個維的特征,即X=(x1, x2, x3, … xn),Y=(y1, y2, y3, … yn)。下面來看看主要可以用哪些方法來衡量兩者的差異,主要分為距離度量和相似度度量。

?

距離度量

  距離度量(Distance)用于衡量個體在空間上存在的距離,距離越遠說明個體間的差異越大。

?

歐幾里得距離(Euclidean Distance)

  歐氏距離是最常見的距離度量,衡量的是多維空間中各個點之間的絕對距離。公式如下:

Euclidean Distance

  因為計算是基于各維度特征的絕對數值,所以歐氏度量需要保證各維度指標在相同的刻度級別,比如對身高(cm)和體重(kg)兩個單位不同的指標使用歐式距離可能使結果失效。

?

明可夫斯基距離(Minkowski Distance)

  明氏距離是歐氏距離的推廣,是對多個距離度量公式的概括性的表述。公式如下:

Minkowski Distance

  這里的p值是一個變量,當p=2的時候就得到了上面的歐氏距離。

?

曼哈頓距離(Manhattan Distance)

  曼哈頓距離來源于城市區塊距離,是將多個維度上的距離進行求和后的結果,即當上面的明氏距離中p=1時得到的距離度量公式,如下:

Manhattan Distance

?

切比雪夫距離(Chebyshev Distance)

  切比雪夫距離起源于國際象棋中國王的走法,我們知道國際象棋國王每次只能往周圍的8格中走一步,那么如果要從棋盤中A格(x1, y1)走到B格(x2, y2)最少需要走幾步?擴展到多維空間,其實切比雪夫距離就是當p趨向于無窮大時的明氏距離:

Chebyshev Distance

  其實上面的曼哈頓距離、歐氏距離和切比雪夫距離都是明可夫斯基距離在特殊條件下的應用。

?

馬哈拉諾比斯距離(Mahalanobis Distance)

  既然歐幾里得距離無法忽略指標度量的差異,所以在使用歐氏距離之前需要對底層指標進行數據的標準化,而基于各指標維度進行標準化后再使用歐氏距離就衍生出來另外一個距離度量——馬哈拉諾比斯距離(Mahalanobis Distance),簡稱馬氏距離。

?

相似度度量

  相似度度量(Similarity),即計算個體間的相似程度,與距離度量相反,相似度度量的值越小,說明個體間相似度越小,差異越大。

?

向量空間余弦相似度(Cosine Similarity)

  余弦相似度用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小。相比距離度量,余弦相似度更加注重兩個向量在方向上的差異,而非距離或長度上。公式如下:

Cosine Similarity

?

皮爾森相關系數(Pearson Correlation Coefficient)

  即相關分析中的相關系數r,分別對X和Y基于自身總體標準化后計算空間向量的余弦夾角。公式如下:

Pearson Correlation Coefficient

?

Jaccard相似系數(Jaccard Coefficient)

  Jaccard系數主要用于計算符號度量或布爾值度量的個體間的相似度,因為個體的特征屬性都是由符號度量或者布爾值標識,因此無法衡量差異具 體值的大小,只能獲得“是否相同”這個結果,所以Jaccard系數只關心個體間共同具有的特征是否一致這個問題。如果比較X與Y的Jaccard相似系 數,只比較xn和yn中相同的個數,公式如下:

Jaccard Coefficient

?

調整余弦相似度(Adjusted Cosine Similarity)

  雖然余弦相似度對個體間存在的偏見可以進行一定的修正,但是因為只能分辨個體在維之間的差異,沒法衡量每個維數值的差異,會導致這樣一個情況: 比如用戶對內容評分,5分制,X和Y兩個用戶對兩個內容的評分分別為(1,2)和(4,5),使用余弦相似度得出的結果是0.98,兩者極為相似,但從評 分上看X似乎不喜歡這2個內容,而Y比較喜歡,余弦相似度對數值的不敏感導致了結果的誤差,需要修正這種不合理性,就出現了調整余弦相似度,即所有維度上 的數值都減去一個均值,比如X和Y的評分均值都是3,那么調整后為(-2,-1)和(1,2),再用余弦相似度計算,得到-0.8,相似度為負值并且差異 不小,但顯然更加符合現實。

?

歐氏距離與余弦相似度

  歐氏距離是最常見的距離度量,而余弦相似度則是最常見的相似度度量,很多的距離度量和相似度度量都是基于這兩者的變形和衍生,所以下面重點比較下兩者在衡量個體差異時實現方式和應用環境上的區別。

  借助三維坐標系來看下歐氏距離和余弦相似度的區別:

distance and similarity

  從圖上可以看出距離度量衡量的是空間各點間的絕對距離,跟各個點所在的位置坐標(即個體特征維度的數值)直接相關;而余弦相似度衡量的是空間向 量的夾角,更加的是體現在方向上的差異,而不是位置。如果保持A點的位置不變,B點朝原方向遠離坐標軸原點,那么這個時候余弦相似度cosθ是保持不變 的,因為夾角不變,而A、B兩點的距離顯然在發生改變,這就是歐氏距離和余弦相似度的不同之處。

?

  根據歐氏距離和余弦相似度各自的計算方式和衡量特征,分別適用于不同的數據分析模型:歐氏距離能夠體現個體數值特征的絕對差異,所以更多的用于 需要從維度的數值大小中體現差異的分析,如使用用戶行為指標分析用戶價值的相似度或差異;而余弦相似度更多的是從方向上區分差異,而對絕對的數值不敏感, 更多的用于使用用戶對內容評分來區分用戶興趣的相似度和差異,同時修正了用戶間可能存在的度量標準不統一的問題(因為余弦相似度對絕對數值不敏感)。

?

  上面都是對距離度量和相似度度量的一些整理和匯總,在現實的使用中選擇合適的距離度量或相似度度量可以完成很多的數據分析和數據挖掘的建模,后續會有相關的介紹。

附件為python部分相似度算法:

#!/usr/bin/python
#coding=utf-8
critics = {
?

'Lisa':{
??????? 'Lady in the water':2.5,
??????? 'Snake on a plane' :3.5
??? },
??? 'Tom':{
??????? 'Lady in the water':3.0,
??????? 'Snake on a plane' :4.0
??? },
??? 'Jerry':{
??????? 'Lady in the water':2.0,
??????? 'Snake on a plane' :3.0
??? },
??? 'WXM':{
??????? 'Lady in the water':3.3,
??????? 'Snake on a plane' :4.2
??? },
??? 'jhz':{
??????? 'Lady in the water':3.9,
??????? 'Snake on a plane' :4.5
??? }
}

from math import sqrt
"""
歐幾里得空間法 計算相似度
"""
def sim_distance(p1, p2):
??? c = set(p1.keys())&set(p2.keys())
??? if not c:
??????? return 0
??? sum_of_squares = sum([pow(p1.get(sk)-p2.get(sk),2) for sk in c])
??? p = 1/(1+sqrt(sum_of_squares))
??? return p
?
"""
皮爾遜相關度
"""
def sim_distance_pearson(p1,p2):
??? c = set(p1.keys())&set(p2.keys())
??? if not c:
??????? return 0
??? s1 = sum([p1.get(sk) for sk in c])
??? s2 = sum([p2.get(sk) for sk in c])
??? sq1 = sum([pow(p1.get(sk),2) for sk in c])
??? sq2 = sum([pow(p2.get(sk),2) for sk in c])
??? ss = sum([p1.get(sk)*p2.get(sk) for sk in c])
??? n = len(c)
??? num = ss-s1*s2/n
??? den = sqrt((sq1-pow(s1,2)/n)*(sq2-pow(s2-2)/n))
??? if den == 0:
??????? return 0
??? p = num/den
??? return p
?
"""
Jaccard系數
"""
def sim_distance_jaccard(p1,p2):
??? c = set(p1.keys())&set(p2.keys())
??? if not c:
??????? return 0
??? ss = sum([p1.get(sk)*p2.get(sk) for sk in c])
??? sq1 = sum([pow(sk,2) for sk in p1.values()])
??? sq2 = sum([pow(sk,2) for sk in p2.values()])
??? p = float(ss)/(sq1+sq2-ss)
??? return p
?
"""
余弦相似度
"""
def sim_distance_cos(p1,p2):
??? c = set(p1.keys())&set(p2.keys())
??? if not c:
??????? return 0
??? ss = sum([p1.get(sk)*p2.get(sk) for sk in c])
??? sq1 = sqrt(sum([pow(p1.get(sk),2) for sk in p1.values()]))
??? sq2 = sqrt(sum([pow(p2.get(sk),2) for sk in p2.values()]))
??? p = float(ss)/(sq1*sq2)
??? return p

"""
得到top相似度高的前幾位
"""
def topMatches(prefs,person,n=5,similarity=sim_distance_pearson):
??? scores = [similarity(prefs,person,other) for other in prefs if other != person]
??? scores.sort()
??? scores.reverse()
??? return scores[0:n]

"""
#利用所有他人評價值加權平均,為某人提供建議.
"""
def getRecommendations(prefs, person, similarity=sim_distance):
??? totals = {}
??? simSums = {}
?
??? for other in prefs:
??????? if other == person: continue
??????? sim = similarity(prefs,person,other)
??????? #忽略評價值為0或小于0的情況.
??????? if sim<=0: continue
??????? for item in prefs[other]:
??????????? #只對自己還未曾看過的影片進行評價.
??????????? if item not in prefs[person] or prefs[person][item] == 0 :
?????????????? totals.setdefault(item, 0)
?????????????? totals[item] += sim*prefs[other][item]
?????????????? #相似度之和
?????????????? simSums.setdefault(item, 0)
?????????????? simSums[item] += sim
??????? #建立一個歸一化的列表.
??????? rankings = [(total/simSums[item],item) \
??????????????????? for item,total in totals.items()]
??????? rankings.sort()
??????? rankings.reverse()
??????? return rankings

參考文獻:

[1]http://webdataanalysis.net/reference-and-source/distance-and-similarity/
[2]http://wpxiaomo.sinaapp.com/archives/424
[3]http://wpxiaomo.sinaapp.com/archives/423
[4]集體智慧編程

轉載于:https://www.cnblogs.com/rxingyue/p/5945124.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254260.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254260.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254260.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

玩轉C#窗體-屬性、方法和事件詳細說明

文章目錄簡介Windows窗體的基本屬性一、布局屬性1、StartPosition屬性2、Location屬性3、尺寸屬性4、WindowsState屬性5、Autoscroll屬性6、AutoSize屬性二、樣式屬性1、ControlBox屬性2、MaximizeBox屬性3、MinimizeBox屬性4、HelpButton屬性5、ShowIcon屬性6、Icon屬性7、Sho…

for循環和數組練習

//公雞2文&#xff0c;母雞1文&#xff0c;小雞半文&#xff0c;每種至少一只&#xff0c;100文買100只雞有多少種可能var ci 0; for(var g1;g<50;g){for(var m1;m<100;m){for(var x1;x<100;x){if(g*2m*1x*(0.5)100&&gmx100){ci1;console.log("買公雞&qu…

CMD下查看路由表

在cmd下面輸入route print 就可以查看路由表 如何讀懂路由表如何讀懂路由表 源碼:--------------------------------------------------------------------------------Active Routes: Network Destination Netmask Gateway Interface M…

c# automapper 使用

一、最簡單的用法 有兩個類User和UserDto 1 public class User2 {3 public int Id { get; set; }4 public string Name { get; set; }5 public int Age { get; set; }6 }7 8 public class UserDto9 { 10 public string Na…

js正則歸納

/* * 正則的緩存區 * 一、 var numadb1122;var reg/(\d)\1(\d)\2/gi;console.log(num.match(reg));//[ 1122 ]二、普通字符&#xff1a;a b c 1 2 3 特殊字符&#xff1a;\d \w \D //w d 是什么三、元字符中限定符* &#xff1a; 匹配0到多 &#xff1a; 匹配1到…

洛谷 P1469 找筷子

題目描述 經過一段時間的緊張籌備&#xff0c;電腦小組的“RP餐廳”終于開業了&#xff0c;這天&#xff0c;經理LXC接到了一個定餐大單&#xff0c;可把大家樂壞了&#xff01;員工們齊心協力按要求準備好了套餐正準備派送時&#xff0c;突然碰到一個棘手的問題&#xff0c;筷…

玩轉C#控件-常用控件屬性

文章目錄概述Control類的基本屬性1、Name屬性2、Text屬性3、Anchor屬性4、Dock屬性Control類的方法和事件博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 概述 控件是包含在窗體上的對象&#xff0c;是構成用戶界面的基本元素&#xff0c;也是…

LazyT 提供對延遲初始化的支持

延遲初始化 就是在第一次使用的時候在 進行類的初始化 public class Student{public Student(){this.Name "DefaultName";this.Age 0;Console.WriteLine("Student is init...");}public string Name { get; set; }public int Age { get; set; }} public…

264標準中高復雜度的三方面

一、運功估計搜索 二、碼率控制 三、濾波算法 在264中&#xff0c;這三方面占據了絕大部分的計算復雜度。具體原因或是優化的具體步驟有時間補上。

ie瀏覽器不支持多行隱藏顯示省略號

平時在寫頁面過程中&#xff0c;相信大家都遇到過文本顯示多行后用省略號代替的問題&#xff0c;來看看代碼&#xff1a; p{display: -webkit-box;overflow: hidden;text-overflow: ellipsis;-webkit-line-clamp:12;//表示顯示12行之后用省略號代替-webkit-box-orient:vertical…

API設計原則 - Qt官網的設計實踐總結

原文鏈接&#xff1a;API Design Principles - Qt Wiki 基于Gary的影響力上 Gary Gao 的譯文稿&#xff1a;C的API設計指導 譯文發在酷殼 - CoolShell&#xff1a;API設計原則&#xff0c; 2017-07-25 API設計原則 - Qt官網的設計實踐總結 &#x1f34e; 譯序 Qt的設計水準在業…

python帶參裝飾器的改良版

簡單點就是這種 def deco2(param1):def _deco2(fun):def __deco2(*args, **kwargs):print (param)fun(*args, **kwargs)return __deco2return _deco2deco2 # 錯誤的寫法 def f2(strx):print (strx)f2(hello) 運行上面這個&#xff0c;期待打印1和hello 實際上是不…

H.264邊緣塊進行幀內預測時,上邊緣和左邊緣塊的預測情況。

僅僅介紹上邊緣塊需要用到上面的像素&#xff08;不存在&#xff09;&#xff08;例如垂直模式&#xff09;&#xff0c;左邊緣快需要用到左邊的像素&#xff08;不存在&#xff09;&#xff08;例如水平模式&#xff09;的情況。 H.264 I幀邊緣塊的處理 I幀的第一個左上的邊緣…

P1021 郵票面值設計

P1021 郵票面值設計 題目描述 給定一個信封&#xff0c;最多只允許粘貼N張郵票&#xff0c;計算在給定K&#xff08;NK≤15&#xff09;種郵票的情況下&#xff08;假定所有的郵票數量都足夠&#xff09;&#xff0c;如何設計郵票的面值&#xff0c;能得到最大值MAX&#xff0c…

第七章:XAML vs. code(3)

屬性元素語法這里有一些C&#xff03;與第4章中的FramedText代碼相似。在一個語句中&#xff0c;它實例化一個Frame和一個Label&#xff0c;并將Label設置為Frame的Content屬性&#xff1a; new Frame {OutlineColor Color.Accent,HorizontalOptions LayoutOptions.Center,Ve…

QtCreator5.12.6安裝圖文教程

前言接觸過Qt的同學肯定用過QtCreator,本id最近常用&#xff0c;也就寫個教程記錄一下安裝的過程。可能比較少人學過Qt&#xff0c;感覺Qt還是挺不錯的&#xff0c;做出來的界面還算好看&#xff0c;關鍵是跨平臺。說明&#xff1a;安裝的系統&#xff1a;win10專業版QtCreator…

H.264學習(一)——幀和場的概念

一、何謂場&#xff1f; 每個電視幀都是通過掃描屏幕兩次而產生的&#xff0c;第二個掃描的線條剛好填滿第一次掃描所留下的縫隙。每個掃描即稱為一個場。因此 25 幀/秒的電視畫面實際上為 50 場/秒 (若為 NTSC 則分別為 30 & 60 - 因為我是中國人&#xff0c;因此我采用 P…

【實踐】js實現隨機不重復抽取數組中元素

經過3個星期的時間終于用做完了學校的練習作品了&#xff0c;但是發現在用jq 做互動雖然很方便但卻帶來了不少的煩惱 所以在以后的日子里我要好好學 js 了&#xff01; 然后呢在博主之前學java 里面 另我最頭痛的就是做產生隨機不重復的數據了 今天自己再鞏固了一下以前的知識再…

RabbitMQ for windows

一、搭建環境 Rabbit MQ 是建立在強大的Erlang OTP平臺上&#xff0c;因此安裝RabbitMQ之前要先安裝Erlang。 erlang&#xff1a;http://www.erlang.org/download.html rabbitmq&#xff1a;http://www.rabbitmq.com/download.html 我目前使用的&#xff1a;http://pan.baidu.c…

圓環內外圓毛刺(凸起)缺口(凹陷)檢測halcon

文章目錄處理要求處理方法1方法一思路方法一halcon源碼處理效果處理方法2方法二思路方法二halcon源碼處理效果博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 處理要求 橢圓/圓環&#xff08;產品易變形&#xff0c;為橢圓&#xff09;內外圓…