1. 常見的距離算法和相似度計(jì)算方法

        共 5877字,需瀏覽 12分鐘

         ·

        2020-07-31 23:10

        加入極市專業(yè)CV交流群,與?10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度?等名校名企視覺開發(fā)者互動交流!

        同時提供每月大咖直播分享、真實(shí)項(xiàng)目需求對接、干貨資訊匯總,行業(yè)技術(shù)交流。關(guān)注?極市平臺?公眾號?,回復(fù)?加群,立刻申請入群~

        作者|奮發(fā)的菜鳥醬@知乎
        來源|https://zhuanlan.zhihu.com/p/138107999

        本文整理了常見的距離算法和相似度(系數(shù))算法,并比較了歐氏距離和余弦距離間的不同之處。

        1、常見的距離算法

        1.1 歐幾里得距離(Euclidean Distance
        在數(shù)學(xué)中,歐幾里得距離或歐幾里得度量是歐幾里得空間中兩點(diǎn)間“普通”(即直線)距離。使用這個距離,歐氏空間成為度量空間。相關(guān)聯(lián)的范數(shù)稱為歐幾里得范數(shù)。
        Euclidean Distance是一個通常采用的距離定義,它是在m維空間中兩個點(diǎn)之間的真實(shí)距離。
        代碼:
        >>> pdist = nn.PairwiseDistance(p=2)>>> input1 = torch.randn(100, 128)>>> input2 = torch.randn(100, 128)>>> output = pdist(input1, input2)
        1.2 Earth Mover's Distance (EMD距離)
        和歐式距離一樣,它們都是一種距離度量的定義、可以用來測量某兩個分布之間的距離。EMD主要應(yīng)用在圖像處理和語音信號處理領(lǐng)域。
        EMD問題通俗解釋: Earth Move翻譯過來是搬土,指把P位置的m個坑的土,用最小的代價搬到Q位置的n個坑中,dij是pi到qj兩個坑的距離,fij是從pi搬到qj的土量,則WORK工作量就是要最小化的目標(biāo)。線性規(guī)劃求解出fij后,再用fij對WORK作個歸一化,就得到了EMD。EMD 實(shí)際上是線性規(guī)劃中運(yùn)輸問題的最優(yōu)解。
        EMD具體定義可參考:http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/RUBNER/emd.htm
        C代碼包: emd.h, emd.c, emd.i
        OpenCV:實(shí)現(xiàn)了EMD api, pip install --upgrade setuptools pip install numpy Matplotlib pip install opencv-python
        import numpy as npimport cv
        #p、q是兩個矩陣,第一列表示權(quán)值,后面三列表示直方圖或數(shù)量p=np.asarray([[0.4,100,40,22], [0.3,211,20,2], [0.2,32,190,150], [0.1,2,100,100]],np.float32)q=np.array([[0.5,0,0,0], [0.3,50,100,80], [0.2,255,255,255]],np.float32)pp=cv.fromarray(p)qq=cv.fromarray(q)emd=cv.CalcEMD2(pp,qq,cv.CV_DIST_L2)
        1.3 曼哈頓距離(Manhattan Distance): 表示兩個點(diǎn)在標(biāo)準(zhǔn)坐標(biāo)系上的絕對軸距之和。也就是和象棋中的“車”一樣橫平豎直的走過的距離。曼哈頓距離是超凸度量。
        1.4 杰卡德距離(Jaccard Distance): 用來衡量兩個集合差異性的一種指標(biāo),它是杰卡德相似系數(shù)的補(bǔ)集,被定義為1減去Jaccard相似系數(shù)。適用于集合相似性度量,字符串相似性度量 。
        1.5 馬氏距離(Mahalanobis distance): 表示點(diǎn)與一個分布之間的距離。它是一種有效的計(jì)算兩個未知樣本集的相似度的方法。與歐氏距離不同的是,它考慮到各種特性之間的聯(lián)系(例如:一條關(guān)于身高的信息會帶來一條關(guān)于體重的信息,因?yàn)閮烧呤怯嘘P(guān)聯(lián)的),并且是尺度無關(guān)的(scale-invariant),即獨(dú)立于測量尺度。修正了歐式距離中各個維度尺度不一致且相關(guān)的問題。
        單個數(shù)據(jù)點(diǎn)的馬氏距離:
        數(shù)據(jù)點(diǎn)x,y之間的馬氏距離:
        其中 是多維隨機(jī)變量的協(xié)方差矩陣。如果協(xié)方差矩陣是單位向量,也就是各維度獨(dú)立同分布,馬氏距離就變成了歐式距離。
        import numpy as npdef mashi_distance(x,y): print x print y #馬氏距離要求樣本數(shù)要大于維數(shù),否則無法求協(xié)方差矩陣 #此處進(jìn)行轉(zhuǎn)置,表示10個樣本,每個樣本2維 X=np.vstack([x,y])
        print X XT=X.T
        print XT
        #方法一:根據(jù)公式求解 S=np.cov(X) #兩個維度之間協(xié)方差矩陣 SI = np.linalg.inv(S) #協(xié)方差矩陣的逆矩陣 #馬氏距離計(jì)算兩個樣本之間的距離,此處共有4個樣本,兩兩組合,共有6個距離。 n=XT.shape[0] d1=[] for i in range(0,n): for j in range(i+1,n): delta=XT[i]-XT[j] d=np.sqrt(np.dot(np.dot(delta,SI),delta.T)) print d d1.append(d)

        1、切比雪夫距離(Chebyshev Distance)

        2、明可夫斯基距離(Minkowski Distance)

        3、海明距離(Hamming distance)

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

        2、常見的相似度(系數(shù))算法

        2.1 余弦相似度(Cosine Similarity)
        余弦相似度是用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小的度量。
        性質(zhì):給出的相似性范圍從-1到1:-1意味著兩個向量指向的方向正好截然相反,1表示它們的指向是完全相同的,0通常表示它們之間是獨(dú)立的,而在這之間的值則表示中間的相似性或相異性。
        代碼:
        >>> input1 = torch.randn(100, 128)>>> input2 = torch.randn(100, 128)>>> cos = nn.CosineSimilarity(dim=1, eps=1e-6)>>> output = cos(input1, input2)
        2.2 皮爾森相關(guān)系數(shù)(Pearson Correlation Coefficient): 用于度量兩個變量X和Y之間的相關(guān)(線性相關(guān)),其值介于-1與1之間。
        分子是兩個集合的交集大小,分母是兩個集合大小的幾何平均值。是余弦相似性的一種形式。
        皮爾遜相關(guān)系數(shù)具有平移不變性和尺度不變性,計(jì)算出了兩個向量(維度)的相關(guān)性。在各個領(lǐng)域都應(yīng)用廣泛,例如,在推薦系統(tǒng)根據(jù)為某一用戶查找喜好相似的用戶,進(jìn)而提供推薦,優(yōu)點(diǎn)是可以不受每個用戶評分標(biāo)準(zhǔn)不同和觀看影片數(shù)量不一樣的影響。
        代碼:
        import numpy as npx=np.random.random(8)y=np.random.random(8)
        #方法一:根據(jù)公式求解x_=x-np.mean(x)y_=y-np.mean(y)d1=np.dot(x_,y_)/(np.linalg.norm(x_)*np.linalg.norm(y_))
        #方法二:根據(jù)numpy庫求解X=np.vstack([x,y])d2=np.corrcoef(X)[0][1]
        2.3 KL散度(Kullback-Leibler Divergence): 即相對熵;是衡量兩個分布(P、Q)之間的距離;越小越相似。
        表示的就是概率 q 與概率 p 之間的差異,很顯然,散度越小,說明 概率 q 與概率 p 之間越接近,那么估計(jì)的概率分布于真實(shí)的概率分布也就越接近。
        代碼:
        >>> torch.nn.functional.kl_div(input, target, size_average=None, reduce=None, reduction='mean')>>> F.kl_div(q.log(),p,reduction='sum')#函數(shù)中的 p q 位置相反(也就是想要計(jì)算D(p||q),要寫成kl_div(q.log(),p)的形式),而且q要先取 log#reduction 是選擇對各部分結(jié)果做什么操作,
        2.4 Jaccard相似系數(shù)(Jaccard Coefficient): 主要用于計(jì)算符號度量或布爾值度量的樣本間的相似度。兩個集合A和B的交集元素在A,B的并集中所占的比例,稱為兩個集合的杰卡德相似系數(shù),用符號J(A,B)表示。杰卡德系數(shù)值越大,樣本的相似度越高。
        應(yīng)用:假設(shè)樣本A和樣本B是兩個n維向量,而且所有維度的取值都是0或1。例如,A(0,1,1,0)和B(1,0,1,1)。我們將樣本看成一個集合,1表示集合包含該元素,0表示集合不包含該元素。p:樣本A與B都是1的維度的個數(shù);q:樣本A是1而B是0的維度的個數(shù); r:樣本A是0而B是1的維度的個數(shù);s:樣本A與B都是0的維度的個數(shù)
        那么樣本A與B的杰卡德相似系數(shù)可以表示為:
        杰卡德相似度沒有考慮向量中潛在數(shù)值的大小,而是簡單的處理為0和1,不過,做了這樣的處理之后,杰卡德方法的計(jì)算效率肯定是比較高的,畢竟只需要做集合操作。
        import numpy as npfrom scipy.spatial.distance import pdistx=np.random.random(8)>0.5y=np.random.random(8)>0.5
        x=np.asarray(x,np.int32)y=np.asarray(y,np.int32)
        #方法一:根據(jù)公式求解up=np.double(np.bitwise_and((x != y),np.bitwise_or(x != 0, y != 0)).sum())down=np.double(np.bitwise_or(x != 0, y != 0).sum())d1=(up/down)

        #方法二:根據(jù)scipy庫求解X=np.vstack([x,y])d2=pdist(X,'jaccard')
        2.5 Tanimoto系數(shù)(廣義Jaccard相似系數(shù))
        其中A、B分別表示為兩個向量,集合中每個元素表示為向量中的一個維度,在每個維度上,取值通常是[0, 1]之間的值(如果取值是二值向量0或1,那么Tanimoto系數(shù)就等同Jaccard距離), 表示向量乘積, 表示向量的模。
        import numpy as npdef tanimoto_coefficient(p_vec, q_vec): """ This method implements the cosine tanimoto coefficient metric :param p_vec: vector one :param q_vec: vector two :return: the tanimoto coefficient between vector one and two """ pq = np.dot(p_vec, q_vec) p_square = np.linalg.norm(p_vec) q_square = np.linalg.norm(q_vec) return pq / (p_square + q_square - pq)
        2.6 互信息(Mutual Information) :是信息論里一種有用的信息度量,它可以看成是一個隨機(jī)變量 中包含的關(guān)于另一個隨機(jī)變量的信息量,或者說是一個隨機(jī)變量由于已知另一個隨機(jī)變量而減少的不肯定性。衡量隨機(jī)變量之間相互依賴程度的度量。
        設(shè)兩個隨機(jī)變量(X,Y)的聯(lián)合分布為P(x,y),邊緣分布分別為P(x),p(y),互信息I(X;Y)是聯(lián)合分布p(x,y)與邊緣分布p(x)p(y)的相對熵,即:
        #標(biāo)準(zhǔn)化互信息from sklearn import metricsif __name__ == '__main__': A = [1, 1, 1, 2, 3, 3] B = [1, 2, 3, 1, 2, 3] result_NMI=metrics.normalized_mutual_info_score(A, B) print("result_NMI:",result_NMI)

        1、對數(shù)似然相似度/對數(shù)似然相似率

        2、互信息/信息增益,相對熵/KL散度

        3、信息檢索——詞頻-逆文檔頻率(TF-IDF)

        4、詞對相似度——點(diǎn)間互信息

        3、歐式距離vs余弦相似度

        歐氏距離衡量的是空間各點(diǎn)的絕對距離,跟各個點(diǎn)所在的位置坐標(biāo)直接相關(guān);而余弦距離衡量的是空間向量的夾角,更加體現(xiàn)在方向上的差異,而不是位置。如果保持A點(diǎn)位置不變,B點(diǎn)朝原方向遠(yuǎn)離坐標(biāo)軸原點(diǎn),那么這個時候余弦距離是保持不變的,而A、B兩點(diǎn)的距離顯然在發(fā)生改變,這就是歐氏距離和余弦距離之間的不同之處。


        推薦閱讀


        添加極市小助手微信(ID : cv-mart),備注:研究方向-姓名-學(xué)校/公司-城市(如:目標(biāo)檢測-小極-北大-深圳),即可申請加入極市技術(shù)交流群,更有每月大咖直播分享、真實(shí)項(xiàng)目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、行業(yè)技術(shù)交流,一起來讓思想之光照的更遠(yuǎn)吧~

        △長按添加極市小助手

        △長按關(guān)注極市平臺,獲取最新CV干貨

        覺得有用麻煩給個在看啦~??
        瀏覽 121
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 一道本激情视频 | 男人天堂网在线免费观看 | 黑人成人片| 制服丝袜乱伦 | 国产精品美女久久久久av爽李椋 |