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

歡迎訪問 生活随笔!

生活随笔

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

javascript

KL散度与JS散度

發布時間:2023/12/14 javascript 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 KL散度与JS散度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

KL散度與JS散度

  • KL散度(Kullback-Leibler divergence)
      • KL散度的計算公式
      • KL散度的基本性質
  • JS散度(Jensen-Shannon divergence)
      • JS散度的數學公式
      • 不同于KL的主要兩方面

KL散度(Kullback-Leibler divergence)

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

KL散度的計算公式

離散概率分布的KL散度計算公式:
KL(p∣∣q)=∑p(x)log?p(x)q(x)KL(p||q)=\sum p(x)\log \frac{p(x)}{q(x)}KL(pq)=p(x)logq(x)p(x)?
連續概率分布的KL散度計算公式:
KL(p∣∣q)=∫p(x)log?p(x)q(x)dxKL(p||q)=\int p(x)\log \frac{p(x)}{q(x)}dxKL(pq)=p(x)logq(x)p(x)?dx

KL散度的基本性質

  • 非負性
    KL散度的結果是非負的,簡單證明如下:
    KL(p∣∣q)=∑xp(x)log?p(x)q(x)=?∑xp(x)logq(x)p(x)KL(p||q)=\sum _xp(x) \log \frac {p(x)}{q(x)}=-\sum _xp(x)\ log \frac{q(x)}{p(x)}KL(pq)=x?p(x)logq(x)p(x)?=?x?p(x)?logp(x)q(x)?
    由于對數函數是一個上凸函數,所以有:
    ≥?log?[∑xp(x)q(x)p(x)]=?log?[∑xq(x)]=?log?1=0\ge-\log[\sum_xp(x)\frac{q(x)}{p(x)}]=-\log[\sum_xq(x)]=-\log 1=0 ?log[x?p(x)p(x)q(x)?]=?log[x?q(x)]=?log1=0
  • 不對稱性
    KL(p∣∣q)?=KL(q∣∣p)KL(p||q)\not=KL(q||p)KL(pq)??=KL(qp)

關于KL散度的數學概念,可移步[link] https://www.jiqizhixin.com/articles/2018-05-29-2?from=synced&keyword=直觀解讀kl散度的數學概念

JS散度(Jensen-Shannon divergence)

JS散度也稱JS距離,是KL散度的一種變形。

JS散度的數學公式

JS(p∣∣q)=12KL(p∣∣p+q2)+12KL(q∣∣p+q2)JS(p||q)=\frac12KL(p||\frac{p+q}2)+\frac12KL(q||\frac{p+q}{2})JS(pq)=21?KL(p2p+q?)+21?KL(q2p+q?)

不同于KL的主要兩方面

  • 值域范圍
    JS散度的值域范圍是[0,1],相同為0,相反則為1。相比較于KL,對相似度的判別更準確了。
  • 對稱性
    JS(p∣∣q)=JS(q∣∣p)JS(p||q)=JS(q||p)JS(pq)=JS(qp),而對稱能讓散度度量更準確。下面用一段代碼展示這其中的道理:
import numpy as np import math # 離散隨機變量的KL散度和JS散度的計算方法 def KL(p,q):#p,q為兩個list,里面存著對應的取值的概率,整個list相加為1if 0 in q:raise ValueErrorreturn sum(_p * math.log(_p/_q) for (_p,_q) in zip(p,q) if _p != 0)def JS(p,q):M = [0.5 * (_p + _q) for (_p,_q) in zip(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.2 0.26666668 0.33333334] [0.33333334 0.26666668 0.2 0.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.2 0.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.2 0.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.2 0.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.2 0.13333334 0.06666667] 0.38315075574389773 0.0985487692550548

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

總結

以上是生活随笔為你收集整理的KL散度与JS散度的全部內容,希望文章能夠幫你解決所遇到的問題。

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