#线性代数 #机器学习 #数值方法 #绘图 #数据帧 #科学 #数值

peroxide

Rust 综合科学计算库包含线性代数、数值分析、统计和机器学习工具,语法简洁易懂

221 个版本

0.37.9 2024年7月30日
0.37.6 2024年6月19日
0.35.1 2024年3月29日
0.34.3 2023年11月25日
0.6.6 2018年11月29日

#16 in 数学

Download history 8496/week @ 2024-05-05 11110/week @ 2024-05-12 5629/week @ 2024-05-19 8067/week @ 2024-05-26 12342/week @ 2024-06-02 14687/week @ 2024-06-09 6836/week @ 2024-06-16 9972/week @ 2024-06-23 10684/week @ 2024-06-30 12983/week @ 2024-07-07 7115/week @ 2024-07-14 8463/week @ 2024-07-21 8523/week @ 2024-07-28 10142/week @ 2024-08-04 10611/week @ 2024-08-11 13531/week @ 2024-08-18

42,865 每月下载量
用于 17 包(7 个直接使用)

MIT/Apache

1MB
17K SLoC

Peroxide

On crates.io On docs.rs DOI github

maintenance

Peroxide Rust 数字库包含线性代数、数值分析、统计和机器学习工具,语法类似于 R、MATLAB 和 Python。

目录

为什么选择 Peroxide?

1. 定制功能

Peroxide 提供各种功能。

  • default - 纯 Rust(无架构依赖 - 完美交叉编译)
  • O3 - BLAS & LAPACK(性能完美但设置稍微困难 - 强烈推荐查看 带有 BLAS 的 Peroxide
  • plot - 使用 Python 的 matplotlib 绘制任何图表。
  • nc - 使用 DataFrame 处理 netcdf 文件格式。
  • csv - 使用矩阵或 DataFrame 处理 csv 文件格式。
  • parquet - 使用 DataFrame 处理 parquet 文件格式。
  • serde - 使用 Serde 进行序列化。

如果您想进行高性能计算并使用更多线性代数,则选择 O3 功能。如果您不想依赖 C/C++ 或 Fortran 库,则选择 default 功能。如果您想使用一些优秀的模板绘制图表,则选择 plot 功能。

您可以同时选择任何功能。

2. 易于优化

过氧化物使用一维数据结构来表示矩阵,这使得它能够方便地与BLAS(基本线性代数子程序)集成。这意味着过氧化物可以通过利用BLAS提供的优化例程来保证线性代数计算的卓越性能。

3. 语法友好

对于熟悉NumPy、MATLAB或R等数值计算库的用户来说,Rust的语法一开始可能会显得陌生。这可能会使学习和使用依赖Rust独特特性和语法的Rust库变得更加具有挑战性。

然而,过氧化物旨在通过提供类似流行数值计算环境风格的语法来弥合这一差距。使用过氧化物,您可以使用类似于R、NumPy或MATLAB的语法执行复杂计算,从而帮助这些背景的用户更容易地适应Rust并利用其性能优势。

例如,

#[macro_use]
extern crate peroxide;
use peroxide::prelude::*;

fn main() {
    // MATLAB like matrix constructor
    let a = ml_matrix("1 2;3 4");

    // R like matrix constructor (default)
    let b = matrix(c!(1,2,3,4), 2, 2, Row);

    // Or use zeros
    let mut z = zeros(2, 2);
    z[(0,0)] = 1.0;
    z[(0,1)] = 2.0;
    z[(1,0)] = 3.0;
    z[(1,1)] = 4.0;

    // Simple but effective operations
    let c = a * b; // Matrix multiplication (BLAS integrated)

    // Easy to pretty print
    c.print();
    //       c[0] c[1]
    // r[0]     1    3
    // r[1]     2    4

    // Easy to do linear algebra
    c.det().print();
    c.inv().print();

    // and etc.
}

4. 可以选择两种不同的编码风格。

在过氧化物中,有两种不同的选项。

  • prelude:简单使用。
  • fuga:显式选择数值算法。

例如,让我们看看范数。

prelude中,使用norm很简单:a.norm()。但它只对Vec<f64>使用L2范数。(对于Matrix,Frobenius范数。)

#[macro_use]
extern crate peroxide;
use peroxide::prelude::*;

fn main() {
    let a = c!(1, 2, 3);
    let l2 = a.norm();      // L2 is default vector norm

    assert_eq!(l2, 14f64.sqrt());
}

fuga中,可以使用各种范数。但您需要写的内容会比prelude长一些。

#[macro_use]
extern crate peroxide;
use peroxide::fuga::*;

fn main() {
    let a = c!(1, 2, 3);
    let l1 = a.norm(Norm::L1);
    let l2 = a.norm(Norm::L2);
    let l_inf = a.norm(Norm::LInf);
    assert_eq!(l1, 6f64);
    assert_eq!(l2, 14f64.sqrt());
    assert_eq!(l_inf, 3f64);
}

5. 内置功能

过氧化物可以做很多事情。

  • 线性代数
    • 有效的矩阵结构
    • 转置、行列式、对角线
    • LU分解、逆矩阵、块划分
    • QR分解(O3功能)
    • 奇异值分解(O3功能)
    • Cholesky分解(O3功能)
    • 简化行阶梯形
    • 列、行操作
    • 特征值、特征向量
  • 函数式编程
    • 使用Vec<f64>进行更简单的函数式编程
    • 对于矩阵,有三个映射
      • fmap:对所有元素进行映射
      • col_map:对列向量进行映射
      • row_map:对行向量进行映射
  • 自动微分
    • 泰勒模式前向AD - 用于第n阶AD
    • 精确雅可比矩阵
    • Real特质以约束f64AD(用于常微分方程)
  • 数值分析
    • Lagrange插值
    • 样条曲线
      • 三次样条
      • 三次Hermite样条
        • 通过Akima估计斜率
        • 通过二次插值估计斜率
      • B样条
    • 非线性回归
      • 梯度下降
      • Levenberg Marquardt
    • 常微分方程
      • 基于特质的常微分方程求解器(在v0.36.0之后)
      • 显式积分器
        • Ralston的3阶
        • Runge-Kutta 4阶
        • Ralston的4阶
        • Runge-Kutta 5阶
      • 嵌入式积分器
        • Bogacki-Shampine 3(2)
        • Runge-Kutta-Fehlberg 4(5)
        • Dormand-Prince 5(4)
        • Tsitouras 5(4)
      • 隐式积分器
        • Gauss-Legendre 4阶
    • 数值积分
      • Newton-Cotes求积
      • Gauss-Legendre求积(高达30阶)
      • Gauss-Kronrod求积(自适应)
        • G7K15, G10K21, G15K31, G20K41, G25K51, G30K61
      • Gauss-Kronrod求积(相对容差)
        • G7K15R, G10K21R, G15K31R, G20K41R, G25K51R, G30K61R
    • 根寻找
      • 基于特征的根寻找(在 v0.37.0 之后)
      • 二分法
      • 假位法
      • 割线法
      • 牛顿法
      • Broyden法
  • 统计
    • 使用 rand crate 更容易的随机
    • 有序统计
      • 中位数
      • 分位数(与R分位数匹配)
    • 概率分布
      • 伯努利分布
      • 均匀分布
      • 二项分布
      • 正态分布
      • 伽马分布
      • 贝塔分布
      • 学生t分布
      • 加权的均匀分布
    • RNG算法
      • 接受/拒绝
      • Marsaglia极坐标
      • 金字塔
      • rand-dist crate 提供包装器
      • 分段拒绝抽样
    • 混淆矩阵与度量
  • 特殊函数
    • puruspe crate 提供包装器(纯Rust)
  • 工具
    • R语言风格宏和函数
    • Matlab风格宏和函数
    • Numpy风格宏和函数
    • Julia风格宏和函数
  • 绘图
    • 使用 pyo3matplotlib
  • DataFrame
    • 支持同时读取多种类型
    • 读取和写入 csv 文件(csv 功能)
    • 读取和写入 netcdf 文件(nc 功能)
    • 读取和写入 parquet 文件(parquet 功能)

6. 与数学兼容

0.23.0 开始,过氧化物与数学结构兼容。 MatrixVec<f64>f64 被视为内积向量空间。并且 MatrixVec<f64> 是线性算子 - Vec<f64>Vec<f64>Vec<f64>f64。对于未来,过氧化物将包含更多和更多的数学概念。(但仍然实用。)

7. 使用 Rust 编写

Rust 提供了强大的类型系统、所有权概念、借用规则等特性,使开发者能够编写安全高效的代码。它还提供了现代编程技术,如基于特征的抽象和方便的错误处理。Peroxide 的开发是为了充分利用 Rust 的这些优势。

示例代码演示了如何使用 Peroxide 模拟洛伦兹吸引子并可视化结果。它展示了 Rust 提供的一些强大功能,例如用于简化错误处理的 ? 操作符和用于抽象常微分方程问题的 ODEProblem 特性。

use peroxide::fuga::*;

fn main() -> Result<(), Box<dyn Error>> {
    let rkf45 = RKF45::new(1e-4, 0.9, 1e-6, 1e-2, 100);
    let basic_ode_solver = BasicODESolver::new(rkf45);
    let (_, y_vec) = basic_ode_solver.solve(
        &Lorenz,
        (0f64, 100f64),
        1e-2,
    )?; // Error handling with `?` - can check constraint violation and etc.
    let y_mat = py_matrix(y_vec);
    let y0 = y_mat.col(0);
    let y2 = y_mat.col(2);

    // Simple but effective plotting
    let mut plt = Plot2D::new();
    plt
        .set_domain(y0)
        .insert_image(y2)
        .set_xlabel(r"$y_0$")
        .set_ylabel(r"$y_2$")
        .set_style(PlotStyle::Nature)
        .tight_layout()
        .set_dpi(600)
        .set_path("example_data/lorenz_rkf45.png")
        .savefig()?;

    Ok(())
}

struct Lorenz;

impl ODEProblem for Lorenz {
    fn initial_conditions(&self) -> Vec<f64> {
        vec![10f64, 1f64, 1f64]
    }

    fn rhs(&self, t: f64, y: &[f64], dy: &mut [f64]) -> anyhow::Result<()> {
        dy[0] = 10f64 * (y[1] - y[0]);
        dy[1] = 28f64 * y[0] - y[1] - y[0] * y[2];
        dy[2] = -8f64 / 3f64 * y[2] + y[0] * y[1];
        Ok(())
    }
}

运行代码会产生以下洛伦兹吸引子的可视化

lorenz_rkf45.png

Peroxide 致力于利用 Rust 语言的优点,同时为数值计算和科学模拟提供用户友好的界面。

怎么样?如果还有其他需要我改进的地方,请告诉我!

最新 README 版本

对应于 0.37.7

先决条件

  • 针对 O3 功能 - 需要 OpenBLAS
  • 针对 plot 功能 - 需要 matplotlib 以及可选的 scienceplots(用于出版物质量)
  • 针对 nc 功能 - 需要 netcdf

安装

  • 在您的项目目录中运行以下命令
  1. 默认

    cargo add peroxide
    
  2. OpenBLAS

    cargo add peroxide --features O3
    
  3. 绘图

    cargo add peroxide --features plot
    
  4. DataFrame 的 NetCDF 依赖项

    cargo add peroxide --features nc
    
  5. DataFrame 的 CSV 依赖项

    cargo add peroxide --features csv
    
  6. DataFrame 的 Parquet 依赖项

    cargo add peroxide --features parquet
    
  7. 使用矩阵或多项式进行序列化或反序列化

    cargo add peroxide --features serde
    
  8. 所有功能

    cargo add peroxide --features "O3 plot nc csv parquet serde"
    

功能使用技巧

  • 如果您想使用 QRSVDCholesky 分解,您应使用 O3 功能。这些分解在 default 功能中未实现。

  • 如果您想保存您的数值结果,请考虑使用 parquetnc 功能,分别对应于 parquetnetcdf 文件格式。这些格式比 csvjson 要高效得多。

  • 对于绘图,建议使用 plot 功能。但是,如果您需要更多的自定义,您可以使用 parquetnc 功能将您的数据导出为 parquet 或 netcdf 格式,然后使用 Python 创建图表。

    • 要在 Python 中读取 parquet 文件,您可以使用 pandaspyarrow 库。

    • 可以在 Socialst 存储库中找到与 netcdf 文件一起工作的 Python 代码模板。

模块结构

文档

  • On docs.rs

示例

发布信息

查看RELEASES.md

贡献指南

查看CONTRIBUTES.md

许可协议

Peroxide 采用双重许可 - Apache License 2.0 和 MIT License。

待办事项

查看TODO.md

引用Peroxide

嘿!如果你在研究或项目中使用了Peroxide,你不必引用我们。但如果你这样做,我们会非常感激!😊

为了让引用Peroxide变得简单,我们已经在Zenodo上创建了一个DOI。只需点击这个徽章

DOI

这将带你到Peroxide的Zenodo页面。在底部,你可以找到各种格式的引用信息,如BibTeX、RIS和APA。

所以,如果你想承认我们在Peroxide上所做的努力,引用我们将是一个很好的方式!感谢你的考虑,我们非常感谢你的支持!👍

依赖项

~3–16MB
~252K SLoC