機率分佈之間的距離,顧名思義,度量兩組樣本分佈之間的距離 。html
一、卡方檢驗python
統計學上的χ2統計量,因爲它最初是由英國統計學家Karl Pearson在1900年首次提出的,所以也稱之爲Pearson χ2,其計算公式爲git
其中,Ai爲i水平的觀察頻數,Ei爲i水平的指望頻數,n爲總頻數,pi爲i水平的指望頻率。i水平的指望頻數Ei等於總頻數n×i水平的指望機率pi。當n比較大時,χ2統計量近似服從k-1(計算Ei時用到的參數個數)個自由度的卡方分佈。 框架
卡方檢驗常常用來檢驗某一種觀測分佈是否是符合某一類典型的理論分佈(如二項分佈,正態分佈等)。觀察頻數與指望頻數越接近,二者之間的差別越小,χ2值越小;若是兩個分佈徹底一致,χ2值爲0;反之,觀察頻數與指望頻數差異越大,二者之間的差別越大,χ2值越大。換言之,大的χ2值代表觀察頻數遠離指望頻數,即代表遠離假設。小的χ2值代表觀察頻數接近指望頻數,接近假設。所以,χ2是觀察頻數與指望頻數之間距離的一種度量指標,也是假設成立與否的度量指標。若是χ2值「小」,研究者就傾向於不拒絕H0;若是χ2值大,就傾向於拒絕H0。至於χ2在每一個具體研究中究竟要大到什麼程度才能拒絕H0,則要藉助於卡方分佈求出所對應的P值來肯定(一般取p=0.05)。函數
在python中的實現:學習
# -*- coding: utf-8 -*- ''' 卡方公式(o-e)^2 / e 指望值和收集到數據不能低於5,o(observed)觀察到的數據,e(expected)表示指望的數據 (o-e)平方,最後除以指望的數據e ''' import numpy as np from scipy.stats import chisquare list_observe=np.array([30,14,34,45,57,20]) list_expect=np.array([20,20,30,40,60,30]) #方法一:根據公式求解(最後根據c1的值去查表判斷) c1=np.sum(np.square(list_observe-list_expect)/list_expect) #方法二:使用scipy庫來求解 c2,p=chisquare(f_obs=list_observe, f_exp=list_expect) ''' 返回NAN,無窮小 ''' if p>0.05 or p=="nan": print("H0 win,there is no difference") else: print("H1 win,there is difference")
二、交叉熵編碼
一般,一個信源發送出什麼符號是不肯定的,衡量它的不肯定性能夠根據其出現的機率來度量。機率大,出現機會多,不肯定性小;反之就大。spa
不肯定性函數f必須知足兩個條件:code
1)是機率P的單調遞降函數;orm
2)兩個獨立符號所產生的不肯定性應等於各自不肯定性之和,即f(P1,P2)=f(P1)+f(P2),這稱爲可加性。
同時知足這兩個條件的函數f是對數函數,即
在信源中,考慮的不是某一單個符號發生的不肯定性,而是要考慮這個信源全部可能發生狀況的平均不肯定性。若信源符號有n種取值:U1…Ui…Un,對應機率爲:P1…Pi…Pn,且各類符號的出現彼此獨立。這時,信源的平均不肯定性應當爲單個符號不肯定性-logPi的統計平均值(E),可稱爲信息熵,即
咱們稱H(p)爲信息熵,稱H(p,q)爲交叉熵。
交叉熵在CNN分類中常常用到,用來做爲預測值和真實標籤值的距離度量。通過卷積操做後,最後一層出來的特徵通過softmax函數後會變成一個機率向量,咱們能夠看做爲是機率分佈q, 而真實標籤咱們能夠看做是機率分佈p, 所以真實分佈p和預測分佈q的交叉熵就是咱們要求的loss損失值,即
在python中的實現:
import numpy as np import tensorflow as tf fea=np.asarray([6.5,4.2,7.4,3.5],np.float32) label=np.array([1,0,0,0]) #方法一:根據公式求解 def softmax(x): return np.exp(x)/np.sum(np.exp(x),axis=0) loss1=-np.sum(label*np.log(softmax(fea))) #方法二:調用tensorflow深度學習框架求解 sess=tf.Session() logits=tf.Variable(fea) labels=tf.Variable(label) sess.run(tf.global_variables_initializer()) loss2=sess.run(tf.losses.softmax_cross_entropy(labels,logits)) sess.close()
三、相對熵(relative entropy)
又稱爲KL散度(Kullback–Leibler divergence,簡稱KLD),信息散度(information divergence),信息增益(information gain)。
相對熵是交叉熵與信息熵的差值。即
相對熵=交叉熵-信息熵
KL(p||q)=H(p,q)-H(p)
表示用分佈q模擬真實分佈p相比用p模擬p,所需的額外信息。
相對熵(KL散度)有兩個主要的性質。以下
(1)儘管 KL 散度從直觀上是個度量或距離函數,但它並非一個真正的度量或者距離,由於它不具備對稱性,即
(2)相對熵具備非負性
總結一下:
信息熵公式:
交叉熵公式:
相對熵公式:
三者的關係:
在python中的實現:
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]) #方法一:根據公式求解 kl1=np.sum(p*np.log(p/q)) #方法二:調用scipy包求解 kl2=scipy.stats.entropy(p, q)
四、js散度(Jensen-Shannon)
由於kl散度不具對稱性,所以js散度在kl散度的基礎上進行了改進:
現有兩個分佈p1和p2,其JS散度公式爲:
在python中的實現:
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]) M=(p+q)/2 #方法一:根據公式求解 js1=0.5*np.sum(p*np.log(p/M))+0.5*np.sum(q*np.log(q/M)) #方法二:調用scipy包求解 js2=0.5*scipy.stats.entropy(p, M)+0.5*scipy.stats.entropy(q, M)