dendritic_preprocessing/
standard_scalar.rs

1use dendritic_ndarray::ndarray::NDArray;
2use dendritic_ndarray::ops::*;
3
4/// Standard scalar normalization of data
5pub fn standard_scalar(input: NDArray<f64>) -> Result<NDArray<f64>, String>  {
6   
7    if input.rank() < 2 {
8       return Err(
9           "Standard Scalar: Must be with rank 2 or higher".to_string()
10        ); 
11    } 
12
13    let mean_vals = input.mean(1).unwrap();
14    let stdev_vals = input.stdev(1).unwrap();
15    let shape = input.shape().dim(1);
16    let mut feature_vec: Vec<f64> = Vec::new();
17
18    for idx in 0..shape {
19        let axis_vals = input.axis(1, idx).unwrap();
20        let mean_val = mean_vals[idx];
21        let stdev_val = stdev_vals[idx];
22        let subtract_mean = axis_vals.scalar_subtract(mean_val).unwrap();
23        let div_stdev = subtract_mean.scalar_div(stdev_val).unwrap();
24        let mut dev_vals = div_stdev.values().clone();
25        feature_vec.append(&mut dev_vals);
26    }
27
28    let temp: NDArray<f64> = NDArray::array(
29        vec![shape, input.shape().dim(0)],
30        feature_vec
31    ).unwrap();
32
33    let result = temp.transpose().unwrap();
34    Ok(result)
35}
36
37
38/// Min Max normalization of data
39pub fn min_max_scalar(input: NDArray<f64>) -> Result<NDArray<f64>, String> {
40
41    if input.rank() < 2 {
42       return Err(
43           "MinMax Scalar: Must be with rank 2 or higher".to_string()
44        ); 
45    }
46
47    let shape = input.shape().dim(1);
48    let mut feature_vec: Vec<f64> = Vec::new();
49
50    for idx in 0..shape {
51
52        let axis_vals = input.axis(1, idx).unwrap();
53
54        let min = axis_vals.values().iter().min_by(
55            |a, b| a.total_cmp(b)
56        ).unwrap();
57
58        let max = axis_vals.values().iter().max_by(
59            |a, b| a.total_cmp(b)
60        ).unwrap();
61
62        let subtract_min = axis_vals.scalar_subtract(*min).unwrap();
63        let min_max = max - min;
64        let div = subtract_min.scalar_div(min_max).unwrap();
65        let mut div_values = div.values().clone();
66        feature_vec.append(&mut div_values);
67    }
68
69
70    let temp: NDArray<f64> = NDArray::array(
71        vec![shape, input.shape().dim(0)],
72        feature_vec
73    ).unwrap();
74
75    let result = temp.transpose().unwrap();
76    Ok(result)
77}