Vai al contenuto

Programmazione probabilistica

Da Wikipedia, l'enciclopedia libera.

La programmazione probabilistica (PP) è un paradigma di programmazione basato sulla specifica dichiarativa di modelli probabilistici, per i quali l'inferenza viene eseguita automaticamente. [1] La programmazione probabilistica cerca di unificare la modellazione probabilistica e la programmazione tradizionale di utilità generale al fine di rendere la prima più semplice e più largamente applicabile. [2] [3] Essa può essere utilizzata per creare sistemi che aiutano a prendere decisioni in condizioni di incertezza. I linguaggi di programmazione che seguono tale paradigma sono denominati "linguaggi di programmazione probabilistica" (PPL).

Il ragionamento probabilistico è stato utilizzato per risolvere una vasta gamma di problemi come la previsione del mercato azionario, la raccomandazione di film, la diagnostica dei computer, il rilevamento di intrusioni informatiche e il riconoscimento di immagini. [4] Tuttavia, fino a poco tempo fa (in parte a causa della limitata potenza di calcolo), la programmazione probabilistica aveva una portata limitata e la maggior parte degli algoritmi di inferenza doveva essere scritta manualmente per ciascun compito.

Peraltro, nel 2015, è stato utilizzato un programma di visione artificiale probabilistica di 50 righe per generare modelli 3D di volti umani basati su immagini 2D di tali volti. Il programma utilizzava la grafica inversa come base del suo metodo di inferenza ed è stato sviluppato utilizzando il pacchetto Picture in Julia. [4] Ciò ha reso possibile "in 50 righe di codice ciò che prima ne richiedeva migliaia". [5][6]

La libreria di programmazione probabilistica Gen (anch'essa scritta in Julia) è stata impiegata in attività legate a visione e robotica. [7]

Più recentemente, il sistema di programmazione probabilistica Turing.jl è stato impiegato in diverse applicazioni nei settori della farmaceutica [8][9] e dell'economia.

La programmazione probabilistica in Julia è stata anche abbinata alla programmazione differenziabile, integrando il pacchetto Julia Zygote.jl con Turing.jl.

I linguaggi di programmazione probabilistica sono comunemente utilizzati anche nell'ambito del cognitivismo bayesiano ai fini di sviluppare e valutare modelli cognitivi. [10]

Linguaggi di programmazione probabilistici

[modifica | modifica wikitesto]

I PPL spesso si configurano come estensioni di un linguaggio-base. Ad esempio, Turing.jl è basato su Julia, Infer.NET è basato su .NET Framework, mentre PRISM estende il Prolog. Tuttavia, alcuni PPL, come WinBUGS, offrono un linguaggio autonomo che si adatta strettamente alla rappresentazione matematica dei modelli statistici, senza avere un'origine ovvia in un altro linguaggio di programmazione.

Il linguaggio per WinBUGS è stato implementato per eseguire elaborazioni bayesiane utilizzando il campionamento di Gibbs e altri algoritmi correlati. Sebbene implementato in un linguaggio di programmazione relativamente sconosciuto (Component Pascal), questo linguaggio implementa l'inferenza bayesiana su un'ampia gamma di modelli statistici utilizzando un approccio computazionale flessibile. Lo stesso linguaggio BUGS può essere utilizzato per specificare modelli bayesiani per l'inferenza tramite diverse varianti computazionali ("sampler") e convenzioni o impostazioni predefinite, utilizzando un programma autonomo WinBUGS (o pacchetti correlati in R, come rbugs e r2winbugs) e JAGS (Just Another Gibbs Sampler, un altro programma autonomo con pacchetti R correlati, tra cui rjags, R2jags e runjags). Più recentemente, altri linguaggi a supporto della formulazione e dell'inferenza per modelli bayesiani, come ad esempio Stan, NIMBLE e NUTS, offrono soluzioni diverse o più efficienti per il calcolo bayesiano alla base e sono accessibili dall'ambiente di analisi e programmazione dati R. L'influenza del linguaggio BUGS è evidente in questi linguaggi più recenti, i quali utilizzano addirittura la stessa sintassi per alcuni aspetti della specifica del modello.

Diversi PPL sono in fase di sviluppo attivo, includendo alcuni in beta testing. Due esempi molto popolari sono Stan e PyMC. [11]

Programmazione probabilistica relazionale

[modifica | modifica wikitesto]

Un linguaggio di programmazione relazionale probabilistico (PRPL) è un PPL appositamente progettato per descrivere e fare inferenza su modelli probabilistici relazionali (PRM).

Un PRM viene solitamente sviluppato con un insieme di algoritmi per la riduzione, l'inferenza e l'identificazione delle distribuzioni interessate, tutti integrati nel relativo PRPL.

Programmazione logica probabilistica

[modifica | modifica wikitesto]

La programmazione logica probabilistica è un paradigma di programmazione che estende la programmazione logica con l'aggiunta della probabilità.

La maggior parte degli approcci alla programmazione logica probabilistica si basa sulla semantica distribuzionale, che suddivide un programma in un insieme di fatti probabilistici e in un programma logico. Un tale programma definisce una distribuzione di probabilità sulle interpretazioni dell'universo di Herbrand del programma. [12]

Elenco dei linguaggi di programmazione probabilistici

[modifica | modifica wikitesto]

L'elenco seguente riassume la varietà di PPL attualmente disponibili e ne chiarisce le origini.

Nome Estensione da Linguaggio Ospite
Analytica C++
bayesloop Python Python
Bean Machine PyTorch Python
Venture Scheme C++
BayesDB SQLite, Python
PRISM B-Prolog
Infer.NET .NET Framework .NET Framework
diff-SAT Answer set programming, SAT (DIMACS CNF)
PSQL SQL
BUGS Component Pascal
Dyna Prolog
Figaro Scala Scala
ProbLog Prolog Python
ProBT C++, Python
Stan BUGS C++
Hakaru Haskell Haskell
BAli-Phy (software) Haskell C++
ProbCog Java, Python
PyMC Python Python
Rainier[13][14] Scala Scala
greta[15] TensorFlow R
pomegranate[16] Python Python
Lea Python Python
WebPPL JavaScript JavaScript
Picture[4] Julia Julia
Turing.jl Julia Julia
Gen[17] Julia Julia
Edward[18] TensorFlow Python
TensorFlow Probability[19] TensorFlow Python
Edward2[20] TensorFlow Probability Python
Pyro[21] PyTorch Python
NumPyro[22] JAX Python
Birch[23] C++
PSI[24] D
Blang[25]
MultiVerse[26] Python Python
Anglican[27] Clojure Clojure
  • Ragionare su variabili come distribuzioni di probabilità risulta difficile a programmatori alle prime armi, ma queste difficoltà possono essere superate attraverso l'uso di visualizzazioni di reti bayesiane e grafici di distribuzioni di variabili incorporati nell'editor del codice sorgente. [28]
  • Poiché molti PPL si basano sulla specifica di distribuzioni a priori sulle variabili di interesse, la formulazione di distribuzioni informative risulta spesso difficile ai principianti. In alcuni casi, librerie come PyMC forniscono metodi automatizzati per trovare la parametrizzazione di distribuzioni a priori informative. [29]

Voci correlate

[modifica | modifica wikitesto]
  1. ^ (EN) Larry Hardesty, Massachusetts Institute of Technology, Probabilistic programming does in 50 lines of code what used to take thousands, su phys.org. URL consultato il 9 novembre 2025.
  2. ^ (EN) ProbProgs, su probabilistic-programming.netlify.com. URL consultato il 9 novembre 2025.
  3. ^ Avi Pfeffer, Practical probabilistic programming, Manning Publications, Co, 2016, p. 28, ISBN 978-1-61729-233-0.
  4. ^ a b c (EN) https://kurzweilai.net/, Short probabilistic programming machine-learning code replaces complex programs for computer-vision tasks «  Kurzweil, su www.kurzweilai.net. URL consultato il 9 novembre 2025 (archiviato dall'url originale il 3 giugno 2023).
  5. ^ (EN) Graphics in reverse, su MIT News | Massachusetts Institute of Technology, 13 aprile 2015. URL consultato il 9 novembre 2025.
  6. ^ (EN) MIT shows off machine-learning script to make CREEPY HEADS. URL consultato il 9 novembre 2025.
  7. ^ (EN) MIT’s Gen programming system flattens the learning curve for AI projects, in VentureBeat, 27 giugno 2019. URL consultato il 9 novembre 2025.
  8. ^ Elizaveta Semenova, Dominic P. Williams e Avid M. Afzal, A Bayesian neural network for toxicity prediction, in Computational Toxicology, vol. 16, 1º novembre 2020, pp. 100133, DOI:10.1016/j.comtox.2020.100133.
  9. ^ Dominic P. Williams, Stanley E. Lazic e Alison J. Foster, Predicting Drug-Induced Liver Injury with Bayesian Machine Learning, in Chemical Research in Toxicology, vol. 33, n. 1, 21 gennaio 2020, pp. 239–248, DOI:10.1021/acs.chemrestox.9b00264.
  10. ^ N.D. Goodman, J. B. Tenenbaum e altri (a cura di), Probabilistic Models of Cognition, 2ª ed., 2016.
  11. ^ (EN) The Algorithms Behind Probabilistic Programming, su blog.fastforwardlabs.com. URL consultato il 9 novembre 2025.
  12. ^ (EN) Luc De Raedt e Angelika Kimmig, Probabilistic (logic) programming concepts, in Machine Learning, vol. 100, n. 1, 1º luglio 2015, pp. 5–47, DOI:10.1007/s10994-015-5494-z. URL consultato il 9 novembre 2025.
  13. ^ https://github.com/stripe/rainier.
  14. ^ Rainier · Bayesian inference for Scala, su samplerainier.com. URL consultato il 26 agosto 2020.
  15. ^ greta: simple and scalable statistical modelling in R, su GitHub. URL consultato il 2 ottobre 2018.
  16. ^ (EN) Home — pomegranate 0.10.0 documentation, su pomegranate.readthedocs.io. URL consultato il 2 ottobre 2018.
  17. ^ Gen: A General Purpose Probabilistic Programming Language with Programmable Inference, su gen.dev. URL consultato l'11 giugno 2024.
  18. ^ Edward – Home, su edwardlib.org. URL consultato il 17 gennaio 2017.
  19. ^ TensorFlow, Introducing TensorFlow Probability, su TensorFlow, 11 aprile 2018. URL consultato il 2 ottobre 2018.
  20. ^ (EN) 'Edward2' TensorFlow Probability module, su GitHub. URL consultato l'11 giugno 2024.
  21. ^ (EN) Pyro, su pyro.ai. URL consultato il 9 febbraio 2018.
  22. ^ (EN) NumPyro, su pyro.ai. URL consultato il 23 luglio 2021.
  23. ^ Probabilistic Programming in Birch, su birch-lang.org. URL consultato il 20 aprile 2018.
  24. ^ PSI Solver - Exact inference for probabilistic programs, su psisolver.org. URL consultato il 18 agosto 2019.
  25. ^ Home, su www.stat.ubc.ca.
  26. ^ (EN) Yura Perov et al., MultiVerse: Causal Reasoning using Importance Sampling in Probabilistic Programming. URL consultato il 12 novembre 2025.
  27. ^ The Anglican Probabilistic Programming System, su probprog.github.io. URL consultato il 7 ottobre 2024.
  28. ^ Maria I. Gorinova, Advait Sarkar e Alan F. Blackwell, Proceedings of the 2016 CHI Conference on Human Factors in Computing Systems, CHI '16, ACM, 1º gennaio 2016, pp. 2533–2537, DOI:10.1145/2858036.2858221, ISBN 9781450333627.
  29. ^ pymc.find_constrained_prior — PyMC dev documentation, su pymc.io. URL consultato il 23 ottobre 2024.