# -*- coding: utf-8 -*-
"""created on wed jan 9 07:56:39 2019
@author: shenfangyuan
kl距離的計算例子
參見:1,計算公式:
kl = \sim_i^n p(i) log ( p(i)/q(i) )
p(x=i) i=1...n 是每個x=i取值的概率.
q(x=i) i=1...n 是每個x=i取值的概率.
i=1...n 是概率分布中,樣本x取值的空間,我們通過sum遍歷這個空間的所有點
例如: 假設我們有這樣的兩個分布,p和q,他們出現0和1的概率如下。
p(0) = 1/2=0.5 p(1) = 1/2=0.5
q(0) = 1/4=0.25 q(1) = 3/4=0.75
這個時候,我們計算p和q之間的kl散度,就是這樣:
dl(p|q) = 0.5*log(0.5/0.25) + 0.5*log(0.5/0.75)
2,kl距離是非對稱的,需要關注分母 q(x)=0值得情況.
3,對於資料集d,我們可以通過不同的方法得到分布函式的估計,例如:一種分布從
直方圖獲得p(x),另一種方式從神經網路獲得分布q(x),通過kl距離,求取通過不同方法
得到的關於資料集d的分布之間的距離.
"""import numpy as np
import scipy.stats
#資料含義說明:
#隨機變數 p(x(1)) = 0.65, p(x(2)) = 0.25, p(x(3)) = 0.07, p(x(4)) = 0.03
# p/q計算的是兩個向量對應元素相除,結果仍然是向量
# log(p/q) 對相除結果的每個元素取log計算
# 這裡的p(x)和q(x)是資料集合d的概率分布資料(例如:直方圖資料),而不是原始資料d
p=np.asarray([0.65,0.25,0.07,0.03]) #np.asarray與np.array 區別
#p=np.array([0.65,0.25,0.07,0.03])
q=np.array([0.6, 0.25,0.1, 0.05])
print('p/q:', p/q)
#方法一:根據公式求解
kl1=np.sum(p*np.log(p/q))
#方法二:呼叫scipy包求解
kl2=scipy.stats.entropy(p, q)
print('kl1=',kl1,'\nkl2=',kl2)
關於相對熵(KL距離)的理解
定義 兩個概率質量函式為p x 和q x 之間的相對熵或kl距離定義為 d p q x p x logp x q x 如果已知隨機變數的真實分布為 p 可以構造平均描述長度為h p 的碼,但是,如果使用針對分布 q 的編碼,那麼平均意義上就需要 x p x log1q x 記作h p q 位元來描述...
深度學習之KL散度
kl散度的用途 比較兩個概率分布的接近程度。在統計應用中,我們經常需要用乙個簡單的,近似的概率分布f f 來描述 觀察資料 dd或者另乙個複雜的概率分布 f f 這個時候,我們需要乙個量來衡量我們選擇的近似分布 f role presentation style position relative ...
KL距離(衡量兩個概率分布的差異情況)
kl距離,是kullback leibler差異 kullback leibler divergence 的簡稱,也叫做相對熵 relative entropy 它衡量的是相同事件空間裡的兩個概率分布的差異情況。kl距離全稱為kullback leibler divergence,也被稱為相對熵。公...