python statistics scipy entropy

python - Interpretación de los valores de scipy.stats.entropy



statistics (1)

numpy.random.normal(-2.5,0.1,1000) es una muestra de una distribución normal. Son solo 1000 números en orden aleatorio. La documentación para entropy dice:

pk[i] es la probabilidad (posiblemente no normalizada) del evento i .

Entonces, para obtener un resultado malo, necesita que los números estén "alineados" para que los mismos índices correspondan a las mismas posiciones en la distribución. En su ejemplo, t1[0] no tiene relación con t2[0] . Su muestra no proporciona ninguna información directa sobre cuán probable es cada valor, que es lo que necesita para la divergencia KL; solo le da algunos valores reales que fueron tomados de la distribución.

La forma más directa de obtener valores alineados es evaluar la función de densidad de probabilidad de la distribución en un conjunto fijo de valores. Para hacer esto, necesita usar scipy.stats.norm (que resulta en un objeto de distribución que puede ser manipulado de varias maneras) en lugar de np.random.normal (que solo devuelve los valores de muestra). Aquí hay un ejemplo:

t1 = stats.norm(-2.5, 0.1) t2 = stats.norm(-2.5, 0.1) t3 = stats.norm(-2.4, 0.1) t4 = stats.norm(-2.3, 0.1) # domain to evaluate PDF on x = np.linspace(-5, 5, 100)

Entonces:

>>> stats.entropy(t1.pdf(x), t2.pdf(x)) -0.0 >>> stats.entropy(t1.pdf(x), t3.pdf(x)) 0.49999995020647586 >>> stats.entropy(t1.pdf(x), t4.pdf(x)) 1.999999900414918

Puedes ver que a medida que las distribuciones se alejan, su divergencia KL aumenta. (De hecho, usar su segundo ejemplo dará una divergencia KL de inf porque se superponen muy poco).

Estoy tratando de usar scipy.stats.entropy para estimar la divergencia Kullback-Leibler (KL) entre dos distribuciones. Más específicamente, me gustaría utilizar el KL como una métrica para decidir cuán consistentes son dos distribuciones.

Sin embargo, no puedo interpretar los valores de KL. Por ejemplo:

t1 = numpy.random.normal (-2.5,0.1,1000)

t2 = numpy.random.normal (-2.5,0.1,1000)

scipy.stats.entropy (t1, t2)

0.0015539217193737955

Entonces,

t1 = numpy.random.normal (-2.5,0.1,1000)

t2 = numpy.random.normal (2.5,0.1,1000)

scipy.stats.entropy (t1, t2)

= 0.0015908295787942181

¿Cómo pueden las distribuciones completamente diferentes, esencialmente sin superposición, tener el mismo valor de KL?

t1 = numpy.random.normal (-2.5,0.1,1000)

t2 = numpy.random.normal (25., 0.1,1000)

scipy.stats.entropy (t1, t2)

= 0.00081111364805590595

Este da incluso un valor de KL más pequeño (es decir, la distancia), lo que me inclinaría a interpretar como "más consistente".

¿Alguna idea sobre cómo interpretar scipy.stats.entropy (es decir, distancia de divergencia KL) en este contexto?