sklears_feature_selection/genetic_optimization/
featurediversityobjective_traits.rs1use super::functions::*;
12use super::types::*;
13use scirs2_core::ndarray::{Array1, Array2};
14use sklears_core::error::Result as SklResult;
15
16impl ObjectiveFunction for FeatureDiversityObjective {
17 fn evaluate(
18 &self,
19 x: &Array2<f64>,
20 _y_classif: Option<&Array1<i32>>,
21 _y_regression: Option<&Array1<f64>>,
22 feature_mask: &[bool],
23 ) -> SklResult<f64> {
24 let selected_indices: Vec<usize> = feature_mask
25 .iter()
26 .enumerate()
27 .filter_map(|(i, &selected)| if selected { Some(i) } else { None })
28 .collect();
29 if selected_indices.len() < 2 {
30 return Ok(1.0);
31 }
32 let mut total_correlation = 0.0;
33 let mut pair_count = 0;
34 for i in 0..selected_indices.len() {
35 for j in (i + 1)..selected_indices.len() {
36 let feature_i = x.column(selected_indices[i]).to_owned();
37 let feature_j = x.column(selected_indices[j]).to_owned();
38 let correlation = compute_pearson_correlation(&feature_i, &feature_j).abs();
39 total_correlation += correlation;
40 pair_count += 1;
41 }
42 }
43 let avg_correlation = if pair_count > 0 {
44 total_correlation / pair_count as f64
45 } else {
46 0.0
47 };
48 Ok(1.0 - avg_correlation)
49 }
50 fn name(&self) -> &str {
51 "feature_diversity"
52 }
53 fn clone_box(&self) -> Box<dyn ObjectiveFunction> {
54 Box::new(self.clone())
55 }
56}