docstr: data is a tuple of X, Y with X, a data matrix, size [N, D] and Y, a data matrix, size [N, R]
  kernel, likelihood, mean_function are appropriate GPflow objects
  
  This is a vanilla implementation of a GP with a non-Gaussian
  likelihood. The latent function values are represented by centered
  (whitened) variables, so
  
      v ~ N(0, I)
      f = Lv + m(x)
  
  with
  
      L L^T = K
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","]","kernel",",","likelihood",",","mean_function","are","appropriate","GPflow","objects","This","is","a","vanilla","implementation","of","a","GP","with","a","non-Gaussian","likelihood",".","The","latent","function","values","are","represented","by","centered","(","whitened",")","variables",",","so","v","~","N","(","0",",","I",")","f","=","Lv","+","m","(","x",")","with","L","L^T","=","K"]
code: def __init__(
      self,
      data: RegressionData,
      kernel: Kernel,
      likelihood: Likelihood,
      mean_function: Optional[MeanFunction] = None,
      num_latent_gps: Optional[int] = None,
  ):
      """
      data is a tuple of X, Y with X, a data matrix, size [N, D] and Y, a data matrix, size [N, R]
      kernel, likelihood, mean_function are appropriate GPflow objects
  
      This is a vanilla implementation of a GP with a non-Gaussian
      likelihood. The latent function values are represented by centered
      (whitened) variables, so
  
          v ~ N(0, I)
          f = Lv + m(x)
  
      with
  
          L L^T = K
  
      """
      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
      )
      self.data = data_input_to_tensor(data)
      self.num_data = self.data[0].shape[0]
      self.V = Parameter(np.zeros((self.num_data, 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 ..config import default_float, default_jitter
  from ..kernels import Kernel
  from ..likelihoods import Likelihood
  from ..mean_functions import MeanFunction
  from ..utilities import assert_params_false, to_default_float
  from .model import GPModel
  from .training_mixins import InternalDataTrainingLossMixin
  from .util import data_input_to_tensor
label_desc: Use image node_id 1 to create a new GPMC object from inherited base classes: GPModel, InternalDataTrainingLossMixin with example: obj = GPMC(data, kernel, likelihood, mean_function, num_latent_gps)