No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

¿Cómo estimar una distribución?

10/17
Recursos

Aportes 51

Preguntas 10

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

<h4>Estimación Paramétrica</h4>

Se basa realizar el cálculo de una distribución teórica, cuyos parámetros se basan en la información o en el conjunto de datos con el que estamos trabajando. En el ejemplo en clase, primero se calcula un conjunto de datos aleatorios, que sigue a una distribución normal, cuya media será 50 y el desvío estandar será de 5. Esto se genera a partir de la siguiente línea de código:

sample = normal(loc = 50, scale = 5, size = 1000) #Donde loc es la media y scale el desvío estandar

Si graficamos el resultado, veremos algo como lo expuesto en la siguiente imagen, la cual tiene una forma de distribución normal:

El siguiente paso es calcular una función teórica que se ajuste al conjunto de datos. En este caso se conoce la media y el desvío porque los colocamos nosotros para realizar la simulación, pero en una situación real, se debe calcular la media y el desvío tal como lo hizo el profe, y esto se ve en la siguiente línea de código:

mu = sample.mean()
sigma = sample.std()

Con estos valores, se crea una instancia de un objeto cuyos parámetros son precisamente mu y sigma. Es decir, tenemos la base para aplicar la fórmula de la función de distribución Gauseana, pero nos fatan los valores sobre los cuales vamos a calcular esas probabilidades. Entonces primero se crea el objeto y luego se genera un array cuyo rango va a variar entre los extremos de los datos reales y calculamos las probabilidades. Todo esto se ejecuta en las siguientes líneas de código:

dist = norm(mu, sigma)
values = [value for value in range(30,70)]
probabilidades = [dist.pdf(value) for value in values]

Si graficamos ahora solo la función teórica nos queda lo siguiente:

Finalmente, graficamos los datos y la curva teórica calculada y observamos que se asemejan.

<h4>Estimación No Paramétrica</h4>

Este proceso se aplica cuando los datos no se ajustan a una distribución conocida. Entonces no forzamos ajustar los datos a una única distribución, sino a un conjunto de distribuciones.
En este ejemplo, el profe utiliza un método que ya viene incluído dentro de la librería de ScikitLearn, el cual se llama Kernel Density Estimation. Para ello, primero se simulan dos conjuntos de datos a través de dos funciones normales y se juntan en luego en una sola variable a través del método hstack(). Esto lo vemos en las siguientes líneas del código:

sample1 = normal(loc = 20, scale = 5, size = 300)
sample2 = normal(loc = 40, scale = 5, size = 700)
sample = hstack((sample1, sample2))

El resultado lo vemos en la siguiente imagen:

Luego, una vez que tenemos los datos simulados, comienza el proceso de estimación, para ello se crea un objeto modelo, el cual se instancia a través de los parámetros bandwidth (parámetro de suavizado) y kernel (funciones de distribución que se usan para la estimación). Esto es equivalente al método anterior, donde teníamos la función normal teórica, y luego calculábamos las probabilidades, solo que ahora no tenemos solo una función de densidad de probabilidad, sino un conjunto de distribuciones. Una vez creado el objeto, se ajustan los datos a las necesidades del objeto, para esto se utiliza el método reshape, el cual los ordena en una matriz de 1000 filas y 1 columna y luego se ajusta el modelo a estos datos. Esto se hace con las siguientes líneas de codigo:

model = KernelDensity(bandwidth = 2, kernel = 'gaussian')
sample = sample.reshape((len(sample), 1))
model.fit(sample)

Ahora, como dije antes, estamos ajustando el modelo a los datos, es como si estuvieramos calculando la media y el desvío estandar de una distribución normal pero nos faltan calcular los promodios para darle forma a la función teórica. Esto es lo que hacemos a continuación, se crea un array en el rango de los datos reales sobre cuales queremos estimar la función, y luego calculamos las probabilidades. Esto se hace en las siguientes líneas del código. Una aclaración, el cálculo de forma logarítimica tiene que ver con la complejidad algorítmica, es una cuestión de eficiencia. Luego a través de función inversa, la exponencial, obtenemos las probabilidades.

values = np.asarray([value for value in range(1, 60)])
values = values.reshape((len(values), 1))
probabilities = model.score_samples(values) #probabilidad logarítmica para facilitar los calculos
probabilities = np.exp(probabilities)  # inversión de probabilidad obtenemos el valor original

Esto nos devuelve la siguiente curva:

La cual, en conjunto con los datos finalmente queda de la siguiente forma:

Espero que les sirva, me costó un poco entenderlo al principio, hasta que dí con la tecla. Saludos!

La estimacion paramétrica consiste en suponer una función para la distribución y ajustar los parámetros de los datos a dicha distribución. Por otro lado, la estimación no paramétrica se aplica cuando los datos no se ajustan a ninguna distribución conocida.

Profundizando en np.reshape

Nos sirve para separar la lista, y esto es importante para la grafica, ya que si los tenemos juntos, solo nos va a imprimir 1 barra
El primer argumento es la cantidad de grupos o listas en la que vamos a dividir, el segundo argumento nos indica cuantos elementos por lista
Graficando el array a, ósea sin hacer reshape

Graficando el array b, ósea después del reshape
Hay 10 columnas, si ya se que parecen más, pero recordemos, que son 20 elementos, agrupados en 10 columnas

Entre otras variantes, también podemos llamarlo por np.array, y de primer parámetro hacemos referencia a la lista, y dentro del paréntesis la forma en como lo queremos ordenar.
Hay una función para dejar que numpy lo ordene de la forma que el considere más pertinente y es usando el -1, definimos 2 listas y numpy automáticamente sabe que cada una debe tener 10 elementos.
En caso de invertirlo (-1,2) serían 10 listas de 2 elementos

lo mejor que escuche, importo de numpy una vaina que se llama.
me identifico tal cual con su jerga

Uffff este curso tiene mi cerebro a mil por hora!!!

Este curso está definitivamente mal ubicado en la ruta de ciencia de datos. Se requiere un conocimiento previo de un millón de cosas que el profesor pasa por alto asumiendo que ya las conocemos.

No entendí ni papa esta clase…

aun me falta mejorarlo pero allí voy a implementar lo que resta:

me costo un poco esta clase

Por si a alguien le sirve de ayuda, dejo mis apuntes!

Creo que vendría genial un expert session para esta clase y que se incluya al curso.

Estimaciones

Paramétrica: Forzar los parametros de la distribución. ref
No parametrica: Combinación de varias distribuciones. sec

Hasta acá ya he reafirmado que lo mío son los datos, nunca pararé de aprender hasta ser el mejor en ellos.

Como estimar una Distribucion?

La filosofia del Machine Learning es ajustar una distribucion a un conjunto de datos para que con dicha distribucion podamos hacer predicciones

Tenemos dos tipos de estimaciones:

  • Estimacion Parametrica: Se basa en forzar los parametros de la distribucion para ajustarla a la distribucion de los datos en estudio
  • Estimacion no Parametrica: no se fuerzan los parametros de una distribucion unica, sino que se hace una combinacion de varias distribuciones. Depende de otros parametros con el parametro de suavizado y el tipo de funcion base utilizado para el ajuste

El Machine Learning y en general en todo modelo que se haga sobre un conjunto de datos, consiste en que siempre estas intentando ajustar una densidad de probabilidad a un conjunto de datos real

Estas clases no tienen desperdicio!!

Vaya si que esta clase fue bastante pesada en cuanto a la información.

Algo importante para este tema es el Teorema del limite centra, lo vi en el curso de pensamiento probabilístico del profe David Aroesti. Ahora tiene mucho mas sentido de donde salían las distribuciones extrañas que presentaba como ejemplo.

Muy buena explicación.

Deberían hacer un curso completo para esta clase 😛

Nota:
Podemos ajustar diversos tipos de distribución como la composisción de otras más sencillas (usamos el módulo Kernel Densisty de scikitLearn cuyos hiper-parámetros son el suavisado y la función base)

Explicación de la estimación No Paramétrica

Grafica de todas las bases de estimación

Este curso me ha sido difícil, pero lo he apoyado mucho con Chatgpt y me ha ayudado mucho para entender varios temas, recomiendo mucho que trabajen de la mano haciéndole preguntas.

jajajajajaj no entiendo nada jajajaj

A estas alturas, ya solo paso las clases para terminar el curso. De acuerdo con que está mal ubicado en la ruta de aprendizaje y que se debe de tener varios cursos previos de matemáticas, estadística, probabilidad (estos últimos básicos y con práctica), cálculo entender las áreas bajo la curva y uso de las librerías de scikit básico y práctico.

Dejare esto aqui.

import numpy as np
from matplotlib import pyplot
from numpy.random import normal
from scipy.stats import norm
from numpy import hstack
from sklearn.neighbors import KernelDensity

# sample = normal(size= 10000) #generador
# pyplot.hist(sample, bins = 30)
# pyplot.show()

if __name__ == '__main__':
    #Estimacion parametrica
    sample = normal(loc=50, scale=5, size=10000) # #mu = 50, sigma = 5
    mu = sample.mean()
    sigma = sample.std()
    dist = norm(mu,sigma)
    values = [value for value in range(30,70)]
    probabilidades = [dist.pdf(value) for value in values]
    pyplot.hist(sample, bins =30, density=True)
    pyplot.plot(values,probabilidades)
    #pyplot.show()

    #estimacion no parametrica
    #construimos una distribucion bimodal
    sample1 = normal(loc=20, scale=5, size=300)
    sample2 = normal(loc=40, scale=5, size=700)
    sample= hstack((sample1,sample2))

    #model = KernelDensity(bandwith=2,  kernel='gaussian')
    model = KernelDensity(bandwidth=2, kernel='gaussian')
    sample = sample.reshape(len(sample),1)
    model.fit(sample)

    values = np.asarray([value for value in range(1,60)])
    values = values.reshape(len(values), 1)
    probabilidades = model.score_samples(values) # probabilidad logaritmica
    probabilidades = np.exp(probabilidades) # inversion de probabilidad

    pyplot.hist(sample, bins=50, density=True)
    pyplot.plot(values, probabilidades)
    pyplot.show()
    

Buen Modulo

Excelente esta clase

Explicación de la estimación Paramétrica

Les comparto esta herramienta online que permite entender las distribuciones de probabilidad continuas y discretas, con sus definiciones y permite jugar con ella. También te permite encontrar la mejor distribución de probabilidad para un conjunto de datos phitter.io

Existen varios métodos para estimar una distribución de probabilidad a partir de un conjunto de datos. Algunos de los métodos más comunes incluyen:

  • Método de momentos: Este método estima los parámetros de una distribución utilizando los momentos de los datos. Los momentos son funciones matemáticas que describen las propiedades estadísticas de un conjunto de datos. Los parámetros de una distribución pueden estimarse utilizando los primeros k momentos de los datos.

  • Método de máxima verosimilitud: Este método estima los parámetros de una distribución utilizando la probabilidad de los datos. El objetivo es encontrar los valores de los parámetros que maximizan la probabilidad de los datos dado esos parámetros.

  • Método de histogramas: Este método estima una distribución discreta mediante la creación de un histograma de los datos. Un histograma es un gráfico que muestra la frecuencia de ocurrencia de cada valor en el conjunto de datos.

  • Método de Kernel Density Estimation (KDE): Este método es una técnica no paramétrica para estimar la función de densidad de probabilidad a partir de un conjunto de datos.

  • Cada método tiene sus propias ventajas y desventajas, y el método apropiado dependerá del conjunto de datos y del problema específico. Es importante también mencionar que algunos metodos son más adecuados para distribuciones continuas y otros para discretas.

Tuve que ver la clase 3 veces para entender, no porque el profesor Pacho (Con todo respeto) expique mal, sino que son conceptos totalmente nuevos para mi.
.
Hice pausas y googleaba todo lo que no entendía, Sin duda una gran clase con mucho para absorver ✨👾

sigo sin entender cual es la aplicacion de la vida real de todo esto? creo que este curso esta mal ubicado (yo estoy en escuela de analisis de datos y siento que se me fue muy lejos a machine learning)

Muy interesante, no me había topado con esto antes

Tengo una duda
Porque en la estimación paramétrica, le damos el promedio y la desviación estándar para generar los valores

sample = normal(loc = 50, scale = 5, size = 100000)  # mu = 50, sigma = 5

Y después sacamos otra vez el promedio y la desviación estándar sobre los valores ya generados?

mu = sample.mean()
sigma = sample.std()

Vale que se que es como en la clase pasada, pero no acabo de entenderlo del todo

Si alguien me pudiera ayudar se los agradecería mucho

Para ajustar una distribución a tus datos, el **Estimador de Densidad Kernel (KDE)** es una técnica no paramétrica que suaviza los datos, permitiéndote ver patrones ocultos sin asumir una forma de distribución fija, ¡ideal para datos que no siguen distribuciones clásicas como la normal!
No tengo experiencia, pero asumo que habrán casos donde convendrá separar los datos por tramos y de esa manera usar bandwith y kernel diferentes, para obtener mayor probablidad de éxito en las estimaciones.
Dejo aqui mi aporte para profundizar en el concepto de kernels <https://jakevdp.github.io/blog/2013/12/01/kernel-density-estimation/>
¿Disculpe cuál es la respuesta correcta a esta pregunta del examen final? **En el método de estimación paramétrica de una distribución de probabilidad:**

Me parece interesante el uso de estimacion para una distribucion de datos. Esto sera util para mis conocimientos de machine learning.

Use los datos de partidos de NBA con la variable puntos de local: `import pandas as pd` `import matplotlib.pyplot as plt` `from scipy.stats import norm` `#Vamos a usar los partidos de NBA para suponer que los punto por artido se distribuyen como una normal` `df= pd.read_csv('06_games.csv', sep=',')` `plt.hist(df.PTS_home)` `plt.show()` `#ahora hacemos una VA normal con mu=df.PTS_home.mean() y sigma=df.PTS_home.std()` `sigma=df.PTS_home.std()` `mu=df.PTS_home.mean()` `#Creamos la VA:` `dist = norm(mu, sigma)` `#Creamos una lista de valores para x entre 50 y 160 puntos:` `values = [value for value in range(50, 160)]` `probabilidades = [dist.pdf(value) for value in values]` `#Hagamos el grafico para comparar los valores reales vs. los obtenidos apartir de la distribucion:` `plt.hist(df.PTS_home, bins=30, density=True) #Density es para normalizar el eje y de 0 a 1` `plt.plot(values, probabilidades) #Valores obtenidos desde la VA normal con mu=df.mean y sigma= df.std` `plt.show()` Y el resultado: ![](https://static.platzi.com/media/user_upload/image-ef58e6d1-3f0a-42c3-b1f6-7308f7855ecd.jpg)
**Quiza no entendiste esta linea de codigo como yo:** probabilidades = \[dist.pdf(value) for value in values] La línea de código `probabilidades = [dist.pdf(value) for value in values]` crea una lista de probabilidades a partir de una distribución de probabilidad y un conjunto de valores. La función `pdf()` de la distribución de probabilidad `dist` calcula la probabilidad de que una variable aleatoria tome un valor específico. En este caso, la variable aleatoria es `value`. El bucle `for` itera sobre el conjunto de valores `values` y llama a la función `pdf()` para cada valor. Los resultados de la función `pdf()` se almacenan en una lista llamada `probabilidades`. Por ejemplo, si la distribución de probabilidad `dist` es una distribución normal con una media de 10 y una desviación estándar de 2, y el conjunto de valores `values` es `[11, 12, 13, 14]`, entonces la línea de código anterior generará la siguiente lista de probabilidades: \[0.15865525393145727, 0.06680726599463562, 0.022750131948859037, 0.005792357219393924] Esta lista de probabilidades indica que hay un 15.86% de probabilidad de que la variable aleatoria tome el valor 11, un 6.68% de probabilidad de que tome el valor 12, y así sucesivamente. En resumen, la línea de código `probabilidades = [dist.pdf(value) for value in values]` crea una lista de probabilidades a partir de una distribución de probabilidad y un conjunto de valores.
El fenómeno de "underflow" (subdesbordamiento) en el contexto de la creación de modelos de Machine Learning se refiere a un problema numérico que ocurre cuando se realizan cálculos con números muy pequeños y cercanos a cero en una computadora, lo que puede llevar a la pérdida de precisión.

🤔¿Por qué la lista de values en la estimación paramétrica debe ser dentro de un rango de números entre 30 y 70?

.
Esa fue una de las dudas me surgieron cuando el profesor escribió la línea:

values = [value for value in range(30, 70, 1)]

Esos números que parecen elegidos de forma arbitraria en realidad corresponden a los valores mínimo y máximo (sino son igual se aproximan) que están dentro del array sample generado con la función normal(loc=50, scale=5, size=10000)
.
Para comprobarlo solo es cuestión de correr la siguiente línea de código:

print(f"min={sample.min()}, max ={sample.max()}")

Si no se obtiene 30 y 70 si veremos datos muy cercanos a estos valores.
.
Ahora bien 🤔 ¿Por qué tienen que ser los valores mínimo y máximo de nuestros datos?
.
Esto se debe a que necesitamos de un intervalo de datos similar al de los datos originales, en el ejemplo de clase es samples para poder calcular la densidad de probabilidad de cada valor único.
.

Lo anterior lo pueden corroborar en el minuto 15 de la clase anterior
.
Espero este aporte les haya sido de ayuda
.
Made with 💜 by Paho

Dónde están los recursos que mencionan en el video?

Con esta clase todo ha quedado super claro. El profe lo explica muy bien.

me alegra no ser el unico. esta clase me genero frustracion jejeje.

Debo aceptar que me está costando bastante este curso

En pocas palabras el reshape lo que hace es convertir ese array del sample original que es un vector de una dimensión en una matriz, en este caso de 100 filas y 1 columna

Excelente clase.

Opinión personal, sigo pensando que los cursos y el orden en el que están es para gente que ya tiene experiencia o conocimientos en al menos matemáticas, programación y relacionados. Para los que estamos desde 0 es un dolor de cabeza todo esto, me tuve que leer un libro entero de probabilidad , buscar todo el tema de graficación de datos a parte y el tema de las librerias es demasiada información sin un paso a paso. Obviamente no es para quejarme si no para mejorarlo no somos todos estudiantes de univerisdad como se que es la mayoría de los que estudian en platzy, es muy frustrante invertir días de investigación por cada clase Si alguien tiene una recomendación para hacer el prroceso más ácil se lo agradezco