Skip to main content

sklears_feature_selection/genetic_optimization/
featurediversityobjective_traits.rs

1//! # FeatureDiversityObjective - Trait Implementations
2//!
3//! This module contains trait implementations for `FeatureDiversityObjective`.
4//!
5//! ## Implemented Traits
6//!
7//! - `ObjectiveFunction`
8//!
9//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
10
11use 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}