b)] \\ \nonumber
&& - \sum_{i=1}^{N} \alpha_i^* [\epsilon + \xi_i^*+y_i - (\mathbf{W} \cdot
\mathbf{X}_i + b)] \\ \nonumber\end{aligned}$$ where $\alpha_i$ and $\alpha_i*$ are Lagrange multipliers subject to the constraints $0\leq\alpha_i\leq C$, $0\leq\alpha_i^*\leq C$ and $\sum_{i=1}^{N} (\alpha_i - \alpha_i^*) = 0$.

For our analysis, we use the SVR algorithm implemented in the scikit-learn Python library [@Pea11]. We use the default $\epsilon=0.1$ and find that changing this value does not make a noticeable difference in our predictions or the resulting MSE. The algorithm takes in a value for the penalty parameter $C$ from Equation (\[eqn:svr\]) and the kernel. $m$, $\gamma$ and $r$ need also be specified depending on what kernel is being used. Optimal parameter values can be determined by splitting our sample of halos into three equal parts: a training set, a validation set and a test set. We can then train the SVM using some pre-determined grid values: $C=\{100,...,10^9\}$ and $\gamma$ or $r=\{0.1,...,10^{-8}\}$ in powers of 10, and calculate the MSE of the validation set. The parameter values that give the minimum MSE are chosen for our analyses, where we evaluate how well the ML predictions match truth using the test set.

k-Nearest-Neighbours {#sec:knn}
--------------------

The k-Nearest-Neighbours (kNN) algorithm is 