This commit is contained in:
lda committed 2026-01-14 02:37:18 +07:00
1 parent d37449764c
commit 234350b6d6
29 files changed
+1311 -6

No files matched your search

BIN
View File
Binary file not shown.
+5
View File
@@ -0,0 +1,5 @@
Index of abalone
02 Dec 1996 114 Index
12 Jun 1996 191873 abalone.data
12 Jun 1996 4319 abalone.names
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+609
View File
@@ -0,0 +1,609 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 54,
"id": "e377bc9b",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.cluster import KMeans, MiniBatchKMeans\n",
"from sklearn.decomposition import PCA\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.metrics import silhouette_score\n",
"\n",
"from pathlib import Path\n"
]
},
{
"cell_type": "code",
"execution_count": 55,
"id": "d7275d15",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"WindowsPath('c:/Users/Admin/Documents/lecture ass shit/3/ml2/lw2')"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Path.cwd()"
]
},
{
"cell_type": "markdown",
"id": "40f028ad",
"metadata": {},
"source": [
"# game\n",
"\n",
"## Abalone\n"
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "4de18adb",
"metadata": {},
"outputs": [],
"source": [
"abalone_file = Path.cwd() / \"abalone/abalone.data\"\n",
"\n",
"df = pd.read_csv(abalone_file, header=None)\n",
"df.columns = [\n",
" \"Sex\",\n",
" \"Length\",\n",
" \"Diameter\",\n",
" \"Height\",\n",
" \"Whole\",\n",
" \"Shucked\",\n",
" \"Viscera\",\n",
" \"Shell\",\n",
" \"Rings\",\n",
"]\n",
"\n",
"X = pd.get_dummies(df.drop(columns=[\"Rings\"]), drop_first=True)\n",
"\n",
"X = StandardScaler().fit_transform(X)\n"
]
},
{
"cell_type": "code",
"execution_count": 57,
"id": "50b3eb52",
"metadata": {},
"outputs": [],
"source": [
"ks = range(2, 11)\n",
"\n",
"inertias = []\n",
"silhouettes = []\n",
"labels_per_k = {}\n",
"\n",
"for k in ks:\n",
" km = KMeans(\n",
" n_clusters=k,\n",
" init=\"k-means++\", # ⭐ best practice\n",
" n_init=10,\n",
" random_state=42,\n",
" )\n",
" labels = km.fit_predict(X)\n",
"\n",
" inertias.append(km.inertia_) # WCSS\n",
" silhouettes.append(silhouette_score(X, labels))\n",
" labels_per_k[k] = labels"
]
},
{
"cell_type": "code",
"execution_count": 58,
"id": "c70bfa21",
"metadata": {},
"outputs": [],
"source": [
"best_k = ks[np.argmax(silhouettes)]\n",
"best_labels = labels_per_k[best_k]"
]
},
{
"cell_type": "code",
"execution_count": 59,
"id": "926a255e",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAHHCAYAAACiOWx7AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAW9FJREFUeJzt3Qdc1PX/B/AXe4jIUEAQcOPeittMc6SWK9PM3GZqZTbMSq1f/7IsbbnSSs2ZWlpqWqbm3ntPFEQQF0OWjO//8f7YXZyiHgncej0fj+vG98Pd975n3IvPeH/tNE3TQEREREQPZP/gzURERETE0ERERERkJPY0ERERERmBoYmIiIjICAxNREREREZgaCIiIiIyAkMTERERkREYmoiIiIiMwNBEREREZASGJiIqVHZ2dnj//ff19+W2PHbt2jV+EncpXbo0OnbsWODH5e+//1afgVwT0f0xNBHRI5szZ4760r3fZefOnRYdXOQ9tG7dOtfts2bN0r/PvXv35vn5jx8/roLjhQsX8mFviaggORbosxORTfnf//6HMmXK3PN4+fLlYclcXV2xceNGxMbGIiAgwGDbggUL1Pa0tLT/9NwSmj744AM89thjKqARkfliaCKifNO+fXvUq1fP6o5okyZNsGfPHvz000949dVX9Y9funQJW7ZsQZcuXfDzzz+bdB+JqOBxeI6IzILMaerRowc8PT3h6+urwsndvTeZmZn48MMPUa5cObi4uKiemXfeeQfp6en6NqNGjVI/r2ma/rGXX35ZDZ99/fXX+seuXLmiHps+ffpD9016krp27YqFCxcaPL5o0SJ4e3ujbdu2uf7cyZMn0b17d/j4+KjnkED522+/GQxrPvPMM+p2y5Yt9cN8d88t2rp1Kxo0aKCeo2zZsvjxxx/vea3z58+r55LXcnd3R8OGDbF69ep72knQ69y5M4oUKQI/Pz+89tprBsePiO6PoYmI8k1CQoIKPzkv169fN+pnJTBJSJowYQKefPJJFXCGDBli0GbQoEEYN24c6tSpgy+++AItWrRQ7Xv27Klv06xZM9y4cQPHjh3TPya9Qfb29uo652OiefPmRu3fc889h927d+PcuXP6xyRESShycnK6p728vgSXEydO4O2338akSZNUUJHAsnz5cv1rv/LKK+q2hL958+apS+XKlfXPc/bsWfUaTzzxhHoO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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(ks, inertias, marker=\"o\")\n",
"plt.xlabel(\"k\")\n",
"plt.ylabel(\"Inertia (WCSS)\")\n",
"plt.title(\"Elbow Method\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 60,
"id": "7b8c1750",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAW/pJREFUeJzt3Qd41FXWx/GT3giBAEnoNTTpVZCmgKhIc1VEmuDa67I2dJW1svquigXBhqyAil1ApYhIF5BepPeSRklCQvq8z7lhYgIJJDB9vp/nGTMtk39mMPObe8+518disVgEAADAi/g6+wAAAAAcjQAEAAC8DgEIAAB4HQIQAADwOgQgAADgdQhAAADA6xCAAACA1yEAAQAAr0MAAgAAXocABHiJOnXqyB133FFw+bfffhMfHx/z1apHjx7SrFkzJx0hSqKvi57s4d///rf5dwB4GwIQ4OY2b94sN998s9SuXVuCg4OlevXq0rt3b3nnnXfEE23bts28ae/fv/+829577z2ZOnWqXX9+hw4dTGCYNGmSXX8OAPsiAAFubMWKFdKuXTvZuHGj3HXXXfLuu+/K3//+d/H19ZW33nqryH137NghH374oXhCAHr++eedEoB27dola9asMaNpM2bMEE/wr3/9S86cOePswwAczt/xPxKArbz88ssSERFh3pQrVKhQ5LaEhIQil4OCgnjiL9P06dMlKipKXn/9dTPqpiFMw5A78/f3NyfA2zACBLixPXv2yBVXXHFe+FH6Rn2hGqCLjbJcffXVEhoaaqbUXnvttfPuowHrzjvvlOjoaDP11rJlS/nf//5X5D7F1RkpDQ56/bmjNdu3bzfBIjIy0jymjm7NmjWr4Ha9/y233GLO6/HpY1gfX3+/rVu3yuLFiwuuL1w3c+rUKXn00UelZs2aJgw2aNBAXn31VcnLy5PS+uyzz8zx3XjjjSZ46uWSamp2795tnm99bfS+o0aNkvT09CL3/eSTT+Saa64xr5UeU9OmTS86tXb69GkJCwuTRx555LzbDh8+LH5+fjJ+/HhzOTs724yWxcbGmuezUqVK0qVLF1mwYMF5x1uY3q7302MvV66cNGrUSJ5++ulSP0+AOyD2A25M635WrlwpW7ZssVnx8smTJ+W6666Tm266SW699Vb5+uuv5cknn5TmzZvL9ddfb+6jUyYaLvRN/sEHH5S6devKV199Zd7wNWgU9+Z8MRperrrqKhO4nnrqKfMm/+WXX8rAgQPlm2++kUGDBkm3bt3k4Ycflrffftu8ITdp0sR8r36dMGGCPPTQQ+YN+5lnnjHXazhTGjy6d+8uR44ckXvuuUdq1aplpg/Hjh0rx44dM997MatWrTK/r4aWwMBA8/zoNFhJwUCfO31eNIysW7dOPvroIxN0NHRZadjRANu/f38zCjN79my5//77TSh74IEHin1c/f30uZg5c6a88cYbJvBYff7552KxWGTo0KEF4UZ/vk6Lau1SSkqK/PHHH+Z4tE6spNdBA16LFi3khRdeMMFMf+/ly5df9DkC3IoFgNuaP3++xc/Pz5w6depkeeKJJyzz5s2zZGVlnXff2rVrW0aOHFlwedGiRRb9E6Bfrbp3726u+/TTTwuuy8zMtMTExFj+9re/FVw3YcIEc7/p06cXXKc/U4+hXLlylpSUlBJ/htq3b5+5/pNPPim4rmfPnpbmzZtbMjIyCq7Ly8uzdO7c2RIbG1tw3VdffVXsY6orrrjC/A7nevHFFy1hYWGWnTt3Frn+qaeeMs/dwYMHLRfz4IMPWmrWrGmOyfrc63GsX7++yP3GjRtnrh89enSR6wcNGmSpVKlSkevS09PP+zl9+vSx1KtXr8h1+jsV/r30Ndaf8fPPPxe5X4sWLYrcr2XLlpa+ffte8PeyHq/Vm2++aS4nJiZe8PsAd8cUGODG9FO8jgDpCIIWQutUVZ8+fcwoSuGpo7LQEYZhw4YVXNbRDh092Lt3b8F1P/30k8TExMiQIUMKrgsICDCjMzpFo9NQZXHixAn59ddfzahJamqqJCUlmdPx48fN76PFxzp6c6l0dKpr165SsWLFgsfWU69evSQ3N1eWLFlywe/PyckxIy6DBw8umC6yTl2VVAx97733FrmsP19/Hx2FsQoJCSk4n5ycbI5JR6r0udbLJdHjrlatWpGfraOAmzZtKvLa6RSWjujo81da1unUH374oUzTg4C7IQABbq59+/by7bffmqmr1atXm2kdDRFaq6K1PGVVo0aN82pCNDjo41sdOHDA1JVot1lh1ikpvb0sdIpFp26effZZqVKlSpHTuHHjii3qLgsNAHPnzj3vsTVIlOax58+fL4mJiSYI6rHqad++faYOSaedigsKOs127nOoCj+POq2kx6DTfRo89JisU2oXCkD6vOs01/fff19QV6RhSOt8rDVSSqewdEqyYcOGZgrz8ccfNyHpQjTk6VSkTpvpFOJtt91mpiIJQ/A01AABHkJHajQM6Unf8LToVkc+rAGitArXlBSmAaWsSlpgT0ddCrO+uT722GNmxKc4WrR8qfTxdbTsiSeeKPZ2fb4uxDrSoiNUxdERLw1DZXketYC9Z8+e0rhxY1PLo8XZ+hrq6Nqbb7550cAxYsQI+b//+z8TgnQkTguyrcXZVlozpT9HR3M0xGkdkj725MmTTcApjo5K6YjYokWL5McffzTBUUe/dMRLH6Ok3wtwNwQgwANp95TSAl97FV/rSIK+SRceBdIuLuvthUc9dBSisHNHiOrVq1cwjWYdlSnJhVYtLum2+vXrm6m5iz12cdLS0kyA0JERHVU7l077aUA6NwBdjBY8Z2ZmmqnKwqNFGjxKQ4veW7dubX62jtodPHiw2MUvtaNOw7Ce9DnQUKTF0SUFIKWvqYYzPWk4e+WVV0xhuR7bpTyHgCtiCgxwY/qGVNzIjI4iKG1ftocbbrhB4uLizMhA4ToZfQPWGiKtY7EGIR0xOLfGRhcsLExrabSr7P333y82tOn0k5VOFxUXqqy3FXe9jtxordS8efPOu03vr8deku+++86EIO3K0gB07klHXbRLTcNMWVhHUgq/fjrtpV1mpTV8+HAzKqNdbNribu3Ss9Kao8L0tdGRtAsdq9ZjnatVq1bma1l/R8CVMQIEuDFt+9YaEG2L1qmUrKws096twUTXxdFP/fZw9913m7Cibe9r1641P0vb5bWmRd+Mw8PDzf10OkZrUjQY6eiMjsTMmTOn2JqbiRMnmrVntFZFV7XWUaH4+HgTXHR9Gy3ytr4Za3jQdnINDNqmbS1Ibtu2rWktf+mll8wbvV6nt2nti460aFjRY9b7aajRbUT0uHVdosqVKxf7u+oIi4aLzp07F3u7FqDrCts6XaSt8aV17bXXmimvfv36mdZ8HZ3Rx9FjLu3I3e23326m9TSk3XfffWYErTBdV0iDpf6+OhKkLfD6++rSBSXRuiENrH379jUBVl8rDaw6yqSvD+AxnN2GBuDSaRu0tls3btzYtJ8HBgZaGjRoYHnooYcs8fHxl9QGr63k59Lv0+8vTB9/1KhRlsqVK5ufqy3shdvarbSdWlvoQ0NDLRUrVrTcc889li1btpzXBq/27NljGTFihGm7DwgIsFSvXt1y4403Wr7++usi9/vwww9Nq7i2sBf+HeLi4kzbd3h4uLm+cEt4amqqZezYseb50ePV49YW+//+97/FLhtg/R39/f0tw4cPL/E10FZ2/d20zb1wW/m5beT6u+r1ugSA1axZs0zrenBwsKVOnTqWV1991TJlypTz7nduG3xhN9xwg7n/ihUrzrvtpZdesnTo0MFSoUIFS0hIiPl38vLLLxf5fc9tg1+4cKFlwIABlmrVqpnnSb8OGTLkvCUEAHfno/9xdggDAFwaHf3TkSztTANQetQAAYCb0qkynXrTWiAAZUMNEAC4GV2DSOuttK1d6360hghA2TACBABuRtcd0lEfDUK6Aa2uyg2gbKgBAgAAXocRIAAA4HUIQAAAwOtQBF0MXd7/6NGjZjG3Cy27DwAAXIeu7KObQVerVu28zZrPRQAqhoYf3ZgQAAC4n0OHDpnVyy+EAFQM6zL++gSWL1/ePq8OAACwqZSUFDOAYX0fvxACUDGs014afghAAAC4l9KUr1AEDQAAvA4BCAAAeB0CEAAA8DoEIAAA4HUIQAAAwOsQgAAAgNchAAEAAK9DAAIAAF6HAAQAALwOK0E7UG6eRVbvOyEJqRkSFR4sHepGip8vm60CAOBoBCAHmbvlmDw/e5scS84ouK5qRLCM69dUrmtW1VGHAQAAmAJzXPi5b/q6IuFHxSVnmOv1dgAA4DjUADlg2ktHfizF3Ga9Tm/X+wEAAMcgANmZ1vycO/JTmMYevV3vBwAAHIMAZGda8GzL+wEAgMtHALIz7fay5f0AAMDlIwDZmba6a7dXSc3uer3ervcDAACOQQCyM13nR1vd1bkhyHpZb2c9IAAAHIcA5AC6zs+kYW0kJqLoNJde1utZBwgAAMciADmIhpxlT14jNzSLMZf7XBFtLhN+AABwPAKQA+k0V49GUeb86cwcpr0AAHASApCDxUaXM193xp929I8GAABnEYAcLDY63HxNTM2UU+lZjv7xAACAAOR45YL8pXqFEHOeUSAAAJyDESCnToOlOuPHAwDg9QhATtDw7DTYLgIQAABOQQBygtgoCqEBAHAmApAzR4ASmAIDAMAZCEBO0ODsCFDS6Sw5kUYnGAAAjkYAcoKwIH+pUTG/E4w6IAAAHI8A5ORpsJ0JLIgIAICjEYCc3ArPCBAAAI5HAHKShlFnR4BohQcAwOEIQE5fC4gpMAAAHI0A5CT1o8LM1+NpWXL8dKazDgMAAK9EAHKS0EB/qRnJnmAAADgDAcgF6oBYEBEAAMciADlRrLUVnkJoAAAcigDkRA0LdoWnEBoAAEciALnIrvAWi8WZhwIAgFchADlR/SrlxMdH5GR6ttkLine truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(ks, silhouettes, marker=\"o\")\n",
"plt.xlabel(\"k\")\n",
"plt.ylabel(\"Silhouette Score\")\n",
"plt.title(\"Silhouette Analysis\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 61,
"id": "acab8d95",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"Xp = PCA(n_components=2).fit_transform(X)\n",
"\n",
"plt.scatter(Xp[:, 0], Xp[:, 1], c=best_labels, s=5)\n",
"plt.title(f\"K-means Clustering (k={best_k})\")\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"id": "3841acb2",
"metadata": {},
"source": [
"## Covertype\n"
]
},
{
"cell_type": "code",
"execution_count": 62,
"id": "92b692bc",
"metadata": {},
"outputs": [],
"source": [
"covtype_file = Path.cwd() / \"covertype/covtype.data\"\n",
"\n",
"df = pd.read_csv(covtype_file, header=None)\n",
"df = df.sample(20000, random_state=42) # safe size\n",
"X = df.iloc[:, :-1].values\n",
"X = StandardScaler().fit_transform(X)"
]
},
{
"cell_type": "code",
"execution_count": 63,
"id": "e6bbfcb7",
"metadata": {},
"outputs": [],
"source": [
"ks = range(2, 9)\n",
"\n",
"inertias = []\n",
"silhouettes = []\n",
"labels_per_k = {}\n",
"\n",
"for k in ks:\n",
" km = MiniBatchKMeans(\n",
" n_clusters=k, init=\"k-means++\", batch_size=2048, n_init=5, random_state=42\n",
" )\n",
"\n",
" labels = km.fit_predict(X)\n",
"\n",
" inertias.append(km.inertia_)\n",
" silhouettes.append(silhouette_score(X, labels))\n",
" labels_per_k[k] = labels\n"
]
},
{
"cell_type": "code",
"execution_count": 64,
"id": "da938557",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkgAAAHHCAYAAABEEKc/AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAZNdJREFUeJzt3Qd8jPcfB/BP9pAlCUlEiNh7xN5bW1WtUaVGKUrRoq1SLaVD9d8atapamxa1SpXae8aqLRIShCTIkMi+/+v700uTSDgkubvc5/16ndzz3HN3v3vu5D75TTONRqMBEREREaUz/+8qERERETEgEREREWWDNUhEREREWTAgEREREWXBgERERESUBQMSERERURYMSERERERZMCARERERZcGARERERJQFAxKRATEzM8Pnn3+evi3XZV9kZKRey2WIfH198fLLL+f58+zatUu9B/KTiEwHAxJRHlu4cKH6gs3pcujQIaMOKfIaWrdune3t8+bNS3+dx44de+rHP3funAqJV69eRUG3du1avPjii3B3d4e1tTWKFSuG119/HTt27IAhu3nzpnqPTp48qe+iEOUqy9x9OCLKycSJE1GqVKlH9pcpU8aoT5qtrS127tyJW7duwdPTM9Nty5YtU7cnJCQ802NLQJowYQKaN2+uwlhBJMth9uvXTwXpmjVrYuTIkeo8hoWFqdDUqlUr7N+/Hw0bNoShBiR5j+T9qVGjhr6LQ5RrGJCI8onUDtSuXbvAne9GjRrh6NGjWLFiBd5///30/devX8fevXvx2muvYfXq1XotoyH7/vvvVTgaPnw4pkyZomrbtMaOHYslS5bA0tLwflWnpKQgLS1N38UgyjNsYiMyAtIHSZpbnJyc4ObmpoJI1loZ+cL64osvULp0adjY2Ki/6D/55BMkJiamHyO1E3J/qbXQGjZsmPpS/uGHH9L33b59W+2bM2fOE8smNUSdOnXC8uXLM+3/9ddfUbhwYbRr1y7b+124cAFdunSBq6uregwJj3/88Uf67RIaunbtqq63aNEivakua1+gffv2oW7duuox/Pz8sHjx4keeKygoSD2WPJe9vT3q16+PP//885HjJNS9+uqrKFSoEIoWLYoRI0ZkOn+57cGDB5g0aRIqVKiA7777LlM40urVq5d6fbq+FnnvJFBJrU5WFy9eVM8xc+bM9H1RUVEqnPn4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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(ks, inertias, marker=\"o\")\n",
"plt.xlabel(\"k\")\n",
"plt.ylabel(\"Inertia (WCSS)\")\n",
"plt.title(\"Elbow Method – Covertype\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 65,
"id": "0070102e",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(ks, silhouettes, marker=\"o\")\n",
"plt.xlabel(\"k\")\n",
"plt.ylabel(\"Silhouette Score\")\n",
"plt.title(\"Silhouette Analysis – Covertype\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 66,
"id": "c312a24a",
"metadata": {},
"outputs": [],
"source": [
"best_k = ks[np.argmax(silhouettes)]\n",
"best_labels = labels_per_k[best_k]"
]
},
{
"cell_type": "markdown",
"id": "aecfb074",
"metadata": {},
"source": [
"# community\n"
]
},
{
"cell_type": "code",
"execution_count": 67,
"id": "bc26af01",
"metadata": {},
"outputs": [],
"source": [
"community_data = Path.cwd() / \"communities+and+crime/communities.data\"\n",
"\n",
"df = pd.read_csv(community_data, header=None, na_values=\"?\")\n",
"df = df.iloc[:, 5:]\n",
"\n",
"df = df.apply(pd.to_numeric)\n",
"\n",
"df = df.fillna(df.mean())\n",
"\n",
"X = df.iloc[:, :-1].values\n",
"X = StandardScaler().fit_transform(X)\n"
]
},
{
"cell_type": "markdown",
"id": "153c0809",
"metadata": {},
"source": [
"## PCA variance explained\n"
]
},
{
"cell_type": "code",
"execution_count": 68,
"id": "a3e10a92",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"pca = PCA()\n",
"pca.fit(X)\n",
"\n",
"plt.plot(np.cumsum(pca.explained_variance_ratio_))\n",
"plt.xlabel(\"Number of components\")\n",
"plt.ylabel(\"Cumulative explained variance\")\n",
"plt.title(\"PCA Variance Explained – Communities & Crime\")\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"id": "a7acc3d1",
"metadata": {},
"source": [
"## PCA to 2D (no clustering yet)\n"
]
},
{
"cell_type": "code",
"execution_count": 69,
"id": "69a1249a",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAiIAAAGzCAYAAAASZnxRAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAjk9JREFUeJztnQmYHGWd/99JJpkkkEwuQu6LcMlNIAcgZwRRUY71wAUSQFAMNyya/yqIuEZhlUtEEEjwwmMV0V2XBcIRgRBIABU5zE1CEpCQzCSBTI6p//N9Z97OW2+/bx3dVV3V3d/P8wyhZ7qr3nqrut5v/c4Gz/M8QQghhBCSAV2y2CkhhBBCCKAQIYQQQkhmUIgQQgghJDMoRAghhBCSGRQihBBCCMkMChFCCCGEZAaFCCGEEEIyg0KEEEIIIZlBIUIIIYSQzKAQIaREpk2bJkaPHl3x+Vu+fLloaGgQs2fPFlnxsY99TFxwwQUV29+kSZPENddcI+oZnPNvfOMbohrBuDF+QmxQiJCSwCKIG4v66dGjh9hrr73ExRdfLN5+++2i9+N3V199tdhnn31Er169xC677CLGjx8vvvWtb4kNGzZY9zFhwgS57TvvvDP2Iq1+unbtKkaOHClOO+008fLLL1fV2f7FL34hbrnlFpE3nnnmGfHII4+Ir3zlK4Xfvf7661IoHHzwwaJ3795iyJAh4uMf/7hYsGCBVcDp52jXXXcVY8eOFf/yL/8ifvvb34r29vaiz2Bfd9xxh1i7dm3q1zSu5bfeeqvo78cee6zYf//9E98vrsuzzjpLjBgxQjQ1NYn+/fuLKVOmiFmzZokdO3aISrB69WopFqrtO0JqBPSaISQus2bNQo8i75vf/Kb305/+1Pvxj3/sTZ061evSpYs3ZswYb/PmzYX3Pv/8897AgQO9Hj16eF/4whe8O++8U/6cf/753i677OJ95CMfKdr+P/7xD7n90aNHe0ceeWTkcS1btkx+7swzz5Tjmj17tveVr3zF69Onj9fU1OS99NJLiZ3srVu3elu2bPHS4uMf/7g3atSoot+3t7d7H3zwgbd9+3YvCz71qU95J554ou93V111lde3b195Tu+66y7vxhtv9PbYYw+va9eu3qOPPup7L64TnAucH/zcfffd3r//+797Bx54oDx3xx57rNfS0uL7zI4dO7zBgwd7X//611O/pvFz8cUXF/39mGOO8fbbb79E94nvDeZo6NCh8jq95557vJtvvtn7xCc+4TU0NHj/8R//UXgvxnXdddd5afDCCy/I7WMO0mDbtm3ymiXEBoUIKeumjRuYzpVXXil//4tf/EK+Xr9+vTds2DBv991391577bWi7axdu9a74YYbin5/7bXXeoMGDfJ++9vfyhsyBEYcIXLTTTf5fv+HP/xB/v7CCy90fnbTpk1ennAJkSx5++23vcbGRrlg6ixYsMDbuHGj73fvvvuut9tuuxUJSQgRCFAbM2fOlOfpM5/5TNHfIA4wHxBiaV7TBx98sBRKb731VqpCZN68eVKEHHXUUV5ra2vR3/Hd0oVBNQqRvH2nSD6ha4YkyvHHHy//XbZsmfz3rrvukmbu73//+9ItY7L77ruLr33ta1a3BEz1n/jEJ0Rzc7N8neS4lBn+qaeeEl/+8pfFoEGDxPDhwwvv/+EPfyj2228/aSofOnSomD59epELyRYjArcC3Cn4LEz8OL4vfvGLYv369UVj+t///V9xzDHHSFdGnz59xOGHH144TrgB/ud//kesWLGi4MJQ+3LFiDz++OPiwx/+sHR79e3bV3zqU58Sr732mtVXv3jxYjl+vA/ze+6554r3338/dB4xpu3bt0vXgQ7cbHCx6AwYMECOxxxDEF/96lfFiSeeKH7zm9+If/zjH76/feQjH5Hzkbb74P/9v/8nXSLf+c53Qt+LubjhhhvEHnvsIa8VnCN8vq2tLfSz119/vTwXP//5z+U1YHLYYYfJcxQ3RskWj/Hoo4+Ko446Sp5vnKe9995bjhM8+eST8toDuA7U9aZfX/Pnzxcf/ehH5bUC1yquW7jobPt99dVXxec//3nRr18/uU/XmPAartzf//730uWF+cP35uGHHy46JowR84HvFOYa9xXGndQOjVkPgNQWS5YsKSxC4A9/+IPo2bOnFBVRwU0PCyV85N27dxenn366vFmrG2cS41JAhOy2227i2muvFZs3b5a/ww0OiwQW24suuki88cYbMk7lhRdekDffbt26OfcD0YEbOG7ol156qRQ+P/jBD8RLL73k+yzec95558kb74wZM+QCgffgJoyb+L//+7+LlpYWsWrVKnHzzTfLz5gLvc5jjz0mTj75ZBlrgfF/8MEH4vbbbxdHHnmkePHFF4sWrM985jNizJgx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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"Xp = PCA(n_components=2).fit_transform(X)\n",
"\n",
"plt.scatter(Xp[:, 0], Xp[:, 1], s=5)\n",
"plt.title(\"PCA Projection (2D) – No Clustering\")\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"id": "0790bd24",
"metadata": {},
"source": [
"## clustering on ORIGINAL space (metrics only)\n"
]
},
{
"cell_type": "code",
"execution_count": 70,
"id": "f41491b4",
"metadata": {},
"outputs": [],
"source": [
"ks = range(2, 8)\n",
"sil_orig = []\n",
"\n",
"for k in ks:\n",
" km = KMeans(n_clusters=k, init=\"k-means++\", n_init=10, random_state=42)\n",
" labels = km.fit_predict(X)\n",
" sil_orig.append(silhouette_score(X, labels))\n"
]
},
{
"cell_type": "markdown",
"id": "c2c74e3b",
"metadata": {},
"source": [
"## clustering on PCA space (2D)\n"
]
},
{
"cell_type": "code",
"execution_count": 71,
"id": "873caac5",
"metadata": {},
"outputs": [],
"source": [
"sil_pca = []\n",
"labels_pca = {}\n",
"\n",
"for k in ks:\n",
" km = KMeans(n_clusters=k, init=\"k-means++\", n_init=10, random_state=42)\n",
" labels = km.fit_predict(Xp)\n",
" sil_pca.append(silhouette_score(Xp, labels))\n",
" labels_pca[k] = labels\n"
]
},
{
"cell_type": "markdown",
"id": "b5bea4fa",
"metadata": {},
"source": [
"## silhouette comparison plot\n"
]
},
{
"cell_type": "code",
"execution_count": 72,
"id": "6846b929",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(ks, sil_orig, marker=\"o\", label=\"Original space\")\n",
"plt.plot(ks, sil_pca, marker=\"o\", label=\"PCA 2D\")\n",
"plt.xlabel(\"k\")\n",
"plt.ylabel(\"Silhouette Score\")\n",
"plt.title(\"Clustering Quality: Before vs After PCA\")\n",
"plt.legend()\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"id": "9ac244f5",
"metadata": {},
"source": [
"## PCA cluster visualization (best k)\n"
]
},
{
"cell_type": "code",
"execution_count": 73,
"id": "fc244f0c",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"best_k = ks[np.argmax(sil_pca)]\n",
"\n",
"plt.scatter(Xp[:, 0], Xp[:, 1], c=labels_pca[best_k], s=5)\n",
"plt.title(f\"K-means on PCA space (k={best_k})\")\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"id": "711bd1d5",
"metadata": {},
"source": [
"## random subspace clustering\n"
]
},
{
"cell_type": "code",
"execution_count": 74,
"id": "813e9b68",
"metadata": {},
"outputs": [],
"source": [
"rng = np.random.default_rng(42)\n",
"idx = rng.choice(X.shape[1], size=30, replace=False)\n",
"\n",
"X_sub = X[:, idx]\n"
]
},
{
"cell_type": "code",
"execution_count": 75,
"id": "6aa93bec",
"metadata": {},
"outputs": [],
"source": [
"sil_sub = []\n",
"\n",
"for k in ks:\n",
" km = KMeans(n_clusters=k, init=\"k-means++\", n_init=10, random_state=42)\n",
" labels = km.fit_predict(X_sub)\n",
" sil_sub.append(silhouette_score(X_sub, labels))\n"
]
},
{
"cell_type": "markdown",
"id": "ab44c9fb",
"metadata": {},
"source": [
"## final comparison plot\n"
]
},
{
"cell_type": "code",
"execution_count": 76,
"id": "1fb883f8",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAbdxJREFUeJzt3Qd4k1X7BvC7e7Mpe++NskSZgqAiw42fCuJeKCIKOAAVxS2iKI7P/fkXRUBBRQRBUXGh7L33KKvQQmf+133SNyRtCi1Nkya5f9eVK82b5M2bk8D75DnPOSfEZrPZICIiIhJEQn19ACIiIiLepgBIREREgo4CIBEREQk6CoBEREQk6CgAEhERkaCjAEhERESCjgIgERERCToKgERERCToKAASERGRoKMASKSAxo0bh5CQECQlJanNCuCDDz4w7bV161a/bK/atWvjpptu8vVhBC22PT8DkeKiAEgC1ooVK3DVVVehVq1aiI6ORrVq1XDRRRfhtdde8/Wh+bWsrCy8//776NatG8qVK4eoqChzohoyZAj+/vtvrx3Ht99+a4LSQHXy5Em88sor6NChA0qXLm2+ww0bNsS9996L9evX+/rwRPxeiNYCk0D022+/oXv37qhZsyYGDx6MypUrY8eOHfj999+xadMmbNy4sdD75Mn2iSeewIEDB1ChQgUEoxMnTuCKK67AnDlz0KVLF/Tt29cEQczyfP755+bEvH37dlSvXt1kgBgUbdmypVh+yTMQmDx5MoprOcO0tDSEhoYiIiIC3sYs48UXX4wlS5bgsssuQ8+ePREfH49169bhs88+w969e5Geno5AlpGRgezsbBNgixSH8GLZq4iPPf300+ZX819//YUyZcq43Ld//36fHZe/e+ihh0zww8zEsGHDXO4bO3as2e7PGEwx8xITE+PTEy+7f/79919MmzYNV155pct9Tz31FB599FEEqpSUFMTFxfkk8JTgoi4wCUjM8jRr1ixP8EOJiYmOv5m5YJ0KsxW5cbu7Lhb+Or/mmmtQqlQplC9fHvfff785aTr74Ycf0KlTJ/P6/OXeqFEjPPLII477Fy5caPY/depUs50ZKv6n369fP5OpcrZo0SJcffXVJpvFk3KNGjXwwAMPmGxMbmvXrjXHVrFiRXMS5+vmPlnu2rULN998MypVqmT2x3Z67733ztimO3fuxFtv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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(ks, sil_orig, label=\"Original\")\n",
"plt.plot(ks, sil_pca, label=\"PCA 2D\")\n",
"plt.plot(ks, sil_sub, label=\"Random Subspace\")\n",
"plt.xlabel(\"k\")\n",
"plt.ylabel(\"Silhouette Score\")\n",
"plt.title(\"Subspace Clustering Comparison\")\n",
"plt.legend()\n",
"plt.show()\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "ml2",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.14.0"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
+372
View File
@@ -0,0 +1,372 @@
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans, MiniBatchKMeans
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
from pathlib import Path
```
```python
Path.cwd()
```
WindowsPath('c:/Users/Admin/Documents/lecture ass shit/3/ml2/lw2')
# game
## Abalone
```python
abalone_file = Path.cwd() / "abalone/abalone.data"
df = pd.read_csv(abalone_file, header=None)
df.columns = [
"Sex",
"Length",
"Diameter",
"Height",
"Whole",
"Shucked",
"Viscera",
"Shell",
"Rings",
]
X = pd.get_dummies(df.drop(columns=["Rings"]), drop_first=True)
X = StandardScaler().fit_transform(X)
```
```python
ks = range(2, 11)
inertias = []
silhouettes = []
labels_per_k = {}
for k in ks:
km = KMeans(
n_clusters=k,
init="k-means++", # ⭐ best practice
n_init=10,
random_state=42,
)
labels = km.fit_predict(X)
inertias.append(km.inertia_) # WCSS
silhouettes.append(silhouette_score(X, labels))
labels_per_k[k] = labels
```
```python
best_k = ks[np.argmax(silhouettes)]
best_labels = labels_per_k[best_k]
```
```python
plt.plot(ks, inertias, marker="o")
plt.xlabel("k")
plt.ylabel("Inertia (WCSS)")
plt.title("Elbow Method")
plt.show()
```
![png](lw2_files/lw2_6_0.png)
```python
plt.plot(ks, silhouettes, marker="o")
plt.xlabel("k")
plt.ylabel("Silhouette Score")
plt.title("Silhouette Analysis")
plt.show()
```
![png](lw2_files/lw2_7_0.png)
```python
Xp = PCA(n_components=2).fit_transform(X)
plt.scatter(Xp[:, 0], Xp[:, 1], c=best_labels, s=5)
plt.title(f"K-means Clustering (k={best_k})")
plt.show()
```
![png](lw2_files/lw2_8_0.png)
## Covertype
```python
covtype_file = Path.cwd() / "covertype/covtype.data"
df = pd.read_csv(covtype_file, header=None)
df = df.sample(20000, random_state=42) # safe size
X = df.iloc[:, :-1].values
X = StandardScaler().fit_transform(X)
```
```python
ks = range(2, 9)
inertias = []
silhouettes = []
labels_per_k = {}
for k in ks:
km = MiniBatchKMeans(
n_clusters=k, init="k-means++", batch_size=2048, n_init=5, random_state=42
)
labels = km.fit_predict(X)
inertias.append(km.inertia_)
silhouettes.append(silhouette_score(X, labels))
labels_per_k[k] = labels
```
```python
plt.plot(ks, inertias, marker="o")
plt.xlabel("k")
plt.ylabel("Inertia (WCSS)")
plt.title("Elbow Method – Covertype")
plt.show()
```
![png](lw2_files/lw2_12_0.png)
```python
plt.plot(ks, silhouettes, marker="o")
plt.xlabel("k")
plt.ylabel("Silhouette Score")
plt.title("Silhouette Analysis – Covertype")
plt.show()
```
![png](lw2_files/lw2_13_0.png)
```python
best_k = ks[np.argmax(silhouettes)]
best_labels = labels_per_k[best_k]
```
# community
```python
community_data = Path.cwd() / "communities+and+crime/communities.data"
df = pd.read_csv(community_data, header=None, na_values="?")
df = df.iloc[:, 5:]
df = df.apply(pd.to_numeric)
df = df.fillna(df.mean())
X = df.iloc[:, :-1].values
X = StandardScaler().fit_transform(X)
```
## PCA variance explained
```python
pca = PCA()
pca.fit(X)
plt.plot(np.cumsum(pca.explained_variance_ratio_))
plt.xlabel("Number of components")
plt.ylabel("Cumulative explained variance")
plt.title("PCA Variance Explained – Communities & Crime")
plt.show()
```
![png](lw2_files/lw2_18_0.png)
## PCA to 2D (no clustering yet)
```python
Xp = PCA(n_components=2).fit_transform(X)
plt.scatter(Xp[:, 0], Xp[:, 1], s=5)
plt.title("PCA Projection (2D) – No Clustering")
plt.show()
```
![png](lw2_files/lw2_20_0.png)
## clustering on ORIGINAL space (metrics only)
```python
ks = range(2, 8)
sil_orig = []
for k in ks:
km = KMeans(n_clusters=k, init="k-means++", n_init=10, random_state=42)
labels = km.fit_predict(X)
sil_orig.append(silhouette_score(X, labels))
```
## clustering on PCA space (2D)
```python
sil_pca = []
labels_pca = {}
for k in ks:
km = KMeans(n_clusters=k, init="k-means++", n_init=10, random_state=42)
labels = km.fit_predict(Xp)
sil_pca.append(silhouette_score(Xp, labels))
labels_pca[k] = labels
```
## silhouette comparison plot
```python
plt.plot(ks, sil_orig, marker="o", label="Original space")
plt.plot(ks, sil_pca, marker="o", label="PCA 2D")
plt.xlabel("k")
plt.ylabel("Silhouette Score")
plt.title("Clustering Quality: Before vs After PCA")
plt.legend()
plt.show()
```
![png](lw2_files/lw2_26_0.png)
## PCA cluster visualization (best k)
```python
best_k = ks[np.argmax(sil_pca)]
plt.scatter(Xp[:, 0], Xp[:, 1], c=labels_pca[best_k], s=5)
plt.title(f"K-means on PCA space (k={best_k})")
plt.show()
```
![png](lw2_files/lw2_28_0.png)
## random subspace clustering
```python
rng = np.random.default_rng(42)
idx = rng.choice(X.shape[1], size=30, replace=False)
X_sub = X[:, idx]
```
```python
sil_sub = []
for k in ks:
km = KMeans(n_clusters=k, init="k-means++", n_init=10, random_state=42)
labels = km.fit_predict(X_sub)
sil_sub.append(silhouette_score(X_sub, labels))
```
## final comparison plot
```python
plt.plot(ks, sil_orig, label="Original")
plt.plot(ks, sil_pca, label="PCA 2D")
plt.plot(ks, sil_sub, label="Random Subspace")
plt.xlabel("k")
plt.ylabel("Silhouette Score")
plt.title("Subspace Clustering Comparison")
plt.legend()
plt.show()
```
![png](lw2_files/lw2_33_0.png)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+257
View File
@@ -0,0 +1,257 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "6b4e3004",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 600x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAikAAAGJCAYAAABPZ6NtAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAWJlJREFUeJzt3QlYVNX7B/AvO6IIIrK64ZJI4AZupeWWa+7lkntmtmiW2WKlZpuZP/1balqm5lZiZlpqmqlZLrkvZGrugICIC7Io6/yf9+iMMywKCMz2/TzPBPfOnTtn7hjzznvec46NRqPRgIiIiMjE2Bq7AURERER5YZBCREREJolBChEREZkkBilERERkkhikEBERkUlikEJEREQmiUEKERERmSQGKURERGSSGKQQERGRSWKQQmSGzp8/DxsbG/zvf/8rtnN+++236pxybmv1/vvvq2ugr3r16hg6dGiu67R//34jtJDIujBIITJBX375pfogbNq0qbGbYhGSk5MxadIkBAcHo2zZsqhYsSIaNGiAMWPGICYmBpbok08+wZo1a3Lt37VrlwrGrl+/bpR2ERUGgxQiE7R8+XL1DX7v3r04ffq0sZtj1jIyMvDYY49h2rRpaNmyJWbMmIF33nkHjRo1wnfffYf//vtPd+x7772HmzdvwtKDlMmTJzNIIbNgb+wGEJGhc+fOqQ+S1atXY+TIkSpgkSwAFY18UB86dEhdx2eeecbgvlu3biE9PV23bW9vr25EZBqYSSEyMfJhWqFCBXTp0gVPPfWU2r6X//u//0O1atVQpkwZPP744/jnn38M7j969KiqqahRowacnZ3h4+ODZ599FleuXClw19PDDz8MJycn+Pn54eWXX871LbxVq1aqK+Xff/9F69at4eLiAn9/f3z22We5zpeWlqaCrlq1aqlzVqlSBW+++abaXxLOnDmjfj766KO57pPrUb58+XvWpORH2jt27FhUqlRJdSH17NkTly9fLtL1y1n3on9d5VbY6yevISUlBYsXL1a/y03OL6/vjTfeUMcEBATo7tOvQ1q2bBlCQ0PVvycPDw/069cPUVFRBbomRMWNXxmITIwEJb169YKjoyP69++PuXPnYt++fWjcuHGuY5csWYKkpCT1wSdZgc8//xxt2rRBREQEvL291TGbN2/G2bNnMWzYMBWgHDt2DF9//bX6+fff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 truncated
"text/plain": [
"<Figure size 600x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 600x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 600x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAF2CAYAAADz3Ju4AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAizFJREFUeJztvQe8XFW597/OSUiDdEoS0mmKCkkooUoV5Hq5IsqrqEhAsbwI0q7KvVeaKJY/NSLYSLC86rWAr+/1KhCakAIEuFYgnYQAUlIh7eTM//Nb5zyTZz+z1t5rz+yZ2TP7+X4+80lmzsyetdfes55nPbWjVCqVjKIoiqIohaWz2QNQFEVRFKW5qDKgKIqiKAVHlQFFURRFKTiqDCiKoihKwVFlQFEURVEKjioDiqIoilJwVBlQFEVRlIKjyoCiKIqiFBxVBhRFURSl4KgyoCh15sEHHzQdHR323ySWL19u3zt79uxCX5djjz3WPhRFaQyqDCg1sWTJEvOpT33KTJ482QwYMMAMGTLEHHnkkebmm282mzZt0tn18H/+z/8xN910U67mZ968eeaYY46x13D33Xc3p5xyinn00UdTH2f9+vXm6quvNgceeKDZZZddzMCBA83b3/5284UvfMGsXr3aFAkoNFDu6DFixAhzyCGHmDvuuMN0d3dXvB8K4+mnn25GjRpl+vXrZ6/Dqaeean796187j//3v//dHhe/vbVr1waPa86cOebcc881++67rxk0aJD9/X7iE58wL774YsV7J06cWB5/Z2enGTZsmHnHO95hPvnJT5oFCxaknBElr3RobwKlWv7rv/7LnHHGGaZ///7mYx/7mF3wt27dah555BHzq1/9ysyYMcN897vfLfwEY9HHvGBxx2IK/vmf/9n85S9/sZYADlqFbNmyxey0006mT58+DZu7559/3l6/kSNHmgsvvNCO+d577zVHHHGEueKKK4KPs3TpUnPiiSfa4+HeOOqoo+x5/+lPfzI//elPrTB87rnnEo+D+QL4bKsrA1CYr7vuOvv8lVdeMT/84Q/N008/bZWjr33ta+X3Xnnlleaaa64x++yzjznzzDPNhAkTzGuvvWZ+97vfWSXhJz/5ifnwhz8cOf6///u/W8VizZo15lvf+pYV6CEcfPDB5vXXX7fXCN+H64bPQzHA2KCMcGVg+PDh5tJLL7XPN2zYYJWQX/ziF+all14yF198sbnhhhsymjGlaUAZUJS0LF26tLTLLruU3vKWt5RWr15d8fdFixaVbrrpJp1YD+95z3tKEyZMyM38fPvb30bDstJjjz0WeX3z5s3Bx9i2bVvpwAMPLA0aNKj0xz/+seLv69atK/3bv/1b7DHeeOONUjtxzDHHlN72trdVnOPYsWNLO++8c2nr1q32tV/84hd2/j/wgQ+UX+P8/ve/L/32t7+NvNbd3V2aOHFi6ZJLLim9733vKx177LHB43rooYdK27dvr3gNY/j3f//3yOu4T3G/St58883SaaedZj+D+0dpbVQZUKri05/+tF0EHn300WBBcc0115QmT55c6tevn11gLr/88gphQwvPAw88UDrooINKAwYMKL397W+3z8GvfvUr+7x///6ladOmlZ588snI588++2y7yK5YscIeB/8fM2ZM6Vvf+pb9+5/+9KfScccdZwXW+PHjSz/5yU8in7/yyivteUlmzZplX1+2bFnFWCH4DjnkEDumSZMmle68887IZzF2fJbOAQICz/mDFAMcH8/xfZy///3vpfe///2l4cOH2+/B3PzmN7+JvAdC5Kqrrirtvffe9j0jRowoHXnkkaV77rkn8frcfvvt9nsXLFhQqpaf/exn9hhf+cpXUgnKJ554onT00UeXBg4cWPrc5z5X/hsecg5//vOf23PENYUyijlZu3atvY/w2d12281e8xkzZjgVmR/96Ef2vsF9hbn84Ac/WHr++eerPufQc5RA6ON8XnjhBfscSjWu1/r164OPjfuOFDjMS2dnZ2nlypU1jRdjOP3004OUAbBhwwb7mT333NMqJ0rrojEDSlX89re/tX5GmJFDgPkS5uZp06aZG2+80fqmYTr90Ic+VPHexYsXW3MofKV4D0yg+D/MpDBJfvSjH7U+aZhf/9f/+l8Vvtft27dbf/e4cePMN77xDWvm/OxnP2uD8t797ndbE+nXv/51M3jwYOveWLZsWdV3Acb6gQ98wLzrXe8y119/vTWnwj3y17/+1fsZmHanTJlidt11V/OjH/3IPuLiB3Csww47zJpmv/jFL9rv2Xnnnc1pp51m7rrrrvL7rrrqKjsvxx13nDX54nvGjx9vnnzyycTzgJ966NCh5l//9V/LJvq0/N//+3/tv2eddVbwZ2AGx7XCfGAOMPY4cD/84Q9/sPMAnzd86Z/+9Kft/+F+wBzgXHCtcY05X/nKV+z1hlkcZu2LLrrI+s7f+c53pvK3ZwHM8nADwf++aNEi88wzz9jriXsyFPwe9tprLxuDgN8HTPxwxVTLxo0b7QP3ZSiICXnf+95nXnjhBfO3v/2t6u9WckCztRGl9YC5F7fOe9/73qD3P/300/b9n/jEJyKvX3bZZfb1+++/P7ILwWtz584tv/aHP/zBvoadI3b8xHe+853IjpssA3jtq1/9avm1NWvW2M92dHTY3SvxzDPP2PfCGlCtZQCvPfzww+XX/vGPf9hd+aWXXuq1DMS5CVyWgRNOOKH0jne8I7LTxS7siCOOKO2zzz7l12Ci9+3gksB8Y6cMq80ZZ5xR6urqSn2MqVOnloYOHRr8frKQwCrh+pvLMgCrEDejn3nmmfa6nnLKKZHPH3744ZH5Xb58ealPnz4VVos///nPpb59+wZbM9KCc8Cu/5VXXrEPWHguvPBCey6nnnqqfQ8sPHh+4403Bh8XczBy5MiISf/DH/6wvQeq5ctf/rIdx5w5c4ItAwDjxuekpUppLdQyoFQVLQ5CdzEIgAKXXHJJ5HUKSEIgImf//fc3hx9+ePn59OnT7b/HH3+83enK17HLkvBAKuy+9ttvP7ubhiWBwGv4m+vzoWCsRx99dPn5brvtZo9byzE5CPK6//777bgRuPXqq6/aB3bUJ598st1VYlcGcC6wIuC1NKxYscL80z/9k/n4xz9u7r77bmttOO+882wwI4GMEVhaku6LNDtbgODTc845J/j92NkjuJLfAxgnLAMcvL5y5UrT1dVln8OCAAsS5pHmEA8EysFS8MADD5h6gV0/7gs83vrWt5qZM2ea97znPTbwr5rfE/jv//5vew8g0JDA///nf/4n1irl4+GHH7ZWJcwPfmdpgHUA4P5UWpe+zR6A0nog9SzNjx/CBlH0e++9d+R1LMQQYPg7hwt8APM1kMKIXocbgYM0Kyy88r1jx4616VHydfn5NMixArgKajmmdENA2H3pS1+yDxf/+Mc/zJ577mkj0d/73vfadDFkBsAlApP9AQcckGh6x/W59tprrXCGkDr77LOtcEKKKEDmAylfcfdFWiUI406TMZDm3oDwX7dunc2QgIKEeYTgd8EVDAncJlDKfIKQhKEPuKm+973vlVMAMQakDFb7ewI//vGPzaRJk+z1wj0C4DKAqwDug69+9auplBWY+nHPfP/73zdpgWsBpFUElXyhyoCSGixeY8aMsQIiDVIQ+/Cl1Ple5zvYWj/vGyPiEGoZU7VQPMRll11mLQEuSMmC7xtxFL/5zW/MPffcYxd2xGfcfvvtsSlnc+fOtT57CBYABeLll1+28QNY4BHXgRoESBeN4y1veYt56qmn7I48yYpAoAZBGqq9tphHXFvsqF3vjRPomB9fLAPSARGnEAcsUki3jJs38Oc//9mEAEsCYnY2b97sVG5QwwLxESG/N1yrk046ySpPsOBVI9BpHZDKvtJaqDKgVAXy5FFDAEKCm/RdIF8aizF2ZzCTEhA4CNzC3/MCdvUA44LVgpDWi1oJVYwQpEk71ziBQiCPH2Z3PLBjg4IAYRWnDGAsEAocKB+4PhAq2GlOnTrVWh3iQBAbAtiwa7388stNnsCuGYoBdtOwnKQBxZNQcyHu+tQCxgPXEpQ4WGKSLA1weUARuO222yqC/Z599lnzH//xH7ZYFGo8xAE3AxQB1LVAIOXo0aNTjx33GNxKUP74b1tpPTRmQKmKz3/+83bHAyEDoSHBDpVMzPBHAxkxT4VK4D/Nk9AgHyrxxhtvmDvvvDPT78HcwYSdBMzJKFzzne98x1kdDkVs+OLOgVDBbg2LfRxQMqCoIauBg4I4iIlAYaR/+Zd/KRdM8oGsClSmgwIBJVECMzgyHJoBMgxgEYBfXFpt8FzOnVQQMUeuRxbKAMC4MAb8nijOgQNLz//7f//P/h/KFr4XWRSYc/6AEofrDgUuDtzT+F0i3gQWAZ/7JA5UGIUVCS4UXNdQBVfJJ2oZUKoWmjBHfvCDH7Q7Al6BEGZVVCdDih3trOCDhiUBO26kFT722GNWwCKdKimdrJFgpwS/NILpYCaHAIEPHTEIqKqXFQcddJD5+c9/boMqkRqGBRw7axe33nqr3eVB0CKwD4IAChgE7qpVq2zQGIDghuKAY8NC8MQTT5hf/vKXNq0yDuziETiIa0RVB7Hjwy4faZcYH+IJYAHC/PiA9QK7VghJWCQQjIbS1HgdQW24XyBYoSw0437FOeBcodxQGh/ODztblNaFIG0W+B3BTYC5gauFVyD8/e9/b3fumD+Uc0awI6pEuoCrB+4k/P5uueUWbyzERz7yEfsbROAlUlbxIHAvYn44UBqghADcG0gjpAqECARGgKnS4jQ7nUFpbZ577rnSeeedZyuhIS1t8ODBttDNzJkzI6lwKDp09dVX26I8O+20U2ncuHGxRYckuFXPP/98ZxreN7/5zYqiQ6HFX1zft3DhwtL06dPt+aAw0Q033BBbdCg0LY6nFm7cuNGmgg0bNiyo6NCSJUtKH/vYx0qjRo2y84cLine truncated
"text/plain": [
"<Figure size 600x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAAFvCAYAAADpOhgRAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA1OdJREFUeJzsnQeYXGX1xs9s7yWbbHrvCSmEEjqhdykqTQUbRUFUrChKUREsiH9sKArYAAFBBKSXJIQkpJDeN2177312/s/vzH6bu5OZ2Wk7s7u5h+ey2dmZO7d89/3O955z3uNwuVwusc0222yzLSoWF52vsc0222yzzQZd22yzzbYom+3p2mabbbZF0WzQtc0222yLotmga5ttttkWRbNB1zbbbLMtimaDrm222WZbFM0GXdtss822KJoNurbZZpttUTQbdAeZvfvuu+JwOPRnX7Zv3z597+OPPy5Hsi1ZskQ322wbCDagQHfPnj1y0003yZQpUyQlJUWysrLk5JNPll//+tfS0tIS68MbsPbPf/5THnroIRlI9sEHH8jpp5+u9zA/P18uuOACef/994PeT319vdxzzz2yYMECycjIkNTUVDnqqKPkO9/5jhQXF8uRZEwcTKJmGzZsmBx33HHyl7/8Rbq6ug57PxPzFVdcIaNGjZKkpCS9D5dccon8+9//9rr/bdu26X559mprawM+rqVLl8rHPvYxGT9+vH6W7zv//PO93u9Jkyb1HH9cXJzk5OTIvHnz5MYbb5RVq1bJkWCOgaK98PLLL8snP/lJSU5Oluuuu04frPb2dlm+fLk899xz8tnPflb++Mc/ypFuPFxcFx4iBi128cUXy+bNm9WztRq3tq2tTRITEyU+Pj5qx3jgwAG9f3l5eXLbbbfpMb/xxhty0kknyQ9/+MOA91NQUCBnn3227o+xccopp+h5b9y4UZ588kkFnZ07d/a5H64XxmcHO+jimPz0pz/V3ysqKuSvf/2rfPTRRzoJ3X///T3vveuuu+Tee++V6dOnyzXXXCMTJ06UqqoqeeWVVxSM//GPf8i1117ba//f//73FcBramrkN7/5jXzxi18M6LgeffRReemll3QCAHD5/N///nfZtGmTPtcAsBV0c3Nz5Rvf+Ib+3tDQoGD/zDPPSGlpqXz961+XBx98UIa0uQaAFRQUuDIyMlyzZs1yFRcXH/b3Xbt2uR566KGYHNtgsIsuusg1ceJE10Cx3/3ud0zkrtWrV/d6vbW1NeB9dHR0uBYsWOBKS0tzLVu27LC/19XVub73ve/53UdTU5NrKNnpp5/umjt37mHnOG7cOFd6erqrvb1dX3vmmWf0+n/iE5/oec1qr776quu///1vr9e6urpckyZNct1+++2uyy+/3LVkyZKwjpXjGjlypOu8887r9frEiRN1vHpac3Oz67LLLtPjZvwMZRsQoHvzzTfrxX7//fcDfiDvvfde15QpU1xJSUl6I++4447DHmpzg9955x3XMccc40pJSXEdddRR+jv23HPP6e/JycmuRYsWudatW9fr89dff70O5v379+t++PeYMWNcv/nNb/TvGzdudJ1xxhkKDBMmTHD94x//6PX5u+66S8/L0x577DF9fe/evYcdKwBz3HHH6TFNnjzZ9cQTT/T6LMfOZ8058CDyu3UzAMz++Z3vs9q2bdtcH//4x125ubn6PVyb//znP73ew8N69913u6ZNm6bvGTZsmOvkk092vf76633enz/84Q/6vatWrXKFak899ZTu4yc/+UlQgLRmzRrXqaee6kpNTXV99atf7fkbm+c1fPrpp/UcuadM+lyT2tpaHUd8dsSIEXrPP/vZz3qdMP72t7/puGFccS2vuuoq14EDB0I+50DP0dMAV86nqKhIf8d54X7V19cHvG/GnZkouS5xcXGugwcPhnW8PFuLFy8OCHSxhoYGPe6xY8fqJDBUbUBwuv/973+Vx2X5GYix7GGZumjRIvnVr36l3CFLrquvvvqw9+7evVuXUXBZvIelD/9mecVS5tOf/rRyhizbrrzyysO4MafTqXwkfNXPfvYzXR7deuutGpxi2XTsscfKAw88IJmZmUqL7N27N+TrwLF+4hOfkHPOOUd++ctf6jIMWmXLli0+P8OScOHChTJ8+HD529/+pps/fpd9nXDCCbqk++53v6vfk56eLpdddpk8//zzPe+7++679bqcccYZutTkeyZMmCDr1q3r8zzgEbOzs+Vb3/pWz9I+WHvxxRf152c+85mAP8PymXvF9eAacOz+jPHw2muv6XX4/Oc/r1znzTffrP+GtuAacC7ca+6x1X7yk5/o/Wb5znL4a1/7mrz11lty2mmnBcWHRsKgYaCP4Ed37dol27dv1/vJmAzUeB6mTp2qFAHPR1pamlI4wfLvlZWV+v3f+973lPI666yzAv58RkaGXH755VJUVCRbt26VIWuxRn2WiRzGpZdeGtD7P/roI33/F7/4xV6vf/Ob39TX33777V6zKq+tWLGi57XXXntNX8MTwoM19sgjj/TyII2ny2v33Xdfz2s1NTX6WYfDod6Yse3bt+t78W5D9XR5benSpT2vlZeXq5f5jW98w6en649e8ObpnnXWWa558+b18tzwKk466STX9OnTe15jae/LI+nLuN54fqxCPvnJT7o6OzuD3sfRRx/tys7ODvj9xuPHy/b2N2+eLp6Ydfl9zTXX6H294IILen3+xBNP7HV99+3b54qPjz/MC9+0aZMrISEhYO88WOMc8GIrKip0Y8Vy22236blccskl+h5WLPz+q1/9KuD9cg3y8vJc3//+93teu/baa3UMBGNQCWa1xb2/6aabXC0tLQF7uhjHzec9V15DyWLu6TI7YoHOygQCsNtvv73X64aYh7i32pw5c+TEE0/s+X3x4sX688wzz1TPzfN1vAZPswYU8CZmzpyp3iGesTFe42/ePh+ocaynnnpqz+8jRozQ/YazT6tVV1fL22+/rcdNAAOvhA0P8bzzzlMvCS8D41zwinktGNu/f79ceOGF8oUvfEFeeOEF9Z5vuOEGDeoZI0OFlUNf4yIYTw0jCPu5z30u4PfjqRJktI4BjhNP12q8fvDgQens7NTf8YhZEXEdzTVkI4iE5/vOO+9IfxleJOOCbfbs2fLwww/LRRddpAGwUJ4n7H//+5+OAQJuxvj3hg0b/K6yPI1A3uuvvy5//vOfdTXFKsdcs2C8XYzxOVQtIdYHQEpRMBeZh5qo/bRp03q9zoAHKPi71azAirHsxTwfevM69IPVSIFhgHu+d9y4cZr24vm65+eDMc9jxaAYwtmnJ30BqPzgBz/QzZuVl5fL2LFjNfJ96aWXyowZMzQTASqFpf78+fP7XLJzf3784x8rCAIG119/vYIAqX8Yy04zyfkbF8FONhx3MBkKwYwNQLaurk4zMpiIuI4ArDezArmnAURMfr4Ax4COL4Pe+tOf/tST2sUxkAoW6vOEkWkwefJkvV+MEQyqAYoB2uG+++4LaD/QOsag7aD/oMeeffbZgI+lsbFRfwY74Q4mGxCgO2bMGH0QgzFPwPNlvlKlfL3umUEXzud9HSM8cTjHFKoZvvqb3/ymerbezExmcJPw3P/5z3/UeyEtCP78D3/4g99UohUrVujDxwOMAdRlZWXK7/IgwbuTw0saoD+bNWuWrF+/Xj3MvrxiY+TwBmOh3luuI/cWD9Hbe/0BJ9fHF9dMmhc8sj9jhUUanb/rhpGuFYjhGRNTaW1t9TqJkAMOfx3o82aMyY/cXbxfcuwDvTebu3HA06kaShZz0DV5puTg8jBaqQBvRr4hgx5vg+WVMR5sAhj8faAYXirGceGFG/P0xsO1QB8IgpXGE/P34BojD5blOhseCEAMKPgDXY4FoLQaIM/94eHFczr66KPVi/ZnBHMI5OCF3XHHHTKQDC8QAMY7ZCUQjFHkQc6yv/sTjnE8UFJMlqws+vKcoUoA3N///vcajLXajh075M4779QiB3KkgzXAluuE1x0I6DY2NiodxSRrfbaHmsWc08W+/e1v6wzOw8zD6Wl4XGZpCl+IeUboTUI1/NZAejhNxY6xpqYmeeKJJyL6PVw7lr59GctQEuwfeeQRKSkpOezvJNsbg+OzGg8v3gfFFv4MMGdCJIvCang8cNYUcOABmcIOX0YWB5VKADWTsafxIJNREQsjowEPl+wOz1UIv3teO8+JmGvkbYsE6GIcF8fA8+SNU2XlQjEDxqTG95K1wTW3bkyW3HcmSn8GJeVpOBqsZgBQK/3hD6BZFUG9cF+D9awHkyUMFHBiGXPVVVfpDGetSGM5RrUK3JDxFOAI8Yy5saSLrV69WoGMNJm+0oSiaeeee67yhgSVWF7zoMJxwhFTZRUpO+aYY+Tpp5/W4CIpPzwoeIre7Le//a16LQAaAS4eOCY6gK2wsFCDJxgACUCzbzzeNWvWKDdHupw/wyslgMY9MlVoeDB4raTTcXzwvaxouD6+DG8cLwwwwsMmaEVJOK8T3GG8AGCAcizGK+fAuTKJmPQszg9PjZJWACtWxnMEvcC1gaKxVqS9+uqrmtrG9aOMmqAfVYPeDIoIGorn7//+7/98ctWk6RHjgKcHYBnbjz32mO6fcelpRUVFCvYYY4P0MFORRkCcQOuQNtcAsp07d7puuOEGrYwh5SQzM1MT8h9++OFeKU4UR9xzzz1aPJCYmOgaP3683+IIT+O0b7nlFq/pVT//+c8PK44INEnd2/etXbtWE8Q5HwooHnzwQb/FEYGmO1lTxhobGzXFJycnJ6DiiD179riuu+4616hRo/T6kYx+8cUXu5599tme9/z4xz92HX/88bpPUuRIVSIVyluFk6dVVla6br31Vr0vpFDxPXwfaXUk7LOvrKwsTbHqy0jR++EPf6hpbhShmAIX7ndJSUmf98TfNaRyy2rmvnz44Ye9Xjepf6RpWY3imlNOOUXHCBvnxbjasWOHqz/Line truncated
"text/plain": [
"<Figure size 600x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Silhouette (high-D): 0.11498283339035163\n",
"Silhouette (PCA 2D): 0.3707790707560126\n"
]
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 600x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Silhouette (random subspace): 0.20570999740812154\n"
]
}
],
"source": [
"# Jupyter Notebook: K-means & Subspace Clustering (Plots Only)\n",
"# Focus: generating figures for the report (elbow, silhouette, PCA plots, comparisons)\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.cluster import KMeans, DBSCAN\n",
"from sklearn.metrics import silhouette_score\n",
"from sklearn.decomposition import PCA\n",
"from sklearn.impute import SimpleImputer\n",
"\n",
"plt.rcParams[\"figure.figsize\"] = (6, 4)\n",
"\n",
"# -----------------------------\n",
"# Helpers\n",
"# -----------------------------\n",
"\n",
"def load_uci_csv(url, header=None):\n",
" return pd.read_csv(url, header=header)\n",
"\n",
"\n",
"def preprocess_numeric(df):\n",
" X = df.select_dtypes(include=[np.number])\n",
" X = SimpleImputer(strategy=\"median\").fit_transform(X)\n",
" X = StandardScaler().fit_transform(X)\n",
" return X\n",
"\n",
"\n",
"def kmeans_experiment(X, k_range, title_prefix=\"\"):\n",
" inertia = []\n",
" silhouette = []\n",
"\n",
" for k in k_range:\n",
" km = KMeans(n_clusters=k, init=\"k-means++\", n_init=10, random_state=42)\n",
" labels = km.fit_predict(X)\n",
" inertia.append(km.inertia_)\n",
" silhouette.append(silhouette_score(X, labels))\n",
"\n",
" # Elbow\n",
" plt.plot(k_range, inertia, marker=\"o\")\n",
" plt.xlabel(\"k\")\n",
" plt.ylabel(\"Inertia\")\n",
" plt.title(f\"{title_prefix} – Elbow\")\n",
" plt.show()\n",
"\n",
" # Silhouette\n",
" plt.plot(k_range, silhouette, marker=\"o\")\n",
" plt.xlabel(\"k\")\n",
" plt.ylabel(\"Silhouette score\")\n",
" plt.title(f\"{title_prefix} – Silhouette\")\n",
" plt.show()\n",
"\n",
"\n",
"# =============================\n",
"# PART 1 — K-MEANS (UCI)\n",
"# =============================\n",
"\n",
"# ---- Abalone ----\n",
"abalone_url = \"https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data\"\n",
"abalone = load_uci_csv(abalone_url)\n",
"X_abalone = preprocess_numeric(abalone)\n",
"\n",
"k_range = range(2, 11)\n",
"kmeans_experiment(X_abalone, k_range, \"Abalone\")\n",
"\n",
"\n",
"# ---- Covertype (sampled, very large) ----\n",
"covertype_url = \"https://archive.ics.uci.edu/ml/machine-learning-databases/covtype/covtype.data.gz\"\n",
"covertype = pd.read_csv(covertype_url, header=None, compression=\"gzip\")\n",
"\n",
"# sample for speed\n",
"covertype_sample = covertype.sample(n=20000, random_state=42)\n",
"X_covertype = preprocess_numeric(covertype_sample)\n",
"\n",
"k_range = range(2, 15)\n",
"kmeans_experiment(X_covertype, k_range, \"Covertype (sampled)\")\n",
"\n",
"\n",
"# =============================\n",
"# PART 2 — SUBSPACE CLUSTERING\n",
"# =============================\n",
"\n",
"# ---- Communities and Crime (>100 features) ----\n",
"crime_url = \"https://archive.ics.uci.edu/ml/machine-learning-databases/communities/communities.data\"\n",
"crime = load_uci_csv(crime_url)\n",
"\n",
"X_crime = preprocess_numeric(crime)\n",
"\n",
"# ---- PCA 2D ----\n",
"pca2 = PCA(n_components=2)\n",
"X_pca2 = pca2.fit_transform(X_crime)\n",
"\n",
"plt.scatter(X_pca2[:, 0], X_pca2[:, 1], s=5)\n",
"plt.title(\"Communities & Crime – PCA 2D\")\n",
"plt.show()\n",
"\n",
"# ---- PCA 3D ----\n",
"pca3 = PCA(n_components=3)\n",
"X_pca3 = pca3.fit_transform(X_crime)\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.add_subplot(111, projection=\"3d\")\n",
"ax.scatter(X_pca3[:, 0], X_pca3[:, 1], X_pca3[:, 2], s=5)\n",
"ax.set_title(\"Communities & Crime – PCA 3D\")\n",
"plt.show()\n",
"\n",
"\n",
"# ---- Clustering BEFORE PCA (high-D) ----\n",
"km_hd = KMeans(n_clusters=4, n_init=10, random_state=42)\n",
"labels_hd = km_hd.fit_predict(X_crime)\n",
"sil_hd = silhouette_score(X_crime, labels_hd)\n",
"\n",
"# ---- Clustering AFTER PCA (2D) ----\n",
"km_2d = KMeans(n_clusters=4, n_init=10, random_state=42)\n",
"labels_2d = km_2d.fit_predict(X_pca2)\n",
"sil_2d = silhouette_score(X_pca2, labels_2d)\n",
"\n",
"print(\"Silhouette (high-D):\", sil_hd)\n",
"print(\"Silhouette (PCA 2D):\", sil_2d)\n",
"\n",
"plt.scatter(X_pca2[:, 0], X_pca2[:, 1], c=labels_2d, s=5)\n",
"plt.title(\"K-means on PCA 2D\")\n",
"plt.show()\n",
"\n",
"\n",
"# ---- Random subspace clustering ----\n",
"np.random.seed(42)\n",
"subspace_idx = np.random.choice(X_crime.shape[1], size=20, replace=False)\n",
"X_sub = X_crime[:, subspace_idx]\n",
"\n",
"km_sub = KMeans(n_clusters=4, n_init=10, random_state=42)\n",
"labels_sub = km_sub.fit_predict(X_sub)\n",
"sil_sub = silhouette_score(X_sub, labels_sub)\n",
"\n",
"print(\"Silhouette (random subspace):\", sil_sub)\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "ml2",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.14.0"
}
},
"nbformat": 4,
"nbformat_minor": 5
}