5个版本

0.2.1 2024年6月3日
0.2.0 2023年10月1日
0.1.2 2022年9月6日
0.1.1 2021年12月10日
0.1.0 2021年12月1日

#52 in 机器学习

每月46次下载
disco-cli中使用

MIT 许可证

35KB
732

Disco Rust

🔥 Rust的协同过滤推荐

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

🎉 无依赖

Build Status

安装

将此行添加到您的应用程序的Cargo.toml中的[dependencies]

discorec = "0.2"

入门指南

将您的数据准备好,格式为user_id, item_id, value

use discorec::{Dataset, Recommender};

let mut data = Dataset::new();
data.push("user_a", "item_a", 5.0);
data.push("user_a", "item_b", 3.5);
data.push("user_b", "item_a", 4.0);

ID可以是整数、字符串或任何其他可哈希的数据类型

data.push(1, "item_a".to_string(), 5.0);

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

let recommender = Recommender::fit_explicit(&data);

如果用户没有直接对物品进行评分(例如,他们购买物品或阅读帖子),这被称为隐式反馈。对于数据集,使用1.0或类似的数量(如购买数量或页面浏览量)拟合推荐器:

let recommender = Recommender::fit_implicit(&data);

获取基于用户的推荐 - “像你这样的用户还喜欢”

recommender.user_recs(&user_id, 5);

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

recommender.item_recs(&item_id, 5);

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

recommender.predict(&user_id, &item_id);

获取相似用户

recommender.similar_users(&user_id, 5);

示例

MovieLens

下载MovieLens 100K数据集

将这些行添加到您的应用程序的Cargo.toml中的[dependencies]

csv = "1"
serde = { version = "1", features = ["derive"] }

然后使用:

use csv::ReaderBuilder;
use discorec::{Dataset, RecommenderBuilder};
use serde::Deserialize;
use std::fs::File;

#[derive(Debug, Deserialize)]
struct Row {
    user_id: i32,
    item_id: i32,
    rating: f32,
}

fn main() {
    let mut train_set = Dataset::new();
    let mut valid_set = Dataset::new();

    let file = File::open("u.data").unwrap();
    let mut rdr = ReaderBuilder::new()
        .has_headers(false)
        .delimiter(b'\t')
        .from_reader(file);
    for (i, record) in rdr.records().enumerate() {
        let row: Row = record.unwrap().deserialize(None).unwrap();
        let dataset = if i < 80000 { &mut train_set } else { &mut valid_set };
        dataset.push(row.user_id, row.item_id, row.rating);
    }

    let recommender = RecommenderBuilder::new()
        .factors(20)
        .fit_explicit(&train_set);
    println!("RMSE: {:?}", recommender.rmse(&valid_set));
}

存储推荐

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

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

算法

Disco使用高性能矩阵分解。

指定因子数量和迭代次数

RecommenderBuilder::new()
    .factors(8)
    .iterations(20)
    .fit_explicit(&train_set);

进度

传递回调以显示进度

RecommenderBuilder::new()
    .callback(|info| println!("{:?}", info))
    .fit_explicit(&train_set);

注意:train_lossvalid_loss在隐式反馈中不可用

验证

传递带有显式反馈的验证集

RecommenderBuilder::new()
    .callback(|info| println!("{:?}", info))
    .fit_eval_explicit(&train_set, &valid_set);

损失函数是RMSE

冷启动

协同过滤受到冷启动问题的影响。在没有用户或项目数据的情况下,它无法做出好的推荐,这对新用户和项目来说是个问题。

recommender.user_recs(&new_user_id, 5); // returns empty array

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

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

参考文献

获取ID

recommender.user_ids();
recommender.item_ids();

获取全局平均值

recommender.global_mean();

获取因子

recommender.user_factors(&user_id);
recommender.item_factors(&item_id);

参考文献

历史

查看变更日志

贡献

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

开始开发

git clone https://github.com/ankane/disco-rust.git
cd disco-rust
cargo test

没有运行时依赖