js散度(jensen-shannon divergence)
又稱kl距離,相對熵。kl散度是描述兩個概率分布p和q之間差異的一種方法。直觀地說,可以用來衡量給定任意分布偏離真實分布的程度,如果兩個分布完全匹配,那麼kl(p||q)=0,否則它的取值應該是0~∞(inf)之間。kl散度越小,真實分布與近視分布之間的匹配程度就越好。
離散概率分布的kl散度計算公式:
k l(
p∣∣q
)=∑p
(x
)logp
(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
)logp
(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
1kl
(p∣∣
2p+q
)+2
1kl
(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 時,文中提到了這三種方法來比較時間序列中不同區域概率分布的差異。三者都是用來衡量兩個概率分布之間的差異性的指標。不同之處在於它們的數學表達...