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 |
|
在机器学习中排名第106
每月下载量594次
67KB
764 行
iron_learn
一个纯Rust机器学习库
状态
版本0.4.0发布,包含逻辑回归算法。现在你可以直接使用linear_regression
或logistic_regression
函数,而不是直接使用已标记为弃用的gradient_descent
函数,该函数将引入破坏性更改,并且在将来可能会被移除。目前正在积极开发以支持进一步的实现。
注意:这个库是Rust学习努力的产品。因此,使用“学校等级”算法进行矩阵乘法。我计划在未来提高性能部分。
概述
这个库旨在通过重点放在线性代数操作上,来简化机器学习任务。目前,该库支持矩阵加法、减法、乘法、转置以及通过标量缩放,为构建更复杂的机器学习算法提供了一个强大的基础。
模块
tensor
在库的核心,tensor
模块支持多维Tensor
数据结构。它包括用于张量实例化的方法,并定义了用于张量加法的+
操作符,用于减法的-
操作符和用于张量乘法的*
操作符。然而,这些操作符会拥有变量(包括rhs
和lhs
)。因此,变量之后不能再使用。为了便于在没有所有权问题的前提下执行这些操作,它还提供了add
、sub
和mul
方法来执行加法、减法和除法,通过借用变量来执行操作。
此外,它还提供了t
方法进行转置和multiply
方法进行Hadamard积,即逐元素乘法操作。它还提供了scale
方法进行标量缩放。
由于多种原因,对 Tensor
的这些操作可能会失败,因此它返回一个结果对象。该库假设用户能够更好地处理错误,而不是引发 panic
。
注意: 此模块仅限于支持二维矩阵。这是一个临时限制,我计划在未来移除这个限制。
复杂
complex
模块是实验性的,它提供了复数的表示,这在各种机器学习计算中是基本的,尤其是在处理涉及复值数据的操作中。 Complex
类型支持所有算术操作。
数值
此模块定义了机器学习操作所需的全部支持的数值类型,包括整数、无符号和浮点变体,以及自定义类型 Complex
。
梯度下降
gradient_descent
函数执行梯度下降优化算法的单步。它可以用于线性回归和逻辑回归,通过布尔参数配置。
matrix
(使用二维 Tensor
代替)
matrix
matrix
模块提供了 Matrix
结构,它作为二维 Tensor
对象的包装,使矩阵运算成为可能。它定义了矩阵加法和乘法运算的 +
和 *
运算符,分别对应于张量的行为。它还启用 multiply
方法来支持两个矩阵的哈达玛积。
vector
(使用一维 Tensor
代替)
vector
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