Te doy la bienvenida al último paso de este curso de probabilidad para ciencia de datos. Es momento de que pongas a prueba todo lo que has aprendido.
Completa los ejercicios que se proponen en cada una de las notebooks de Colab de diferentes temas cada una. Recuerda compartir tus resultados o dudas en los comentarios para que entre todos podamos apoyarnos.
Tipos de probabilidad
Los diferentes tipos de probabilidades que existen con frecuencia generan algo de confusión, estos ejercicios te permitirán fortalecer el entendimiento de estos conceptos:
Luego de que entendemos que hay diferentes tipos de probabilidades, el concepto de distribución de probabilidad nos dice que podemos usar funciones matemáticas para mapear cada ocurrencia posible de una variable aleatoria a un número que es la probabilidad de esa ocurrencia.
En este conjunto de retos exploramos más a fondo el cálculo con distribuciones discretas, especialmente la binomial:
Uno de los métodos más importantes para estimar densidades de probabilidad es el MLE (Maximum Likelihood Estimation), del cual podrás profundizar en este reto:
Finalmente, encontrarás en la siguiente notebook un ejemplo donde se profundiza el desarrollo de un clasificador de Naive Bayes. Aquí verás por qué es importante el uso de distribuciones iniciales para ajustar las verosimilitudes con el fin de poder aplicar tus modelos a datos que no estaban en el dataset original de entrenamiento:
Ahora que tienes claros estos conceptos, a través del desarrollo de estos retos, espero que hayas disfrutado del curso y que con esto tengas toda la motivación para continuar con lo que sigue en temas de matemáticas, machine learning y ciencias de datos en general. Nos vemos en la próxima. ¡Nunca pares de aprender! 💚
Creo que estaría genial tener un solucionario oficial. Gracias!
Mis Resultados de la primera parte, por favor corregían si me equivoco ;)
Tipos de probabilidad
I) Ejercicios (bloque 1)
P(A|B) = 1/3
P(A|C) = 0/3 = 0
P(B|C) = 0/3 = 0
II) Ejercicios (bloque 2)
P(A|B) = 3/6 = 1/2
P(A|B) = 3/6 = 1/2
P(A|B) = 2/6 = 1/3
III) Ejercicios (bloque 3)
P(m_1=Cara, m_2=Sello) = 1/4
P(m_1 = Cara| m_2 = Sello) = 1/2
P(m_2 = Sello) = 2/4 = 1/2
Llegué a los mismos resultados que tú :)
pero en esa hiciste la probabilidad conjunta y no la condicional no?
AAAAAAH hubiera amado tener estos retos durante los bloques y no hasta el final, me desespere porque casi no entendí nada. Pero con estos todo es mucho mas claro solo es repasar brevemente las clases y todo es mas fluido :)
Estoy tratando de comprender el ejercicio de MLE de tu código, pero me sale este error:
---------------------------------------------------------------------------TypeErrorTraceback(most recent call last)<ipython-input-49-1bcbb2f424cb>in<module>()---->1print(optimal_mu(), arr.mean())2#print(optimal_sigma(), arr.std())<ipython-input-47-03d3c88fa364>inoptimal_mu(arr)53 mu =054for i inarr:--->55 mu += i
56return mu/len(arr)57TypeError: unsupported operand type(s)for+=:'int' and 'str'
ya converti las variables a float, pero continua saliendo, ¿que podrá ser?
Gracias
Hola Rafa, a mi tambien me arrojaba el error, y radicaba en que al tomar los datos del arr, estaba tomando el header de la serie, entonces arregle el for en el codigo de las funciones creadas:
for i in arr['Normally Distributed Housefly Wing Lengths']:
Espero le sirva
Con respecto a las lecturas 9-10, en los primeros ejercicios las respuestas son las siguientes:
1.P(x=4)=0, muchos creerán que la respuesta sería el output de la función norm(4,0.1).pdf(4), la cual es 3.98, lo cual es falso, ya que ninguna probabilidad puede ser mayor a 1, lo que nos da esta función es el valor que toma la función de densidad, y al tratarse de una distribución de probabilidad continua, cuando se usa un número específico, la probabilidad es 0, dada la siguiente explicación los resultados siguientes son:
2.P(x=-10)=0
3.P(x=10)
4.P(x<=4)=0.5, esta al contrario de las anteriores, sí se resuelve con la función de distribución acumulada, la cual es norm(4,0.1).cdf(4)
5.P(x>=4)=0.5 y se resuelve de la siguiente forma: 1-norm(4,0.1).cdf(4)
Con respecto al siguiente ejercicio, es un poco más complicado.
La forma en que yo lo resolví, es editando la función generate_binomial_trials para que nos retorne el arreglo, que utiliza para generar el histograma, de la siguiente forma:
Posteriormente, esta lista la convierto a un arreglo de numpy para poder extraer la media y desviación estándar con el atributo .mean() y .std():
arr = np.array(arr)mu = arr.mean()sigma = arr.std()dist =norm(mu, sigma)x = np.arange(25,75,0.1)y =[dist.pdf(value)for value in x]
#distribución teórica
plt.plot(x, y)
# datos
values, dist = np.unique(arr, return_counts=True)plt.bar(values, dist/len(arr))plt.show()
Gracias!! Me trabé porque tomé mal los datos en un principio y no me ajustaba la curva, gracias a tu código, encontré donde estaba fallando! Mil gracias!
Gracias, mi hermano me había hecho un 8, tu código me ayudo muchísimo
Bloque 2
P(A|B) sabiendo que el jugador 2 elige B = {$2,4,6,8,10,12$}
Primero delimitamos el espacio marcado por B ya que esta es la condición. {2,4,6,8,10,12} (6 elementos)
Luego consideramos los puntos de intersección entre ambos jugadores. Tenemos 3 números de intersección {2,4,6}. Por lo tanto:
P(A|B)= 3/6 = 1/2
P(A|B) sabiendo que el jugador 2 elige B = {1,3,5,7,9,11}
El espacio se delimita por B y tenemos 6 elementos.
Los puntos de intersección son: {1,3,5}
P(A|B)= 3/6 = 1/2
P(A|B) sabiendo que el jugador 2 elige B = {5,6,7,8,9,10}
El espacio se delimita por B con 6 elementos.
Los puntos de intersección son : {5,6}. Solo 2. Por lo tanto
P(A|B)= 2/6 = 1/3
Gracias, tus aportes me han ayudado a entender en que estaba mal a la hora de resolver los ejercicios
Ejercicios (bloque 1)
P(A|B)= 1/3
P(A|C)= 0
P(B|C)= 0
Ejercicios (bloque 2)
P(A|B) sabiendo que el jugador 2 elige B = { 2,4,6,8,10,12 } = 1/2
P(A|B) sabiendo que el jugador 2 elige B = { 1,3,5,7,9,11 } = 1/2
P(A|B) sabiendo que el jugador 2 elige B = { 5,6,7,8,9,10 } = 1/3
Ejercicios (bloque 3)
P(m1=cara,m2=sello) = 1/4
P(m1=cara|m2=sello) = 1/2
P(m2=sello) = 1/2
Ejercicios (bloque 1)
Probabilidad de obtener 3 caras a partir de 12 lanzamientos de moneda. 0.053 , 0.2397
Probabilidad de obtener 5 o menos caras a partir de 10 lanzamientos de moneda. 0.387 , 0.882
Probabilidad de obtener menos de 6 caras a partir de 10 lanzamientos de moneda. 0.387 , 0.882
0.0537 y 0.2397
2 y 3. 0.6230 y 0.95265
use esta calculadora
Sé que el profe es excelente pero me voy entendiendo solo la mitad del curso jaja
En las distribuciones (bloque 2) he resuelto de la siguiente forma:
import numpy as np
from numpy.randomimport binomial
import matplotlib.pyplotas plt
def generate_binomial_trials(trials=1000, coin_toss=100):'''
el resultado de esta funcion es generar un conjuntos
de experimentos binomiales(trials) y de cada uno obtener
las cantidades de exitos en cada secuencia(e.j.lanzar monedas).* trial: es una secuencia de <coin_toss> lanzamientos de moneda
* coin_toss: es el numero de monedas lanzadas en cada trial
'''
arr =[]for _ inrange(trials): arr.append(binomial(coin_toss,0.5)) values, dist = np.unique(arr, return_counts=True)return values, dist, arr #retornamos también arr
values, dist, arr =generate_binomial_trials(100000) #generamos arr con la función
plt.bar(values, dist)#Para estimar la distibucion normal
arr = np.array(arr)mu = arr.mean()sigma = arr.std()
#distinguimos esta distibucion de la generada en la funcion inicial
distr_estim =norm(mu, sigma)x = np.arange(25,75,0.1)y =[distr_estim.pdf(value)for value in x] #generamos el eje y sobre la distibucion estimada(dist_estim), no sobre la original(dist)
#representamos la distibucion normal estimada
plt.plot(x,y,'g')
#con lo siguiente representamos la distibucion inicial del experimento
plt.bar(values, dist/len(arr))```
Gracias! No había comprendido que "arr" era una lista y que había que convertirla con numpy!
Por qué definiste así sigma? y por que no da el mismo valor cuando usas values.std()
Saludos.
Es debido a que los valores son ponderados, si utilizamos sigma = values.std() estaríamos ignorando los pesos asociados y por ende sería un cálculo incorrecto.
Lo definí de esa manera porque no encontré una manera de calcular en pandas la desviación de una variable ponderada, a diferencia del np.avergae que sí lo tiene (el param weights permite pasar estos pesos).
El código de ejemplo en el segundo reto, en el ciclo for toca cambiar la i por una n, al llamar la función
Tipos de probabilidad
Muy buena solucion, lo unico es que no usaste F string.
def bloque1(list1, list2, caso): matches =[item for item in list1 if item in list2]print(f'La probabilidad del caso {caso} es de {len(matches)} / {len(list1)}')returnlen(matches)/len(list1)list1 =[1,2,3,4,5,6]list2 =[5,6,7,8,9]caso ='prueba'print(bloque1(list1, list2, caso))listaA =[1,2,3,4,5,6]listaB1 =[2,4,6,8,10,12]listaB2 =[1,3,5,7,9,10]listaB3 =[5,6,7,8,9,10]caso1 ='caso 1'caso2 ='caso 2'caso3 ='caso 3'print(bloque1(listaA, listaB1, caso1))print(bloque1(listaA, listaB2, caso2))print(bloque1(listaA, listaB3, caso3))
SI la variable X es continua y nos preguntamos por
P(X=x), esto necesiamente deberia ser 0, o estoy equivocado?
lo pregunto porque en los retos aparece que P(X=4)>0
donde X tiene distribucion normal
Hola,
efectivamente, si una variables es contínua no se puede calcular la probabilidad de un evento específico como P(x).
En el reto, cuando dicen P(X=4), se refieren directamente a la probabilidad acumulada es decir la probabilidad de que X sea menor a 4.
Thx, tenia esa misma duda!
Segunda parte :D
Distribuciones de probabilidad
I) Ejercicios (bloque 1)
P(3,12;0.5) = 220*0.5^12 = 0.054
C(5, 10; 0.5) = 0.6221
C(5, 10; 0.5) = 0.6221
El resultado del ejercicio 3 está errado. Se repiten los mismos valores.
En las distribuciones (bloque 2) sin alterar el codigo escrito por el profesor el incoveniente es obtener los datos originales para ello lo resolvi de esta manera:
from scipy.statsimport norm
# obtener los valores originales
arr = np.repeat(values,dist)
# distribucion teorica
mu = arr.mean()sigma = arr.std()dist_t =norm(mu, sigma)x = np.arange(30,70,0.1)y =[dist_t.pdf(value)for value in x]plt.plot(x, y)
# datos
plt.bar(values, dist/len(arr))plt.show()
Justo esa funcion de numpy repeat es lo pensaba que quería que existiese, lo hice con 2 ciclos for. Compañero, eso lo sabías por experiencia o buscaste en una lista de metodos?
Bloque 1
$P(A|B) = ?$
Tomamos en cuenta los posibles resultados de un dado que son {1,2,3,4,5,6}. O sea que si preguntamos ¿Cual es la probabilidad de que caiga 6? P(A)=1/6
Ya que dentro de los 6 posibles resultados solo tenemos 1 seis. Pero la condicion B restinge el espacio muestral a solo los numero pares que son: {2,4,6}. Asi que si preguntamos ¿Cual es la probabilidad de que caiga un 6 dado que tenemos numeros pares?.
P(A|B)= 1/3
Ya que con la nueva delimitacion del espacio muestral por la nueva condición, restringimos nuestros posibles resultados a 3 y dentro de estos resultados solo tenemos 1 seis. El hecho de que ocurriera B aumentó las probabilidades de que ocurriera A. Por lo tanto estos eventos estan positivamente correlacionados.
P(A|C) = ?
En este caso tenemo una probabilidad de que caiga 6 en un espacio muesstral delimitado solo por impares, asi que la probabilidad de que caiga un 6 es nula
$P(B|C) = ?$
Aqui pasa lo mismo que en el anterior. Estos dos ultimos ejemplos son eventos excluyentes pero no independientes, y estan negativamente correlacionados ya que la ocurrencia de C disminuyó la de A.
Mi solución del primer reto:
Bloque I:
P(A|B)=1/3
P(A|C)=0
P(B|C)=0
Bloque II
P(A|B)=1/2
P(A|B)=1/2
P(A|B)=1/3
Bloque III
P(m1=cara,m2=sello) = (1/2)*(1/2) = 1/4
P(m1=cara|m2=sello) = 1/2 (eventos excluyentes)
P(m2=sello) = 1/2
Ejercicios de distribución de probabilidad discreta
Mi solución al bloque 1, con p = 0.5:
Probabilidad de obtener 3 caras a partir de 12 lanzamientos de moneda = 0.053
Probabilidad de obtener 5 o menos caras a partir de 10 lanzamientos de moneda = 0.387
Probabilidad de obtener menos de 6 caras a partir de 10 lanzamientos de moneda = 0.387 (es el mismo problema 2)
Legue a obtener manualmente los mismos resultados que Valentina, sin embargo, me queda la duda en el ejemplo 2 del bloque 1.
¿Porque usando Colab no llego al mismo resultado.en el segundo ejemplo?
Veamos:
En el ejemplo de esta clase “Usando la distribución binomial” obtuvimos el mismo resultado al utilizar Spicy o la formula binomial.
Aqui el codigo para ese ejemplo
Ahora bien, si lo aplicamos para el ejemplo del primer punto del bloque 1 el resultado es correcto, observen a continuación:
"Probabilidad de obtener 3 caras a partir de 12 lanzamientos de moneda"print(my_binomial(3,12,0.5))print('\nProbabilidad usando Spicy')dist =binom(12,0.5)dist.pmf(3)El resultado es
0.0537109375Probabilidad usando Spicy0.05371093749999999
En cambio, en el segundo ejemplo no se obtiene el mismo resultado
" Probabilidad de obtener 5 o menos caras a partir de 12 lanzamientos de moneda."print(my_binomial(5,12,0.5))print('\nProbabilidad usando Spicy')dist =binom(12,0.5)dist.pmf(5)"El resultado que se obtiene es usando la bynomial"0.193359375"Probabilidad usando Spicy"0.19335937499999992
¿Alguien podria explicarme por que la diferencia?
Aquí algunas de mis respuestas. Pero antes, si ven algo mal, porfavor corríjanme, estoy también aprendiendo. :)
Probabilidad de obtener 3 caras a partir de 12 lanzamientos de moneda. = 0.0537
Probabilidad de obtener 5 o menos caras a partir de 10 lanzamientos de moneda. = 0.6221
Probabilidad de obtener menos de 6 caras a partir de 10 lanzamientos de moneda. = 0.6221
Hecho con el código que nos dan en la guía:
import numpy as np
from numpy.randomimportbinomialfrom scipy.statsimportbinomfrom math import factorial
# definición de la distribución binomial
def my_binomial(k, n, p):returnfactorial(n)/(factorial(k)*(factorial(n-k)))*pow(p,k)*pow(1-p, n-k)# Probabilidad de obtener 3 caras a partir de 12 lanzamientos de moneda.print(f' probabilidad de 3 caras con 12 lanzamientos y 0.5 es {my_binomial(3, 12, 0.5)}')print(f' probabilidad de 3 caras con 12 lanzamientos y 0.3 es {my_binomial(3, 12, 0.3)}')# Probabilidad de obtener 5 o menos caras a partir de 10 lanzamientos de moneda.total=0for n inrange(6): total +=my_binomial(n,10,0.5)print(f'La probabilidad de 5 caras o menos con 10 lanzamientos es {total}')total1 =0for n inrange(6): total1 +=my_binomial(n,10,0.3)print(f'La probabilidad de 5 caras o menos con 0.3 y 10 lanzamientos es y {total1}')# Probabilidad de obtener menos de 6 caras a partir de 10 lanzamientos de moneda.total=0for n inrange(6): total +=my_binomial(n,10,0.5)print(f'La probabilidad de menos de 6 caras con 10 lanzamientos es {total}')total1 =0for n inrange(6): total1 +=my_binomial(n,10,0.3)print(f'La probabilidad de menos de 6 caras con 0.3 y 10 lanzamientos es {total1}')
Hola, dejo aquí unos videos que hice como ejemplos sobre Distribución Binomial, por si sirven a alguien:
Ejemplo 1
Ejemplo 2