<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 5542字,需瀏覽 12分鐘

           ·

          2022-03-10 11:50

          點(diǎn)擊下方卡片,關(guān)注“新機(jī)器視覺”公眾號

          重磅干貨,第一時(shí)間送達(dá)

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

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

          1、常見的距離算法

          1.1 歐幾里得距離(Euclidean Distance
          在數(shù)學(xué)中,歐幾里得距離或歐幾里得度量是歐幾里得空間中兩點(diǎn)間“普通”(即直線)距離。使用這個(gè)距離,歐氏空間成為度量空間。相關(guān)聯(lián)的范數(shù)稱為歐幾里得范數(shù)。
          Euclidean Distance是一個(gè)通常采用的距離定義,它是在m維空間中兩個(gè)點(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距離)
          和歐式距離一樣,它們都是一種距離度量的定義、可以用來測量某兩個(gè)分布之間的距離。EMD主要應(yīng)用在圖像處理和語音信號處理領(lǐng)域。
          EMD問題通俗解釋: Earth Move翻譯過來是搬土,指把P位置的m個(gè)坑的土,用最小的代價(jià)搬到Q位置的n個(gè)坑中,dij是pi到qj兩個(gè)坑的距離,fij是從pi搬到qj的土量,則WORK工作量就是要最小化的目標(biāo)。線性規(guī)劃求解出fij后,再用fij對WORK作個(gè)歸一化,就得到了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是兩個(gè)矩陣,第一列表示權(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): 表示兩個(gè)點(diǎn)在標(biāo)準(zhǔn)坐標(biāo)系上的絕對軸距之和。也就是和象棋中的“車”一樣橫平豎直的走過的距離。曼哈頓距離是超凸度量。
          1.4 杰卡德距離(Jaccard Distance): 用來衡量兩個(gè)集合差異性的一種指標(biāo),它是杰卡德相似系數(shù)的補(bǔ)集,被定義為1減去Jaccard相似系數(shù)。適用于集合相似性度量,字符串相似性度量 。
          1.5 馬氏距離(Mahalanobis distance): 表示點(diǎn)與一個(gè)分布之間的距離。它是一種有效的計(jì)算兩個(gè)未知樣本集的相似度的方法。與歐氏距離不同的是,它考慮到各種特性之間的聯(lián)系(例如:一條關(guān)于身高的信息會(huì)帶來一條關(guān)于體重的信息,因?yàn)閮烧呤怯嘘P(guān)聯(lián)的),并且是尺度無關(guān)的(scale-invariant),即獨(dú)立于測量尺度。修正了歐式距離中各個(gè)維度尺度不一致且相關(guān)的問題。
          單個(gè)數(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個(gè)樣本,每個(gè)樣本2維 X=np.vstack([x,y])
          print X XT=X.T
          print XT
          #方法一:根據(jù)公式求解 S=np.cov(X) #兩個(gè)維度之間協(xié)方差矩陣 SI = np.linalg.inv(S) #協(xié)方差矩陣的逆矩陣 #馬氏距離計(jì)算兩個(gè)樣本之間的距離,此處共有4個(gè)樣本,兩兩組合,共有6個(gè)距離。 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)
          余弦相似度是用向量空間中兩個(gè)向量夾角的余弦值作為衡量兩個(gè)個(gè)體間差異的大小的度量。
          性質(zhì):給出的相似性范圍從-1到1:-1意味著兩個(gè)向量指向的方向正好截然相反,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):?用于度量兩個(gè)變量X和Y之間的相關(guān)(線性相關(guān)),其值介于-1與1之間。
          分子是兩個(gè)集合的交集大小,分母是兩個(gè)集合大小的幾何平均值。是余弦相似性的一種形式。
          皮爾遜相關(guān)系數(shù)具有平移不變性和尺度不變性,計(jì)算出了兩個(gè)向量(維度)的相關(guān)性。在各個(gè)領(lǐng)域都應(yīng)用廣泛,例如,在推薦系統(tǒng)根據(jù)為某一用戶查找喜好相似的用戶,進(jìn)而提供推薦,優(yōu)點(diǎn)是可以不受每個(gè)用戶評分標(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): 即相對熵;是衡量兩個(gè)分布(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ì)算符號度量或布爾值度量的樣本間的相似度。兩個(gè)集合A和B的交集元素在A,B的并集中所占的比例,稱為兩個(gè)集合的杰卡德相似系數(shù),用符號J(A,B)表示。杰卡德系數(shù)值越大,樣本的相似度越高。
          應(yīng)用:假設(shè)樣本A和樣本B是兩個(gè)n維向量,而且所有維度的取值都是0或1。例如,A(0,1,1,0)和B(1,0,1,1)。我們將樣本看成一個(gè)集合,1表示集合包含該元素,0表示集合不包含該元素。p:樣本A與B都是1的維度的個(gè)數(shù);q:樣本A是1而B是0的維度的個(gè)數(shù);r:樣本A是0而B是1的維度的個(gè)數(shù);s:樣本A與B都是0的維度的個(gè)數(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分別表示為兩個(gè)向量,集合中每個(gè)元素表示為向量中的一個(gè)維度,在每個(gè)維度上,取值通常是[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)?:是信息論里一種有用的信息度量,它可以看成是一個(gè)隨機(jī)變量 中包含的關(guān)于另一個(gè)隨機(jī)變量的信息量,或者說是一個(gè)隨機(jī)變量由于已知另一個(gè)隨機(jī)變量而減少的不肯定性。衡量隨機(jī)變量之間相互依賴程度的度量。
          設(shè)兩個(gè)隨機(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)的絕對距離,跟各個(gè)點(diǎn)所在的位置坐標(biāo)直接相關(guān);而余弦距離衡量的是空間向量的夾角,更加體現(xiàn)在方向上的差異,而不是位置。如果保持A點(diǎn)位置不變,B點(diǎn)朝原方向遠(yuǎn)離坐標(biāo)軸原點(diǎn),那么這個(gè)時(shí)候余弦距離是保持不變的,而A、B兩點(diǎn)的距離顯然在發(fā)生改變,這就是歐氏距離和余弦距離之間的不同之處。

          本文僅做學(xué)術(shù)分享,如有侵權(quán),請聯(lián)系刪文。

          —THE END—
          瀏覽 224
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美成人片网站 | 99久热在线精品视频 | 变态另类色图 | 男人操女人在线观看 | 免费在线性爱视频 |