{ "cells": [ { "cell_type": "markdown", "id": "pleased-glory", "metadata": { "id": "d5ebaf03" }, "source": [ "# Lecture 8: Principal Component Analysis and Kernel Principal Component Analysis\n", "\n", "By courtesy of [askpython](https://www.askpython.com/python/examples/principal-component-analysis), [Sebastian Raschka](http://rasbt.github.io/mlxtend/user_guide/feature_extraction/RBFKernelPCA/), [Open Data Science](https://odsc.medium.com/implementing-a-kernel-principal-component-analysis-in-python-495f04a7f85f), and [Felix Muia](https://www.section.io/engineering-education/kernel-pca-in-python/)." ] }, { "cell_type": "markdown", "id": "laughing-shepherd", "metadata": { "id": "2f2bfe21" }, "source": [ "## 1. Implement PCA from Scratch" ] }, { "cell_type": "markdown", "id": "saving-washer", "metadata": { "id": "9efd84ed" }, "source": [ "Given a data matrix $\\mathbf{X} \\in \\mathbb{R}^{M \\times N}$, the goal of PCA is to identify the directions of maximum variance contained in the data. PCA is widely used in dimensionality reduction. In this section, we will implement PCA from scratch." ] }, { "cell_type": "markdown", "id": "pressing-plaza", "metadata": { "id": "lQbCdH6tTi-8" }, "source": [ "### 1.1 Subtract the Mean of Each Variable" ] }, { "cell_type": "markdown", "id": "trained-landing", "metadata": { "id": "8f682d13" }, "source": [ "First, we subtract the mean of each variable from the dataset so that the dataset is centered on the origin. This means we compute $\\boldsymbol{\\mu}=\\frac{1}{M} \\sum_i \\mathbf{x}^{(i)}$ and replace each $\\mathbf{x}^{(i)}$ with $\\mathbf{x}^{(i)}-\\boldsymbol{\\mu}$." ] }, { "cell_type": "code", "execution_count": 1, "id": "actual-empire", "metadata": { "id": "c1acc34c" }, "outputs": [], "source": [ "# Importing required libraries\n", "import numpy as np\n", "\n", "# Generate a dummy dataset.\n", "X = np.random.randint(10,50,100).reshape(20,5) \n", "\n", "# Mean-centering the data \n", "X_meaned = X - np.mean(X , axis = 0)" ] }, { "cell_type": "markdown", "id": "russian-paste", "metadata": { "id": "428f25d1" }, "source": [ "Data generated by the above code have dimensions $(20, 5)$, i.e., $20$ examples and $5$ features for each example. We calculated the mean of each variable and subtracted that from every row of the respective column." ] }, { "cell_type": "markdown", "id": "applicable-botswana", "metadata": { "id": "4aec2232" }, "source": [ "### 1.2 Calculate the Covariance Matrix" ] }, { "cell_type": "markdown", "id": "configured-berkeley", "metadata": { "id": "8694efda" }, "source": [ "Second, we calculate the covariance matrix of the mean-centered data. Given the mean-centered data matrix $\\mathbf{X} \\in \\mathbb{R}^{M \\times N}$, we can compute the covariance matrix $\\boldsymbol{\\Sigma}=\\frac{1}{M} \\mathbf{X}^T \\mathbf{X}$." ] }, { "cell_type": "code", "execution_count": 2, "id": "unusual-introduction", "metadata": { "id": "e056d4c1" }, "outputs": [], "source": [ "# Calculating the covariance matrix of the mean-centered data\n", "cov_mat = np.cov(X_meaned , rowvar = False)" ] }, { "cell_type": "markdown", "id": "silver-contrary", "metadata": { "id": "965d7c36" }, "source": [ "We can easily calculate the covariance matrix using `numpy.cov( )` method." ] }, { "cell_type": "markdown", "id": "higher-sheep", "metadata": { "id": "fc193b1c" }, "source": [ "### 1.3 Compute the Eigenvalues and Eigenvectors" ] }, { "cell_type": "markdown", "id": "appreciated-boulder", "metadata": { "id": "437cbdc8" }, "source": [ "Third, we compute the $M$ eigenvectors $\\mathbf{v}_1, \\ldots, \\mathbf{v}_M$ of $\\boldsymbol{\\Sigma}$ where $\\mathbf{v}_i \\in \\mathbb{R}^N$. The eigenvectors of the covariance matrix are orthogonal (mutually perpendicular) to each other and each vector represents a principal component. A larger eigenvalue corresponds to a higher variability. Hence the principal component with the higher eigenvalue will be a component capturing higher variability in the data." ] }, { "cell_type": "code", "execution_count": 3, "id": "potential-conservation", "metadata": { "id": "675202e4" }, "outputs": [], "source": [ "# Calculating eigenvalues and eigenvectors of the covariance matrix\n", "eigen_values , eigen_vectors = np.linalg.eigh(cov_mat)" ] }, { "cell_type": "markdown", "id": "following-offense", "metadata": { "id": "2a5eaae5" }, "source": [ "NumPy `linalg.eigh( )` method returns the eigenvalues and eigenvectors of a real symmetric matrix." ] }, { "cell_type": "markdown", "id": "boolean-warrant", "metadata": { "id": "806218c0" }, "source": [ "### 1.4 Sort Eigenvalues in Descending Order" ] }, { "cell_type": "markdown", "id": "roman-rental", "metadata": { "id": "2bc4944f" }, "source": [ "Now, we sort the eigenvalues in descending order along with the corresponding eigenvectors. Remember each column in the eigenvector matrix corresponds to a principal component, so arranging them in descending order of their eigenvalues will automatically arrange the principal components in descending order of their variability. Hence the first column in our rearranged eigenvector matrix will be a principal component that captures the highest variability." ] }, { "cell_type": "code", "execution_count": 4, "id": "opening-grace", "metadata": { "id": "d9d3a06e" }, "outputs": [], "source": [ "# Sort the eigenvalues in descending order\n", "sorted_index = np.argsort(eigen_values)[::-1]\n", "sorted_eigenvalue = eigen_values[sorted_index]\n", "\n", "# Similarly, sort the eigenvectors \n", "sorted_eigenvectors = eigen_vectors[:,sorted_index]\n" ] }, { "cell_type": "markdown", "id": "recreational-black", "metadata": { "id": "b67347ca" }, "source": [ "`np.argsort` returns an array of indices of the same shape." ] }, { "cell_type": "markdown", "id": "elementary-triangle", "metadata": { "id": "0febb561" }, "source": [ "### 1.5 Select a Subset from the Rearranged Eigenvalue Matrix" ] }, { "cell_type": "markdown", "id": "numeric-techno", "metadata": { "id": "d788d54a" }, "source": [ "Then, we select the top $K$ eigenvectors $\\mathbf{v}_1, \\ldots, \\mathbf{v}_K$ from the rearranged eigenvector matrix and stack them together into an $N \\times K$ matrix $\\mathbf{V}$. For example, when $K = 2$, we select the first two principal components $\\mathbf{v}_1$ and $\\mathbf{v}_2$." ] }, { "cell_type": "code", "execution_count": 5, "id": "significant-copper", "metadata": { "id": "73d75541" }, "outputs": [], "source": [ "# Select the first n eigenvectors, n is the desired dimension of our final reduced data\n", "n_components = 2 \n", "eigenvector_subset = sorted_eigenvectors[:,0:n_components]" ] }, { "cell_type": "markdown", "id": "recent-there", "metadata": { "id": "06da83be" }, "source": [ "`n_components = 2` means our final data should be reduced to just two features. If we change it to $3$, we get our data reduced to three features." ] }, { "cell_type": "markdown", "id": "abstract-intake", "metadata": { "id": "18f84692" }, "source": [ "### 1.6 Transform the Data" ] }, { "cell_type": "markdown", "id": "other-baseline", "metadata": { "id": "ff5763dc" }, "source": [ "Finally, we transform the data by having a dot product between the eigenvector subset and the mean-centered data, i.e., $\\mathbf{Z}=\\mathbf{X} \\mathbf{V}$. The outcome $\\mathbf{Z}$ is the data that is reduced to lower dimensions from higher dimensions." ] }, { "cell_type": "code", "execution_count": 6, "id": "moved-batch", "metadata": { "id": "9f6f458e" }, "outputs": [], "source": [ "#Transform the data \n", "X_reduced = np.dot(X_meaned, eigenvector_subset)" ] }, { "cell_type": "markdown", "id": "prescription-resort", "metadata": { "id": "87a6dae4" }, "source": [ "The final dimensions of ``X_reduced`` will be $(20, 2)$ and the data was of higher dimensions $(20, 5)$ originally." ] }, { "cell_type": "markdown", "id": "transparent-condition", "metadata": { "id": "642b155a" }, "source": [ "### 1.7 Complete Code" ] }, { "cell_type": "code", "execution_count": 7, "id": "exceptional-superintendent", "metadata": { "id": "5e95cb19" }, "outputs": [], "source": [ "import numpy as np\n", " \n", "def PCA(X, num_components):\n", " \n", " #Step-1\n", " X_meaned = X - np.mean(X , axis = 0)\n", "\n", " #Step-2\n", " cov_mat = np.cov(X_meaned , rowvar = False)\n", " \n", " #Step-3\n", " eigen_values , eigen_vectors = np.linalg.eigh(cov_mat)\n", " \n", " ## If you want the exactly same results as sklearn's PCA, replace np.linalg.eigh(cov_mat) with linalg.svd(cov_mat).\n", " #from scipy import linalg\n", " #eigen_vectors, eigen_values, _ = linalg.svd(cov_mat)\n", " \n", " #Step-4\n", " sorted_index = np.argsort(eigen_values)[::-1]\n", " sorted_eigenvalue = eigen_values[sorted_index]\n", " sorted_eigenvectors = eigen_vectors[:,sorted_index]\n", " \n", " #Step-5\n", " eigenvector_subset = sorted_eigenvectors[:,0:num_components]\n", " \n", " #Step-6\n", " X_reduced = np.dot(X_meaned, eigenvector_subset)\n", " \n", " return X_reduced" ] }, { "cell_type": "markdown", "id": "silent-finding", "metadata": { "id": "1d0d9f22" }, "source": [ "We defined a function named PCA accepting the data matrix and the number of components as input arguments. In the next subsection, we’ll use the IRIS dataset and apply our PCA function to it." ] }, { "cell_type": "markdown", "id": "extended-kingdom", "metadata": { "id": "91254c16" }, "source": [ "## 1.8 Apply PCA to IRIS Dataset" ] }, { "cell_type": "markdown", "id": "caroline-gateway", "metadata": { "id": "9aa88551" }, "source": [ "We should pre-center data wherever necessary before applying any ML algorithm to it. In the following code, we did so while defining our PCA function." ] }, { "cell_type": "code", "execution_count": 8, "id": "vanilla-recycling", "metadata": { "id": "2ed35148" }, "outputs": [], "source": [ "import pandas as pd\n", " \n", "# Get the IRIS dataset\n", "url = \"https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data\"\n", "data = pd.read_csv(url, names=['sepal length','sepal width','petal length','petal width','target'])\n", " \n", "# Prepare the data\n", "x = data.iloc[:,0:4]\n", " \n", "# Prepare the target\n", "target = data.iloc[:,4]\n", " \n", "# Applying it to PCA function\n", "mat_reduced = PCA(x , 2)\n", " \n", "# Creating a pandas dataframe of reduced dataset\n", "principal_df = pd.DataFrame(mat_reduced , columns = ['PC1','PC2'])\n", " \n", "#Concat it with target variable to create a complete dataset\n", "principal_df = pd.concat([principal_df , pd.DataFrame(target)] , axis = 1)" ] }, { "cell_type": "markdown", "id": "coral-crown", "metadata": { "id": "77a02bc0" }, "source": [ "Let’s plot our results using the `seaborn` and `matplotlib` libraries." ] }, { "cell_type": "code", "execution_count": 9, "id": "animated-sleep", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 392 }, "executionInfo": { "elapsed": 1526, "status": "ok", "timestamp": 1665912300430, "user": { "displayName": "Hanwei", "userId": "13726710393687068958" }, "user_tz": -480 }, "id": "1a9063b8", "outputId": "6df69fb1-0539-450e-ffa7-a96313a8a833" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import seaborn\n", "import matplotlib.pyplot as plt\n", " \n", "plt.figure(figsize = (6, 6))\n", "seaborn.scatterplot(data = principal_df, x = 'PC1' , y = 'PC2' , hue = 'target' , s = 60 , palette= 'icefire')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "crazy-breast", "metadata": { "id": "0Au2MnSvYYRZ" }, "source": [ "## 1.9 Compare with Scikit-learn" ] }, { "cell_type": "markdown", "id": "false-simon", "metadata": { "id": "0da578e0" }, "source": [ "Now, let's compare our PCA implementation with that of scikit-learn." ] }, { "cell_type": "code", "execution_count": 10, "id": "equivalent-carpet", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 410 }, "executionInfo": { "elapsed": 973, "status": "ok", "timestamp": 1665891291307, "user": { "displayName": "陈浩宇", "userId": "15940747847737534674" }, "user_tz": -480 }, "id": "df0af64e", "outputId": "bfd16ab2-056a-41a2-fcd5-b1f1c8421df1" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Time for running our PCA implementation: 0.00100 seconds.\n" ] } ], "source": [ "# Our PCA implementation\n", "import time\n", "start = time.time()\n", "\n", "mat_reduced = PCA(x , 2)\n", "end = time.time()\n", "\n", "principal_df = pd.DataFrame(mat_reduced , columns = ['PC1','PC2'])\n", "principal_df = pd.concat([principal_df , pd.DataFrame(target)] , axis = 1)\n", "plt.figure(figsize = (6,6))\n", "seaborn.scatterplot(data = principal_df , x = 'PC1',y = 'PC2' , hue = 'target' , s = 60 , palette= 'icefire')\n", "plt.show()\n", "\n", "print(f\"Time for running our PCA implementation: {end-start:.5f} seconds.\")" ] }, { "cell_type": "code", "execution_count": 11, "id": "front-brazilian", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 410 }, "executionInfo": { "elapsed": 6, "status": "ok", "timestamp": 1665891291307, "user": { "displayName": "陈浩宇", "userId": "15940747847737534674" }, "user_tz": -480 }, "id": "2eb968d2", "outputId": "e6541ece-851d-4dc3-ba97-46843f9597ee" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAF3CAYAAAC7cgzXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAAB8rElEQVR4nO3ddXzV1f/A8de5ve5kCYwcnTYtFlioKLaYKCbYP/urgt2YqNiBiIGgoKCihHQPNlh37/b5/TEYjHs31ncb5/l48ICdcz/3vjfgvu/nxPsIKSWKoiiKUheNpwNQFEVR2jeVKBRFUZR6qUShKIqi1EslCkVRFKVeKlEoiqIo9VKJQlEURamXRxOFEOI9IUSuEGJLHf2jhBAlQogNB3893NYxKoqiHO90Hn79D4BXgQ/recxKKeXZbROOoiiKcjSP3lFIKf8ACj0Zg6IoilK/jjBHcYIQYqMQ4ichRF9PB6MoinK88fTQ07GsB+KllOVCiDOBhUCSuwcKIa4Hrgfw8fEZ0qtXrzYLUlEUpaNbt25dvpQyzF2f8HStJyFEArBYSpncgMemAkOllPn1PW7o0KFy7dq1LROgoijKcUAIsU5KOdRdX7seehJCRAohxME/D6c63gLPRqUoinJ88ejQkxDiU2AUECqESAf+D9ADSCnfBC4EbhJC2IEq4BLp6VsgRVGU44xHE4WUcuox+l+levmsoiiK4iHteuhJURRF8TyVKBRFUZR6qUShKIqi1EslCkVRFKVeKlEoiqIo9WrvO7MVRVE6PGtRMbaycjQ6LYawULR6vadDahSVKBRFUVqJ026ndPtOtj/7EmU7d6MxGog57xwSLrsYU4Tbahntkhp6UhRFaSWV+9NZc+MdlO3cDYDTYmX/Z1+zfe5L2ErLPRxdw6lE0U5VWRyk51SRkl5BbpHF0+EoitJIToeDA18vQtpsLn15v/+JOS/PA1E1jRp6aodyCi3M+3o/v68vwCkh2F/PzKkJDO0TiJdR6+nwFEVpAKfFUnMn4Y69rKwNo2kedUfRzpRX2nnxk30sX1edJAAKS23831u7Sc2s9GxwiqI0mNZoJLB/HUfoCIE+wL9tA2oGlSjambxiK/9sKXbb99kvmViszrYNSFGUJhFaLdGTzkBrMrn0RZ05HmOYmsxWmqjK7KizLzPPgsVad7+iKO2LT1wsw999lZARw2ruIrrffB1JN09H7+vj6fAaTM1RtDP+vjr0OoHN7lpNfUivAHy81ByFonQUQqPBL6kb/f/3f9jLyhAaLcawEISmY31G71jRHgfCggxcdkYXl3Yfk5azTglHq1V/ZYrS0eh9ffCKisQUEdbhkgSoO4p2x6jXMunUCOIjvfjoxwyKymwM7xvI1NOjiQl3HetUFEVpbSpRtEOBfnpOGxLCwJ7+2OxO/Lx1GA1qyElRFM9QiaIdC/DtWPVgFEXpnDreYJmiKIrSplSiUBRFUeqlEoWiKIpSL5UoFEVRlHqpRKEoiqLUSyUKRVEUpV4qUSiKoij1UolCURRFqZfacNdGpJTkFlrJL7GChNBAA2FBBjQa4enQFEVR6qUSRRtwOCRbUsr4v7d2UVphB8DfR8fD05Pon+SHThX6UxSlHVOJog1kFZiZ/cp2rLbDpcNLK+zc9+oO3nmoP7ERXh6MTlGU9sJSUEjZ7hSyflqKzsebqLNOxycuFr2fr0fjUomiDexMraiVJA6x2avvNFSiUBTFUlDI9mdeIHfFqpq2A199R4+ZNxFz3jnovD33PqHGPNpAUamtzr7Ckrr7FEU5fpTvTa2VJA7Z9cpbmHPzPBDRYSpRtIG+3eq+bRzYs+McsK4oSuvJ/uU39x1OJ5Vp+9s2mKOoRNEGokJNjB4S4tJ+8sAguoSpw4gURQFdPfMQGqOxDSNxpeYo2kCgn55bLopn7PAQvl2Rg5SSyadF0qerL4F+6swJRVEgasJY0j7+3KVd62XCO9b1eOS2pBJFGwkOMHDigGCG9A5AAiZ1Yp2iKEfwjomm9+w72DH3JaTDCYDW24tBzz+FKSLCo7GpRNHG1JGmiqK4o/P1IfqsCQQPHURlRiYavR6v6Ci8IsMRWs++b6hE0cbKKu1k5plZ+V8hTqfklEHBdAk34e+jhqAU5XinNZnwiY/FJz7W06HUohJFGyqvsvPt8mw++D69pu2zX7K4eHwUl06Mxk8lC0VR2iG16qkN5RZaayWJQz5fmkV2gdUDESmKohybShRtaEtKWZ19a7YVt10giqIojaASRRsy6OquFGvUq78KRVHaJ/Xu1Ib6dPWjrqrig3sHtG0wiqIoDaQSRRuKCDbwwLXd0RzxU9cIuOeKrkSGeHbnpaIoSl3Uqqc2ZDRoObF/EO//3wD2ZVTidELXGG/CgwyYjGp/haIo7ZNKFG3MaNASG+GlSosritJhqKEnRVEUpV4qUSiKoij1UolCURRFqZdHE4UQ4j0hRK4QYksd/UII8bIQYo8QYpMQYnBbx6goinK88/QdxQfAxHr6zwCSDv66HnijDWJSFEVRjuDRRCGl/AMorOchk4EPZbXVQKAQIqptolMURVHA83cUx9IFOHDE1+kH21wIIa4XQqwVQqzNy/PsQeSKoiidSXtPFO4KXkh3D5RSzpNSDpVSDg0LC2vlsBRFUY4f7T1RpANHnuARA2R6KBZFUZTjUntPFIuAKw6ufhoJlEgpszwdlKIoyvHEoyU8hBCfAqOAUCFEOvB/gB5ASvkm8CNwJrAHqASu9kykiqIoxy+PJgop5dRj9EvgljYKR1EURXGjvQ89KYqiKB6mEoWiKIpSL5UoFEVRlHqpRNGB2R1OzBaHp8NQFKWTUwcXdUCVZgf7s6tYuDybnCIrpwwM4oT+QUSFmjwdmqIonZBKFB2MwyH5e1MRT763p6Zt465SvlyWxfN39lHJQlGUFqeGnjqYvCILL36yz6U9p9DKr//m43S6rXCiKIrSZCpRdDBFZTYqzO7nJVasK6Ss0t7GESmK0tmpRNHBGPR1/5UF+OjQ69zVUVQURWk6lSg6mNBAAz3ifdz2XTQhGm+TmnZSFKVlqUTRhkrLbRzIqWJ/ThXFZdYmPUeAr54Hr+lOQrRXTZtWI7hmUgy9EtwnEEVRlOZQHz/bgMMpSUmv5MVP9rIjtQK9TnDa4GDOHxNFWKCBkEBDo54vJsKLubf3Jr/IitnqJNhfT2igAZNR20rfgaIoxzOVKNpARq6Z2+duxWx1AmCzS5b9W0BWvoWzTgnnhOQgAvz0jXrOYH8Dwf6NSzCKoihNoYae2sDytQU1SeJIW/eWY9BpyClq2jCUoihKW1CJopU5nE52pJbX2W+xOknLqmzDiBRFURpHDT21Mq1Gw4Ae/vyzpdhtv8moxd9HzS0oSntnr6qiKiOL3BWrsJWWEn7ayfgkxmMMDvJ0aK1OJYo2cPLAID75OYPyytob5Yb2DiA1q5IzTwz3UGSKojSEw2old8UqtvzfUzVt+z/7mvBRp9B79u0YQ4I9GF3rU0NPbSAm3IuX7+7LCf0D0QjwMWk5b3QkZ54czughIUSEGD0doqIo9bDk5LL1iTku7bkrVlK2a4+bKzoXdUfRRhKivXngmu4UlNiwOyR6Hfh66QlsxGons9VBWYUdrUYQHKBWPClKW6nKzkXabG77Mhb9SMjIYQjReasiqETRhrxNuibtnJZSsj+7io9+zGD15mL8fXRMnRjNSf2DVMJQlDYgtHXPI2pMpk6dJEAlig4hI9fMjGe3UlFVPcdRaXbwwoJ97E2vZPp5sapsh6K0MlNEOFofbxwVrisUYyaf5YGI2paao2jnnE7J0n/ya5LEkb7/I4e8Ive3w4qitByvyHAGPfckGmPt+cSu116BT2K8h6JqO+qjaDtntjr4b2ep2z6nhJJyG+Dltl9RlJYhtFoC+/fjxE/fo2JfGvbKSvySumIMD0fv2/lrrKlE0c4Z9RoSor3YklLmtt/HS+3BUJS2oNFp8Y6Jxjsm2tOhtDk19NTOabUaJp8WgcbN39TgXv6ENbKgoKIoSmOpRNEBxEZ4MWdmb6LDqsdHNRoYNyKEey7vhr9v44oJKkpDFBYWkpWVRUVFhadD6TCcdjvmnDzMOXk461hK21GpoacOwKDXMKhnAC/f3ZfSCjt6nSAk0IDJoIadlJZVVFTEv//8wwsvvEBWVhYjRo7kjjvuICkpCZ1OvV3UpSorhwNffkv6oh/B6ST67InEX3IhXtGRng6tRQgppadjaHFDhw6Va9eu9XQYitKh2Gw2PvroIx579NFa7UajkUWLFtGzVy8PRda+WfLyWXf7vZTvTqnV7h0fx9DX5mIKD/NQZI0jhFgnpRzqrk8NPSmKAkBWVhbPzZ3r0m6xWHjjjTcwm80eiKr9q0g74JIkACrT9lOWss8DEbU8lSjageIyG6lZlaRlVVJaYfd0OMpxqqSkpM45iTVr1lBa6n6Z9vGuzE2SOKR06442jKT1qEFHD5Ky+ojUZ+ankJJeveMzuZsvd1/elbhIbw9HpxxvfHx80Gq1OByumzvj4uLw8lL7ddzxju1SZ59v186xGU/dUXhQZp6FO57bVpMkALaklHPXC9vJKbR4MDLleBQZGcn5F1zgtu/222/Hz8+vjSPqGHy7d8UYGuLSrg8MwK9XDw9E1PJUovCgLSmlVJhdP70VlNjYn13lgYiU45m3tzd33XUXl02bhl5fvew6LCyMV159lb7JyR6Orv3yioxg6BvPEzx0cE1b0KD+DHvzRbyjozwYWctRQ08elJZVdzLILlB3FErbi4yM5KGHHmL69OmYzWb8/f2Jiorq9NVRm8snPo4BzzyKtbAIAENwIPpOdAemEkUbKy23UVppR6cRnDggiC+WZuF0s0I5MVqNByueYTKZSEhI8HQYHY7ezxe9n6+nw2gVKlG0EYdDsvtABS9/to8dqRUY9IKJJ4bz8PQknnh3D3bH4WzRr7sfXcJMHoxWURTlMJUo2kh6rpnbn9uK1VadEKw2yQ8rc/Hz0fL8nb1Z8FMGezOqmHRqBONHhBLkr2o4KYrSPqhE0QacTsmS1Xk1SQJgUE9/zh0VyaoNhbz97QEG9fTnxgviiY3wQqNR48GKorQfKlG0AbtdsjO1vObr6DAj40eG8ejbu3A6q9s27ynj2+XZvDormdhINT+hKEr7oZbHtgG9XtCv++EVEJNOjWD+4vSaJHFIWaWDT5dkYrG6LplVFEXxFJUo2oAQgrHDQ/E2VVd79ffVk1PH8te/NhWpMh6K0sqsJaUUb9nGrpffZNdrb1OybQe2UveHgylq6KnNxISbePmePsz7Zj9aARqB22Wx/j46dFo1R6EorcVaUsq+9z8m7ZMva9pS539CtxuvIW7KeW26xNVps2HOycWcm4/QajGFh2GKDG93+1ZUomgjQgi6dvHhoeuSKK9ycPLAYP74r9DlcVMnRqsVT4rSiqoys2oliUNS3nyP8FNParNE4agyk7vyL7Y+/gxOixUAfYA/g557ioDk3gh3x1p6SPuJ5Djh46UjItjIjRfG0z/p8LyFRsD5oyMYmRzoueAU5ThQsLrus2qKN21pszgqMzLZ/NATNUkCwFZSyrqZs6jKym6zOBpC3VF4QEm5jcoqO7dcFI/dLrHYnAT7GwgLNOBlUqfWKUpr0prqvmPXGI1tFkfOb3+Am4PjHBWVVO5Px7tLdJvFciwqUbSx3EILz8xP4b+dpQzq6c/4EaH4eGkJ8NHTzoYlFaVTCh7u9hA30GgI6Nu7zeKwFhXV2WdvZ2eVq0TRhixWBx/+kM5/O0u5cGwkJoOWlz9LxWx1otHAhJGhXH1OHGFBao5CaZ8sFgvp6els2LCByspKhg4dSnR0NAEBAZ4OrcG8oiLp88A9bPvfcxxaoy60Gvo9/iBekRFtFkf4qFNI/3qR2z7froltFkdDeDRRCCEmAi8BWuAdKeXTR/WPAr4DDp0n+I2U8rG2jLElFZTY+GV1PhHBBqJCTbzyeWpNn9MJP/+Vj0Gv4aYL4zHq1RCU0r5YLBZWrFjBzTfdVOtwo1tuuYXrpk8nKCjIg9E1nM7bi6gJYwgamEzZ7r0IrQbfromYoiLQGtruQ5pvt0RCThhGwd9rarUnXnUpxrDQNoujITyWKIQQWuA1YDyQDqwRQiySUm476qErpZRnt3mArcDhlNgdknEjQvl+ZY7bx/z0Zx5TxkXTJUwlCqV9ycrK4tYZM1xOwHvttdcYN25ch0kUAFovEz7xcfjEx3ksBlNoCH0fnEXp1h2kL1yM1suL2Asm4ZvUtd1VofXkHcVwYI+Uci+AEOIzYDJwdKLoNPy8dSTFehPgqyevyOr2MTa7xGJ1uu1TFE/au3cvVqv7f7ffffcdgwYPdtun1M0UFopp1MmEnjwShECjbZ8fED25PLYLcOCIr9MPth3tBCHERiHET0KIvnU9mRDieiHEWiHE2ry8vJaOtUUE+um5/dJEUjMrSe7m/lCTYH89vl7t8x+L0jGUlpaya9cuFi5cyLKlS0lLS8Nub/5uf+lmhc4hjqPr0XiYrbwCa3FpvTG3Jxqdrt0mCfDsHYW7NT5H/62uB+KllOVCiDOBhUCSuyeTUs4D5gEMHTq03f7r6BHni884LQWlNtbvKMFmrx3qrZckEB7cdkv0lM6lqKiI9959l1deeaWmzWQy8cEHHzBs+HC0zXgz6pqYiE6nc5t0Jk+e3OTnbUmWwiJKNm8jdcHnOCoqiTpjPBFjT8MrKtLToTWYw2zGnJuPw2xG7+eLKSLc45vvhKcyrhDiBOARKeXpB7++D0BK+b96rkkFhkop8+t77qFDh8q1a+veVNMe2O1O9ueY+eyXDLbsKSc6zMiVZ8XQLdYbb5NajKY0zZo1a5hy4YUu7b6+vvz088/ExsY2+bnNZjM///wzd9x+e61P6ldddRW3zZxJcHBwk5+7JdjKy9n7zocuu6694+MY8sqzbbqiqanMuXmkvD2fzMU/Ix0O9AH+9Jh5E+Gnndzq8xZCiHVSSrdrhz35jrQGSBJCJAIZwCXApUc+QAgRCeRIKaUQYjjVQ2UFbR5pK9DpNIQG6rnizBjMVifeJg0hAQaMhmN/4isus5GeW8XqzcX4eusYkRxIVIgRk7H93roqrU9Kyaeffuq2r7y8nMzMzGYlCpPJxIQJE/hl6VJWrVxJRWUlp556KrGxse1iItuSl++2NEdl2n6KN2zGa2L7ThR2s5k9b71P5vc/1bTZSkrZ+tgzmF4NI2T4EI/F5rFEIaW0CyFmAEuoXh77npRyqxDixoP9bwIXAjcJIexAFXCJ7CiDjseQU2Dh2Q+rN94BaDWCSydGc97oSAL99HVeV1Rq5Y2v9rPs38M3VW9/u5/7r+7OKYOCMehVVZbjmdlsrrOvJeYpvL29SUpKIinJ7QiwR5mzc+vsy/71dyJPH9vuiu0dyZKbT9aPS9z2pbz9Af69eqL398xqKI++q0gpf5RS9pBSdpNSPnmw7c2DSQIp5atSyr5SygFSypFSyr88GW9LqTTbee3L1JokAdVLZz/6MYP/dpYAUFFlp7Tc5jIZtzejslaSgOoqAM9+mEJekfvS5crxQQjBxRdd5LbPYDDQpYu7tSKdh87Xp84+75jodp0kABxVVUiH+0UBVVnZOCye+/+tPn56QEGxjT83ut++X1RqY+V/hdz/2k7ufmk7X/+WXevsiiV/u1/RZbNLsgvcL11Ujh99+vbljDPOqNUmhODZZ58lOvrYtYM8dcNuLS1r9nkQpohwTO7mITQaos+a0Kznbgt6Pz90Pu6TXdCgAej96k6ErU3NmnqAxeZ0VwuMM04MY096Ja9+kVbTtudAGj+uyuXpW3sRHmxEp607t7ejqsSKh4SFhfH4E09w1dVX88uSJQQGBjJ+wgTi4uIw1LPrODU1ld9++42///qLgQMHcsaZZ5KQkICmlf9RmXPyyP/7Xw58swghBHFTziN4xBBMTdiZbAoPY/BLz7Dpvkco35sKVJft7vvQLLxjY1o48pZniggj6dYb2P7087XaNUYDiVddhtZk8lBkHlz11Jra+6qn3CILN/1vC0WltlrtD09P4rG3d7u9ZtaVXbHbJJGhRma9vMOl32TU8O6D/YkK89w/JqVj2rNnDxdecAHFxcU1bd7e3nzx5ZckJye32utaCgrZ9ODjFK3bUKs99MSR9H14Fsbgpk2QWwqLsOTlI+12DMHBmCLCPL68tKFspWUUb9lGylvvY87NJWjQQLpeMw2fhHg0utZdrNJeVz0dt8KDjNx5WSIPv7mr5s5CrxOUV9Y92fj3pmLsdifRYSbOHRXBwhWHS4DodYLHbuhBWLAqJqg0TkVFBXPnzKmVJAAqKyt56KGHeP+99whspRVNFWkHXJIEQP5fq6nKyGxyojAGBzX5Wk/T+/sRduIIAvv2xmGxovPzRefl+Q9/KlF4yJBeAbz7UH/2Z1eRlW/GbpfERHjV+fggfz170yv5+rdsJp4YxpyZvcgptODjpaNbjDeRxxiWUhR3iouLWbp0qdu+/9avp6i4uNUSRdH6jXX2lWzdQWC/OgsxNIiloBBrUTFCq8UYEoze3301hIZw2u0IjabN7kz0Af7Uvfax7alE4QFmq4OUjEre/nY/ezMqiYv04rpzY4kINhAaaCC/uPaktEbAoJ7+fP9H9V3Ez3/lsWJtAR8+OoDQILWLW2k6jUaDj48PpaWlLn16vb5ZO7mPxRRV976GQ3MUtvIKqrKyKfj7X6SUhI4chld0VL2bz6TDQcn2XWx59H9UplVXCQoc1I++99+DT3zj9pGYc3Ip2riZrJ+WYQgOIvb8c/BJiKtz0rmzUh9BPWBnagW3zdnKpt1llFc62La3nDuf305Grplnb+tFXOThW01/Hx13XJbI4pW5tSbApQRn55teUtpYeHg4V155pdu+c889l/Dw8FZ77cB+fd2eKKf18cavZxL28grSv13M6suuY/er89jz2tusvvx6Dny1EFt5eZ3PW5meydqb7qhJEgDF/21m3a33YM5peB24qpxcNsx6iM0PPkH+n6vJ/P4n/rn6ZrKW/IajjuKInZVKFG2suNzGa1+mul319OIn+/D31fHCnX2Y90A/Xp3Vl7umJfLt8hzWbS+p9diJJ4YRVM/GPEVpCK1Wy6WXXcZpo0bVah80aBAzb78dUyuutPHuEsWQ1+ZiDA+raTNFRTD0tefw6hJFVU4uu1950+W6PW+8iznLfZl+gPy//8XpZs+BOTuHyoyMBsdXtH4jpdt3ubTvfP4VyvfspXD9Rqqy646jM1FDT23MbHGw50Cl277MfAuVVQ5iIrwI8q+emD6QXUVpRe3VUbGRJi4eH4Ve7cJWWkBUVBQvvvgimZmZ5OfnExwcTFRUFKGhrXt4jtBqCeqfzIj3XsNSUIgADKEhNcNORf9tqvPagn/X4ZfUzW1f+d59btsBLPmFh/9cUIiloBAcDgwhwZiOSFhOq5XMH9zvknZabVTsS2PLo09jCA5iyMvP4teje33faoenEkUrKiq1kldspcrsJMhfT2igAb1WQ1iQwe15FP4+Opc3/9hIL165J5mUjEr2Z1XSLcaHhGgvwtTchFIHi8VCWVkZJpMJX9+GlXwICgryWL0mU3hYrTfpQ4Sm7p3U4uBSUWtJCZbcfBxVVRiCgzCGhxEyfCgZC39we92h/RRlu1PYeN+jVO6vHp4yhoXS77EHCByQjEanA60WQ2Ddx7uKg3M31sIiNsx6mGFvv4IpLKRh33AHpBJFK8nIM/PIW7tISa++e9AIuPysLpw7KoLZV3Tlfx+kUFBS+05h2pnRhAW6LnGNCDESEWLkxP4dc8mf0jacTicpKSm88847rP77b2JjY7n1ttvo06cPfn5NX/HjKUGD+tfZFzJ0MJUZWWx+5ClKNm4BQGPQ0/2m6wgfdTJeXaKpysisdU3oSSPxigynKjObtbfcha348HCuJS+fdbfN4oQF7+CbEIdGqyV2yrlk//Kby2sbw8Owlhye/K/KzMKSn9+pE4Uau2gFpRV25nyYUpMk9DrBIzf0ILmbH299vZ9vV+Qw/bw4Zk5NQK8TeBk1XDMphrHDwtDU8ylKUeqzZ88eJp1zDp9/9hlpaWmsWrWKiy+6iCVLllBU5L5kTHtmioygz/13w1E1mnrPmok+MIBtT86pSRJQPSS066U3qDyQwdA3nifhiqkYQ0Pwio6i550z6HPfnRiCAqnYf6BWkjhE2mwUrD58frVv1wR63H5zzd0DVN959Lr7VlI/+uyoa5tfcLE9U3cUraCwxMqm3Yfr1jxwTXcO5FTx9reHV2H8ubGI5K5+vHV/P4wGDeFBBrRqH4TSRFVVVbz26qtUVVW59D315JP4+/szZPBgQlp53qEl6by8iJwwhsAByZRs3oZEEpjcB1NkBOasbArX/uf2un0fLGDgc0+ScMVUukw+E43BgCk8rKYooLWw7qR55F2I3s+P2PPPIezkEzDn5iLtDir3p7PzuVex5B5ePaXz9cEY2nnvJkAlilZhtR2uABkRbCDQT88T7+5xedyWvWXsy6xk9NCO859XaZ9KSkr46y/3xZULCwspKS5mX2pqh0oUADpvL3wT4/FNjK/VXl8lVVOXKMpT9pHy1vuU7U7BJzGepJuuxa9HUvXzdU2o89qQkcNqfa01mfCJi8EnLoaqnFz2vPEO5pwjyplrNPR9eDamCNc5ls5EfYRtBYF+egL9qnNwcnc/Ckqs2B3uNz0s/ScfRx2lhRWloYxGI+ER7jewabVatDodvy5bVtPmdDpxOBxtFV6LMwQGui0rbggJImLUKayZfhuFa9ZjKy6h+L9NrLl+JkUbqldRmSIjiBg/2uVa/9496lxJBeAVEc7AZ59g4LOPEzVxHIlXXcYJH79N6AnDaw1PdUbqjqIVhAUZuGtaVx5+cxdWm6y3tIaft67d18lX2r+goCBuv/12pl93nUvfGWecwR9//EGvnj0pLi5mz+7dLPjkE8rLyphy0UUMGDCAiDqSTHtligij1923seWR2icnx114HinzPsDdRqWdz72Cf4/uGIKD6HHrDcSeP4mUdz/EVlxCzLlnEXbqyW5XXx39uqaIMMJHndyS3067p6rHtgKzxUFOoYWiUht2hyQ4QM+sl3ZQeFS1WIAX7+pD/yR/D0SpdDZFRUV89dVXvPD881RWVqLRaBg/YQITxo9n9uzZ/LxkCT//9BNz586tdd3Jp5zCc88916xkUVJSgt1uJygoqNVLkx9ir6ikLGUvqR99jjknl7CTRxI5fgx/XXxVndec8Mm75P6+itzf/kAfFEjCtIvx6RqPVyvuQO8oVPXYNlRQYmXBTxks+iMHp7N6WeyEkaE8fWsvZr28neKy6tURGg1MPzeOxC7eHo5Y6SyCgoKYNm0aI0eOZNeuXeh0Ov78808efPBBnnv+eZxOJ88995zLdatWrmT79u1NShT5+fn8+88/vPXWW5RXVDB58mTOO++8Zp3N3VA6H2+C+ifj/3gSTqsVnY83lsJijGGhWPLyXR6vD/CndNtOUt56v6at8N919LjtRmKnnIvWTTkRpZq6o2hBTqfky1+zeOvr/S59086IZuKJYWTlW7DaJJEhRqJCjZiMnXtsU2l7drudzMxMMtLTcTidxMTEEB0dze+//+52aArgwgsvZK6bJFKfsrIy5s6Zw/z582u1x8XF8cmnnxIT45nDgtIX/ci2J+a4tHe/8Vry/lxNyeattdqFXs9Jn72Pd2zHPSrWUliEJb8AabNhCA7CFBHe6Eq36o6ijRSUWPn050y3fV//ls1Zp0QwpHdg2walHHd0Oh1xcXHExcXVavf2rvvuNTg42KWtqKiInJwcKioqasp6HFn7KTsryyVJQHXp8oL0dEK0eoRO1+Yb0cJPORHbrTew972PcFRUojWZSLj8YgzBQS5JAqr3T1gKCjtsoihPTWPTvYdP9dP5+5H80CxCRgxDa2qZuySVKFqQwyEprXC/8abK4sRur757Ky6zkVdkpcriqCnt4aXuLJRWFhcXR9++fSkoKCA7O7tW3+Rzz631dXp6OnfddRf/rF4NVJccn3HrrVx++eU1SSXrqOcAGDZ4MI/cNIPy9z5h5cYtGEND6Hrt5YSPOqXNDhMyBAUSf+kUIseehr2iEq23F4aQYLY+9kyd13jymNHmMOfms37m7FpFEu2lZWyY9TAnfPx2vau4GkMlihbk462jb1dftu51LYHctYs3Pl5aMvPMPPb2LnbtP1jaQwOXTezCeaMjCVTVYJVWUlxcTGlpKeedfz4Oh4Mu0dF8+OGHbNiwgSefeoqEhISax5aVlfHwQw/VJAkAm83GC88/T69evTj99NMBXMqCGAwG/m/GrWQ+9D+kvfoDkyUvn+1Pv4AlN5/Ea6ahrefc7pak0Wrxio6q1RY/9UJylq1weaxfj+6YwjvW/pJDzLm57ivpSknG4p/pdcctLfI6KlG0ID9vHTMuSuC2uVux2Q/P/Wg1gplTE9BpBXM+SqlJEgBOJ3z0YwZJcT6cPND19l9RmquoqIhXX3mFd999t6ZNp9PxyquvkpycTHh4OMYjJnJzcnL47TfXGkcAr77yCiNGjCAwMJDoqCji4uLYv796Tu6siRMxL1lekySOlPrxZ0SfdXqzh3esRcU4LBa0RiOGoMBGXevbNZG+D9/Ljrkv4ais3sHu37sn/Z94CEMHPTrVUeG+EjVAVXom0uFokT0eKlG0sG4x3rx5Xz++/jWLHWkVdIvx5qLxUcRFepGRa2bjrjK3133ycyYDe/jj663+SpSWtXvXrlpJAqonvG+fOZNfli6tlSQAzGZznc9VWFiI9eChPRGRkXwwfz4zb7uNzZs30yshEfNf691e57TasJW5/7ffEPaKSoq3bGPXy29SsXcfPvFxJN12I4H9k9G72Xjnjs7Hm6iJYwka1B9rYRFakxFjaEijE057YgwPq66F5WZRUsTY01psI6B6V2phOp2GxC7ezJyaSKXFgcmowag/WJLYXvcO7LJKe61+q9WJxebA26RDq1Ub8pT6ORyOOo8t/eLLL922WywW0tPTiY+vXR4jODiY4OBgCgsLXa4ZO24cgYGBNV937dqV+R9+SG5uLt46PQWZBVQecD0cSGg1zTo+tGjjZv67/d6ar8v3pvLf7fcy4NnHiWjE5jeNTod3lyi8u0Qd+8EdgCk8lPhLp5C24Ita7d5xsQQNHtBir6MSRSvR6zUEHHW2RICPHn8fndsJ71MGBhHgo6PS7CA1s5LPl2aSXWBleJ8ATj8xjJhwr7YKXelA9u/fz+8rVvDb8uX07NmT888/n4SEBAxHzAU46ynV4W55fFRUFE8++SQ33XRTrfagoCCuvvrqWs8NhxMLQMA1l5O36m+XT7hdzj0bYz31kKSU2EpKQaPB4F977sNSUMjOF15ze92uF18nILk3pk5elK8uOh8fEq6YStDgAaR9/Dn28gqizhhPxJjT8Ipsud32ah9FG3I6Jas2FvLovN21/h8F++t56e6+RIUa+X19AY+/U7uAoL+Pjldn9SUmQiUL5bDU1FQumjKF3NzDRer0ej0fffwxI0eOrGn7+++/mXrJJS7XG41GlvzyS62J7EMqKirYs2cPb7/9NvvT0hg1enRNEqqPw2ymeNNWtj/7IpX709F6mYi75AJiLzyvzmWyVVk55Cz/g8xFPyIMBuKnXkjIsME1FVmrMrNYee6ldb7myQs/QQgNlvwCEGAKC8V4RLXY44WtogJpc6AP8GvS917fPgqVKNpYWYWN9Fwz363IIbvAwgn9gzhlUDDRYSZyCizc8NRmt3cc542O4MYL4tHrVB1HBaxWK08+8YTbfQxxcXF8+dVXNTutCwoKmDtnDp9++mnNYzQaDa+99hpjxo51maM4+nXMZjM+Pj51Dm25YykoxF5egcagxxgehqaOa805uay/6wHKd9X+cBQ5YQy97rkNQ0AA5rx8/r3mltpVWw8KOWE4CZdOYdODj1ffkVBdGHDAM48R2Ld3py/W15LqSxTqXaeNSClJy6rilc9TeeiNXZiMGq48J4aJJ4YRHVa9hruk3FbnPoy/NxVTVkefcvwpLCzkx59+ctu3f//+WvMLISEhzJo9m+8WLWLWrFk8/vjj/LJ0KaPHjKk3SUD1kld/f/9GJQkAY0gwPvGxeEVF1pkkAEp37XFJEgDZv/yGObs6MZjCQul+y3S313e77grW33l/TZIAsBYUsX7GPVRmuu7zUJpGzVG0kfRcMzOe2UKFuXq8eNEfuSz6I5dLJkRx+VkxeBm1GA11/4cK9NOruwmlhk6nw9fHh7w6+g362ntyDp2JPWBAy01wtoT8v/6ps68iNQ3/nkkAhJ4wnD4P3M2e19/BWlSMPjCAnnfeQtnuFKTNtdimw2ymbNdufDrobuv2RiWKo0gpW3xs0+GQ/PRnbk2SONIXy7KYeGI4cZFehAbqGZEcyD9bil0eN+3MaPx81F/X8W7//v38+eef7N69m8uvuILHHn3U5TGnnXZanWdTtDfeMXW/kRuCDu9tMAT402XSmYSOHIa9yozWZMQUHkbKux/VeX19J9kpjaM+ogKVZge79pfz8mf7eHTeLlb+V0heUd0naDVWlcXBfztL3fY5nVBabsdidVBYauP68+IY2OPwqg+9TnDd5Fj6dvVze71y/Ni3bx8XXHAB9917L++9+y5Op5Ozzz671mN69erFY48/7rJrur0KO2kkQu9akcAQHIR37OGigrayMsr3plKRuh9HZSUavR6h0RAybFCdzx3Qt3erxHw8Ou4/olptTv5YX8izH6bUtP3xXxG9E3155PokwoKaX1TLqNcQG2FiZ1qF234/Hy3zF6fz5bJstFo4b1QkF42PxtukJTjAQHiQHoNeTcodzywWC2+8/jp5R6xwevKJJ7jssst4+513MBqNBAYEEBUVRVgHOlvBKyaaIS8/y+aHn6wpDe6TEEf/p/4Pr6jquyJLfgG7XptH1g+/1Fzn2y2RgXOfwDs2hpATR1Bw1BBW5IQxeEV1jr0S7cFxv+opI9fMtY9vxGpz/Tk8cG13xg5rmRowGblVPPTGTlKzau96PfvkMHom+PLcx/tcrpl0Wjg3XxivkoRCVmYm48ePp7zctY4YwLJff6V79+5tHFXzOcxmrCUlOK12HFWVgMAYEowx5HA5mwPfLmb7/1xLoIeMHEb/px7GUWWmeMMmDny1CKHVEDvlPAL79alZXqs0jCozXo+CEqvbJAHw8195nDIwGIO+aSN0doeTzDwLv67JJyW9krNOiSA00MArn6VSXG5j9NAQLpoQzayXdri9/qc/87hoXDTRYSpRHO80Wi3e3t5uE4VGo2n0qqT2oDI9g6INm8n68RecVhvho08mZPhQ9EdsuLMUFpG24HO31xesXoMlvxDfhDgix48h9KSRIAQ6L7XfqKUd94lCV095DD9vLc051XFnagV3vrCtpkDgXxuLCPbXM2dmb/R6DaEBekor7BS5OSIVwGaX2OxO8out7Mus5O+NRYQEGjhpQBDRYUZ1p3EcCQsL4+prruGZp5926Rs3fjxhYfWf9dzeVOXmkTLvA7J+XlbTVrxpCwHJven74Cx8uyYAIB0O7PUUvpP2w/93dPWct6E0z3E/mR0aZCA00H1578mnRaLTNu1HVFRq5dkPU2pVkQUoLLWxcEU2EUEGTEYtvt5aBvdyf2Z2dKgRvU7Dk+/tZvbLO1j4ew7vfneA657YxLrtpTgcnW/YUHFPo9Fw3nnnMW7cuFrtPXv25MEHH8TX19dDkTWNNS+/VpI4pGTLdsr2pNSUHdEHBhAx9jS3z+HVJRrDEXWnlNZz3CeK8CAjT97ci6AjzoLQCLh2cgyJXZp+C1tcbudAjvsqnL+vL6S4vPqTkLdJx7WT4zAeNbylEXD7pYnsy6x0qTjrdMJT7+8hr9ja5PiUjicyMpI5c+fy408/8e5777Hwu+/46OOPXU6y6wgOncbmTuGa/3AeLFWu1euJv+QCl/kGodPR98F71DxEGznm0JMQwh8Ik1KmHNXeX0q5qdUia0NJcT68fm8yuUUWzFYnEcFGwgINeJkaNrSTW2ghu8BCcbmNLmEmwoKM6LSiruq/eJm0aDSHh7zio7148/5kvl2ezZaUcuIjvbh4QhSRoUb+763dbl+zospBQbGVyBB1IPzx5NDGuT59+jTpeqfTSWZmJoWFhZhMJiIiIggICGjhKGuzV1Vhzswmf/Ua7BWVhJ48An1g3a9pDA9Fe8SSWe+YLgx7+xUKVq8h78+/8e2WSPQZEzrs0aUdUb2JQghxEfAikCuE0ANXSSnXHOz+ABjcqtG1oYgQIxFNeNNNy6pk1ss7yCs6/Ol+3PBQpp8Xy8jkQP7eXOxyzZSxkQT7H/6PoNUI4qO8ueWiBKrMDkwGLQaDBovViV5X9xzKkclGUY6loqKC3377jQcfeICSkhIARo4cybNz5rTaXYnDYiF3+Uq2PPp0zaemve/MZ/BLz6Dz88VeVntyXmg1hJ96EuKoyUHvLlF4XzCJLueeVW9JEKV1HGvo6X5giJRyIHA18JEQ4vyDfcf9u1RxmY2n3ttTK0kALPs3n427SplxUQJdjxq+GjUkmNMGh7jd/a3XafD31WMwVP+1GA0aLhgT6fa1QwL0dc6tKIo7u3fv5tYZM2qSBMDq1au57dZb3Z490RLMOXlsffxZl1vrHXNfZtBzT1UfvHOQzt+PAc88jk9i/NFPU0MlCc841tCTVkqZBSCl/FcIMRpYLISIAY77mdTCUiu7D7hfkfH50izm3h7IszN7k1dopbTCTkignrBAY6NKcfSI82HSqREs+uPwubg+Xloev6lni2wGVI4PVquVd995x23fhg0byM7OrjlToiVV7k9HujkPo/JABnl//s3wt1/BnJuLdDgwhATjExvjcjeheN6x3rHKhBDdDs1PSCmzhBCjgIVA39YNrf2rb9WRxerE6ZQE+xsI9m/6gfJB/gaunRzDOaeGsy+zEn8fPbERJjU3oTSKxWIhI8P15LlDKircVw1oLlHP8nN7RSUZP/zM3nc+BKcTr+hIet0zE5+EBEzhIWjclPZQPONYqfsmjhpiklKWAROBa1orqI4i0E9PaKD7JDBhZBgBvi3zD93PR0+3GB/GDQ9jeN9AokJNx92hLErz+Pj4MPaopbWH6PV6QkNbpgLB0bxjY9AY3P8/CBk2mNQPFlQv4wOqMrPZcPcDlO3eTfavv2OvqmqVmJTGO1aiqADclaEcCaxu+XA6lrAgI/df091l015spIlxI0LdTjZbrE4ycqvYm1FBbqHF7VGUinK0srIycnNzqayse/NZfTQaDWeffbbbjXkzZ84kqpXqIpkiwhnwv0dcDhBKvOqy6mWw1tqbTaXDSe6KVWQv+ZXK/emtEpPSePXWehJCLAbuP3oZrBBiKPB/UspzWjm+JmnLE+7sdicZ+WZW/VdEeo6ZEf0C6Z3oS0Sw69BQXpGFj37I4Ke/8nA4JUF+em65KJ4RyYH4eB33m+QVNyoqKtixYwcvvPACKXv20K9/f2677TaSkpKOeeiQO2lpaXz6yScsWbKEkJAQbrr5ZgYPHkzQESW9W5rDasOcnU3pjl04qqoI6NsHabez+oob3D4+cGA/fOJi0XiZ6H3Xra0Wl1Jbk49CFUJskVIm19G3WUrZr4VibFHt8SjUKouDlz7dxy+r8136XrirDwOS3O/OVo5vy5cv5+qrrqrVptPp+PKrrxg0qO4S2/Wx2+0UFxfXnF7nCRWp+/nz4qvcbjSKm3ohJVu2YwwLYeDTrudtKK2jOUehmurpa3blLSHERCHETiHEHiHEvW76hRDi5YP9m4QQHXbfRn6xlWX/uCYJgA8Xp1NRpY45VWrLzc3l4Ycecmm32+08+cQTFBcXN+l5dTodoaGhHksSAMawUGKnnOvSrvP3I2hAP0o2byXq9LFtH5ji1rHGO9YIIaZLKd8+slEIcS2wrjkvLITQAq8B44H0g6+1SEq57YiHnQEkHfw1Anjj4O8dTpXZgbOOm7fMfAsWqxMfVfRSOUJZWRkHDhxw27du3ToqKioI7KC1jnQ+3nS9ehp+3buR+tGnWEtKCRk+lKjTx7LzhVfx792TgD4te/CQJb8Ac04u1qISTBFhGMPDMASoO/mGOFaiuB34VghxGYcTw1DAAJzXzNceDuyRUu4FEEJ8BkwGjkwUk4EPZfX42GohRKAQIurQ3o6OxM9Hh8mowWxxuvT17+6Lj5faSKTUZjQa8fHxcbt0NSoqCn0HXz5qDAkm5tyzCBkxBGtJKQX/rGX/F9/QbfrVBA0diCmi5SriVqZn8t/dD1Kx9/C5L+GjTqHXPbdhCmudFV+dSb1DT1LKHCnlicCjQOrBX49KKU+QUmY387W7AEd+XEo/2NbYx3QI4UEGrp0c69Ju0AsuOb0LRoNrojBbHaTnVLEztZz03CosNteNS0rnFRkZyXXTp7vtu+POOwmv4yS7/Px8srOzMZvdF6Vsb7yiIgno1YOEqVMYOPdJos+agFdEy53SZ6uoYMdzr9RKEgC5K1aSs2yFWnnYAMeq9WQCbgS6A5uBd6WULTWY7m4jwNF/Yw15TPUDhbgeuB5ol9U0tVoN44eHEhls5IPF6eQXWxmQ5M8VZ8cQF+E65lRQYuWTnzNY9HsuDqdErxNcODaKC8dGEtSMDXxKx6HT6bj00kuprKhg/vz5WK1WvLy8mHHrrYwZM8bl8Xl5efz222+88frrFBUVMXbsWG6ZMYNu3bp5IPrG0xj0aGjeXZKloBCnxYLGaKw5Jc+aX0j+UUelHpL2yZdEjh+tqtAew7GGnuYDNmAl1fMFvakejmoJ6cCRH7FjgMwmPAYAKeU8YB5Ur3pqoRhblL+vnpMGBpPc3Q+bTeLjrcXL6Hon4XBIFq/M5dvlh8t22OyST5dkEhZkYPJpEWrD3XEiIiKCu++5h8umTaO8vBx/f3+3w04VFRW8/tprvP/++zVt33zzDcuWLeO7RYtITExs69DblK2snKL1G9n50utUpWfi1SWaHrfdSPDQgdUlROq4a3CYzUiH63CwUtuxVj31kVJOk1K+BVwInNqCr70GSBJCJAohDMAlwKKjHrMIuOLg6qeRQElHnJ84WoCvntAgg9skAdUrpL5a5v7b/OjHDApK1DkUxxOj0UhCQgLJycnExcW5nZvIyspi/vz5Lu2lpaUs/PZbnM7O/WZYuG4DG+55kKr06s+RVRmZbJz9MAX/rscQHFRnocGIcaPQBwW2YaQd07ESRc22yRYccjry+WYAS4DtwBdSyq1CiBuFEDcefNiPwF5gD/A2cHNLxtBe2exOKszu5yOKSm3Y1VRFh1ZYWMiOHTvYunUrOdnNneo7/Jx1JYM///yTqk5cDsNSUMiul95w27fr5TeQdjt9H7wHjbH2kK0xNISESy9CW0eJEeWwYw09DRBClB78swC8Dn4tACmlbNbaMinlj1QngyPb3jzizxK4pTmv0RH5eOmIj/IiLcv1P3efRF+8Taq6Zke1Z/duZt5+O1u3bAGgS5cuPP/CCwwZMgSdrum78/38/OrsS0pKwmDovPNaDrOZqgy3I9KYs3JwmM349+7FCR+9TfZvv1O2aw+hJwwnZNhgvKJbp3RJZ1Pvv0wppVqz2QjZ+WZSs6rIL7bSLcabyBBjkyaeg/z13HZJAve8uL3W3gutRnDLRfH4+6hPQB1RZmYm06ZNI/uIu4iMjAwunzaNH3/6ie7duzf5uSMjIxk5ciSrV9cuwabVarniyitdhquys7PJy8tDSklYWFir1XpqC1qjEVNUBOasHJc+Y3gYGqMRjU6LT0Ic3a653AMRdnyqwFALSUmv4K4XtlNacXiEbkTfQO6alkhoE86N6JPoy2v3JvPxjxnsy6ykZ5wvUydGEx+lduV1VPvT0moliUOsViu//vprsxJFUFAQzz3/PP976il+/PFHnE4nMbGxPP3003Tt2rXmcVJKNm3axC0330x6enXRvcjISF599VUGDR6MtgMeDGQMDSFpxg1sfuAxl76kGderfRItoN5aTx1VW9d6Kiq1cdcL20h1M1R017REzjq5ugBvZZUdg16g0zX8P2OVxYHZ4sDLpMXkZq+F0nEsXryYGbe4H0m95JJL+N/TT9ecZ200Gpt0nnVFRQW5ublYrVYCAwOJiKhd/Hn//v2cecYZlJfXPoLUaDTy85IlHXZ1lK20jPy//2XXK29hyc3DGB5K0i3XE3rSCAweLFXSkdRX60ndUbSAwlKr2yQB8N+OEvp29WPNtmLWbC0hLNjAmSeFEx1mJMjv2MNSXkb3S2iVjqe+N+FTTzuN31es4M4776w5lnTEyJHMefZZ4uLrPhr0aD4+PvW+ztatW12SBFQfbLRmzZoOmyj0/n5EnT6WoMEDcJgtaE1GdSfRglSiaAH13ZRddkYM9722k5wCS03bz3/lcf813Tl1YBB6vUoCx4su0dGcfc45LP7++1rt3bp3p1u3bkw8/fRau4T/Wb2am26+mfnz5zfrYCGHw4HNZsNkMtW7yioz8+DS0qxsSrZso3DdBny7dyNkxBC8Y7p0iL07Kjm0DpUoWkCgn56oUCNZ+ZZa7dPPi2HZv/m1kgRUJ5ZXPkule4w38VHebRmq4kGBQUE8/PDDnHbaabz7zjtYLBYuvPBCJk2ezFtvvum2lMTWLVvIyc5uUqKorKxk7969fPzRR6Snp3PGmWfSN9ntqQEAjBw5ksqMTNbedCfm7MMTw1ofb4a9+SL+PZMaHYPSOahE0UylFXaqzA7uuaIb972yA4vt8Fr2gT0CePbDvXVeV1xmJz4KyirslFTY0AhBcIBezUV0YuHh4UyZMoVx48bhcDgIDg7GbDaze/fuOq9pynnWTqeTFStWcMvNN9ckoFWrVnH/Aw8wduxYfv3111qPHzlyJD27dSf1vY9rJQkAR0UlW5+cy5CXn8UQ2Lg5E6VzUImiGbILLMz9aC/rd5TQtYs3s67sSkGJjcISK4N6BhDkZ8C3nqqwBr1gb3oFL3+eyqbdZWg1glFDg7lmUixRofUdBaJ0dEeeKOfl5cW48eP55x/XekRarZZQN8eXHktmZib33Xuvy13KM08/zYcffsiZZ53Fh/Pn43A4mHb55Zx22ml4OSXZv/zq9vnKduzCVlaGraSU4k1bsBaVEDS4P95dojGonc2dnkoUTVRRZeeVz/exfkcJAHszKnn8nT1EhxqZfWVX+iVVf/I6d3QkW/fucbm+Z7wPfj46bnpqS80ubIdT8uu/BaRmVPL0bb0JCei8m6SUw4QQnH766bw9bx65ubm1+m688UaXlUsNUZCfT0lJiUu7w+Hg0Ucf5Ysvv2TcuHFIKWvOtDDn5aOpY5eyb1I3Kg9ksOHuB5H2w0vAIyeMpecdN9cU4FM6J7XFt4nyi238vanYpT0z38IbXx+g7OB+it4Jvpw/JhLNEfOAcZEmZl3Rja0pZW5LdaRkVLnMayidW1xcHF9+9RU33XQTCQkJDBw4kLfmzeOaa6/Fx8enzuvKysrYtWsX3y9axK+//kpaWhp2ux1DPedpBwQEoNVqCQgIwEevpyI1jdLtu5BWG91uvNbtNd2uv5rNDz5eK0kAZP/yK6Xbdzbtm1Y6DHVH0UT1nQ1RVGbDZndSVGojp9DCqCHBnD4ylMJSG15GLUH+emIjvPh8qfuyA1BdGFA5vsTHx3PX3XdzzbXXYjAYjrmHori4mPnz5/PC88/XtJlMJj744AN69OxJv3792Lx5s8t1N9x4I35+flRl57Dz+VfJ/f1PkBKdrw89Zt5EtxuvIeXN92oe79UlGr2vD/Zy93MlB75eRMiIYWj06u2ks1J/s00U4KPH30dXayf2ISOTAxFC8OoXqSxfW1Crb8ZF8ZxxUvWhLP2T/PhltftztMODG7+bW+n4dDodYQ2ck0hJSamVJADMZjPXXXcd3y5cyKOPPUZWVhaLvvuOJUuWoNFouPmWWxg0aBC28gp2zH2ZvD/+qrnWXl7BtifnMvilZxjy2nOYc3LxiorEO7YLVW7KY9RogWWzUkrMOblYcvORTgfGsFBMEeFomlH/Smk56m+hicKCDMycmsDj79Sef/Dz1nL+mEhSsyprJQmtRnDe6AgC/fRs21tGaKCBIb0CiAoxkFVQ++6hX3c/IlSiUI7h888+c9teXl7O5s2bufuuu9DpdEy7/HJ++vlnDAYDUVFReHt7U74vrVaSOFLqR5/hFRNN7opVhJ16Ikk3T8cUFoqujruK2AsmNetuQjqdlGzdzn93PYCtuHpeRetlIvmR+wg9cQTaeobRlLah5iiaSKMRjEgO4tVZfTl5YBDdYryZeno0r81OJjbCq1aSEALuurwrqVlVvPFVGjmFVjbuLmPpP/ncdXk3/m96El5GDV5GDRePj+KBa7oT5K8K/yl1k1LWWzrcbrcjhMBqtfLeu++ydOlSEhIS8Pau3rfjqOdac24+hoAAbMUlZC76ifI9ezFFhNH/f48gjiouGHXGOPx79WjW91KVlcO6W++pSRLV8ZnZeN+jdVaFVdqWuqNoBm+Tlj5d/XjgmiQsNic+Ji1arajpO2R430C27Cll+95yZl/VjRc/2Udhac1RH/SK9+Gt+/th0GsIDtCj06r83VnZbDby86uHG8PCwppcWlwIwYVTpvD9Ubu8AfR6PSajEYfj8Dza2/PmccEFF9ClS/WR8/qAALReJhxVrudqB/brQ9nulJqv0xcuxmm3k/v7KgbNfQJzbh620nKChwzAKzqq2XsrKtL246h0k7icTnJ//xPfronYysqwV1Si0enUsaUeoN6RWoDRoMHfR4fZ6iC/2EKl2c7YYYf/MZ88MJhf/y3gjJPC+HxpZq0kAbAjrYKl/+YTEmhQSaITS09P55mnn2bi6adzxsSJzJkzp6aCa1P06dOHM844w6X9nlmz+Ozzz2u1lZWVYbEcXklniggjacYNLtfqfHwIH3Uy+avXHNEqSP/qOzK+Xcz6mbNJeXs+hpAgfLslNipJ2CsqKU9NI//vfynauJmqgxv77KVldV4j9HpKtm5nw+yHSXnrfQrXb6Rw3X9Upqs7jbak7ihagNniICW9kve/T2dfZiXdY7y5/MwY3rgvmQU/ZqDTCiw2J91jffjqV/e1dhavzOWcUyIIDVR7JzqjrKwsrrrySvbsOTyn9dabb7Lyjz94//33iYiMbPRzhoWF8djjj3PlVVfx808/ERAQQP/+/fniiy/4688/az02MTERP1/fmq81Oh1Rp4/FOy6Gve9+iCU3n8AByUSMOZVdL78JR5yWF3ricHY890rN15bcPLY9OZfAfn3wiY1pUKzWkhL2f/YNe9/7qKY4miEkmCEvP4tfHaVBNEYDQQP6sfbmO+nzwD1kL/2NzQ8/CU4npqgI+tx/N0GD+qPtxIcytRcqUbSArXvLmPXyjprigGu2lbBuewn3XdOdmAgTveK96ZNY91p4AKdTuq31o3QOu3btqpUkDtm2bRspe/c2KVFAdbIICwtj5MiRAKxfv55ly5bVeowQgkcfe4yw8PBa7Xp/P0JHDCWgby8cZgvm7FzW3nQ7TsvhxRXR55xBRep+HBWVta6VNhuWvIIGJ4qynXvY++6HtdqsBYX8d/cDDHvzReIvnULaJ1/W6u967RWkLfiC2Cnnkf71dxT9t6mmz5yVw/qZsznho3n4JXVrUAxK06lxjmYqKrXy8mepLhVknRI+/yWTE/sHsTu9kivOjiE0yMCoIUFun2fiiWEEqwnsTmvTxo119m3burXFXqdv3758t2gR4ydMICoqilNOPZWvv/mGoUPdHjMAgN7XF1NoCP49u3PCgndIfuwBet0zk5EfzSOgby9SP/zU7XVaU8NWIzmsVvZ/9pXbPnNWDtaiYhKvvJQhr84l/LSTCBk5jAHPPEbkuNGU7tiJX4/utZJEDaeT/V98i9Nux2G1UpmRRUXaAazFrjvSleZRdxTNVGl2ciDHdUIQYM+BSjLyLDwzv3pi0Nuk5ZHrk8grsrJ17+FlhvFRJiafFoFWzU+0C3a7naysLDIzM5FOJ1HR0URFRTXr3Olu9Zxel9CCZ0AYjUaSk5N58cUXqSgvx9vHB98jhpzqo9Hr8YmLxScutqbNaXW/8dMrJhpjA/d7SLsD+1F3JEdy2mwYggIJGT6EoEEDkNKJ1mDAXlmJd0J8nTEAVOxLw1pQyN73Pybj+5+RNht+PbrTe/Yd+PfuofZhtBD1U2wmvU7g562lrNJ1p3awv56yysMb8irNDv7vrV28NjuZlPRK9mdX0aerL127eBPWhONSlZZnt9v5559/uOH662sO+DEajbz44ouMHjMGk6lpxRqTk5MJDg6uOZTokLDwcHr16tXsuI/m4+NTb+mPBj9PQjy9772Tnc+/gtNavQjDO7YLA+c+iSmsYauPdN5eRJ890e1dgdbLhPGIEupH7sfQeXvT7borqMrMBo2m1rzJIcHDBrFvwZekf3N49VfZrj2svel2Rn70Nr6JDT/0SambShTNFBpo4LIzuvDm1/td+s4dHcmSv/NqtVVZnBSUWBk7XB2w0h6lp6dzzdVX11ohZLFYuOWWW/h5yRJ69Gj4noHKykpSU1P5/LPPqKys5N133+Wpp55izZrqFUUjR47kiSefJCamYeP8nqD38yX67NMJGT4YS34BGoMBU3hYo5eoBg8fgl+vJMp21C6n3uf+uzFF1H1n4tetKwhBl3POIOO7H2r16fx8iRg7ir8vda1P5bTayFj0Az1m3IDogOeAtzcqUTSTRiMYNzyU8ko7XyzLwmqTmAwazh8Tid3uJCXd9ZbbYlOT1u3V1q1bayWJQ5xOJ3/88UeDE4Xdbmf58uXMuOWWmkUKS5YsYfr11/PY449jMBgIDQ1t9JnYnqA1GDBFRqL18kJoNE0qK+4VEc6gOU9QsmU7Wb/8iikinOizJ+Id26Xe4SGtl4nAvr0xBAVWz5d8/DnW4hLCTjmBrldehs3Nsa6HlO7YjcNmQ6cSRbOpRNECggMMXH5WDKefEE5JuY2SchsgeOB116qaGgEx4eqsifaqvKzuNf1FRUUNfp6srCzunT271kq20tJSnps7Fz8/Py6//HIKCgrIz89v1jGnbaEyM4uMRT+S/fOvaE1G4i+dQsiJIzA18q7CFBGOKSKciLGnNToG7+govM89m7BTTkQ6HOj9/dGajJSl7KvzGrV0tuWoRNFC9DoNXcJNdAk3UWm2U1Rq44R+Qfy9ufaby/UXxBEWpP7xtlf9Bwyos2/06NENfp68vDzK3CQdf39/4mJjeW7uXBYuXIjRaOSaa69lwoQJTTp3orVVZWWzbsbdVB2xwW3rE3OIPH0cve6+FUOAf5vGc/S5F6bwMCJPH0v2ktoHLml9vIk6fRxCoxaItASVKFqBt0mHt0nHXdMSSUmPYOk/eXh76Zh4Qhgx4Sa8jOpWuL2Kjo7m2uuu49133qnVfs4555CYkNDg5zHo3S91fuDBB3n00UdJS0uraXvowQf5c9Uq/vf007VOvmsPijdtrZUkDslesozEKy5p80RxNL2fLz1uuxHfbomkLfgCW1k5YSeNoPvN0/GOa79zPx2NShStJCO3ij83FrEzrZwT+gfTr7sfoYEGtJrml2RWWk9AQAC33HIL48eP57NPP8VitTJ16lR69+5NyDGGiNLS0vjrr7/Y8N9/XHDhhXTr1o2UlMM1k6KioigvK6uVJA75+eefufW229pdosj7c3WdfZUZWe1is5spLJTEK6YSfeYEpNOJ3s8PnY+3p8PqVFSiaAVpWZXcNmdrzZLZ5WsLMeo1vHh3H3rGN2xNu+I5wcHBjBw5khEjRiClRNOA4Ytdu3Zx0ZQpFBcXA7Bs2TKeefZZ/u/hh8nIyAAgKSmJrfVsrktLS6Nv374t8j00l8PhoKysDO/42DofYwhqPxPxQqPBFN74s8WVhlGJopEKiq1UmB0Y9BrCAg011WIPqbI4eH9Rusu+CovNyYuf7OPpW3sR4Kt2YHcEQghEAw7lKSst5fHHHqtJEgAFBQXcd999PProo4SEhFBZUUFCYiK//PJLnc/TXia1Dxw4wDfffMOiRYt49f8eRej1SFvtQpamqAi8oppWdkTpeNRMTwNVmh38tamQGXO2ctUjG7nu8U18uiSDwpLau0bLKuz8udH96pidaRVuT8RTOrbCoiJWrlzp0p6Xm8uMW25hf1oa1157LffOns0ZZ5xBcnKyy2O7dOlCbGzdn97bSvqBA1w6dSovPP88KXv28ODzc+ly/52YIg9PtAf068OQl+eoT/DHEXVH0UC7D1Tw4Ou7ar6uNDt4b1E6ZquTK8+OQa+rzrlCgLdJ43antk4r1BxFJ6TRaNDr9diO+tQN1WdDGIxGnn/hBdLS0nj2mWeYNGkSt952G888/TR79+5lyJAhzJk7l6ioqDpfw2KxkJOTg81mIyAgoNXuPv786y8OHDhQ8/W6//7jhv89wW1XX8Oo4cPx8vbFEBrs8UlspW2pRNEAZZV23lvouvMa4KtfszjzpHCiw6r3RgQHGLhgTBQfLHY9Z2Dc8FBCAtTS2M4mNDSUyZMn89VXroXvzj//fEJCQph5220UFFSferh48WJ8fX1Z8Mkn+Pr4EBIaSmBgYJ3Pn5mZySuvvMLXX32F1Wqle1IS/3vqKQYMHNis+lNHczgcLPn5Z5f2AwcOcM9jj/LxggWc3M/1bkjp/NTQUwNYrE4O5Lov/Ge1SSoth+8etBrBmSeHc0K/2qtX+nb15cqzYzAa1I+8vbDZbOzZs4e3583jgQceYNnSpWRlZTX6eby8vJh5++306dOnVntycjKTzz2X+R98UJMkDikvL+eJxx8nNCys3iRRXFzMAw88wKeffIL1YHG8Pbt3c+mll7JvX/Vms8rKSjIyMsjKysJub/rQplarJbGeAoUNLS6odD7qjqIBvIwakmJ9WLPNtXyxt0mLj6n2vojQQAOzr+pKXpGV4jIbfj56woMMBPqpSez2ZN3atVxxxRU1b8ALPv6YPn368PY779QcGdpQsbGxfDB/PukHDpCRmUlgYCCbN23iwP79LF++3O01a9asobCwsN4yHjk5OSz/7TeXdpvNxqJFizjvvPN48YUX+Pnnn/H29uaKK67gsmnT6h3Gqs+UKVN4//33cR5VgC8hIYGoo87MsJaUUJWZQ8nW7RiDAvHr0R2v6EhVW6kTUh9vG8DHS8c1k2JxN71w5dldCHdT+dXfR0+3GB+G9A6kR5yPShLtTFZWFjNnzqxJEods27aNn3/6qUmHSIWHhzN4yBDOOeccunXrxuIffsBisdRZcVan06E9xptqSUndZysMGjSIi6ZMYfHixdjtdkpLS3n11Ve56667XO5gGiqxa1fefuedWnMg/fv3572jTuGzFBSy88XX+efKG9jx7ItsvO8R/r7sOoo3b1MHcHVCKlE0UGIXL166py99u/qiERAZYuTeq7oxfkSYyxJZpf3Lz88nJyfHbd/nn3/eqLpO7kRHR/P2228Tn5DAlClT3D7mnEmTCDvGmQ7BwcFul+h269aNvSkpLmXLAf76888mDaFBdUn1MWPGsOj771n0/ff8vGQJH8yfT9euXWs9rmTbDrJ+qL3U12E2s3H2w5hzcpv02kr7pYaeGsig19K3qx9P3tKTKosTvVYQrCamO6z6PskbjcYGbbI7FqPRiL+/PxdccAHbtm3jn3/+qenr07cvd955J15eXvU+R2RkJBdffDGfffZZrfaePXuycZObU98Oys7OdrsMtyGEEERHRxMdHe2232GxcODLhW77rEXFWPLy8Ypsf3WrlKZTiaKR/H30+Df/PBjFw8LCwuielMSe3btd+q659tp6J5gbIjMzk9tnzuTff//FYDBw0003cdXVVyOlJDoqii5duricYe2Or68vd951F92TknjrrbcoKixk1OjRzJo9m19++YUfFi+u8/trNRKkw3X59+F+NfTU2aihJ+W4FBYWxquvvuqyH+Gcc87hpJNOatZz2+12PvrwQ/79918ArFYrL730EjffdBPLli6lR8+eDUoSUL1/oqiwEJvNxn333cdHH3/Mww8/TEJCAuPGjXN7il1ycnKddwNNUVxczI4dO1izZg0pe/ZgcTqIOf8ct4/V+fliDGsfO8yVliM648TT0KFD5dq1az0dhtIBZGRksG/fPgoKCujevTvR0dHNLsyXlZnJhAkT3JYZ12q1/LZ8OfHxDTuic/XffzNt2rRay14DAwP5+ptv6Nq1K9u2bePhhx5i3bp16HQ6zpk0iTvvvLPFdnlnZmRw33338fvvvwPVmwuvuOIK7ph+PSnPvUr+EUUDhU7HoOefImTYYLXyqQMSQqyTUg5116eGnpTjWpcuXRq9FPZYpJRuT8mD6k1tjvqGbY6Qm5vLrFmzXPZGFBcX88brr/PEk0/St29f3n3vPYqKitBqNISFhx9z3qOhKisrmTt3bk2SgOqT/j744AN69erFeQ/eQ+WBdAr+XYcxJJigIYPw7hKlkkQnpIaeFKWFBQUHc+aZZ7rtGzJkCCEhDTsZrqioiP373VcE+OWXX2pWZgUGBpKYmEhcfHyLJQmoTlTfffed277XXnuNEoedoIH96X791cReMBnfhDg0dZzDoXRsKlEoSgs7tFP76HkIf39/nnjyyQafk20wGOpcfRUQEICunrOmW4LVaq3z7qeoqAhHM3aBKx2LGnpSlFaQmJjIN998w7///MPq1avp378/p5x6aoPnJgAiIiKYeMYZ/PjDDy59N950U+uubKL6TiUuLs7tXc3o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EEJogdeAM4A+wFQhRJ+2CU9pj3Jycph+3XX88ccfPPDgg3z//fdcc801nH3WWVxx+eXs3LnT0yEqzbDsnzwuuX89Y29czSX3r2fZP407rrM+K1asYPTo0Vx66aX069cPqL7bAMjKyuLUU09l4MCBJCcns3LlSpfrt27dyvDhwxk4cCD9+/dn9+7dAHz88cc17TfccAMOh4N7772XqqoqBg4cyGWXXQbA888/T3JyMsnJybz44osAVFRUcNZZZzFgwACSk5P5/PPPAXjssccYNmwYycnJXH/99XXWmmpTdZWVbYtfwApgaB19JwBLjvj6PuC+hjyvKjPeOa1evVrGx8XJhQsXyuS+fWV8XFytX4MGDpQHDhzwdJjKQY0pM750da6ceOs/cvQNf9f8mnjrP3Lp6txmxeDj4yOllHL58uXS29tb7t2716Vv7ty58oknnpBSSmm322VpaanL88yYMUN+/PHHUkopLRaLrKyslNu2bZNnn322tFqtUkopb7rpJjl//vxazy2llGvXrpXJycmyvLxclpWVyT59+sj169fLr776Sl533XU1jysuLpZSSllQUFDTNm3aNLlo0aJm/QzcaWyZ8fY8PtIFOHDE1+kH29wSQlwvhFgrhFjb2IPDlY4hZc8eoqKiyM7OdltwrbCwkB07dnggMqW53vnuABZr7ZPkLFYn73x3oI4rGm/48OEkJia6tA8bNoz333+fRx55hM2bN+Pn5+fymBNOOIGnnnqKZ555hrS0NLy8vPj1119Zt24dw4YNY+DAgfz666/s3bvX5dpVq1Zx3nnn4ePjg6+vL+effz4rV66kX79+LFu2jNmzZ7Ny5cqa+lHLly9nxIgR9OvXj99++42tW7e22M+gqVotUQghlgkhtrj5NbmhT+Gmrc57MCnlPCnlUCnl0LCwsKYFrbRr8fHxhISEkJWZWedj0tPT2zAipaXkFVob1d4UR5YOP9Kpp57KH3/8QZcuXbj88sv58MMP+fbbbxk4cCADBw5k7dq1XHrppSxatAgvLy9OP/10fvvtN6SUXHnllWzYsIENGzawc+dOHnnkEZfnl3UMHfXo0YN169bRr18/7rvvPh577DHMZjM333wzX331FZs3b2b69Ok1pc89qdUShZRynJQy2c2v7xr4FOlA7BFfxwB1v0MonV63bt1wOBz0rKPKJ0Dfvn3bMCKl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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Time for running PCA of scikit-learn: 0.00299 seconds.\n" ] } ], "source": [ "# Scikit-learn's PCA\n", "import sklearn.decomposition\n", "pca = sklearn.decomposition.PCA(n_components=2)\n", "\n", "start = time.time()\n", "pca.fit(x)\n", "mat_reduced = pca.transform(x)\n", "end = time.time()\n", "\n", "principal_df = pd.DataFrame(mat_reduced , columns = ['PC1','PC2'])\n", "principal_df = pd.concat([principal_df , pd.DataFrame(target)] , axis = 1)\n", "plt.figure(figsize = (6,6))\n", "seaborn.scatterplot(data = principal_df , x = 'PC1',y = 'PC2' , hue = 'target' , s = 60 , palette= 'icefire')\n", "plt.show()\n", "\n", "print(f\"Time for running PCA of scikit-learn: {end-start:.5f} seconds.\")" ] }, { "cell_type": "markdown", "id": "scheduled-keyboard", "metadata": { "id": "81ee2933" }, "source": [ "The comparison shows that our implementation of PCA performs as well as scikit-learn's PCA and takes similar amount of time." ] }, { "cell_type": "markdown", "id": "welsh-brown", "metadata": { "id": "98702ef6" }, "source": [ "## 2. Implement KPCA from Scratch" ] }, { "cell_type": "markdown", "id": "historic-ladder", "metadata": { "id": "d66b2506" }, "source": [ "If we are dealing with nonlinear problems, which we may encounter rather frequently in real-world applications, linear transformation techniques for dimensionality reduction such as PCA may not be the best choice. " ] }, { "cell_type": "markdown", "id": "sexual-significance", "metadata": { "id": "b6fba422" }, "source": [ "In this section, we will implement a kernelized version of PCA (or KPCA). Using KPCA, we will learn how to transform data that is not linearly separable onto a new, lower-dimensional subspace that is suitable for linear classifiers." ] }, { "cell_type": "markdown", "id": "promotional-jason", "metadata": { "id": "4d8af08c" }, "source": [ "### 2.1 Computation of the Kernel (Similarity) Matrix\n", "First of all, we need to calculate RBF kernel matrix:\n", "$$\n", "\\mathcal{K}\\left(\\mathbf{x}^{(i)}, \\mathbf{x}^{(j)}\\right)=\\exp \\left(-\\gamma\\left\\|\\mathbf{x}^{(i)}-\\mathbf{x}^{(j)}\\right\\|_{2}^{2}\\right),\n", "$$\n", "for every pair of points. \n", "\n", "For example, if we have a dataset of $100$ samples, this step would result in a symmetric $100\\times100$ kernel matrix." ] }, { "cell_type": "markdown", "id": "graphic-timing", "metadata": { "id": "3bdfddc5" }, "source": [ "### 2.2 Eigendecomposition of the Kernel Matrix" ] }, { "cell_type": "markdown", "id": "cloudy-dylan", "metadata": { "id": "3e6c01ea" }, "source": [ "Since it is not guaranteed that the kernel matrix is centered, we can apply the following equation to do so:\n", "$$\n", "K^{\\prime}=K-\\mathbf{1}_{\\mathbf{M}} K-K \\mathbf{1}_{\\mathbf{M}}+\\mathbf{1}_{\\mathbf{M}} K \\mathbf{1}_{\\mathbf{M}},\n", "$$\n", "where $\\mathbf{1}_{\\mathrm{M}}$ is (like the kernel matrix) an $M \\times M$ matrix with all values equal to $\\frac{1}{M}$[1].\n", "\n", "[1] *B. Scholkopf, A. Smola, and K.-R. Muller. Nonlinear component analysis as a kernel eigenvalue problem. Neural computation, 10(5):1299–1319, 1998.*" ] }, { "cell_type": "markdown", "id": "fiscal-welcome", "metadata": { "id": "jl75ckWmy2pt" }, "source": [ "Finally, we obtain the eigenvectors of the centered kernel matrix that correspond to the largest eigenvalues. Those eigenvectors are the data points already projected onto the respective principal components (see the second equation of the first line of Page 11 of Lecture Slide 8.2)." ] }, { "cell_type": "markdown", "id": "current-beast", "metadata": { "id": "740006a6" }, "source": [ "### 2.3 Complete Code for Our Implementation" ] }, { "cell_type": "markdown", "id": "optimum-instruction", "metadata": { "id": "023e96e4" }, "source": [ "Using some SciPy and NumPy helper functions, we implement the RBF KPCA as follows." ] }, { "cell_type": "code", "execution_count": 12, "id": "champion-repair", "metadata": { "id": "0df04409" }, "outputs": [], "source": [ "from scipy.spatial.distance import pdist, squareform\n", "from scipy.linalg import eigh\n", "import numpy as np \n", "from numpy import exp\n", "# from google.colab import drive\n", "# drive.mount('/content/drive')\n", "# %cd /content/drive/MyDrive/Colab_Notebooks/lecture\\ 8\n", "\n", "def rbf_kernel_pca(X, gamma, n_components):\n", "\n", " \"\"\"\n", " RBF kernel PCA implementation. \n", " Parameters\n", " ------------\n", " X: {NumPy ndarray}, shape = [n_examples, n_features] \n", " gamma: float\n", " Tuning parameter of the RBF kernel \n", " n_components: int\n", " Number of principal components to return \n", " Returns\n", " ------------\n", " X_pc: {NumPy ndarray}, shape = [n_examples, k_features]\n", " Projected dataset \n", " \"\"\"\n", " \n", " # 1. Calculate pairwise squared Euclidean distances in the mxn-dimensional dataset.\n", " sq_dists = pdist(X, 'sqeuclidean') \n", " \n", " # 2. Convert pairwise distances into a square matrix.\n", " mat_sq_dists = squareform(sq_dists) \n", " \n", " # 3. Compute the symmetric kernel matrix.\n", " K = exp(-gamma * mat_sq_dists) \n", " \n", " # 4. Center the kernel matrix.\n", " M = K.shape[0]\n", " one_n = np.ones((M,M)) / M\n", " K = K - one_n.dot(K) - K.dot(one_n) + one_n.dot(K).dot(one_n) \n", " \n", " # 5. Obtain eigenpairs from the centered kernel matrix. (scipy.linalg.eigh returns them in ascending order.)\n", " eigvals, eigvecs = eigh(K)\n", " eigvals, eigvecs = eigvals[::-1], eigvecs[:, ::-1] \n", "\n", " # 6. Collect the top k eigenvectors (projected examples)\n", " X_pc = np.column_stack([eigvecs[:, i] * np.sqrt(eigvals[i])\n", " for i in range(n_components)]) \n", " \n", " return X_pc" ] }, { "cell_type": "markdown", "id": "better-perfume", "metadata": { "id": "BmaIQmycv3m3" }, "source": [ "### 2.4 Apply Our RBF KPCA on a Nonlinear Example Dataset" ] }, { "cell_type": "markdown", "id": "interstate-reservation", "metadata": { "id": "d69a399b" }, "source": [ "Now, let us apply our RBF KPCA on a nonlinear example dataset. We will start by creating a two-dimensional dataset of $100$ example points. For illustration, the half-moon of triangle symbols will represent one class, and the half-moon depicted by the circle symbols will represent the examples from another class." ] }, { "cell_type": "code", "execution_count": 13, "id": "entire-collector", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 297 }, "executionInfo": { "elapsed": 6, "status": "ok", "timestamp": 1665891291308, "user": { "displayName": "陈浩宇", "userId": "15940747847737534674" }, "user_tz": -480 }, "id": "e3705e04", "outputId": "a72467d3-06e7-4a06-b6c6-b4678f344251" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from sklearn.datasets import make_moons\n", "from matplotlib import pyplot as plt\n", "\n", "X, y = make_moons(n_samples=100, random_state=123)\n", "\n", "plt.scatter(X[y==0, 0], X[y==0, 1],\n", " color='red', marker='^', alpha=0.5)\n", "\n", "plt.scatter(X[y==1, 0], X[y==1, 1],\n", " color='blue', marker='o', alpha=0.5)\n", "\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "latin-sapphire", "metadata": { "id": "0f631532" }, "source": [ "These two half-moon shapes are not linearly separable, and our goal is to unfold the half-moons via KPCA so that the dataset can serve as a suitable input for a linear classifier. But first, let’s see how the dataset looks if we project it onto the principal components via standard PCA." ] }, { "cell_type": "code", "execution_count": 14, "id": "parental-champion", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 225 }, "executionInfo": { "elapsed": 823, "status": "ok", "timestamp": 1665891292126, "user": { "displayName": "陈浩宇", "userId": "15940747847737534674" }, "user_tz": -480 }, "id": "3da87536", "outputId": "0b734f6d-5feb-49df-d98b-c962eca957c9" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from sklearn.decomposition import PCA\n", "scikit_pca = PCA(n_components=2)\n", "X_spca = scikit_pca.fit_transform(X)\n", "fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(7,3))\n", "ax[0].scatter(X_spca[y==0, 0], X_spca[y==0, 1],\n", " color='red', marker='^', alpha=0.5)\n", "ax[0].scatter(X_spca[y==1, 0], X_spca[y==1, 1],\n", " color='blue', marker='o', alpha=0.5)\n", "ax[1].scatter(X_spca[y==0, 0], np.zeros((50,1))+0.02,\n", " color='red', marker='^', alpha=0.5)\n", "ax[1].scatter(X_spca[y==1, 0], np.zeros((50,1))-0.02,\n", " color='blue', marker='o', alpha=0.5)\n", "ax[0].set_xlabel('PC1')\n", "ax[0].set_ylabel('PC2')\n", "ax[1].set_ylim([-1, 1])\n", "ax[1].set_yticks([])\n", "ax[1].set_xlabel('PC1')\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "arranged-consensus", "metadata": { "id": "5066537b" }, "source": [ "We can see in the resulting figures that a linear classifier would be unable to perform well on the dataset transformed via standard PCA." ] }, { "cell_type": "markdown", "id": "compact-cyprus", "metadata": { "id": "f6498da2" }, "source": [ "Now, let’s try out our kernel PCA function, ``rbf_kernel_pca``." ] }, { "cell_type": "code", "execution_count": 15, "id": "invisible-blackjack", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 225 }, "executionInfo": { "elapsed": 6, "status": "ok", "timestamp": 1665891292126, "user": { "displayName": "陈浩宇", "userId": "15940747847737534674" }, "user_tz": -480 }, "id": "92c7ba93", "outputId": "ddda35ae-6e98-4066-cab3-df528201bc2f" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "X_kpca = rbf_kernel_pca(X, gamma=15, n_components=2)\n", "fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(7, 3))\n", "ax[0].scatter(X_kpca[y==0, 0], X_kpca[y==0, 1],\n", " color='red', marker='^', alpha=0.5)\n", "ax[0].scatter(X_kpca[y==1, 0], X_kpca[y==1, 1],\n", " color='blue', marker='o', alpha=0.5)\n", "ax[1].scatter(X_kpca[y==0, 0], np.zeros((50,1))+0.02,\n", " color='red', marker='^', alpha=0.5)\n", "ax[1].scatter(X_kpca[y==1, 0], np.zeros((50,1))-0.02,\n", " color='blue', marker='o', alpha=0.5)\n", "ax[0].set_xlabel('PC1')\n", "ax[0].set_ylabel('PC2')\n", "ax[1].set_ylim([-1, 1])\n", "ax[1].set_yticks([])\n", "ax[1].set_xlabel('PC1')\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "purple-consideration", "metadata": { "id": "51d0133a" }, "source": [ "We can now see that the two classes (circles and triangles) are linearly well separated so that we have a suitable training dataset for linear classifiers." ] }, { "cell_type": "markdown", "id": "vocal-gravity", "metadata": { "id": "ff51ca8a" }, "source": [ "### 2.5 Comparison of Our KPCA Implementation with Scikit-learn's" ] }, { "cell_type": "markdown", "id": "improving-tractor", "metadata": { "id": "3852b3b0" }, "source": [ "In this subsection, we will compare our RBF KPCA implementation with that of scikit-learn. " ] }, { "cell_type": "markdown", "id": "isolated-columbus", "metadata": { "id": "7c49f4cc" }, "source": [ "The below code applies scikit-learn's RBF KPCA on the example dataset." ] }, { "cell_type": "code", "execution_count": 16, "id": "labeled-employee", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 243 }, "executionInfo": { "elapsed": 5, "status": "ok", "timestamp": 1665891292126, "user": { "displayName": "陈浩宇", "userId": "15940747847737534674" }, "user_tz": -480 }, "id": "c74ba11c", "outputId": "c484a64e-9404-4d29-fe28-6a14b7aae4d2" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Time for running KPCA of scikit-learn: 0.006 seconds.\n" ] } ], "source": [ "import time\n", "from sklearn.decomposition import PCA, KernelPCA\n", "\n", "# RBF kernel PCA of scikit-learn\n", "start = time.time()\n", "kpca_skl = KernelPCA(kernel=\"rbf\", gamma=15)\n", "X_kpca_skl = kpca_skl.fit_transform(X)\n", "end = time.time()\n", "\n", "# Plot KPCA features\n", "fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(7, 3))\n", "ax[0].scatter(X_kpca_skl[y==0, 0], X_kpca_skl[y==0, 1],\n", " color='red', marker='^', alpha=0.5)\n", "ax[0].scatter(X_kpca_skl[y==1, 0], X_kpca_skl[y==1, 1],\n", " color='blue', marker='o', alpha=0.5)\n", "ax[1].scatter(X_kpca_skl[y==0, 0], np.zeros((50,1))+0.02,\n", " color='red', marker='^', alpha=0.5)\n", "ax[1].scatter(X_kpca_skl[y==1, 0], np.zeros((50,1))-0.02,\n", " color='blue', marker='o', alpha=0.5)\n", "ax[0].set_xlabel('PC1')\n", "ax[0].set_ylabel('PC2')\n", "ax[1].set_ylim([-1, 1])\n", "ax[1].set_yticks([])\n", "ax[1].set_xlabel('PC1')\n", "plt.tight_layout()\n", "plt.show()\n", "print(f\"Time for running KPCA of scikit-learn: {end-start:.3f} seconds.\")" ] }, { "cell_type": "markdown", "id": "attached-bottom", "metadata": { "id": "94fade76" }, "source": [ "Next, we apply our RBF KPCA implementation on the same dataset." ] }, { "cell_type": "code", "execution_count": 17, "id": "derived-lawsuit", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 243 }, "executionInfo": { "elapsed": 684, "status": "ok", "timestamp": 1665891292806, "user": { "displayName": "陈浩宇", "userId": "15940747847737534674" }, "user_tz": -480 }, "id": "3fd8498b", "outputId": "bc6fa024-9e9d-4497-ce2b-b19aa00ba7d0", "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Time for running our KPCA implementation: 0.002 seconds.\n" ] } ], "source": [ "# Our implementation of RBF kernel PCA\n", "start = time.time()\n", "X_kpca = rbf_kernel_pca(X, gamma=15, n_components=2)\n", "end = time.time()\n", "\n", "# Plot KPCA features\n", "fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(7, 3))\n", "ax[0].scatter(X_kpca[y==0, 0], X_kpca[y==0, 1],\n", " color='red', marker='^', alpha=0.5)\n", "ax[0].scatter(X_kpca[y==1, 0], X_kpca[y==1, 1],\n", " color='blue', marker='o', alpha=0.5)\n", "ax[1].scatter(X_kpca[y==0, 0], np.zeros((50,1))+0.02,\n", " color='red', marker='^', alpha=0.5)\n", "ax[1].scatter(X_kpca[y==1, 0], np.zeros((50,1))-0.02,\n", " color='blue', marker='o', alpha=0.5)\n", "ax[0].set_xlabel('PC1')\n", "ax[0].set_ylabel('PC2')\n", "ax[1].set_ylim([-1, 1])\n", "ax[1].set_yticks([])\n", "ax[1].set_xlabel('PC1')\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "print(f\"Time for running our KPCA implementation: {end-start:.3f} seconds.\")" ] }, { "cell_type": "markdown", "id": "placed-accreditation", "metadata": { "id": "208c7c81" }, "source": [ "The comparison shows that our RBF KPCA implementation performs as well as scikit-learn's RBF KPCA and takes similar amount of time." ] } ], "metadata": { "colab": { "collapsed_sections": [], "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.7" } }, "nbformat": 4, "nbformat_minor": 5 }