class_docstr: The ChangePoints kernel defines a fixed number of change-points along a 1d
  input space where different kernels govern different parts of the space.
  
  The kernel is by multiplication and addition of the base kernels with
  sigmoid functions (σ). A single change-point kernel is defined as::
  
      K₁(x, x') * (1 - σ(x)) * (1 - σ(x')) + K₂(x, x') * σ(x) * σ(x')
  
  where K₁ is deactivated around the change-point and K₂ is activated. The
  single change-point version can be found in :cite:t:`lloyd2014`. Each sigmoid
  is a logistic function defined as::
  
      σ(x) = 1 / (1 + exp{-s(x - x₀)})
  
  parameterized by location "x₀" and steepness "s".
  
  The key reference is :cite:t:`lloyd2014`.
docstr: :param kernels: list of kernels defining the different regimes
  :param locations: list of change-point locations in the 1d input space
  :param steepness: the steepness parameter(s) of the sigmoids, this can be
      common between them or decoupled
docstr_tok: [":","param","kernels",":","list","of","kernels","defining","the","different","regimes",":","param","locations",":","list","of","change-point","locations","in","the","1d","input","space",":","param","steepness",":","the","steepness","parameter","(","s",")","of","the","sigmoids",",","this","can","be","common","between","them","or","decoupled"]
code: def __init__(
      self,
      kernels: Sequence[Kernel],
      locations: TensorType,
      steepness: TensorType = 1.0,
      name: Optional[str] = None,
  ):
      """
      :param kernels: list of kernels defining the different regimes
      :param locations: list of change-point locations in the 1d input space
      :param steepness: the steepness parameter(s) of the sigmoids, this can be
          common between them or decoupled
      """
      if len(kernels) != len(locations) + 1:
          raise ValueError(
              "Number of kernels ({nk}) must be one more than the number of "
              "changepoint locations ({nl})".format(
                  nk=len(kernels), nl=len(locations)
              )
          )
  
      if isinstance(steepness, Sequence) and len(steepness) != len(
          locations
      ):
          raise ValueError(
              "Dimension of steepness ({ns}) does not match number of changepoint "
              "locations ({nl})".format(
                  ns=len(steepness), nl=len(locations)
              )
          )
  
      super().__init__(kernels, name=name)
  
      self.locations = Parameter(locations)
      self.steepness = Parameter(steepness, transform=positive())
  
file_path: GPflow/gpflow/kernels/changepoints.py
imports: from typing import Optional, Sequence
  import tensorflow
  from check_shapes import check_shape
  from check_shapes import check_shapes, inherit_check_shapes
  from ..base import Parameter, TensorType
  from ..utilities import positive
  from .base import Combination, Kernel
label_desc: Use image node_id 1 to create a new ChangePoints object from inherited base classes: Combination with example: obj = ChangePoints(kernels, locations, steepness, name)