{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import scipy.linalg as la" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "np.set_printoptions(formatter={'float': '{: 0.1f}'.format})" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "np.random.seed(123)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "%load_ext rpy2.ipython" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Applications of SVD" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Reconstruction" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "iris = %R iris" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "X = iris.iloc[:, :-1].values" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 5.1, 3.5, 1.4, 0.2],\n", " [ 4.9, 3.0, 1.4, 0.2],\n", " [ 4.7, 3.2, 1.3, 0.2],\n", " [ 4.6, 3.1, 1.5, 0.2],\n", " [ 5.0, 3.6, 1.4, 0.2]])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X[:5]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "U, s, Vt = la.svd(X, full_matrices=False)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((150, 4), (4,), (4, 4))" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "U.shape, s.shape, Vt.shape" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 5.1, 3.5, 1.4, 0.2],\n", " [ 4.9, 3.0, 1.4, 0.2],\n", " [ 4.7, 3.2, 1.3, 0.2],\n", " [ 4.6, 3.1, 1.5, 0.2],\n", " [ 5.0, 3.6, 1.4, 0.2]])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(U @ np.diag(s) @ Vt)[:5]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## PCA" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Center the data" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "Xc = X - X.mean(0)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-0.7, 0.4, -2.4, -1.0],\n", " [-0.9, -0.1, -2.4, -1.0],\n", " [-1.1, 0.1, -2.5, -1.0],\n", " [-1.2, 0.0, -2.3, -1.0],\n", " [-0.8, 0.5, -2.4, -1.0]])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Xc[:5]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Find SVD" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "U, s, Vt = la.svd(Xc, full_matrices=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "PCA is $U \\Sigma$" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "Y = U[:, :2] @ np.diag(s[:2])" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(Y[:, 0], Y[:, 1],\n", " c=iris['Species'].astype('category').cat.codes)\n", "plt.xlabel('PC1')\n", "plt.ylabel('PC2')\n", "pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "PCA is also $XV$" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "Z = X @ Vt.T[:, :2]" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(Z[:, 0], Z[:, 1],\n", " c=iris['Species'].astype('category').cat.codes)\n", "plt.xlabel('PC1')\n", "plt.ylabel('PC2')\n", "pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check with PCA routine. It should be the same (eigenvectors may flip)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "from sklearn.decomposition import PCA" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "pca = PCA(n_components=2)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "Y1 = pca.fit_transform(Xc)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(Y1[:, 0], Y1[:, 1],\n", " c=iris['Species'].astype('category').cat.codes)\n", "plt.xlabel('PC1')\n", "plt.ylabel('PC2')\n", "pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Flip directions for the second eigenvector" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEKCAYAAAAFJbKyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzsnXd4VNXWh9995kxLT0jovYM0qYKioiBYQRHsXbFc+3cv12uvV732XrEroAKKgg2kSROQ3qR3CJCQNvWcs78/JoRMZtJIBfb7PPOQ2aet4Zk56+y11v4tIaVEoVAoFIqyotW0AQqFQqE4tlCOQ6FQKBTlQjkOhUKhUJQL5TgUCoVCUS6U41AoFApFuVCOQ6FQKBTlQjkOhUKhUJQL5TgUCoVCUS6U41AoFApFudBr2oCqIDU1VTZv3rymzVAoFIpjhiVLlhyQUqaVZd/j0nE0b96cxYsX17QZCoVCccwghNhW1n1VqEqhUCgU5UI5DoVCoVCUC+U4FAqFQlEulONQKBQKRblQjkOhUCgU5UI5DsVxTY7fz197drM7J7umTVEojhuOy3JchUJKyesL5/PukkU4bBoB06RPoya8ce4FxDudNW2eQnFMo2YciuOSH/5ex/t/LcJvGuQEAvhNkwW7djB62s81bZpCccyjHIfiuOT9vxbhNYywsYBpMmPrFrL9vhqySqE4PlCOQ3FckuHxRh23CUGWz1/N1igUxxfKcSiOS/o1aYomRMS4226nYXx8DVikUBw/KMehOC6575RTiXc4sWuhr7gAXLrOk2eejU2rnV97KSXSOwnrwHCs/UOwcl5GWqoaTFH7UFVViuOSRgkJ/HTVtXywZDELdu2gSWIit3bvxckNGta0acUis58A7yQgP8yW9xHSNxXqTEZoMTVqm0JRGOU4FMct9ePieeSMATVtRpmQ5m7wTgAK518CYO5Her9DxF5ZU6YpFBHUzjm7QnGiEVwOwh5lgxcCf1S7OQpFSSjHoVDUBrQ0wIqyQQdbo+q2RqEoEeU4FIragL1HvvMo+pO0I2JUmEpRu1COQ6GoBQghECmfgX4S4AQRA1oKIvl1hN6ips1TKMJQyXGFopYgbA0QqRNCiXLpAVsLhLDVtFkKRQTKcSgUtQxhq70lwwoFqFCVQqFQKMqJchwKhUKhKBfKcSgUCoWiXCjHoVAoFIpyoZLjimOWHL+faZs34TGCnN60OU0SE2vaJIXihKBGHYcQ4iPgAiBdStkpynYBvAacB3iA66WUf1WvlYrahCUlX6xYxtuLF5Kel4dNCPR8tdtbuvfi/r6n1rCFCsXxT02Hqj4BhpSw/VygTf5rFPBONdikqMU8OmMaz/0xi/S8PABMKfGbJn7TZMzSxSzavbOGLVQojn9q1HFIKWcDGSXsMhT4TIZYACQJIRpUj3WK2kZ6Xi7frl2NzzSjbvcZBt+uWV3NVikUJx41PeMojUbAjkLvd+aPKU5A1h04gNNW/EpqSaivuEKhqFpqu+MoM0KIUUKIxUKIxfv3768RG/KyPezetJdgIFgj1z/eaZyQQNCKpiAbIsZu58K27avRIoXixKS2O45dQJNC7xvnj0UgpXxfStlTStkzLS2tWow7TMAf5MWb32ZE/Zu5tds/ubTuTXz35tRqteFEoGVyCl3q1sOuRc46XLrOWS1aMqC5EgRUKKqa2u44JgPXihCnAFlSyj01bVRR3rprDDPGziXoC+LL8+PJ9jLmga/4Y9LCmjbtuOP9Cy/m7BYtcWg27JpGvMPB4FZt+PiiS3ht8PmECvEUCkVVUtPluGOBM4FUIcRO4DHADiClfBeYSqgUdyOhctwbasbS4vHm+Zj2xWwCvvDwlM/j58tnJnDaxX1qyLLjkwSnk7fPv4i8QACPESTVHaOchUJRzdSo45BSXlHKdgn8o5rMOSpyM/MQWvQb14GdJRWMKSpCrMNBrMNR02YoFCcktT1UVetJaZCE0x15AxNC0LFv2xqwSKFQKKoW5TgqiM1mY9QL1+KMcRaMCU3gjHVyw9MlTqgUCoXimERpVVUCg68fQEr9JL58egL7tu2nQ9+2XPf4SJp1bFL6wQqFQnGMoRxHJdFryMn0GnJyTZuhUCgUVY5yHApFJbM5M4N3Fi9k5b59tK2Tyu09e9MhrW5Nm6VQVBrKcSgUlciq9H1cPmE8fsPAlJKNmRlM37KJMRddwimNVehScXygkuMKRSXy9OyZeIJBTCmBkAy81zB4dOa0GrZMoag8lONQKCqRZfuiCxtsysggqAQYFccJynEoFJVIotMVddyl2wsaTh0rSGMjVsZ1WHs7Yu07GSv7GaT017RZilrAsfVNVpwwBE2TXzdtYMzSJSzcuQOZH/qp7dzQrTtuPTx16NJ1ruzc5ZiRRpFWNlbWk8gD50NgPmCAzAPPOGTmHTVtnqIWoJLjilrHrpxsRn4zjmy/n6Blomsa7eqk8sXFI3Db7TVtXomM6tGLvbk5jFu9EofNRsA0Obd1W0b361/TppUJKb3Ig8PB3EGow0lh/BBYhDQ2IfRWNWGeopagHIei1vHPX38iPS+3IMEcME3W7E/njT/nM/rU02vYuiNIKSNmEZoQPH7m2dx7Sj+2ZWXROD6BOjExNWRh+ZGeyWCmA8X0PRE6GJtAOY4TGuU4FLWK3ECAJXt2FziNw/hNk4nr1tS44wiYJi/N+4OvVi3HEwzStV59nhgwkM5164Xtl+Ryk+Ry15CVFSA4D/AWv10aoLesNnMUtRPlOBS1CquEXIZp1VyeI9vvY9yqlXy4dDGZXm+BY1u2by9XTBjPlCuupVlSUo3ZV2nYmhC6LRhRNtrB0QOht65moxS1DZUcV9QqEpxOOqSmUTSNbNc0zmtTM2rDBz0ehnz5Ka8smMsBjydiNhQwDD5curhGbKtshPsy8lviFN0CrhGI5Ler2yRFLUTNOBS1jpfOOZcR34wjYJp4jSAxdjv1YuO4/5RTq+X683ds581FC9iWdYiu9epjt9k44PFgFNPv3JCSNfvTgZDcyFOzZ7Jg5w5i7Hau6tyVu3qfgt0W2e62MJaU7MvNJcHprNE+I0JvAsnvILP+DVY2YIHeHpH8OsLWoMbsUtQulONQ1Dpap9Rh9vU388Pf69h6KJOu9RowqFVrHKXcfCuDqRvW88/ffsZnhEI1e3NzkVJG1BcVRtc0Tkqry77cXC4e/xW5AT8S8JsGH/61mM2ZGbx53oUlXvOxmb+TFwxgScmQVm149uxzaqyCTDj7QdosMLeDcCFs9WvEDkXtRTkORa0k3unkys5dq/WaUkqemDWjwGlAyTmXwzhsNm7u3pPPVizFbxhhTsZnGkzfsokdWVk0SUyMOHbx7l3867ef8Ra65i+bNuAzDN69YGiFPk9FEEIDvXmNXV9Ru1E5DoUin0M+H1l+X7mO6dmgEeOHX0bTxCSW791LwIqUFXHYbGzIOBj1+HcX/xnmNCBUQTZr2xb25+WVyxaForpQMw6FIp9YhwOtmNXdCU4nfsPAbrNhWZKmSUl8Omw4aTGxBfu0S01l0e6dBIvkQoKWRfNiKq62Zx+KOm632dibl0tabGzU7QpFTaIch0KRj8NmY2THTny9ZlVYuMqt23ns9AH0bdKUVen7qB8Xz0lpdSMW/93QrTvjV68McxxOm42eDRrRMjkl6jV7NmjElszMiEotw7JomZRciZ+uZGRwPZhbQW+tVoUrSkU5DoWiEA/2PxO/afLdujXomoYE7up1CsPad0QIQf24+GKPbZyQyFeXjOThGdNYsz8dXdMY1q4jj5wxoNhj7ujVhykb1pMXDBbkU9y6zq09eldLdZW08pCZoyC4MrQqXBpIZx9E0lsIUXPVXYrajThWxOPKQ8+ePeXixdVXV5+X7eHvxZuIT4mjVdfmx4yYnaJ4cvx+9nvyaBSfgFOP/ny135PH58uXsXTvbtqkpHJ9t5NpmhgKSQXMkMZWcaGvwmw9lMlL8+eycNcOUt0x3NqzNxe1bV8t3yMr6z/g/QEIFBp1Quy1aPH/itzfCgA62jGm9KsoHSHEEillzzLtqxxHxZj4+hQ++s9X2Ow2LNMirUkqz/70EPWapVXL9RU1w7ZDhxg2/gu8hkHANLFrGrpm44uLL+XkBg1r2rwyIaWF3NeFcKeRj0hEq7eo4K3l/RGyHwbpCQ3YWkLKl2i2OtVjrKLKKY/jUI8NFWD5rNV89OBY/N4Anmwvvjw/u/7ezYPnPXPMyIArjo5n/5hFTiBAIL85U9Cy8BpBHvz9t6j778zOYnNmRi37XlhElxYB5JHqMiuwHLLuP+I0AMzNcODcqjVPUWtROY4K8N0bU/F7whvbWJYkffsBtqzcTssuzWrIMkVVM3fH9qhrPDZmHMQTDK12h9BK8tunTGZHdhYCSHa5eXXI+fRs2KhK7duTk8NnK5ay7sB+OtetzzVdukVUaAmhI+2dIbi8yNEaOPsdeZv9ZPSLyENYvplorjOR0gf+mWBlgaMvQm9aqZ9HUbtQjqMCZO7Lijpu021kH8ypZmsU1Ums3U5eMDLEYxMa9vz4f8A0ufzb8Rz0egoWBXpzc7j++wnMuO6msFLeymTN/nQu+3Y8AdMkaJnM37mDz1YsZeLIKyOqu0TCk8iMK0EGCYWsnCCciPgHj+xk7ij+YsG/kFoyMvNGwAJpARYy5kpE/AMq33ecokJV+Zimyco5a1nw4xJyMnPLdEy/ob1xuCMrT4yAQdueqqTxeObqLl1xFUmaOzQb57dtV6BLNWPrZrxFVpIDmJbFxDWrq8y2h37/jbxggGD+YsSAaZLj9/P07JkR+wp7B0TqTxB7EzgHQNxtiLRfEXqh2bKtBBl1ex9k5q0gc0JdAvECfvCOg8DsSv1citpDjToOIcQQIcR6IcRGIcQDUbZfL4TYL4RYlv+6uSrs2Lp6B1c1v4OHLvgvz179Gpc3GsXE134s9bgLbh1EWuM6OPOdhxDgjHFy8/NXExN/DPZiUJSZ23r2YVDLVjhtNuIdDly6TvcGDXnizLML9knPy8OUkcKIftPknSV/MuDTMbyyYC6eYLDS7DIsixX79kaMS2Dezu1RjxG2+mjx96Elv4cW9w+EVmTNScKj0S+mpSE0BxClD7n0Ij1fH3krJTKwCJk3Bun9UfUuP8apsVCVEMIGvAUMAnYCi4QQk6WUa4rsOl5KeWdV2WGaJg8MeZqDuzLCxj96aBzte7ehY992YeNG0GDupD9Z+vsq0prU4anJ/2bBj0uYP3kxyfUSGXbXeXTu36GqzFXUEnRN47UhF7AzO4v1Bw/QLDGJ1inhFUY9GjSMkIc/TLbfT7bfz/tLFjF98ya+u/xq9CIlrgHTZNHunViWpFejRrj00kUPNSGw57esLYq7DMdHPaejI1bSB5A1GmQmIEDvCikfQ3BZ6H00ZKghlJQBZMaNYKwCGQDhhOynoc5XCNUU6pikJnMcvYGNUsrNAEKIccBQoKjjqFLWzPsbT7YnYjzgDfDDu7+GOQ6fx899/R9h54Y9+HJ92J06456bxFOTH2DE/11UnWYragmNExJpnBApXgjQMa0u/Zs1Z862rRF6VIfxmyZbsw4xfcsmBrdqUzC+YOcObpvyfUEC3pKSVwefx8CWJTdR0oTg4nYd+W79GvyFnIfTZuOKTl3K+/GOnNd1BrgWRoxLRw+it5l1I9yh34TMGwPBFUB+pZY0AA/y0H2I1O+P2iZFzVGToapGQOGs2878saIMF0KsEEJ8K4RoUtlGeLI9URN4UkqyD4bnOr574ye2r9uJLzf0Awj6DXx5fp696jWsYno1KE5s3jz3Qv5z2hl0SE2jjjsm6oJATzDIkt27Ct5n+/3c/MMksv1+cgMBcgMBPMEgd/88hb25pRddPHLGALo3aIhL14l3OHDadE5r2px7+vSt1M8GIIQLEp4DXBQ8h4oYcJwMrgtC770TKXAaBUgwNiHN9Eq3SVH11Paqqh+AsVJKvxDiVuBT4KxoOwohRgGjAJo2LXsp4EmntscIRD4NumKd9B9+StjY9C9nE/BGxqM9uT62rdlJi06qBFERjq5pXN2lG1d36cbUDX/z72k/k1ckp+HSdRrGJxS8/3XThqjnsqTk+/VrubVH7xKvGWO38+UlI9lw8CBbDmXQOqVOsVpZlYHmHoK0d0R6J4KViXCeCc4zQtLsIcuLOVKUsE1Rm6nJGccuoPAMonH+WAFSyoPySBbtQ6BHcSeTUr4vpewppeyZllb2VdtxSbHc8vzVOGMcBTMPV6yTZh0bc9aVp4Xt63BGjxFLy8LhqpmmO4pjh7NbtMSl2yMyArrQGNb+SF4s2+/HMCNvqAHTJNtf9qRymzp1OKdVmyp1GocRelO0+HvREp9AuAYUchqA6yLAGXmQrbFqEnWMUpOOYxHQRgjRQoTU1C4HJhfeQQhRuFflRcDaqjBk2F3n8b9pj3H2NafT5/zu/OP1m3h59lMRjuLC2wfjig3/AQghqNcsjUatVVtNRck4dZ3xl15G+9Q0nDYbTptO88Qkvhw+kiTXkSq805o2Q9MiQ1oOm40mxeRTqpIdWVm8MG8O9/0yhQlrV+MvJl9THCL2FtBbh0JYAMINIh6R9HIVWKuoDmpUq0oIcR7wKmADPpJSPiOEeBJYLKWcLIR4lpDDMIAM4HYp5brSzltVWlWWZfH8tW/wx6Q/EQJsNhsOt4OXZz1Bk3ZVuxJYcWyyOn0faw7sp2lCIr0bNS6Y1e7NzcGUkoZx8VFzbI/8Po2J69bgNY6EtTQhcGgapzRuynsXDC21j3llMHvbVm6f8j2GZRG0LGLsdhrFJzBh5JXElUO9V0oT/LOQwWUIW0NwnY/QilcaVlQ/SuSwikUOt67eweq560hpkEyvId3Q7bU9VaSobvyGwS0/fMeSPbsQQiCABvHxjL3kMurExJR6vJSSGVu38H+//hTRldCl69zTpx+39uhVRdaHMC2LPmPeJcPrDRt32mz8o1cf7uxd+cl2Rc2hRA6rmOYnNeH8UYPoe2FP5TQUUXlr0QIW7d6F1zDwBIPkBYNsPXSIf0/7pUzHCyHoWq8+3iiLA32GwbhVKyrb5Ag2ZBwMa2h1GL9p8uOGvwGQVi4ysBRp7orYT3H8ou56ihOaDQcPMmbpYjYfyqR3w0Zc17V7pbRrHb96JX4z/KZrWBazt2/FZwTLtJgvaJkUJ/UUzF+jsTkzg8dn/c78Hdtx6jqXtO/IA6edUSCyWBHcuj2qkCNAjK5j5b4Jue+BcIAMIB09EElvqBDUCYCacShOWP7Yvo1h479gwtrVLN69iw+XLmHwF5+wMzu6eGV5iLZyG0LqyVsPRe8zXpR6sXFhZbqH0YXgvNZtOejxMPzrr5i7fRumlHiCQb5Zs4obJ0+skO2HaZaURNPExIi1J27dzr975EHuB4A/pFOFHwKLkFmRzZ8Uxx/KcZQDI2jwwzu/cFffB7nntIf4+eMZmMXcIBS1GyklD07/Fa9hFPT7Plzu+uK8Pyp8/rNbtEKPNl0QcPH4r7h58iR8RskaVUIIXh58Hg4tPAluSsnfGQcZu2o5viIiin7TZOW+vazZXzkL6947fxh1Y2OJtTuIsdtx2mxc1LY9vZJ+IiRoWJgg+P9AWpmVcm1F7UWFqsqIZVk8eN5/WTN/PX5PSE578/JtLJyyhMe+/Wexxx0uPlDy0rWLg14v6Z68iHELyR/bt1X4/P8+9XRmbN1Mpi88sW1Jid80mLtjG8/MnsVTZw0s8TytklMivjsSWLxnF9l+f5isyGE0IdiYcZCOaXWPyvbcQICxK5czfetm0mJieHXwefhNkwN5Hro3aEizpCSs9P8Wc7QNrGzQko/q2opjA+U4ysiy31exduGGAqcB4Mvzs/iXZaxftJF2vcI1hHas38Xrd3zA8llr0O06Z195Gre/eoNSza0lxNjtROid5xPvjLJYrQzszsnm0+VLWZW+j0bxCeQForRkzcdvmny7dhVPDDi7xL7kC3fuwG7T8BfxD55gkNygH6fNFuE8LCkjBBfLSo7fz0XjvmBfbg4+00QAv2/ZzEP9z+TKzl2P7Og8NV9KpIhhwgk2VZp+vKNCVWVk+czVBRpVhTECBstnhvdWyDqQzd39HmL5zDVISxL0B5n+1RweGPx0LWsdeuISY7dzdsuWOIqshXDrOjeeXKxAQbGsP3iAIV9+yifL/mL+zh1MXLuaQCn6ZQHTLFV7qqh9hWmdnIJT18NWojtsNjrXrXfUs43PVyxjb24uvnxnJAGvYfDMnFlhFV4i7k4Q8cDhJLwAXJDwGEKo59HjHeU4ykhyvaSoTZt0p52kuuGreX8a8zsBXzDMSQT9BltWbuPvJZur3FZF2Xju7MF0r39EDNBhs3FJh5O4qvCTdRl5YuZ0cgMBgvnOoqwKTGd99hHDv/6KPTnRHUifxk2izkjcus41XU5m4sgr6du4KZoQuHWdSzucxJiLLim3/YeZtnljRDUYQJO4HHbv/xLpn4uUJsLWAJH6I8RcA3oHcA5EpHyG5j7/qK+tOHZQjwZlZMAVpzLmoa8ixm02jf7D+4SNbVq2hYA3MkwhhGDHul20U90BawXxTidfDR/J5swMdufk0K5O6lGX4i7aXf51DJLQrGPFvr1cMWE8v193U4STcNhsfHDhMG6aPAkpJVb+64Zu3enbJCSq+cUlI5BSVkoeLcVddHGi5JGT53J5y3XomhN5SICIhZTPEXoLREJE/zXFCYByHGUkMTWB/055kKdGvoTP40dKiEuM4fFJo3HHhect2nRvybzJiyOch2VJmnVsXJ1mK8pAy+SUCCFAw7JYvHsXfsOgV6PGpa6LcNvt5JaQ0ziMrmlYlhU2IzGl5KDXw8KdOwqcQWF6NWzMgptuY8aWzeQG/JzatFlED5DKKr64vlt35u/cXtA/5NzGmxnRYj1Omwl4Qt5OepCZt0Hqz6ro4wRFOY5y0Ll/B8btep9Ny7ai2TRadmkW9Ycz5KazGPe/7wj4AmEJWN2hKxXdY4Ble/dw0+RJoUV2AkxL8vzAc7igbftij7nipC58vnJZ2EprQWT+XUoZNYwlgb25xfe6j7HbOb9tu2K3VxanNW3GPX368cqCeThsGte2WUuMXjR0JcHcC+amkHhhLUAa28H/W+iNcxBCVy0OqhLlOMqJpmm06R693WVOZi4rZ69h2YxVxCbEkJuZF5bn8GTlcXe/h/hw1SukNT66qhdF1eINBrnuu2/JKTJ7GD3tFzrVrUfzpOhlpvf3PZWtWZnM3rYVh03HZwQxpYwohjClRBMiYkW2aUm61q8dEuOjevTi8k5dWJm+l072X6PvJGwgIztn1gRW3ieQ8xIFmaWcV5Hx/4cWe30NWnV8oxxHJfHtyz/w8cNjMQ0L04i+KFBKCPgCTHxtCre+cG01W6goCzO2bsGKUvhmWBbfrlnNP/udFrmRkGT6excMY3vWITZlZpAXCPLg779GDV/ZhMAmREEi3a3rDGzZulr6ZpSVBKeTU5s0w8odBrmvEdnBTwslxcuJDK6G4CqwNQZH3/C+HaUda2xEen8FJMI9GKG3Ds00cl4CivQpyXkJ6TxLzTyqCOU4KoGVc9byyaPjCfhKXgkMYARM1i3cwJwJC1g+aw2pjVMYdM0Z1GmgFkzVBnL8PiwZGUwyLIssX2Q5dlGaJibRNDEJv2HwwPTopdeHZxu6ptEwPoEbu3U/qkqu6kDEXon0fQfGFiBAqBDTjkj8H0KUPewqZSCUFwksyT+xBlodSPkKYSu5dNjy/AA5T4I8LAWjIfPeRcbdQaiVT7TgnxUKXek3ldlGRdlR5biVwOR3fiHgLXtntlV/rOPJES/x/Zs/8dnjX3N927tYMXtNFVqoKCv9mjSLKuwXY7dzVsvoIcpoOHWdpwYMxKXrEZVSppSYUmJYFtl+HyNP6oRNq6U/RWmFXmEI0JLKd5q89yGwmJBMiRdkHpi7StW2sjwTIPs/hZwGhByFH3LfRloZJV21XDYqyk4t/bYeW+QczOFo1/UFfUF8eX6eueJVrFIWjCmqniaJiVzXtTsxhdRr3bqdng0acUazFuU618XtO/LtiCsY0bETbVLqYI/iHIKmya+bNlbY7sL8+Pc6Bnw6hnZvvsKgzz9m2uaynV9KC+mdjHXwGqyDVyI9XyNz3wdzO6HZBoRu2j7kof8r32JWz9dEhrtMCCwOSbNLH1bep1gHR2Jl3ID0/Rb6PeS+VOjaRTFD8d+otzENnOeU3T5FuVChqkrgtEtOYdXcdWFyJOXFk+1l+9pdND+pSek7K6qUB047nVObNmX8qpV4jSBD23XgvDbtSpQGKY6OaXV59uxz+N/cOby75M+I7QHTJD0vUjOrrEgpWbhrJ39s30ay242uafxv7uyCctpNmRnc/fMUXht8PoNaRVZAyeAqpGccWFlgpUNwLYdv8DK4mtBTe5TZtHUQzB1Q5hxC8WFcKT2QcSsYmwpd+y9wDYcSZxQCYauDjL8Pcl7hSMhKg/j7VH6jClGOoxIYcEU/Jr0xlX1b04/aeVimydZV22nQsi5O99FpJSkqj/5Nm9O/afNKO1/Pho2IWWHHU6Qxk67Z6NGg4VGd07QsbpvyPfN37MBjBKPqVkGo8dPz8+ZEOA4rbyzkPEvoiT7abNcLFOcsLShHjgPnOeD9hlAX6ELoLRGBBUhjM2EzEukF79cg4kBmF3NSDZyD0fTGSOdA8OdXgDkHIfRmZbdNUW5UqKqCTH77Z65scjvp2/ZjBEyS6ydx1pWnccv/rsYVV3YHEPQbvDzqXS6tdzO/fDKjCi1W1ARnNGtOuzqpuGxHntVcuk7vRo3pVr/BUZ3zh7/XMS/faQBRncZhtmeF9wCRVg7k/JfQzbqkEKkEoullBULhKmNLmWwV8feArT5weGW6C0QcIvF5pH82kRLthByT8ywgmjCoHeIfQOihBbVCb4qIvTn0Uk6jylEzjgqw4MclvD/6C/yeI1P5vEN5WKZFp1Pbo5Wn1FBKvDmhJ6437vyQ5ic1iVDcVRy72DSNLy8ZwSfLljJp3Ro0IbjspM5c1bnrUa++nrh2Dd5SenocRtc0xq9awbD2HXHqeihRLewgSyvqcICtWaE8R6G8RnBYG0uIAAAgAElEQVQJ8uBlkDa91K5/QkuB1KngnYIMLgFbC0TMcISWgtRSCd2KIjWycF0A9i6Q+ybIjJCwovNsRPx9CNvROVxFxRHHo1prz5495eLFi6v8Ovec+hBr5v8dMW532hm7811uPul+DqUX303O4bJjWhZmIPxJUWiCgVefzuhP7qx0mxW1G0tK9uTmkOBwlirvfsP3E5i1bWuZz+3WdVokJfPtyCtwWsuQmaNC1U2lETcahLtQWKsQwg1x/0KLvbrMdhRFGpuRB4YRnjwXoNVBpM0uUNuVMliuEmBF+RBCLJFS9izLvipUVQEO7IqeuNN0jawDOTzx3Wjc8S6EFv2J0giayCirzaQlObi7pKSg4njkl40bOGXMuwz6/GN6ffgO/5g6uUT9qxEdO+OO0rs8xm4nxeWKGPcaBlsOZTJh7Rqwdw/d9MtC3hsQXEHUfIf05ie1jx6ht4TEF0P5DBEHIgZsjREpn4VJtCunUXtQjqMCdD69I5ot8r/Qn+fnzl4PsOinpTzw+d3o9ugRQcu0sIzI+LIzxsEpF5S/J4Ti2GX53j3c9+tUDng8+AyDgGkyfctm7vzph2KPObd1G85t3Qa3rmPXNGLsdmLtdj4ZOpxXhpxPXBRhRq9h8OPf65i4bh2PLLuC7GAchowJKd7izH8VQXohMC8kM1IUEYOwdz76D56P5j4HUXcBIvlDRMpYROo0RC3RwVJEokJVFWD3pr3c3mM0vjw/lhnNAThp27Mlq+euj7odQqqmdpe9QEnX4bKT1iSVd5Y8H6G6qzg+2HboEFM2rMdnBBnYsjVd6tXnjimT+WXThogla06bjWnX3kij+IRiz7dmfzrzdmwnyeVicKs2xDudLN+7h6snfUNeMDIHkuJy4zUMvEYQm7DoXz+dC9s0Ymjny2D/AKIny52gtwdjLUfCVTpoaYi0XxAicoajOLYoT6hKJccrQMNW9Xlnyf/4/MlvmDl+HkYgPLnn9/hZu2ADTrcDb5TugQDt+7ThmkcvZdIbU8k6kEP/S07hwtvPUU7jOGX8qpU8Put3LGlhWhZjli5hRMfObM/OirrO2WGzsS83t0TH0TGtbkTHvy716pPkcuMJBsPO69A08oLBgmZNptSYuac+89PhlJax1NNSQ+s5iqK3QqR8gsx9BbzfA0ao7DV+tHIaJyBqxlFJXFrvJrL2R9abO9x2nC4nOZmRktlxSbG8OvdpmnUovkdHMBBk5997SEyNJ6W+0rM6ljng8dD/4/cjymbdus6A5i35bfPGAuHDwzhtNhbefBsJzvLfnDdnZnDNpG/J9vsQQhA0TdrUqcOq9EjHEGO38+SZZzOs2SbIfpjwRLULkfwuwtmv3DZUJ1IGwD8TrEPg6IXQy7fS/0RHzThqgFZdm/HXtJUR47pd56WZj/P8tW+ybe1OpCVxx7s575azufzfw4hPjiv2nD99NJ137/8UKSVGwKTrGR15cOy9JR6jqL3M2rYlpElVxHH4DINYh50Yu52cQKBAK8ut69zQrUeZnYY3GOT5ubOZuHYNftOgX5OmfHHJCA548sj2+eneoCHvLF7I2v37MYs8MGoIEp0utJiLkJobmfsamLtCM424/0M4+1bOf0IVIYPrkBnXAsF8bS0L6b4YkfCEajZVBSjHUUlc/9QVrJ63PmzluDPGyTWPjqBF52a8u/QFMvZmIiVlUsJdPnM1b939Udj5ls1czZMjXuKFaY9VyWdQVC02IaKuwxZAgtPFD1dcw8vz5zJvx3ZS3G5G9ejF0HZlly6/6YdJLN2zu2BGM2f7NoaP/4rp195IsjsU+rzspM58sXI5phEeVtVtGv2bNQ/Z4xqEcA06mo9YI0gpQ8q7MnyRI97J4OwHriFH9jX3gQyCrZFyKBWgRquqhBBDhBDrhRAbhRARzYuFEE4hxPj87QuFEM2r38qy0aFPG5775RE69m2LM8ZBg1b1uPutm7n0/gsL9kmpn1xm+fTxL3wfIV9iBAzWzFtP+o4DlWq7onoY0LxlxJM+gEPXuahdBxonJPLy4PNYcPNtTL3qOoa171jmm9va/eks37snLAxmSYnPNPh69ZGZcKuUOjx79jm4dZ04h4NYu4PUmBg+G3YpDlu0FeLHAMbaSKcBgAfpGQuANHZgHbgYuf9s5IHzkAfORgaWVa+dxxGlzjiEEAlAmpRyU5HxLlLKFUd7YSGEDXgLGATsBBYJISZLKQvri98EZEopWwshLgeeBy472mtWNZ1Obc9rc58pdb89m/excekW6jVPo033llFvDgd2Hox6rO7Qydx7iLpNUitsr6J6SXS5eHnQudz/208IDvflENzWozed69Yr8Vi/YXDI56NOTAx6FJXdvzMORhVh9BkGy9P3ho0NbdeBc1q2ZvGeXbh0ne71G9ZeWfeyIP0U+wwsfUhpIDOuBGs/BRVj5k5k5vWQOg1hU7+l8lKi4xBCjAReBdJFaPXN9VLKRfmbPwG6V+DavYGNUsrN+dcaBwwFCjuOocDj+X9/C7wphBDyGM3om4bJ/65/kz8mLkR36FimReN2DXn+l0dIqBMu2dB9YGd2rN+FUWRVuWlYNO1YfDJdUbsZ0qYtvRo15tfNG/EbBgOat6RZUvG9LQzL4rk/ZvHVqtAzmtNm41/9+nNlkcZPrZJTovYRcdpsnJQa2SjJbbdXqohjjWLvRHTH4QLXUPDPAZlLRJmxNJHeiYi4UdVg5PFFaY8ZDwI9pJTdgBuAz4UQF+dvq2iAsBGwo9D7nfljUfeRUhpAFnDMNuue+NoU5n73JwFfEE+2F1+en60rt/PCDW9F7Dvin0OJTYjBZj8SPnDFOrn+yctwx6ryx2OZOjExXNGpC9d3616i0wB4/o/ZjF21Ap9h4DMMsvx+npkzk582hkvddKpbj45pdXFoR74vAnDadC7v1KUqPkalIi0P0j8L6Z+HlGXT3zqMEHZE4guAC8hf9ChiwN4REXMpWPtARhOA9IO5s6Kmn5CUFqqySSn3AEgp/xRCDAB+FEI0oZa11xJCjAJGATRtWjt1+Ce//Utk3iJosvjX5XhzvWFrN+o0SObdZS8y9tlJLPl1OSkNkhj5z6FqRfkJhN8w+HLVcnxFEtlew+D1hfM5t3XbsPGPhw7n6dkz+G79WgzLolfDRjw1YCB1YmKojUhpID3fQN4YsHYQuunbQeiQ/A7CUabKUACEawCkTkV6J4J1AOE8NSSGKHSkvTjHGYNw9K6Mj3LCUZrjyBFCtDqc35BS7hFCnAl8B5xUwWvvAgp3LWqcPxZtn50iJFqTCEQN/ksp3wfeh9A6jgraVm4y07PYuHQLdZvUoVnH6M2YilsECOD3BiIW/aU2TOGuN1TP5BOVwqW5RdmbG2VdkMPBcwMH8+zZ5yDhqBpPVRcFlVCBhRxpFBUIvSTIzFsg7Q+EFlvmcwq9MSL+7shxe0ek8zTw/8GR9SkOsDUEl+oSeDSU5jhup0hISkqZI4QYAoys4LUXAW2EEC0IOYjLgSuL7DMZuA6YD1wK/F7b8htSSt69/xN+eO837E47ZtCgZZfmPP3jAySkhOctTrmgB9M+n41phE+b6zVLIzG1+JXBihOTFLebWLuDgBnZq6JT3ci8xWFEMWW/AGsP7OeFuXNYuncPaTEx3NGrD0PbdajS0lQpJQQXIb0/g3Ai3ENB5kBwMVG7Cx7G/zu4Lyx+ezkQSa8jPV+AZzwQANf5iNhRCOGolPOfaJSW48gDopV79AYWVOTC+TmLO4FfgLXA11LK1UKIJ4UQF+XvNgaoI4TYCNwPRJTs1jS/fDyDKR9MJ+gL4sny4PcE2LBkE89d80bEvtc/dTkJdeJwukNfVt2u44p18s8xt5fph5udkUP2wZxK/wyK2okmBP857XRcevjznVvX+Ve//uU+38aMg4z4Ziyztm0hy+9jY2YGD/3+G+8vWVT6wUeJlBKZ/Z/QDML7JXg+Rh4cicx9D2TxM3CkmZ/QrhyE0NFir0dL+wktbTpa/P0ITS2kPVpKm3G8Cvwnynh2/rYKPQ5IKacCU4uMPVrobx8woiLXqGomvDolrJEThPIWy6avJDsjh4SUeNYv3sSaeetJaZDMO3+9wPQvZrNyzloat2vIRXcMpkGLkksxd23cw3PXvMHGpaFuay07N+Xfn99N0/ZFawkUxxuXduxEssvNa3/OZ1d2Np3q1uWf/fqXWr4bjdcWzsNnGGHJSa9h8MaiBVzfrXuowVNlE/gTfD+FFHaBUGrUF1LbxUG4tElhJDhqt8TJiUxp35R6UsoIHQ0p5cravBivOsk7FL0RjmbTyMnI5cUb32bp9JWYhoXdYcPutPPSzCcY+a+hZTp/wBfg3tMeIetAdkHvjg1/beG+/g/zxZa3lRjiCcDZLVtxdstWFT7Psr17o+ZMBLArJ5uWySkVvkZRpO/XYmYWdqC4VrcuiLlCtYCtxZQWqiqpVvC4umMFfAGmfTGb90d/zi+fzMDnKa2lZohe556MTY9ccRubFMOin5fy17QV+PL8BP1BPDk+sg/m8MSlL0Xs7/P4mfTGVO4/41EeHfo8i39dDsAfk/7E7/GHNXySUhLwG8z6pkLRQsUJRtPExKjjQcsiNabsSehyIZxEr9wvLjQbh0h+GxEfGZWW0kJKH7UszXlCUtqMY7EQ4hYp5QeFB4UQNwNLqs6s6uXgnkzuOuU/5Gbm4c314Ypz8tFDY3lj/jPUbZpW4rHXPDaCed8vwpPtIeALotk07E6d+9+/jY8fHhtRfislpG/bz57N+2jQMhRuCPgC3HPqQ+zasKdg/6W/r+Sy0UPR7Tp+b2QXOF+uj31bo8hfK457Vqbv4++DB2iZlEy3+g3KnNi+s9cpLN27J6y816XrXNCmHQmltKk9WoT7olBSOiIk5Sf6jCMXKWLCKsKkNEOii57PQrMXWwOIfzRUgquoEUqbcdwL3CCEmCmEeCn/NYuQFMg9VW9e9fD2vR+TsSezoFzWl+vn0L5DvHbHB6UcGSqZ/XDVy1z272F0Pr0D51x7Bm/M/y99zu+BEYw+FbekZOnvK/F7Q7Oa6V/OYdeGvWFOxpfnZ+yzk2jQql5BMr0w7jgXbXtWPHyhOHbwBINc9u04Lv92HI/NnM41333LsPFfku0v2+y4b5OmvDBwCGkxsThsNlw2neEdTuLps6pO0FDY20P8fYAj1KpWxAJuECWs4/V8E/ZW5jwLnk9BegALzF3IQ/cgA1WX1FeUTJn6ceQv/OuU/3a1lPL3KrWqgpS3H8f5sVcVdOArjGbT+Mk/Fu0odXzGPTeJz5/6NuLcQoArzgUS/vPlPUz9cBoLfoicwMUkuPnXx/9g3PPfsWXFNgK+0Ipau9NOk3YNeXvJ89iOVWE6Rbl5fOZ0xq1eSaCQkKFds3FB23a8dM65ZT6PJSWZXi9xDkfVJMSjIM108M8Oha6cA5AZN4CxPPrOMTejJYwOHWd5kOl9iFq26+iLlvJp1Rl9glGefhwl3hGFEC4hxL3AcEKrc96p7U7jaNC06FN9oYkK1bdffM95tOjUBHdcuESIlODN8eHN9fHM5a/gjnNHtSHoD7Jr416e+/URht93AamNU0htlMLFd5/HK3OeUk7jBGPiujVhTgMgaJn8sH4tPiNY5ti/JgR1YmKqzWkACFtdRMylCPeFoTLYuLuK39k1/Mjf1v7ovc4BjFCVoTR3Y2U9jLX/bKyDVyJ9MyrRckU0SnuU/hToCawEzgVerHKLaoDTL+2L7gj/Edl0G/2G9qqQ43C6nbw27xke+Pxuug/qEqY7dRjLkiTXTcTuskdsC/oNvnz6W/7RYzTD7jqXsdvfY+yO97jl+auJiT+uahMUZaCo0ziMISWd3n6D3h++y5cri3mKr2VortPBVXS9L4AOmZciA/mfw1af6OpGAvQOSHM38sBF4J0A5g4ILkYeuhcr77MqtF5RmuPoKKW8Wkr5HqGV26dXg03Vzm0vX0ej1vVxx7nQHTbc8S7qN0/j7rdurvC5bbaQA+o1uFtUJxQMBHHHu7jrzZtxxTrRHeHOxZvjY9+2A7x08zsVtkVxbHN6s+bFyohYSA56Pfx3zkzGr4rsRFkb0ZIeh5jbCK/RMUDmIQ/di5QSIZwQO4rIIk4HIv6e/IWEHsIT7V7IfRkpy5b7UZSf0uaqBTKVUkrjeO2YFZ8cx/srXmLJr8vZunonTds3pOeQbpUaCuoxqAufPDoOo0gqxe7Q6T6wC11O78gZI/txeaNRGAFP2D6mYbLktxUE/EEczsiZieLE4NHTB/DXnt14gsEI4cPDeA2DVxfO5bJOncPGpZQs2bOb+Tu3k+Ryc0GbdgVdAWsU/3QgymexMsDcAnpLROwdSGlC3tuEpNEFYCE9X0JgUfTjEaFQlr19VVp/wlKa4+gqhMjO/1sA7vz3ApBSyuNGYEnTNHoNOZleQ06ukvO36NyMgdeczrTPZ4dVT1mmxXNXv86rc58uuTmTlFimVfx2xXFP44REfr/2Rr5Zs4pV6fuYvH5d1CBOel5e/tN66EHPtCz+MfUH5mzfhs8I4tR1np87mzEXXkyfxtEFOSG/+m/vbg75fPRo0JAkV9kcjZRB8M8EYzPobcB5BqK4PIUoLughgULH+H7gSMhKAkHw/gi2YtQTZBA01aCpqijRcUgpVfa1Ernn7VFkHchl3qSFWPkL+kzD4uCeTP533Zu8+PvjnHpxb6Z/MSdMCFEIQbverXHFVE2tveLYIcHp4qaTQ4UvS/fuYXtWVsQ+jRMSw8Kik9evY872bXiNUADh8GzljqmTWXjz7VE7Cm49lMm1k74l0+dFCEHQNLm3Tz9u7VmyDLk0DyAzRoKVGVpzIVyg1YU64xBalLbJ7hGQ8yIR6zxs9cGW3x7B3ARmOpG5Di/5z7P5fx/GAc5TT6jOftLcC4EloCWBow8hMfGq4xjuF1k7CfgCTHxtCjd3vp+LEq7h6hZ3MOHVHzFNEyEEq+euK3Aah7FMi1Vz1+HN9XLzc1dTp1FyqFwXcMU4iUuO5f8+vKMmPo6iFvNAv0gBRJeu8+9TwwUQv127qsBpFCZgWqzYtzdiXErJ9d9PYFdONnnBILmBAH7T5PU/5zN/x/aIff/ctZOHf5/GozOmkZk+Gsy9IPMAM/SvuROZ/WzUzyBirgBHb0I3fz3UgEkkIpLePOL8pK/4mYlwQsKDIOJCx+IAZ39EYqQ6w/GIlBIr+yXk/kHI7IeRh+5E7j8DaWys0utWXz3eCcD+nQe5s/cDZOw9VDDmzfXx0UNj2bJqO//88A5kMeEmwZEKq4/Xvsasr+ezfvFGmrRvxMCr+hObWEWSEIpjliFt2mLTNP43bw47srNonJDI6H6ncU6rNmH7FZeZNCyT3CiLB1ftT+eAxxP5fG8YfLpiKX2bHGmU9sSs3/lmzWp8RhCQPNRuHoii3/Eg+H4G/hdxLSHskPwBBJdB8K/Q7MQ1ECEKhcX09hR09gvDBa4L0GIuQ7ovBnM7aCkIrXjNLRlYgsx9MxRGs3dAxN2NsHcsdv9aj38meD8D/Pm91wHpQWaMgrTpVSaXrxxHJfL6HR+Qse9QxHjAG+D3L//guscv4/QRfZn64XSMwJGEnhCCVie3IDYh1KnN4XIw6NozGHTtGdVmu+LYZFCr1gxq1brEfS7t2Jmle/dGzDr8psmoH7/nhXOGcGHbI0nkHL8fWzE3nEO+IyGl1en7+HrNqoLQlwBEsY1Bi19jIoQAx8mhV9TtOiS9hMy8k1AiPAjE5CfOr8zfxwF6yf8P0j8TmXk3BWEx/16kfz6kfIIo5tq1Hen5qpDycMEoyAww1oC9ov32oqNCVZWEZVks+nlpsb8Ph1Nn49ItNO3QiJh4N878fIUrNhSKGv3JndVoreJE4sK27TizefOIsBZAwDIZ/dsv7PccUXnuWq8+hhU5M3bpeli72hlbt4StLZEIZu1pgmEVdTo6uComayKc/RFpU0Olue4RiMT/IuqMRwhXxL5SSqT3O6wDQ7HSz8TKegxppiOznyI8lyIBb0jS5FhFRlfnBi2/TLlqUDOOSiI0JSx+WujJ9fHo0OfDxlIaJHHVw5cy8OrT1YI+RaWR5fPx5qIF/LppA3abjctP6sIr55zHU7NnMnb1ighpdU3ALxs3cHWXbgDEOhw8fPoAnpo9g4BpYkmJW9dpmpjEyI6dCo5z6Tq60AjII87j0b9OZ+LASaQ4TeyaL6RNpSUh4h+q8OcStkaI+NIl8mTOC+D5koKEufcbpP/XUIlvNIJrK2xbjeE6F4KriBSRlFBsr/WKoxxHJSGEoO+FPZk3eVHUsllpRU5FMvYcYuf63cppKCqNj5cu4Zk/ZoU5h5fm/8HcHdvpWq9+1BmxJSXBIjOMKzp1oWNqGp+vWMYBr4dBLVszvENHXPqRXMN5bdry0vy5Ycft88Zy7s9XM+vKZti1nQi9DbgGVVmLVhlYivROBiyE+wKkrWVIRZfCC6YMsHII3e4iiwQoISdS2xExI5DeSWBsIuQobYAdEp4OLZ6sIpTjqETufvtmNi3bwsG9h6KKJkbjpzHTuePVG6rYMsWJwIS1q3l+7pyIGYXfNPlz1w6GtmuPQ7dFWTwoOKt5y4jzda3fgK71GxR7vYbxCTw38BwemPYrer7Wmiklzw08l8TEtsUeV1lY2S+C53MOP21L73ehroHCCbLo7y8AWn2wDhHxdG5lY+W+g4i9pUxlrFIaoZ7pIhFR7DqU6kEIF9QZB76pSP9M0Oog3Jcj7G1KPbYiKMdRiSTXS+Lj9a+zcMpfvHjTW+RkFBd/PELAF+TA7gxSGx67Tz2K2sHrC+cTsKLrWZmWRbbfz1WduvLVquX4DAOBwKHbuKNnb5olldSzrXiGtuvAmc1aMGvbFoQQnNGsRZX19iiMNDaFpNbDVHO9EJhD9JCxBo4+oCWCZxzhM5I8yH0HaWxFJD0f5dj8a0oLmfc25I0JLTAUMci4e9Fio2luVR9COMA9DOEeVm3XVI6jkjksjihvLNv+UkqubX0n7Xu34ZGv7ye5bvQubQpFaezLyy12m65p1I+L49quJ3N+23ZM2bAemxBc2LY9Jx1F//LCJLpcXNSuQ4XOURzS3IvMfQv8c0K5ktibwHVBqAyVaKXtRqik1zpIeFjKgYi9AWHviCUt8I4jXKrEB74pSPM+hK3+ketbh5CeCWCsAisLAospmLHIAOQ8jyXi0WIurORPXrtRjqOK6HxaBxb8uKRUqWtpSYK+IGvmr+eh8//L24uiP/FsXLaFNfP+JqVBEn3O747doTSrFOG0TqnDmv3Ru0LGOpycmR+O6la/Ad1KCEHVFqR5EHlgaCgshAHWbmTWw2BsQNjqEYrnF81Z6OC+BDxjQWYeGdbiQMtvHmWsIaq+lXCGcgX5jkMa25EHL83vmR6tbzqAF/LegBPMcahy3CripueuwhXnwqZH/heLKL03zKDJjrW72LIqfGWuaZg8cemL3Hvaw7z3r8944fq3uLLpbexYv6vKbFccm/zntMiV5ACN4xMYf+llOEoR7UzPy2X53j1l7ihYWUgpQ1IlRdYjSM8n+eWmhW/yXsj7GGnvS7Fy69IbubbBykRm/Sv0t96GMB2sggsGjsicADL7CZDZFO808jH3lbz9OETNOKqIZh0a897SF/jq2YmsW7CBtKapnHZxH/pe2IOnLnuZlbMjSwBtdhsHdmWwcvYavnp2Eof2HSK5XhJZB3II+kNPVgHAm+vlieEv8uGqV6r5UylqM6c2acZHF13CC/PmsDHjIPXj4rm1Ry8u6VDyIjCfEeS+X6Yyc+sW7DYbQdPk+m7dGd2vf5WtPD6M9M9EZj1aUCorXecgEp5GaDHgX0B4LiIf4UDIA8jEFyHrX6FGT1ICJiQ8DbmvEHmzNyGwBGnlIGJvzK/EKuxcnODoi9ALiT4G5hM9HFaEUhYeHo8ox1GFNGhZj//74PaI8Z7ndGX9nxsLWsEeJugPsmrOWia+NgVfXuip78CuyNpzKWHvlnS2rdlBveZ1lfihooBTGjdhwsjyJWsfnTGdmVu34DdN/PkL+j5bvpRmiUlc3qnq1gLI4JrwldwAvl9DN/eUD0BvDMYKImYWMgBaPTRHb6SzH/hnhcad/RFaIlZu8QluCCL0FpDyMTL7kfwyVju4hyISiqw1EQ6Q0eXrj+BCxI8u0+c9nlChqhrgwtsHE58cFxGyiklwM/G1qQVOoyQC/iC3dvsnw5Ku5Z7THmLn37urylzFcYzfMJj897oCh3EYr2Hw/l+Lq/TaMu99ImcUAQgsQJq7EbE3AkUfiuxg74LQmwEgtHiE+4LQS8svLHGeQ9RnYlvzAh0r4eiOljoFUW8Zot4ytMSnw/WxAFxDgaLrT3QQiSDiwX4yImUMwtmn3J/9WEc5jhogPjmOwTcMiHAc2QdzCPjKFl+WlsQ0LEzDYu38Ddxz6kN4copq1igUJZMXDBRbwJHpreLvk7GVqKEg4QBzD8LeGRJfAJFMSD3XAY5+iOS3SzytiL8nP8F92BE4QcQikqKJLLqK7RUi4keDvTMId77yrhvsnRBpM9DqLUGrMx7h6FX2z1tGpAwg/QuRgUWh3ia1EBWqqiGmfT4bywj/0VhmCUJwmkBaEt1uwwiGPx1KKQn4gswY+wfnj6qYJpDi2Cc9L5e3Fy1k9vatpLpjuKV7r2KFEJNdblJjYtmTmxM2LoDejRpXraGOHmD8TUSFkwyA3goAzT0Y6RoI5i7Q4qP39Ch8qLE9lNQ29wAa2JqD60JEzJUIW51ymSe0WESdscjgKjA2gt4S9M5VmveR/jnIQ/dyJDxng+S3EI6S+6BUN2rGUUP4PNErNYQmcMaET4+dbgdXP3IpQ+8cQs/B3dAdkf7el+dn54Y9VWKr4thhvyeP87/6jK9WrWDroUMs3rObe3+ZynuL/4y6vxCCpwYMxKXrBcvmdCGIdTgi+npUNhZbdwEAABa/SURBVCL2ltDTfNhtyA0xVyO0IwsShbAh9KalOw0rK1Q+G5hLqAd5EMzd4J9dIVkRYe+EcA9D2LtUrdMwDyAz/xEqP5a5+a8sZOYopJVd+gmqkRpxHEKIFCHEb0KIDfn/Rv1GCCFMIcSy/Nfk6razKul9Xnc0W+R/f+O2Dbjm0REk1IkDoFGbBjzy9f1c+9hI7nz9Ji69/0LsURyHO85Fm5NbVLnditrNmL+WkO33h6nbeo0gr/05n9xAdBmcs1q0ZNzwyxjcqg3t6qQy4qTOTLniWlomF3+z9RlB/MX0PS8rwlYfUWciOAeHwlG2FhD/0FEnm6VnQv6ai8Iz+UBoVhNcUSFbqwXfFKKXGMv8fia1h5oKVT0ATJdSPieEeCD//b+j7OeVUnarXtOqh/NvGcicCQvxe/0F3xXNpnH7qzfQ65xuXDZ6GJZloRVp69nljI407dCIzSu2F5To6nYbSXUTOW34KdX9MRS1jD92bIsQLASwaxp//397dx4fVX3ucfzzzJ6ERQhrCIJVQRZFbVwQrShU3AoKtWqx13qtFm29Wr11Kd62alVaa6u1trdUrfYW1IpSl6IoigVUKkFFQFARFwggi6xZZn3uHzMgITNZZ+acCc/79eLlLCcnXyXOk/M7v9/z27KZo3uXpf26I3r24g9njW3y/Ku3fsGNc17k7Q3rEBFO7NuPX44eQ/eS1m00Jr5+SJd7W/W1DcRWkHbNhUhy9lRgWHa+T45oYjtppx9rNLWexD2cGqoaBzySevwIkL8mKw5LJBL86pLfc/3oWwnXhOv9giEe4eGbH9vzfN+iAcmhhbte/hljrzyNzt070aFLCV+/eCT3LbyDQNBWk+/vyjp0TPt6JJ6gRys/3HfbEQ7zzSceZfH6KuKqxBIJFnz2CefNeJR4mmKVd75BQMP9OVDdc8/EzSR4QnKP9gZ8yeaNLuJU4eipqrsH5DcAmZrlhESkUkQWiki7KC4vPDSX+U8sJBppeJkfj8b5bMVaVr39caPnKOpQxKS7v8uMzx9k5paHuXbqJDp365SryKaAXPbVCor2WT3u93g4slcvyju1rQ/aM++vIByL1RtMiamypaaG+Z992qZzZ4MUT0h98O79sRYA/4Cc7k2RNf6vQuCk1H2f3YohdIbrtrfN2VCViMwBeqV5q94qG1VVEck0naifqlaJyFeAV0Rkqap+lOH7XQ5cDnDggQemO8QVnvnDC9TVZJ5y6/F62PDJRg6x+xWmFY4pK+fWkaO4dd7cPftsHFPWh/vOOLvN51699Qtq09zXiCUSfLp9K+Dsz6x4OkPpjOSsqsjrJBf2fQPpeFPOV8C3liZ2orVPQnRpcm/1TrcgkYVo7VOAN1kMg6c5HbOBnBUOVR2d6T0R+VxEeqvqehHpDaTtzKaqVal/rhaRV4GjgLSFQ1WnAlMBKioqGu8s6KCmFvfFIjEOHtY/P2FMuzRh8FC+MXAQn2zbSpdQUavvP+zr8B69KPb7qYnWX1vg9XgY1K1HVr5HW4nvQKTrg00ep7GP0J33QPQt8PRAOkxCQmPykHCvDPEqdPOEVF+tWuAlqP4TlD6Op6jpfwcnOTVU9QxwcerxxcDT+x4gIl0ktYWViHQDRgDv5S1hjpx83nD8Ge5FBIr8jDj3OHp/pW1tro0JeL0MKO2WtaIByR3/uoSK8O117y3g9XJo11KOKeuTte+Taxr7ODltN/wSJDZBbDm6/XoS1Y80/cXZzLHjF6Db+LJnVh3ozmTvLpdzqnBMAb4uIh8Co1PPEZEKEXkgdcwgoFJElgBzgSmqWvCF41s/HkuPA0sJFDUsHh6Ph4mTxzuQypimBX0+Zp4/kXMGDqJjIEiXUIiLDh/GtPHfcu1QUDq6677Ub/l73dDXWth1D9pg58AcCi+g4cp5hehiVNNvyOUW0tR+EYWooqJCKytz22enNXZs2cnvr3qQ+U8ubLD6G5Izpg49+iDuz7AnhzGm7RIbR0IiTW83KUZKn0J8DbfRzUmOz49OLvJrwI/0XJb3Yiwii1W1ojnH2srxPEkkElw78mcZiwYkW4esXvoZ2ze7a862Me2KN8OwmsbA0y1/OULn0rCJoj85i8rlV3BWOPLknVeWsfHTTRmLxm7u/nExpvBJhytouN4jmPzA9uRvWrt0vC45TXh3E0UpBt8ApJP773FYk8M8WfP+OuKxpsctS/t0pcMB2buhaYypT4Inop1+DjvvBA0DCkVnIZ1uyW8OTzFSOh2NLoXoh+A7CPxHuv5qA6xw5E2/weV4fen2SK7viw1b+fGoW/jVnJ/i89tfjzG54CkejxaNhcRGkM6Ix7lf1sR/eLJ9ewGxoao8GTZyCGWH9KrXoDDd3uOR2igfvrWauY+9ls94xux3RHyIt8zRolGorHDkiYhw99yfM+o7XyNUEsQf9DPo+AGEOjTsTVNXHebVx193IKUxsOTzDdw4ZzaTnnuaf6x8j0jc3VND3UBV0cgStPqvaN3s/E7rdYCNheRRSecSrvvzFXv2IV/yr+X8z9iGU29FktvIGpNv/7fkbaa8No9wPE5ClQWffcrf3n2H6RPOJ+BNv1Pe/k41im69EiJvAnEQf7JnVtfpyf3N2yG74nDQ0BMPI1S873Q8CBQFOdt28jN5tiNcxx0L5lEbi5FIre+qiUVZsXkzz36w0uF07qU1f4PIv0muAI+AVkPiC3Tb1U5HyxkrHA7yer3cMWsynbp1pLhTEUUdQ/iDfi64YRzDRg5xOp7ZzyxaV4U/zeZitbEosz5834FEBaLm7zTcB0Qh9jEa3+BEopyzoSqHHXLUQTxeNZW35iylensNw0YOpmuv9Ftkrv1gHa8/vQiP18NJE46nZ7/ueU5r2rMO/gDpGkkI0DmYbp8Ik5RpJ0RJbsLUDlnhcAGf38exZxzV6DHT73iSabc/RSIWRzzCX25+lCvuucSGtEzWVJT1odjvpzpa/8Zu0Ofj24e7e/c8R4XGQvVUYJ/O197u4C13JFKu2VBVAfhk+Rqm3/4UkdoIsWicaDhGpC7KH6/5C5urtjgdz7QTXo+Hh8+ZQLeiYjr4A3QIBAh6vfzouBOoKKDut/kmJZeC7yvJld8AhEBKkM6/KYjFfK1hVxwFYN6MN4hFG14OiwivP13J2Cvzu4+Aab8GdevO65d+nzer1rIzEubYsnK6FNkMv9009lFy9pSnCwRPQSSIeIqh9EkIv4xGFoO3DCkai3i6Oh03Z6xwFIh0Y89Kcv64Mdnk83g4oa97d9F0gqqiO26G2mcAAfECPuj6COIfjIgPQmPyvhmUU2yoKs/Wr97A7Ede5dW/v97sLrhf++bweivO91DlhHHHZDmhMaaBuueh9jmS9zHqklNudTu6dRKq++6p0f7ZFUeerP1gHTeffSdVq5LT80QEr9/LZb+cyPirG98Puv+Qvlz4k/FMv/0pEvE4IoJ4PUy6+z/oXl6aj/jG7Ne09nG+3Klv7zd2QOw98A/NeyYnWeHIg0g4yjUn/Q/bN315haGqxCIxHvzJdIaccBgDjzmk0XNMnDyBk88bzmv/2D0d9zh69XfHPs/GtHsZW4i03ym3jbHCkQdvPFNJ7a59FwglRWqjPP/gy00WDoDyAWWcf/24bMczxjQlNBai79HwqsO7311tgN3jyIstVV8Qb2QDp+rtaS6BjTGuIcUTUgVi95TbABBCDrgbEb+DyZxhVxx5cNhxh+AL+NJu5OQP+jhpwnEtPuen763h8bue5uN3P2NAxcGcf/04yg7ulY24xph9iASg618h/C80PB+83ZCi8Yi3t9PRHGGFIw8GHT+AoSMGsuTV5fW2jhWPMHTEIEace2yLzrfstZXcOOYXRMNREvEEHy/9lLmPLuC382/j4GH9s5zeGAMg4oXQqUjoVKejOM6GqvJARLjt2Ru55PZv07Nfd4o7FdFvSF9ueOQq7pw9GW8L21X/7gcPEK4Jk4gnpwHGYwlqd9Xxxx89nIP0xhhTn7THBWQVFRVaWVnpdIyciMfinBG8MO3CP3/Qz6za6Q6kMsYUOhFZrKoVzTnWrjgKjMfrIVDUcA8PgJLO1hrCGJN7VjgKjIhw5mWjCO5TPILFAc656kyHUhlj9idWOArQ96ZcxPCxFfiDfko6F+MP+Tn1wpO44MZznI5mjNkP2KyqAhQI+pn86I/Ysn4r6z/aQJ8BZXTp0dnpWMaY/YQVjgJW2rsLpb3T7xZojDG5YkNVxhhjWsSRwiEi54nIchFJiEjG6V8icrqIvC8iq0TkxnxmNMYYk55TVxzLgPHAvEwHiIgXuB84AxgMXCgig/MTzxhjTCaO3ONQ1RVAU/vxHgusUtXVqWMfA8YB7+U8oDHGmIzcfI+jD7Bmr+drU6+lJSKXi0iliFRu2rQp5+GMMWZ/lbMrDhGZA6Rr1zpZVZ/O9vdT1anAVEi2HMn2+Y0xxiTlrHCo6ug2nqIK6LvX8/LUa8YYYxzk5nUci4BDReQgkgXjAuDbzkbKjrqaMAufrWTn1mqOOnUo5QPKnI5kjDHN5kjhEJFzgfuA7sA/ReQdVR0jImXAA6p6pqrGROSHwGzACzykqsudyJtN7y9axQ2n3UYikSAeS7ZFH3PJKVx136VNTRYwxhhXsLbqeRSPx7mw/Pts/Xx7vddDJUFumnY1J4w9xqFkxpj9nbVVd6mV/15FXU24wet11WFm/XmOA4mMMablrHDkUSwSyzgcFamL5jmNMca0jhWOPBo0fACkGRkMlQQZfdHX8h/IGGNawQpHHgWCfq576EoCRQF8geS8hFCHEIOHD2TUxJMcTmeMcQONrULr5qLxdU5HycjN03Hbldpdtdx7xZ+ZN+MNEvEERZ2KGPa1oznzstFUjBmGx2M13Jj9mSZ2oVu/D9GlID7QCBo6Hek8BRF3fVTbp1We3DLh18ybsZBoOEY8lmDXF9UsfnEJPft3t6JhjEF3/BSiS4A60F1ABOpeRKsfdDpaA/aJlQfrPtrA0gUriYbr3wCPhKPM+M2zDqUyxriFagTqZgORfd6pg5ppTkRqlBWOPNjwySb8gYaXmol4gjUrrYuKMfs9jZB25gyAVuc1SnNY4ciD/kPK00639QV8DB4+0IFExhg3EU8H8PZL844HAiPynqcpVjjyoGuvLpx28ckEi4N7XhOPECoOMv6asxxMZoxxC+l8O0gRX85ZCoB0RDr+2MlYabnrVn079l9/uIy+h/Vh5u9mUb2thqNGDeXSOyfSrayr09GMMS4ggaOh9Fm05hGIfQT+o5HiiYi31OloDVivKmOMMdaryhhjTO5Y4TDGGNMiVjiMMca0iBUOF6tatZ7FLy1hy/qtTkcxxpg9bFaVC9XuquXnE37NsgUr8Qd8RMNRRn/nZK7+42XWnsQY4zj7FHKheyZNZem8FURqI1RvryFSF+XlafOZ+btZTkczxhgrHG4TqYsw/8mFDfpahWvCzLzXCocxhUbjG0jsvI/EthvQ2qdQbbgLaKGxoSqXCddG0ET6tTXV22vynMYY0xYaWYRu/R5oHIig4dmw609QOgPxdHQ6XqvZFYfLdDighB79ujd4XTzCUaOGOpDIGNMaqopu+2/QWvZ0vdUaiFeh1VMdzdZWVjhcRkS4duokgsVBvL7kX48/4KOkczHfm3KRw+mMMc0WXwOJdDMiI1D3fN7jZJMNVbnQsJFDuH/RFJ787XOsWVnFkBMGcu7VZ1Hau4vT0YwxzSVBIJHhvVBeo2SbFQ6X6jeonGunTnI6hjGmlcTbE/UNhNhy6heQIii60KlYWWFDVcYYkyNywL3g6QVSAhQBIQidghRf4HS0NrErDmOMyRHxlUP3lyGyEOIbIDAM8R3idKw2s8JhjDE5JOKFoPt28WsLG6oyxhjTIo4UDhE5T0SWi0hCRDJuHCIin4jIUhF5R0RsZyZjjHEBp4aqlgHjgT8149hTVHVzjvMYY4xpJkcKh6qugORiN2OMMYXF7fc4FHhRRBaLyOWNHSgil4tIpYhUbtq0KU/xjDFm/5OzKw4RmQP0SvPWZFV9upmnOVFVq0SkB/CSiKxU1XnpDlTVqcBUgIqKivRdAo0xxrRZzgqHqo7OwjmqUv/cKCIzgWOBtIVjb4sXL94sIp+29fs3oRtQKPdeLGvuFFJey5obhZQVMuft19wTuHYdh4iUAB5V3Zl6fBpwa3O+VlUbtpfNMhGpVNWMM8LcxLLmTiHltay5UUhZITt5nZqOe66IrAWGA/8Ukdmp18tEZPduRT2BBSKyBHgT+KeqvuBEXmOMMV9yalbVTGBmmtfXAWemHq8GhuU5mjHGmCa4fVaVmxXSTiyWNXcKKa9lzY1CygpZyCuqNgHJGGNM89kVhzHGmBaxwtEGInKbiLyb6qX1ooiUOZ0pExG5S0RWpvLOFJEDnM6USXN7mTlJRE4XkfdFZJWI3Oh0nsaIyEMislFEljmdpSki0ldE5orIe6mfgaudzpSJiIRE5E0RWZLKeovTmZoiIl4ReVtEnmvLeaxwtM1dqnqEqh4JPAf81OlAjXgJGKqqRwAfADc5nKcxu3uZNblmxwki4gXuB84ABgMXishgZ1M16mHgdKdDNFMMuE5VBwPHAz9w8X/bMHCqqg4DjgROF5HjHc7UlKuBFW09iRWONlDVHXs9LSHZIsWVVPVFVY2lni4Eyp3M0xhVXaGq7zudoxHHAqtUdbWqRoDHgHEOZ8oo1W3hC6dzNIeqrlfVt1KPd5L8kOvjbKr0NGlX6qk/9ce1nwEiUg6cBTzQ1nNZ4WgjEbldRNYAE3H3Fcfe/hN43ukQBawPsGav52tx6YdbIROR/sBRwL+dTZJZaujnHWAj8JKqujYrcA9wPfU3QG8VKxxNEJE5IrIszZ9xAKo6WVX7AtOAH7o5a+qYySSHA6Y5l7R5Wc3+S0Q6AE8C1+xzZe8qqhpPDVWXA8eKyFCnM6UjImcDG1V1cTbO59qWI27Rgp5b04BZwM9yGKdRTWUVke8CZwOj1OF52NnoZeagKqDvXs/LU6+ZLBARP8miMU1Vn3I6T3Oo6jYRmUvyXpIbJyGMAMaKyJlACOgkIn9T1YtaczK74mgDETl0r6fjgJVOZWmKiJxO8jJ1rKrWOJ2nwC0CDhWRg0QkAFwAPONwpnZBkpv0PAisUNXfOJ2nMSLSfffsRBEpAr6OSz8DVPUmVS1X1f4kf15faW3RACscbTUlNbzyLskmjK6dOgj8HuhIsj39OyLyv04HyiRTLzO3SE0y+CEwm+TN27+r6nJnU2UmIo8CbwADRWStiFzqdKZGjAC+A5ya+jl9J/Vbshv1Buam/v9fRPIeR5umuRYKWzlujDGmReyKwxhjTItY4TDGGNMiVjiMMca0iBUOY4wxLWKFwxhjTItY4TAmS0Qknpo+ukxEnhCR4tTrvUTkMRH5SEQWi8gsERmQeu8FEdnW1m6lxuSTFQ5jsqdWVY9U1aFABJiUWtA2E3hVVQ9W1a+S7EzcM/U1d5Fct2BMwbDCYUxuzAcOAU4Boqq6Z8Glqi5R1fmpxy8DO52JaEzrWOEwJstExEdyr46lwFAgK43ljHELKxzGZE9RqsV2JfAZyZ5LxrQ71h3XmOypTbXY3kNElgPfdCiPMTlhVxzG5NYrQFBELt/9gogcISInOZjJmDaxwmFMDqX2PTkXGJ2ajrscuBPYACAi84EngFGpzrVjnEtrTPNYd1xjjDEtYlccxhhjWsQKhzHGmBaxwmGMMaZFrHAYY4xpESscxhhjWsQKhzHGmBaxwmGMMaZFrHAYY4xpkf8HZ5uwcp9Iqr0AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(Y1[:, 0], -Y1[:, 1],\n", " c=iris['Species'].astype('category').cat.codes)\n", "plt.xlabel('PC1')\n", "plt.ylabel('PC2')\n", "pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data compression (Low rank approximations)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "X = np.ones((25, 15))\n", "X[5:-5, 2:-2] = 0\n", "X[8:-8, 6:-6] = 1" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(X, cmap='gray')\n", "pass" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "U, s, Vt = la.svd(X, full_matrices=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that tehre are only 3 types of columns, and so 3 singular values suffice to capture all the information." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0.6, 0.9, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n", " 1.0, 1.0, 1.0, 1.0])" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.cumsum(s)/s.sum()" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "X1 = U[:, :3] @ np.diag(s[:3]) @ Vt[:3, :]" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(X, cmap='gray')\n", "pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using MNIST example" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "mnist = pd.read_csv('https://pjreddie.com/media/files/mnist_test.csv')" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(9999, 785)" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mnist.shape" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "img = mnist.iloc[0, :-1].values.reshape((28,28))" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(img, cmap='gray')\n", "pass" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "U, s, Vt = la.svd(img, full_matrices=False)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "img1 = U[:, :1] @ np.diag(s[:1]) @ Vt[:1, :]" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(img1, cmap='gray')\n", "pass" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0.3, 0.5, 0.6, 0.7, 0.8, 0.9, 0.9, 0.9, 0.9, 0.9, 1.0,\n", " 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n", " 1.0, 1.0, 1.0, 1.0, 1.0, 1.0])" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.cumsum(s)/s.sum()" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "k = 6\n", "imgk = U[:, :k] @ np.diag(s[:k]) @ Vt[:k, :]" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(imgk, cmap='gray')\n", "pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We get slightly more than 50% compression with $k=6$. Note that there are better methods for image compression." ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "sizes = (U[:, :k].size, s[:k].size, Vt[:k, :].size)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(168, 6, 168)" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sizes" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "784" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "img.size" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "342" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum(sizes)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Denoising\n", "\n", "SVD by itself can do some denoising, but effective use requires more sophisticated algorithms such as [k-SVD](https://en.wikipedia.org/wiki/K-SVD)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "img_noise = np.clip(img + np.random.normal(0, 30, img.shape), 0, 255)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(img_noise, cmap='gray')\n", "pass" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "U, s, Vt = la.svd(img_noise, full_matrices=False)" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0.3, 0.4, 0.5, 0.6, 0.7, 0.7, 0.7, 0.8, 0.8, 0.8, 0.8,\n", " 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 1.0, 1.0, 1.0, 1.0,\n", " 1.0, 1.0, 1.0, 1.0, 1.0, 1.0])" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.cumsum(s)/s.sum()" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "k = 6\n", "imgk_noise = U[:, :k] @ np.diag(s[:k]) @ Vt[:k, :]" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(imgk_noise, cmap='gray')\n", "pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Recommender system\n", "\n", "Based on toy example from this [blog post](https://hackernoon.com/introduction-to-recommender-system-part-1-collaborative-filtering-singular-value-decomposition-44c9659c5e75)" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "from collections import OrderedDict" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have a database of movies and user ratings, but since most users watch and rate only a small subset of all possible movies, there is a lot of missing data. Our job is to predict what other movies a user might like, based on the movies that the user has rated. \n", "\n", "Recall that SVD gives the optimal (in terms of Frobenius norm) low rank reconstruction for a matrix. This is true even for sparse matrices, and we make use of this to make predictions about user movie preferences.\n", "\n", "Note: Real world recommender systems based on SVD calculate an approximate SVD using iterative methods for computational efficiency, but the idea is the same - we assume that the data can be modeled by $k$ latent factors, then reconstruct the rank-$k$ matrix. You'd also normalize the data in a real-use case." ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "ratings = pd.SparseDataFrame.from_dict(OrderedDict(\n", " A = [2,None,2,4,5,None],\n", " B = [5,None,4,None,None,1],\n", " C = [None,None,5,None,2,None],\n", " D = [None,1,None,5,None,4],\n", " E = [None,None,4,None,None,2,],\n", " F = [4,5,None,1,None,None]), orient='index'\n", ")\n", "ratings.columns = ['The Avengers', 'Sherlock', 'Transformers', 'Matrix', 'Titanic', 'Me Before You']" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
The AvengersSherlockTransformersMatrixTitanicMe Before You
A2.0NaN2.04.05.0NaN
B5.0NaN4.0NaNNaN1.0
CNaNNaN5.0NaN2.0NaN
DNaN1.0NaN5.0NaN4.0
ENaNNaN4.0NaNNaN2.0
F4.05.0NaN1.0NaNNaN
\n", "
" ], "text/plain": [ " The Avengers Sherlock Transformers Matrix Titanic Me Before You\n", "A 2.0 NaN 2.0 4.0 5.0 NaN\n", "B 5.0 NaN 4.0 NaN NaN 1.0\n", "C NaN NaN 5.0 NaN 2.0 NaN\n", "D NaN 1.0 NaN 5.0 NaN 4.0\n", "E NaN NaN 4.0 NaN NaN 2.0\n", "F 4.0 5.0 NaN 1.0 NaN NaN" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ratings" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We need to deal with the sparsity." ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [], "source": [ "from scipy.sparse.linalg import svds" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "X = ratings.to_coo()" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " (0, 0)\t2.0\n", " (1, 0)\t5.0\n", " (5, 0)\t4.0\n", " (3, 1)\t1.0\n", " (5, 1)\t5.0\n", " (0, 2)\t2.0\n", " (1, 2)\t4.0\n", " (2, 2)\t5.0\n", " (4, 2)\t4.0\n", " (0, 3)\t4.0\n", " (3, 3)\t5.0\n", " (5, 3)\t1.0\n", " (0, 4)\t5.0\n", " (2, 4)\t2.0\n", " (1, 5)\t1.0\n", " (3, 5)\t4.0\n", " (4, 5)\t2.0\n" ] } ], "source": [ "print(X)" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [], "source": [ "U, s, Vt = svds(X, k=min(ratings.shape)-1)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 3.0, 4.9, 6.4, 6.9, 10.1])" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "svds gives singular values in ascending order, so we need to perform a permutation to get it in the fmiliar form." ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "perm = np.arange(len(s))[::-1]\n", "U = U[:, perm]\n", "s = s[perm]\n", "Vt = Vt[perm, :]" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1.4, 0.4, 2.9, 4.0, 2.7, 2.1],\n", " [ 4.0, 1.5, 4.2, -0.2, 1.0, 0.2],\n", " [ 0.9, -1.1, 4.6, 0.0, 1.8, 0.4],\n", " [ 0.3, 1.0, -0.6, 5.0, 1.9, 2.3],\n", " [ 0.7, -0.7, 3.3, 0.2, 1.4, 0.4],\n", " [ 4.7, 4.0, -0.2, 1.1, -0.5, 0.4]])" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "k = 3\n", "Y = U[:, :k] @ np.diag(s[:k]) @ Vt[:k, :]\n", "Y" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ObservedPredicted
The AvengersNaN0.749016
SherlockNaN-0.688250
Transformers4.03.292351
MatrixNaN0.243724
TitanicNaN1.360181
Me Before You2.00.379015
\n", "
" ], "text/plain": [ " Observed Predicted\n", "The Avengers NaN 0.749016\n", "Sherlock NaN -0.688250\n", "Transformers 4.0 3.292351\n", "Matrix NaN 0.243724\n", "Titanic NaN 1.360181\n", "Me Before You 2.0 0.379015" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "user = 'E'\n", "pd.DataFrame(OrderedDict(\n", " Observed = ratings.loc[user].to_dense(),\n", " Predicted = Y[ratings.index.tolist().index(user)]))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }