btw, Python programmers have the option of pymc3 https://docs.pymc.io/
btw, Python programmers have the option of pymc3 https://docs.pymc.io/
It is particularly strong when you want to build a data processing/analysis pipeline for moderate amounts of data (say, below a TB). With the fantastic built-in concurrency support, small external tools (core.async parallel pipelines and perhaps aphyr/tesser for parallel reducers) and the performance of the JVM, you can crunch through these amounts of data on a laptop, without involving anything bigger like hadoop. Saves time and makes for good consulting margins (I speak from experience).
It also happens to be the language which I use to develop fairly large applications, so I guess you could call me biased :-)
At first glance, maybe Common Lisp would have made more sense. As far as I'm aware, the CFFI is pretty good, which means you can interact with other machine learning code that is largely written in C under the hood.
That said, there is a mature machine learning ecosystem for the JVM, not to mention the prospect of running massive probabilistic models on Yarn or Spark.
By the way, there are many probabilistic programming languages in addition to PyMC3. There are Stan, Edward, Pyro (fairly new), and even the venerable BUGS/JAGS.
As most language decisions for new projects, it probably came down to "it's their favorite language".
> btw, Python programmers have the option of pymc3 https://docs.pymc.io/
And Edward (http://edwardlib.org/), "Pyro" (http://pyro.ai/) and "ProbTorch" (https://github.com/probtorch/probtorch).
The first built on TensorFlow, the latter two on PyTorch.
Stan (http://mc-stan.org/) also has python bindings: https://pystan.readthedocs.io/en/latest/
It probably came down to a coin flip.
Also there is some tradition on using lisps for AI; church, for example, is implemented on top of scheme.
Other probabilistic programming languages use prolog as ascendent and Prolog and lisps such as clojure are quite related.
But I don’t know if these were the reasons :)
An important design feature is that it is 'anti-DSL' --- the syntax is exactly the Clojure syntax. But the program is transformed into an extended CPS form and run through inference executor. There is an academic paper written by Anglican team explaining the design and internals:
> An important design feature is that it is 'anti-DSL' --- the syntax is exactly the Clojure syntax.
This is not "anti-DSL", this is what gives Anglican embedded DSL qualities.
And yet there are limitations: «The border between Clojure and Anglican is subtle and usually will pose no problem to most programmers, however, some confusion can arise from the fact that Anglican programs are macro compiled into CPS-style Clojure functions. This means that some wrapping of “native” Clojure functions needs to happen in order to use them in Anglican. Errors arising due to misunderstanding this boundary crop up in the form of “wrong number of argument” exceptions».
Would that language border, wrapping of functions and transformation to CPS be still necessary in a language with native support for continuations?
A language with native support of continuations is a nice toy but does not bring practical benefits to implementing CPS state monad.