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中使用
35KB
732 行
Disco Rust
🔥 Rust的协同过滤推荐
- 支持基于用户和基于项目的推荐
- 支持显式和隐式反馈
- 使用高性能矩阵分解
🎉 无依赖
安装
将此行添加到您的应用程序的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
将这些行添加到您的应用程序的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_loss
和valid_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