概率分布之間的距離度量以及python實現(三)


 

概率分布之間的距離,顧名思義,度量兩組樣本分布之間的距離 。

1、卡方檢驗

統計學上的χ2統計量,由於它最初是由英國統計學家Karl Pearson在1900年首次提出的,因此也稱之為Pearson χ2,其計算公式為

\chi^2=\sum \frac{(A-E)^2}{E}=\sum_{i=1}^k \frac{(A_i-E_i)^2}{E_i}=\sum_{i=1}^k \frac{(A_i-np_i)^2}{np_i}  (i=1,2,3,…,k)

  其中,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")

 

2、交叉熵

通常,一個信源發送出什么符號是不確定的,衡量它的不確定性可以根據其出現的概率來度量。概率大,出現機會多,不確定性小;反之就大。

不確定性函數f必須滿足兩個條件:

   1)是概率P的單調遞降函數;

   2)兩個獨立符號所產生的不確定性應等於各自不確定性之和,即f(P1,P2)=f(P1)+f(P2),這稱為可加性。

同時滿足這兩個條件的函數f是對數函數,即

在信源中,考慮的不是某一單個符號發生的不確定性,而是要考慮這個信源所有可能發生情況的平均不確定性。若信源符號有n種取值:U1…Ui…Un,對應概率為:P1…Pi…Pn,且各種符號的出現彼此獨立。這時,信源的平均不確定性應當為單個符號不確定性-logPi的統計平均值(E),可稱為信息熵,即

假設現在有一個樣本集中兩個概率分布p,q,其中p為真實分布,q為非真實分布。假如,按照真實分布p來衡量識別一個樣本所需要的編碼長度的期望為:
H(p)=
但是,如果采用錯誤的分布q來表示來自真實分布p的平均編碼長度,則應該是:
H(p,q)=

 我們稱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()

 

3、相對熵(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) 

 

4、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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM