Machine Learning
The compute::models
module bundles several learning algorithms that operate on
Matrix
structures. These examples highlight the basic training and prediction
APIs. For more end‑to‑end walkthroughs see the examples directory in the
repository.
Currently implemented models include:
- Linear and logistic regression
- K‑means clustering
- Principal component analysis (PCA)
- Gaussian Naive Bayes
- Dense neural networks
Linear Regression
#![allow(unused)] fn main() { extern crate rustframe; use rustframe::compute::models::linreg::LinReg; use rustframe::matrix::Matrix; let x = Matrix::from_vec(vec![1.0, 2.0, 3.0, 4.0], 4, 1); let y = Matrix::from_vec(vec![2.0, 3.0, 4.0, 5.0], 4, 1); let mut model = LinReg::new(1); model.fit(&x, &y, 0.01, 100); let preds = model.predict(&x); assert_eq!(preds.rows(), 4); }
K-means Walkthrough
#![allow(unused)] fn main() { extern crate rustframe; use rustframe::compute::models::k_means::KMeans; use rustframe::matrix::Matrix; let data = Matrix::from_vec(vec![1.0, 1.0, 5.0, 5.0], 2, 2); let (model, _labels) = KMeans::fit(&data, 2, 10, 1e-4); let new_point = Matrix::from_vec(vec![0.0, 0.0], 1, 2); let cluster = model.predict(&new_point)[0]; }
Logistic Regression
#![allow(unused)] fn main() { extern crate rustframe; use rustframe::compute::models::logreg::LogReg; use rustframe::matrix::Matrix; let x = Matrix::from_vec(vec![1.0, 2.0, 3.0, 4.0], 4, 1); let y = Matrix::from_vec(vec![0.0, 0.0, 1.0, 1.0], 4, 1); let mut model = LogReg::new(1); model.fit(&x, &y, 0.1, 200); let preds = model.predict_proba(&x); assert_eq!(preds.rows(), 4); }
Principal Component Analysis
#![allow(unused)] fn main() { extern crate rustframe; use rustframe::compute::models::pca::PCA; use rustframe::matrix::Matrix; let data = Matrix::from_vec(vec![1.0, 2.0, 3.0, 4.0], 2, 2); let pca = PCA::fit(&data, 1, 0); let transformed = pca.transform(&data); assert_eq!(transformed.cols(), 1); }
Gaussian Naive Bayes
Gaussian Naive Bayes classifier for continuous features:
#![allow(unused)] fn main() { extern crate rustframe; use rustframe::compute::models::gaussian_nb::GaussianNB; use rustframe::matrix::Matrix; // Training data with 2 features let x = Matrix::from_rows_vec(vec![ 1.0, 2.0, 2.0, 3.0, 3.0, 4.0, 4.0, 5.0 ], 4, 2); // Class labels (0 or 1) let y = Matrix::from_vec(vec![0.0, 0.0, 1.0, 1.0], 4, 1); // Train the model let mut model = GaussianNB::new(1e-9, true); model.fit(&x, &y); // Make predictions let predictions = model.predict(&x); assert_eq!(predictions.rows(), 4); }
Dense Neural Networks
Simple fully connected neural network:
#![allow(unused)] fn main() { extern crate rustframe; use rustframe::compute::models::dense_nn::{DenseNN, DenseNNConfig, ActivationKind, InitializerKind, LossKind}; use rustframe::matrix::Matrix; // Training data with 2 features let x = Matrix::from_rows_vec(vec![ 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0 ], 4, 2); // XOR target outputs let y = Matrix::from_vec(vec![0.0, 1.0, 1.0, 0.0], 4, 1); // Create a neural network with 2 hidden layers let config = DenseNNConfig { input_size: 2, hidden_layers: vec![4, 4], output_size: 1, activations: vec![ActivationKind::Sigmoid, ActivationKind::Sigmoid, ActivationKind::Sigmoid], initializer: InitializerKind::Uniform(0.5), loss: LossKind::MSE, learning_rate: 0.1, epochs: 1000, }; let mut model = DenseNN::new(config); // Train the model model.train(&x, &y); // Make predictions let predictions = model.predict(&x); assert_eq!(predictions.rows(), 4); }
Real-world Examples
Housing Price Prediction
#![allow(unused)] fn main() { extern crate rustframe; use rustframe::compute::models::linreg::LinReg; use rustframe::matrix::Matrix; // Features: square feet and bedrooms let features = Matrix::from_rows_vec(vec![ 2100.0, 3.0, 1600.0, 2.0, 2400.0, 4.0, 1400.0, 2.0, ], 4, 2); // Sale prices let target = Matrix::from_vec(vec![400_000.0, 330_000.0, 369_000.0, 232_000.0], 4, 1); let mut model = LinReg::new(2); model.fit(&features, &target, 1e-8, 10_000); // Predict price of a new home let new_home = Matrix::from_vec(vec![2000.0, 3.0], 1, 2); let predicted_price = model.predict(&new_home); println!("Predicted price: ${}", predicted_price.data()[0]); }
Spam Detection
#![allow(unused)] fn main() { extern crate rustframe; use rustframe::compute::models::logreg::LogReg; use rustframe::matrix::Matrix; // 20 e-mails × 5 features = 100 numbers (row-major, spam first) let x = Matrix::from_rows_vec( vec![ // ─────────── spam examples ─────────── 2.0, 1.0, 1.0, 1.0, 1.0, // "You win a FREE offer - click for money-back bonus!" 1.0, 0.0, 1.0, 1.0, 0.0, // "FREE offer! Click now!" 0.0, 2.0, 0.0, 1.0, 1.0, // "Win win win - money inside, click…" 1.0, 1.0, 0.0, 0.0, 1.0, // "Limited offer to win easy money…" 1.0, 0.0, 1.0, 0.0, 1.0, // ... 0.0, 1.0, 1.0, 1.0, 0.0, // ... 2.0, 0.0, 0.0, 1.0, 1.0, // ... 0.0, 1.0, 1.0, 0.0, 1.0, // ... 1.0, 1.0, 1.0, 1.0, 0.0, // ... 1.0, 0.0, 0.0, 1.0, 1.0, // ... // ─────────── ham examples ─────────── 0.0, 0.0, 0.0, 0.0, 0.0, // "See you at the meeting tomorrow." 0.0, 0.0, 0.0, 1.0, 0.0, // "Here's the Zoom click-link." 0.0, 0.0, 0.0, 0.0, 1.0, // "Expense report: money attached." 0.0, 0.0, 0.0, 1.0, 1.0, // ... 0.0, 1.0, 0.0, 0.0, 0.0, // "Did we win the bid?" 0.0, 0.0, 0.0, 0.0, 0.0, // ... 0.0, 0.0, 0.0, 1.0, 0.0, // ... 1.0, 0.0, 0.0, 0.0, 0.0, // "Special offer for staff lunch." 0.0, 0.0, 0.0, 0.0, 0.0, // ... 0.0, 0.0, 0.0, 1.0, 0.0, ], 20, 5, ); // Labels: 1 = spam, 0 = ham let y = Matrix::from_vec( vec![ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, // 10 spam 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, // 10 ham ], 20, 1, ); // Train let mut model = LogReg::new(5); model.fit(&x, &y, 0.01, 5000); // Predict // e.g. "free money offer" let email_data = vec![1.0, 0.0, 1.0, 0.0, 1.0]; let email = Matrix::from_vec(email_data, 1, 5); let prob_spam = model.predict_proba(&email); println!("Probability of spam: {:.4}", prob_spam.data()[0]); }
Iris Flower Classification
#![allow(unused)] fn main() { extern crate rustframe; use rustframe::compute::models::gaussian_nb::GaussianNB; use rustframe::matrix::Matrix; // Features: sepal length and petal length let x = Matrix::from_rows_vec(vec![ 5.1, 1.4, // setosa 4.9, 1.4, // setosa 6.2, 4.5, // versicolor 5.9, 5.1, // virginica ], 4, 2); let y = Matrix::from_vec(vec![0.0, 0.0, 1.0, 2.0], 4, 1); let names = vec!["setosa", "versicolor", "virginica"]; let mut model = GaussianNB::new(1e-9, true); model.fit(&x, &y); let sample = Matrix::from_vec(vec![5.0, 1.5], 1, 2); let predicted_class = model.predict(&sample); let class_name = names[predicted_class.data()[0] as usize]; println!("Predicted class: {} ({:?})", class_name, predicted_class.data()[0]); }
Customer Segmentation
#![allow(unused)] fn main() { extern crate rustframe; use rustframe::compute::models::k_means::KMeans; use rustframe::matrix::Matrix; // Each row: [age, annual_income] let customers = Matrix::from_rows_vec( vec![ 25.0, 40_000.0, 34.0, 52_000.0, 58.0, 95_000.0, 45.0, 70_000.0, ], 4, 2, ); let (model, labels) = KMeans::fit(&customers, 2, 20, 1e-4); let new_customer = Matrix::from_vec(vec![30.0, 50_000.0], 1, 2); let cluster = model.predict(&new_customer)[0]; println!("New customer belongs to cluster: {}", cluster); println!("Cluster labels: {:?}", labels); }
For helper functions and upcoming modules, visit the utilities section.