Programmation probabiliste - Probabilistic programming
La programmation probabiliste ( PP ) est un paradigme de programmation dans lequel des modèles probabilistes sont spécifiés et l'inférence pour ces modèles est effectuée automatiquement. Il représente une tentative d'unifier la modélisation probabiliste et la programmation traditionnelle à usage général afin de rendre la première plus facile et plus largement applicable. Il peut être utilisé pour créer des systèmes qui aident à prendre des décisions face à l'incertitude.
Les langages de programmation utilisés pour la programmation probabiliste sont appelés « langages de programmation probabilistes » (PPL).
Applications
Le raisonnement probabiliste a été utilisé pour une grande variété de tâches telles que la prévision des cours des actions, la recommandation de films, le diagnostic d'ordinateurs, la détection d'intrusions informatiques et la détection d'images. Cependant, jusqu'à récemment (en partie en raison d'une puissance de calcul limitée), la programmation probabiliste était limitée et la plupart des algorithmes d'inférence devaient être écrits manuellement pour chaque tâche.
Néanmoins, en 2015, un programme de vision par ordinateur probabiliste de 50 lignes a été utilisé pour générer des modèles 3D de visages humains basés sur des images 2D de ces visages. Le programme a utilisé des graphiques inverses comme base de sa méthode d'inférence et a été construit à l'aide du package Picture dans Julia . Cela a rendu possible "en 50 lignes de code ce qui en prenait des milliers".
La bibliothèque de programmation probabiliste Gen (également écrite en Julia) a été appliquée aux tâches de vision et de robotique.
Plus récemment, les systèmes de programmation probabiliste Turing.jl ont été appliqués dans diverses applications pharmaceutiques et économiques.
La programmation probabiliste dans Julia a également été combinée avec la programmation différentiable en combinant le package Julia Zygote.jl avec Turing.jl.
Langages de programmation probabilistes
Les PPL s'étendent souvent à partir d'un langage de base. Le choix du langage de base sous-jacent dépend de la similitude du modèle avec l' ontologie du langage de base , ainsi que des considérations commerciales et des préférences personnelles. Par exemple, Dimple et Chimple sont basés sur Java , Infer.NET est basé sur .NET Framework , tandis que PRISM s'étend de Prolog . Cependant, certains PPL tels que WinBUGS et Stan proposent un langage autonome, sans origine évidente dans un autre langage.
Plusieurs PPL sont en cours de développement, dont certains en bêta-test. Les deux outils les plus populaires sont Stan et PyMC3 .
Relationnel
Un langage de programmation relationnelle probabiliste (PRPL) est un PPL spécialement conçu pour décrire et déduire des modèles relationnels probabilistes (PRM).
Un PRM est généralement développé avec un ensemble d'algorithmes de réduction, d'inférence et de découverte des distributions concernées, qui sont intégrés dans le PRPL correspondant.
Liste des langages de programmation probabilistes
Nom | S'étend de | Langue de l'hôte |
---|---|---|
Analytica | C++ | |
boucle de baie | Python | Python |
CuPPL | NOVA | |
Entreprise | Schème | C++ |
Probabiliste-C | C | C |
anglican | Clojuré | Clojuré |
IBAL | OCaml | |
BayesDB | SQLite , Python | |
PRISME | B-Prologue | |
Déduire.NET | .NET Framework | .NET Framework |
fossette | MATLAB , Java | |
chimpanzé | MATLAB, Java | |
BLOG | Java | |
diff-SAT | Programmation de poste de réponse , SAT (DIMACS CNF) | |
PSQL | SQL | |
BUGS | ||
USINE | Scala | Scala |
PMTK | MATLAB | MATLAB |
Alchimie | C++ | |
Dyna | Prologue | |
Figaro | Scala | Scala |
Église | Schème | Divers : JavaScript, Schéma |
ProbLog | Prologue | Python, Jython |
ProBT | C++, Python | |
Stan | C++ | |
Hakaru | Haskell | Haskell |
BAli-Phy (logiciel) | Haskell | C++ |
ProbCog | Java, Python | |
Pari | Raquette | |
Ppendant que | Tandis que | Python |
Tuffy | Java | |
PyMC3 | Python, Théano | Python |
PyMC4 | Python, probabilité TensorFlow | Python |
Rainier | Scala | Scala |
grand | TensorFlow | R |
Grenade | Python | Python |
Léa | Python | Python |
WebPPL | JavaScript | JavaScript |
La chance | Rayure | JavaScript |
Photo | Julia | Julia |
Turing.jl | Julia | Julia |
Génération | Julia | Julia |
PPL de premier ordre de bas niveau | Python, Clojure, Pytorch | Divers : Python, Clojure |
Troll | Moscou ML | |
Edouard | TensorFlow | Python |
Probabilité TensorFlow | TensorFlow | Python |
Edouard2 | Probabilité TensorFlow | Python |
Pyro | PyTorche | Python |
NumPyro | JAX | Python |
Saül | Scala | Scala |
Stan | C++, Python, R | |
RangPL | Java | |
Bouleau | C++ | |
psi | ré |
Difficulté
Raisonner sur les variables en tant que distributions de probabilités pose des difficultés aux programmeurs novices, mais ces difficultés peuvent être résolues grâce à l'utilisation de visualisations de réseau bayésiennes et de graphiques de distributions de variables intégrés dans l'éditeur de code source.