ankane/disco

基于协同过滤的PHP推荐

v0.2.0 2024-06-03 02:44 UTC

This package is auto-updated.

Last update: 2024-09-09 09:54:53 UTC


README

🔥 基于协同过滤的PHP推荐

  • 支持基于用户和基于项目的推荐
  • 支持显式和隐式反馈
  • 使用高性能矩阵分解

Build Status

安装

运行

composer require ankane/disco

将脚本添加到 composer.json 以下载共享库

    "scripts": {
        "post-install-cmd": "Disco\\Library::check",
        "post-update-cmd": "Disco\\Library::check"
    }

然后运行

composer install

入门

创建推荐器

use Disco\Recommender;

$recommender = new Recommender();

如果用户直接对项目进行评分,这被称为显式反馈。用以下方式拟合推荐器

$recommender->fit([
    ['user_id' => 1, 'item_id' => 1, 'rating' => 5],
    ['user_id' => 2, 'item_id' => 1, 'rating' => 3]
]);

ID可以是整数或字符串

如果用户没有直接对项目进行评分(例如,他们正在购买项目或阅读帖子),这被称为隐式反馈。省略评分。

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

每个 user_id/item_id 组合只应出现一次

获取基于用户的推荐 - “和你相似的用户还喜欢”

$recommender->userRecs($userId);

获取基于项目的推荐 - “喜欢这个项目的用户还喜欢”

$recommender->itemRecs($itemId);

使用 count 选项指定推荐的数量(默认为5)

$recommender->userRecs($userId, count: 3);

获取特定用户和项目的预测评分

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

获取相似用户

$recommender->similarUsers($userId);

示例

MovieLens

加载数据

use Disco\Data;

$data = Data::loadMovieLens();

创建推荐器并获取相似电影

$recommender = new Recommender(factors: 20);
$recommender->fit($data);
$recommender->itemRecs('Star Wars (1977)');

存储推荐

将推荐保存到您的数据库中。

或者,您可以选择仅存储因子并使用类似 pgvector-php 的库。请参阅 示例

算法

Disco使用高性能矩阵分解。

指定因子数量和迭代次数

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

如果推荐看起来不合适,尝试更改 factors。默认为8,但3可能适用于某些应用,而300可能适用于其他应用。

验证

通过以下方式传递验证集

$recommender->fit($data, validationSet: $validationSet);

冷启动

协同过滤存在 冷启动问题。在没有用户或项目数据的情况下,它无法提供良好的推荐,这对新用户和新项目来说是个问题。

$recommender->userRecs($newUserId); // returns empty array

有几种处理方法,但这里有一些常见的方法

  • 对于基于用户的推荐,向新用户显示最受欢迎的项目。
  • 对于基于项目的推荐,进行基于内容的推荐。

参考

获取ID

$recommender->userIds();
$recommender->itemIds();

获取全局平均值

$recommender->globalMean();

获取因子

$recommender->userFactors($userId);
$recommender->itemFactors($itemId);

致谢

感谢 LIBMF 提供高性能矩阵分解

历史

查看 变更日志

贡献

鼓励每个人帮助改进这个项目。以下是您可以帮助的一些方法

要开始开发

git clone https://github.com/ankane/disco-php.git
cd disco-php
composer install
composer test