class_docstr: Enables dimensionality reduction for multiple
  class distributions. It transforms the features space into a space where
  the between class scatter is maximized and the within class scatter is
  minimized.
  
  Parameters:
  -----------
  solver: str
      If 'svd' we use the pseudo-inverse to calculate the inverse of matrices
      when doing the transformation.
code: def transform(self, X, y, n_components):
      SW, SB = self._calculate_scatter_matrices(X, y)
  
      # Determine SW^-1 * SB by calculating inverse of SW
      A = np.linalg.inv(SW).dot(SB)
  
      # Get eigenvalues and eigenvectors of SW^-1 * SB
      eigenvalues, eigenvectors = np.linalg.eigh(A)
  
      # Sort the eigenvalues and corresponding eigenvectors from largest
      # to smallest eigenvalue and select the first n_components
      idx = eigenvalues.argsort()[::-1]
      eigenvalues = eigenvalues[idx][:n_components]
      eigenvectors = eigenvectors[:, idx][:, :n_components]
  
      # Project the data onto eigenvectors
      X_transformed = X.dot(eigenvectors)
  
      return X_transformed
  
file_path: ML-From-Scratch/mlfromscratch/supervised_learning/multi_class_lda.py
imports: from __future__ import print_function, division
  import matplotlib.pyplot
  import numpy
  from mlfromscratch.utils import calculate_covariance_matrix, normalize, standardize
label_desc: Use image node_id 3 for calling the MultiClassLDA obj's underlying member method code with example usage: obj.transform(X, y, n_components) and returns: X_transformed