class_docstr: A t-SNE embedding.
  
  Please see the :ref:`parameter-guide` for more information.
  
  Parameters
  ----------
  embedding: np.ndarray
      Initial positions for each data point.
  
  affinities: Affinities
      An affinity index which can be used to compute the affinities of new
      points to the points in the existing embedding. The affinity index also
      contains the affinity matrix :math:`P` used during optimization.
  
  learning_rate: Union[str, float]
      The learning rate for t-SNE optimization. When ``learning_rate="auto"``
      the appropriate learning rate is selected according to N / exaggeration
      as determined in Belkina et al. (2019), Nature Communications. Note that
      this will result in a different learning rate during the early
      exaggeration phase and afterwards. This should *not* be used when 
      adding samples into existing embeddings, where the learning rate often
      needs to be much lower to obtain convergence.
  
  exaggeration: float
      The exaggeration factor is used to increase the attractive forces of
      nearby points, producing more compact clusters.
  
  dof: float
      Degrees of freedom as described in Kobak et al. "Heavy-tailed kernels
      reveal a finer cluster structure in t-SNE visualisations", 2019.
  
  momentum: float
      Momentum accounts for gradient directions from previous iterations,
      resulting in faster convergence.
  
  negative_gradient_method: str
      Specifies the negative gradient approximation method to use. For smaller
      data sets, the Barnes-Hut approximation is appropriate and can be set
      using one of the following aliases: ``bh``, ``BH`` or ``barnes-hut``.
      For larger data sets, the FFT accelerated interpolation method is more
      appropriate and can be set using one of the following aliases: ``fft``,
      ``FFT`` or ``ìnterpolation``.A lternatively, you can use ``auto`` to
      approximately select the faster method.
  
  theta: float
      This is the trade-off parameter between speed and accuracy of the tree
      approximation method. Typical values range from 0.2 to 0.8. The value 0
      indicates that no approximation is to be made and produces exact results
      also producing longer runtime.
  
  n_interpolation_points: int
      Only used when ``negative_gradient_method="fft"`` or its other aliases.
      The number of interpolation points to use within each grid cell for
      interpolation based t-SNE. It is highly recommended leaving this value
      at the default 3.
  
  min_num_intervals: int
      Only used when ``negative_gradient_method="fft"`` or its other aliases.
      The minimum number of grid cells to use, regardless of the
      ``ints_in_interval`` parameter. Higher values provide more accurate
      gradient estimations.
  
  random_state: Union[int, RandomState]
      The random state parameter follows the convention used in scikit-learn.
      If the value is an int, random_state is the seed used by the random
      number generator. If the value is a RandomState instance, then it will
      be used as the random number generator. If the value is None, the random
      number generator is the RandomState instance used by `np.random`.
  
  n_jobs: int
      The number of threads to use while running t-SNE. This follows the
      scikit-learn convention, ``-1`` meaning all processors, ``-2`` meaning
      all but one, etc.
  
  callbacks: Callable[[int, float, np.ndarray] -> bool]
      Callbacks, which will be run every ``callbacks_every_iters`` iterations.
  
  callbacks_every_iters: int
      How many iterations should pass between each time the callbacks are
      invoked.
  
  optimizer: gradient_descent
      Optionally, an existing optimizer can be used for optimization. This is
      useful for keeping momentum gains between different calls to
      :func:`optimize`.
  
  Attributes
  ----------
  kl_divergence: float
      The KL divergence or error of the embedding.
class_docstr_tok: ["A","t-SNE","embedding",".","Please","see","the",":","ref",":","`","parameter-guide","`","for","more","information",".","Parameters","--","--","--","--","--","embedding",":","np.ndarray","Initial","positions","for","each","data","point",".","affinities",":","Affinities","An","affinity","index","which","can","be","used","to","compute","the","affinities","of","new","points","to","the","points","in","the","existing","embedding",".","The","affinity","index","also","contains","the","affinity","matrix",":","math",":","`","P","`","used","during","optimization",".","learning_rate",":","Union","[","str",",","float","]","The","learning","rate","for","t-SNE","optimization",".","When","``","learning_rate=","''","auto","''","``","the","appropriate","learning","rate","is","selected","according","to","N","\/","exaggeration","as","determined","in","Belkina","et","al",".","(","2019",")",",","Nature","Communications",".","Note","that","this","will","result","in","a","different","learning","rate","during","the","early","exaggeration","phase","and","afterwards",".","This","should","*","not","*","be","used","when","adding","samples","into","existing","embeddings",",","where","the","learning","rate","often","needs","to","be","much","lower","to","obtain","convergence",".","exaggeration",":","float","The","exaggeration","factor","is","used","to","increase","the","attractive","forces","of","nearby","points",",","producing","more","compact","clusters",".","dof",":","float","Degrees","of","freedom","as","described","in","Kobak","et","al",".","``","Heavy-tailed","kernels","reveal","a","finer","cluster","structure","in","t-SNE","visualisations","''",",","2019.","momentum",":","float","Momentum","accounts","for","gradient","directions","from","previous","iterations",",","resulting","in","faster","convergence",".","negative_gradient_method",":","str","Specifies","the","negative","gradient","approximation","method","to","use",".","For","smaller","data","sets",",","the","Barnes-Hut","approximation","is","appropriate","and","can","be","set","using","one","of","the","following","aliases",":","``","bh","``",",","``","BH","``","or","``","barnes-hut","``",".","For","larger","data","sets",",","the","FFT","accelerated","interpolation","method","is","more","appropriate","and","can","be","set","using","one","of","the","following","aliases",":","``","fft","``",",","``","FFT","``","or","``","\u00ecnterpolation","``",".A","lternatively",",","you","can","use","``","auto","``","to","approximately","select","the","faster","method",".","theta",":","float","This","is","the","trade-off","parameter","between","speed","and","accuracy","of","the","tree","approximation","method",".","Typical","values","range","from","0.2","to","0.8",".","The","value","0","indicates","that","no","approximation","is","to","be","made","and","produces","exact","results","also","producing","longer","runtime",".","n_interpolation_points",":","int","Only","used","when","``","negative_gradient_method=","''","fft","''","``","or","its","other","aliases",".","The","number","of","interpolation","points","to","use","within","each","grid","cell","for","interpolation","based","t-SNE",".","It","is","highly","recommended","leaving","this","value","at","the","default","3.","min_num_intervals",":","int","Only","used","when","``","negative_gradient_method=","''","fft","''","``","or","its","other","aliases",".","The","minimum","number","of","grid","cells","to","use",",","regardless","of","the","``","ints_in_interval","``","parameter",".","Higher","values","provide","more","accurate","gradient","estimations",".","random_state",":","Union","[","int",",","RandomState","]","The","random","state","parameter","follows","the","convention","used","in","scikit-learn",".","If","the","value","is","an","int",",","random_state","is","the","seed","used","by","the","random","number","generator",".","If","the","value","is","a","RandomState","instance",",","then","it","will","be","used","as","the","random","number","generator",".","If","the","value","is","None",",","the","random","number","generator","is","the","RandomState","instance","used","by","`","np.random","`",".","n_jobs",":","int","The","number","of","threads","to","use","while","running","t-SNE",".","This","follows","the","scikit-learn","convention",",","``","-1","``","meaning","all","processors",",","``","-2","``","meaning","all","but","one",",","etc",".","callbacks",":","Callable","[","[","int",",","float",",","np.ndarray","]","-",">","bool","]","Callbacks",",","which","will","be","run","every","``","callbacks_every_iters","``","iterations",".","callbacks_every_iters",":","int","How","many","iterations","should","pass","between","each","time","the","callbacks","are","invoked",".","optimizer",":","gradient_descent","Optionally",",","an","existing","optimizer","can","be","used","for","optimization",".","This","is","useful","for","keeping","momentum","gains","between","different","calls","to",":","func",":","`","optimize","`",".","Attributes","--","--","--","--","--","kl_divergence",":","float","The","KL","divergence","or","error","of","the","embedding","."]
docstr: Prepare a partial embedding which can be optimized.
  
  Parameters
  ----------
  X: np.ndarray
      The data matrix to be added to the existing embedding.
  
  initialization: Union[np.ndarray, str]
      The initial point positions to be used in the embedding space. Can
      be a precomputed numpy array, ``median``, ``weighted`` or
      ``random``. In all cases, ``median`` of ``weighted`` should be
      preferred.
  
  k: int
      The number of nearest neighbors to consider when initially placing
      the point onto the embedding. This is different from ``perpelxity``
      because perplexity affects optimization while this only affects the
      initial point positions.
  
  **affinity_params: dict
      Additional params to be passed to the ``Affinities.to_new`` method.
      Please see individual :class:`~openTSNE.affinity.Affinities`
      implementations as the parameters differ between implementations.
  
  Returns
  -------
  PartialTSNEEmbedding
      An unoptimized :class:`PartialTSNEEmbedding` object, prepared for
      optimization.
code: def prepare_partial(
      self, X, initialization="median", k=25, **affinity_params
  ):
      """Prepare a partial embedding which can be optimized.
  
      Parameters
      ----------
      X: np.ndarray
          The data matrix to be added to the existing embedding.
  
      initialization: Union[np.ndarray, str]
          The initial point positions to be used in the embedding space. Can
          be a precomputed numpy array, ``median``, ``weighted`` or
          ``random``. In all cases, ``median`` of ``weighted`` should be
          preferred.
  
      k: int
          The number of nearest neighbors to consider when initially placing
          the point onto the embedding. This is different from ``perpelxity``
          because perplexity affects optimization while this only affects the
          initial point positions.
  
      **affinity_params: dict
          Additional params to be passed to the ``Affinities.to_new`` method.
          Please see individual :class:`~openTSNE.affinity.Affinities`
          implementations as the parameters differ between implementations.
  
      Returns
      -------
      PartialTSNEEmbedding
          An unoptimized :class:`PartialTSNEEmbedding` object, prepared for
          optimization.
  
      """
  
      # To maintain perfect backwards compatibility and to handle the very
      # specific case when the user wants to pass in `perplexity` to the
      # multiscale affinity object (multiscale accepts `perplexities`), rename
      # this parameter so everything works
      affinity_signature = inspect.signature(self.affinities.to_new)
      if (
          "perplexities" in affinity_signature.parameters
          and "perplexities" in affinity_signature.parameters
          and "perplexity" in affinity_params
          and "perplexities" not in affinity_params
      ):
          affinity_params["perplexities"] = affinity_params.pop(
              "perplexity"
          )
  
      P, neighbors, distances = self.affinities.to_new(
          X, return_distances=True, **affinity_params
      )
  
      # If initial positions are given in an array, use a copy of that
      if isinstance(initialization, np.ndarray):
          init_checks.num_samples(initialization.shape[0], X.shape[0])
          init_checks.num_dimensions(
              initialization.shape[1], self.shape[1]
          )
  
          embedding = np.array(initialization)
      # Random initialization with isotropic normal distribution
      elif initialization == "random":
          embedding = initialization_scheme.random(
              X, self.shape[1], self.random_state
          )
      elif initialization == "weighted":
          embedding = initialization_scheme.weighted_mean(
              X, self, neighbors[:, :k], distances[:, :k]
          )
      elif initialization == "median":
          embedding = initialization_scheme.median(
              self, neighbors[:, :k]
          )
      else:
          raise ValueError(
              f"Unrecognized initialization scheme `{initialization}`."
          )
  
      return PartialTSNEEmbedding(
          embedding,
          self,
          P=P,
          **self.gradient_descent_params,
      )
  
imports: import inspect
  import logging
  import multiprocessing
  from collections.abc import Iterable
  from types import SimpleNamespace
  from time import time
  import numpy
  from sklearn.base import BaseEstimator
  from openTSNE import _tsne
  from openTSNE import initialization
  from openTSNE.affinity import Affinities, MultiscaleMixture
  from openTSNE.quad_tree import QuadTree
  from openTSNE import utils
label_desc: Use image node_id 4 for calling the TSNEEmbedding obj's underlying member method code with example usage: obj.prepare_partial(X, initialization, k) and returns: PartialTSNEEmbedding