La programación probabilística ( PP ) es un paradigma de programación basado en la especificación declarativa de modelos probabilísticos , para los cuales la inferencia se realiza automáticamente. [ 1 ] La programación probabilística busca unificar el modelado probabilístico y la programación tradicional de propósito general para facilitar el uso del primero y ampliar su aplicabilidad. [ 2 ] [ 3 ] Puede utilizarse para crear sistemas que faciliten la toma de decisiones ante la incertidumbre. Los lenguajes de programación que siguen el paradigma de programación probabilística se denominan "lenguajes de programación probabilística" (PPL).
Aplicaciones
El razonamiento probabilístico se ha utilizado para una amplia variedad de tareas, como predecir precios de acciones, recomendar películas, diagnosticar computadoras, detectar intrusiones cibernéticas y detectar imágenes. [ 4 ] Sin embargo, hasta hace poco (en parte debido a la limitada capacidad de procesamiento), la programación probabilística tenía un alcance limitado y la mayoría de los algoritmos de inferencia debían escribirse manualmente para cada tarea.
Sin embargo, en 2015, se utilizó un programa de visión artificial probabilístico de 50 líneas para generar modelos 3D de rostros humanos a partir de imágenes 2D de dichos rostros. El programa empleó gráficos inversos como base de su método de inferencia y se construyó utilizando el paquete Picture de Julia . [ 4 ] Esto hizo posible "en 50 líneas de código lo que antes requería miles". [ 5 ] [ 6 ]
La biblioteca de programación probabilística Gen (también escrita en Julia) se ha aplicado a tareas de visión y robótica. [ 7 ]
Más recientemente, el sistema de programación probabilística Turing.jl se ha aplicado en diversas aplicaciones farmacéuticas [ 8 ] y económicas. [ 9 ]
La programación probabilística en Julia también se ha combinado con la programación diferenciable mediante la combinación del paquete Julia Zygote.jl con Turing.jl. [ 10 ]
Los lenguajes de programación probabilística también se utilizan comúnmente en la ciencia cognitiva bayesiana para desarrollar y evaluar modelos de cognición. [ 11 ]
Lenguajes de programación probabilística
Los lenguajes de programación de propósito general (PPL) suelen extenderse a partir de un lenguaje básico. Por ejemplo, Turing.jl [ 12 ] se basa en Julia , Infer.NET se basa en .NET Framework [ 13 ] , mientras que PRISM se extiende a partir de Prolog [ 14 ] . Sin embargo, algunos PPL, como WinBUGS , ofrecen un lenguaje autocontenido que se corresponde estrechamente con la representación matemática de los modelos estadísticos, sin un origen evidente en otro lenguaje de programación [ 15 ] [ 16 ] .
El lenguaje WinBUGS se implementó para realizar cálculos bayesianos utilizando el muestreo de Gibbs y algoritmos relacionados. Aunque se implementó en un lenguaje de programación relativamente desconocido (Component Pascal), este lenguaje permite la inferencia bayesiana para una amplia variedad de modelos estadísticos mediante un enfoque computacional flexible. El mismo lenguaje BUGS puede utilizarse para especificar modelos bayesianos para la inferencia a través de diferentes opciones computacionales ("muestreadores") y convenciones o valores predeterminados, utilizando el programa independiente WinBUGS (o los paquetes de R relacionados, rbugs y r2winbugs) y JAGS (Just Another Gibbs Sampler, otro programa independiente con paquetes de R relacionados, incluidos rjags, R2jags y runjags). Más recientemente, otros lenguajes para admitir la especificación e inferencia de modelos bayesianos permiten opciones diferentes o más eficientes para el cálculo bayesiano subyacente, y son accesibles desde el entorno de programación y análisis de datos R, por ejemplo: Stan , NIMBLE y NUTS. La influencia del lenguaje BUGS es evidente en estos lenguajes posteriores, que incluso utilizan la misma sintaxis para algunos aspectos de la especificación del modelo.
Varias bibliotecas de programación de paquetes (PPL) se encuentran en desarrollo activo, incluidas algunas en fase beta. Dos herramientas populares son Stan y PyMC . [ 17 ] [ 18 ]
Relacional
Un lenguaje de programación relacional probabilístico (PRPL, por sus siglas en inglés) es un PPL (lenguaje de programación de propósito general) diseñado especialmente para describir y realizar inferencias con modelos relacionales probabilísticos (PRM, por sus siglas en inglés).
Un PRM se suele desarrollar con un conjunto de algoritmos para reducir, inferir y descubrir las distribuciones en cuestión, los cuales están integrados en el PRPL correspondiente.
Programación lógica probabilística
La programación lógica probabilística es un paradigma de programación que extiende la programación lógica con probabilidades.
La mayoría de los enfoques de la programación lógica probabilística se basan en la semántica de distribución, que divide un programa en un conjunto de hechos probabilísticos y un programa lógico. Define una distribución de probabilidad sobre las interpretaciones del universo de Herbrand del programa. [ 19 ]
Lista de lenguajes de programación probabilística
Esta lista resume la variedad de PPL (Leyes de Propiedad Intelectual Pública) que están disponibles actualmente y aclara sus orígenes.
Dificultad
- Razonar sobre las variables como distribuciones de probabilidad causa dificultades a los programadores novatos, pero estas dificultades pueden abordarse mediante el uso de visualizaciones de redes bayesianas y gráficos de distribuciones de variables integrados en el editor de código fuente. [ 54 ]
- Dado que muchos PPL dependen de la especificación de distribuciones a priori sobre las variables de interés, especificar distribuciones a priori informadas suele ser difícil para los principiantes. En algunos casos, bibliotecas como PyMC proporcionan métodos automatizados para encontrar la parametrización de distribuciones a priori informadas. [ 55 ]
Véase también
Notas
- ↑ "La programación probabilística hace en 50 líneas de código lo que antes requería miles" . phys.org . 13 de abril de 2015. Consultado el 13 de abril de 2015 .
- ↑ "Programación probabilística" . probabilistic-programming.org . Archivado del original el 10 de enero de 2016. Consultado el 24 de diciembre de 2013 .
- ↑ Pfeffer, Avrom (2014), Programación probabilística práctica , Manning Publications. p. 28. ISBN 978-1 6172-9233-0
- 1 2 3 "Código corto de aprendizaje automático de programación probabilística reemplaza programas complejos para tareas de visión artificial" . KurzweilAI . 13 de abril de 2015. Recuperado el 27 de noviembre de 2017 .
- ↑ Hardesty, Larry (13 de abril de 2015). "Gráficos al revés" .
- ↑ "El MIT muestra un script de aprendizaje automático para crear CABEZAS ESPELUZNANTES" . The Register .
- ↑ "El sistema de programación Gen del MIT simplifica la curva de aprendizaje para proyectos de IA" . VentureBeat . 27 de junio de 2019. Consultado el 27 de junio de 2019 .
- ↑ Semenova, Elizaveta; Williams, Dominic P.; Afzal, Avid M.; Lazic, Stanley E. (1 de noviembre de 2020). "Una red neuronal bayesiana para la predicción de toxicidad" . Toxicología Computacional . 16 100133. doi : 10.1016/j.comtox.2020.100133 . ISSN 2468-1113 . S2CID 225362130 .
- ↑ Williams, Dominic P.; Lazic, Stanley E.; Foster, Alison J.; Semenova, Elizaveta; Morgan, Paul (2020), "Predicción de lesiones hepáticas inducidas por fármacos con aprendizaje automático bayesiano" , Chemical Research in Toxicology , 33 (1): 239–248 , doi : 10.1021/acs.chemrestox.9b00264 , PMID 31535850 , S2CID 202689667
- ↑ Innes, Mike; Edelman, Alan; Fischer, Keno; Rackauckas, Chris; Saba, Elliot; Viral B Shah; Tebbutt, Will (2019). "∂P: Un sistema de programación diferenciable para conectar el aprendizaje automático y la computación científica". arXiv : 1907.07587 [ cs.PL ].
- ↑ Goodman, Noah D; Tenenbaum, Joshua B; Buchsbaum, Daphna; Hartshorne, Joshua; Hawkins, Robert; O'Donnell, Timothy J; Tessler, Michael Henry. "Modelos probabilísticos de la cognición" . Modelos probabilísticos de la cognición - 2.ª edición . Consultado el 27 de mayo de 2023 .
- 1 2 "El lenguaje de Turing para la programación probabilística" . GitHub . 28 de diciembre de 2021.
- 1 2 "Infer.NET" . microsoft.com . Microsoft.
- 1 2 "PRISM: Programación en modelado estadístico" . rjida.meijo-u.ac.jp . Archivado del original el 1 de marzo de 2015. Recuperado el 8 de julio de 2015 .
- 1 2 "El proyecto BUGS - Unidad de Bioestadística del MRC" . cam.ac.uk. Archivado del original el 14 de marzo de 2014. Recuperado el 12 de enero de 2011 .
- 1 2 "Stan" . mc-stan.org . Archivado del original el 3 de septiembre de 2012.
- ^ Abril-Pla O, Andreani V, Carroll C, Dong L, Fonnesbeck CJ, Kochurov M, Kumar R, Lao J, Luhmann CC, Martin OA, Osthege M, Vieira R, Wiecki T, Zinkov R. (2023) PyMC: un marco de programación probabilística moderno e integral en Python. Computación entre pares. Ciencia. 9:e1516 doi : 10.7717/peerj-cs.1516
- ↑ "Los algoritmos detrás de la programación probabilística" . Consultado el 10 de marzo de 2017 .
- ↑ De Raedt, Luc; Kimmig, Angelika (1 de julio de 2015). "Conceptos de programación probabilística (lógica)" . Machine Learning . 100 (1): 5– 47. doi : 10.1007/s10994-015-5494-z . ISSN 1573-0565 .
- ↑ "Analytica: un lenguaje de modelado probabilístico" . lumina.com .
- ↑ "bayesloop - Marco de programación probabilística" . bayesloop.com .
- ↑ "GitHub -- bayesloop" . GitHub . 7 de diciembre de 2021.
- ↑ " Bean Machine: un lenguaje de programación probabilístico universal para permitir un análisis bayesiano rápido y preciso" . beanmachine.org
- ↑ "Venture: una plataforma de programación probabilística de propósito general" . mit.edu . Archivado del original el 25 de enero de 2016. Consultado el 20 de septiembre de 2014 .
- ↑ "BayesDB en SQLite. Una tabla de base de datos bayesiana para consultar las implicaciones probables de los datos con la misma facilidad con la que las bases de datos SQL consultan los datos mismos" . GitHub . 26 de diciembre de 2021.
- ↑ "diff-SAT (SAT/ASP probabilístico)" . GitHub . 8 de octubre de 2021.
- ↑ Dey, Debabrata; Sarkar, Sumit (1998). "PSQL: Un lenguaje de consulta para datos relacionales probabilísticos". Data & Knowledge Engineering . 28 : 107–120 . doi : 10.1016/S0169-023X(98)00015-9 .
- ↑ "Dyna" . www.dyna.org . Archivado del original el 17 de enero de 2016. Consultado el 12 de enero de 2011 .
- ↑ "Charles River Analytics - Servicios de modelado probabilístico" . cra.com . 9 de febrero de 2017.
- ↑ "ProbLog: Programación probabilística" . dtai.cs.kuleuven.be .
- ↑ ProbaSí. "ProbaYes - Ensemble, nous valorisations vos données" . probayes.com . Archivado desde el original el 5 de marzo de 2016 . Consultado el 26 de noviembre de 2013 .
- ↑ «Página de inicio de Hakaru» . hakaru-dev.github.io/ .
- ↑ "Página principal de BAli-Phy" . bali-phy.org .
- ↑ "ProbCog" . GitHub .
- ↑ Desarrolladores de PyMC. "PyMC" . pymc-devs.github.io .
- ↑ raya/rainier , Stripe, 19 de agosto de 2020 , consultado el 26 de agosto de 2020
- ↑ "Rainier · Inferencia bayesiana para Scala" . samplerainier.com . Consultado el 26 de agosto de 2020 .
- ↑ "greta: modelado estadístico simple y escalable en R" . GitHub . Consultado el 2 de octubre de 2018 .
- ↑ "Inicio — documentación de pomegranate 0.10.0" . pomegranate.readthedocs.io . Consultado el 2 de octubre de 2018 .
- ↑ "Página principal de Lea" . bitbucket.org .
- ↑ "Página principal de WebPPL" . github.com/probmods/webppl .
- ↑ "Gen: Un lenguaje de programación probabilístico de propósito general con inferencia programable" . Consultado el 11 de junio de 2024 .
- ↑ "Edward – Inicio" . edwardlib.org . Consultado el 17 de enero de 2017 .
- ↑ TensorFlow (11 de abril de 2018). "Introducción a la probabilidad en TensorFlow" . TensorFlow . Consultado el 2 de octubre de 2018 .
- ↑ "Módulo de probabilidad de TensorFlow 'Edward2' . GitHub . Consultado el 11 de junio de 2024 .
- ↑ "Pyro" . pyro.ai. Consultado el 9 de febrero de 2018 .
- ↑ "NumPyro" . pyro.ai. Consultado el 23 de julio de 2021 .
- ↑ "Programación probabilística en Birch" . birch-lang.org . Consultado el 20 de abril de 2018 .
- ↑ "PSI Solver - Inferencia exacta para programas probabilísticos" . psisolver.org . Consultado el 18 de agosto de 2019 .
- ↑ "Inicio" . www.stat.ubc.ca .
- ↑ Perov, Yura; Graham, Logan; Gourgoulias, Kostis; Richens, Jonathan G.; Lee, Ciarán M.; Baker, Adam; Johri, Saurabh (28 de enero de 2020), MultiVerse: Razonamiento causal mediante muestreo de importancia en programación probabilística , arXiv : 1910.08091
- ↑ "El sistema de programación probabilística anglicano" . probprog.github.io . Consultado el 7 de octubre de 2024 .
- ↑ oráculo/sandwood , Oracle, 28 de mayo de 2026 , consultado el 16 de junio de 2026
- ↑ Gorinova, Maria I.; Sarkar, Advait; Blackwell, Alan F.; Syme, Don (1 de enero de 2016). «Un entorno de programación probabilística de representación múltiple en vivo para principiantes». Actas de la Conferencia CHI 2016 sobre Factores Humanos en Sistemas Informáticos . CHI '16. Nueva York, NY, EE. UU.: ACM. págs. 2533–2537 . doi : 10.1145/2858036.2858221 . ISBN 9781450333627. S2CID 3201542 .
- ↑ "pymc.find_constrained_prior — Documentación para desarrolladores de PyMC" . www.pymc.io. Consultado el 23 de octubre de 2024 .
Enlaces externos
- Fundamentos de la programación probabilística
- Lista de kits de herramientas de mini lenguajes para modelos probabilísticos
- Modelos probabilísticos
- Software probabilístico
- paradigmas de programación