pylab.hist (datos, normados = 1). La normalización parece funcionar incorrectamente.

Estoy tratando de crear un histogtwig con argumento normado = 1

Por ejemplo:

import pylab data = ([1,1,2,3,3,3,3,3,4,5.1]) pylab.hist(data, normed=1) pylab.show() 

Esperaba que la sum de los contenedores fuera 1. Pero en cambio, uno de los contenedores es más grande que 1. ¿Qué hizo esta normalización? ¿Y cómo crear un histogtwig con tal normalización que la integral del histogtwig sea igual a 1?

introduzca la descripción de la imagen aquí

Vea mi otra publicación para saber cómo hacer que la sum de todos los intervalos en un histogtwig sea igual a uno: https://stackoverflow.com/a/16399202/1542814

Copiar pegar:

 weights = np.ones_like(myarray)/float(len(myarray)) plt.hist(myarray, weights=weights) 

donde myarray contiene tus datos

De acuerdo con la documentación normalizada: Si es Verdadero, el resultado es el valor de la función de densidad de probabilidad en el contenedor, normalizado de tal manera que la integral sobre el rango es 1. Tenga en cuenta que la sum de los valores del histogtwig no será igual a 1 a menos que los intervalos de se elige el ancho de la unidad; No es una función de probabilidad de masa. Esto es de numpy doc, pero debería ser el mismo para pylab.

 In []: data= array([1,1,2,3,3,3,3,3,4,5.1]) In []: counts, bins= histogram(data, normed= True) In []: counts Out[]: array([ 0.488, 0., 0.244, 0., 1.22, 0., 0., 0.244, 0., 0.244]) In []: sum(counts* diff(bins)) Out[]: 0.99999999999999989 

Así que simplemente la normalización se realiza de acuerdo a la documentación como:

 In []: counts, bins= histogram(data, normed= False) In []: counts Out[]: array([2, 0, 1, 0, 5, 0, 0, 1, 0, 1]) In []: counts_n= counts/ sum(counts* diff(bins)) In []: counts_n Out[]: array([ 0.488, 0., 0.244, 0., 1.22 , 0., 0., 0.244, 0., 0.244]) 

Creo que estás confundiendo las alturas de los contenedores con su contenido. Debe agregar el contenido de cada bandeja, es decir, altura * ancho para todas las bandejas. Eso debería = 1.

¿Qué hizo esta normalización?

Para normalizar una secuencia, hay que tener en cuenta el tamaño del contenedor. De acuerdo con la documentación , el número predeterminado de bin es 10. Por consiguiente, el tamaño de bin es (data.max() - data.min() )/10 , que es 0.41. Si está normed=1 , entonces las alturas de la barra son tales que la sum, multiplicada por 0.41, da 1. Esto es lo que sucede cuando se integra.

¿Y cómo crear un histogtwig con tal normalización que la integral del histogtwig sea igual a 1?

Creo que quieres que la sum del histogtwig, no su integral, sea igual a 1. En este caso, la forma más rápida parece ser:

 h = plt.hist(data) norm = sum(data) h2 = [i/norm for i in h[0]] plt.bar(h[1],h2) 

Tuve el mismo problema, y ​​mientras lo resolvía, surgió otro problema: cómo trazar las frecuencias de las bandejas normalizadas como porcentajes con marcas en valores redondeados . Lo estoy publicando aquí en caso de que sea útil para alguien. En mi ejemplo, elegí 10% (0,1) como el valor máximo para el eje y, y 10 pasos (uno del 0% al 1%, uno del 1% al 2%, etc.). El truco consiste en establecer las marcas en los conteos de datos (que son la lista de salida n del plt.hist ) que luego se transformarán en porcentajes usando la clase FuncFormatter . Esto es lo que hice:

 import matplotlib.pyplot as plt from matplotlib.ticker import FuncFormatter fig, ax = plt.subplots() # The required parameters num_steps = 10 max_percentage = 0.1 num_bins = 40 # Calculating the maximum value on the y axis and the yticks max_val = max_percentage * len(data) step_size = max_val / num_steps yticks = [ x * step_size for x in range(0, num_steps+1) ] ax.set_yticks( yticks ) plt.ylim(0, max_val) # Running the histogram method n, bins, patches = plt.hist(data, num_bins) # To plot correct percentages in the y axis to_percentage = lambda y, pos: str(round( ( y / float(len(data)) ) * 100.0, 2)) + '%' plt.gca().yaxis.set_major_formatter(FuncFormatter(to_percentage)) plt.show() 

Parcelas

Antes de la normalización: la unidad del eje y es el número de muestras dentro de los intervalos de bin en el eje x: Antes de la normalización: la unidad del eje y es el número de muestras dentro de los intervalos del contenedor en el eje x

Después de la normalización: la unidad del eje y es la frecuencia de los valores de bin como porcentaje sobre todas las muestras Después de la normalización: la unidad del eje y es la frecuencia de los valores de bin como porcentaje sobre todas las muestras

También hay un análogo en numpy – numpy.historgram : http://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html Uno de los parámetros es “densidad”, si establece density=True , la salida se normalizará.

normado: bool, opcional Esta palabra clave está en desuso en Numpy 1.6 debido a un comportamiento confuso / con errores. Se eliminará en Numpy 2.0. Utilice la palabra clave de densidad en su lugar. Si es False, el resultado contendrá el número de muestras en cada bandeja. Si es Verdadero, el resultado es el valor de la función de densidad de probabilidad en el contenedor, normalizada de tal manera que la integral sobre el rango es 1. Tenga en cuenta que se sabe que este último comportamiento está defectuoso con anchos de contenedor desiguales; usa densidad en su lugar.

densidad: bool, opcional Si es False, el resultado contendrá el número de muestras en cada bandeja. Si es Verdadero, el resultado es el valor de la función de densidad de probabilidad en el bin, normalizado de tal manera que la integral sobre el rango es 1. Tenga en cuenta que la sum de los valores del histogtwig no será igual a 1 a menos que se elijan bandejas de ancho de unidad; No es una función de probabilidad de masa. Anula la palabra clave normada si se da.

Tus expectativas estan equivocadas

La sum de los contenedores de altura multiplicada por su anchura es igual a uno. O, como ha dicho correctamente, la integral debe ser una, no la función sobre la que se está integrando.

Es así: la probabilidad (como en “la probabilidad de que la persona tenga entre 20 y 40 años de edad es …%”) es la integral (“de 20 a 40 años”) sobre la densidad de probabilidad . La altura de los contenedores muestra la densidad de probabilidad, mientras que el ancho por la altura de los intervalos muestra la probabilidad (integra la función supuesta constante, la altura del contenedor, desde el principio del contenedor hasta el final del contenedor) para que un determinado punto esté en este contenedor. La altura en sí es la densidad y no una probabilidad . Es una probabilidad por ancho que puede ser mayor que una por supuesto.

Ejemplo simple: imagine una función de densidad de probabilidad de 0 a 1 que tenga un valor de 0 a 0,9. ¿Cuál podría ser la función entre 0.9 y 1? Si lo integras sobre él, pruébalo. Será más alto que 1.

Btw: de una aproximación aproximada, la sum de la altura por el ancho de tu historial parece dar como resultado 1, ¿no es así?