#machine-learning #tensor #matrix #complex #iron #learn #descent

bin+lib iron_learn

一个纯Rust机器学习库,具有泛型张量和梯度下降优化函数

7个不稳定版本 (3个破坏性版本)

0.4.0 2024年6月6日
0.3.2 2024年5月19日
0.2.0 2024年5月13日
0.1.1 2024年5月13日
0.0.1 2024年4月13日

机器学习中排名第106

Download history 616/week @ 2024-05-11 187/week @ 2024-05-18 7/week @ 2024-05-25 165/week @ 2024-06-01 23/week @ 2024-06-08 5/week @ 2024-06-15 1/week @ 2024-06-22 3/week @ 2024-06-29 24/week @ 2024-07-06

每月下载量594

MIT许可证

67KB
764

iron_learn

一个纯Rust机器学习库

状态

版本0.4.0发布,包含逻辑回归算法。现在你可以直接使用linear_regressionlogistic_regression函数,而不是直接使用已标记为弃用的gradient_descent函数,该函数将引入破坏性更改,并且在将来可能会被移除。目前正在积极开发以支持进一步的实现。

注意:这个库是Rust学习努力的产品。因此,使用“学校等级”算法进行矩阵乘法。我计划在未来提高性能部分。

概述

这个库旨在通过重点放在线性代数操作上,来简化机器学习任务。目前,该库支持矩阵加法、减法、乘法、转置以及通过标量缩放,为构建更复杂的机器学习算法提供了一个强大的基础。

模块

tensor

在库的核心,tensor模块支持多维Tensor数据结构。它包括用于张量实例化的方法,并定义了用于张量加法的+操作符,用于减法的-操作符和用于张量乘法的*操作符。然而,这些操作符会拥有变量(包括rhslhs)。因此,变量之后不能再使用。为了便于在没有所有权问题的前提下执行这些操作,它还提供了addsubmul方法来执行加法、减法和除法,通过借用变量来执行操作。

此外,它还提供了t方法进行转置和multiply方法进行Hadamard积,即逐元素乘法操作。它还提供了scale方法进行标量缩放。

由于多种原因,对 Tensor 的这些操作可能会失败,因此它返回一个结果对象。该库假设用户能够更好地处理错误,而不是引发 panic

注意: 此模块仅限于支持二维矩阵。这是一个临时限制,我计划在未来移除这个限制。

复杂

complex 模块是实验性的,它提供了复数的表示,这在各种机器学习计算中是基本的,尤其是在处理涉及复值数据的操作中。 Complex 类型支持所有算术操作。

数值

此模块定义了机器学习操作所需的全部支持的数值类型,包括整数、无符号和浮点变体,以及自定义类型 Complex

梯度下降

gradient_descent 函数执行梯度下降优化算法的单步。它可以用于线性回归和逻辑回归,通过布尔参数配置。

matrix(使用二维 Tensor 代替)

matrix 模块提供了 Matrix 结构,它作为二维 Tensor 对象的包装,使矩阵运算成为可能。它定义了矩阵加法和乘法运算的 +* 运算符,分别对应于张量的行为。它还启用 multiply 方法来支持两个矩阵的哈达玛积。

vector(使用一维 Tensor 代替)

vector 模块提供 Vector 类型,它是一维 Tensor 对象的专业包装,专门用于向量操作。它定义了向量加法的 + 运算符以及两个向量之间点积计算的 * 运算符。

用法

要使用该库,请在您的项目中包含以下内容

use iron_learn::Complex;
use iron_learn::Matrix;
use iron_learn::Tensor;
use iron_learn::Vector;

示例

以下是使用该库进行基本操作的示例

张量加法

let a = Tensor::new(vec![2, 2], vec![1, 2, 3, 4]).unwrap(); // Define matrix `a`
let b = Tensor::new(vec![2, 2], vec![5, 6, 7, 8]).unwrap(); // Define matrix `b`
let c = (a + b).unwrap(); // Perform matrix addition. Causes a move. Cannot use a or b later.

// No move syntax
let a = Tensor::new(vec![2, 2], vec![1, 2, 3, 4]).unwrap(); // Define matrix `a`
let b = Tensor::new(vec![2, 2], vec![5, 6, 7, 8]).unwrap(); // Define matrix `b`
let c = a.add(&b).unwrap(); // Perform matrix addition without taking ownership..

张量减法

let a = Tensor::new(vec![2, 2], vec![1, 2, 3, 4]).unwrap(); // Define matrix `a`
let b = Tensor::new(vec![2, 2], vec![5, 6, 7, 8]).unwrap(); // Define matrix `b`
let c = (a - b).unwrap(); // Perform matrix addition. Causes a move. Cannot use a or b later.

// No move syntax
let a = Tensor::new(vec![2, 2], vec![1, 2, 3, 4]).unwrap(); // Define matrix `a`
let b = Tensor::new(vec![2, 2], vec![5, 6, 7, 8]).unwrap(); // Define matrix `b`
let c = a.sub(&b).unwrap(); // Perform matrix addition without taking ownership..

张量乘法

let a = Tensor::new(vec![2, 2], vec![1, 2, 3, 4]).unwrap(); // Define matrix `a`
let b = Tensor::new(vec![2, 2], vec![5, 6, 7, 8]).unwrap(); // Define matrix `b`
let c = (a * b).unwrap(); // Perform matrix multiplication. Causes a move. Cannot use a or b later.

// No move syntax
let a = Tensor::new(vec![2, 2], vec![1, 2, 3, 4]).unwrap(); // Define matrix `a`
let b = Tensor::new(vec![2, 2], vec![5, 6, 7, 8]).unwrap(); // Define matrix `b`
let c = a.add(&b).unwrap(); // Perform matrix multiplication without taking ownership.

张量哈达玛积

let a = Tensor::new(vec![2, 2], vec![1, 2, 3, 4]).unwrap(); // Define matrix `a`
let b = Tensor::new(vec![2, 2], vec![5, 6, 7, 8]).unwrap(); // Define matrix `b`
let c = a.multiply(b).unwrap(); // Perform matrix hadamard product

张量转置

let m = Tensor::new(vec![6], vec![1, 2, 3, 4, 5, 6]).unwrap();
 m.t().unwrap();

张量缩放

let m = Tensor::new(vec![6], vec![1, 2, 3, 4, 5, 6]).unwrap();
let r = Tensor::new(vec![6], vec![5, 10, 15, 20, 25, 30]).unwrap();
 assert-eq!(m.scale(5).unwrap(), r);

梯度下降优化

use iron_learn::Tensor;
use iron_learn::gradient_descent::gradient_descent;

let learning_rate: f64 = 0.01;
let w = Tensor::new(vec![2, 1], vec![3.0, 4.0]).unwrap();
let x = Tensor::new(vec![1, 2], vec![3.0, 4.0]).unwrap();
let y = Tensor::new(vec![1, 1], vec![5.0]).unwrap();
let w = gradient_descent(&x, &y, &w, learning_rate, true);

复数算术

let a = Complex::new(1.0, 2.0);
let b = Complex::new(3.0, 4.0);

let c = a + b;
let c = a - b;
let c = a * b;
let c = a / b;

复数张量加法与乘法

let a = Complex::new(1.0, 2.0);
let b = Complex::new(3.0, 4.0);
let c = Complex::new(5.0, 6.0);
let d = Complex::new(7.0, 8.0);

let m1 = Tensor::new(vec![2, 2], vec![a, b, c, d]).unwrap();

let m2 = Tensor::new(vec![2, 2], vec![a, c, b, d]).unwrap();

let result = m1.add(&m2).unwrap();
let result = m1.mul(&m2).unwrap();

矩阵加法(已弃用,请使用二维 Tensor 代替)

let a = Matrix::new(vec![2, 2], vec![1, 2, 3, 4]).unwrap(); // Define matrix `a`
let b = Matrix::new(vec![2, 2], vec![5, 6, 7, 8]).unwrap(); // Define matrix `b`
let c = (a + b).unwrap(); // Perform matrix addition

矩阵乘法(已弃用,请使用二维 Tensor 代替)

let a = Matrix::new(vec![2, 2], vec![1, 2, 3, 4]).unwrap(); // Define matrix `a`
let b = Matrix::new(vec![2, 2], vec![5, 6, 7, 8]).unwrap(); // Define matrix `b`
let c = (a * b).unwrap(); // Perform matrix multiplication

矩阵哈达玛积(已弃用,请使用二维 Tensor 代替)

let a = Matrix::new(vec![2, 2], vec![1, 2, 3, 4]).unwrap(); // Define matrix `a`
let b = Matrix::new(vec![2, 2], vec![5, 6, 7, 8]).unwrap(); // Define matrix `b`
let c = a.multiply(b).unwrap(); // Perform matrix hadamard product

向量加法(已弃用,请使用一维 Tensor 代替)

let a = Vector::new(vec![2], vec![1, 2]).unwrap(); // Define matrix `a`
let b = Vector::new(vec![2], vec![3, 4]).unwrap(); // Define matrix `b`
let c = (a + b).unwrap(); // Perform matrix addition

向量点积(已弃用,请使用一维 Tensor 代替)

let a = Vector::new(vec![2], vec![1, 2]).unwrap(); // Define matrix `a`
let b = Vector::new(vec![2], vec![3, 4]).unwrap(); // Define matrix `b`
let c = (a * b).unwrap(); // Perform matrix addition

依赖关系

~0.7–1.6MB
~35K SLoC