欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于python實(shí)現(xiàn)常用的相似度計(jì)算方法

 更新時(shí)間:2023年07月28日 11:05:54   作者:Together_CZ  
這篇文章主要介紹了關(guān)于python實(shí)現(xiàn)常用的相似度計(jì)算方法,最初的相似度計(jì)算是為了表征向量的重合程度的,在這里最經(jīng)典的就是余弦相似度了,當(dāng)然使用正弦或者是正切等等三角函數(shù)也都是可以的,需要的朋友可以參考下

相似度計(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)文章

最新評(píng)論