Chciałbym obliczyć dywergencję Jensen-Shannon dla 3 następujących rozkładów. Czy poniższe obliczenia są prawidłowe? (Postępowałem zgodnie ze wzorem JSD z wikipedii ):
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
Z góry dziękuję...
EDYCJA Oto prosty, brudny kod Pythona, który również to oblicza:
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
źródło
źródło
Odpowiedzi:
Podam szczegóły jednego obliczenia:
W podobny sposób pozostałe terminy to 0,325083 i 1,098612. Zatem końcowy wynik to 1,084503 - (0,6931472 + 0,325083 + 1,098612) / 3 = 0,37889
źródło
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) {
została wklejona dwukrotnie. Wystarczy usunąć: wszystko inne działa i daje wyniki, które zacytowałem. Następnie zmodyfikujapply(p, 2, h)
do,apply(p, 1, h)
jak wskazano w komentarzu Legend .Pyton:
Jawa:
źródło
Podałeś odniesienie do Wikipedii. Podaję tutaj pełne wyrażenie rozbieżności Jensen-Shannon z wieloma rozkładami prawdopodobieństwa:
Pierwotne pytanie zostało zadane bez matematycznego wyrażenia rozbieżności JS w wielu dystrybucjach, co prowadzi do nieporozumień w zakresie rozumienia dostarczonych obliczeń.
weight
Użyto również terminu, który ponownie powoduje zamieszanie, że sposób wyboru odpowiednich wag do mnożenia. Powyższe wyrażenie wyjaśnia te zamieszania. Jak wynika z powyższego wyrażenia, wagi są wybierane automatycznie w zależności od liczby dystrybucji.źródło
Wersja Scala rozbieżności JS dwóch dowolnych sekwencji długości:
Sprawdź tę odpowiedź z kodem w sekcji edycji pytania:
źródło
Wersja ogólna, dla n rozkładów prawdopodobieństwa, w pythonie opartym na formule Wikipedii i komentarzach w tym poście z wektorem wag ( pi ) jako parametrem i niestandardową bazą danych :
źródło