## 2 Materials and Methods
### Neural Networks--Autoencoders  
In recent years, neural networks have gained popularity as state-of-the-art machine learning models. There are multiple neural network architectures, each of which is optimally suited for addressing distinct problem types. The fully connected neural network is widely regarded as the most prevalent type of neural network. The fundamental component of a neural network is the neuron, which is also referred to as a node [11]. The vertical arrangement of numerous neurons creates a layer. In the context of neural networks, the initial stratum is commonly referred to as the input layer, while the final stratum is designated as the output layer. The number of nodes in the input layer corresponds to the number of features in the model, while the number of nodes in the output layer corresponds to the desired output. The intermediary strata within neural network architecture are commonly referred to as hidden layers. The number of hidden layers may vary based on the intricacy of the problem at hand. The variability of the number of neurons in each hidden layer is contingent upon the intricacy of the problem at hand. The determination of the optimal number of hidden layers and neurons is not governed by a universal principle. Typically, the determination of such a choice is derived from practical knowledge and trial and error, and it tends to vary based on the specific dataset and problem at hand. The determination of parameters and the number of layers in a neural network is a crucial aspect of designing an effective and efficient model. In this study, these architectural choices were made based on the following: (a) starting with and focusing on simple architectures (for example, for both the encoder and the decoder, we tried to have a low number of hidden layers and number of neurons per layer), (b) performing hyperparameter tuning to find the optimal values for hyperparameters (see Section 2.4), and (c) using regularization techniques (like dropout and weight decay) to avoid overfitting. The process of training a neural network involves sequential observations passing through the network, followed by forward and backward propagation [11]. The process entails sequentially transmitting the input, from left to right, through the network's layers. Each layer executes a basic calculation (transformation) on the input and transmits the resulting output to the subsequent layer. The computation involves a linear combination of the input for every layer, which is weighted. Subsequently, an activation function, also referred to as non-linear transformation, is applied prior to passing the output to the next layer. The aforementioned procedure is iteratively executed until the input data traverse the entirety of the neural network. Upon completion of the forward propagation process, the error is computed by measuring the discrepancy between the output and the anticipated output in relation to the loss function. The method of modifying the biases and weights of a network is known as backward propagation [11]. The ultimate objective of this particular stage is to reduce the cost function value. The definition of the cost value in our application was the typical loss function, where the Kullback-Leibler (KL) loss part and the reconstruction part were equally weighted. The gradient of the error function with respect to the weights was used to update the weights during the training process. This was done in a right-to-left manner, where the end goal was to minimize the error function by adjusting the weights in small incremental steps. The complete iteration of both forward and backward propagation over the entire dataset is referred to as an \"epoch\" in the context of machine learning. Upon the completion of every epoch, the loss function, which represents the error, is computed. The objective is to select a suitable quantity of epochs such that the error attains convergence. The number of epochs may fluctuate based on the intricacy of the problem at hand.