關(guān)于python實(shí)現(xiàn)常用的相似度計(jì)算方法
相似度計(jì)算
相似度計(jì)算是很多具體的應(yīng)用了里面都會(huì)使用到的一些東西,我們學(xué)過(guò)的有很多相似度計(jì)算的方法,最初的相似度計(jì)算是為了表征向量的重合程度的,在這里最經(jīng)典的就是余弦相似度了,當(dāng)然使用正弦或者是正切等等三角函數(shù)也都是可以的,只不過(guò)余弦使用的更廣泛一些所以提到三角函數(shù)計(jì)算向量相似度的時(shí)候大家往往都會(huì)使用余弦來(lái)作為相似度的計(jì)算工具。
可能最開(kāi)始會(huì)覺(jué)得相似度計(jì)算沒(méi)有什么,因?yàn)楝F(xiàn)在已經(jīng)有很多應(yīng)用于了實(shí)踐的相似度計(jì)算方法,但是你可能不太了解很多任務(wù)里面的核心工作就是在進(jìn)行相似度計(jì)算。
比如文本情感分析、文本語(yǔ)義理解、商場(chǎng)系統(tǒng)里面的個(gè)性化推薦等等,相似度計(jì)算可以獨(dú)立進(jìn)行也可以是作為某一項(xiàng)具體任務(wù)里面的一部分進(jìn)行,不同的業(yè)務(wù)場(chǎng)景里面會(huì)需要用到不同的相似度計(jì)算策略。
比如:給定兩個(gè)字符串,想要計(jì)算兩個(gè)字符串之間的相似度,那么可能最好的相似度計(jì)算方法就會(huì)是字符串的編輯距離了;
給定兩個(gè)一維的向量數(shù)據(jù),想要計(jì)算這一對(duì)向量之間的相似度,那么可能最直接的相似度計(jì)算策略就會(huì)是余弦相似度了;
給定兩個(gè)商品,以及商品各自的很多屬性,或者是給定兩個(gè)人以及每個(gè)人各自的性格、興趣、愛(ài)好等等,想要來(lái)計(jì)算商品或者是人物之間的相似度那么可能最好的相似度計(jì)算方法就會(huì)是杰卡德相似系數(shù)了。
因?yàn)镴accard系數(shù)主要用于計(jì)算符號(hào)度量或布爾值度量的個(gè)體間的相似度,因?yàn)閭€(gè)體的特征屬性都是由符號(hào)度量或者布爾值標(biāo)識(shí),因此無(wú)法衡量差異具 體值的大小,只能獲得“是否相同”這個(gè)結(jié)果,所以Jaccard系數(shù)只關(guān)心個(gè)體間共同具有的特征是否一致這個(gè)問(wèn)題。
類(lèi)似上面的實(shí)例還會(huì)有很多,簡(jiǎn)單列舉這些知識(shí)想說(shuō)明:在不同的人物場(chǎng)景里面,為了完成特征的計(jì)算任務(wù),我們選擇的計(jì)算策略和方法往往都是不同的。
除此之外,還有距離計(jì)算方法可以用來(lái)計(jì)算相似度
比如:歐式距離、閔可夫斯基距離、切比雪夫距離等等,都是廣泛用來(lái)計(jì)算相似度的工具
本文簡(jiǎn)單整理了一些統(tǒng)計(jì)學(xué)中常用的距離計(jì)算方法如下:
1、歐幾里得距離
歐氏距離(Eucledian Distance)是最常用的距離計(jì)算公式,衡量的是多維空間中各個(gè)點(diǎn)之間的絕對(duì)距離。
2、曼哈頓距離
曼哈頓距離(Manhattan Distance)依賴(lài)坐標(biāo)系統(tǒng)的轉(zhuǎn)度,而非系統(tǒng)在坐標(biāo)軸上的平移或映射,他是使用在幾何度量空間的幾何學(xué)用語(yǔ),用以標(biāo)明兩個(gè)點(diǎn)在標(biāo)準(zhǔn)坐標(biāo)系上的絕對(duì)軸距總和。
3、切比雪夫距離
在數(shù)學(xué)中,切比雪夫距離(Chebyshev distance)或是L∞度量,是向量空間中的一種度量,二個(gè)點(diǎn)之間的距離定義是其各坐標(biāo)數(shù)值差絕對(duì)值的最大值。
以數(shù)學(xué)的觀點(diǎn)來(lái)看,切比雪夫距離是由一致范數(shù)(uniform norm)(或稱(chēng)為上確界范數(shù))所衍生的度量,也是超凸度量(injective metric space)的一種。
4、明可夫斯基距離(Minkowski distance)
明氏距離是歐氏距離的推廣。閔氏距離不是一種距離,而是一組距離的定義。
閔氏距離的定義:兩個(gè)n維變量a(x11,x12,…,x1n)與b(x21,x22,…,x2n)間的閔可夫斯基距離定義為: 其中p是一個(gè)變參數(shù)。
當(dāng)p=1時(shí),就是曼哈頓距離 當(dāng)p=2時(shí),就是歐氏距離 當(dāng)p→∞時(shí),就是切比雪夫距離 根據(jù)變參數(shù)的不同,閔氏距離可以表示一類(lèi)的距離。
處理上面列舉的一些距離方法之外還有一種經(jīng)典的距離計(jì)算方法叫做:編輯距離。
編輯距離經(jīng)常用于計(jì)算字符串之間的差異或者說(shuō)是相似度,感興趣的也可以去查一下相關(guān)的資料,這里就不再多解釋了。
除此之外,還有統(tǒng)計(jì)學(xué)中的三大相關(guān)性系數(shù):皮爾森系數(shù)、斯皮爾曼系數(shù)和肯德?tīng)栂禂?shù)。
這些都是可以直接拿來(lái)計(jì)算向量之間的相似度的。另外還可以使用集合來(lái)計(jì)算相似度,杰卡德系數(shù)就是這一方面的實(shí)例,兩個(gè)集合的交集除以?xún)蓚€(gè)集合的并集來(lái)作為兩個(gè)集合的相似度。
本文對(duì)常用的一些相似度計(jì)算方法進(jìn)行總結(jié)實(shí)現(xiàn),具體內(nèi)容如下:
#!usr/bin/env python #encoding:utf-8 from __future__ import division ''' __Author__:沂水寒城 功能: 相似度度量準(zhǔn)則總結(jié)實(shí)現(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): ''' 肯德?tīng)栂嗨贫? ''' return kendalltau(x,y)[0] def cosSim(x,y): ''' 余弦相似度計(jì)算方法 ''' 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): ''' 歐幾里得相似度計(jì)算方法 ''' return math.sqrt(sum(pow(a-b,2) for a,b in zip(x,y))) def manhattanDisSim(x,y): ''' 曼哈頓距離計(jì)算方法 ''' return sum(abs(a-b) for a,b in zip(x,y)) def minkowskiDisSim(x,y,p): ''' 明可夫斯基距離計(jì)算方法 ''' 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): ''' 馬氏距離計(jì)算方法 ''' 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): ''' 字符串編輯距離、相似度計(jì)算方法 ''' res=Levenshtein.distance(x,y) similarity=1-(res/max(len(x), len(y))) return similarity def jaccardDisSim(x,y): ''' 杰卡德相似度計(jì)算 ''' 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實(shí)現(xiàn)常用的相似度計(jì)算方法的文章就介紹到這了,更多相關(guān)python常用相似度計(jì)算內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 注釋?zhuān)航忉尯蛢?yōu)化代碼可讀性
本文將探討Python中注釋的重要性,以及如何通過(guò)注釋解釋和優(yōu)化代碼的可讀性,了解如何正確使用注釋可以提高代碼的可維護(hù)性和可理解性2023-09-09Python 數(shù)據(jù)結(jié)構(gòu)之旋轉(zhuǎn)鏈表
這篇文章主要介紹了Python 數(shù)據(jù)結(jié)構(gòu)之旋轉(zhuǎn)鏈表的相關(guān)資料,需要的朋友可以參考下2017-02-02通過(guò)python調(diào)用adb命令對(duì)App進(jìn)行性能測(cè)試方式
這篇文章主要介紹了通過(guò)python調(diào)用adb命令對(duì)App進(jìn)行性能測(cè)試方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python 實(shí)現(xiàn)圖像逐像素點(diǎn)取鄰域數(shù)據(jù)
這篇文章主要介紹了Python 實(shí)現(xiàn)圖像逐像素點(diǎn)取鄰域數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03Python腳本實(shí)現(xiàn)集群檢測(cè)和管理功能
這篇文章主要介紹了Python腳本實(shí)現(xiàn)集群檢測(cè)和管理功能,本文講解了實(shí)現(xiàn)想法、開(kāi)發(fā)工具選擇、經(jīng)驗(yàn)分享、代碼示例等內(nèi)容,需要的朋友可以參考下2015-03-03Django中celery的使用項(xiàng)目實(shí)例
Celery是?個(gè) 基于python開(kāi)發(fā)的分布式異步消息任務(wù)隊(duì)列,通過(guò)它可以輕松的實(shí)現(xiàn)任務(wù)的異步處理,下面這篇文章主要給大家介紹了關(guān)于Django中celery使用的相關(guān)資料,需要的朋友可以參考下2022-07-07關(guān)于Python字符編碼與二進(jìn)制不得不說(shuō)的一些事
這篇文章主要給大家介紹了關(guān)于Python字符編碼與二進(jìn)制不得不說(shuō)的一些事,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10修復(fù)CentOS7升級(jí)Python到3.6版本后yum不能正確使用的解決方法
這篇文章主要介紹了修復(fù)CentOS7升級(jí)Python到3.6版本后yum不能使用的問(wèn)題,本文給大家?guī)?lái)了解決方法,需要的朋友可以參考下2018-01-01