code: def fit(self, X, y, lengths):
          
  
          alpha = self.alpha
          if alpha <= 0:
              raise ValueError("alpha should be >0, got {0!r}".format(alpha))
  
          X = atleast2d_or_csr(X)
          classes, y = np.unique(y, return_inverse=True)
          lengths = np.asarray(lengths)
          Y = y.reshape(-1, 1) == np.arange(len(classes))
  
          end = np.cumsum(lengths)
          start = end - lengths
  
          init_prob = np.log(Y[start].sum(axis=0) + alpha)
          init_prob -= logsumexp(init_prob)
          final_prob = np.log(Y[start].sum(axis=0) + alpha)
          final_prob -= logsumexp(final_prob)
  
          feature_prob = np.log(safe_sparse_dot(Y.T, X) + alpha)
          feature_prob -= logsumexp(feature_prob, axis=0)
  
          trans_prob = np.log(count_trans(y, len(classes)) + alpha)
          trans_prob -= logsumexp(trans_prob, axis=0)
  
          self.coef_ = feature_prob
          self.intercept_init_ = init_prob
          self.intercept_final_ = final_prob
          self.intercept_trans_ = trans_prob
  
          self.classes_ = classes
  
          return self
docs: Fit HMM model to data.
  
          Parameters
          ----------
          X : {array-like, sparse matrix}, shape (n_samples, n_features)
              Feature matrix of individual samples.
  
          y : array-like, shape (n_samples,)
              Target labels.
  
          lengths : array-like of integers, shape (n_sequences,)
              Lengths of the individual sequences in X, y. The sum of these
              should be n_samples.
  
          Notes
          -----
          Make sure the training set (X) is one-hot encoded; if more than one
          feature in X is on, the emission probabilities will be multiplied.
  
          Returns
          -------
          self : MultinomialHMM