{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "a0eP_UGnAiPI" }, "source": [ "# Example: Working on Biase\n", "\n", "**Install GraphHDBSCAN package**" ] }, { "cell_type": "markdown", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "EbV1qfMsSBg-", "outputId": "03f662f0-ad54-4d72-ade6-7591765f99ad" }, "outputs": [], "source": [ "Install dependency:\n", "\n", "```bash\n", "!pip install git+https://github.com/Campello-Lab/GraphHDBSCAN.git\n", "```" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "nzoye5UBSRAc", "outputId": "364d646d-7945-4e37-e54a-f55db1df7cd2" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.12/dist-packages/hdbscan/robust_single_linkage_.py:175: SyntaxWarning: invalid escape sequence '\\{'\n", " $max \\{ core_k(a), core_k(b), 1/\\alpha d(a,b) \\}$.\n" ] } ], "source": [ "from coresg_graphhdbscan import GraphCoreSGHDBSCAN" ] }, { "cell_type": "markdown", "metadata": { "id": "oJRDGEiDAtYv" }, "source": [ "**Load Data**" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "M1FwLvVWSw-P", "outputId": "459dddea-5f8a-471a-a850-db26cb13b14a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Available columns in adata.obs: ['cell_type', 'n_genes']\n" ] } ], "source": [ "import yaml\n", "import scanpy as sc\n", "# Load the YAML configuration file\n", "with open(\"config.yaml\", \"r\") as f:\n", " config = yaml.safe_load(f)\n", "\n", "Biase_config = config[\"DATASETS\"][\"Biase\"]\n", "expected_cell_label = Biase_config[\"cell_labels\"]\n", "\n", "# Load the AnnData object\n", "adata = sc.read_h5ad(\"/content/Biase.h5ad\")\n", "# Print available columns in adata.obs\n", "available_columns = list(adata.obs.columns)\n", "print(\"Available columns in adata.obs:\", available_columns)\n", "\n", "cell_label_key = expected_cell_label\n", "\n", "# Extract the count matrix and cell labels\n", "count_matrix = adata.X # Cells as rows and genes as columns\n", "true_labels = adata.obs[cell_label_key]" ] }, { "cell_type": "markdown", "metadata": { "id": "8Xhw60EhBSl5" }, "source": [ "**Clustering**" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "id": "1x2y_IyFTN12" }, "outputs": [], "source": [ "g = GraphCoreSGHDBSCAN(\n", " min_samples=range(2,30),\n", " sim_graph_method=\"sc_gauss\",\n", " n_neighbors=5,\n", " no_noise=True,\n", " metric=\"cosine\",\n", ")\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "MXK_0VcyVxlS", "outputId": "7085cf74-36ac-497a-904f-32cdf255535a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[CORE-SG] (precomputed) CORE-SG graph has 1176 edges\n", "[CORE-SG] m= 2: MST+tree+labels in 0.0116s\n", "[CORE-SG] m= 3: MST+tree+labels in 0.0178s\n", "[CORE-SG] m= 4: MST+tree+labels in 0.0042s\n", "[CORE-SG] m= 5: MST+tree+labels in 0.0036s\n", "[CORE-SG] m= 6: MST+tree+labels in 0.0034s\n", "[CORE-SG] m= 7: MST+tree+labels in 0.0036s\n", "[CORE-SG] m= 8: MST+tree+labels in 0.0034s\n", "[CORE-SG] m= 9: MST+tree+labels in 0.0031s\n", "[CORE-SG] m=10: MST+tree+labels in 0.0032s\n", "[CORE-SG] m=11: MST+tree+labels in 0.0031s\n", "[CORE-SG] m=12: MST+tree+labels in 0.0032s\n", "[CORE-SG] m=13: MST+tree+labels in 0.0032s\n", "[CORE-SG] m=14: MST+tree+labels in 0.0061s\n", "[CORE-SG] m=15: MST+tree+labels in 0.0051s\n", "[CORE-SG] m=16: MST+tree+labels in 0.0040s\n", "[CORE-SG] m=17: MST+tree+labels in 0.0031s\n", "[CORE-SG] m=18: MST+tree+labels in 0.0031s\n", "[CORE-SG] m=19: MST+tree+labels in 0.0040s\n", "[CORE-SG] m=20: MST+tree+labels in 0.0032s\n", "[CORE-SG] m=21: MST+tree+labels in 0.0034s\n", "[CORE-SG] m=22: MST+tree+labels in 0.0033s\n", "[CORE-SG] m=23: MST+tree+labels in 0.0030s\n", "[CORE-SG] m=24: MST+tree+labels in 0.0032s\n", "[CORE-SG] m=25: MST+tree+labels in 0.0029s\n", "[CORE-SG] m=26: MST+tree+labels in 0.0032s\n", "[CORE-SG] m=27: MST+tree+labels in 0.0032s\n", "[CORE-SG] m=28: MST+tree+labels in 0.0031s\n", "[CORE-SG] m=29: MST+tree+labels in 0.0030s\n" ] }, { "data": { "text/plain": [ "GraphCoreSGHDBSCAN(min_samples_list=[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], metric='cosine', eps=1e-12, min_cluster_size=None, X_=None, N_=None, D_=None, core_={}, kmax_=None, edges_ut_=None, idx_with_self_=None, dst_with_self_=None, idx_no_self_=None, dst_no_self_=None, A_knn_=None, msts_={}, mst_times_={}, models_={}, times_={})" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.fit(adata.X)" ] }, { "cell_type": "markdown", "metadata": { "id": "VgvQicvqBa92" }, "source": [ "Intractable condensed tree" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 593, "referenced_widgets": [ "514a8ec6ad44410291b40898a8c3a1a2", "9c0fdc86b5d74d1c9fdf96a8b0f7df25", "744b72e160ba4268b5b799120394f34c", "e3b6290b94c843d9b55497971d11fb9d", "3cf700ea69b94f4aaac7daf4819d5bea", "23c52379e8f54be290ebf57006c8c1fb", "ba0f07c00bb04067b56f30a34f6fb6fb" ] }, "id": "uaJRiQAYmBE9", "outputId": "98f34309-abe1-4cd6-af36-609d4db25ed0" }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "514a8ec6ad44410291b40898a8c3a1a2", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(SelectionSlider(continuous_update=False, description='m', layout=Layout(width='500px'), options…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9c0fdc86b5d74d1c9fdf96a8b0f7df25", "version_major": 2, "version_minor": 0 }, "text/plain": [ "SelectionSlider(continuous_update=False, description='m', layout=Layout(width='500px'), options=(2, 3, 4, 5, 6…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "g.interactive_condensed_tree()" ] }, { "cell_type": "markdown", "metadata": { "id": "sLhINs78BkGN" }, "source": [ "Labels for min_samples = 6" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "id": "6Xl7Il-3V1re" }, "outputs": [], "source": [ "labels_ = g.labels_for(6)" ] }, { "cell_type": "markdown", "metadata": { "id": "7X7XqfYIBxfx" }, "source": [ "Condensed tree for min_samples = 6" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 547 }, "id": "_K6MiT0imWau", "outputId": "2eeff47d-01c0-4167-d1c6-c58a50f50f8a" }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAykAAAIACAYAAACGviMgAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVMZJREFUeJzt3XtclHX6//H3gHJQYTyDGioe0jxSVERqapFoZrHZpm6b6Kq1paaSmewmntoot0wt0mxVrO+aZgf7mYUZqa2Fmqdv2VdNTdNS0CwgMEFn7t8fLpMTqDDM7QzD6/l43I+Yz3zmmusey+biuj+f22IYhiEAAAAA8BJ+nk4AAAAAAC5EkQIAAADAq1CkAAAAAPAqFCkAAAAAvApFCgAAAACvQpECAAAAwKtQpAAAAADwKhQpAAAAALwKRQoAAAAAr0KRAsAnpaeny2Kx6PDhw55OpVIOHz4si8Wi9PR0T6dSafv371efPn1ktVplsVi0atUqT6cEAPBSFCkA3OLgwYN66KGH1KpVKwUFBSk0NFTdunXT3Llz9euvv3o6PZ/WsmVLWSyWyx6eLnQSExP11Vdf6R//+Idef/11XX/99R7Nx1t8/PHHuvXWW2W1WhUSEqLo6GitWLHC02kBgEfV8HQCAKq+NWvW6I9//KMCAwM1dOhQderUScXFxdq0aZMef/xxff3111q4cKGn0/RZc+bMUUFBgePxBx98oDfeeEMvvPCCGjZs6Bi/+eabPZGeJOnXX39VVlaW/v73v2vMmDEey8PbLFmyRCNGjNDtt9+up59+Wv7+/tq3b5+OHj3q6dQAwKMoUgBUyqFDhzR48GC1aNFCn3zyiZo0aeJ4bvTo0Tpw4IDWrFnjwQx9X0JCgtPj7OxsvfHGG0pISFDLli0v+rrCwkLVrl3b3OT+6+TJk5KkunXrui3mlczfDIcPH9bo0aM1duxYzZ0719PpAIBX4XIvAJUya9YsFRQUaNGiRU4FSok2bdpo3Lhxjsfnzp3TzJkz1bp1awUGBqply5b629/+pqKiIqfXtWzZUnfeeac2bdqkG2+8UUFBQWrVqpVee+21Uu/x9ddf69Zbb1VwcLCuuuoqPfXUU7Lb7WXm++GHH6pHjx6qXbu2QkJC1L9/f3399ddOc4YNG6Y6derohx9+UEJCgurUqaNGjRpp4sSJstlsTnOXL1+u6OhohYSEKDQ0VJ07dy71hTM3N1fjx49XRESEAgMD1aZNGz377LOlcszNzdWwYcNktVpVt25dJSYmKjc3t8zzqKiSczp48KDuuOMOhYSE6P7775ck2e12zZkzRx07dlRQUJDCwsL00EMP6eeffy4Vpzyf3+9NmzZNLVq0kCQ9/vjjslgsTsXTzp071a9fP4WGhqpOnTq67bbbtHnzZqcYJWuMNm7cqEceeUSNGzfWVVddddH33LBhgywWi958801Nnz5dzZo1U0hIiO69917l5eWpqKhI48ePV+PGjVWnTh0NHz681L+DZluwYIFsNptmzJghSSooKJBhGFc0BwDwVnRSAFTK6tWr1apVq3JfSjRy5EgtXbpU9957rx577DFt2bJFqamp2rNnj959912nuQcOHNC9996rESNGKDExUYsXL9awYcMUHR2tjh07SjrfNejdu7fOnTunyZMnq3bt2lq4cKGCg4NLvffrr7+uxMRExcfH69lnn9Xp06c1f/58de/eXTt37nT64myz2RQfH6+YmBg999xz+vjjj/X888+rdevWevjhhyVJ69at05AhQ3Tbbbfp2WeflSTt2bNHn332maMwO336tHr27KkffvhBDz30kJo3b67PP/9cycnJOn78uObMmSNJMgxDd999tzZt2qS//vWvuuaaa/Tuu+8qMTGxQn8el3Lu3DnFx8ere/fueu6551SrVi1J0kMPPaT09HQNHz5cjz76qA4dOqSXXnpJO3fu1GeffaaaNWtW+PO70D333KO6detqwoQJGjJkiO644w7VqVNH0vkCs0ePHgoNDdWkSZNUs2ZNvfLKK+rVq5c2btyomJgYp1iPPPKIGjVqpJSUFBUWFl72nFNTUxUcHKzJkyfrwIEDevHFF1WzZk35+fnp559/1rRp07R582alp6crMjJSKSkpl4x3+vRpnT59+rLv6+/vr3r16l1yzscff6z27dvrgw8+0OOPP64ffvhB9erV0+jRozV9+nT5+fF7RADVmAEALsrLyzMkGXfffXe55u/atcuQZIwcOdJpfOLEiYYk45NPPnGMtWjRwpBkfPrpp46xEydOGIGBgcZjjz3mGBs/frwhydiyZYvTPKvVakgyDh06ZBiGYfzyyy9G3bp1jVGjRjm9d3Z2tmG1Wp3GExMTDUnGjBkznOZee+21RnR0tOPxuHHjjNDQUOPcuXMXPeeZM2catWvXNr755hun8cmTJxv+/v7GkSNHDMMwjFWrVhmSjFmzZjnmnDt3zujRo4chyViyZMlF3+P3/vnPfzqd+4XnNHnyZKe5//nPfwxJxr///W+n8YyMDKfxinx+ZTl06JAhyfjnP//pNJ6QkGAEBAQYBw8edIwdO3bMCAkJMW655RbH2JIlSwxJRvfu3S/5eZdYv369Icno1KmTUVxc7BgfMmSIYbFYjH79+jnNj42NNVq0aHHZuFOnTjUkXfYoT6zQ0FCjXr16RmBgoDFlyhTjrbfeMv70pz+V+ecEANUNv6YB4LL8/HxJUkhISLnmf/DBB5KkpKQkp/HHHntMkkqtXenQoYN69OjheNyoUSO1a9dO3377rVPMm266STfeeKPTvJJLmUqsW7dOubm5GjJkiH788UfH4e/vr5iYGK1fv75Uvn/961+dHvfo0cPpvevWravCwkKtW7fuoue8cuVK9ejRQ/Xq1XN637i4ONlsNn366aeO86hRo4ajSyOd/2382LFjLxrbFRfGL8nParXq9ttvd8ovOjpaderUcXwurnx+l2Oz2fTRRx8pISFBrVq1cow3adJEf/rTn7Rp0ybHv2MlRo0aJX9//3K/x9ChQx2dIEmKiYmRYRj6y1/+4jQvJiZGR48e1blz5y4bb926dZc9/v3vf182t4KCAv3888+aPn26ZsyYoYEDB+rf//63+vbtq7lz5+qXX34p93kCgK/hci8ALgsNDZWkcn+Z+u677+Tn56c2bdo4jYeHh6tu3br67rvvnMabN29eKka9evWc1kp89913pS4JkqR27do5Pd6/f78k6dZbby0zt5JzKREUFKRGjRpd8r0feeQRvfnmm+rXr5+aNWumPn366L777lPfvn2d3vfLL78sFavEiRMnHOfRpEkTx2VQFzuPyqhRo0apdRz79+9XXl6eGjdufMn8Kvr5lcfJkyd1+vTpMs/xmmuukd1u19GjRx2X9klSZGRkhd7j9/8OWa1WSVJERESpcbvdrry8PDVo0OCi8Vq1auVUUFVGcHCwCgsLNWTIEKfxIUOGKCMjQzt37tQtt9zilvcCgKqGIgWAy0JDQ9W0aVPt3r27Qq+zWCzlmnex35gbLiwuLlmk/vrrrys8PLzU8zVqOP91WJ7f1jdu3Fi7du3S2rVr9eGHH+rDDz/UkiVLNHToUC1dutTxvrfffrsmTZpUZoyrr766oqfissDAwFLrHOx2uxo3bnzR3/yXFFcV/fzMUtZao0u52J+jq/9uFRQUOG33fKn3vVhhWqJp06bav3+/wsLCnMZLCsayNi4AgOqCIgVApdx5551auHChsrKyFBsbe8m5LVq0kN1u1/79+3XNNdc4xnNycpSbm+vYAaoiWrRo4fgt/4X27dvn9Lh169aSzn8BjIuLq/D7XExAQIAGDBigAQMGyG6365FHHtErr7yiKVOmqE2bNmrdurUKCgou+54tWrRQZmamCgoKnLopvz8Pd2vdurU+/vhjdevW7ZIFgBmfX6NGjVSrVq0yz3Hv3r3y8/Mr1fHwtOeee07Tp0+/7LwWLVro8OHDl5wTHR2t/fv364cffnDqzhw7dkySLlvkAIAvY00KgEqZNGmSateurZEjRyonJ6fU8wcPHnRsyXvHHXdIkmNHqxKzZ8+WJPXv37/C73/HHXdo8+bN2rp1q2Ps5MmTpToD8fHxCg0N1dNPP62zZ8+WilNyH4+KOHXqlNNjPz8/denSRZIc29ned999ysrK0tq1a0u9Pjc317EG4o477tC5c+c0f/58x/M2m00vvvhihfOqiPvuu082m00zZ84s9dy5c+ccWyCb8fn5+/urT58+eu+995y+0Ofk5GjZsmXq3r27S5eRmcmda1IGDRokSVq0aJFjzG63a8mSJapfv76io6NNOw8A8HZ0UgBUSuvWrbVs2TINGjRI11xzjdMd5z///HOtXLlSw4YNkyR17dpViYmJWrhwoXJzc9WzZ09t3bpVS5cuVUJCgnr37l3h9580aZJef/119e3bV+PGjXNsQdyiRQt9+eWXjnmhoaGaP3++HnjgAV133XUaPHiwGjVqpCNHjmjNmjXq1q2bXnrppQq998iRI/XTTz/p1ltv1VVXXaXvvvtOL774oqKiohydoscff1z/7//9P915552O7ZMLCwv11Vdf6a233tLhw4fVsGFDDRgwQN26ddPkyZN1+PBhdejQQe+8847y8vIq/JlURM+ePfXQQw8pNTVVu3btUp8+fVSzZk3t379fK1eu1Ny5c3Xvvfea8vlJ0lNPPaV169ape/fueuSRR1SjRg298sorKioq0qxZs0w448px55qUu+++W7fddptSU1P1448/qmvXrlq1apU2bdqkV155RYGBgW55HwCo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00/r8OHDbk4RAAAAgLf685//rEWLFrk1pktrUiSpXr16evDBB/Xggw/q+++/1xtvvKHFixcrJSVF586dc2eOAAAAQNVUDXb3OnfunBYvXqyPP/5Y0dHRql27ttPzs2fPrnBMl4uUEmfPntW2bdu0ZcsWHT58WGFhYZUNCQAAAPiE6rBwfvfu3bruuuskSd98843Tc66uWXe5SFm/fr2WLVumt99+W3a7Xffcc4/ef/993Xrrra6GBAAAAFDFrF+/3u0xXSpSmjVrpp9++kl9+/bVwoULNWDAAAUGBro7NwAAAKBqMyznD3fH9EIHDhzQwYMHdcsttyg4OFiGYVzZTsq0adP0xz/+UXXr1nXpTQEAAAD4hlOnTum+++7T+vXrZbFYtH//frVq1UojRoxQvXr19Pzzz1c4pku7e40aNYoCBQAAALgcH9+CWJImTJigmjVr6siRI6pVq5ZjfNCgQcrIyHApZqUXzgMAAACovj766COtXbtWV111ldN427Zt9d1337kUkyLFS5w+fVp79+71dBper+jQD55OwavZi8/q3Mlc1WhUT34B/Oddlh07dng6BfxO+/btnX7zBgC+pDrs7lVYWFjm3+M//fSTy+vW+RbjJfbu3avo6GhPpwH4vOi/v+zpFPA727dvd2xdCQCoenr06KHXXntNM2fOlHR+22G73a5Zs2apd+/eLsWkSPES7du31w3XPeLpNCpswasjPJ0CLvDrr7/q8OHDatmypYKDgz2djlcamPZvT6eAC7w9+n61b9/e02kAgHmqwc0cZ82apdtuu03btm1TcXGxJk2apK+//lo//fSTPvvsM5diUqR4iVq1aikkpJmn06gwfvvpfbp16+bpFLxacPhGT6eAC/B3CACfZ8LlXt5WpHTq1EnffPONXnrpJYWEhKigoED33HOPRo8erSZNmrgUs9JFis1m0969e7V7927H8e6771Y2LAAAAIAqwmq16u9//7vb4lWoSPn222/11VdfORUk+/fv19mzZxUQEKBrrrlGnTt3dltyAAAAQJVWDS73kqSff/5ZixYt0p49eyRJHTp00PDhw1W/fn2X4pW7SPnzn/+sN954QxaLRbVq1VJhYaH69++vlJQUde7cWW3btpW/v79LSQAAAAComj799FMNGDBAVqtV119/vSRp3rx5mjFjhlavXq1bbrmlwjHLfTPH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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "g.plot_condensed_tree(6)" ] }, { "cell_type": "markdown", "metadata": { "id": "I14Q_RyVBpH1" }, "source": [ "**Evaluation**" ] }, { "cell_type": "markdown", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "K86sVkQloTXL", "outputId": "d379c025-d9bf-420e-c1c0-eef7f57bd922" }, "outputs": [], "source": [ "Install dependency:\n", "\n", "```bash\n", "!pip install genieclust\n", "```" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "2FTrhJevcZYa", "outputId": "e2ce3984-7cf3-414f-c414-3ea82a5e5019" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Precomputed matrix mode:\n", "AMI: 1.0\n", "ARI: 1.0\n", "PSI: 1.0\n" ] } ], "source": [ "import numpy as np\n", "import pandas as pd\n", "import scanpy as sc\n", "from sklearn.metrics import adjusted_mutual_info_score, adjusted_rand_score\n", "from sklearn.preprocessing import LabelEncoder\n", "# Import the pair_sets_index function as PSI from genieclust.compare_partitions\n", "from genieclust.compare_partitions import pair_sets_index as PSI\n", "\n", "def evaluate_clustering(true_labels, predicted_labels):\n", " \"\"\"\n", " Compute Adjusted Mutual Information (NMI), Adjusted Rand Index (ARI),\n", " and Pair Set Index (PSI) between true and predicted cluster labels.\n", "\n", " Since PSI (pair set index) expects numeric labels, we convert the input\n", " labels from strings (if necessary) to integers using LabelEncoder.\n", " \"\"\"\n", " # Compute AMI and ARI directly; these metrics accept string labels.\n", " ami = adjusted_mutual_info_score(true_labels, predicted_labels)\n", " ari = adjusted_rand_score(true_labels, predicted_labels)\n", "\n", " # Use a single LabelEncoder fitted on the union of all labels to ensure consistent encoding.\n", " all_labels = list(set(true_labels) | set(predicted_labels))\n", " encoder = LabelEncoder()\n", " encoder.fit(all_labels)\n", "\n", " # Transform true and predicted labels into numeric values.\n", " true_labels_numeric = encoder.transform(true_labels)\n", " predicted_labels_numeric = encoder.transform(predicted_labels)\n", "\n", " # Calculate the Pair Set Index (PSI) using the numeric labels.\n", " psi = PSI(true_labels_numeric, predicted_labels_numeric)\n", "\n", " return ami, ari, psi\n", "\n", "\n", "ami, ari, psi = evaluate_clustering(true_labels, labels_)\n", "print(\"Precomputed matrix mode:\")\n", "print(\"AMI:\", ami)\n", "print(\"ARI:\", ari)\n", "print(\"PSI:\", psi)\n" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "23c52379e8f54be290ebf57006c8c1fb": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "initial" } }, "3cf700ea69b94f4aaac7daf4819d5bea": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": "500px" } }, "514a8ec6ad44410291b40898a8c3a1a2": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "VBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "VBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "VBoxView", "box_style": "", "children": [ "IPY_MODEL_9c0fdc86b5d74d1c9fdf96a8b0f7df25", "IPY_MODEL_744b72e160ba4268b5b799120394f34c" ], "layout": "IPY_MODEL_e3b6290b94c843d9b55497971d11fb9d" } }, "744b72e160ba4268b5b799120394f34c": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_ba0f07c00bb04067b56f30a34f6fb6fb", "msg_id": "", "outputs": [ { "data": { "image/png": "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3apZs2aRv5G/WCgV9+fnlEutzbmcov4crf7durjGwsznFlVk/lZ6errnQMRPP/3UdMcQAAIZBQcAj549e2revHnauHGjEhISLvts/fr15Xa7tX//fjVr1swznpGRoTNnznh2MiqO+vXre377/mt79+71et2oUSNJF4qELl26FPtzihIcHKxevXqpV69ecrvdevzxx/XGG29o/Pjxaty4sRo1aqTs7Owrfmb9+vWVlpam7Oxsry7Hb7+H3Ro1aqR//vOfSkxMvOz/zDvx86tRo4bCwsIu+R337NmjoKCgQp0IX3vxxRc1efLkKz5Xv359U6fc//DDD7rzzjuVm5urtLS0S+70BgBlEWs4AHiMHTtWlSpV0qOPPqqMjIxC9w8ePOjZJrZ79+6S5NmZ6aIZM2ZIknr06FHsz+/evbs2bdqkr776yjN26tSpQr+x79q1qyIiIvT8888rPz+/UJyL50QUxw8//OD1OigoSNddd50kebZYve+++7Rx40atWrWq0PvPnDnjWTPQvXt3nT9/XnPnzvXcLygo0CuvvFLsvIrjvvvuU0FBgaZOnVro3vnz5z3b8jrx8ytXrpzuvPNOffTRR17/c56RkaHFixerffv2lqZqOcnONRw5OTnq3r27vvvuO3366adq0qRJCXwDACgd6HAA8GjUqJEWL16s/v37q1mzZl4njX/55ZdasmSJBg4cKElq3bq1kpKSNG/ePJ05c0YdO3bUV199pUWLFqlPnz7q3LlzsT9/7Nixeuedd3TXXXdp5MiRnm1x69evr6+//trzXEREhObOnauHH35Ybdu21f33368aNWro2LFj+uSTT5SYmKhXX321WJ/96KOP6vTp07rttttUt25dHT16VK+88oratGnj6eCMGTNG//jHP9SzZ0/Plr45OTnatWuX3n//fR05ckTVq1dXr169lJiYqHHjxunIkSNq3ry5PvzwQ2VmZhb7Z1IcHTt21NChQ5WamqqdO3fqzjvvVIUKFbR//34tWbJEs2bN0r333uvIz0+Snn32Wa1evVrt27fX448/rvLly+uNN95Qbm6upk+f7sA3vjp2ruF48MEH9dVXX2nw4MHavXu319kblStXLnSgIwCUKT7eJQuAH9q3b58xZMgQo0GDBkZwcLARHh5uJCYmGq+88opx7tw5z3P5+fnG5MmTjdjYWKNChQpGTEyM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FBsAAAAoWwJ8W1xJGj16tCpUqKBjx44pLCzMM96/f3+tXLnSUsyrXjQOAAAAIDB89tlnWrVqlerWres13qRJEx09etRSTAoOAAAAwISysEtVTk6OV2fjotOnT1tes21pShUAAACAwHPrrbfq7bff9rx2uVxyu92aPn26OnfubCkmHQ4AAADAjDJw8N/06dN1++23a+vWrcrLy9PYsWP17bff6vTp0/riiy8sxaTDAQAAAJhh/HdalV2XvxUcLVu21L59+9S+fXv17t1bOTk56tu3r3bs2KFGjRpZinnVHY6CggLt2bNH33zzjedaunTp1YYFAAAA4AORkZF65plnbItXrILj0KFD2rVrl1dxsX//fuXn5ys4OFjNmjVTq1atbEsOAAAA8BtlYEqVJP3444+aP3++du/eLUlq3ry5Bg0apKioKEvxTBccDz30kN599125XC6FhYUpJydHPXr00IQJE9SqVSs1adJE5cqVs5QEAAAAAN9bv369evXqpcjISN1www2SpNmzZ2vKlClavny5OnToUOyYptdwvP/++5o9e7ays7N1/PhxPfHEE/rss8+0ZcsW1a9fn2IDAAAAga0MHPw3bNgw9e/fX4cPH9aHH36oDz/8UIcOHdL999+vYcOGWYppuuAYPXq0BgwYoNDQUFWuXFmzZs3SF198oTVr1qhFixaWTx4EAAAA4B8OHDigJ5980quZUK5cOSUnJ+vAgQOWYpouOFJTUxUeHu41Fh8fr6+++kojR45U//799fvf/16nTp2ylAgAAADgz+zeocqJgwSvVtu2bT1rN35t9+7dat26taWYV71Llcvl0siRI3XvvfdqxIgRiouL0w8//HC1YQEAAACUgK+//trzzyNGjNDIkSN14MAB3XzzzZKkTZs2ac6cOXrhhRcsxbft4L9rrrlGH3zwgT755BO7QgIAAABwWJs2beRyuWQY/223jB07ttBzv//979W/f/9ix7f9pPEePXrYHRIAAADwvQDdFvfw4cOOxre94AAAAABQetSvX9/R+BQcAAAAgAlOLPL2t0XjknT8+HFt2LBBJ0+elNvt9ro3YsSIYsej4AAAAAAgSVq4cKGGDh2q4OBgVatWTS6Xy3PP5XJRcAAAAACO8sOOhJ3Gjx+vCRMmKCUlRUFBpk/QuCx7ogAAAAAo9c6ePav777/ftmJD8oOCY/36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\n", "text/plain": "
" }, "metadata": {}, "output_type": "display_data" } ] } }, "9c0fdc86b5d74d1c9fdf96a8b0f7df25": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "SelectionSliderModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "SelectionSliderModel", "_options_labels": [ "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29" ], "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "SelectionSliderView", "continuous_update": false, "description": "m", "description_tooltip": null, "disabled": false, "index": 0, "layout": "IPY_MODEL_3cf700ea69b94f4aaac7daf4819d5bea", "orientation": "horizontal", "readout": true, "style": "IPY_MODEL_23c52379e8f54be290ebf57006c8c1fb" } }, "ba0f07c00bb04067b56f30a34f6fb6fb": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "e3b6290b94c843d9b55497971d11fb9d": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } } } } }, "nbformat": 4, "nbformat_minor": 0 }