3 个版本 (1 个稳定版)
1.0.0 | 2023年7月10日 |
---|---|
0.1.1 | 2023年6月2日 |
0.1.0 | 2023年5月31日 |
251 在 机器学习 中排名
每月下载量 36 次
69KB
1K SLoC
RecSys
一个具有更多数学函数的推荐系统工具包。目前它仅用于学习和改进该领域,但也欢迎参与。
示例
您可以在 此处 找到可工作的示例
一个简单的实现可能是
// src/s/company.rs
use rec_rsys::models::{one_hot_encode, ItemAdapter, Item};
pub struct Company {
pub id: u32,
pub ticker: String,
pub sector: String,
pub industry: String,
pub exchange: String,
pub country: String,
pub adj: String,
pub growth: f32,
}
impl ItemAdapter for Company {
fn to_item(&self) -> Item {
Item::new(self.id, self.create_values(), None)
}
fn create_values(&self) -> Vec<f32> {
let mut values = vec![self.growth];
[
self.encode_sector(),
self.encode_industry(),
self.encode_exchange(),
self.encode_country(),
self.encode_adjs(),
]
.iter()
.for_each(|f| values.extend(f));
values
}
fn get_references(&self) -> Vec<Item> {
match self.get_references_query() {
Ok(items) => items.then(|c| c.to_item()).collect::<Vec<Item>>(),
Err(_e) => vec![],
}
}
}
impl Company {
fn get_references_query(&self) -> Result<Vec<Company>, CRUDError> {
let query = Orm::new()
.select("id, sector, industry, exchange, country, adj, growth")
.from(&Self::table())
.where_clause()
.not_equal("id", &self.id.to_string())
.ready();
let rows = sqlx::query_as::<_, Self>(&query)
.fetch_all(&mut Self::connect());
match rows {
Ok(json) => Ok(json),
Err(_e) => Err(CRUDError::WrongParameters),
}
}
fn encode_sector(&self) -> Vec<f32> {
let sectors = vec![
"Healthcare",
"Unknown",
"Automotive",
"Technology",
"Communication Services",
"Basic Materials",
"Consumer Cyclical",
"Industrials",
"Financial Services",
"Energy",
"Utilities",
"Real Estate",
"Consumer Defensive",
];
match one_hot_encode(§ors).get(&self.sector) {
Some(val) => val.to_vec(),
None => panic!(),
}
}
// rest of methods ...
}
// src/recommendations/company.rs
use rec_rsys::{algorithms::knn::KNN, models::Item, similarity::SimilarityAlgos};
use super::models::company::Company;
pub struct Recommendation {
prod_id: u32,
result: f32,
}
fn generate_recommendations(id: u32, num_recommendations: u8) -> Vec<Recommendation> {
let company = Company::get(id);
Self::calculate_recommendations(company.to_item(), company.get_references(), num_recommendations)
}
fn calculate_recommendations(
item: Item,
references: Vec<Item>,
num_recs: u8,
) -> Vec<Recommendation> {
let knn = KNN::new(item, references, num_recs);
knn.result(SimilarityAlgos::Cosine)
.into_iter()
.map(|item| Recommendation{item.id, item.result})
.collect()
}
// src/main.rs
mod models;
mod recommendations;
use recommendations::generate_recommendations;
fn main() {
let recs = generate_recommendations(1, 5);
}
改进
1.- 原始
- 修复公式中可能存在的错误
- 为每个公式添加测试以确保其正确性
- 使文档标准化,使其在所有地方都相同
- 创建两种类型的文档。一种是在单独的 .md 文件中,包含详细的解释和数学示例。另一种则是更多关于“代码使用”的
- 修复错别字
- 为公式和整体函数添加基准测试
2.- 想要的
- 在 .md 中添加更多相关文档
- 在文档中添加测试
- 标准化结果。根据公式,0 或 1 应表示 100% 的相似度
- 将结果转换为包含更多信息的结构体
- 改进代码片段。(标题可以是方法的名称)
- 使其异步
3.- 最终步骤
- 接受传入数据
- 将传入数据转换为结构体?
- 处理数据并获得排名
- 检查排名的准确性
- 同时运行多个算法
4.- 未来想要的功能
- 保存数据和结果
- 创建某种“缓存”以避免多次重新计算
- 使用某种高效的科学库的 ndarrays
- 比较通用类型、f32 和 f64 之间的性能和结果
如何
- 文档结构
/// # [Name of the concept]
/// [Small explanation of the function]
///
/// ## Parameters:
/// * `[Parameter of the function]`: [Small explanation]
///
/// ## Returns:
/// * [What does the function returns]
///
/// ## Examples:
/// [Examples]
///
#[doc = include_str!("../docs/example/example.md")]
pub fn example(){}
在 docs/ 文件夹中创建一个新的 .md 文件,包含数学公式、解释和必要的示例。
# [Name of the concept]
## Explanation:
[Explanation of the mathematical concept]
## Formula:
$$ [Mathematical formula in raw katex format] $$
### Where:
* [Definition of each component of the formula]
- 顺序
将相关概念放在一起
依赖关系
~78MB
~1M SLoC