From fe9498963d2c9e2a9227dd6184a55aee5982b3a7 Mon Sep 17 00:00:00 2001 From: Palash Tyagi <23239946+Magnus167@users.noreply.github.com> Date: Sat, 26 Jul 2025 04:05:56 +0100 Subject: [PATCH] Add linear regression examples --- examples/linear_regression.rs | 83 +++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 examples/linear_regression.rs diff --git a/examples/linear_regression.rs b/examples/linear_regression.rs new file mode 100644 index 0000000..0ad4afe --- /dev/null +++ b/examples/linear_regression.rs @@ -0,0 +1,83 @@ +use rustframe::compute::models::linreg::LinReg; +use rustframe::matrix::Matrix; + +/// Two quick linear regression demonstrations. +/// +/// Example 1 fits a model to predict house price from floor area. +/// Example 2 adds number of bedrooms as a second feature. +fn main() { + example_one_feature(); + println!("\n-----\n"); + example_two_features(); +} + +/// Price ~ floor area +fn example_one_feature() { + println!("Example 1: predict price from floor area only"); + + // Square meters of floor area for a few houses + let sizes = vec![50.0, 60.0, 70.0, 80.0, 90.0, 100.0]; + // Thousands of dollars in sale price + let prices = vec![150.0, 180.0, 210.0, 240.0, 270.0, 300.0]; + + // Each row is a sample with one feature + let x = Matrix::from_vec(sizes.clone(), sizes.len(), 1); + let y = Matrix::from_vec(prices.clone(), prices.len(), 1); + + // Train with a small learning rate + let mut model = LinReg::new(1); + model.fit(&x, &y, 0.0005, 20000); + + let preds = model.predict(&x); + println!("Size (m^2) -> predicted price (k) vs actual"); + for i in 0..x.rows() { + println!( + "{:>3} -> {:>6.1} | {:>6.1}", + sizes[i], + preds[(i, 0)], + prices[i] + ); + } + + let new_house = Matrix::from_vec(vec![120.0], 1, 1); + let pred = model.predict(&new_house); + println!("Predicted price for 120 m^2: {:.1}k", pred[(0, 0)]); +} + +/// Price ~ floor area + bedrooms +fn example_two_features() { + println!("Example 2: price from area and bedrooms"); + + // (size m^2, bedrooms) for each house + let raw_x = vec![ + 50.0, 2.0, 70.0, 2.0, 90.0, 3.0, 110.0, 3.0, 130.0, 4.0, 150.0, 4.0, + ]; + let prices = vec![160.0, 195.0, 250.0, 285.0, 320.0, 350.0]; + + let x = Matrix::from_rows_vec(raw_x, 6, 2); + let y = Matrix::from_vec(prices.clone(), prices.len(), 1); + + let mut model = LinReg::new(2); + model.fit(&x, &y, 0.0001, 50000); + + let preds = model.predict(&x); + println!("size, beds -> predicted | actual (k)"); + for i in 0..x.rows() { + let size = x[(i, 0)]; + let beds = x[(i, 1)]; + println!( + "{:>3} m^2, {:>1} -> {:>6.1} | {:>6.1}", + size, + beds, + preds[(i, 0)], + prices[i] + ); + } + + let new_home = Matrix::from_rows_vec(vec![120.0, 3.0], 1, 2); + let pred = model.predict(&new_home); + println!( + "Predicted price for 120 m^2 with 3 bedrooms: {:.1}k", + pred[(0, 0)] + ); +}