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}