kernel_density_estimation/bandwidth/
scott.rs1use crate::bandwidth::Bandwidth;
4use crate::float::{float, KDEFloat};
5use crate::internal::variance;
6
7#[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}