{"id":22273507,"url":"https://github.com/dfleta/probabilidad-bayes-mia","last_synced_at":"2025-03-25T16:41:52.237Z","repository":{"id":234467053,"uuid":"788949150","full_name":"dfleta/probabilidad-bayes-MIA","owner":"dfleta","description":"Recursos sobre manejo de la incertidumbre y probabilidad por un agente inteligente, módulo de Modelos de Inteligencia Artificial","archived":false,"fork":false,"pushed_at":"2024-04-22T10:07:12.000Z","size":4916,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-04-22T11:27:23.105Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dfleta.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2024-04-19T12:05:09.000Z","updated_at":"2024-04-22T11:27:24.682Z","dependencies_parsed_at":"2024-04-22T11:27:22.974Z","dependency_job_id":null,"html_url":"https://github.com/dfleta/probabilidad-bayes-MIA","commit_stats":null,"previous_names":["dfleta/probabilidad-bayes-mia"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Fprobabilidad-bayes-MIA","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Fprobabilidad-bayes-MIA/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Fprobabilidad-bayes-MIA/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Fprobabilidad-bayes-MIA/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dfleta","download_url":"https://codeload.github.com/dfleta/probabilidad-bayes-MIA/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245501804,"owners_count":20625855,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-03T13:12:57.735Z","updated_at":"2025-03-25T16:41:52.200Z","avatar_url":"https://github.com/dfleta.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"RED DE BAYES\n============\n\nCódigo del curso [CS50’s Introduction to Artificial Intelligence with Python](https://cs50.harvard.edu/ai/2024/), _lecture 2 \"uncertainty\"_, refactorizado a la nueva api de pomegranate v1.0.4 por [jmschrei](https://github.com/jmschrei/pomegranate/issues/1062)\n\n\n## Instalación\n\nEs necesario el uso del paquete [Pomegranate](https://pomegranate.readthedocs.io/en/stable/index.html):\n\n\u003e Pomegranate is a python package which implements fast, efficient, and extremely flexible probabilistic models ranging from probability distributions to Bayesian networks to mixtures of hidden Markov models.\n\n`python -m venv venv`\n\n`source venv/bin/activate`\n\nInstalar la versión estricta de pomegranate `v1.0.4`:\n\n`pip install -r requirements.txt`\n\no\n\n`pip install pomegranate`\n\n## Uso\n\n### Red de Bayes\n\nEl código codifica la siguiente red de Bayes, en el módulo `model.py`:\n\n![Red de Bayes](doc/bayesiannetwork.png \"Red de Bayes ejemplo\")\n\nRain es el nodo raíz de la red. Rain es una variable aleatoria que toma los valores en el dominio atómico `{none, light, heavy}`. Su distribución de probabilidad es:\n\n| none  | light | heavy |\n| :---: | :---: | :---: |\n|  0.7  |  0.2\t|  0.1  |\n\nMaintenance indica si se realiza mantenimiento en la red de transporte, tomando los valores atómicos `{yes, no}`. Rain es el nodo padre de Maintenance, lo que significa que su distribución de probabilidad se ve afectada por por Rain. \n\n| R     | yes | no  |\n| :----:| :-: |:---:|\n| none  | 0.4 | 0.6 |\n| light | 0.2 | 0.8 |\n| heavy | 0.1 | 0.9 |\n\nTrain es la variable que codifica si el tren llega `{on time, delayed}`. Maintenance y Rain son padres de Train, que implica que su distribución de probabilidad está condicionada por la de sus nodos padre:\n\n $$ P(X | Padres(X)) $$\n\n| R     | M   | on time | delayed |\n|:-----:|:---:|:-------:|:-------:|\n| none  | yes | 0.8     | 0.2     |\n| none  | no  | 0.9     | 0.1     |\n| light | yes | 0.6     | 0.4     |\n| light | no  | 0.7     | 0.3     |\n| heavy | yes | 0.4     | 0.6     |\n| heavy | no  | 0.5     | 0.5     |\n\n\nAppointment toma los valores `{attend, miss}`. Es el único nodo padre de Train, indicando que lo que en última instancia afecta a llegar a tiempo a la cita es que el tren llegue puntual o no. Si el tren llega puntual, que llueva de manera torrencial o sea orballo no tiene efecto en llegar a tiempo a la cita.\n\n| T        | attend | miss |\n| :-------:|:------:|:----:|\n| on time  | 0.9    | 0.1  |\n| delayed  | 0.6    | 0.4  |\n\n### Probabilidad conjunta\n\nCalculamos la probabilidad de un determinado evento dada una observación, una observación de todas las variables, por lo que hablamos de **probabilidad conjunta** o _joint probabililty_.\n\n¿Cual es la probabilidad de que no llueva, no se realice mantenimiento, el tren llegue puntual y asistamos a la cita?\n\n$$ P(light)P(no | light)P(on time | light, no)P(attend | on time) $$\n\n $$ P(light, no, on time, attend) $$\n\n\n```python\n$ python likelihood.py\n\ntensor([0.3402])\n```\n\n### Inferencia por enumeración\n\n¿Cuáles son las distribuciones de probabilidades para todas las variables dada una evidencia, una observación?\n\nDada una observación o evidencia $e$, aplicamos la **inferencia por enumeración** iterando sobre las probabilidades de las variables ocultas $y$ :\n\n $$ P(X|e) = \\frac{P(X,e)}{P(e)} = \\alpha P(X,e) = \\alpha \\sum_{y} {P(X,e,y)} $$\n\nCon la observación de que el tren se ha retrasado, calculamos las **distribuciones de probabilidad** de las variables Rain, Maintenance y Appointment.\n\n```python\n$ python inference.py\n\nrain\n    none: 0.4583\n    light: 0.3069\n    heavy: 0.2348\nmaintenance\n    yes: 0.3567\n    no: 0.6433\ntrain\n    on time: 0.0000\n    delayed: 1.0000\nappointment\n    attend: 0.6000\n    miss: 0.4000\n```\n\n`likelihood.py` y `inference.py` son dependientes del módulo `model.py`.\n\nEn el código de estos tres ficheros encontrarás la explicación de cómo se codifica la red de bayes en pomegranate.\n\n#### Ejercicio inferencia\n\nIntenta calcular la probabilidad de llegar a tiempo o tarde a la cita, dependiendo de que el tren llegue tarde (_delayed_) y se produzca lluvia fuerte (_heavy_).\n\n¿Ha cambiado la probabilidad de atender a la cita respecto al ejemplo anterior? ¿Por qué?\n\nChequea la configuración en el fichero `inference_ejercicio.py`.\n\n![resultado ejercicio inference](doc/resultado_inference_ejercicio.png \"resultado ejercicio inference\")\n\n### Rejection sampling\n\nComo la inferencia por enumeración puede resultar computacionalmente ineficiente, es posible implementar el cálculo de la distribución de la probabilidad de la variable _appoinment_ (perder la cita, _miss_ o _attend_) en función de la probabilidad condicionada a que el tren llegue tarde (_delayed_), mediante el método _rejection sampling_. \n\n$$ P(Appoinment| Train = delayed) = \\frac{P(Appoinment, Train = delayed)}{P(Train = delayed)} = \\\\ = \\alpha P(Appoinment, Train = delayed) = \\\\ = \\alpha \\sum_{y \\in Rain, Maintenance } {P(Appoinment, Train = delayed,y)} $$\n\nSe trata de tomar N muestras sobre la red de bayes y seleccionar aquellas que verifiquen que:\n\n```python\n[?, ?, 1, 0]  [rain, maintenance, \"delayed\", \"attend\"]\n[?, ?, 1, 1]  [rain, maintenance, \"delayed\", \"miss\"]\n```\n\nSi el caso fuese Rain = light y Train = ontime, el muestreo correspondería a la figura:\n\n![\"rejection samplig\"](doc/rejection_sampling.png \"rejection samplig\")\n\n_Rejection samplig_ un cálculo aproximado de la probabilidad, que variará en función del número de muestras sampleadas que categoricemos como _attend_ o _miss_, por lo que la ejecución de `sample.py` arroja ligeras variaciones en el conteo de cada muestra.\n\nConsulta el módulo `sammple.py`.\n\n```python\n$ python sample.py\n\nCounter({'attend': 1224, 'miss': 884})\n# y en sucesivos muestreos\nCounter({'attend': 1216, 'miss': 821})\nCounter({'attend': 1231, 'miss': 843})\nCounter({'attend': 1340, 'miss': 826})\n```\n\n¿Cuál es la distribución de probabilidad normalizada? Para el último muestreo:\n\n$$ P(Appoinment| Train = delayed) = \u003c 0.616, 0.384\u003e  $$\n\n### Likelihood weighting\n\nEn el ejemplo anterior se observa que en 10K muestras se rechazan aproximadamente el 80% de las muestras sampleadas. Esto es otro motivo de ineficiencia computacional.\n\nPodemos realizar el muestreo esta ve fijando el valor de las variables observadas, las evidencias, y no muestrelarlas. Calcularemos las probabilidades condicionales del resto de variables usando la red de Bayes o de creencia, y multiplicaremos cada muestra por su probabilidad.\n\n![Likelihood weighting](doc/likelihood_weigting.png \"Likelihood weighting\")\n\n## Recursos sobre probabilidad y redes de Bayes\n\nMi compañero [@alejandro](https://github.com/avidaldo) del curso de especialización en IA y Big Data del IES de Teis en la modalidad a distancia ha preparado estos recursos en castellano: [Matemáticas para Machine Learning](https://github.com/avidaldo/mates_ml).\n\nRecordad que esta práctica intenta cubrir los contenidos de los capítulos 12 _Quantifying Uncertainty_ y 13 _Probabilistic Reasoning_ del libro _IA, un enfoque moderno_ de Russell \u0026 Norvig. Allí encontraréis explicacos en profundidad los conceptos más importantes sobre teoría de probabilidad que explicamos de manera práctica en clase sobre estos dos supuestos prácticos:\n\n* \"Trata de arrancarlo\" o \"Un sistema de diagnóstico de averías inteligente como asistente para mecánicos\", un ejemplo explicado por Sebastian Thrun en su famoso y pionero MOCC sobre IA: \n\n![Red de Bayes](doc/bayes_network_thrun.png \"Red de Bayes diagnóstico de averías\")\n\n* Probabilidades sobre dos dados:\n\n![Espacio de muestras](doc/espacio_de_muestras.png \"Espacio de muestras tirada de dos dados\")\n\n### Principios\n\nLos principios más importantes para comprender la teoría de probabilidades son:\n\n* La letra griega $\\Omega$ (omega mayúscula) representa el **espacio de muestras**, y $\\omega$ (omega minúscula) se refiere a los elementos de ese espacio, es decir, a los **posibles mundos**.\n\n* Los posibles mundos son mútuamente **exclusivos** y **exhaustivos**: dos posibles mundos no pueden existir a la vez, y uno de los posibles mundos debe producirse.\n\n* Un modelo de probabilidad completamente especificado asocia una probabilidad numérica $P(ω)$ con cada posible mundo.\n\n* El axioma básico de la teoría de la probabilidad enuncia que todo mundo posible tiene una probabilidad entre 0 y 1, y que la probabilidad total del conjunto de posibles mundos es es 1:\n\n$$ 0 \\leq P(ω) \\leq 1 \\quad \\forall \\omega $$\n\n$$ \\sum_{w\\in\\Omega} P(ω)=1 $$\n\n#### Ejemplo\n\nJugamos con tres cartas, una reina $Q$, un rey $K$ y un comodín (o _jack_) $J$. Todas las cartas están boca abajo, elegimos una al azar y le damos la vuelta. ¿Cuál es el conjunto de resultados? \nLos posibles resultados son $\\Omega = \\{ Q, K, J\\}$\n\n### Negación\n\n$$ P(A) = 1 - P(\\neg A) $$\n\nsi $A$ y $A^c$ son disjuntos.\n\n$$ P(A^c \\cup A) = P(A^c) + P(A) = P(\\Omega) = 1 $$\n\n### Independencia\n\nDos eventos $A$ y $B$ son independientes si y sólo si:\n\n$$ P(A \\cap B) = P(A)P(B) $$\n\n#### Ejemplo\n\nEl espacio de muestras de un dado de seis caras es $\\Omega = \\{ 1, 2, 3, 4, 5, 6 \\}$\n\nEn un dado sin trucar, cada muestra tiene la misma probabilidad $P(\\omega) = 1/6$. \nSi lanzamos dos dados, el resultado de cada dado es independiente del otro. ¿Cuál es la probabilidad de obtener dos treses?\n\n$$ P(tres \\cap tres) = P(tres)P(tres) = (1/6) \\times (1/6) = 1/36 $$\n\nEste ejemplo también sirve para demostrar que dos sucesos son independientes. Dos sucesos son independientes si $P(A \\cap B) = P(A)P(B)$.\n\nLa probabilidad de obtener un tres en uno de los dados es $1/6$, igual que la probabilidad de obtener $1/6$ en el otro dado. Por tanto: $P(A)P(B)= (1/6) \\times (1/6) = 1/36$\n\nLa probabilidad de obtener dos treses se puede calcular dividiendo el número de las muestras que satisfacen esa condición entre el número total de muestras:\n\n$$ P(A \\cap B) = \\frac {Número \\ de \\  muestras \\ en \\ A \\cap B}{Número \\ total \\ de \\ muestras \\ en \\ \\Omega } $$\n\nEl número total de muestras en $\\Omega$ es $36$ (son las posibles combinaciones de los 6 valores de cada uno de los dos dados). El número de muestras con dos $treses$ es $1$. Por tanto $P(F) = 1/36$.\nSe verifica, por tanto, que los sucesos son independientes porque  $P(A)P(B)= 1/36 = P(A \\cap B)$.\n\n### Marginalización\n\n$$ P(A) = P(A,B) + P(A, \\neg B) $$\n\ntambién expresada para variables aleatorias como:\n\n$$ P(X=x_i) = \\sum_j(X=x_i, Y=y_j) $$\n\n### Teorema de la Probabilidad Total\n\n$$ P(A) = P(A|B) P(B) + P(A|\\neg B)  P(\\neg B) $$\n\n$$ P(A) = \\sum_i P(A|B_i) P(B_i)$$\n\n### Inclusión - Exclusión\n\n$$ P(A \\vee B) = P(A) + P(B) - P(A \\wedge B)$$\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdfleta%2Fprobabilidad-bayes-mia","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdfleta%2Fprobabilidad-bayes-mia","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdfleta%2Fprobabilidad-bayes-mia/lists"}