class_docstr: A density based clustering method that expands clusters from 
  samples that have more neighbors within a radius specified by eps
  than the value min_samples.
  
  Parameters:
  -----------
  eps: float
      The radius within which samples are considered neighbors
  min_samples: int
      The number of neighbors required for the sample to be a core point. 
code: def predict(self, X):
      self.X = X
      self.clusters = []
      self.visited_samples = []
      self.neighbors = {}
      n_samples = np.shape(self.X)[0]
      # Iterate through samples and expand clusters from them
      # if they have more neighbors than self.min_samples
      for sample_i in range(n_samples):
          if sample_i in self.visited_samples:
              continue
          self.neighbors[sample_i] = self._get_neighbors(sample_i)
          if len(self.neighbors[sample_i]) >= self.min_samples:
              # If core point => mark as visited
              self.visited_samples.append(sample_i)
              # Sample has more neighbors than self.min_samples => expand
              # cluster from sample
              new_cluster = self._expand_cluster(
                  sample_i, self.neighbors[sample_i]
              )
              # Add cluster to list of clusters
              self.clusters.append(new_cluster)
  
      # Get the resulting cluster labels
      cluster_labels = self._get_cluster_labels()
      return cluster_labels
  
file_path: ML-From-Scratch/mlfromscratch/unsupervised_learning/dbscan.py
imports: from __future__ import print_function, division
  import numpy
  from mlfromscratch.utils import Plot, euclidean_distance, normalize
label_desc: Use image node_id 5 for calling the DBSCAN obj's underlying member method code with example usage: obj.predict(X) and returns: cluster_labels