<p id="m2nkj"><option id="m2nkj"><big id="m2nkj"></big></option></p>
    <strong id="m2nkj"></strong>
    <ruby id="m2nkj"></ruby>

    <var id="m2nkj"></var>
  • 常見的距離算法和相似度計(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)
    <p id="m2nkj"><option id="m2nkj"><big id="m2nkj"></big></option></p>
    <strong id="m2nkj"></strong>
    <ruby id="m2nkj"></ruby>

    <var id="m2nkj"></var>
  • 中文字幕一区二区在线观看 | 久久原版视频 | 亚洲无码在线电影 | 日韩精品在线一二三四五区 | 亚洲BB| 夜夜精品视频 | 中文字幕第4页 | 亚洲视频小说网 | 操屄免费视频 | 黄色视频在线观看大全 |