class_docstr: This is the Sparse Variational GP using MCMC (SGPMC).
  
  The key reference is :cite:t:`hensman2015mcmc`.
  
  The latent function values are represented by centered
  (whitened) variables, so
  
  .. math::
     :nowrap:
  
     \begin{align}
     \mathbf v & \sim N(0, \mathbf I) \\
     \mathbf u &= \mathbf L\mathbf v
     \end{align}
  
  with
  
  .. math::
      \mathbf L \mathbf L^\top = \mathbf K
docstr: data is a tuple of X, Y with X, a data matrix, size [N, D] and Y, a data matrix, size [N, R]
  Z is a data matrix, of inducing inputs, size [M, D]
  kernel, likelihood, mean_function are appropriate GPflow objects
docstr_tok: ["data","is","a","tuple","of","X",",","Y","with","X",",","a","data","matrix",",","size","[","N",",","D","]","and","Y",",","a","data","matrix",",","size","[","N",",","R","]","Z","is","a","data","matrix",",","of","inducing","inputs",",","size","[","M",",","D","]","kernel",",","likelihood",",","mean_function","are","appropriate","GPflow","objects"]
code: def __init__(
      self,
      data: RegressionData,
      kernel: Kernel,
      likelihood: Likelihood,
      mean_function: Optional[MeanFunction] = None,
      num_latent_gps: Optional[int] = None,
      inducing_variable: Optional[InducingPointsLike] = None,
  ):
      """
      data is a tuple of X, Y with X, a data matrix, size [N, D] and Y, a data matrix, size [N, R]
      Z is a data matrix, of inducing inputs, size [M, D]
      kernel, likelihood, mean_function are appropriate GPflow objects
      """
      if num_latent_gps is None:
          num_latent_gps = self.calc_num_latent_gps_from_data(
              data, kernel, likelihood
          )
      super().__init__(
          kernel,
          likelihood,
          mean_function,
          num_latent_gps=num_latent_gps,
      )
      self.data = data_input_to_tensor(data)
      self.num_data = data[0].shape[0]
      self.inducing_variable = inducingpoint_wrapper(inducing_variable)
      self.V = Parameter(
          np.zeros(
              (self.inducing_variable.num_inducing, self.num_latent_gps)
          )
      )
      self.V.prior = tfp.distributions.Normal(
          loc=to_default_float(0.0), scale=to_default_float(1.0)
      )
  
imports: from typing import Optional
  import numpy
  import tensorflow
  import tensorflow_probability
  from check_shapes import check_shapes, inherit_check_shapes
  from ..base import InputData, MeanAndVariance, Parameter, RegressionData
  from ..conditionals import conditional
  from ..kernels import Kernel
  from ..likelihoods import Likelihood
  from ..mean_functions import MeanFunction
  from ..utilities import to_default_float
  from .model import GPModel
  from .training_mixins import InternalDataTrainingLossMixin
  from .util import InducingPointsLike, data_input_to_tensor, inducingpoint_wrapper
label_desc: Use image node_id 1 to create a new SGPMC object from inherited base classes: GPModel, InternalDataTrainingLossMixin with example: obj = SGPMC(data, kernel, likelihood, mean_function, num_latent_gps, inducing_variable)