Giter Club home page Giter Club logo

disco-php's Introduction

Disco PHP

🔥 Recommendations for PHP 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:

composer require ankane/disco

And download the shared library:

composer exec -- php -r "require 'vendor/autoload.php'; Disco\Library::check(true);"

Getting Started

Create a recommender

$recommender = new Disco\Recommender();

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

$recommender->fit([
    ['user_id' => 1, 'item_id' => 1, 'rating' => 5],
    ['user_id' => 2, 'item_id' => 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([
    ['user_id' => 1, 'item_id' => 1],
    ['user_id' => 2, 'item_id' => 1]
]);

Each user_id/item_id 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, count: 3);

Get predicted ratings for specific users and items

$recommender->predict([['user_id' => 1, 'item_id' => 2], ['user_id' => 2, 'item_id' => 4]]);

Get similar users

$recommender->similarUsers($userId);

Examples

MovieLens

Load the data

$data = Disco\Data::loadMovieLens();

Create a recommender and get similar movies

$recommender = new Disco\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-php. See an example.

Algorithms

Disco uses high-performance matrix factorization.

Specify the number of factors and epochs

new Disco\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: $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-php.git
cd disco-php
composer install
composer test

disco-php's People

Contributors

ankane avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

hadryan

disco-php's Issues

Feature requests

The library looks great.

It would be nice to integrate saving/loading of recommendations into some storage/database. Like integrating pgvector/pgvector-php with this package for storing the recommendations.

We may have additional methods like

$recommender->itemRecs($itemId)->save();
$recommender->itemRecs($itemId)->refresh();
$recommender->itemRecs($itemId)->delete();
$recommender->itemRecs($itemId)->get();

Additionally, $recommender->itemRecs($itemId) may check for recommendations existance in database and load the same instead of generating new recommendations. The user may call $recommender->itemRecs($itemId)->refresh() to make new recommendations and sync them to database.

Maybe use model observers / events to refresh the recommendations automatically on model creation / updation or deletion.

Add custom data for users and items

Hello,
this is really an awesome library for php.
There i a way to add custom data to users and items to consider them into the recommendation system?

Example:

user_id : 1,
   gender: "m",
   age: 30,
   ..

Would be useful to set a weight too.
Thank you

Ideas

Please create a new issue to discuss any ideas or share your own.

  • Add Laravel integration
  • Add support for saving and loading recommenders

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.