1use core::panic;
9
10pub struct Equation {
12 k: f32,
13 b: f32
14}
15
16
17pub fn linear_regression(data: &Vec<(f32, f32)>) -> Equation {
19 if data.len() == 0 {
21 panic!("Enter non-zero data")
22 }
23
24 let x_mean: f32 = data.iter().map(|point| point.1).sum::<f32>() / data.len() as f32;
26 let y_mean: f32 = data.iter().map(|point| point.0).sum::<f32>() / data.len() as f32;
27 let xy_mean: f32 = data.iter().map(|point| point.1 * point.0).sum::<f32>() / data.len() as f32;
28 let x_square_mean: f32 = data.iter().map(|point| point.1 * point.1).sum::<f32>() / data.len() as f32;
29
30 if x_square_mean - (x_mean * x_mean) == 0.0 {
32 panic!("Can't divide by zero")
33 }
34
35 let k: f32 = (xy_mean - (x_mean * y_mean)) / (x_square_mean - (x_mean * x_mean));
37 let b: f32 = y_mean - (k * x_mean);
38
39 print!("Regression line: ");
40 #[allow(illegal_floating_point_literal_pattern)]
41 match (k, b) {
44 (1.0, 0.0) => println!("y = x"),
46 (1.0, _) => println!("y = x + {}", b),
47 (0.0, _) => println!("y = {}", b),
48
49 (_, 0.0) => println!("y = {}x", k),
51
52 _ => println!("y = {}x + {}", k, b)
54 }
55 println!("-----------------------------------------");
56
57 Equation { k, b }
59}
60
61pub fn predict(e: &Equation, x: f32) -> () {
62 println!("In {} Georgian GDP would be: ${:.3}B\nBut now it is $18.7B", x, e.k * x + e.b);
64}