日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

KL散度 JS散度 熵

發布時間:2023/12/14 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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=01時,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為底log2為底)。

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(PQ)=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(PQ)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(PQ)=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 nats

2.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(PQ)=21??KL(P2P+Q?)+21??KL(Q2P+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 jensenshannon

4.交叉熵 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(PQ)

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散度 熵的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。