Saltar al contenido

Calcule la función de distribución acumulativa (CDF) en Python

Basta ya de buscar en otras páginas porque has llegado al espacio perfecto, tenemos la respuesta que buscas y sin liarte.

Solución:

(Es posible que mi interpretación de la pregunta sea incorrecta. Si la pregunta es cómo pasar de un PDF discreto a un CDF discreto, entonces np.cumsum dividido por una constante adecuada servirá si las muestras están equiespaciadas. Si el array no está equiespaciado, entonces np.cumsum de El array multiplicado por las distancias entre los puntos servirá.)

Si tienes un discreto array de muestras, y le gustaría saber el CDF de la muestra, entonces puede simplemente ordenar el array. Si observa el resultado ordenado, se dará cuenta de que el valor más pequeño representa el 0 % y el valor más grande representa el 100 %. Si quieres saber el valor al 50 % de la distribución, solo mira el array elemento que está en el medio de la ordenada array.

Echemos un vistazo más de cerca a esto con un ejemplo simple:

import matplotlib.pyplot as plt
import numpy as np

# create some randomly ddistributed data:
data = np.random.randn(10000)

# sort the data:
data_sorted = np.sort(data)

# calculate the proportional values of samples
p = 1. * np.arange(len(data)) / (len(data) - 1)

# plot the sorted data:
fig = plt.figure()
ax1 = fig.add_subplot(121)
ax1.plot(p, data_sorted)
ax1.set_xlabel('$p$')
ax1.set_ylabel('$x$')

ax2 = fig.add_subplot(122)
ax2.plot(data_sorted, p)
ax2.set_xlabel('$x$')
ax2.set_ylabel('$p$')

Esto da la siguiente gráfica donde la gráfica del lado derecho es la función de distribución acumulativa tradicional. Debería reflejar la CDF del proceso detrás de los puntos, pero, naturalmente, no es tan largo como el número de puntos es finito.

función de distribución acumulativa

Esta función es fácil de invertir y depende de su aplicación qué formulario necesita.

Suponiendo que sabe cómo se distribuyen sus datos (es decir, conoce el pdf de sus datos), entonces scipy admite datos discretos al calcular cdf

import numpy as np
import scipy
import matplotlib.pyplot as plt
import seaborn as sns

x = np.random.randn(10000) # generate samples from normal distribution (discrete data)
norm_cdf = scipy.stats.norm.cdf(x) # calculate the cdf - also discrete

# plot the cdf
sns.lineplot(x=x, y=norm_cdf)
plt.show()

ingrese la descripción de la imagen aquí

Incluso podemos imprimir los primeros valores de la cdf para mostrar que son discretos

print(norm_cdf[:10])
>>> array([0.39216484, 0.09554546, 0.71268696, 0.5007396 , 0.76484329,
       0.37920836, 0.86010018, 0.9191937 , 0.46374527, 0.4576634 ])

El mismo método para calcular el cdf también funciona para múltiples dimensiones: usamos los datos 2d a continuación para ilustrar

mu = np.zeros(2) # mean vector
cov = np.array([[1,0.6],[0.6,1]]) # covariance matrix
# generate 2d normally distributed samples using 0 mean and the covariance matrix above
x = np.random.multivariate_normal(mean=mu, cov=cov, size=1000) # 1000 samples
norm_cdf = scipy.stats.norm.cdf(x)
print(norm_cdf.shape)
>>> (1000, 2)

En los ejemplos anteriores, tenía conocimiento previo de que mis datos se distribuían normalmente, por lo que usé scipy.stats.norm() – Hay múltiples distribuciones compatibles con scipy. Pero nuevamente, necesita saber cómo se distribuyen sus datos de antemano para usar tales funciones. Si no sabe cómo se distribuyen sus datos y solo usa cualquier distribución para calcular la cdf, lo más probable es que obtenga resultados incorrectos.

Comentarios y puntuaciones del tutorial

Si posees alguna sospecha y capacidad de aclararse nuestro ensayo te invitamos ejecutar una acotación y con deseo lo ojearemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *