我正在嘗試從頭開始在兩個假想的骰子上實作 KL Divergence,但我不確定它是否正確。
通過“我如何繪制所有分布圖”,我想知道 KL Divergence 是一個數字還是一個分布?
進口
%matplotlib inline
import random
import numpy as np
import matplotlib. pyplot as plt
我創建空陣列來存盤大約 5500 卷兩個不同的假想骰子。
Die p 以相同的概率擲出 1-6。
Die q 90% 的時間擲出 1-4,而只有 10% 的時間擲出 5 或 6。(當然,一個作業骰子預計有六分之一的時間擲出 1-6。
q = []
p = []
for z in range(5000):
if random.random() < 0.1:
q.append(random.randint(5, 6))
p.append(random.randint(1, 6))
q.append(random.randint(1, 4))
p.append(random.randint(1, 6))
die p 和 die q 的分布示例。


在這里,我隨機抽取骰子陣列的樣本,并將 p 選擇的對數除以 q 選擇進行積分。這就是我認為我的深度不夠的地方,因為我不知道是否應該進行求和或積分。當我做一個總結時,我得到了一個巨大的數字。下面我想我可能有正確的集成,但我不知道我是否需要它,因為我正在處理一組有限的擲骰子。
對于 dx,我使用 12 除以兩個陣列的長度。12 是可能的骰子數,兩個陣列的總長度是從單個骰子擲出的每個讀數的總數。
kl_num = 0
both_len = len(q) len(p)
for i in range(both_len):
q_selection = q[random.randint(0, len(q)-1)]
p_selection = p[random.randint(0, len(p)-1)]
kl_num = p_selection * np.log(p_selection / q_selection) * 12 / both_len
$D_{KL} (P || Q) = \int P(x) log(P(x)/Q(x)) dx $
存盤在 kl_num 中的數字通常約為 22。這將我帶到了問題的 B 部分,關于如何繪制圖形或者我如何知道這是否正確。
謝謝你。
uj5u.com熱心網友回復:
為了計算兩個分布的 KL,您需要知道每個點的概率。我認為在你的 KL 公式中,有一個錯誤(請再次檢查)。例如,對于您提供的直方圖,如果我們將您提供的直方圖視為分布(您絕對應該考慮它們的分布)。您提供的兩個分布的 KL大約計算為:
1000* log(1200/900) 1300* log(1300/950) 1200*log(1200/900) 1100*log(1100/900) 250*log(250/900) 260*log(260/950)
uj5u.com熱心網友回復:
KL Divergence 中的概率不是實際概率。
這包含一個計算兩種分布概率的回圈,它們在 KL 散度方程中被呼叫。
%matplotlib inline
import random
import numpy as np
import matplotlib. pyplot as plt
q = []
p = []
for z in range(5000):
if random.random() < 0.1:
q.append(random.randint(5, 6))
p.append(random.randint(1, 6))
q.append(random.randint(1, 4))
p.append(random.randint(1, 6))
def probs(array):
fo = []
count = 0
for i in range(6):
sh = array.count(i 1) / np.sum(array)
fo.append(sh)
count = sh
factor = 1 / count
return [factor * z for z in fo]
KL = 0
for x in range(6):
KL = probs(p)[x] * np.log(probs(p)[x] / probs(q)[x])
print(KL)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/464879.html
上一篇:明星總是會回傳成本最低的路徑嗎?
下一篇:在C中編程泰勒級數時出現總線錯誤
