npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

collaborative-filter

v1.0.0-beta.3

Published

A lightweight implementation of collaborative filtering.

Downloads

91

Readme

Build Status Coverage Dependencies npm version Downloads

Collaborative filtering for Node.js

This API is a lightweight implementation of collaborative filtering for Node.js. The only dependency is Math.js. Currently it supports generating recommendations with Jaccard similarity.

Features

  • Generate recommendations for a user based on users with a similar taste.
  • No popularity bias (normalization based on popularity).
  • Currently only supports likes (no dislikes).
  • Database agnostic. As long as you are running Node.js, you can use this API.

Requirements

Install

npm i collaborative-filter

Usage

In your project, simply include the module.

const recommend = require('collaborative-filter')

Example

To run the provided example.

node examples/demo.js

How-to

The input for the engine is an array matrix which defines the ratings of the users in the database. It should be a matrix containing of 0:s (not rated) and 1:s (liked the item) and follow this format.

     I0 I1 I2 . . .
    [
U0  [1  1  1  .  .  .],
U1  [1  0  1  .  .  .],
U2  [1  0  0  .  .  .],
.   [.  .  .  .  .  .],
.   [.  .  .  .  .  .],
.   [.  .  .  .  .  .],
    ]

In javascript, this could look something like this

const ratings = [
 [1, 1, 1],
 [1, 0, 1],
 [1, 0, 0],
];

If you want to run the whole collaborative filter, you would do this:

const recommend = require('../lib/cf_api.js');

const result = recommend.cFilter(ratings, 2);

where 2 is the user index. The output of this with ratings matrix as above, would be an array [2, 1]. This tells us that item 2 is the most appropriate recommendation followed by item 1.

You could also run the filtering process by calling the global API functions individually.

const recommend = require('collaborative-filter');

const coMatrix = recommend.createCoMatrix(ratings, numUsers, numItems);
const result = recommend.getRecommendations(ratings, coMatrix, userIndex);

which results in the same array as before. This could be useful when you do not need to generate the co-occurrence matrix multiple times. For instance, if you want recommendations for multiple users, you do not need to generate the co-occurrence matrix multiple times, saving you processing time.

Cold Start Problem

The Cold start problem is something that can make or break a recommendation application. If you don't have enough data, it's hard to draw any conclusions, especially if the number of items is large.

In the file cf_api.js in the lib directory, there is a flag ONLY_RECOMMEND_FROM_SIMILAR_TASTE. If you put this to 0, you will get recommendations from users which don't necessarily have similar taste as you (these will however be lower ranked than recommendations from people with similar taste). This option is available if you consider a cold start something that will make your service seem poor. With this flag enabled, you will never receive a recommendation from someone who has no similarity with you.

You can also disable the NORMALIZE_ON_POPULARITY flag, which in turn ensures that the co-occurrence matrix is not normalized.

Contributing

Submit a pull request if you want to contribute. We follow the Airbnb JavaScript Style Guide.

Todo

  • Rating scale options and implementations
  • Performance benchmarks
  • Convert to typescript?

License

MIT