code: def fit(self, X):
          
          embedding = self.prepare_initial(X)
  
          try:
              # Early exaggeration with lower momentum to allow points to find more
              # easily move around and find their neighbors
              embedding.optimize(
                  n_iter=self.early_exaggeration_iter,
                  exaggeration=self.early_exaggeration,
                  momentum=self.initial_momentum,
                  inplace=True,
                  propagate_exception=True,
              )
  
              # Restore actual affinity probabilities and increase momentum to get
              # final, optimized embedding
              embedding.optimize(
                  n_iter=self.n_iter,
                  exaggeration=self.exaggeration,
                  momentum=self.final_momentum,
                  inplace=True,
                  propagate_exception=True,
              )
  
          except OptimizationInterrupt as ex:
              log.info("Optimization was interrupted with callback.")
              embedding = ex.final_embedding
  
          return embedding
docs: Fit a t-SNE embedding for a given data set.
  
          Runs the standard t-SNE optimization, consisting of the early
          exaggeration phase and a normal optimization phase.
  
          Parameters
          ----------
          X: np.ndarray
              The data matrix to be embedded.
  
          Returns
          -------
          TSNEEmbedding
              A fully optimized t-SNE embedding.