KL散度與JS散度

2021-08-29 18:37:44 字數 3579 閱讀 7813

js散度(jensen-shannon divergence)

又稱kl距離,相對熵。kl散度是描述兩個概率分布p和q之間差異的一種方法。直觀地說,可以用來衡量給定任意分布偏離真實分布的程度,如果兩個分布完全匹配,那麼kl(p||q)=0,否則它的取值應該是0~∞(inf)之間。kl散度越小,真實分布與近視分布之間的匹配程度就越好。

離散概率分布的kl散度計算公式:

k l(

p∣∣q

)=∑p

(x

)log⁡p

(x)q

(x

)kl(p||q)=\sum p(x)\log \frac

kl(p∣∣

q)=∑

p(x)

logq(x

)p(x

)​連續概率分布的kl散度計算公式:

k l(

p∣∣q

)=∫p

(x

)log⁡p

(x)q

(x)d

xkl(p||q)=\int p(x)\log \fracdx

kl(p∣∣

q)=∫

p(x)

logq(x

)p(x

)​dx

關於kl散度的數學概念,可移步[link] 直觀解讀kl散度的數學概念

js散度也稱js距離,是kl散度的一種變形。

j s(

p∣∣q

)=12

kl(p

∣∣p+

q2)+

12kl

(q∣∣

p+q2

)js(p||q)=\frac12kl(p||\frac2)+\frac12kl(q||\frac)

js(p∣∣

q)=2

1​kl

(p∣∣

2p+q

​)+2

1​kl

(q∣∣

2p+q

​)

import numpy as np

import math

# 離散隨機變數的kl散度和js散度的計算方法

defkl

(p,q)

:#p,q為兩個list,裡面存著對應的取值的概率,整個list相加為1if0

in q:

raise valueerror

return

sum(_p * math.log(_p/_q)

for(_p,_q)

inzip

(p,q)

if _p !=0)

defjs

(p,q)

: m =

[0.5

*(_p + _q)

for(_p,_q)

inzip

(p,q)

]return

0.5*

(kl(p,m)

+ kl(q,m)

)def

exp(a,b)

: a = np.array(a,dtype=np.float32)

b = np.array(b,dtype=np.float32)

a /= a.

sum(

) b /= b.

sum(

)print

(a)print

(b)print

(kl(a,b)

)print

(js(a,b)

)# exp 1

exp([1

,2,3

,4,5

],[5

,4,3

,2,1

])[0.06666667

0.13333334

0.20.26666668

0.33333334][

0.33333334

0.26666668

0.20.13333334

0.06666667

]0.5216030835963031

0.11968758856917597

# exp 2

#把公式中的第二個分布做修改,假設這個分布中有某個值的取值非常小,就有可能增加兩個分布的散度值

exp([1

,2,3

,4,5

],[1e

-12,4

,3,2

,1])

exp([1

,2,3

,4,5

],[5

,4,3

,2,1e

-12])

[0.06666667

0.13333334

0.20.26666668

0.33333334][

1.e-13

4.e-01

3.e-01

2.e-01

1.e-01

]2.065502018456509

0.0985487692550548

[0.06666667

0.13333334

0.20.26666668

0.33333334][

3.5714287e-01

2.8571430e-01

2.1428572e-01

1.4285715e-01

7.1428574e-14

]9.662950847122168

0.19399530008415986

# exp 3

exp([1e

-12,2

,3,4

,5],

[5,4

,3,2

,1])

exp([1

,2,3

,4,1e

-12],

[5,4

,3,2

,1])

[7.1428574e-14

1.4285715e-01

2.1428572e-01

2.8571430e-01

3.5714287e-01][

0.33333334

0.26666668

0.20.13333334

0.06666667

]0.7428131560123377

0.19399530008415986

[1.e-01

2.e-01

3.e-01

4.e-01

1.e-13][

0.33333334

0.26666668

0.20.13333334

0.06666667

]0.38315075574389773

0.0985487692550548

將第乙個實驗與第二個實驗做對比,可以看出kl散度的波動比較大,而js的波動相對小。

如果將第二個實驗和第三個實驗做對比,可以發現kl散度在衡量兩個分布的差異時具有很大的不對稱性。如果後面的分布在某乙個值上缺失,就回得到很大的散度值;但是如果前面的分布在某乙個值上缺失,最終的kl散度並沒有太大的波動。這個demo可以清楚地看出kl不對稱性帶來的一些小問題,而js具有對稱性,所以第二個實驗和第三個實驗的js散度實際上是距離相等的分布組。

KL散度 JS散度

kl divergence kullback leibler divergence kl散度,kl距離,又叫相對熵 relative entropy 衡量兩個概率分布之間的不同程度,是描述兩個概率分布p和q差異的一種方法就是資訊理論學的相對熵 最簡單的情況 當kl divergence為0時,兩個分...

KL散度 JS散度 Wasserstein距離

kl散度又稱為相對熵,資訊散度,資訊增益。kl散度是兩個概率分布p和q 差別的非對稱性的度量。kl散度是用來 度量使用基於q的編碼來編碼來自p的樣本平均所需的額外的位元數。典型情況下,p表示資料的真實分布,q表示資料的理論分布,模型分布,或p的近似分布。定義如下 因為對數函式是凸函式,所以kl散度的...

KL散度 JS散度以及交叉熵對比

在看 detecting regions of maximal divergence for spatio temporal anomaly detection 時,文中提到了這三種方法來比較時間序列中不同區域概率分布的差異。三者都是用來衡量兩個概率分布之間的差異性的指標。不同之處在於它們的數學表達...