Saya ingin menghitung divergensi jensen-shannon untuknya mengikuti 3 distribusi. Apakah perhitungan di bawah ini benar? (Saya mengikuti rumus JSD dari wikipedia ):
P1 a:1/2 b:1/2 c:0
P2 a:0 b:1/10 c:9/10
P3 a:1/3 b:1/3 c:1/3
All distributions have equal weights, ie 1/3.
JSD(P1, P2, P3) = H[(1/6, 1/6, 0) + (0, 1/30, 9/30) + (1/9,1/9,1/9)] -
[1/3*H[(1/2,1/2,0)] + 1/3*H[(0,1/10,9/10)] + 1/3*H[(1/3,1/3,1/3)]]
JSD(P1, P2, P3) = H[(1/6, 1/5, 9/30)] - [0 + 1/3*0.693 + 0] = 1.098-0.693 = 0.867
Terima kasih sebelumnya...
Sunting Berikut adalah beberapa kode Python kotor sederhana yang menghitung ini juga:
def entropy(prob_dist, base=math.e):
return -sum([p * math.log(p,base) for p in prob_dist if p != 0])
def jsd(prob_dists, base=math.e):
weight = 1/len(prob_dists) #all same weight
js_left = [0,0,0]
js_right = 0
for pd in prob_dists:
js_left[0] += pd[0]*weight
js_left[1] += pd[1]*weight
js_left[2] += pd[2]*weight
js_right += weight*entropy(pd,base)
return entropy(js_left)-js_right
usage: jsd([[1/2,1/2,0],[0,1/10,9/10],[1/3,1/3,1/3]])
distance-functions
information-theory
kanzen_master
sumber
sumber
Jawaban:
Saya akan memberikan detail dari satu perhitungan:
Dengan cara yang sama, ketentuan lainnya adalah 0,325083 dan 1.098612. Jadi hasil akhirnya adalah 1,084503 - (0,6931472 + 0,325083 + 1,098612) / 3 = 0,378889
sumber
h <- function(x) {h <- function(x) {y <- x[x > 0]; -sum(y * log(y))}; jsd <- function(p,q) {h(q %*% p) - q %*% apply(p, 2, h)}
p
q
p <- matrix(c(1/2,1/2,0, 0,1/10,9/10, 1/3,1/3,1/3), ncol=3, byrow=TRUE); q <- c(1/3,1/3,1/3); jsd(p,q)
h <- function(x) {
itu disisipkan dua kali. Hapus saja: semuanya berfungsi dan menghasilkan hasil yang saya kutip. Kemudian modifikasiapply(p, 2, h)
keapply(p, 1, h)
seperti yang ditunjukkan dalam komentar oleh Legend .Python:
Jawa:
sumber
Anda memberi referensi Wikipedia. Di sini saya memberikan ekspresi lengkap untuk divergensi Jensen-Shannon dengan distribusi probabilitas berganda:
Pertanyaan asli diposting tanpa ekspresi matematika divergensi JS multi-distribusi yang mengarah pada kebingungan dalam memahami perhitungan yang diberikan. Juga, istilah
weight
itu digunakan yang lagi-lagi menyebabkan kebingungan bahwa bagaimana Anda memilih bobot yang sesuai untuk perkalian. Ekspresi di atas menjelaskan kebingungan ini. Seperti yang jelas dari ungkapan di atas, bobot dipilih secara otomatis tergantung pada jumlah distribusi.sumber
Versi scala dari divergensi JS dari dua urutan panjang arbitrer:
Periksa silang jawaban ini dengan kode di bagian edit pertanyaan:
sumber
Versi umum, untuk distribusi probabilitas n , dalam python berdasarkan rumus Wikipedia dan komentar dalam posting ini dengan vektor bobot ( pi ) sebagai parameter dan logbase khusus :
sumber