use crate::DType;
use numr::error::Result;
use numr::runtime::Runtime;
use numr::tensor::Tensor;
use super::kmeans::KMeansResult;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum BisectingStrategy {
#[default]
BiggestCluster,
HighestSSE,
}
#[derive(Debug, Clone)]
pub struct BisectingKMeansOptions {
pub n_clusters: usize,
pub max_iter: usize,
pub tol: f64,
pub n_init: usize,
pub bisecting_strategy: BisectingStrategy,
}
impl Default for BisectingKMeansOptions {
fn default() -> Self {
Self {
n_clusters: 8,
max_iter: 300,
tol: 1e-4,
n_init: 1,
bisecting_strategy: BisectingStrategy::BiggestCluster,
}
}
}
pub trait BisectingKMeansAlgorithms<R: Runtime<DType = DType>> {
fn bisecting_kmeans(
&self,
data: &Tensor<R>,
options: &BisectingKMeansOptions,
) -> Result<KMeansResult<R>>;
}