class_docstr: Black Box Variational Inference
  
  Parameters
  ----------
  neg_posterior : function
      posterior function
  
  q : List
      list holding distribution objects
  
  sims : int
      Number of Monte Carlo sims for the gradient
  
  step : float
      Step size for RMSProp
  
  iterations: int
      How many iterations to run
  
  record_elbo : boolean
      Whether to record the ELBO at every iteration
  
  quiet_progress : boolean
      Whether to print progress or stay quiet
code: def __init__(
      self,
      neg_posterior,
      q,
      sims,
      optimizer="RMSProp",
      iterations=1000,
      learning_rate=0.001,
      record_elbo=False,
      quiet_progress=False,
  ):
      self.neg_posterior = neg_posterior
      self.q = q
      self.sims = sims
      self.iterations = iterations
      self.approx_param_no = np.array([i.param_no for i in self.q])
      self.optimizer = optimizer
      self.printer = True
      self.learning_rate = learning_rate
      self.record_elbo = record_elbo
      self.quiet_progress = quiet_progress
  
imports: import sys
  import numpy
  import scipy.stats
  from .stoch_optim import RMSProp, ADAM
  from .bbvi_routines import alpha_recursion, log_p_posterior, mb_log_p_posterior
label_desc: Use image node_id 1 to create a new BBVI object from inherited base classes: object with example: obj = BBVI(neg_posterior, q, sims, optimizer, iterations, learning_rate, record_elbo, quiet_progress)