code: def expectation_maximisation_poincare_ball():
      """Apply EM algorithm on three random data clusters."""
      dim = 2
      n_samples = 5
  
      cluster_1 = gs.random.uniform(
          low=0.2, high=0.6, size=(n_samples, dim)
      )
      cluster_2 = gs.random.uniform(
          low=-0.6, high=-0.2, size=(n_samples, dim)
      )
      cluster_3 = gs.random.uniform(
          low=-0.3, high=0, size=(n_samples, dim)
      )
      cluster_3[:, 0] = -cluster_3[:, 0]
  
      data = gs.concatenate((cluster_1, cluster_2, cluster_3), axis=0)
  
      n_clusters = 3
  
      manifold = PoincareBall(dim=2)
  
      EM = RiemannianEM(
          manifold,
          n_gaussians=n_clusters,
          initialisation_method="random",
      )
  
      EM.fit(X=data)
      means = EM.means_
      variances = EM.variances_
      mixture_coefficients = EM.mixture_coefficients_
  
      # Plot result
      plot = plot_gaussian_mixture_distribution(
          manifold,
          data,
          mixture_coefficients,
          means,
          variances,
          plot_precision=100,
          save_path="result.png",
      )
  
      return plot
  
file_path: geomstats/examples/plot_expectation_maximization_ball.py
imports: import os
  import matplotlib.pyplot
  import mpl_toolkits.mplot3d.art3d
  from matplotlib.patches import Circle
  import geomstats.backend
  from geomstats.geometry.poincare_ball import PoincareBall
  from geomstats.learning.expectation_maximization import GaussianMixtureModel, RiemannianEM
label_desc: Use image node_id 2 for calling a global function with example usage: expectation_maximisation_poincare_ball() and returns: plot