KL距離學習

2021-09-08 05:16:21 字數 1274 閱讀 8991

# -*- 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,也被稱為相對熵。公...