## 2 Materials and Methods
### Deep Learning  
Deep Learning applications were programmed in Python ([[https://www.python.org/](https://www.python.org/)]([https://www.python.org/](https://www.python.org/))), using a number of different packages that can be consulted in Appendix A Table 11. Algorithms conceptualized for supervised training and classification of samples consisted in the development of Feed Forward Neural Networks (FFNN). Neural Networks are modeled and coded to replicate brain patterns that are able to process highly complex and large sets of data [41], consisting of multiple nodes or perceptrons, which are connected by weighted axons or edges. These networks are designed to recognize patterns in order to interpret data, utilizing components of mathematics, calculus, linear algebra, and statistics to train and perform different tasks [42; 43]. Likewise, this can be performed in a supervised, semisuperized, or unsupervised manner. The FFNN designed for this study was constructed in TensorFlow 2.0 using the Keras API [41]. All Deep Learning implications were therefore run using TensorFlow as a backend engine on a portable laptop's CPU (Intel(r) CoreTM i5 6300 HQ), executed in a Conda ([[https://www.anaconda.com](https://www.anaconda.com)]([https://www.anaconda.com](https://www.anaconda.com))) virtual environment. The network was trained using the PC scores as dependencies, employing NumPy to convert PC scores into 64-bit floating point matrices. The associated class labels were indexed as separate 64-bit floating point vectors. PC scores are frequently used in Machine and Deep Learning as a method for projecting high-dimensional data into a new feature space that is useful for the training of AI models. Here we used the top 10 PC scores, representing 93% of the sample's variance, using these PC scores to train models to classify unknown individuals. A combination of neurons in a mixture of hidden layers are then used to map out the relationships between the dependency inputs (\(x\)) and the label outputs (\(y\)) [42; 43]. A generalized mathematical representation of a single neuron can thus be represented as [42]:  
\[y(x)=f\!\left(\sum_{i=1}^{n}w_{i}x_{i}\right) \tag{1}\]  
where \(w\) are the weights connecting each neuron and \(f\!\left(\right)\) represents an activation function that varies according to the position within the network [42]. Considering the case at hand consists in a binary classification problem, the label values were converted into a string of 1s and 0s indicating whether the tajhonomic trace is anthropic (1) or not (0). In order to ensure that the model therefore only produces an output between 1 and 0, a sigmoid activation function is used for the final layer, described mathematically as [42]:  
\[f(x)=\frac{1}{1+e^{-x}} \tag{2}\]  
While all hidden layers were activated using the Rectified Linear Unit (ReLU) function [42]:  
\[f(x)=\max(0,x) \tag{3}\]  
During the learning process, the training of the model searches for the optimal combination of weights that can efficiently map out the \(y(x)\) relationship. Neural Networks are stochastic; therefore, weight initialization is performed at random [41, 42, 43, 44]. The tuning of these weights was performed using back propagation and gradient descent via a stochastic optimization algorithm [42, 43, 45, 46, 47, 48] and a binary cross entropy loss function [42, 43]. For the purpose of configuring the neural network and finding the right hyperparameters during optimization, a series of trial runs were performed. These alternated between different combinations of hyperparameters, searching for the best results without overfitting. These trials employed typical practices of Deep Learning techniques [44], including changing the number of hidden layers, number of neurons per layer, batch size, epoch size, kernel constraints, weight regularization, the presence, position, or threshold of dropout layers as well as different optimization algorithms and learning rates.