kernel_density_estimation/bandwidth/
scott.rs

1//! Scott's rule for bandwidth selection.
2
3use crate::bandwidth::Bandwidth;
4use crate::float::{float, KDEFloat};
5use crate::internal::variance;
6
7/// Scott's rule for bandwidth selection.
8#[derive(Clone, Copy, Debug)]
9pub struct Scott;
10
11impl<F: KDEFloat> Bandwidth<F> for Scott {
12    fn bandwidth(&self, data: &[F]) -> F {
13        let prefactor = float!(1.06);
14        let n = float!(data.len());
15        let var = variance(data);
16        let numerator = prefactor * var.sqrt();
17        let denominator = float!(n.powf(float!(0.2)));
18        numerator / denominator
19    }
20}
21
22#[cfg(test)]
23mod tests {
24    use super::{Bandwidth, Scott};
25    use approx::*;
26
27    #[test]
28    fn scott() {
29        let data = vec![1.0, 1.5, 2.0, 2.5, 3.0];
30        let res = Scott.bandwidth(&data);
31        assert_relative_eq!(res, 0.60736, epsilon = 1.0e-5);
32    }
33}