class_docstr: A probabilistic clustering method for determining groupings among data samples.
  
  Parameters:
  -----------
  k: int
      The number of clusters the algorithm will form.
  max_iterations: int
      The number of iterations the algorithm will run for if it does
      not converge before that. 
  tolerance: float
      If the difference of the results from one iteration to the next is
      smaller than this value we will say that the algorithm has converged.
class_docstr_tok: ["A","probabilistic","clustering","method","for","determining","groupings","among","data","samples",".","Parameters",":","--","--","--","--","--","-","k",":","int","The","number","of","clusters","the","algorithm","will","form",".","max_iterations",":","int","The","number","of","iterations","the","algorithm","will","run","for","if","it","does","not","converge","before","that",".","tolerance",":","float","If","the","difference","of","the","results","from","one","iteration","to","the","next","is","smaller","than","this","value","we","will","say","that","the","algorithm","has","converged","."]
code: def __init__(self, k=2, max_iterations=2000, tolerance=1e-8):
      self.k = k
      self.parameters = []
      self.max_iterations = max_iterations
      self.tolerance = tolerance
      self.responsibilities = []
      self.sample_assignments = None
      self.responsibility = None
  
file_path: ML-From-Scratch/mlfromscratch/unsupervised_learning/gaussian_mixture_model.py
imports: from __future__ import division, print_function
  import math
  from sklearn import datasets
  import numpy
  from mlfromscratch.utils import normalize, euclidean_distance, calculate_covariance_matrix
  from mlfromscratch.utils import Plot
label_desc: Use image node_id 1 to create a new GaussianMixtureModel object  with example: obj = GaussianMixtureModel(k, max_iterations, tolerance)