class_docstr: **Stein Variational Gradient Descent**
  
  This inference is based on Kernelized Stein Discrepancy
  it's main idea is to move initial noisy particles so that
  they fit target distribution best.
  
  Algorithm is outlined below
  
  *Input:* A target distribution with density function :math:`p(x)`
          and a set of initial particles :math:`\{x^0_i\}^n_{i=1}`
  
  *Output:* A set of particles :math:`\{x^{*}_i\}^n_{i=1}` that approximates the target distribution.
  
  .. math::
  
      x_i^{l+1} &\leftarrow x_i^{l} + \epsilon_l \hat{\phi}^{*}(x_i^l) \\
      \hat{\phi}^{*}(x) &= \frac{1}{n}\sum^{n}_{j=1}[k(x^l_j,x) \nabla_{x^l_j} logp(x^l_j)+ \nabla_{x^l_j} k(x^l_j,x)]
  
  Parameters
  ----------
  n_particles: `int`
      number of particles to use for approximation
  jitter: `float`
      noise sd for initial point
  model: :class:`pymc.Model`
      PyMC model for inference
  kernel: `callable`
      kernel function for KSD :math:`f(histogram) -> (k(x,.), \nabla_x k(x,.))`
  temperature: float
      parameter responsible for exploration, higher temperature gives more broad posterior estimate
  start: `dict[str, np.ndarray]` or `StartDict`
      initial point for inference
  random_seed: None or int
  kwargs: other keyword arguments passed to estimator
  
  References
  ----------
  -   Qiang Liu, Dilin Wang (2016)
      Stein Variational Gradient Descent: A General Purpose Bayesian Inference Algorithm
      arXiv:1608.04471
  
  -   Yang Liu, Prajit Ramachandran, Qiang Liu, Jian Peng (2017)
      Stein Variational Policy Gradient
      arXiv:1704.02399
code: def __init__(
      self,
      n_particles=100,
      jitter=1,
      model=None,
      start=None,
      random_seed=None,
      estimator=KSD,
      kernel=test_functions.rbf,
      **kwargs,
  ):
      empirical = Empirical(
          size=n_particles,
          jitter=jitter,
          start=start,
          model=model,
          random_seed=random_seed,
      )
      super().__init__(
          approx=empirical, estimator=estimator, kernel=kernel, **kwargs
      )
  
imports: import collections
  import logging
  import warnings
  import numpy
  from fastprogress.fastprogress import progress_bar
  import pymc
  from pymc.variational import test_functions
  from pymc.variational.approximations import Empirical, FullRank, MeanField
  from pymc.variational.operators import KL, KSD
label_desc: Use image node_id 1 to create a new SVGD object from inherited base classes: ImplicitGradient with example: obj = SVGD(n_particles, jitter, model, start, random_seed, estimator, kernel)