Gaussian Process Regression
Authors: Frances Chong and Jacobus Philip Haupt
What is the problem?
Gaussian Process regression (GPR, or Kriging) is a non-parametric, kernel-based, supervised machine learning algorithm, where interpolated values are modeled by a Gaussian process. It has applications in a wide range of fields, including mining, remote sensing, environmental sciences, and more recently computational chemistry.
What is the something extra?
We used GPR to predict the ground state energy and molecular configuration of the hydronium molecule based on data found here: https://scholarblogs.emory.edu/bowman/potential-energy-surfaces/ (this involved parsing the data, preliminary calculations, doing a basic search, and also generalising our algorithm to arbitrary dimensions).
We also used a plotting library to plot the mean prediction, priors, and posteriors of the 1-dimensional case. The 1-dimensional case also works on any input function.
What did we learn from doing this?
Besides everything we learned about Gaussian process regression (neither of us were experienced with it prior), we also learned how about different Haskell packages and types, and numerical computing in Haskell. Two key advantages we noticed with Haskell are that it's fast (even compared to popular languages for machine learning, like Python), and lazy evaluation means we do not make meaningless large-scale calculations (sometimes there might be a part of the code that isn't necessarily used, at least not right away, and since we are dealing with big data this can be really tiresome -- Haskell prevents this problem!). Two disadvantages we noticed were that Haskell has very little support for machine learning, optimisation, and matrix computation (compared to, say, Python), and that because Haskell is strongly typed, it is easy to run into annoying problems (especially when using several packages) and difficult to quickly prototype models (for example, we needed two squared exponential kernel functions since we originally had input of type Vector Double, but then we had input type Matrix R). There is a lot of converting between types to make the code usable (whereas in other languages many types are compatible in a single operation), e.g. flatten, toVector, asColumn, toColumns, col, row, ...
Links to code etc
Some additional writeup in the readme file as well.