Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
C
courseML_phd2023
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
GILSON Matthieu
courseML_phd2023
Commits
8dff0ea6
Commit
8dff0ea6
authored
2 years ago
by
GILSON Matthieu
Browse files
Options
Downloads
Patches
Plain Diff
Upload New File
parent
ba23159a
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
nb_bioinspired_pca/Oja_2D.ipynb
+269
-0
269 additions, 0 deletions
nb_bioinspired_pca/Oja_2D.ipynb
with
269 additions
and
0 deletions
nb_bioinspired_pca/Oja_2D.ipynb
0 → 100644
+
269
−
0
View file @
8dff0ea6
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "91a69c6f",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import scipy.stats as stt\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"id": "6e61ad53",
"metadata": {},
"source": [
"We generate a dataset of 2-dimensional samples normally distributed with mean 0 and a covariance matrix `sigma`"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "1f24c04e",
"metadata": {},
"outputs": [],
"source": [
"n_train = 100 # number of training samples\n",
"\n",
"# mean of input distribution\n",
"mu = np.zeros([2])\n",
"# covariance of input distribution\n",
"sigma = np.eye(2)\n",
"sigma[1,1] = 0.5\n",
"sigma[0,1] = sigma[1,0] =0.7 * sigma[0,0] * sigma[1,1]\n",
"\n",
"# generator of input samples (normal distribution)\n",
"gen_data = stt.multivariate_normal(mu, sigma)\n",
"\n",
"# select desired digits\n",
"data = gen_data.rvs(size=n_train)"
]
},
{
"cell_type": "markdown",
"id": "d1d82a0b",
"metadata": {},
"source": [
"Let us plot the data in their native plane and the principal component of the distribution"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "d4e0b423",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'x2')"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 400x300 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# input samples and principal component\n",
"ev, u = np.linalg.eig(sigma)\n",
"i_pc = np.argmax(np.abs(ev))\n",
"pc1 = np.real(u[:,i_pc])\n",
"plt.figure(figsize=[4,3])\n",
"plt.axes([0.2,0.2,0.7,0.7])\n",
"plt.scatter(data[:,0], data[:,1], marker='.', color='k')\n",
"plt.arrow(0, 0, 2*pc1[0], 2*pc1[1], width=0.1, color='blue')\n",
"plt.legend(['samples','pc1'])\n",
"plt.xlabel('x1')\n",
"plt.ylabel('x2')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "d90d6ac2",
"metadata": {},
"source": [
"We now train a neuronal network following Oja's rule. \n",
"\n",
"The activation dynamics are simply linear, mapping inputs `x` to output `y` after mixing by a weight matrix `w`:\n",
"$$ y = w x = \\sum_i w_i x_i $$\n",
"\n",
"The learning rule corresponds to the weight update:\n",
"$$ \\Delta w_{i} \\propto y * ( x_i - y * w_i ) $$"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "59431cc6",
"metadata": {},
"outputs": [],
"source": [
"N = 2 # number of inputs (2D image of 27 pixels in each dimension)\n",
"\n",
"eta = 3.0 / n_train # learning rate\n",
"\n",
"w = np.random.randn(N) * 0.1 # initial weights\n",
"\n",
"def f(x):\n",
" return np.dot(w,x)\n",
"\n",
"w_hist = np.zeros([n_train,N])\n",
"y_hist = np.zeros([n_train])\n",
"\n",
"# loop over all digits\n",
"for i in range(n_train):\n",
" # calculate output from input\n",
" x = data[i,:]\n",
" y = f(x)\n",
" # Oja'r rule\n",
" w += eta * y * ( x - y * w )\n",
" # store weights and output\n",
" y_hist[i] = y\n",
" w_hist[i,:] = w"
]
},
{
"cell_type": "markdown",
"id": "0e916570",
"metadata": {},
"source": [
"We plot the evolution of the weights and output activity"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "cee1fb3b",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 400x300 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 400x300 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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0oQJE2SPde7cWXrqqad0apF7nD59WgIgbd26VZIkSbJarVKLFi2k+fPn820uXLggmc1madmyZXo10yGlpaVSx44dpY0bN0rXXnstF2B/25eZM2dK/fv3t/u8P+3PsGHDpAcffFD22O233y7dd999kiT5174oBVhL24uKiqTAwEBpzZo1fJsTJ05IRqNRWr9+vebPpghChaqqKmRkZGDQoEGyxwcNGoRffvlFp1a5R3FxMQAgNjYWAJCdnY2CggLZvgUHB+Paa6/12X2bOHEihg0bhhtuuEH2uL/ty7p169C7d2/cddddiI+Px2WXXYZ3332XP+9P+9O/f3/8+OOPOHz4MABg79692LFjB2666SYA/rUvSrS0PSMjA9XV1bJtEhMT0b17d5f2r0lNxqOVwsJC1NbWIiEhQfZ4QkICCgoKdGqV60iShOnTp6N///7o3r07APD2q+1bTk5Og7fRGWvWrMGePXvw+++/13nO3/bln3/+wdKlSzF9+nQ8/fTT+O233/DYY48hODgYY8aM8av9mTlzJoqLi9G5c2eYTCbU1tbixRdfxOjRowH4399GREvbCwoKEBQUhJiYmDrbuKIRJMAOUE5ZKUmS5mksfYFJkyZh37592LFjR53n/GHf8vLyMGXKFPzwww8ICQmxu50/7Atgmw61d+/eeOmllwAAl112GQ4cOIClS5dizJgxfDt/2J9PP/0UH374IT7++GN069YNWVlZmDp1KhITEzF27Fi+nT/siz3cabur+0cRhApxcXEwmUx1zmSnT5+uc1b0VSZPnox169Zh8+bNsik4W7RoAQB+sW8ZGRk4ffo0UlNTERAQgICAAGzduhVvvvkmAgICeHv9YV8AoGXLlujatavssS5duiA3NxeAf/1tnnzySTz11FO4++67cemll+L+++/HtGnTkJ6eDsC/9kWJlra3aNECVVVVOH/+vN1ttEACrEJQUBBSU1OxceNG2eMbN25Ev379dGqVNiRJwqRJk/DFF1/gp59+QnJysuz55ORktGjRQrZvVVVV2Lp1q8/t2/XXX4/9+/cjKyuL33r37o17770XWVlZaN++vd/sCwBcffXVdUoCDx8+jLZt2wLwr79NRUVFnUnHTSYTL0Pzp31RoqXtqampCAwMlG2Tn5+PP/74w7X9c7vrsJHDytBWrFgh/fnnn9LUqVOl8PBw6dixY3o3zSGPPPKIZDabpS1btkj5+fn8VlFRwbeZP3++ZDabpS+++ELav3+/NHr0aJ8pD3KGWAUhSf61L7/99psUEBAgvfjii9Lff/8tffTRR1JYWJj04Ycf8m38ZX/Gjh0rtWrVipehffHFF1JcXJw0Y8YMvo0v70tpaamUmZkpZWZmSgCkhQsXSpmZmbzMVEvbJ0yYILVu3VratGmTtGfPHulf//oXlaF5kiVLlkht27aVgoKCpMsvv5yXcvkyAFRvq1at4ttYrVZpzpw5UosWLaTg4GDpmmuukfbv369fo11AKcD+ti//93//J3Xv3l0KDg6WOnfuLL3zzjuy5/1lf0pKSqQpU6ZIbdq0kUJCQqT27dtLs2fPliwWC9/Gl/dl8+bNqsfJ2LFjJUnS1vbKykpp0qRJUmxsrBQaGirdfPPNUm5urkvtoOkoCYIgdIIyYIIgCJ0gASYIgtAJEmCCIAidIAEmCILQCRJggiAInSABJgiC0AkSYIIgCJ0gASYaBe3atcOiRYs0b79lyxYYDAYUFRV5rU2ucuzYMRgMBmRlZWl+TVpaGkaMGOG1NhHehQSY0IWBAwfKlhaqL7///jv+/e9/a96+X79+yM/Ph9ls9lgb1Fi9ejWio6M1bZuUlIT8/Hw+dSjR+KHpKAmfRZIk1NbWIiDA+c+0efPmLr13UFAQn/XKF6iqqvK5NhHehxww0eCkpaVh69ateOONN2AwGGAwGHDs2DEeC2zYsAG9e/dGcHAwtm/fjqNHj+LWW29FQkICIiIi0KdPH2zatEn2nsoIwmAwYPny5bjtttsQFhaGjh07Yt26dfx5ZQTBnOqGDRvQpUsXREREYMiQIcjPz+evqampwWOPPYbo6Gg0a9YMM2fOxNixY+1GAFu2bMEDDzyA4uJivp/PP/88b+8LL7yAtLQ0mM1mPPTQQ3UiiNraWowbN44vfHnJJZfgjTfeqPf3T/gOJMBEg/PGG2+gb9++eOihh5Cfn4/8/HwkJSXx52fMmIH09HQcPHgQPXr0QFlZGW666SZs2rQJmZmZGDx4MIYPH87n0bXH3LlzMXLkSOzbtw833XQT7r33Xpw7d87u9hUVFViwYAE++OADbNu2Dbm5uXjiiSf48y+//DI++ugjrFq1Cj///DNKSkrqrKYr0q9fPyxatAhRUVF8P8X3e/XVV9G9e3dkZGTg2WefrfN6q9WK1q1b47PPPsOff/6J5557Dk8//TQ+++wzh/tN+BEemVqIIFxEOauZJF2coeqrr75y+vquXbtKb731Fr/ftm1b6fXXX+f3AUjPPPMMv19WViYZDAbp+++/l33W+fPnJUmSpFWrVkkAZCsUL1myREpISOD3ExISpFdffZXfr6mpkdq0aSPdeuutdtu5atUqyWw213m8bdu20ogRI2SPZWdnSwCkzMxMu+/36KOPSnfccQe/P3bsWIefT/g2lAETPkfv3r1l98vLyzF37lx88803OHnyJGpqalBZWenUAffo0YP/Pzw8HJGRkTh9+rTd7cPCwtChQwd+v2XLlnz74uJinDp1CldccQV/3mQyITU1lU9C7irK/VRj2bJlWL58OXJyclBZWYmqqir06tXLrc8jfA8SYMLnCA8Pl91/8sknsWHDBixYsAApKSkIDQ3FnXfeiaqqKofvExgYKLtvMBgciqXa9pJitla1dcLcRbmfSj777DNMmzYNr732Gvr27YvIyEi8+uqr2LVrl9ufSfgWJMCELgQFBaG2tlbTttu3b0daWhpuu+02AEBZWRmOHTvmxdbVxWw2IyEhAb/99hsGDBgAwNZJlpmZ6dCRurKfSrZv345+/frh0Ucf5Y8dPXrUrfcifBPqhCN0oV27dti1axeOHTuGwsJCh840JSUFX3zxBbKysrB3717cc889bl/214fJkycjPT0dX3/9NQ4dOoQpU6bg/PnzDlfBbdeuHcrKyvDjjz+isLAQFRUVmj8vJSUFu3fvxoYNG3D48GE8++yz+P333z2xK4SPQAJM6MITTzwBk8mErl27onnz5g7z3Ndffx0xMTHo168fhg8fjsGDB+Pyyy9vwNbamDlzJkaPHo0xY8agb9++iIiIwODBgxESEmL3Nf369cOECRMwatQoNG/eHK+88ormz5swYQJuv/12jBo1CldeeSXOnj0rc8OE/0NLEhGEm1itVnTp0gUjR47Ef/7zH72bQ/ghlAEThEZycnLwww8/4Nprr4XFYsHixYuRnZ2Ne+65R++mEX4KRRAEoRGj0YjVq1ejT58+uPrqq7F//35s2rQJXbp00btphJ9CEQRBEIROkAMmCILQCRJggiAInSABJgiC0AkSYIIgCJ0gASYIgtAJEmCCIAidIAEmCILQCRJggiAInSABJgiC0In/B7oG/v8kDRW7AAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 400x300 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# weight evolution\n",
"plt.figure(figsize=[4,3])\n",
"plt.axes([0.2,0.2,0.7,0.7])\n",
"plt.plot(range(n_train), w_hist)\n",
"plt.xticks(fontsize=10)\n",
"plt.yticks(fontsize=10)\n",
"plt.xlabel('epoch', fontsize=10)\n",
"plt.ylabel('weight', fontsize=10)\n",
"\n",
"plt.figure(figsize=[4,3])\n",
"plt.axes([0.2,0.2,0.7,0.7])\n",
"plt.imshow(w_hist.T, cmap='jet', interpolation='none', aspect='auto')\n",
"plt.colorbar()\n",
"plt.yticks(fontsize=10)\n",
"plt.yticks(fontsize=10)\n",
"plt.xlabel('training trial', fontsize=10)\n",
"plt.ylabel('weight index', fontsize=10)\n",
"\n",
"# activity evolution\n",
"plt.figure(figsize=[4,3])\n",
"plt.axes([0.2,0.2,0.7,0.7])\n",
"plt.plot(range(n_train), y_hist, 'k')\n",
"plt.xlabel('training trial')\n",
"plt.ylabel('output y')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "5b4e2682",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAAERCAYAAADYEnSgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAw5klEQVR4nO3deVhUdfs/8PeZYReEFEX9yqJBLqWYpqVpYLk8+bUrHx9NbRGTcsm1flqmlrZaSmmbmkm2qvmt9MmerCwBNVHRQHMjSBEIfJBMwI1l5v79QTMxMDOcmTlzlpn7dV1zKcPMmfsMcJ/P3J9NICICY4wxWeiUDoAxxrwJJ13GGJMRJ13GGJMRJ13GGJMRJ13GGJMRJ13GGJMRJ13GGJMRJ13GGJORj9IByMloNKKkpAQhISEQBEHpcBhjHoSIUFVVhQ4dOkCns92e9aqkW1JSgsjISKXDYIx5sKKiInTs2NHm970q6YaEhACof1NatmypcDSMMU9SWVmJyMhIc56xxauSrqmk0LJlS066jDG3aK50yR1pjDEmI066jDEmI066jDEmI066jDFFFBcXIy0tDcXFxUqHIitOuowx2aWmpiI6Ohp33nknoqOjkZqaqnRIshG8aeeIyspKhIaGoqKigkcvMKaQ4uJiREdHw2g0mu/T6/UoKCiwO75V7cTmF27pMsZklZeXZ5FwAcBgMCA/P1+hiOTFSZcxJqu4uLgm02T1ej1iY2MVikhenHQZY7Lq2LEj1q1bB71eD6A+4b777ruaLi04gmu6jDFFFBcXIz8/H7GxsR6RcMXmF6+aBsyYXIqLi5GXl4e4uDiPSCju0LFjR698b7i8wJjEvHk4FGselxcYk5CnDodizeMhY4wpwNuHQ7HmcdJlTELePhyKNY+TLmMS8vbhUKx5XNNlXs1doww8bTgUax7XdBlrhjtHGXTs2BGJiYmccDXI3aufcdJlXqm4uBhTpkwxd3oZjUZMnTrV65YZZJbkGO7HSZd5JS2MMvDW9WaVIteFmJMu80pqH2XAEyzkJ9eFmJMu80pqHmXApQ9lyHUh5qTLvFZycjIKCgqQlpaGgoICJCcnKx0SAG2UPuRUUQHs3QusXg089RRgMLjndeS6EPOQMcZUxpOmEjsyJM9gAPLzgaNHgSNHgJwcIDsbKCmxfNxPPwEDBrg3ZmeG+/EqY4ypjNgEZGpxTZ06FQaDQVWlD0ekpqaayyQ6nQ7r1q0zf5r444/65Gq6HT4MnDwJ1NTUP9fHpz4JN24Szpnj3oQLuH/1M27pMiYDewnIFi1PsPi7ta4D0AVATwhCLwwaNBsnTwbg/Pn6x+l09be6OvvH0+uBIUOA//yn/v/u5sykGdH5hTQkIyODRo4cSe3btycAtHXrVoeeX1FRQQCooqLCPQEyZkVRURHpdDoCYL7p9XoqKipSOjS3+PZboqFDSwk4RkAN1bdXiYBqAowNvhZ30+uJunYlkuvPdv369eafl06no/Xr14t6ntj8oqmOtMuXLyM+Ph5vv/220qEwGWl9vKq3dYzNng388EMEgBsB+Db4jh8AwaFj6XRAy5bAjh31/7qbHCNHNJV07777brz44osYPXq00qEwmXjCeFW1jwmW2n33ATqdY8nVFp0O2L4diImR5HDNkuMCqamk66jq6mpUVlZa3Jh2eMp4VTWPCXaHxx4DBGlyLt5/H7j9dmmOJYYcF0iPTrrLli1DaGio+RYZGal0SMwBnvSxXK1jghuSqozTvj0wYUL9CARXLFgAPPSQa8dwlCwXSCkKz0qAiI60a9euUUVFhflWVFTEHWka4m0dUEpytvPIluxsxzrLGt50OqJRo4gMBmnOzRlFRUWUlpbm0O+aR3akOcrf3x8tW7a0uDHtcFerQ+sdc1KTuoxTXg68845zsej1wE03AZ98Ul/PVYo7l+b06KTLtE/qj+We0DEHSHvhkKqMYzAAa9cC118PbNjgeBx6PdCqFfDNN0CLFo4/XzNcbYbLqaqqirKzsyk7O5sA0Ouvv07Z2dl09uxZUc/ncbrezVPKFVKXAqR4X/bvJ4qPd76kIAhE/v5EWVkunYqixOYXTSXdtLQ0i18M0y0pKUnU8znperddu3ZZ/f1JS0tTOjTR3HXhWL9+Pen1evPxxCbysjKiyZP/nsTgbNIFiP7v/1w6BcWJzS+aWnshMTER5D2zlpnETMOBGi8ko6XxsvZKAa7UH5OTkzF8+HDR044NBmDduvoRBpcv/32fs154ARgzxvnnawnXdJnHalz39ITxsu4cRyq282j/fqB37/rxuJWVzSdbvd728DGdrn542aJFTgatRfI0vNWBywvew17d05nhQHIoKiqiXbt2NRuXs6UAV2MqKyN6+GHxpQSdrv7fYcOsP16vJ+rbl+jqVbeFLyuPrOm6ipOud1BDh5nYBGriaOeYHBeOv2PSkSDMoICAatF1W0Egiooi2r69/ljjxxP5+Fgm3A4diM6dc1v4suOkawUnXe+gdIeZMwlU6YuE7ZhuI+AIiV0dzMeHyM+P6LnnLFuwBw9aJuTAQKKjRxU7PbfgyRHMa8XFxUFoNPlfrg4zaxMNpkyZgqysLJvPUeN054MHC2A0pgLIBNAdza0OZioz/+MfwKlTwLPPAgEBf3+/b1/gttv+/nrLFqBHD6mj1gZOuszjfPfddxZfC4IgW4eZtQRqNBpx66232pyIoaZVyOrqgLfeAiZOHADgwb/utT/ISRCAyMj6Bca3bwc6dbL+uKefBoKCgJQUYORIScPWFpla3qrA5QXPp/RHdWuvLyYOOTvHbNm7l+jGGx1bXNzPj+iFF8R3hhmN9TdPxOUF5pWU/qhuGpbWuOXaXBzJycnIzMzE66+/jszMTFlXIfvvf4GJE4GBA+tLA80xndr//i+QmwssXmxZSrBHEKRb9lGzZLoIqAK3dD2f0i1dk4MHD5IgCA61dKWc2itGbS3RG28QtWghfjaZIBDFxBB9843bw9McHr1gBSdd76CGj+qOxKHEhWL3bqLu3R0rJfj7E734ovPjah0dRqc1nHSt4KTrPdQyAUJMHHIOcSstJXrgAccnONx7L1FBgfOvq0RLXm5i8wtvwc40zZmtsuU4lqOvW79dueWaEAUFBZLFUVdL+Hjpb8h47RB61BzGLXQQazANn2GCzecIQv3eZGvWAMOHO//acpyfGnjkFuyu4pauZ5Gy9aR0S0zSkojRSJSXR7R5M9G8efRn/B10SQg2N18NEIgAeh1z7ZYSXn6Z6No1189N6ckqcuGWrhXc0vUcUraeHD2Wu1rExcXFolf5MiMCfvsNOHy4/nbgAPDzz8ClSwCAOsEXeqq1mNpQCz0OoS8SkIFa+Jnv1+kAoxH45z+BVauAqCjpzotbun/T1NKOjJlIucShI8dKTU01zzjT6XRYt26dZMO7OnbsaD/2xgn24MH6f/9KsPD1BWprLZ7iQ5Zf10GPcrTBKGyzSLgNSwnDhklyOmamYXRTp06FwWDQ5OpuUuKWLpOMnDVRJVq6srfY6uqAL74QnWCbYwRQCz/cjp9wGLcAqF920dcXWLIEePxxwN9f4nNowKmWvIZwTdcKrum6jxI1USnroGKOJXttctOmv1eRETu2q5nb/fjEYlTC6NFEhYXuCd/bcE3XCm7puoeSNTspW0/NHUv28zx1CujWTZJDGSEgBf8PT2EFBAHo3Lm+lDB0qCSHZxCfX3gaMHOZklNvpdwqu7ljyb7zRNeuwD331NcAXFAHPXZiCBYJL8Pfn/DKK8CJE84nXN7C3jWcdJnL1LRKllRsJRapt4Rv1oIFLm0+Vgc9ChGF8fgMdbQVNTXRaN06FX5+zT/XGk/Zwl5RshQ7VIJruu6jlqm3UpCiPt14yqtLU2BvvdWprXYNEOgSgqgrviHgTpenGKtlXQu14mnAVnDSdS+1TL11hRSJpXHSTkpKcj6JFxQQ9e/vVKeZAQK9PXwtAb6SdP55yyQHZ3HStYKTrrK0sOCJq4nF3nq6DiXx2lqilBQy+gdQneDc6IWL81+UtHXKLV37eD1dpipaqQW6Wp+21qnYWLOdjAcOwBjfCzRvPoTqa9BTnajXNiGdDvjXvxD66kJJO/88YQt7VZDpIqAK3NJVhtZaSK7Up8W0dAHQwYMHmz754kWi6dPJCIFq4XgNlwAy6PRUExdHdOlSk7ikKv14QhnJHbily1RD6d0cHNVwhEJmZiY6d+4saniUaUbeq6++am4NWttBAgAuX75sfk7arl34Y+1aGK6Pg2HtOggg+MDxEQsGABVGA7rk5yN182aL78k5tI41Q6aLgCpwS1cZUrV05a4JOzKKofFjly9fTmlpaXTw4EGb575+/XrqJAj0zV+rfplW/7J3q4Ht+m4dQAka+CThqbgjzQpOuu4hJhm6OqTM1WFcjiZsRy4UzT3W2rkXnT5NTwoCXYVANSJKCaZywwl0tVl6mMGjChTFSdcKTrrScyQZOlsLdLWl7EzCdmQUg5jHWpz7vn108X9iyCC2TguBTqILDcBeeuzeYjLqLVu7Rp2OUhu9Nrd05cdJ1wo5k64Whke5Sq4OMleGcTkbo5QtXbM//6S6R6aK7iirgQ9dgx8twMvUo0s1pafXHyZ3wACqMT8G9N+YGHp/zRqPmZyiVdyRpiCtDI9yVXMdZPbm6Dsyf9+VYVzOdOKZOsReeeUVUcOjmh1KRQRs3oya6Fhg/fpmO8qMfy05no5E9Ak4gYiVT+PwL35ISKiP7V+ZmfBF/VKNfwDoXViIm/r0wcaNG7FlyxZ5picz58l0EVAFOVq6Whse5Qp752rvI70zH/edrQk7+vNoHNuKFStEl0Sslk9++42uDBwiuqOsFno6j9Y0DpsI+JgOHfrd4jVMrf7tAFUDdMtf52Tt/fSGT1tqwuUFK+RIut42VdJqJ5GdROfKRcnZmrAiW6HX1FDtC8uoVu9nd8RB446yNZhKocgkYKDV35uGMbaw8ntminnFihUev/uu2nDStYJbuu7ROBnau/BIMc3WmdabrFuh791LVR27iGrZmlrAx9GNbsMPBMwmQG/396bhRcTWRAxv+x1UA066VsjVkeZJK245w10tXXfvTuHyBfPCBaoc/4hFy9XerQY+dBX+NB+v0qQHaui11z4V/XtjuohYGwdsKxF76qctteCka4Xcoxe8eaqkvQuPMxcluT5BOHXBNBqpesOndDmwlahka2oB78AwGhyTS3v2WJ6no783DWMWBIFmzZrFLV0FcNK1gsfpysteAnE0uchZK3cotrw8Ku852KGOsjKE04P+W+jNN4xUWytNzGPGjLF4XwYMGODVn7aUwHukWcF7pGmXkvuwWVVTgz8XrkDI68+BiOAL+yuB1UEPHYxYi2k4On4ZnlsViogIaULJyspCv379mty/fft2BAcHK7r7rpw7RCuN90hjHkVNywpW/7AHf7S/CaGvPQMfqm024RohIBdd8GDnTMTvXY21m6RLuACwZ88eq/fn5+crujCNt4xXdxS3dJmmSLn7r+l4oltiFy6gcNx8RP3wPuqgb3YlsFroYYAvXvB7Af+zfA6mzPCFj4/LITdhq6V78OBB9O3bV/oXFEF1n0xkwC1d5pGkXFZQdEuMCOdf/xhV7WLR4YcPAUDUjLKdGIbFY05hTtE8PDbHPQkXANq3b4/hw4db3JeUlKRYwgW0t5ynrNxfXlYP7khjJmJHQ1w9kktnohNEd5TVQUfn0JbmRn5O+34yuv08Gg6jEwSB7rvvPusLpMvMG8er89oLjNnRbEusuhq5DzwPffxN+J+zewEAOtiuxNVBDyMEvOf7GL5KyUPKmX+h/wDBbfED9R/hp0yZYj4PIsIXX3yB9u3bu/V1xVBTDV5t3PSBhzF1My2i07jmGBsbi5JNGcAjyYi7ctpuojUhACfQHdtGpmL6+33Rpo0bA2/A3oVDDcktOTkZw4cPl7QG7wm4pctc5siKYWp5TWstsfeWrcT5kYvR4f5EtL1S0GzCrYUeVxGAlPav48qen/HsdvkSLuD6Jppy4K19rJCn2qEOXNOVnrun5rr7NYuKiiht1y7anfwWXRTCRM0oq/urtvuNz0j66MWzVFCg3Gpe3j7lXE08dkbaO++8QzExMeTv70+9e/em3bt3i34uJ11pKdFZIvVrnv3+FB29btBfHWXNL05TBx2VIoLeumsrlZUpc9FpzNunnKuFRybdzZs3k6+vL7333nt04sQJmjNnDrVo0YLOnj0r6vlqSrqesNapEstYSvma6cNeohr4iF560QCBPg6fQwd/rCQiz+6h94TfT7l5ZNLt168fTZs2zeK+rl270oIFC0Q9Xy1JVw2tIylovaW7r9tkUcPAjAAd0cXT508forq6v5/vqWsne8rvp9w8LulWV1eTXq+nL7/80uL+2bNn0x133CHqGGpIup7WOlKipijVax76JKPZ1u1lBNLG296g8+fqmjzf036WRJ55TnLxuHG65eXlMBgMiGg0aT0iIgLnzp2z+pzq6mpUVlZa3JSm5Zk61kYMJCcno6CgAGlpabLtzdX4NYcPH251JENWVhZef/11ZGVlWT1OZQcDvkJf1EJvcb/hrxlle1qORO5Xv2JC5myER+ibPN8Tx6Jq+fdTM2S6CLjs999/JwC0b98+i/tffPFF6tKli9XnLFmyxOrHP27pOk6tHzltxZWUlGTxHo8ZM6bJc4uKimgAejXpKCtBO/p84qcWpQR7PKkjS6u/n2rA5QUiunbtGlVUVJhvRUVFiiddIu0N81HrH6KtuLZv3271Yrto0aImx3jvvfW0Dz3IiPppvim4i1rgOlVdWMSQsuNLa7+fauFxSZeoviNt+vTpFvd169ZNcx1pRNpqHam1w8hWXNOnT7d6vyAIVt/vXSnf05aWI6kXuqnuwiKGOz6FaOn3Uy08MumahoylpqbSiRMnaO7cudSiRQsqKCgQ9Xw1JV0t8ZSWrq0LRVFREQmCoMoLS3PU+rPxRh7XkQYA48aNw6pVq/D888+jV69e2L17N7755htER0crHZpHU6LDSMw0X1txjRw5EmPGjGnyeFtTZPPy8kBWlpXW6XRo0aKF7FOcHeFsx5cSU7fZX+S5BqgDt3RdI9dHTkc/LtuKa9GiReYWrL3apLXWIgAaO3asKjsPG3KmpavWTlGt88jygqs46aqf1B+XxV4oGnYe6XQ6WrhwoWY+tjvS8cXlCPfxyPIC83xSjxMVu8pVw7G/Z8+exZAhQzQzXtWRsdI8Dld5vJ4uUxV769zKgf6q7Uodh7t3xe3YsaOo4yr9/jIH19M9cuQIXnzxRaxevRrl5eUW36usrMTkyZMlDY5JT+0dKErN8mq8X9p3330nWRxq2hXXE2fRaY7YesV3331Hfn5+dOONN1JUVBSFh4fTrl27zN8/d+4c6XQ6p+shcvD2mq6WOlCk6rQTM2nAXp3T1TjUWkPlcbjSk7wjrX///rRw4UIiIjIajbR8+XIKDg6mHTt2EBEnXbVT6x+/O4m9yLhz8odaJ5Yw6UnekXb8+HFz+UAQBMyfPx/r1q3DmDFjsH37dlcb3MzNvK0DpfGmjUajEVOnTrVaVnHntjda2FKHyUt00vX398fFixct7pswYQJSU1Mxfvx4bN26VerYmIS87Y/fkYuMO+ucUh1b7bV45gCxTeehQ4fSihUrrH5v48aN5Ovry+UFlZNzIROldx5wppzizjqnK8fWUi3em0le0/3yyy9p7ty5Nr+/ceNGSkxMFB+hArw96RLZ/+OXKlGqJUl4wmpZ3liL1yq3zUjbuXOnze+tXbvW0cPJipOubY0Tpa1PNc1RW5KQovWqZKudO+K0w21J18/Pj5544gmqrq4231dWVkYjR46k6667zvFIZcRJ1zpbaw8sX77c4WO5miSULks0pnSrXW0XMWab25Lu/v37KS4ujnr27EnHjh2jr7/+mtq2bUuJiYlUWFjodMBy4KRrna1EqdPpHP7jdiVJKJ3gGlNLwvOEMok3cOuCN5cuXaIHH3yQ/P39ydfXl1599VUyGo1OBSonTrrW2WrpOvsx1pkkoZYE15CaPtrzZAb1c+uCN7m5ucjKykLHjh3h4+ODU6dO4cqVK84ciqlAx44d8eqrrza539khZc5sVqnGccRqGmYnduEepn4OJ91XXnkF/fv3x9ChQ3Hs2DFkZWUhOzsbPXv2RGZmpjtiZDKYN28eli9fbk4yro5VdTRJqCnBmfA6BcwtHG1Ct2vXjr755huL+2pqamjevHnk5+fn6OFkxeWF5rnrY6yYDjK11i75oz0TQ2x+EYis7FNiR3l5OcLDw61+LyMjAwkJCa5fCdyksrISoaGhqKioQMuWLZUOx2ukpqaap+TqdDqsW7fOZsmhuLgY+fn5iI2NFd2idPeyiYyJITa/OJx0tYyTrvyKi4sRHR3dZP3WgoICSRKkIwmdMXcSm1945wjmVu7sIHNkURvG1IKTLnMrd3aQqXHEA2PN4aTL3MqdIwDUOOKBseZw0mVu58y4XTEaJ3SdTodly5ZxZxpTNd6YkslC7MaJjkpOTsaff/6Jp556CkajEQsWLECrVq1U2ZnGoywYwC1dpnHFxcXmhAuotzNNTZtTMmVx0lUJte0MoLZ4bNFCZxqPsmANcdJVAbW1gtQWjz1a6EzTwoWByYeTrsLU1gpSWzzN0cL6CFq4MDD5cNJVmNpaQWqLRwx3jY6QihYuDEw+PHpBYaZWUONpskq1gtQWj1juGh0hleTkZAwfPtzhdSWY5+GWrsLU1gpSWzyehNfEZQAveKMazqyu5Qnx8NhV5inE5hcuL6iE2j4eyxGPllcI44sFcxaXF7yMWsbfam2URENaGlLH1IeTrhdRU7LQ4igJQNsXC6YOnHS9RFZWlqqShVbHrmr1YsHUg5OuF0hNTcWtt96qqmSh9lEStsowWr1YMPXgpOvhTB+HrQ1SUTpZqHVSg70yjNovFkz9eMiYh0tLS8Odd97Z5H6tjRaQi9g93dwxpM5gMKC2tlaSYzHp+fr6mi+21vCQMQbA+gwznU6H/fv3o2/fvgpGpi6mIWDnz5+3WYZpmFylHFJHRDh37hwuXrwoyfGY+4SFhaFdu3YQBMHpY3DS9XCmj8NTp06FwWAwfxz21oRrbXxt4/HCgiBYlGPcXYYxJdy2bdsiKCjIpT9o5h5EhCtXrqCsrAwA0L59e6ePxUnXC/C8/3rWJmMMHz68yagOU+I1Go1ur9kaDAZzwm3durVbXoNJIzAwEABQVlaGtm3b2i012MNJ10uobcab3GyNr924cWOTcoLRaMSWLVvQpk0bt1+kTDXcoKAgt70Gk47p51RbW8tJlzF7bI2vFQTB6qpq/fv3l/UixSUFbZDi58RDxphXsDW+tn///jwEjMmKky6zSS3rNEjB3vhaKccLe9J7pkWTJk3CqFGjlA7DLk66zCo1rdMgFXvJVYq1bj3xPWPS00zSfemllzBgwAAEBQUhLCxM6XA8micv6uKuhcQ9+T1j0tJM0q2pqcHYsWMxffp0pUPxeLyoi+O88T37/PPP0aNHDwQGBqJ169YYMmQILl++jKysLAwdOhTh4eEIDQ1FQkICfv75Z4vnCoKAd999FyNHjkRQUBC6deuGzMxM5OfnIzExES1atED//v3x22+/mZ+zdOlS9OrVC++++y4iIyMRFBSEsWPH2p1UQkRYvnw5OnfujMDAQMTHx+Pzzz83f//PP//EAw88gDZt2iAwMBBxcXHYsGGD5O9VQ5pJus899xwef/xx9OjRQ+lQPB4v6uI4tbxnctWUS0tLMWHCBEyePBknT55Eeno6Ro8eDSJCVVUVkpKSsGfPHuzfvx9xcXEYMWIEqqqqLI7xwgsvYOLEicjJyUHXrl1x//33Y+rUqXj66adx6NAhAMDMmTMtnpOfn48tW7Zg+/bt+Pbbb5GTk4MZM2bYjHPx4sXYsGED1qxZg+PHj+Pxxx/Hgw8+iIyMDADAM888gxMnTmDHjh04efIk1qxZg/DwcInfrUZIYzZs2EChoaGiHnvt2jWqqKgw34qKiggAVVRUuDdID7B+/XrS6/UEgPR6Pa1fv17pkFTPmffs6tWrdOLECbp69aokr6/T6QgA6XQ6t/7MDh8+TACooKCg2cfW1dVRSEgIbd++3XwfAFq8eLH568zMTAJAqamp5vs2bdpEAQEB5q+XLFlCer2eioqKzPft2LGDdDodlZaWEhFRUlIS3XvvvUREdOnSJQoICKB9+/ZZxJOcnEwTJkwgIqJ77rmHHn74YdHnbe/nVVFRISq/aKal64xly5YhNDTUfIuMjFQ6JM1Q6wpgaqbkeyZ3TTk+Ph533XUXevTogbFjx+K9997Dn3/+CaB+xta0adNwww03mP/2Ll26hMLCQotj9OzZ0/z/iIgIALD4JBsREYFr166hsrLSfF9UVJRFPb5///4wGo3Izc1tEuOJEydw7do1DB06FMHBwebbRx99ZC5bTJ8+HZs3b0avXr3w5JNPYt++fRK8O/YpmnSXLl0KQRDs3kwfM5zx9NNPo6KiwnwrKiqSMHrPx7vXOk6p90zumrJer8fOnTuxY8cOdO/eHW+99Ra6dOmCM2fOYNKkSTh8+DBWrVqFffv2IScnB61bt0ZNTY3FMXx9fc3/N006sHZf4/NqyPQYa5MWTM/7z3/+g5ycHPPtxIkT5rru3XffjbNnz2Lu3LkoKSnBXXfdhXnz5jnzloim6Iy0mTNnYvz48XYfExMT4/Tx/f394e/v7/TzGdMKa6vJubumLAgCbr/9dtx+++149tlnER0dja1bt2LPnj1YvXo1RowYAQAoKipCeXm5JK9ZWFiIkpISdOjQAQCQmZkJnU6HG264oclju3fvDn9/fxQWFiIhIcHmMdu0aYNJkyZh0qRJGDRoEObPn4+UlBRJ4rVG0aQbHh7u/qI1Y17A1mpy7mpxHzhwAD/++COGDRuGtm3b4sCBAzh//jy6deuG2NhYfPzxx7jllltQWVmJ+fPnmxeLcVVAQACSkpKQkpKCyspKzJ49G/fddx/atWvX5LEhISGYN28eHn/8cRiNRgwcOBCVlZXYt28fgoODkZSUhGeffRZ9+vTBjTfeiOrqanz99dfo1q2bJLHaopm1FwoLC3HhwgUUFhbCYDAgJycHABAbG4vg4GBlg2NMBeRcTa5ly5bYvXs3Vq1ahcrKSkRHR+O1117D3XffjXbt2mHKlCm4+eabERUVhZdfflmyj+yxsbEYPXo0RowYgQsXLmDEiBFYvXq1zce/8MILaNu2LZYtW4bTp08jLCwMvXv3xsKFCwEAfn5+ePrpp1FQUIDAwEAMGjQImzdvliRWWzSzc8SkSZPw4YcfNrk/LS0NiYmJoo7hjTtHiGFtjVkmj2vXruHMmTPo1KkTAgIClA5H1ZYuXYpt27aZG1xKsPfzEptfNDN64YMPPgARNbmJTbjMOp66ypi8NJN0leLJC5jw1FXG5MdJ1w5PbwV649RVpl1Lly5VtLQgFU66NnhDK1AtU1cZ8yacdG3whlagvTVmGWPuoZkhY3JTYrC5EnjTSsbkxS1dG7ypFcjTfRmTD7d07eBWIGNMapx0m+HtW5czxqTFSZcxlSosBCRaJ0aU8HAgKkq+1/NWnHQZU6HCQqBLF+DaNfleMyAAyM2VL/HOmTMHe/fuxbFjx9CtWzePGIMrBnekMaYSNTU1qKysRE1NDcrL5U24QP3rydmyJiJMnjwZ48aNk+9FVYCTLmMqcOHCBRw9ehS//vorjh49at6FQc0SExMxc+ZMzJw5E2FhYWjdujUWL14M0xpa1dXVePLJJxEZGQl/f3/ExcVZzOp88803MWPGDHTu3FmpU1AElxcYU1hdXR1KSkos7istLQVwnTIBOeDDDz9EcnIyDhw4gEOHDmHKlCmIjo7Go48+iokTJyIzMxNvvvkm4uPjcebMGckWM9cyTrqMKayurk7pEJwWGRmJlStXQhAEdOnSBb/88gtWrlyJhIQEbNmyBTt37sSQIUMAwOtatLZweYExhfn4aLftc9ttt1nsT9a/f3/k5eUhOzsber3e7jY53oqTLmMK8/HxMe/5ZdK+fXuFopEGL8hum3YvsYx5kFatWiE8PBzV1dXw9/fHsWN+Sockyv79+5t8HRcXh/j4eBiNRmRkZJjLC6wet3QZUwk/Pz+EhITAz08bCReo3+n3iSeeQG5uLjZt2oS33noLc+bMQUxMDJKSkjB58mRs27YNZ86cQXp6OrZs2WJ+bn5+PnJycnDu3DlcvXrVvEV6463aPQ23dBlTofDw+skKck+OcHRz7okTJ+Lq1avo168f9Ho9Zs2ahSlTpgAA1qxZg4ULF+Kxxx7DH3/8gaioKPOGkADwyCOPICMjw/z1zTffDAA4c+YMYmJiXD4ftdLMxpRS4I0pmdrY2+hQ7dOAExMT0atXL6xatcptMamNFBtTckuXMZWKiuK1EDwR13Q1wJM3x2TM23BLV+VSU1PNe7XpdDqsW7cOycnJSofFGNLT05UOQZO4pati3rA5JmPehpOuinnD5piMeRtOuirGW6Qz5nk46aqYN22OyZi34I40lePNMRnzLJx0NYA3x2TMc3DSZUyt1D4lTUIxMTGYO3cu5s6dK+rxBQUF6NSpE7Kzs9GrVy+3xiY1TrqMqZE37EzZQFZWFlq0aCHpMT/44APMnTsXFy9elPS4ruKONMbUyBt2pmygTZs2CAoKUuS15cZJlzHmsO3btyMsLMw8jjwnJweCIGD+/Pnmx0ydOhUTJkwAAOzbtw933HEHAgMDERkZidmzZ+Py5cvmx8bExFgsnHPq1CkMHDgQAQEB6N69O3744QcIgoBt27ZZxHH69GkMHjwYQUFBiI+PR2ZmJoD62XIPP/wwKioqIAgCBEHA0qVLAQCrV69GXFwcAgICEBERgTFjxrjhHbKNky5jzGF33HEHqqqqkJ2dDQDIyMhAeHi4xVKN6enpSEhIwC+//ILhw4dj9OjROHr0KD777DPs3bsXM2fOtHpso9GIUaNGISgoCAcOHMC6deuwaNEiq49dtGgR5s2bh5ycHNxwww2YMGEC6urqMGDAAKxatQotW7ZEaWkpSktLMW/ePBw6dAizZ8/G888/j9zcXHz77be44447pH+D7CEvUlFRQQCooqJC6VAYIyKiq1ev0okTJ+jq1auW3zh8mAiQ/3b4sOjYe/fuTSkpKURENGrUKHrppZfIz8+PKisrqbS0lADQyZMn6aGHHqIpU6ZYPHfPnj2k0+nM5x0dHU0rV64kIqIdO3aQj48PlZaWmh+/c+dOAkBbt24lIqIzZ84QAFq/fr35McePHze/JhHRhg0bKDQ01OJ1v/jiC2rZsiVVVlaKPs+GbP68SHx+4ZYuY8wpiYmJSE9PBxFhz549uPfee3HTTTdh7969SEtLQ0REBLp27YrDhw/jgw8+QHBwsPk2fPhwGI1GnDlzpslxc3NzERkZiXbt2pnv69evn9UYevbsaf6/aV+5srIymzEPHToU0dHR6Ny5Mx566CF8+umnuHLlirNvgVM46TLGnJKYmIg9e/bgyJEj0Ol06N69OxISEpCRkWEuLQB/L9Rk2o4nJycHR44cQV5eHq6//vomxyUiix2G7fH19TX/3/ScxuuVNBQSEoKff/4ZmzZtQvv27fHss88iPj5e1hEOnHQZY04x1XVXrVqFhIQECIKAhIQEpKenWyTd3r174/jx44iNjW1ys7YfXNeuXVFYWIj//ve/5vuysrIcjs/Pzw8Gg6HJ/T4+PhgyZAiWL1+Oo0ePoqCgALt27XL4+M7ipMsYc0poaCh69eqFTz75BImJiQDqE/HPP/+MX3/91XzfU089hczMTMyYMQM5OTnIy8vDV199hVmzZlk97tChQ3H99dcjKSkJR48exU8//WTuSBPbAgbqR0RcunQJP/74I8rLy3HlyhV8/fXXePPNN5GTk4OzZ8/io48+gtFoRJcuXVx6LxzBSZcxNTLtTCknJ3amHDx4MAwGgznBXnfddejevTvatGmDbt26Aaivu2ZkZCAvLw+DBg3CzTffjGeeecZcg21Mr9dj27ZtuHTpEvr27YtHHnkEixcv/itE8e/JgAEDMG3aNIwbNw5t2rTB8uXLERYWhi+//BJ33nknunXrhrVr12LTpk248cYbHTpvV/DGlIwpyN5Gh940Dbg5P/30EwYOHIj8/HyrdWC58MaUjHkyL96ZcuvWrQgODkZcXBzy8/MxZ84c3H777YomXKlw0pVIcXEx8vLyEBcXxyuCMeaiqqoqPPnkkygqKkJ4eDiGDBmC1157TemwJMFJVwK8eSRj0po4cSImTpyodBhuwR1pLuLNIxljjuCk6yLePJJJwYv6szVNip+TJpJuQUEBkpOT0alTJwQGBuL666/HkiVLUFNTo3RovHkkc4lpRpXcU1GZc0w/p4Yz4RyliZruqVOnYDQa8e677yI2NhbHjh3Do48+isuXLyMlJUXR2EybR06dOhUGg4E3j2QO0ev1CAsLM68XEBQU5NAEACYPIsKVK1dQVlaGsLAw82axztDsON0VK1ZgzZo1OH36tOjnuHOcbnFxMW8eyZxCRDh37pzqdjhgTYWFhaFdu3ZWL4weP063oqICrVq1UjoMM948kjlLEAS0b98ebdu2RW1trdLhMBt8fX1dauGaaDLp/vbbb3jrrbeaHbdXXV2N6upq89eVlZXuDo0xp+n1ekn+qJm6KdqRtnTpUvNWGrZuhw4dsnhOSUkJ/vGPf2Ds2LF45JFH7B5/2bJlCA0NNd8iIyPdeTqMMdYsRWu65eXlKG9mbnlMTIx5jnNJSQkGDx6MW2+9FR988EGTUQONWWvpRkZG8toLjDHJaaKmGx4ejnCRqxr9/vvvGDx4MPr06YMNGzY0m3ABwN/fH/7+/q6GyRhjktFETbekpASJiYmIiopCSkoKzp8/b/5ewy09mmNq1HNtlzEmNVNeaa54oImk+/333yM/Px/5+flNRgg4Uh2pqqoCAK7tMsbcpqqqCqGhoTa/r9lxus4wGo0oKSlBSEiIogPQTbXloqIiTdeWPeE8POEcAM84D62fAxGhqqoKHTp0sFv+1ERLVyo6nU5VY2lbtmypyV+uxjzhPDzhHADPOA8tn4O9Fq6JJtZeYIwxT8FJlzHGZMRJVwH+/v5YsmSJ5oezecJ5eMI5AJ5xHp5wDmJ4VUcaY4wpjVu6jDEmI066jDEmI066jDEmI066jDEmI066ClLz3m+OeumllzBgwAAEBQUhLCxM6XBEW716NTp16oSAgAD06dMHe/bsUTokh+zevRv33HMPOnToAEEQsG3bNqVDctiyZcvQt29fhISEoG3bthg1ahRyc3OVDsttOOkqqOHeb8ePH8fKlSuxdu1aLFy4UOnQHFZTU4OxY8di+vTpSoci2meffYa5c+di0aJFyM7OxqBBg3D33XejsLBQ6dBEu3z5MuLj4/H2228rHYrTMjIyMGPGDOzfvx87d+5EXV0dhg0bhsuXLysdmnsQU5Xly5dTp06dlA7DaRs2bKDQ0FClwxClX79+NG3aNIv7unbtSgsWLFAoItcAoK1btyodhsvKysoIAGVkZCgdiltwS1dl1Lb3m6eqqanB4cOHMWzYMIv7hw0bhn379ikUFQPq/wYAeOzfASddFTHt/TZt2jSlQ/F45eXlMBgMiIiIsLg/IiIC586dUygqRkR44oknMHDgQNx0001Kh+MWnHTdwN17v8nFmfPQmsZLfBKRost+eruZM2fi6NGj2LRpk9KhuI1XLe0ol5kzZ2L8+PF2HxMTE2P+v2nvt/79+2PdunVujk48R89DS8LDw6HX65u0asvKypq0fpk8Zs2aha+++gq7d+9W1RKsUuOk6wbu3vtNLo6ch9b4+fmhT58+2LlzJ/75z3+a79+5cyfuvfdeBSPzPkSEWbNmYevWrUhPT0enTp2UDsmtOOkqSKq939SgsLAQFy5cQGFhIQwGA3JycgAAsbGxCA4OVjY4G5544gk89NBDuOWWW8yfMgoLCzVVU7906RLy8/PNX585cwY5OTlo1aoVoqKiFIxMvBkzZmDjxo3497//jZCQEPOnj9DQUAQGBiocnRsoPHrCq23YsIEAWL1pTVJSktXzSEtLUzo0u9555x2Kjo4mPz8/6t27t+aGKaWlpVl935OSkpQOTTRbfwMbNmxQOjS34KUdGWNMRuopIDLGmBfgpMsYYzLipMsYYzLipMsYYzLipMsYYzLipMsYYzLipMsYYzLipMsYYzLipMuYHaWlpbj//vvRpUsX6HQ6zJ07V+mQmMZx0mXMjurqarRp0waLFi1CfHy80uEwD8BJl3m18+fPo127dnj55ZfN9x04cAB+fn74/vvvERMTgzfeeAMTJ05EaGiogpEyT8GrjDGv1qZNG7z//vsYNWoUhg0bhq5du+LBBx/EY4891mQrH8akwEmXeb0RI0bg0UcfxQMPPIC+ffsiICAAr7zyitJhMQ/F5QXGAKSkpKCurg5btmzBp59+ioCAAKVDYh6Kky5jAE6fPo2SkhIYjUacPXtW6XCYB+PyAvN6NTU1eOCBBzBu3Dh07doVycnJ+OWXX3ivNOYWnHSZ11u0aBEqKirw5ptvIjg4GDt27EBycjK+/vprADBvPXTp0iWcP38eOTk58PPzQ/fu3RWMmmkV7xzBvFp6ejqGDh2KtLQ0DBw4EED9fm89e/bEsmXLMH36dKtbskdHR6OgoEDmaJkn4KTLGGMy4o40xhiTESddxhiTESddxhiTESddxhiTESddxhiTESddxhiTESddxhiTESddxhiTESddxhiTESddxhiTESddxhiTESddxhiT0f8HjOioR3lV+mYAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 400x300 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# final weights versus principal component\n",
"plt.figure(figsize=[4,3])\n",
"plt.axes([0.2,0.2,0.7,0.7])\n",
"plt.scatter(data[:,0], data[:,1], marker='.', color='k')\n",
"plt.arrow(0, 0, 2*pc1[0], 2*pc1[1], width=0.1, color='blue')\n",
"plt.arrow(0, 0, w[0], w[1], width=0.1, color='red')\n",
"plt.legend(['samples','pc1','weights'])\n",
"plt.xlabel('x1')\n",
"plt.ylabel('x2')\n",
"\n",
"plt.show()"
]
}
],
"metadata": {
"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.10.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
%% Cell type:code id:91a69c6f tags:
```
python
import
numpy
as
np
import
scipy.stats
as
stt
import
matplotlib.pyplot
as
plt
```
%% Cell type:markdown id:6e61ad53 tags:
We generate a dataset of 2-dimensional samples normally distributed with mean 0 and a covariance matrix
`sigma`
%% Cell type:code id:1f24c04e tags:
```
python
n_train
=
100
# number of training samples
# mean of input distribution
mu
=
np
.
zeros
([
2
])
# covariance of input distribution
sigma
=
np
.
eye
(
2
)
sigma
[
1
,
1
]
=
0.5
sigma
[
0
,
1
]
=
sigma
[
1
,
0
]
=
0.7
*
sigma
[
0
,
0
]
*
sigma
[
1
,
1
]
# generator of input samples (normal distribution)
gen_data
=
stt
.
multivariate_normal
(
mu
,
sigma
)
# select desired digits
data
=
gen_data
.
rvs
(
size
=
n_train
)
```
%% Cell type:markdown id:d1d82a0b tags:
Let us plot the data in their native plane and the principal component of the distribution
%% Cell type:code id:d4e0b423 tags:
```
python
# input samples and principal component
ev
,
u
=
np
.
linalg
.
eig
(
sigma
)
i_pc
=
np
.
argmax
(
np
.
abs
(
ev
))
pc1
=
np
.
real
(
u
[:,
i_pc
])
plt
.
figure
(
figsize
=
[
4
,
3
])
plt
.
axes
([
0.2
,
0.2
,
0.7
,
0.7
])
plt
.
scatter
(
data
[:,
0
],
data
[:,
1
],
marker
=
'
.
'
,
color
=
'
k
'
)
plt
.
arrow
(
0
,
0
,
2
*
pc1
[
0
],
2
*
pc1
[
1
],
width
=
0.1
,
color
=
'
blue
'
)
plt
.
legend
([
'
samples
'
,
'
pc1
'
])
plt
.
xlabel
(
'
x1
'
)
plt
.
ylabel
(
'
x2
'
)
plt
.
show
()
```
%% Output
Text(0, 0.5, 'x2')
%% Cell type:markdown id:d90d6ac2 tags:
We now train a neuronal network following Oja's rule.
The activation dynamics are simply linear, mapping inputs
`x`
to output
`y`
after mixing by a weight matrix
`w`
:
$$ y = w x =
\s
um_i w_i x_i $$
The learning rule corresponds to the weight update:
$$
\D
elta w_{i}
\p
ropto y
* ( x_i - y *
w_i ) $$
%% Cell type:code id:59431cc6 tags:
```
python
N
=
2
# number of inputs (2D image of 27 pixels in each dimension)
eta
=
3.0
/
n_train
# learning rate
w
=
np
.
random
.
randn
(
N
)
*
0.1
# initial weights
def
f
(
x
):
return
np
.
dot
(
w
,
x
)
w_hist
=
np
.
zeros
([
n_train
,
N
])
y_hist
=
np
.
zeros
([
n_train
])
# loop over all digits
for
i
in
range
(
n_train
):
# calculate output from input
x
=
data
[
i
,:]
y
=
f
(
x
)
# Oja'r rule
w
+=
eta
*
y
*
(
x
-
y
*
w
)
# store weights and output
y_hist
[
i
]
=
y
w_hist
[
i
,:]
=
w
```
%% Cell type:markdown id:0e916570 tags:
We plot the evolution of the weights and output activity
%% Cell type:code id:cee1fb3b tags:
```
python
# weight evolution
plt
.
figure
(
figsize
=
[
4
,
3
])
plt
.
axes
([
0.2
,
0.2
,
0.7
,
0.7
])
plt
.
plot
(
range
(
n_train
),
w_hist
)
plt
.
xticks
(
fontsize
=
10
)
plt
.
yticks
(
fontsize
=
10
)
plt
.
xlabel
(
'
epoch
'
,
fontsize
=
10
)
plt
.
ylabel
(
'
weight
'
,
fontsize
=
10
)
plt
.
figure
(
figsize
=
[
4
,
3
])
plt
.
axes
([
0.2
,
0.2
,
0.7
,
0.7
])
plt
.
imshow
(
w_hist
.
T
,
cmap
=
'
jet
'
,
interpolation
=
'
none
'
,
aspect
=
'
auto
'
)
plt
.
colorbar
()
plt
.
yticks
(
fontsize
=
10
)
plt
.
yticks
(
fontsize
=
10
)
plt
.
xlabel
(
'
training trial
'
,
fontsize
=
10
)
plt
.
ylabel
(
'
weight index
'
,
fontsize
=
10
)
# activity evolution
plt
.
figure
(
figsize
=
[
4
,
3
])
plt
.
axes
([
0.2
,
0.2
,
0.7
,
0.7
])
plt
.
plot
(
range
(
n_train
),
y_hist
,
'
k
'
)
plt
.
xlabel
(
'
training trial
'
)
plt
.
ylabel
(
'
output y
'
)
plt
.
show
()
```
%% Output
%% Cell type:code id:5b4e2682 tags:
```
python
# final weights versus principal component
plt
.
figure
(
figsize
=
[
4
,
3
])
plt
.
axes
([
0.2
,
0.2
,
0.7
,
0.7
])
plt
.
scatter
(
data
[:,
0
],
data
[:,
1
],
marker
=
'
.
'
,
color
=
'
k
'
)
plt
.
arrow
(
0
,
0
,
2
*
pc1
[
0
],
2
*
pc1
[
1
],
width
=
0.1
,
color
=
'
blue
'
)
plt
.
arrow
(
0
,
0
,
w
[
0
],
w
[
1
],
width
=
0.1
,
color
=
'
red
'
)
plt
.
legend
([
'
samples
'
,
'
pc1
'
,
'
weights
'
])
plt
.
xlabel
(
'
x1
'
)
plt
.
ylabel
(
'
x2
'
)
plt
.
show
()
```
%% Output
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment