Skip to content

Recommendations for Node.js using collaborative filtering

License

Notifications You must be signed in to change notification settings

ankane/disco-node

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Disco Node

🔥 Recommendations for Node.js using collaborative filtering

  • Supports user-based and item-based recommendations
  • Works with explicit and implicit feedback
  • Uses high-performance matrix factorization

Build Status

Installation

Run:

npm install disco-rec

Getting Started

Create a recommender

import { Recommender } from 'disco-rec';

const recommender = new Recommender();

If users rate items directly, this is known as explicit feedback. Fit the recommender with:

recommender.fit([
  {userId: 1, itemId: 1, rating: 5},
  {userId: 2, itemId: 1, rating: 3}
]);

IDs can be integers or strings

If users don’t rate items directly (for instance, they’re purchasing items or reading posts), this is known as implicit feedback. Leave out the rating.

recommender.fit([
  {userId: 1, itemId: 1},
  {userId: 2, itemId: 1}
]);

Each userId/itemId combination should only appear once

Get user-based recommendations - “users like you also liked”

recommender.userRecs(userId);

Get item-based recommendations - “users who liked this item also liked”

recommender.itemRecs(itemId);

Use the count option to specify the number of recommendations (default is 5)

recommender.userRecs(userId, 3);

Get predicted ratings for specific users and items

recommender.predict([{userId: 1, itemId: 2}, {userId: 2, itemId: 4}]);

Get similar users

recommender.similarUsers(userId);

Examples

MovieLens

Load the data

import { loadMovieLens } from 'disco-rec';

const data = await loadMovieLens();

Create a recommender and get similar movies

const recommender = new Recommender({factors: 20});
recommender.fit(data);
recommender.itemRecs('Star Wars (1977)');

Storing Recommendations

Save recommendations to your database.

Alternatively, you can store only the factors and use a library like pgvector-node. See an example.

Algorithms

Disco uses high-performance matrix factorization.

Specify the number of factors and epochs

new Recommender({factors: 8, epochs: 20});

If recommendations look off, trying changing factors. The default is 8, but 3 could be good for some applications and 300 good for others.

Validation

Pass a validation set with:

recommender.fit(data, validationSet);

Cold Start

Collaborative filtering suffers from the cold start problem. It’s unable to make good recommendations without data on a user or item, which is problematic for new users and items.

recommender.userRecs(newUserId); // returns empty array

There are a number of ways to deal with this, but here are some common ones:

  • For user-based recommendations, show new users the most popular items
  • For item-based recommendations, make content-based recommendations

Reference

Get ids

recommender.userIds();
recommender.itemIds();

Get the global mean

recommender.globalMean();

Get factors

recommender.userFactors(userId);
recommender.itemFactors(itemId);

Credits

Thanks to LIBMF for providing high performance matrix factorization

History

View the changelog

Contributing

Everyone is encouraged to help improve this project. Here are a few ways you can help:

To get started with development:

git clone https://github.com/ankane/disco-node.git
cd disco-node
npm install
npm test

About

Recommendations for Node.js using collaborative filtering

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published