關(guān)于python實現(xiàn)常用的相似度計算方法
相似度計算
相似度計算是很多具體的應(yīng)用了里面都會使用到的一些東西,我們學(xué)過的有很多相似度計算的方法,最初的相似度計算是為了表征向量的重合程度的,在這里最經(jīng)典的就是余弦相似度了,當(dāng)然使用正弦或者是正切等等三角函數(shù)也都是可以的,只不過余弦使用的更廣泛一些所以提到三角函數(shù)計算向量相似度的時候大家往往都會使用余弦來作為相似度的計算工具。
可能最開始會覺得相似度計算沒有什么,因為現(xiàn)在已經(jīng)有很多應(yīng)用于了實踐的相似度計算方法,但是你可能不太了解很多任務(wù)里面的核心工作就是在進行相似度計算。
比如文本情感分析、文本語義理解、商場系統(tǒng)里面的個性化推薦等等,相似度計算可以獨立進行也可以是作為某一項具體任務(wù)里面的一部分進行,不同的業(yè)務(wù)場景里面會需要用到不同的相似度計算策略。
比如:給定兩個字符串,想要計算兩個字符串之間的相似度,那么可能最好的相似度計算方法就會是字符串的編輯距離了;
給定兩個一維的向量數(shù)據(jù),想要計算這一對向量之間的相似度,那么可能最直接的相似度計算策略就會是余弦相似度了;
給定兩個商品,以及商品各自的很多屬性,或者是給定兩個人以及每個人各自的性格、興趣、愛好等等,想要來計算商品或者是人物之間的相似度那么可能最好的相似度計算方法就會是杰卡德相似系數(shù)了。
因為Jaccard系數(shù)主要用于計算符號度量或布爾值度量的個體間的相似度,因為個體的特征屬性都是由符號度量或者布爾值標(biāo)識,因此無法衡量差異具 體值的大小,只能獲得“是否相同”這個結(jié)果,所以Jaccard系數(shù)只關(guān)心個體間共同具有的特征是否一致這個問題。
類似上面的實例還會有很多,簡單列舉這些知識想說明:在不同的人物場景里面,為了完成特征的計算任務(wù),我們選擇的計算策略和方法往往都是不同的。
除此之外,還有距離計算方法可以用來計算相似度
比如:歐式距離、閔可夫斯基距離、切比雪夫距離等等,都是廣泛用來計算相似度的工具
本文簡單整理了一些統(tǒng)計學(xué)中常用的距離計算方法如下:
1、歐幾里得距離
歐氏距離(Eucledian Distance)是最常用的距離計算公式,衡量的是多維空間中各個點之間的絕對距離。

2、曼哈頓距離
曼哈頓距離(Manhattan Distance)依賴坐標(biāo)系統(tǒng)的轉(zhuǎn)度,而非系統(tǒng)在坐標(biāo)軸上的平移或映射,他是使用在幾何度量空間的幾何學(xué)用語,用以標(biāo)明兩個點在標(biāo)準(zhǔn)坐標(biāo)系上的絕對軸距總和。

3、切比雪夫距離
在數(shù)學(xué)中,切比雪夫距離(Chebyshev distance)或是L∞度量,是向量空間中的一種度量,二個點之間的距離定義是其各坐標(biāo)數(shù)值差絕對值的最大值。
以數(shù)學(xué)的觀點來看,切比雪夫距離是由一致范數(shù)(uniform norm)(或稱為上確界范數(shù))所衍生的度量,也是超凸度量(injective metric space)的一種。

4、明可夫斯基距離(Minkowski distance)
明氏距離是歐氏距離的推廣。閔氏距離不是一種距離,而是一組距離的定義。
閔氏距離的定義:兩個n維變量a(x11,x12,…,x1n)與b(x21,x22,…,x2n)間的閔可夫斯基距離定義為: 其中p是一個變參數(shù)。
當(dāng)p=1時,就是曼哈頓距離 當(dāng)p=2時,就是歐氏距離 當(dāng)p→∞時,就是切比雪夫距離 根據(jù)變參數(shù)的不同,閔氏距離可以表示一類的距離。

處理上面列舉的一些距離方法之外還有一種經(jīng)典的距離計算方法叫做:編輯距離。
編輯距離經(jīng)常用于計算字符串之間的差異或者說是相似度,感興趣的也可以去查一下相關(guān)的資料,這里就不再多解釋了。
除此之外,還有統(tǒng)計學(xué)中的三大相關(guān)性系數(shù):皮爾森系數(shù)、斯皮爾曼系數(shù)和肯德爾系數(shù)。
這些都是可以直接拿來計算向量之間的相似度的。另外還可以使用集合來計算相似度,杰卡德系數(shù)就是這一方面的實例,兩個集合的交集除以兩個集合的并集來作為兩個集合的相似度。
本文對常用的一些相似度計算方法進行總結(jié)實現(xiàn),具體內(nèi)容如下:
#!usr/bin/env python
#encoding:utf-8
from __future__ import division
'''
__Author__:沂水寒城
功能: 相似度度量準(zhǔn)則總結(jié)實現(xiàn)
'''
import math
import numpy as np
from scipy.stats import pearsonr,spearmanr,kendalltau
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def pearsonrSim(x,y):
'''
皮爾森相似度
'''
return pearsonr(x,y)[0]
def spearmanrSim(x,y):
'''
斯皮爾曼相似度
'''
return spearmanr(x,y)[0]
def kendalltauSim(x,y):
'''
肯德爾相似度
'''
return kendalltau(x,y)[0]
def cosSim(x,y):
'''
余弦相似度計算方法
'''
tmp=sum(a*b for a,b in zip(x,y))
non=np.linalg.norm(x)*np.linalg.norm(y)
return round(tmp/float(non),3)
def eculidDisSim(x,y):
'''
歐幾里得相似度計算方法
'''
return math.sqrt(sum(pow(a-b,2) for a,b in zip(x,y)))
def manhattanDisSim(x,y):
'''
曼哈頓距離計算方法
'''
return sum(abs(a-b) for a,b in zip(x,y))
def minkowskiDisSim(x,y,p):
'''
明可夫斯基距離計算方法
'''
sumvalue=sum(pow(abs(a-b),p) for a,b in zip(x,y))
tmp=1/float(p)
return round(sumvalue**tmp,3)
def MahalanobisDisSim(x,y):
'''
馬氏距離計算方法
'''
npvec1,npvec2=np.array(x),np.array(y)
npvec=np.array([npvec1, npvec2])
sub=npvec.T[0]-npvec.T[1]
inv_sub=np.linalg.inv(np.cov(npvec1, npvec2))
return math.sqrt(np.dot(inv_sub, sub).dot(sub.T))
def levenshteinDisSim(x,y):
'''
字符串編輯距離、相似度計算方法
'''
res=Levenshtein.distance(x,y)
similarity=1-(res/max(len(x), len(y)))
return similarity
def jaccardDisSim(x,y):
'''
杰卡德相似度計算
'''
res=len(set.intersection(*[set(x),set(y)]))
union_cardinality=len(set.union(*[set(x),set(y)]))
return res/float(union_cardinality)
if __name__=='__main__':
x=[1,2,3,4,5]
y=[2,4,0,8,9]
print 'pearsonrSim:',pearsonrSim(x,y)
print 'spearmanrSim:',spearmanrSim(x,y)
print 'kendalltauSim:',kendalltauSim(x,y)
print 'cosSim:',cosSim(x,y)
print 'eculidDisSim:',eculidDisSim(x,y)
print 'manhattanDisSim:',manhattanDisSim(x,y)
print 'minkowskiDisSim:',minkowskiDisSim(x,y,2)
print 'MahalanobisDisSim:',MahalanobisDisSim(x,y)
print 'jaccardDisSim:',jaccardDisSim(x,y)結(jié)果如下:
pearsonrSim: 0.7397954428741078
spearmanrSim: 0.7
kendalltauSim: 0.6
cosSim: 0.913
eculidDisSim: 6.78232998313
manhattanDisSim: 14
minkowskiDisSim: 6.782
MahalanobisDisSim: 0.637157868392
jaccardDisSim: 0.25
到此這篇關(guān)于關(guān)于python實現(xiàn)常用的相似度計算方法的文章就介紹到這了,更多相關(guān)python常用相似度計算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 數(shù)據(jù)結(jié)構(gòu)之旋轉(zhuǎn)鏈表
這篇文章主要介紹了Python 數(shù)據(jù)結(jié)構(gòu)之旋轉(zhuǎn)鏈表的相關(guān)資料,需要的朋友可以參考下2017-02-02
通過python調(diào)用adb命令對App進行性能測試方式
這篇文章主要介紹了通過python調(diào)用adb命令對App進行性能測試方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Python 實現(xiàn)圖像逐像素點取鄰域數(shù)據(jù)
這篇文章主要介紹了Python 實現(xiàn)圖像逐像素點取鄰域數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
關(guān)于Python字符編碼與二進制不得不說的一些事
這篇文章主要給大家介紹了關(guān)于Python字符編碼與二進制不得不說的一些事,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
修復(fù)CentOS7升級Python到3.6版本后yum不能正確使用的解決方法
這篇文章主要介紹了修復(fù)CentOS7升級Python到3.6版本后yum不能使用的問題,本文給大家?guī)砹私鉀Q方法,需要的朋友可以參考下2018-01-01

