pub fn fastmsc<M, N, L>(
mat: &M,
med: &mut Vec<usize>,
maxiter: usize
) -> (L, Vec<usize>, usize, usize)where
N: Zero + PartialOrd + Copy,
L: Float + Signed + AddAssign + From<N> + From<u32>,
M: ArrayAdapter<N>,
Expand description
Run the FastMSC algorithm, which yields the same results as the original PAMMEDSIL.
This is faster than PAMMEDSIL, but slower than FasterMSC, and mostly of interest for academic reasons. Quality-wise, FasterMSC is not worse on average, but much faster.
This is the improved version, which costs O(n²) per iteration to find the best swap.
- type
M
- matrix data type such asndarray::Array2
orkmedoids::arrayadapter::LowerTriangle
- type
N
- number data type such asu32
orf64
- type
L
- number data type such asi64
orf64
for the loss (must be signed) mat
- a pairwise distance matrixmed
- the list of medoidsmaxiter
- the maximum number of iterations allowed
returns a tuple containing:
- the final loss
- the final cluster assignment
- the number of iterations needed
- the number of swaps performed
Panics
- panics when the dissimilarity matrix is not square
- panics when k is 0 or larger than N
Example
Given a dissimilarity matrix of size 4 x 4, use:
let data = ndarray::arr2(&[[0,1,2,3],[1,0,4,5],[2,4,0,6],[3,5,6,0]]);
let mut meds = kmedoids::random_initialization(4, 2, &mut rand::thread_rng());
let (loss, assi, n_iter, n_swap): (f64, _, _, _) = kmedoids::fastpam1(&data, &mut meds, 100);
println!("Loss is: {}", loss);