class_docstr: Speeds up inference calls to MatrixFactorization models by using an
  `Annoy <https://github.com/spotify/annoy>`_ index to calculate similar items and
  recommend items.
  
  Parameters
  ----------
  model : MatrixFactorizationBase
      A matrix factorization model to use for the factors
  n_trees : int, optional
      The number of trees to use when building the Annoy index. More trees gives higher precision
      when querying.
  search_k : int, optional
      Provides a way to search more trees at runtime, giving the ability to have more accurate
      results at the cost of taking more time.
  approximate_similar_items : bool, optional
      whether or not to build an Annoy index for computing similar_items
  approximate_recommend : bool, optional
      whether or not to build an Annoy index for the recommend call
  
  Attributes
  ----------
  similar_items_index : annoy.AnnoyIndex
      Annoy index for looking up similar items in the cosine space formed by the latent
      item_factors
  
  recommend_index : annoy.AnnoyIndex
      Annoy index for looking up similar items in the inner product space formed by the latent
      item_factors
class_docstr_tok: ["Speeds","up","inference","calls","to","MatrixFactorization","models","by","using","an","`","Annoy","<","https",":","\/\/github.com\/spotify\/annoy",">","`","_","index","to","calculate","similar","items","and","recommend","items",".","Parameters","--","--","--","--","--","model",":","MatrixFactorizationBase","A","matrix","factorization","model","to","use","for","the","factors","n_trees",":","int",",","optional","The","number","of","trees","to","use","when","building","the","Annoy","index",".","More","trees","gives","higher","precision","when","querying",".","search_k",":","int",",","optional","Provides","a","way","to","search","more","trees","at","runtime",",","giving","the","ability","to","have","more","accurate","results","at","the","cost","of","taking","more","time",".","approximate_similar_items",":","bool",",","optional","whether","or","not","to","build","an","Annoy","index","for","computing","similar_items","approximate_recommend",":","bool",",","optional","whether","or","not","to","build","an","Annoy","index","for","the","recommend","call","Attributes","--","--","--","--","--","similar_items_index",":","annoy.AnnoyIndex","Annoy","index","for","looking","up","similar","items","in","the","cosine","space","formed","by","the","latent","item_factors","recommend_index",":","annoy.AnnoyIndex","Annoy","index","for","looking","up","similar","items","in","the","inner","product","space","formed","by","the","latent","item_factors"]
code: def similar_items(
      self,
      itemid,
      N=10,
      recalculate_item=False,
      item_users=None,
      filter_items=None,
      items=None,
  ):
      if items is not None and self.approximate_similar_items:
          raise NotImplementedError(
              "using an items filter isn't supported with ANN lookup"
          )
  
      count = N
      if filter_items is not None:
          count += len(filter_items)
  
      if not self.approximate_similar_items:
          return self.model.similar_items(
              itemid,
              N,
              recalculate_item=recalculate_item,
              item_users=item_users,
              filter_items=filter_items,
              items=items,
          )
  
      # annoy doesn't have a batch mode we can use
      if not np.isscalar(itemid):
          return _batch_call(
              self.similar_items,
              itemid,
              N=N,
              recalculate_item=recalculate_item,
              item_users=item_users,
              filter_items=filter_items,
          )
  
      # support recalculate_item if possible. TODO: refactor this
      if hasattr(self.model, "_item_factor"):
          factor = self.model._item_factor(
              itemid, item_users, recalculate_item
          )  # pylint: disable=protected-access
      elif recalculate_item:
          raise NotImplementedError(
              f"recalculate_item isn't supported with {self.model}"
          )
      else:
          factor = self.model.item_factors[itemid]
          if implicit.gpu.HAS_CUDA and isinstance(
              factor, implicit.gpu.Matrix
          ):
              factor = factor.to_numpy()
  
      if len(factor.shape) != 1:
          factor = factor.squeeze()
  
      ids, scores = self.similar_items_index.get_nns_by_vector(
          factor, N, search_k=self.search_k, include_distances=True
      )
      ids, scores = np.array(ids), np.array(scores)
  
      if filter_items is not None:
          ids, scores = _filter_items_from_results(
              itemid, ids, scores, filter_items, N
          )
  
      return ids, 1 - (scores**2) / 2
  
file_path: implicit/implicit/ann/annoy.py
imports: import logging
  import annoy
  import numpy
  from scipy.sparse import csr_matrix
  import implicit.gpu
  from implicit.recommender_base import RecommenderBase
  from implicit.utils import _batch_call, _filter_items_from_results, augment_inner_product_matrix
label_desc: Use image node_id 3 for calling the AnnoyModel obj's underlying member method code with example usage: obj.similar_items(itemid, N, recalculate_item, item_users, filter_items, items) and returns: ids,  unknown, self, _batch_call