Skip to main content

aip/utils/
math.rs

1pub fn normalize(v: &mut [f32], mean: f32, std: f32) {
2    for x in v.iter_mut() {
3        *x = (*x - mean) / std;
4    }
5}
6
7pub fn pearson_correlation(x: &[f32], y: &[f32]) -> f32 {
8    let n = x.len() as f32;
9    let sum_x: f32 = x.iter().sum();
10    let sum_y: f32 = y.iter().sum();
11    let sum_xy: f32 = x.iter().zip(y.iter()).map(|(a, b)| a * b).sum();
12    let sum_x2: f32 = x.iter().map(|a| a * a).sum();
13    let sum_y2: f32 = y.iter().map(|a| a * a).sum();
14    
15    let numerator = n * sum_xy - sum_x * sum_y;
16    let denominator = ((n * sum_x2 - sum_x * sum_x) * (n * sum_y2 - sum_y * sum_y)).sqrt();
17    
18    if denominator == 0.0 {
19        0.0
20    } else {
21        numerator / denominator
22    }
23}
24
25pub fn mse(predicted: &[f32], target: &[f32]) -> f32 {
26    let n = predicted.len() as f32;
27    predicted.iter()
28        .zip(target.iter())
29        .map(|(p, t)| (p - t).powi(2))
30        .sum::<f32>()
31        / n
32}
33
34pub fn concordance_correlation_coefficient(predicted: &[f32], target: &[f32]) -> f32 {
35    let n = predicted.len() as f32;
36    let mean_p: f32 = predicted.iter().sum::<f32>() / n;
37    let mean_t: f32 = target.iter().sum::<f32>() / n;
38    
39    let var_p: f32 = predicted.iter()
40        .map(|p| (p - mean_p).powi(2))
41        .sum::<f32>() / n;
42    let var_t: f32 = target.iter()
43        .map(|t| (t - mean_t).powi(2))
44        .sum::<f32>() / n;
45    
46    let cov: f32 = predicted.iter()
47        .zip(target.iter())
48        .map(|(p, t)| (p - mean_p) * (t - mean_t))
49        .sum::<f32>() / n;
50    
51    let numerator = 2.0 * cov;
52    let denominator = var_p + var_t + (mean_p - mean_t).powi(2);
53    
54    if denominator == 0.0 {
55        0.0
56    } else {
57        numerator / denominator
58    }
59}