From ef6d98d44ab30c48d3e74ae744aa23f157f2d089 Mon Sep 17 00:00:00 2001 From: Aswin P Kumar <130536278+The-APK@users.noreply.github.com> Date: Mon, 16 Oct 2023 21:03:30 +0530 Subject: [PATCH] Added code for Principal Component Analysis --- PCA_Code.ipynb | 198 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 PCA_Code.ipynb diff --git a/PCA_Code.ipynb b/PCA_Code.ipynb new file mode 100644 index 0000000..8300f00 --- /dev/null +++ b/PCA_Code.ipynb @@ -0,0 +1,198 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "### **1. Installing Packages**" + ], + "metadata": { + "id": "pSXJVwyF2Ed8" + } + }, + { + "cell_type": "code", + "source": [ + "!pip install -U scikit-learn" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "WMc2NjhLzTk_", + "outputId": "baf5c845-5778-4adf-cecd-340b49845107" + }, + "execution_count": 29, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.10/dist-packages (1.3.1)\n", + "Requirement already satisfied: numpy<2.0,>=1.17.3 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (1.23.5)\n", + "Requirement already satisfied: scipy>=1.5.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (1.11.3)\n", + "Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (1.3.2)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (3.2.0)\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### **2. Importing Necessary Modules**" + ], + "metadata": { + "id": "VqbC4ieK13sm" + } + }, + { + "cell_type": "code", + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.decomposition import PCA\n", + "from sklearn.datasets import load_digits" + ], + "metadata": { + "id": "emxbvfX5yRU1" + }, + "execution_count": 30, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "### **3. Loading the datatset**" + ], + "metadata": { + "id": "bT4CTPVm19aZ" + } + }, + { + "cell_type": "code", + "source": [ + "# Load the Digits dataset\n", + "digits = load_digits()\n", + "X = digits.data\n", + "y = digits.target" + ], + "metadata": { + "id": "j4-ZKuDcyZEU" + }, + "execution_count": 31, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "### **4. Applying PCA and reducing the image**" + ], + "metadata": { + "id": "-n5etZJf2FJ1" + } + }, + { + "cell_type": "code", + "source": [ + "# Randomly select an image for demonstration\n", + "random_image_index = np.random.randint(0, X.shape[0])\n", + "\n", + "# Define the number of principal components you want to keep\n", + "n_components = int(input(\"Enter the number of components you want to keep (in the range of 0 to 64): \"))\n", + "\n", + "# Apply PCA to the image data\n", + "pca = PCA(n_components=n_components)\n", + "X_pca = pca.fit_transform(X)\n", + "\n", + "# Inverse transform to get the reduced-dimension image\n", + "X_inverse = pca.inverse_transform(X_pca)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "1TsSSFR3yi7x", + "outputId": "ea8a130e-06e6-4998-daaf-bb430a7d1e2e" + }, + "execution_count": 52, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Enter the number of components you want to keep (in the range of 0 to 64): 0\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### **5. Displaying the reduced image**" + ], + "metadata": { + "id": "MhJN70II2Tyb" + } + }, + { + "cell_type": "code", + "source": [ + "# Original image\n", + "original_image = X[random_image_index].reshape(8, 8)\n", + "\n", + "# Reduced-dimension image\n", + "reduced_image = X_inverse[random_image_index].reshape(8, 8)\n", + "\n", + "# Plot the original and reduced images\n", + "plt.figure(figsize=(8, 4))\n", + "plt.subplot(1, 2, 1)\n", + "plt.imshow(original_image, cmap='gray')\n", + "plt.title('Original Image')\n", + "plt.axis('off')\n", + "\n", + "plt.subplot(1, 2, 2)\n", + "plt.imshow(reduced_image, cmap='gray')\n", + "plt.title(f'Reduced to {n_components} Components')\n", + "plt.axis('off')\n", + "\n", + "plt.show()\n", + "\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 341 + }, + "id": "UlbzCCVFynKk", + "outputId": "512b3526-2745-45f1-e67c-53c05aacec5c" + }, + "execution_count": 53, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAn8AAAFECAYAAABWG1gIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAh30lEQVR4nO3deXxNd/7H8XckkURiD0VoYt9LJbTWxNKHttQylj4sqQRF7Ua1nUfHWkNRIx1lEqWtwbQlNWhLV7FON1rLKFoqapna1RZb8v394XHPz3WDMOpEv6/n49HHo07Ovfdzb27OfeXcc0/8jDFGAAAAsEIetwcAAADA3UP8AQAAWIT4AwAAsAjxBwAAYBHiDwAAwCLEHwAAgEWIPwAAAIsQfwAAABYh/gAAACxC/N3DxowZIz8/v9u67FtvvSU/Pz+lp6ff2aGukp6eLj8/P7311lu/2W0AyJ3uxjbmf+Xn56cxY8a4PQZw1xF/Lti2bZu6d++uiIgIBQUFqVSpUurWrZu2bdvm9miuWLVqlfz8/JSamur2KMDvmifIPP8FBAQoIiJCCQkJOnDggNvj5UoHDx7UmDFjtGnTpjt+3VlZWZo8ebLKli2r4OBgPfDAA3r77bdv6To2bdqk7t27q0yZMgoKClKRIkXUokULvfnmm8rMzLzjM9tm5syZv8sdGMTfXbZ48WLVqVNHn3/+uRITEzVz5kz16tVLaWlpqlOnjv71r3/l+Lr+/Oc/KyMj47bmiI+PV0ZGhiIjI2/r8gDuXePGjdO8efOUnJysxx57TPPnz1dsbKzOnz/v9mi5zsGDBzV27NjfJP5efPFFPf/883rkkUc0ffp03X///erataveeeedHF1+9uzZiomJUVpamrp166aZM2dq1KhRCgkJUa9evTRp0qQ7PrNtfq/xF+D2ADbZvXu34uPjVa5cOa1Zs0bFihVzvjZkyBA1btxY8fHx2rJli8qVK3fd6zl79qxCQ0MVEBCggIDb+xb6+/vL39//ti4L4N722GOPKSYmRpLUu3dvhYeHa9KkSVq2bJk6d+7s8nR2OHDggKZOnaoBAwbotddek3TlexEbG6sRI0aoU6dON9xGf/nll+rXr5/q16+v5cuXK3/+/M7Xhg4dqg0bNug///nPb34/cG9iz99dNGXKFJ07d06zZs3yCj9JCg8PV0pKis6ePavJkyc7yz3H9X3//ffq2rWrChcurEaNGnl97WoZGRkaPHiwwsPDlT9/frVp00YHDhzwObYlu+NxoqKi1Lp1a61bt0716tVTcHCwypUrp3/84x9et3H8+HE9++yzqlmzpsLCwlSgQAE99thj2rx58x16pP7/vv3www/q3r27ChYsqGLFimnkyJEyxmjfvn1q27atChQooBIlSmjq1Klel7948aJGjRql6OhoFSxYUKGhoWrcuLHS0tJ8buvYsWOKj49XgQIFVKhQIfXo0UObN2/O9njFHTt2qGPHjipSpIiCg4MVExOjZcuW3bH7DbihcePGkq78gnq1nD7ft23bpmbNmikkJESlS5fW+PHjlZWV5bPe9Y6xi4qKUkJCgteykydPatiwYYqKilJQUJBKly6tp556SkePHnXWuXDhgkaPHq0KFSooKChIZcqU0XPPPacLFy54XdeFCxc0bNgwFStWzNku7t+//6aPy6pVq1S3bl1JUmJiovN2+dXbhUWLFik6OlohISEKDw9X9+7dc/QW+tKlS3Xp0iX179/f6/F55plntH//fn3xxRc3vPzYsWPl5+enBQsWeIWfR0xMjNdjevbsWQ0fPtx5e7hy5cp65ZVXZIzxupyfn58GDhyoRYsWqVq1agoJCVH9+vW1detWSVJKSooqVKig4OBgxcXF+RzTGRcXpxo1amjjxo1q0KCBQkJCVLZsWSUnJ/vMePjwYfXq1Uv33XefgoODVatWLc2dO9drHc+x46+88opmzZql8uXLKygoSHXr1tU333zjc505ec56Xv/Wr1+vP/7xjypWrJhCQ0PVvn17HTlyxFkvKipK27Zt0+rVq53vfVxcnCTp0qVLGjt2rCpWrKjg4GAVLVpUjRo10qeffur7zcqF2PN3F73//vuKiopyNrTXatKkiaKiovThhx/6fK1Tp06qWLGiJkyY4PPDerWEhAQtXLhQ8fHxevjhh7V69Wq1atUqxzPu2rVLHTt2VK9evdSjRw+98cYbSkhIUHR0tKpXry5J+umnn7RkyRJ16tRJZcuW1aFDh5SSkqLY2Fh9//33KlWqVI5v72aefPJJVa1aVS+//LI+/PBDjR8/XkWKFFFKSoqaNWumSZMmacGCBXr22WdVt25dNWnSRJJ06tQpzZ49W126dNHTTz+t06dPa86cOWrZsqW+/vpr1a5dW9KVY26eeOIJff3113rmmWdUpUoVLV26VD169PCZZdu2bWrYsKEiIiL0wgsvKDQ0VAsXLlS7du303nvvqX379nfsfgN3k+cFvHDhws6ynD7ff/nlFzVt2lSXL1921ps1a5ZCQkJue54zZ86ocePG2r59u3r27Kk6dero6NGjWrZsmfbv36/w8HBlZWWpTZs2Wrdunfr06aOqVatq69atmjZtmn744QctWbLEub7evXtr/vz56tq1qxo0aKCVK1fmaLtYtWpVjRs3TqNGjVKfPn2cbXeDBg0kXYmIxMRE1a1bVxMnTtShQ4f06quvav369fruu+9UqFCh6173d999p9DQUFWtWtVreb169Zyve37Rv9a5c+f0+eefq0mTJrr//vtvej+MMWrTpo3S0tLUq1cv1a5dWx9//LFGjBihAwcOaNq0aV7rr127VsuWLdOAAQMkSRMnTlTr1q313HPPaebMmerfv79OnDihyZMnq2fPnlq5cqXX5U+cOKHHH39cnTt3VpcuXbRw4UI988wzyps3r3r27Cnpyo6KuLg47dq1SwMHDlTZsmW1aNEiJSQk6OTJkxoyZIjXdf7zn//U6dOn1bdvX/n5+Wny5Mn6wx/+oJ9++kmBgYGSbn0bPWjQIBUuXFijR49Wenq6kpKSNHDgQL377ruSpKSkJA0aNEhhYWF68cUXJUn33XefpCs7KCZOnKjevXurXr16OnXqlDZs2KBvv/1WjzzyyE2/J64zuCtOnjxpJJm2bdvecL02bdoYSebUqVPGGGNGjx5tJJkuXbr4rOv5msfGjRuNJDN06FCv9RISEowkM3r0aGfZm2++aSSZPXv2OMsiIyONJLNmzRpn2eHDh01QUJAZPny4s+z8+fMmMzPT6zb27NljgoKCzLhx47yWSTJvvvnmDe9zWlqakWQWLVrkc9/69OnjLLt8+bIpXbq08fPzMy+//LKz/MSJEyYkJMT06NHDa90LFy543c6JEyfMfffdZ3r27Okse++994wkk5SU5CzLzMw0zZo185m9efPmpmbNmub8+fPOsqysLNOgQQNTsWLFG95HIDfw/Nx/9tln5siRI2bfvn0mNTXVFCtWzAQFBZl9+/Y56+b0+T506FAjyXz11VfOssOHD5uCBQv6bGOu3Q55REZGev38jho1ykgyixcv9lk3KyvLGGPMvHnzTJ48eczatWu9vp6cnGwkmfXr1xtjjNm0aZORZPr37++1XteuXa87z9W++eabbLdjFy9eNMWLFzc1atQwGRkZzvIPPvjASDKjRo264fW2atXKlCtXzmf52bNnjSTzwgsvXPeymzdvNpLMkCFDbngbHkuWLDGSzPjx472Wd+zY0fj5+Zldu3Y5yySZoKAgr+9bSkqKkWRKlCjhvDYZY8yf/vQnn+9xbGyskWSmTp3qLLtw4YKpXbu2KV68uLl48aIxxpikpCQjycyfP99Z7+LFi6Z+/fomLCzMuR3P60jRokXN8ePHnXWXLl1qJJn333/fWZbT56zn56BFixbO88kYY4YNG2b8/f3NyZMnnWXVq1c3sbGxPo9prVq1TKtWrXyW3yt42/cuOX36tCRlu3v+ap6vnzp1ymt5v379bnobH330kSR5vY0gXfntJqeqVavmtWeyWLFiqly5sn766SdnWVBQkPLkufLUyczM1LFjxxQWFqbKlSvr22+/zfFt5UTv3r2d//f391dMTIyMMerVq5ezvFChQj4z+vv7K2/evJKu7N07fvy4Ll++rJiYGK8ZP/roIwUGBurpp592luXJk8f5jdfj+PHjWrlypTp37qzTp0/r6NGjOnr0qI4dO6aWLVvqxx9/5NOSuGe0aNFCxYoVU5kyZdSxY0eFhoZq2bJlKl26tKRbe74vX75cDz/8sLPHSrqy3ejWrdttz/fee++pVq1a2e5N9xzqsmjRIlWtWlVVqlRx5jt69KiaNWsmSc4hHsuXL5ckDR482Ot6hg4detvzSdKGDRt0+PBh9e/fX8HBwc7yVq1aqUqVKtm+g3O1jIwMBQUF+Sz3XNeNPszneX242euJx/Lly+Xv7+/zGAwfPlzGGK1YscJrefPmzRUVFeX8+6GHHpIkdejQwes2Pcuv3vZKUkBAgPr27ev8O2/evOrbt68OHz6sjRs3OjOVKFFCXbp0cdYLDAzU4MGDdebMGa1evdrrOp988kmvPdOe1ynPbd/ONrpPnz5eh041btxYmZmZ2rt3r89jeK1ChQpp27Zt+vHHH2+6bm7E2753iecHxhOB13O9SCxbtuxNb2Pv3r3KkyePz7oVKlTI8ZzZvYVQuHBhnThxwvl3VlaWXn31Vc2cOVN79uzxOp1A0aJFc3xbtzNPwYIFFRwcrPDwcJ/lx44d81o2d+5cTZ06VTt27NClS5ec5Vc/Pnv37lXJkiWVL18+r8te+5jt2rVLxhiNHDlSI0eOzHbWw4cPKyIiIud3DnDJjBkzVKlSJf3666964403tGbNGq8QuZXn+969e50IuFrlypVve77du3erQ4cON1znxx9/1Pbt232On756Pun/t4vly5e/Y/N5rvd611OlShWtW7fuhpcPCQnxOTZRkvOJ6xu9bV6gQAFJN389uXrWUqVK+byueN5yvjZ2stvuSlKZMmWyXX7164MklSpVSqGhoV7LKlWqJOnKIQYPP/yw9u7dq4oVKzo7Em51Jk8Iem77drbRN7vOGxk3bpzatm2rSpUqqUaNGnr00UcVHx+vBx544KaXzQ2Iv7ukYMGCKlmypLZs2XLD9bZs2aKIiAjnh9vjfzl+5lZc79Nl5qrjDCdMmKCRI0eqZ8+eeumll1SkSBHlyZNHQ4cOzfYg7zs9T05mnD9/vhISEtSuXTuNGDFCxYsXl7+/vyZOnOhzUHtOeO7Xs88+q5YtW2a7zq1ENuCmevXqOZ/2bdeunRo1aqSuXbtq586dCgsLu+vP99s5H11WVpZq1qypv/71r9l+/dpQyW1KliyptLQ0GWO89j7997//laQbHjtdoUIFBQQEOB/CuNOut43Nybb3t3Kz276d5+z/cn+aNGmi3bt3a+nSpfrkk080e/ZsTZs2TcnJyV7vWOVWxN9d1Lp1a73++utat25dtgfyrl27Vunp6V67y29FZGSksrKytGfPHlWsWNFZvmvXrtueOTupqalq2rSp5syZ47X85MmTPnvk3JKamqpy5cpp8eLFXhvW0aNHe60XGRmptLQ0nTt3zmvv37WPmefUO4GBgWrRosVvODlwd3l+KWratKlee+01vfDCC7f0fI+MjMz2ra+dO3f6LCtcuLBOnjzptezixYtO8HiUL1/+pqcpKV++vDZv3qzmzZvf8C8debaLu3fv9tpLl9182bnedXvOkbpz507nrearr/tm51CtXbu2Zs+ere3bt6tatWrO8q+++sr5+vXky5dPzZo108qVK7Vv376bhm5kZKQ+++wznT592mvv344dO7zuy51y8OBB55RkHj/88IMkOW8nR0ZGasuWLcrKyvLa+3e7M/1W2+gbPbeKFCmixMREJSYm6syZM2rSpInGjBlzT8Qfx/zdRSNGjFBISIj69u3r8xbl8ePH1a9fP+XLl08jRoy4rev3/LYzc+ZMr+XTp0+/vYGvw9/f3+c3o0WLFuWqY948v9FdPedXX33lc/qEli1b6tKlS3r99dedZVlZWZoxY4bXesWLF1dcXJxSUlJ8XqgkeZ0eALjXxMXFqV69ekpKStL58+dv6fn++OOP68svv9TXX3/t9fUFCxb4XK58+fJas2aN17JZs2b57Pnr0KGDNm/enO1J7z0/0507d9aBAwe8fnY9MjIydPbsWUlXzmkoSX/729+81klKSvK5XHY8AXNttMbExKh48eJKTk72evt2xYoV2r59+00/Tdy2bVsFBgZ6ba+NMUpOTlZERITzieLrGT16tIwxio+P15kzZ3y+vnHjRue0KY8//rgyMzOd8wl6TJs2TX5+fs5jdKdcvnxZKSkpzr8vXryolJQUFStWTNHR0c5Mv/zyi/PJWs/lpk+frrCwMMXGxt7Sbf5W2+jQ0FCf770kn9fwsLAwVahQIdu38nMj9vzdRRUrVtTcuXPVrVs31axZU7169VLZsmWVnp6uOXPm6OjRo3r77bd9jk3JqejoaHXo0EFJSUk6duyYc6oXz29ct/t3gK/VunVrjRs3TomJiWrQoIG2bt2qBQsW3PDE1Hdb69attXjxYrVv316tWrXSnj17lJycrGrVqnltKNu1a6d69epp+PDh2rVrl6pUqaJly5bp+PHjkrwfsxkzZqhRo0aqWbOmnn76aZUrV06HDh3SF198of3799/R8xwCd5vnxMJvvfWW+vXrl+Pn+3PPPad58+bp0Ucf1ZAhQ5xTvXj27Fytd+/e6tevnzp06KBHHnlEmzdv1scff+zzjsGIESOUmpqqTp06qWfPnoqOjtbx48e1bNkyJScnq1atWoqPj9fChQvVr18/paWlqWHDhsrMzNSOHTu0cOFCffzxx4qJiVHt2rXVpUsXzZw5U7/++qsaNGigzz//PMfviJQvX16FChVScnKy8ufPr9DQUD300EMqW7asJk2apMTERMXGxqpLly7OqV6ioqI0bNiwG15v6dKlNXToUE2ZMkWXLl1S3bp1tWTJEq1du1YLFiy46Un4GzRooBkzZqh///6qUqWK4uPjVbFiRZ0+fVqrVq3SsmXLNH78eEnSE088oaZNm+rFF19Uenq6atWqpU8++URLly7V0KFDb/s153pKlSqlSZMmKT09XZUqVdK7776rTZs2adasWc5pWfr06aOUlBQlJCRo48aNioqKUmpqqtavX6+kpKQcf5jlar/FNjo6Olp///vfNX78eFWoUEHFixdXs2bNVK1aNcXFxSk6OlpFihTRhg0blJqaqoEDB97ybbji7n/AGFu2bDFdunQxJUuWNIGBgaZEiRKmS5cuZuvWrT7rek55cuTIket+7Wpnz541AwYMMEWKFDFhYWGmXbt2ZufOnUaS1+lRrneql+w+uh4bG+v1Uffz58+b4cOHm5IlS5qQkBDTsGFD88UXX/isdydO9XLt/e7Ro4cJDQ3Ndsbq1as7/87KyjITJkwwkZGRJigoyDz44IPmgw8+MD169DCRkZFelz1y5Ijp2rWryZ8/vylYsKBJSEgw69evN5LMO++847Xu7t27zVNPPWVKlChhAgMDTUREhGndurVJTU294X0EcgPPz/0333zj87XMzExTvnx5U758eXP58mVjTM6f71u2bDGxsbEmODjYREREmJdeesnMmTPHZxuTmZlpnn/+eRMeHm7y5ctnWrZsaXbt2uVzqhdjjDl27JgZOHCgiYiIMHnz5jWlS5c2PXr0MEePHnXWuXjxopk0aZKpXr26CQoKMoULFzbR0dFm7Nix5tdff3XWy8jIMIMHDzZFixY1oaGh5oknnjD79u3L0alejLlyWpFq1aqZgIAAn23au+++ax588EETFBRkihQpYrp162b2799/0+v0PB6e7VTevHlN9erVvU59khMbN240Xbt2NaVKlTKBgYGmcOHCpnnz5mbu3Llep+Q6ffq0GTZsmLNexYoVzZQpU7xOdWLMlVO9DBgwwGuZZ1s+ZcoUr+XZbbs92+INGzaY+vXrm+DgYBMZGWlee+01n9kPHTpkEhMTTXh4uMmbN6+pWbOmz+vF9W7bM+u137+cPGev93PguT9paWnOsl9++cW0atXK5M+f30hyXuPGjx9v6tWrZwoVKmRCQkJMlSpVzF/+8hfnVDa5nZ8xd+FITbhq06ZNevDBBzV//vz/6fQLNlmyZInat2+vdevWqWHDhm6PAwD3hLi4OB09epQ/LZfLcczf70x254ZKSkpSnjx5nL9+AW/XPmaZmZmaPn26ChQooDp16rg0FQAAvw2O+fudmTx5sjZu3KimTZsqICBAK1as0IoVK9SnT59cf+oDtwwaNEgZGRmqX7++Lly4oMWLF+vf//63JkyYcNdOsQMA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\n" + }, + "metadata": {} + } + ] + } + ] +} \ No newline at end of file