Programación probabilística
# Programación probabilística

La programación probabilística (PP) es un paradigma de programación en el que se especifican modelos probabilísticos y la inferencia a partir de estos modelos se realiza automáticamente. Representa un intento de unificar el modelado probabilístico y la programación tradicional de propósito general para hacer que el primero sea más fácil y más aplicable. Este paradigma se puede usar para crear sistemas que ayuden a tomar decisiones ante la incertidumbre.

Los lenguajes de programación utilizados para la programación probabilística se denominan "lenguajes de programación probabilística" (PPL por sus siglas en inglés).

## Aplicaciones

El razonamiento probabilístico se ha utilizado para una amplia variedad de tareas tales como la predicción de los precios de las acciones, recomendación de películas, diagnóstico por computadora, detección de intrusiones cibernéticas y de objetos en imágenes. Sin embargo, hasta hace poco (en parte debido al poder de cómputo limitado), la programación probabilística tenía un alcance limitado y la mayoría de los algoritmos de inferencia tenían que escribirse manualmente para cada tarea.

Sin embargo, en 2015, se utilizó un programa probabilístico de visión por computadora de 50 líneas para generar modelos 3D de rostros humanos basados en imágenes 2D de esos rostros. El programa utilizaba gráficos inversos como base de su método de inferencia y se creó utilizando el paquete Picture de Julia. Esto hizo posible "en 50 líneas de código lo que solía tomar miles".

La biblioteca de programación probabilística Gen (también escrita en Julia) se ha aplicado a tareas de visión y robótica.

Más recientemente, los sistemas de programación probabilística Turing.jl han tenido diversas aplicaciones farmacéuticas y económicas.

La programación probabilística en Julia también se ha combinado con programación diferenciable al combinar el paquete de Julia Zygote.jl con Turing.jl.

## Lenguajes de programación probabilísticos

Los PPL a menudo se extienden a partir de algún otro lenguaje base. La elección del lenguaje subyacente depende de la similitud del modelo con la ontología del lenguaje básico así como de consideraciones comerciales y preferencias personales. Por ejemplo, Dimple y Chimple se basan en Java, Infer.NET se basa en .NET, mientras PRISM se extiende desde Prolog. Sin embargo, algunos PPL como WinBUGS y Stan ofrecen un lenguaje auto-contenido, sin un origen obvio en otro lenguaje.

Varios PPL están en desarrollo activo, incluidos algunos en prueba beta. Las dos herramientas más populares son Stan y PyMC3.

### Relacional

Un lenguaje de programación relacional probabilístico (PRPL) es un PPL especialmente diseñado para describir e inferir con modelos relacionales probabilísticos (PRM).

Un PRM generalmente se desarrolla con un conjunto de algoritmos para reducir, inferir y descubrir distribuciones.

### Lista de lenguajes de programación probabilísticos.

| Nombre | Extendido de | Lenguaje anfitrión |
| - | - | - |
| Analytica | | C++ |
| bayesloop | Python | Python |
| CuPPL | NOVA | |
| Venture | Scheme | C++ |
| Probabilistic-C | C | C |
| Anglican | Clojure | Clojure |
| IBAL | OCaml | |
| BayesDB | SQLite, Python | |
| PRISM | B-Prolog | |
| Infer.NET | .NET Framework | .NET Framework |
| dimple | MATLAB, Java | |
| chimple | MATLAB, Java | |
| BLOG | Java | |
| delSAT | SAT (DIMACS CNF) | |
| PSQL | SQL | |
| BUGS | | |
| FACTORIE | Scala | |
| PMTK | MATLAB | MATLAB |
| Alchemy | C++ | |
| Dyna | Prolog | |
| Figaro | Scala | |
| Church | Scheme | Various: JavaScript, Scheme |
| ProbLog | Prolog | Python, Jython |
| ProBT | C++, Python | |
| Stan | | C++ |
| Hakaru | Haskell | Haskell |
| BAli-Phy | Haskell | C++ |
| ProbCog | | Java, Python |
| Gamble | | Racket |
| PWhile | While | Python |
| Tuffy | | Java |
| PyMC3 | Python, Theano | Python |
| PyMC4 | Python, TensorFlow Probability | Python |
| greta | TensorFlow | R |
| pomegranate | Python | Python |
| Lea | Python | Python |
| WebPPL | JavaScript | JavaScript |
| Picture | Julia | Julia |
| Turing.jl | Julia | Julia |
| Gen | Julia | Julia |
| Low-level First-order PPL | Python, Clojure, Pytorch | Various: Python, Clojure |
| Troll | | Moscow ML |
| Edward | TensorFlow | Python |
| TensorFlow Probability | TensorFlow | Python |
| Edward2 | TensorFlow Probability | Python |
| Pyro | PyTorch | Python |
| Saul | Scala | Scala |
| RankPL | | Java |
| Birch | | C++ |
| PSI | | D |

## Dificultad

El razonamiento sobre las variables como distribuciones de probabilidad causa dificultades a los programadores novatos pero estas dificultades pueden abordarse mediante el uso de visualizaciones de red bayesianas y gráficos de distribuciones de variables incrustadas en el editor de código fuente.

