error_pattern_heatmap/
error_pattern_heatmap.rs1use scirs2_core::random::prelude::*;
2use scirs2_core::random::rngs::SmallRng;
3use scirs2_neural::utils::colors::ColorOptions;
4use scirs2_neural::utils::evaluation::ConfusionMatrix;
5
6#[allow(dead_code)]
7fn main() {
8 let mut rng = SmallRng::from_seed([42; 32]);
10 let num_classes = 5;
12 let mut matrix = vec![vec![0; num_classes]; num_classes];
14 #[allow(clippy::needless_range_loop)]
16 for i in 0..num_classes {
17 matrix[i][i] = 70 + rng.random_range(0..15); }
19 matrix[0][1] = 25;
22 matrix[1][0] = 15;
23 matrix[2][3] = 18;
25 matrix[4][0] = 8;
27 matrix[4][1] = 5;
28 matrix[4][2] = 10;
29 matrix[4][3] = 12;
30 #[allow(clippy::needless_range_loop)]
32 for i in 0..num_classes {
33 for j in 0..num_classes {
34 if i != j && matrix[i][j] == 0 {
35 matrix[i][j] = rng.random_range(0..5);
36 }
37 }
38 }
39 let flat_matrix: Vec<f64> = matrix.iter().flatten().map(|&x| x as f64).collect();
41 let ndarray_matrix =
42 scirs2_core::ndarray::Array::from_shape_vec((num_classes, num_classes), flat_matrix)
43 .unwrap();
44 let class_labels = vec![
46 "Class A".to_string(),
47 "Class B".to_string(),
48 "Class C".to_string(),
49 "Class D".to_string(),
50 "Class E".to_string(),
51 ];
52 let cm = ConfusionMatrix::from_matrix(ndarray_matrix, Some(class_labels)).unwrap();
54 println!("Example 1: Standard Confusion Matrix\n");
56 let regular_output = cm.to_ascii(Some("Classification Results"), false);
57 println!("{regular_output}");
58 println!("\n\nExample 2: Standard Heatmap Visualization\n");
60 let color_options = ColorOptions {
61 enabled: true,
62 use_bright: true,
63 use_background: false,
64 };
65 let heatmap_output = cm.to_heatmap_with_options(
66 Some("Classification Heatmap"),
67 true, &color_options,
69 );
70 println!("{heatmap_output}");
71 println!("\n\nExample 3: Error Pattern Heatmap (highlighting misclassifications)\n");
73 let error_heatmap = cm.error_heatmap(Some("Misclassification Analysis"));
74 println!("{error_heatmap}");
75}