Soy bastante nuevo en esto y no puedo decir que tengo una comprensión completa de los conceptos teóricos detrás de esto. Estoy tratando de calcular la divergencia de KL entre varias listas de puntos en Python. Estoy usando http://scikit-learn.org/stable/modules/generated/sklearn.metrics.mutual_info_score.html para intentar hacer esto. El problema con el que me encuentro es que el valor devuelto es el mismo para 2 listas de números (es 1.3862943611198906). Tengo la sensación de que estoy cometiendo algún tipo de error teórico aquí, pero no puedo detectarlo.
values1 = [1.346112,1.337432,1.246655]
values2 = [1.033836,1.082015,1.117323]
metrics.mutual_info_score(values1,values2)
Ese es un ejemplo de lo que estoy ejecutando, solo que estoy obteniendo la misma salida para cualquier entrada 2. Cualquier consejo / ayuda sería apreciada!
python
clustering
scikit-learn
Nanda
fuente
fuente
sklearn.metrics.mutual_info_score([1.346112,1.337432,1.246655], [1.033836,1.082015,1.117323])
, obtengo el valor1.0986122886681096
.Respuestas:
En primer lugar,
sklearn.metrics.mutual_info_score
implementa información mutua para evaluar los resultados de la agrupación, ¡no pura divergencia de Kullback-Leibler!La divergencia KL (y cualquier otra medida de este tipo) espera que los datos de entrada tengan una suma de 1 . De lo contrario, son no apropiados distribuciones de probabilidad . Si sus datos no tienen una suma de 1, ¡lo más probable es que no sea apropiado usar la divergencia KL! (En algunos casos, puede ser admisible tener una suma de menos de 1, por ejemplo, en el caso de datos faltantes).
También tenga en cuenta que es común usar logaritmos de base 2. Esto solo produce un factor de escala constante en la diferencia, pero los logaritmos de base 2 son más fáciles de interpretar y tienen una escala más intuitiva (0 a 1 en lugar de 0 a log2 = 0.69314 ..., midiendo la información en bits en lugar de nats).
Como podemos ver claramente, el resultado de MI de sklearn se escala utilizando logaritmos naturales en lugar de log2. Esta es una elección desafortunada, como se explicó anteriormente.
La divergencia de Kullback-Leibler es frágil, desafortunadamente. En el ejemplo anterior no está bien definido:
KL([0,1],[1,0])
causa una división por cero y tiende al infinito. También es asimétrico .fuente
scipy.stats.entropy
se usa, normalizará las probabilidades a uno. De los documentos ( scipy.github.io/devdocs/generated/scipy.stats.entropy.html ): "Esta rutina normalizará pk y qk si no suman 1."La función de entropía de Scipy calculará la divergencia de KL si alimenta dos vectores p y q, cada uno representa una distribución de probabilidad. Si los dos vectores no son archivos PDF, se normalizarán primero.
La información mutua está relacionada, pero no es lo mismo que KL Divergence.
"Esta información mutua ponderada es una forma de divergencia KL ponderada, que se sabe que toma valores negativos para algunas entradas, y hay ejemplos en los que la información mutua ponderada también toma valores negativos".
fuente
No estoy seguro con la implementación de ScikitLearn, pero aquí hay una implementación rápida de la divergencia de KL en Python:
Salida:
0.775279624079
Puede haber conflictos de implementación en algunas bibliotecas, así que asegúrese de leer sus documentos antes de usarlos.
fuente
0.775279624079
sus entradas y las métricas de sklearn regresan1.3862943611198906
. Confundido todavía! Pero, parece que incluir esas comprobaciones de valor de acuerdo con el qn, en el script debería hacer :)Este truco evita el código condicional y, por lo tanto, puede proporcionar un mejor rendimiento.
fuente
Considere las tres siguientes muestras de una (s) distribución (es).
Claramente, los valores1 y los valores2 están más cerca, por lo que esperamos que la medida de la
surprise
entropía sea menor en comparación con los valores3.Vemos el siguiente resultado:
Vemos que esto tiene sentido porque los valores entre los valores 1 y los valores 3 y los valores 2 y los valores 3 son simplemente más drásticos en el cambio que los valores 1 a los valores 2. Esta es mi validación para comprender KL-D y los paquetes que se pueden aprovechar para ello.
fuente