#机器学习 #相似度 #推荐 #数学 #推荐系统 #rec-sys

rec_rsys

与推荐系统和机器学习相关数学函数的库

3 个版本 (1 个稳定版)

1.0.0 2023年7月10日
0.1.1 2023年6月2日
0.1.0 2023年5月31日

251机器学习 中排名

每月下载量 36 次

MIT/Apache

69KB
1K SLoC

RecSys

一个具有更多数学函数的推荐系统工具包。目前它仅用于学习和改进该领域,但也欢迎参与。

crates.io Released API docs example workflow

示例

您可以在 此处 找到可工作的示例

一个简单的实现可能是

// 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(&sectors).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