stats density cumulative python numpy histogram

python - density - ¿Cómo obtener la función de distribución acumulativa con NumPy?



norm.cdf python (5)

El uso de un histograma es una solución, pero implica compartir los datos. Esto no es necesario para trazar un CDF de datos empíricos. Dejemos que F(x) sea ​​la cuenta de cuántas entradas son menores que x luego aumenta en una, exactamente donde vemos una medida. Por lo tanto, si clasificamos nuestras muestras, en cada punto incrementamos el recuento en uno (o la fracción en 1 / N) y trazamos uno contra el otro, veremos la CDF empírica "exacta" (es decir, sin intervalos).

Un ejemplo de código siguiente demuestra el método

import numpy as np import matplotlib.pyplot as plt N = 100 Z = np.random.normal(size = N) # method 1 H,X1 = np.histogram( Z, bins = 10, normed = True ) dx = X1[1] - X1[0] F1 = np.cumsum(H)*dx #method 2 X2 = np.sort(Z) F2 = np.array(range(N))/float(N) plt.plot(X1[1:], F1) plt.plot(X2, F2) plt.show()

Produce los siguientes

Quiero crear un CDF con NumPy, mi código es el siguiente:

histo = np.zeros(4096, dtype = np.int32) for x in range(0, width): for y in range(0, height): histo[data[x][y]] += 1 q = 0 cdf = list() for i in histo: q = q + i cdf.append(q)

Estoy caminando por la matriz pero llevo mucho tiempo la ejecución del programa. Hay una función construida con esta característica, ¿no?


No estoy realmente seguro de lo que hace su código, pero si tiene matrices hist y bin_edges devueltas por numpy.histogram , puede usar numpy.cumsum para generar una suma acumulativa del contenido del histograma.

>>> import numpy as np >>> hist, bin_edges = np.histogram(np.random.randint(0,10,100), normed=True) >>> bin_edges array([ 0. , 0.9, 1.8, 2.7, 3.6, 4.5, 5.4, 6.3, 7.2, 8.1, 9. ]) >>> hist array([ 0.14444444, 0.11111111, 0.11111111, 0.1 , 0.1 , 0.14444444, 0.14444444, 0.08888889, 0.03333333, 0.13333333]) >>> np.cumsum(hist) array([ 0.14444444, 0.25555556, 0.36666667, 0.46666667, 0.56666667, 0.71111111, 0.85555556, 0.94444444, 0.97777778, 1.11111111])


No estoy seguro de si hay una respuesta preparada, lo que hay que hacer exactamente es definir una función como:

def _cdf(x,data): return(sum(x>data))

Esto será bastante rápido.


Para complementar la solución de Dan. En el caso de que haya varios valores idénticos en su muestra, puede usar numpy.unique:

Z = np.array([1,1,1,2,2,4,5,6,6,6,7,8,8]) X, F = np.unique(Z, return_index=True) F=F/X.size plt.plot(X, F)


actualización para numpy versión 1.9.0. La respuesta de user545424 no funciona en 1.9.0. Esto funciona:

>>> import numpy as np >>> arr = np.random.randint(0,10,100) >>> hist, bin_edges = np.histogram(arr, density=True) >>> hist = array([ 0.16666667, 0.15555556, 0.15555556, 0.05555556, 0.08888889, 0.08888889, 0.07777778, 0.04444444, 0.18888889, 0.08888889]) >>> hist array([ 0.1 , 0.11111111, 0.11111111, 0.08888889, 0.08888889, 0.15555556, 0.11111111, 0.13333333, 0.1 , 0.11111111]) >>> bin_edges array([ 0. , 0.9, 1.8, 2.7, 3.6, 4.5, 5.4, 6.3, 7.2, 8.1, 9. ]) >>> np.diff(bin_edges) array([ 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9]) >>> np.diff(bin_edges)*hist array([ 0.09, 0.1 , 0.1 , 0.08, 0.08, 0.14, 0.1 , 0.12, 0.09, 0.1 ]) >>> cdf = np.cumsum(hist*np.diff(bin_edges)) >>> cdf array([ 0.15, 0.29, 0.43, 0.48, 0.56, 0.64, 0.71, 0.75, 0.92, 1. ]) >>>