code: def select_vmm(
      krange,
      precision,
      null_class,
      x,
      ninit=10,
      bias=None,
      maxiter=100,
      verbose=0,
  ):
      """Return the best von_mises mixture after severla initialization
  
      Parameters
      ----------
      krange: list of ints,
              number of classes to consider
      precision:
      null class:
      x: array of shape(n,3)
         should be on the unit sphere
      ninit: int, optional,
             number of iterations
      maxiter: int, optional,
      bias: array of shape(n),
            a prior probability of not being in the null class
      verbose: Bool, optional
      """
      score = -np.inf
      for k in krange:
          aux = estimate_robust_vmm(
              k, precision, null_class, x, ninit, bias, maxiter
          )
          ll = aux.estimate(x)
          if null_class:
              bic = ll - np.log(x.shape[0]) * k * 3 / x.shape[0]
          else:
              bic = ll - np.log(x.shape[0]) * (k * 3 - 1) / x.shape[0]
          if verbose:
              print(k, bic)
          if bic > score:
              best_model = aux
              score = bic
      return best_model
  
imports: from warnings import warn
  import numpy
label_desc: Use image node_id 2 for calling a global function with example usage: select_vmm(krange, precision, null_class, x, ninit, bias, maxiter, verbose) and returns: best_model