javascript
KL散度 JS散度 熵
KL散度 JS散度 熵
- 1.自信息和熵
- 1.1 自信息self information
- 1.2 熵 entropy
- 2.KL散度 Kullback-Leibler divergence
- 2.1 定義
- 2.2 KL散度與熵、交叉熵之間的關系
- 2.3 python代碼實現
- 2.3.1 定義兩個概率分布并可視化
- 2.3.2 計算KL散度
- 2.3.2.1 自定義函數
- 2.3.2.2 scipy自帶函數
- 3.JS散度 Jensen-Shannon divergence
- 3.1 定義
- 3.2 python代碼實現
- 4.交叉熵 cross-entropy
- 4.1 公式
- 4.2 python代碼實現
- 參考文獻
此blog可視為機器學習術語的部分內容。
有些術語,耳熟能詳,但如果讓細致表述下,卻往往捉襟見肘,好似熟悉的陌生人,總結下時而溫故。
1.自信息和熵
1.1 自信息self information
自信息表示一個隨機事件包含的信息量,隨機事件發生概率越高,自信息越低;發生概率越低,自信息越高。
設一隨機變量X,事件x發生的概率為p(x)p(x)p(x),則自信息定義為:
I(x)=?log?p(x)\qquad\qquad\qquad\qquad\qquad\qquad I(x)=-\log p(x)I(x)=?logp(x).
1.2 熵 entropy
熵是表示隨機變量不確定性的度量。
離散隨機變量X的概率分布為:
P(X=xi)=pi,i=1,2,...,n\qquad\qquad\qquad P(X=x_i)=p_i,i=1,2,...,nP(X=xi?)=pi?,i=1,2,...,n
其熵定義為:
H(X)=?∑ipilog?pi\qquad\qquad\qquad H(X)=-\sum\limits_ip_i\log p_iH(X)=?i∑?pi?logpi?
可見熵只依賴于隨機變量的分布,與隨機變量的值無關,因此 H(X)H(X)H(X)也記作H(p)H(p)H(p)。
若隨機變量X只有兩個取值,1和0,則X的分布為:
P(X=1)=p,P(X=0)=1?p,p∈[0,1]\qquad\qquad\qquad P(X=1)=p, \ P(X=0)=1-p,p \in[0,1]P(X=1)=p,?P(X=0)=1?p,p∈[0,1],此時熵為:
H(X)=?plog?p?(1?p)log?(1?p)\qquad\qquad\qquad H(X)=-p\log p-(1-p)\log(1-p)H(X)=?plogp?(1?p)log(1?p)
該函數曲線如下圖所示:
可見當p=0或1p=0或1p=0或1時,H(x)H(x)H(x)均為0 ,即沒有不確定性。
p=0.5p=0.5p=0.5時,H(x)=1H(x)=1H(x)=1,取得最大值 (log?以2為底\log以2為底log以2為底)。
2.KL散度 Kullback-Leibler divergence
2.1 定義
KL(P∥Q)=∑xp(x)log?p(x)q(x)=?∑xp(x)log?q(x)p(x)\qquad\qquad KL(P \parallel Q) = \sum\limits_{x}p(x)\log\cfrac{p(x)}{q(x)}=- \sum\limits_{x}p(x)\log\cfrac{q(x)}{p(x)}KL(P∥Q)=x∑?p(x)logq(x)p(x)?=?x∑?p(x)logp(x)q(x)?
其中p,qp,qp,q是兩個概率分布,KL散度可用來衡量兩個分布之間的差異。
KL散度滿足非負性,即KL(P∥Q)≥0KL(P \parallel Q)\ge0KL(P∥Q)≥0。
當這兩個分布完全一致時,KL散度值為0。
2.2 KL散度與熵、交叉熵之間的關系
KL(P∥Q)=∑xp(x)log?p(x)q(x)=∑xp(x)log?p(x)?∑xp(x)log?q(x)=?H(P)+H(P,Q)\qquad\qquad KL(P \parallel Q) = \sum\limits_{x}p(x)\log\cfrac{p(x)}{q(x)}\\\qquad\qquad\qquad\quad\quad\quad\ =\sum\limits_{x}p(x)\log{p(x)}-\sum\limits_{x}p(x)\log{q(x)}\\\qquad\qquad\qquad\quad\quad\quad\ =-H(P)+H(P,Q)KL(P∥Q)=x∑?p(x)logq(x)p(x)??=x∑?p(x)logp(x)?x∑?p(x)logq(x)?=?H(P)+H(P,Q)
2.3 python代碼實現
代碼來自 https://machinelearningmastery.com/divergence-between-probability-distributions/。
2.3.1 定義兩個概率分布并可視化
import matplotlib.pyplot as plt import numpy as np events = ['red', 'green', 'blue'] p = [0.10, 0.40, 0.50] q = [0.80, 0.15, 0.05] plt.subplot(2,1,1) plt.bar(events, p) # plot second distribution plt.subplot(2,1,2) plt.bar(events, q) # show the plot plt.show()2.3.2 計算KL散度
2.3.2.1 自定義函數
from math import log def kl_divergence(p, q):return sum(p[i] * log(p[i]/q[i]) for i in range(len(p)))# calculate (P || Q) kl_pq = kl_divergence(p, q) print('KL(P || Q): %.3f nats' % kl_pq) # calculate (Q || P) kl_qp = kl_divergence(q, p) print('KL(Q || P): %.3f nats' % kl_qp)#KL(P || Q): 1.336 nats #KL(Q || P): 1.401 nats2.3.2.2 scipy自帶函數
from scipy.special import rel_entr kl_pq = rel_entr(p, q) print('KL(P || Q): %.3f nats' % sum(kl_pq)) # calculate (Q || P) kl_qp = rel_entr(q, p) print('KL(Q || P): %.3f nats' % sum(kl_qp))#KL(P || Q): 1.336 nats #KL(Q || P): 1.401 nats可見scipy自帶KL散度函數中log是以10為底的。
3.JS散度 Jensen-Shannon divergence
JS散度也是一種衡量兩個分布相似度的指標。
3.1 定義
JS(P∥Q)=12KL(P∥P+Q2)+12KL(Q∥P+Q2)\qquad\qquad JS(P \parallel Q) =\cfrac {1}{2}\ KL(P \parallel\cfrac {P+Q}{2})+\cfrac {1}{2}\ KL(Q \parallel\cfrac{P+Q}{2})JS(P∥Q)=21??KL(P∥2P+Q?)+21??KL(Q∥2P+Q?)
從公式中可以看出,JS散度具有對稱性。
3.2 python代碼實現
使用與前例相同的概率分布:
# calculate the js divergence def js_divergence(p, q):m = 0.5 * (p + q)return 0.5 * kl_divergence(p, m) + 0.5 * kl_divergence(q, m)p = np.asarray(p) q = np.asarray(q)# calculate JS(P || Q) js_pq = js_divergence(p, q) print('JS(P || Q) divergence: %.3f nats' % js_pq)# calculate JS(Q || P) js_qp = js_divergence(q, p) print('JS(Q || P) divergence: %.3f nats' % js_qp)#JS(P || Q) divergence: 0.291 nats #JS(Q || P) divergence: 0.291 nats結果表明JS散度具有對稱性。
scipy中實現的是jensen-shannon距離,即JS散度的平方根值。這里不再細述。
from scipy.spatial.distance import jensenshannon4.交叉熵 cross-entropy
交叉熵是機器學習/深度學習中分類任務/語義分割中一種常用的損失函數。
4.1 公式
H(P,Q)=?∑xp(x)log?q(x)\\\qquad\qquad H(P,Q)=-\sum\limits_{x}p(x)\log{q(x)}H(P,Q)=?x∑?p(x)logq(x)
如KL散度一節介紹,
H(P,Q)=H(P)+KL(P∥Q)\qquad\qquad H(P,Q)=H(P)+KL(P \parallel Q)H(P,Q)=H(P)+KL(P∥Q)
4.2 python代碼實現
以下代碼引自https://machinelearningmastery.com/cross-entropy-for-machine-learning/。
使用與前例相同的概率分布:
# example of calculating cross entropy from math import log2# calculate cross entropy def cross_entropy(p, q):return -sum([p[i]*log2(q[i]) for i in range(len(p))])# define data p = [0.10, 0.40, 0.50] q = [0.80, 0.15, 0.05] # calculate cross entropy H(P, Q) ce_pq = cross_entropy(p, q) print('H(P, Q): %.3f bits' % ce_pq) # calculate cross entropy H(Q, P) ce_qp = cross_entropy(q, p) print('H(Q, P): %.3f bits' % ce_qp)#H(P, Q): 3.288 bits #H(Q, P): 2.906 bits參考文獻
[1] 周志華,機器學習,附錄C.3 KL散度
[2] 李航,統計學習方法,5.2.2 信息增益 及 附錄E KL散度的定義和…
[3] 邱錫鵬,神經網絡與深度學習,附錄E 信息論
[4] https://machinelearningmastery.com/divergence-between-probability-distributions/
[5] https://machinelearningmastery.com/cross-entropy-for-machine-learning/
[6] https://d2l.ai/chapter_appendix-mathematics-for-deep-learning/information-theory.html#cross-entropy
總結
以上是生活随笔為你收集整理的KL散度 JS散度 熵的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机考试外贸出货单,史上最全订单跟进英
- 下一篇: 生活与工作原则-Ray Dalio