code: def fit(self, X, y=None):
          
          if self.metric != 'precomputed':
              X = check_array(X, accept_sparse='csr')
              self._raw_data = X
          elif issparse(X):
              # Handle sparse precomputed distance matrices separately
              X = check_array(X, accept_sparse='csr')
          else:
              # Only non-sparse, precomputed distance matrices are allowed
              #   to have numpy.inf values indicating missing distances
              check_precomputed_distance_matrix(X)
  
          kwargs = self.get_params()
          # prediction data only applies to the persistent model, so remove
          # it from the keyword args we pass on the the function
          kwargs.pop('prediction_data', None)
          kwargs.update(self._metric_kwargs)
  
          (self.labels_,
           self.probabilities_,
           self.cluster_persistence_,
           self._condensed_tree,
           self._single_linkage_tree,
           self._min_spanning_tree) = hdbscan(X, **kwargs)
  
          if self.prediction_data:
              self.generate_prediction_data()
  
          return self
docs: Perform HDBSCAN clustering from features or distance matrix.
  
          Parameters
          ----------
          X : array or sparse (CSR) matrix of shape (n_samples, n_features), or \
                  array of shape (n_samples, n_samples)
              A feature array, or array of distances between samples if
              ``metric='precomputed'``.
  
          Returns
          -------
          self : object
              Returns self