Skip to content

Instantly share code, notes, and snippets.

@luis261
Last active March 23, 2024 21:16
Show Gist options
  • Save luis261/5ad7f13d8b8ebe6762e424cc1d430f30 to your computer and use it in GitHub Desktop.
Save luis261/5ad7f13d8b8ebe6762e424cc1d430f30 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"kernelspec": {
"name": "python",
"display_name": "Python (Pyodide)",
"language": "python"
},
"language_info": {
"codemirror_mode": {
"name": "python",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8"
}
},
"nbformat_minor": 5,
"nbformat": 4,
"cells": [
{
"cell_type": "markdown",
"source": "# Discrepancies between clustering metrics and \"ideal\" fits for non-spherical clusters\nThis notebook contains the setup for producing an illustration showing how inadequate the conventional clustering validity metrics (as in: popular metrics, such as SWC, Calinski-Harabasz, Davies-Bouldin, which all implicitly work with definitions/assumptions of spherical/centroid-based clusters) can be when applied to datasets not consisting of spherical clusters.",
"metadata": {},
"id": "b25fdcc0-b6be-4c33-8b1b-60d4846ada8e"
},
{
"cell_type": "markdown",
"source": "start off by importing libs and defining basic consts",
"metadata": {},
"id": "643b93cc-a26c-4759-a2ed-b82db739e0c5"
},
{
"cell_type": "code",
"source": "import matplotlib.pyplot as plt\nimport numpy as np\nimport random\nfrom sklearn.datasets import make_blobs\nfrom sklearn.metrics import silhouette_samples\nfrom sklearn.preprocessing import MinMaxScaler\n\n\nN_CLUSTERS = 2\nNOISE_LABEL = -1\nNOISE_PER_CLUSTER_FACTOR = 10\nPLOTTING_MARKER_SIZE = 1\n\n\nis_noise = lambda label : label == NOISE_LABEL",
"metadata": {
"trusted": true
},
"execution_count": 6,
"outputs": [],
"id": "c534aef5-7d07-4f05-8436-1fd52084570d"
},
{
"cell_type": "markdown",
"source": "simplified 2-cluster generation, adapted from: https://github.com/luis261/clustering-validity-comparison/blob/main/generate_benchmarking_suite.py",
"metadata": {},
"id": "373da2ed-0eb6-49ee-8395-e811704f1e63"
},
{
"cell_type": "code",
"source": "def generate_dataset(cluster_size=400, spherical=False):\n data, labels = generate_clusters(N_CLUSTERS, cluster_size, spherical=spherical)\n\n bounds = ((-25, 25), (-25, 25))\n noise_count = NOISE_PER_CLUSTER_FACTOR * N_CLUSTERS\n data = np.concatenate((data, generate_noise(noise_count, bounds, data)))\n noise_labels = np.array([NOISE_LABEL for _ in range(noise_count)])\n labels = np.concatenate((labels, noise_labels))\n\n return (MinMaxScaler().fit_transform(data), labels)\n\ndef generate_noise(count, bounds, data, distance=2.0):\n noise = []\n while len(noise) < count:\n gen = [random.uniform(bounds[0][0], bounds[0][1]), random.uniform(bounds[1][0], bounds[1][1])]\n if point_far_enough_from_points(gen, data, distance):\n noise.append(gen)\n\n return np.array([np.array(x) for x in noise])\n\ndef generate_clusters(n_clusters, cluster_size, spherical=False):\n clusters = []\n while len(clusters) < n_clusters:\n overlap = True\n data, _ = make_blobs(n_samples=cluster_size,\n centers=1, center_box=(0, 0))\n\n if not spherical:\n matrix = generate_transformation_matrix()\n for i in range(0, data.shape[0]):\n data[i] = np.matmul(matrix, data[i])\n\n x_offset = random.uniform(-5.0, 5.0)\n for i in range(0, data.shape[0]):\n data[i][0] += x_offset\n\n y_offset = 0.0\n while overlap:\n if y_offset > 0.0:\n for i in range(0, data.shape[0]):\n data[i][1] += y_offset\n\n overlap = False\n for cluster in clusters:\n if clusters_are_too_close(cluster, data, 2.0):\n overlap = True\n break\n\n y_offset = 0.8\n\n clusters.append(data)\n\n data = clusters[0]\n labels = np.array([0 for _ in range(clusters[0].shape[0])])\n for i in range(1, len(clusters)):\n data = np.concatenate((data, clusters[i]))\n labels = np.concatenate((labels, [i for _ in range(clusters[i].shape[0])]))\n\n return (data, labels)\n\ndef clusters_are_too_close(points0, points1, distance):\n for i in range(points0.shape[0]):\n if not point_far_enough_from_points(points0[i], points1, distance):\n return True\n\n return False\n\n# uses euclidean distance\ndef point_far_enough_from_points(point, points, distance):\n for i in range(points.shape[0]):\n if np.linalg.norm(points[i] - point) < distance:\n return False\n\n return True\n\ndef generate_transformation_matrix(shape_modifier=5.0):\n return [[shape_modifier, 0],\n [0, 1/shape_modifier]]",
"metadata": {
"trusted": true
},
"execution_count": 4,
"outputs": [],
"id": "96fb1900-43b6-4577-bc0a-7ec58715cede"
},
{
"cell_type": "markdown",
"source": "run the experiment",
"metadata": {},
"id": "b49117d0-b3bd-408d-9b80-128bd80b69fa"
},
{
"cell_type": "code",
"source": "data, labels = generate_dataset()\n\nnon_noise_indices = [i for i in range(len(labels)) if not is_noise(labels[i])]\nscores = silhouette_samples(data[non_noise_indices], labels[non_noise_indices])\n\nplt.figure()\nnon_noise_pts = []\nfor idx, point in enumerate(data):\n if idx in non_noise_indices:\n non_noise_pts.append(point)\n continue\n\n plt.scatter(*point, s=PLOTTING_MARKER_SIZE, c=\"#000000\")\n\nkwargs = {\"s\": PLOTTING_MARKER_SIZE, \"c\": scores[non_noise_indices]}\nplt.scatter(*np.swapaxes(non_noise_pts, 0, 1), **kwargs)\nplt.colorbar()\nplt.show()",
"metadata": {
"trusted": true
},
"execution_count": 5,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 640x480 with 2 Axes>",
"image/png": "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"
},
"metadata": {}
}
],
"id": "ff9d1051-2978-4050-87a4-548dc4e0af8d"
},
{
"cell_type": "markdown",
"source": "add `, \"cmap\": \"Spectral\"` to the dict of kwargs and zoom into the resulting plot if you want to make the effect of the implicit spherical cluster definition of the Silhouette Coefficient even more apparent",
"metadata": {},
"id": "afe30b4e-6f0d-4b24-a744-f7ca44ae5cf2"
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment