class_docstr: !
  @brief Expectation-Maximization clustering algorithm for Gaussian Mixture Model (GMM).
  @details The algorithm provides only clustering services (unsupervised learning).
            Here an example of data clustering process:
  @code
      from pyclustering.cluster.ema import ema, ema_visualizer
      from pyclustering.utils import read_sample
      from pyclustering.samples.definitions import FCPS_SAMPLES
  
      # Read data from text file.
      sample = read_sample(FCPS_SAMPLES.SAMPLE_LSUN)
  
      # Create EM algorithm to allocated four clusters.
      ema_instance = ema(sample, 3)
  
      # Run clustering process.
      ema_instance.process()
  
      # Get clustering results.
      clusters = ema_instance.get_clusters()
      covariances = ema_instance.get_covariances()
      means = ema_instance.get_centers()
  
      # Visualize obtained clustering results.
      ema_visualizer.show_clusters(clusters, sample, covariances, means)
  @endcode
  
  Here is clustering results of the Expectation-Maximization clustering algorithm where popular sample 'OldFaithful' was used.
  Initial random means and covariances were used in the example. The first step is presented on the left side of the figure and
  final result (the last step) is on the right side:
  @image html ema_old_faithful_clustering.png
  
  @see ema_visualizer
  @see ema_observer
code: def __expectation_step(self):
      self.__gaussians = [[] for _ in range(self.__amount_clusters)]
      for index in range(self.__amount_clusters):
          self.__gaussians[index] = gaussian(
              self.__data, self.__means[index], self.__variances[index]
          )
  
      self.__rc = [
          [0.0] * len(self.__data)
          for _ in range(self.__amount_clusters)
      ]
      for index_cluster in range(self.__amount_clusters):
          for index_point in range(len(self.__data)):
              self.__rc[index_cluster][
                  index_point
              ] = self.__probabilities(index_cluster, index_point)
  
imports: import numpy
  import random
  from pyclustering.cluster import cluster_visualizer
  from pyclustering.cluster.center_initializer import kmeans_plusplus_initializer
  from pyclustering.cluster.kmeans import kmeans
  from pyclustering.utils import pi, calculate_ellipse_description, euclidean_distance_square
  from enum import IntEnum
  import matplotlib.pyplot
  import matplotlib.animation
  from matplotlib import patches
label_desc: Use image node_id 12 for calling the ema obj's underlying member method code with example usage: obj.__expectation_step() without return types