'Parameters
user_id: int or string
User for which recommendations are to be computed. (default= \'user_similarity\')
Optional Parameters
n_similarity: string
The similarity used in the neighborhood strategy
distance: the metrics.pairwise function to set.
The pairwise function to compute the similarity (default = euclidean_distances)
nhood_size:  int
The neighborhood size (default=None  ALL)
minimal_similarity: float
minimal similarity required for neighbors (default = 0.0)
sampling_rate: int
percentage of users to consider when building neighborhood
(default = 1)
Returns
Return items in the `model` for which the user has not expressed
the preference and could possibly be recommended to the user.'

def all_other_items(self, user_id, **params):

    n_similarity = params.pop('n_similarity', 'user_similarity')
    distance = params.pop('distance', self.similarity.distance)
    nhood_size = params.pop('nhood_size', None)
    nearest_neighbors = self.neighborhood_strategy.user_neighborhood(user_id, self.model, n_similarity, distance, nhood_size, **params)
    items_from_user_id = self.model.items_from_user(user_id)
    possible_items = []
    for to_user_id in nearest_neighbors:
        possible_items.extend(self.model.items_from_user(to_user_id))
    possible_items = np.unique(np.array(possible_items).flatten())
    return np.setdiff1d(possible_items, items_from_user_id)
