Me gustaría calcular la divergencia jensen-shannon para él después de 3 distribuciones. ¿Es correcto el siguiente cálculo? (Seguí la fórmula JSD de 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
Gracias por adelantado...
EDITAR Aquí hay un código Python sucio que también calcula esto:
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
fuente
fuente
Respuestas:
Daré el detalle de un cálculo:
De manera similar, los otros términos son 0.325083 y 1.098612. Entonces el resultado final es 1.084503 - (0.6931472 + 0.325083 + 1.098612) / 3 = 0.378889
fuente
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) {
se pegó dos veces. Simplemente elimínelo: todo lo demás funciona y produce los resultados que cito. Luego modifique elapply(p, 2, h)
aapply(p, 1, h)
como se señala en el comentario de Legend .Pitón:
Java:
fuente
Diste una referencia de Wikipedia. Aquí doy la expresión completa para la divergencia de Jensen-Shannon con múltiples distribuciones de probabilidad:
La pregunta original se publicó sin una expresión matemática de divergencia JS de distribución múltiple, lo que conduce a una confusión en la comprensión del cálculo proporcionado. Además,
weight
se utilizó el término que nuevamente causa confusión sobre cómo seleccionar los pesos apropiados para la multiplicación. La expresión anterior aclara estas confusiones. Como se desprende de la expresión anterior, los pesos se eligen automáticamente según el número de distribución.fuente
Versión Scala de la divergencia JS de dos secuencias de longitud arbitrarias:
Verifique esta respuesta con el código en la sección de edición de preguntas:
fuente
Una versión general, para n distribuciones de probabilidad, en pitón basado en la fórmula y los comentarios en este post con el vector de pesos (Wikipedia pi ) como parámetro y la costumbre logbase :
fuente