#[non_exhaustive]pub struct FunFemConfig {
pub k: usize,
pub ncomp: usize,
pub p_disc: usize,
pub max_iter: usize,
pub tol: f64,
pub seed: u64,
}Expand description
Configuration for funFEM discriminative-subspace clustering.
funFEM applies the Fisher-EM algorithm to functional data: it first extracts
global FPC scores via fdata_to_pc_1d,
then alternates between finding a discriminative subspace (maximising
between-class vs within-class scatter) and running a GMM E/M step in that
subspace.
§Divergence from R funFEM
This is a simplified Fisher-EM implementation. The discriminative subspace is found by computing W_soft^{-1} B_soft via Cholesky inversion followed by an SVD (instead of a proper generalized-eigenvalue solver), because no generalized-eigenvalue crate is used. The multi-pass outer loop re-estimates the subspace at each iteration. This diverges from the iterative schedule in the original paper (Bouveyron & Brunet, 2014) but gives practical cluster recovery on well-separated functional data.
§Example
use fdars_core::clustering_advanced::{funfem_cluster, FunFemConfig};
use fdars_core::matrix::FdMatrix;
use std::f64::consts::PI;
let m = 30;
let n = 12;
let t: Vec<f64> = (0..m).map(|i| i as f64 / (m - 1) as f64).collect();
let mut col_major = vec![0.0_f64; n * m];
for i in 0..6 {
for (j, &tj) in t.iter().enumerate() {
col_major[i + j * n] = (2.0 * PI * tj).sin();
}
}
for i in 6..12 {
for (j, &tj) in t.iter().enumerate() {
col_major[i + j * n] = (2.0 * PI * tj).sin() + 5.0;
}
}
let data = FdMatrix::from_column_major(col_major, n, m).unwrap();
let mut cfg = FunFemConfig::default();
cfg.k = 2;
cfg.ncomp = 4;
let result = funfem_cluster(&data, &t, &cfg).unwrap();
assert_eq!(result.cluster.len(), n);Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.k: usizeNumber of clusters (default: 2). Must be ≥ 1 and ≤ n.
ncomp: usizeNumber of global FPC components for the score space (default: 10).
Clamped internally to min(n, m).
p_disc: usizeDiscriminative subspace dimension (default: 0 = auto = min(k-1, ncomp_eff)).
Clamped to ncomp_eff if larger.
max_iter: usizeMaximum outer Fisher-EM iterations (default: 50).
tol: f64Log-likelihood convergence tolerance (default: 1e-6).
seed: u64Random seed for k-means++ initialization (default: 42).
Trait Implementations§
Source§impl Clone for FunFemConfig
impl Clone for FunFemConfig
Source§fn clone(&self) -> FunFemConfig
fn clone(&self) -> FunFemConfig
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for FunFemConfig
impl Debug for FunFemConfig
Source§impl Default for FunFemConfig
impl Default for FunFemConfig
Source§impl PartialEq for FunFemConfig
impl PartialEq for FunFemConfig
impl StructuralPartialEq for FunFemConfig
Auto Trait Implementations§
impl Freeze for FunFemConfig
impl RefUnwindSafe for FunFemConfig
impl Send for FunFemConfig
impl Sync for FunFemConfig
impl Unpin for FunFemConfig
impl UnsafeUnpin for FunFemConfig
impl UnwindSafe for FunFemConfig
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
impl<T> Scalar for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.