'Recommends items to a user (or users to an item) using reconstructed matrix :math:`M^\prime = U \Sigma_k V^T`
E.g. if *i* is a row and *only_unknowns* is True, it returns the higher values of :math:`M^\prime_{i,\cdot}` :math:`\forall_j{M_{i,j}=\emptyset}`
:param i: row or col in M
:type i: user or item id
:param n: number of recommendations to return
:type n: int
:param only_unknowns: only return unknown values in *M*? (e.g. items not rated by the user)
:type only_unknowns: Boolean
:param is_row: is param *i* a row (or a col)?
:type is_row: Boolean'

def recommend(self, i, n=10, only_unknowns=False, is_row=True):

    if (not self._matrix_reconstructed):
        self.compute()
    item = None
    zeros = []
    if (only_unknowns and (not self._matrix.get())):
        raise ValueError("Matrix    is    empty!    If    you    loaded    an    SVD    model    you    can't    use    only_unknowns=True,    unless    svd.create_matrix()    is    called")
    if is_row:
        if only_unknowns:
            zeros = self._matrix.get().row_named(i).zero_entries()
        item = self._get_row_reconstructed(i, zeros)
    else:
        if only_unknowns:
            zeros = self._matrix.get().col_named(i).zero_entries()
        item = self._get_col_reconstructed(i, zeros)
    return item.top_items(n)
