使用Rust构建高性能机器学习模型

译者 | 布加迪审校 | 重楼机器学习主要使用Python来完成。 Python之所以大受欢迎,是由于它易于学习,并且有许多机器学习库。 而现在,Rust正成为一种强有力的替代语言。

译者 | 布加迪

审校 | 重楼

机器学习主要使用Python来完成。Python之所以大受欢迎,是由于它易于学习,并且有许多机器学习库。而现在,Rust正成为一种强有力的替代语言。Rust速度快,使用内存安全机制,并擅长同时处理多个任务。这些功能特性使Rust非常适合高性能机器学习。

使用Rust构建高性能机器学习模型

Linfa是Rust中的一个库,可以帮助你构建机器学习模型。它使你更容易用Rust创建和使用机器学习模型。我们在本文中将向你介绍如何使用Linfa完成两种机器学习任务:线性回归和k-means聚类。

为什么Rust适合机器学习?

由于以下几个优势,Rust越来越多地被考虑用于机器学习:

1. 性能:Rust是一种编译语言,这使得它的性能特征接近C和C++。它可以从底层控制系统资源,又没有垃圾收集器,因而非常适合机器学习之类注重性能的应用。

2. 内存安全:Rust的突出特性之一是它的所有权模式,这保证了内存安全,不需要垃圾收集器。它消除了许多常见的编程错误,比如空指针解引用或数据竞争。

3. 并发:Rust的并发模式确保了安全并行处理。机器学习常常涉及大型数据集和大量计算。Rust可以高效地处理多线程操作。其所有权系统防止了数据竞争和内存问题。

Linfa简介

Linfa是一个面向Rust的机器学习库。它提供各种机器学习算法,酷似Python的scikit-learn。该库与Rust的生态系统很好地集成。它支持高性能数据操作、统计和优化。Linfa包括线性回归、k-means聚类和支持向量机等算法。这些实现高效且易于使用。开发人员可以利用Rust的速度和安全来构建强大的机器学习模型。

不妨通过两个简单但重要的例子来探索如何使用Linfa以构建机器学习模型:线性回归和k-means聚类。

搭建环境

首先确保已安装了Rust。如果没有,使用以下命令通过rustup来安装它:

复制
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

接下来,将Linfa和相关依赖项添加到你的项目中。打开你的Cargo.toml文件,添加以下内容:

复制
[dependencies]
linfa = "0.5.0"
linfa-linear = "0.5.0" # For linear regression
linfa-clustering = "0.5.0" # For k-means clustering
ndarray = "0.15.4" # For numerical operations
ndarray-rand = "0.14.0" # For random number generation

完成这一步后,你就可以使用Linfa实现机器学习模型了。

Rust的线性回归

线性回归是最简单、最常用的监督学习算法之一。它通过将线性方程拟合到观测的数据中,为因变量y与一个或多个自变量x之间的关系建立模型。在本节中,我们将探究如何使用Rust的Linfa库实现线性回归。

  • 准备数据

为了理解和测试线性回归,我们需要从一个数据集入手。

复制
use ndarray::{Array2, Axis};

fn generate_data() -> Array2 {
 let x = Array2::::from_shape_vec((10, 1), vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]).unwrap();
 let y = x.mapv(|v| 2.0 * v + 1.0);
 let data = ndarray::stack(ndarray::Axis(1), &[x.view(), y.view()]).unwrap();
 data
}

在这里,我们模拟了一个简单的数据集,其中x与y的关系遵循公式:y=2x+1。

  • 训练模型

在准备好数据集之后,我们使用Linfa的LinearRegression(线性回归)模块来训练模型。训练需要通过最小化预测值与实际值之间的误差来确定线性方程(y=mx+c)的系数。使用Linfa的LinearRegression模块,我们在这个数据集上训练了回归模型。

复制
use linfa::prelude::*;
use linfa_linear::LinearRegression;

fn train_model(data: Array2) -> LinearRegression {
 let (x, y) = (data.slice(s![.., 0..1]), data.slice(s![.., 1..2]));
 LinearRegression::default().fit(&x, &y).unwrap()
}

重点:

  1. fit方法学习最适合数据的直线的斜率和截距。
  2. unwrap处理训练期间可能发生的任何错误。
  • 进行预测

在训练模型之后,我们可以用它来预测新数据的结果。

复制
fn make_predictions(model: &LinearRegression, input: Array2) -> Array2 {
 model.predict(&input)
}

fn main() {
 let data = generate_data();
 let model = train_model(data);
 let input = Array2::from_shape_vec((5, 1), vec![11.0, 12.0, 13.0, 14.0, 15.0]).unwrap();
 let predictions = make_predictions(&model, input);
 println!("Predictions: {:?}", predictions);
}

对于输入值[11.0,12.0,13.0,14.0,15.0],预测结果如下:

复制
Predictions: [[23.0], [25.0], [27.0], [29.0], [31.0]]

这个输出对应于y=2x+1。

Rust的K-means聚类

K -means聚类是一种无监督学习算法,它根据相似性将数据划分为k个聚类。

  • 准备数据

为了演示K-means聚类,我们使用ndarray-rand crate生成一个随机数据集。

复制
use ndarray::Array2;
use ndarray_rand::RandomExt;
use rand_distr::Uniform;

fn generate_random_data() -> Array2 {
 let dist = Uniform::new(0.0, 10.0);
 Array2::random((100, 2), dist)
}

这将创建随机点的100x2矩阵,模拟二维数据。

  • 训练模型

train_kmeans_model函数使用Linfa的KMeans模块将数据分组到k=3个聚类中。

复制
use linfa_clustering::KMeans;
use linfa::traits::Fit;

fn train_kmeans_model(data: Array2) -> KMeans {
 KMeans::params(3).fit(&data).unwrap()
}

重点:

  1. KMeans::params(3)表示3个聚类。
  2. fit方法基于数据学习聚类质心。
  • 指定聚类

在训练之后,我们可以将每个数据点分配给其中一个聚类。

复制
fn assign_clusters(model: &KMeans, data: Array2) {
 let labels = model.predict(&data);
 println!("Cluster Labels: {:?}", labels);
}

fn main() {
 let data = generate_random_data();
 let model = train_kmeans_model(data);
 assign_clusters(&model, data);
}

输出将显示分配给每个数据点的聚类标签。每个标签将对应于三个聚类中的一个。

结论

Rust是创建快速机器学习模型的上佳选择。它通过内存安全机制确保处理数据时没有错误。Rust还可以同时使用多个线程,这在处理机器学习中的大型数据集时非常重要。

Linfa库使得你用Rust实现机器学习变得更容易。它可以帮助你轻松使用线性回归和K-means聚类等算法。Rust的所有权系统确保内存安全,又不需要垃圾收集。处理多线程的功能可以防止在处理大量数据时出现错误。

原文标题:Building High-Performance Machine Learning Models in Rust,作者:Jayita Gulati

相关资讯

如何将机器学习模型部署到生产环境?

译者 | 布加迪审校 | 重楼开发机器学习模型只完成了一半工作。 除非部署到生产环境、提供业务价值,否则模型仍然毫无用处。 知道如何部署自己的模型已成为任何数据科学家的一项基本技能,许多雇主已经要求我们能做到这一点。

白宫发文,呼吁开发者放弃C、C++:Rust被「钦点」内存安全

近年来,C、C 编程语言成了美国官方的「眼中钉」,而内存安全的 Rust 等语言摇身一变成了「新宠」。近日,在一份 19 页的报告《回归基础构件:通往安全软件之路》中,白宫国家网络主任办公室(ONCD)呼吁开发者使用「内存安全的编程语言」,比如 Rust 语言。报告指出,从一开始就选择内存安全的编程语言,是以安全设计方式开发软件的重要途径。此外,ONCD 表示,报告中的建议是与包括科技公司、学术界和其他机构合作制定的,并收集了包括惠普、埃森哲和 Palantir 在内等多家科技公司支持报告的意见。报告地址:,这

太酷了!iPhone、iPad、MacBook老旧设备组成异构集群,能跑Llama 3

假如你有闲置的设备,或许可以试一试。这次,你手里的硬件设备也能在 AI 领域大展拳脚了。将 iPhone、iPad、Macbook 进行组合,就能组装成「异构集群推理方案」, 然后顺畅的运行 Llama3 模型。值得一提的是,这个异构集群可以是 Windows 系统,也可以是Linux、iOS 系统,并且对 Android 的支持很快到来。                                                        异构集群正在运行中。根据项目作者 @evilsocket 的介绍,