{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "T-YNhr8UYF-f", "outputId": "d8b51939-f3c5-407a-edd7-bce2bee0f16d", "tags": [ "hide-input" ] }, "outputs": [], "source": [ "# Install the necessary dependencies\n", "\n", "import os\n", "import sys\n", "!{sys.executable} -m pip install --quiet pandas scikit-learn numpy matplotlib jupyterlab_myst ipython" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "remove-cell" ] }, "source": [ "---\n", "license:\n", " code: MIT\n", " content: CC-BY-4.0\n", "github: https://github.com/ocademy-ai/machine-learning\n", "venue: By Ocademy\n", "open_access: true\n", "bibliography:\n", " - https://raw.githubusercontent.com/ocademy-ai/machine-learning/main/open-machine-learning-jupyter-book/references.bib\n", "---" ] }, { "cell_type": "markdown", "metadata": { "id": "H-oV1_NaYF-e" }, "source": [ "# Unsupervised learning" ] }, { "cell_type": "markdown", "metadata": { "id": "at_t_B8cYF-e" }, "source": [ "First, let's import a few common modules, ensure MatplotLib plots figures inline and prepare a function to save the figures. We also check that Python 3.5 or later is installed (although Python 2.x may work, it is deprecated so we strongly recommend you use Python 3 instead), as well as Scikit-Learn ≥0.20." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "PS2PzC9GYF-f" }, "outputs": [], "source": [ "# Python ≥3.5 is required\n", "import sys\n", "assert sys.version_info >= (3, 5)\n", "\n", "# Scikit-Learn ≥0.20 is required\n", "import sklearn\n", "assert sklearn.__version__ >= \"0.20\"\n", "\n", "# Common imports\n", "import numpy as np\n", "import os\n", "\n", "# to make this notebook's output stable across runs\n", "np.random.seed(42)\n", "\n", "# To plot pretty figures\n", "%matplotlib inline\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "\n", "import warnings\n", "warnings.filterwarnings(\"ignore\", category=FutureWarning, module=\"sklearn\")\n", "\n", "mpl.rc('axes', labelsize=14)\n", "mpl.rc('xtick', labelsize=12)\n", "mpl.rc('ytick', labelsize=12)\n", "\n", "# Where to save the figures\n", "PROJECT_ROOT_DIR = \".\"\n", "CHAPTER_ID = \"unsupervised_learning\"\n", "IMAGES_PATH = os.path.join(PROJECT_ROOT_DIR, \"images\", CHAPTER_ID)\n", "os.makedirs(IMAGES_PATH, exist_ok=True)\n", "\n", "def save_fig(fig_id, tight_layout=True, fig_extension=\"png\", resolution=300):\n", " path = os.path.join(IMAGES_PATH, fig_id + \".\" + fig_extension)\n", " print(\"Saving figure\", fig_id)\n", " if tight_layout:\n", " plt.tight_layout()\n", " plt.savefig(path, format=fig_extension, dpi=resolution)" ] }, { "cell_type": "markdown", "metadata": { "id": "_HfVME_gYF-g" }, "source": [ "## K-Means" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 870 }, "id": "H1ymUjS1YF-g", "outputId": "f30c912e-220d-4bbf-d515-00e25003998e", "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "\n", "A demo of linear-regression. [source]\n", "
\n" ], "text/plain": [ "\n", "\n", "A demo of linear-regression. [source]\n", "
\n", "\"\"\"))" ] }, { "cell_type": "markdown", "metadata": { "id": "PN0PeTU0YF-g" }, "source": [ "Let's start by generating some blobs:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "id": "ykpxEkAxYF-g" }, "outputs": [], "source": [ "from sklearn.datasets import make_blobs" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "id": "qRDSYgOeYF-g" }, "outputs": [], "source": [ "blob_centers = np.array(\n", " [[ 0.2, 2.3],\n", " [-1.5 , 2.3],\n", " [-2.8, 1.8],\n", " [-2.8, 2.8],\n", " [-2.8, 1.3]])\n", "blob_std = np.array([0.4, 0.3, 0.1, 0.1, 0.1])" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "id": "IzpORwbDYF-g" }, "outputs": [], "source": [ "X, y = make_blobs(n_samples=2000, centers=blob_centers,\n", " cluster_std=blob_std, random_state=7)" ] }, { "cell_type": "markdown", "metadata": { "id": "rPrUE2ffYF-h" }, "source": [ "Now let's plot them:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "id": "Afhy504HYF-h" }, "outputs": [], "source": [ "def plot_clusters(X, y=None):\n", " plt.scatter(X[:, 0], X[:, 1], c=y, s=1)\n", " plt.xlabel(\"$x_1$\", fontsize=14)\n", " plt.ylabel(\"$x_2$\", fontsize=14, rotation=0)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 425 }, "id": "oWp7-O_HYF-h", "outputId": "e8357b23-dc39-488b-c57e-01a10435ec46" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Saving figure blobs_plot\n" ] }, { "data": { "image/png": "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H//4x7jwwgvx4YcfYtu2bfje976X87pvfetbAID9+/fbXUQiIioCeyyIiMg2Tz/9NP7zf/7PuOGGG7Bnzx5UVVWhvb0dn332mdNFIyIigxhYEBGRLV599VV861vfwhVXXIHnn38eM2fOxF//9V/j2LFjePTRR50uHhERGcTkbSIistzu3bvR2NiI8847D2+++SZmzpwJIL0w3sUXX4xkMonf/e53qKmpyXnv/v37ccUVVzB5m4jI5dhjQURElurv78dNN92ESZMm4eWXX5aCCgCYOnUqfvjDH2JkZAQbN250sJRERGQUeyyIiMjV2GNBROQNnBWKiIhc6eTJk/jDH/6A/v5+AMD777+PaDSKiy66SHHIFBEROYs9FkRE5Epbt27FHXfckfP4k08+ibVr19pfICIiyouBBRERERERGcbkbSIiIiIiMoyBBRERERERGcbAgoiIiIiIDGNgQUREREREhjGwICIiIiIiwxhYEBERERGRYQwsiIiIiIjIMAYWRERERERkGAMLIiIiIiIyjIEFEREREREZxsCCiIiIiIgMY2BBRERERESG/X9BEeCr9EjvYAAAAABJRU5ErkJggg==", "text/plain": [ "KMeans(algorithm='full', init='random', max_iter=3, n_clusters=5, n_init=1,\n",
" random_state=0)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. KMeans(algorithm='full', init='random', max_iter=3, n_clusters=5, n_init=1,\n",
" random_state=0)KMeans(algorithm='full', init='random', n_clusters=5, n_init=10, random_state=2)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
KMeans(algorithm='full', init='random', n_clusters=5, n_init=10, random_state=2)
KMeans()In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
KMeans()
MiniBatchKMeans(n_clusters=5, random_state=42)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
MiniBatchKMeans(n_clusters=5, random_state=42)
MiniBatchKMeans(batch_size=10, n_clusters=10, random_state=42)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
MiniBatchKMeans(batch_size=10, n_clusters=10, random_state=42)
KMeans(n_clusters=3, random_state=42)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
KMeans(n_clusters=3, random_state=42)
\n", "\n", "A demo of linear-regression. [source]\n", "
\n" ], "text/plain": [ "\n", "\n", "A demo of linear-regression. [source]\n", "
\n", "\"\"\"))" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "id": "nQAMpOQcYF_A" }, "outputs": [], "source": [ "from sklearn.linear_model import LogisticRegression" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 75 }, "id": "VcFFJ9IqYF_A", "outputId": "edae10e6-b222-4e86-a490-b24db29c6e83" }, "outputs": [ { "data": { "text/html": [ "LogisticRegression(max_iter=5000, multi_class='ovr', random_state=42)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
LogisticRegression(max_iter=5000, multi_class='ovr', random_state=42)
Pipeline(steps=[('kmeans', KMeans(n_clusters=50, random_state=42)),\n",
" ('log_reg',\n",
" LogisticRegression(max_iter=5000, multi_class='ovr',\n",
" random_state=42))])In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. Pipeline(steps=[('kmeans', KMeans(n_clusters=50, random_state=42)),\n",
" ('log_reg',\n",
" LogisticRegression(max_iter=5000, multi_class='ovr',\n",
" random_state=42))])KMeans(n_clusters=50, random_state=42)
LogisticRegression(max_iter=5000, multi_class='ovr', random_state=42)
GridSearchCV(cv=3,\n",
" estimator=Pipeline(steps=[('kmeans',\n",
" KMeans(n_clusters=50, random_state=42)),\n",
" ('log_reg',\n",
" LogisticRegression(max_iter=5000,\n",
" multi_class='ovr',\n",
" random_state=42))]),\n",
" param_grid={'kmeans__n_clusters': range(2, 100)}, verbose=2)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. GridSearchCV(cv=3,\n",
" estimator=Pipeline(steps=[('kmeans',\n",
" KMeans(n_clusters=50, random_state=42)),\n",
" ('log_reg',\n",
" LogisticRegression(max_iter=5000,\n",
" multi_class='ovr',\n",
" random_state=42))]),\n",
" param_grid={'kmeans__n_clusters': range(2, 100)}, verbose=2)Pipeline(steps=[('kmeans', KMeans(n_clusters=50, random_state=42)),\n",
" ('log_reg',\n",
" LogisticRegression(max_iter=5000, multi_class='ovr',\n",
" random_state=42))])KMeans(n_clusters=50, random_state=42)
LogisticRegression(max_iter=5000, multi_class='ovr', random_state=42)
LogisticRegression(max_iter=5000, multi_class='ovr', random_state=42)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
LogisticRegression(max_iter=5000, multi_class='ovr', random_state=42)
LogisticRegression(max_iter=5000, multi_class='ovr', random_state=42)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
LogisticRegression(max_iter=5000, multi_class='ovr', random_state=42)
\n", "\n", "A demo of linear-regression. [source]\n", "
\n" ], "text/plain": [ "\n", "\n", "A demo of linear-regression. [source]\n", "
\n", "\"\"\"))" ] }, { "cell_type": "code", "execution_count": 104, "metadata": { "id": "mMOOvn5kYF_F" }, "outputs": [], "source": [ "from sklearn.datasets import make_moons" ] }, { "cell_type": "code", "execution_count": 105, "metadata": { "id": "ByYBuapUYF_F" }, "outputs": [], "source": [ "X, y = make_moons(n_samples=1000, noise=0.05, random_state=42)" ] }, { "cell_type": "code", "execution_count": 106, "metadata": { "id": "EOPlXybQYF_F" }, "outputs": [], "source": [ "from sklearn.cluster import DBSCAN" ] }, { "cell_type": "code", "execution_count": 107, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 75 }, "id": "lteMnGGoYF_G", "outputId": "60c59b07-ca36-4fa8-82b5-ab0a7049402f" }, "outputs": [ { "data": { "text/html": [ "DBSCAN(eps=0.05)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
DBSCAN(eps=0.05)
DBSCAN(eps=0.2)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
DBSCAN(eps=0.2)
KNeighborsClassifier(n_neighbors=50)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
KNeighborsClassifier(n_neighbors=50)
SpectralClustering(gamma=100, n_clusters=2, random_state=42)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
SpectralClustering(gamma=100, n_clusters=2, random_state=42)
SpectralClustering(gamma=1, n_clusters=2, random_state=42)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
SpectralClustering(gamma=1, n_clusters=2, random_state=42)