Rust机器学习库Linfa的使用:高效实现分类、回归和聚类等机器学习算法

Rust机器学习库Linfa的使用:高效实现分类、回归和聚类等机器学习算法

Linfa mascot icon

Linfa是一个Rust语言的机器学习库,旨在提供全面的工具包来构建机器学习应用。它的设计理念与Python的scikit-learn相似,专注于常见的预处理任务和经典的机器学习算法。

当前状态

Linfa目前提供以下算法的子包:

名称 用途 状态 类别 说明
clustering 数据聚类 已测试/基准测试 无监督学习 包含K-Means、高斯混合模型、DBSCAN和OPTICS
kernel 数据转换的核方法 已测试 预处理 将特征向量映射到高维空间
linear 线性回归 已测试 部分拟合 包含普通最小二乘法(OLS)、广义线性模型(GLM)
elasticnet 弹性网络 已测试 监督学习 带弹性网络约束的线性回归
logistic 逻辑回归 已测试 部分拟合 构建二分类逻辑回归模型
reduction 降维 已测试 预处理 扩散映射和主成分分析(PCA)
trees 决策树 已测试/基准测试 监督学习 线性决策树
svm 支持向量机 已测试 监督学习 标记数据集的分类或回归分析
hierarchical 凝聚层次聚类 已测试 无监督学习 聚类和构建聚类层次结构
bayes 朴素贝叶斯 已测试 监督学习 包含高斯朴素贝叶斯
ica 独立成分分析 已测试 无监督学习 包含FastICA实现
pls 偏最小二乘 已测试 监督学习 包含用于降维和回归的PLS估计器
tsne 降维 已测试 无监督学习 包含精确解和Barnes-Hut近似t-SNE
preprocessing 归一化和向量化 已测试/基准测试 预处理 包含数据归一化/白化和计数向量化/tf-idf
nn 最近邻和距离 已测试/基准测试 预处理 空间索引结构和距离函数
ftrl 跟随正则化领导者-近端 已测试/基准测试 部分拟合 包含L1和L2正则化,支持增量更新

示例代码

以下是使用Linfa进行K-Means聚类的完整示例:

use linfa::Dataset;
use linfa_clustering::KMeans;
use ndarray::{array, Array, Array2};

fn main() {
    // 创建测试数据
    let data: Array2<f64> = array![
        [1., 2.],
        [1., 4.],
        [1., 0.],
        [4., 2.],
        [4., 4.],
        [4., 0.]
    ];

    // 创建数据集
    let dataset = Dataset::from(data);

    // 创建K-Means模型,设置3个聚类中心
    let model = KMeans::params(3)
        .max_n_iterations(200)
        .tolerance(1e-5)
        .fit(&dataset)
        .expect("Failed to fit KMeans model");

    // 预测数据点的聚类标签
    let labels = model.predict(&dataset);

    println!("聚类结果: {:?}", labels);
}

以下是逻辑回归分类的完整示例:

use linfa::traits::{Fit, Predict};
use linfa_logistic::LogisticRegression;
use ndarray::{array, Array2};

fn main() {
    // 创建特征矩阵和标签向量
    let features: Array2<f64> = array![
        [1.0, 2.0],
        [2.0, 3.0],
        [3.0, 1.0],
        [4.0, 3.0],
        [5.0, 2.0]
    ];
    let labels = array![0, 0, 0, 1, 1];

    // 创建逻辑回归模型
    let model = LogisticRegression::default()
        .fit(&features, &labels)
        .expect("Failed to fit logistic regression model");

    // 预测新数据
    let new_data = array![[6.0, 1.0], [1.0, 1.0]];
    let predictions = model.predict(&new_data);

    println!("预测结果: {:?}", predictions);
}

完整示例代码

线性回归示例

use linfa::traits::{Fit, Predict};
use linfa_linear::LinearRegression;
use ndarray::{array, Array2};

fn main() {
    // 创建训练数据 (特征矩阵和标签向量)
    let features: Array2<f64> = array![
        [1., 1.],
        [1., 2.],
        [2., 2.],
        [2., 3.]
    ];
    let labels = array![1., 3., 5., 7.];

    // 创建线性回归模型
    let model = LinearRegression::default()
        .fit(&features, &labels)
        .expect("Failed to fit linear regression model");

    // 预测新数据
    let new_data = array![[3., 5.], [1., 0.]];
    let predictions = model.predict(&new_data);

    println!("预测结果: {:?}", predictions);
}

PCA降维示例

use linfa::traits::Fit;
use linfa_reduction::Pca;
use ndarray::{array, Array2};

fn main() {
    // 创建样本数据
    let data: Array2<f64> = array![
        [0.5, 1.0],
        [1.0, 2.0],
        [1.5, 3.0],
        [2.0, 4.0],
        [2.5, 5.0]
    ];

    // 创建PCA模型,设置降维到1个主成分
    let model = Pca::params(1)
        .fit(&data)
        .expect("Failed to fit PCA model");

    // 转换数据到主成分空间
    let transformed = model.transform(&data);

    println!("降维后数据: {:?}", transformed);
}

BLAS/Lapack后端

部分算法需要使用外部库进行线性代数运算。默认使用纯Rust实现,但也可以通过启用blas功能和相应的BLAS后端功能来使用外部BLAS/LAPACK后端库。当前可选的BLAS/LAPACK后端包括:openblasnetblasintel-mkl

后端 Linux Windows macOS
OpenBLAS ✔️ - -
Netlib ✔️ - -
Intel MKL ✔️ ✔️ ✔️

安装

在项目目录中运行以下Cargo命令:

cargo add linfa

或者在Cargo.toml中添加:

linfa = "0.7.1"

许可证

该项目采用双重许可,与Rust项目兼容。根据Apache许可证2.0版或MIT许可证授权。


1 回复

Rust机器学习库Linfa使用指南

完整示例代码

下面是一个完整的Linfa使用示例,结合了数据集准备、模型训练和预测的完整流程:

// 导入必要的模块
use linfa::Dataset;
use linfa::traits::{Fit, Predict};
use linfa_logistic::LogisticRegression;
use ndarray::{array, Array2};

fn main() {
    // 1. 准备数据集
    // 创建特征矩阵 - 4个样本,每个样本2个特征
    let features: Array2<f64> = array![
        [1.0, 2.0],  // 样本1
        [2.0, 3.0],  // 样本2
        [3.0, 4.0],  // 样本3
        [4.0, 5.0]   // 样本4
    ];
    
    // 创建目标值 - 二分类问题(0或1)
    let targets = array![0, 0, 1, 1];
    
    // 创建Dataset对象
    let dataset = Dataset::new(features, targets);
    
    // 2. 创建并训练逻辑回归模型
    let model = LogisticRegression::default()
        .fit(&dataset)
        .expect("模型训练失败");
    
    // 3. 使用训练好的模型进行预测
    // 准备新样本数据
    let new_samples = array![
        [0.5, 1.5],  // 预测应接近0
        [3.5, 4.5],  // 预测应接近1
        [5.0, 6.0]   // 预测应接近1
    ];
    
    // 进行预测
    let predicted = model.predict(&new_samples);
    
    // 输出预测结果
    println!("预测结果: {:?}", predicted);
    
    // 4. 评估模型(使用相同的训练数据作为演示)
    let accuracy = model.accuracy(&dataset);
    println!("模型准确率: {:.2}", accuracy);
}

示例说明

  1. 数据集准备

    • 使用ndarray创建特征矩阵和目标值数组
    • 将数据包装成Linfa的Dataset结构
  2. 模型训练

    • 创建默认参数的逻辑回归模型
    • 调用fit()方法在数据集上进行训练
  3. 模型预测

    • 准备新样本数据
    • 使用训练好的模型进行预测
    • 输出预测结果
  4. 模型评估

    • 使用训练数据计算模型准确率(实际应用中应使用测试集)

扩展功能示例

以下示例展示了如何结合特征缩放和交叉验证:

use linfa::preprocessing::Scaler;
use linfa::model_selection::CrossValidation;
use linfa_logistic::LogisticRegression;

fn advanced_example() {
    // 准备数据(同上)
    let features = array![
        [1.0, 2.0], 
        [2.0, 3.0],
        [3.0, 4.0],
        [4.0, 5.0]
    ];
    let targets = array![0, 0, 1, 1];
    let dataset = Dataset::new(features, targets);
    
    // 特征缩放
    let scaler = Scaler::standard().fit(&dataset).unwrap();
    let scaled_dataset = scaler.transform(dataset);
    
    // 5折交叉验证
    let cv = CrossValidation::default().split_count(5);
    
    let results = cv.fit_with(
        &LogisticRegression::default(),
        &scaled_dataset,
        |model, train, test| {
            let model = model.fit(train)?;
            Ok(model.accuracy(test))
        }
    ).unwrap();
    
    println!("交叉验证结果: {:?}", results);
    println!("平均准确率: {:.2}", results.iter().sum::<f32>() / results.len() as f32);
}

这个完整示例展示了Linfa的核心功能,包括数据准备、模型训练、预测和评估,以及高级功能如特征缩放和交叉验证。

回到顶部