silhouette_analysis

Function silhouette_analysis 

Source
pub fn silhouette_analysis<F, S1, S2, D>(
    x: &ArrayBase<S1, Ix2>,
    labels: &ArrayBase<S2, D>,
    metric: &str,
) -> Result<SilhouetteAnalysis<F>>
where F: Float + NumCast + Debug + ScalarOperand + 'static, S1: Data<Elem = F>, S2: Data<Elem = usize>, D: Dimension,
Expand description

Calculates detailed silhouette information for a clustering

This function provides sample-wise silhouette scores, cluster-wise averages, and ordering information for visualization. It’s an enhanced version of silhouette_score that returns more detailed information.

§Arguments

  • x - Array of shape (n_samples, n_features) - The data
  • labels - Array of shape (n_samples,) - Predicted labels for each sample
  • metric - Distance metric to use. Currently only ‘euclidean’ is supported.

§Returns

  • SilhouetteAnalysis struct containing detailed silhouette information

§Examples

use scirs2_core::ndarray::{array, Array2};
use scirs2_metrics::clustering::silhouette_analysis;

// Create a small dataset with 3 clusters
let x = Array2::from_shape_vec((9, 2), vec![
    1.0, 2.0, 1.5, 1.8, 1.2, 2.2,  // Cluster 0
    5.0, 6.0, 5.2, 5.8, 5.5, 6.2,  // Cluster 1
    9.0, 10.0, 9.2, 9.8, 9.5, 10.2, // Cluster 2
]).unwrap();

let labels = array![0, 0, 0, 1, 1, 1, 2, 2, 2];

let analysis = silhouette_analysis(&x, &labels, "euclidean").unwrap();

// Get overall silhouette score
let score = analysis.mean_score;
assert!(score > 0.8); // High score for well-separated clusters

// Get cluster-wise silhouette scores
for (cluster, score) in &analysis.cluster_scores {
    println!("Cluster {} silhouette score: {}", cluster, score);
}

// Access individual sample silhouette values
for (i, &value) in analysis.sample_values.iter().enumerate() {
    println!("Sample {} silhouette value: {}", i, value);
}