Skip to main content

Tests

Silhouette Upper Bound

An upper bound of the Average Silhouette Width.

Silhouette Samples Figure 1: Kmeans clustering applied to a synthetic dataset. Code available here.

Overview

Evaluating clustering quality is a fundamental task in cluster analysis, and the Average Silhouette Width (ASW) is one of the most widely used metrics for this purpose. ASW scores range from $-1$ to $1$, where:

  • Values near 1 indicate well-separated, compact clusters

  • Values around 0 suggest overlapping or ambiguous cluster assignments

  • Values near -1 imply that many points may have been misassigned

Optimizing the Silhouette score is a common objective in clustering workflows. However, since we rarely know the true global ASW-maximum achievable for a dataset, it's difficult to assess how close a given clustering result is to being globally optimal. Simply comparing to the theoretical maximum of 1 is often misleading, as the structure of the dataset imposes inherent limits on what is achievable.

This project introduces a data-dependent upper bound on the ASW that hopefully can provide a more meaningful reference point than the fixed value of 1. The upper bound helps answer a key question: How close is my clustering result to the best possible outcome on this specific data?

To compute the upper bound, the method requires a dissimilarity matrix as input.

You can find more details in this arXiv preprint.

Installation

pip install silhouette-upper-bound

Examples

To help you get started, we provide example scripts demonstrating common use cases. You can find these in the demos/ folder.

Quickstart

import numpy as np
from silhouette_upper_bound import upper_bound

if __name__ == '__main__':

    np.random.seed(42)

    # dummy data
    A = np.random.rand(100, 100)
    D = (A + A.T) / 2
    np.fill_diagonal(D, 0)

    # ASW upper bound
    ub = upper_bound(D)

    print(f"There is no clustering of the data points of D that has a higher Silhouette score than {ub}.")

Experimental results

We evaluate the performance of the upper bound using synthetic datasets generated with scikit-learn’s make_blobs() function. Each dataset is identified by a label of the form n_samples-n_features-centers-cluster_std, which corresponds to the parameters used in the data generation.

The code that generates the results below can be found in experiments/.

Dataset KMeans ASW ASW upper bound Worst-case relative error
400-64-5-6 0.249 0.376 0.38
400-64-2-2 0.673 0.673 .00
400-128-7-3 0.522 0.566 0.08
10000-32-20-2 0.626 0.774 0.19

Note that the upper bound confirms global optimality for KMeans on dataset 400-64-2-2.

More comprehensive results on synthetic datasets are available in results/.

Contribution

Contributions are welcome! If you have suggestions for improvements, bug reports, or new features, feel free to open an issue or submit a pull request.

To contribute:

  1. Fork the repository.
  2. Create a new branch for your feature or fix.
  3. Submit a pull request.

Thank you for helping improve this project!

Metadata

Release files for silhouette-upper-bound 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for silhouette-upper-bound 0.1.2
File Size Uploaded
silhouette_upper_bound-0.1.2.tar.gz 721.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for silhouette-upper-bound 0.1.2
File Interpreter ABI Platform
silhouette_upper_bound-0.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 727.7 kB

Release files / silhouette_upper_bound-0.1.2.tar.gz

Download URL silhouette_upper_bound-0.1.2.tar.gz
Size 721.6 kB
Tags Source
SHA-256 checksum
How to use checksums
f2fecd99c2b38b07e9c176adbb2a60a80419842edccb3f10243f1c75daa6ee06
BLAKE2b-256 checksum
How to use checksums
2e9081b5a423ae69b7bedd4c5d6906c91e037a69405cf42a61ccc20b87222a85
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.10.11

Release files / silhouette_upper_bound-0.1.2-py3-none-any.whl

Download URL silhouette_upper_bound-0.1.2-py3-none-any.whl
Size 6.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e01c3315cb900a8e1f202b4a57054ef6704440330381b21c13fc7224dd4c8474
BLAKE2b-256 checksum
How to use checksums
3b74361f07195c652e801de816b4c1e816334b5d6286372e6b9b19385d6afbe7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.10.11

Release history Release notifications | RSS feed

This release

0.1.2 This release

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page