一、f 散度(f-divergence)python
KL-divergence 的壞處在於它是無界的。事實上KL-divergence 屬於更普遍的 f-divergence 中的一種。編程
若是P和Q被定義成空間中的兩個機率分佈,則f散度被定義爲:網絡
一些通用的散度,如KL-divergence, Hellinger distance, 和total variation distance,都是f散度的一種特例。只是f函數的取值不一樣而也。框架
在python中的實現 :dom
import numpy as np import scipy.stats p=np.asarray([0.65,0.25,0.07,0.03]) q=np.array([0.6,0.25,0.1,0.05]) def f(t): return t*np.log(t) #方法一:根據公式求解 f1=np.sum(q*f(p/q)) #方法二:調用scipy包求解 f2=scipy.stats.entropy(p, q)
二、Hellinger distance函數
1 定義學習
1.1 度量理論測試
爲了從度量理論的角度定義Hellinger距離,咱們假設P和Q是兩個機率測度,而且它們對於第三個機率測度λ來講是絕對連續的,則P和Q的Hellinger距離的平方被定義以下:spa
這裏的dP / dλ 和 dQ / dλ分別是P和Q的Radon–Nikodym微分。這裏的定義是與λ無關的,所以當咱們用另一個機率測度替換λ時,只要P和Q關於它絕對連續,那麼上式就不變。爲了簡單起見,咱們一般把上式改寫爲:.net
1.2 基於Lebesgue度量的機率理論
爲了在經典的機率論框架下定義Hellinger距離,咱們一般將λ定義爲Lebesgue度量,此時dP / dλ 和 dQ / dλ就變爲了咱們一般所說的機率密度函數。若是咱們把上述機率密度函數分別表示爲 f 和 g ,那麼能夠用如下的積分形式表示Hellinger距離:
上述等式能夠經過展開平方項獲得,注意到任何機率密度函數在其定義域上的積分爲1。
根據柯西-施瓦茨不等式(Cauchy-Schwarz inequality),Hellinger距離知足以下性質:
1.3 離散機率分佈
對於兩個離散機率分佈 P=(p1,p2,...,pn)和 Q=(q1,q2,...,qn),它們的Hellinger距離能夠定義以下:
上式能夠被看做兩個離散機率分佈平方根向量的歐式距離,以下所示:
也能夠寫成:
在python中的實現:
import numpy as np p=np.asarray([0.65,0.25,0.07,0.03]) q=np.array([0.6,0.25,0.1,0.05]) #方法一: h1=1/np.sqrt(2)*np.linalg.norm(np.sqrt(p)-np.sqrt(q)) #方法二: h2=np.sqrt(1-np.sum(np.sqrt(p*q)))
三、巴氏距離(Bhattacharyya Distance)
在統計中,Bhattacharyya距離測量兩個離散或連續機率分佈的類似性。它與衡量兩個統計樣品或種羣之間的重疊量的Bhattacharyya係數密切相關。Bhattacharyya距離和Bhattacharyya係數以20世紀30年代曾在印度統計研究所工做的一個統計學家A. Bhattacharya命名。同時,Bhattacharyya係數能夠被用來肯定兩個樣本被認爲相對接近的,它是用來測量中的類分類的可分離性。
對於離散機率分佈 p和q在同一域 X,巴氏距離被定義爲:
其中BC(p,q)是Bhattacharyya係數:
對於連續機率分佈,Bhattacharyya係數被定義爲:
從公式能夠看出,Bhattacharyya係數BC(P,Q)能夠和前面的Hellinger距離聯繫起來,此時Hellinger距離能夠被定義爲:
所以,求得巴氏係數以後,就能夠求得巴氏距離和Hellinger距離。
在python中的實現:
import numpy as np p=np.asarray([0.65,0.25,0.07,0.03]) q=np.array([0.6,0.25,0.1,0.05]) BC=np.sum(np.sqrt(p*q)) #Hellinger距離: h=np.sqrt(1-BC) #巴氏距離: b=-np.log(BC)
四、MMD距離(Maximum mean discrepancy)
最大均值差別(Maximum mean discrepancy),度量在再生希爾伯特空間中兩個分佈的距離,是一種核學習方法。兩個隨機變量的距離爲:
其中k(.)是映射,用於把原變量映射到高維空間中。X,Y表示兩種分佈的樣本,F表示映射函數集。
基於兩個分佈的樣本,經過尋找在樣本空間上的映射函數K,求不一樣分佈的樣本在K上的函數值的均值,經過把兩個均值做差能夠獲得兩個分佈對應於K的mean discrepancy。尋找一個K使得這個mean discrepancy有最大值,就獲得了MMD。最後取MMD做爲檢驗統計量(test statistic),從而判斷兩個分佈是否相同。若是這個值足夠小,就認爲兩個分佈相同,不然就認爲它們不相同。更加簡單的理解就是:求兩堆數據在高維空間中的均值的距離。
近年來,MMD愈來愈多地應用在遷移學習中。在遷移學習環境下訓練集和測試集分別取樣自分佈p和q,兩類樣本集不一樣但相關。咱們能夠利用深度神經網絡的特徵變換能力,來作特徵空間的變換,直到變換後的特徵分佈相匹配,這個過程能夠是source domain一直變換直到匹配target domain。匹配的度量方式就是MMD。
在python中的實現,根據核函數不一樣,公式可能不同,根據公式編程便可。
五、Wasserstein distance
Wasserstein 距離,也叫Earth Mover's Distance,推土機距離,簡稱EMD,用來表示兩個分佈的類似程度。
Wasserstein distance 衡量了把數據從分佈「移動成」分佈
時所須要移動的平均距離的最小值(相似於把一堆土從一個形狀移動到另外一個形狀所須要作的功的最小值)
EMD是2000年IJCV期刊文章《The Earth Mover's Distance as a Metric for Image Retrieval》提出的一種直方圖類似度量(做者在以前的會議論文中也已經提到,不過鑑於IJCV的權威性和完整性,建議參考這篇文章)。
假設有兩個工地P和Q,P工地上有m堆土,Q工地上有n個坑,如今要將P工地上的m堆土所有移動到Q工地上的n個坑中,所作的最小的功。
每堆土咱們用一個二元組來表示(p,w),p表示土堆的中心,w表示土的數量。則這兩個工地可表示爲:
每一個土堆中心pi到每一個土坑中心qj都會有一個距離dij,則構成了一個m*n的距離矩陣。
那麼問題就是咱們但願找到一個流(flow),固然也是個矩陣[fij],每一項fij表明從pi到qj的流動數量,從而最小化總體的代價函數:
問題描述清楚了:就是把P中的m個坑的土,用最小的代價搬到Q中的n個坑中,pi到qj的兩個坑的距離由dij來表示。fij是從pi搬到qj的土的量;dij是pi位置到qj位置的代價(距離)。要最小化WORK工做量。EMD是把這個工做量歸一化之後的表達,即除以對fij的求和。
EMD公式:
更多關於EMD的理解請參考:
http://blog.csdn.net/zhangping1987/article/details/25368183
在python中的實現:調用opencv
import numpy as np import cv #p、q是兩個矩陣,第一列表示權值,後面三列表示直方圖或數量 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)
最後計算出來的emd:
emd = 160.542770