Skip to content


Funk Matrix Factorization for recommender systems.

The model equation is defined as:

\[\hat{y}(x) = \langle \mathbf{v}_u, \mathbf{v}_i \rangle = \sum_{f=1}^{k} \mathbf{v}_{u, f} \cdot \mathbf{v}_{i, f}\]

where \(k\) is the number of latent factors.

This model expects a dict input with a user and an item entries without any type constraint on their values (i.e. can be strings or numbers). Other entries are ignored.


  • n_factors – defaults to 10

    Dimensionality of the factorization or number of latent factors.

  • optimizer (optim.base.Optimizer) – defaults to None

    The sequential optimizer used for updating the latent factors.

  • loss (optim.base.Loss) – defaults to None

    The loss function to optimize for.

  • l2 – defaults to 0.0

    Amount of L2 regularization used to push weights towards 0.

  • initializer (optim.base.Initializer) – defaults to None

    Latent factors initialization scheme.

  • clip_gradient – defaults to 1000000000000.0

    Clips the absolute value of each gradient value.

  • seed – defaults to None

    Random number generation seed. Set this for reproducibility.


  • u_latents (collections.defaultdict)

    The user latent vectors randomly initialized.

  • i_latents (collections.defaultdict)

    The item latent vectors randomly initialized.

  • u_optimizer (optim.base.Optimizer)

    The sequential optimizer used for updating the user latent weights.

  • i_optimizer (optim.base.Optimizer)

    The sequential optimizer used for updating the item latent weights.


>>> from river import optim
>>> from river import reco

>>> dataset = (
...     ({'user': 'Alice', 'item': 'Superman'}, 8),
...     ({'user': 'Alice', 'item': 'Terminator'}, 9),
...     ({'user': 'Alice', 'item': 'Star Wars'}, 8),
...     ({'user': 'Alice', 'item': 'Notting Hill'}, 2),
...     ({'user': 'Alice', 'item': 'Harry Potter'}, 5),
...     ({'user': 'Bob', 'item': 'Superman'}, 8),
...     ({'user': 'Bob', 'item': 'Terminator'}, 9),
...     ({'user': 'Bob', 'item': 'Star Wars'}, 8),
...     ({'user': 'Bob', 'item': 'Notting Hill'}, 2)
... )

>>> model = reco.FunkMF(
...     n_factors=10,
...     optimizer=optim.SGD(0.1),
...     initializer=optim.initializers.Normal(mu=0., sigma=0.1, seed=11),
... )

>>> for x, y in dataset:
...     _ = model.learn_one(**x, y=y)

>>> model.predict_one(user='Bob', item='Harry Potter')



Fits a user-item pair and a real-valued target y.


  • user (Union[str, int])
  • item (Union[str, int])
  • y (Union[numbers.Number, bool])
  • x (dict) – defaults to None

Predicts the target value of a set of features x.


  • user (Union[str, int])
  • item (Union[str, int])
  • x (dict) – defaults to None


typing.Union[numbers.Number, bool]: The predicted preference from the user for the item.


Rank models by decreasing order of preference for a given user.


  • user (Union[str, int])
  • items (Set[Union[str, int]])
  • x (dict) – defaults to None