译者 | 布加迪
审校 | 重楼
机器学习主要使用Python来完成。Python之所以大受欢迎,是由于它易于学习,并且有许多机器学习库。而现在,Rust正成为一种强有力的替代语言。Rust速度快,使用内存安全机制,并擅长同时处理多个任务。这些功能特性使Rust非常适合高性能机器学习。
Linfa是Rust中的一个库,可以帮助你构建机器学习模型。它使你更容易用Rust创建和使用机器学习模型。我们在本文中将向你介绍如何使用Linfa完成两种机器学习任务:线性回归和k-means聚类。
由于以下几个优势,Rust越来越多地被考虑用于机器学习:
1. 性能:Rust是一种编译语言,这使得它的性能特征接近C和C++。它可以从底层控制系统资源,又没有垃圾收集器,因而非常适合机器学习之类注重性能的应用。
2. 内存安全:Rust的突出特性之一是它的所有权模式,这保证了内存安全,不需要垃圾收集器。它消除了许多常见的编程错误,比如空指针解引用或数据竞争。
3. 并发:Rust的并发模式确保了安全并行处理。机器学习常常涉及大型数据集和大量计算。Rust可以高效地处理多线程操作。其所有权系统防止了数据竞争和内存问题。
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实现机器学习模型了。
线性回归是最简单、最常用的监督学习算法之一。它通过将线性方程拟合到观测的数据中,为因变量y与一个或多个自变量x之间的关系建立模型。在本节中,我们将探究如何使用Rust的Linfa库实现线性回归。
准备数据
为了理解和测试线性回归,我们需要从一个数据集入手。
use ndarray::{Array2,Axis};fngenerate_data()->Array2{letx=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();lety=x.mapv(|v|2.0*v+1.0);letdata=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;fntrain_model(data:Array2)->LinearRegression{let(x,y)=(data.slice(s![..,0..1]),data.slice(s![..,1..2]));LinearRegression::default().fit(&x,&y).unwrap()}
重点:
fit方法学习最适合数据的直线的斜率和截距。
unwrap处理训练期间可能发生的任何错误。
进行预测
在训练模型之后,我们可以用它来预测新数据的结果。
fnmake_predictions(model:&LinearRegression,input:Array2)->Array2{model.predict(&input)}fnmain(){letdata=generate_data();letmodel=train_model(data);letinput=Array2::from_shape_vec((5,1),vec![11.0,12.0,13.0,14.0,15.0]).unwrap();letpredictions=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。
K -means聚类是一种无监督学习算法,它根据相似性将数据划分为k个聚类。
准备数据
为了演示K-means聚类,我们使用ndarray-rand crate生成一个随机数据集。
use ndarray::Array2;use ndarray_rand::RandomExt;use rand_distr::Uniform;fngenerate_random_data()->Array2{letdist=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;fntrain_kmeans_model(data:Array2)->KMeans{KMeans::params(3).fit(&data).unwrap()}
重点:
KMeans::params(3)表示3个聚类。
fit方法基于数据学习聚类质心。
指定聚类
在训练之后,我们可以将每个数据点分配给其中一个聚类。
fnassign_clusters(model:&KMeans,data:Array2){letlabels=model.predict(&data);println!("Cluster Labels: {:?}",labels);}fnmain(){letdata=generate_random_data();letmodel=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