class_docstr: Kernel Density Estimation
  
  Read more in the :ref:`User Guide <kernel_density>`.
  
  Parameters
  ----------
  bandwidth : float
      The bandwidth of the kernel.
  
  algorithm : string
      The tree algorithm to use.  Valid options are
      ['kd_tree'|'ball_tree'|'auto'].  Default is 'auto'.
  
  kernel : string
      The kernel to use.  Valid kernels are
      ['gaussian'|'tophat'|'epanechnikov'|'exponential'|'linear'|'cosine']
      Default is 'gaussian'.
  
  metric : string
      The distance metric to use.  Note that not all metrics are
      valid with all algorithms.  Refer to the documentation of
      :class:`BallTree` and :class:`KDTree` for a description of
      available algorithms.  Note that the normalization of the density
      output is correct only for the Euclidean distance metric. Default
      is 'euclidean'.
  
  atol : float
      The desired absolute tolerance of the result.  A larger tolerance will
      generally lead to faster execution. Default is 0.
  
  rtol : float
      The desired relative tolerance of the result.  A larger tolerance will
      generally lead to faster execution.  Default is 1E-8.
  
  breadth_first : boolean
      If true (default), use a breadth-first approach to the problem.
      Otherwise use a depth-first approach.
  
  leaf_size : int
      Specify the leaf size of the underlying tree.  See :class:`BallTree`
      or :class:`KDTree` for details.  Default is 40.
  
  metric_params : dict
      Additional parameters to be passed to the tree for use with the
      metric.  For more information, see the documentation of
      :class:`BallTree` or :class:`KDTree`.
code: def _choose_algorithm(self, algorithm, metric):
      # given the algorithm string + metric string, choose the optimal
      # algorithm to compute the result.
      if algorithm == "auto":
          # use KD Tree if possible
          if metric in KDTree.valid_metrics:
              return "kd_tree"
          elif metric in BallTree.valid_metrics:
              return "ball_tree"
          else:
              raise ValueError("invalid metric: '{0}'".format(metric))
      elif algorithm in TREE_DICT:
          if metric not in TREE_DICT[algorithm].valid_metrics:
              raise ValueError(
                  "invalid metric for {0}: "
                  "'{1}'".format(TREE_DICT[algorithm], metric)
              )
          return algorithm
      else:
          raise ValueError("invalid algorithm: '{0}'".format(algorithm))
  
file_path: catboost/contrib/python/scikit-learn/py2/sklearn/neighbors/kde.py
imports: import numpy
  from scipy.special import gammainc
  from ..base import BaseEstimator
  from ..utils import check_array, check_random_state
  from ..utils.extmath import row_norms
  from .ball_tree import BallTree, DTYPE
  from .kd_tree import KDTree
label_desc: Use image node_id 2 for calling the KernelDensity obj's underlying member method code with example usage: obj._choose_algorithm(algorithm, metric) and returns: str, algorithm, str