diff --git a/doc/HandWrittenNotes/2022/NotesSep292022pdf b/doc/HandWrittenNotes/2022/NotesSep292022pdf new file mode 100644 index 000000000..5255682ff Binary files /dev/null and b/doc/HandWrittenNotes/2022/NotesSep292022pdf differ diff --git a/doc/pub/week39/ipynb/week39.ipynb b/doc/pub/week39/ipynb/week39.ipynb index 4e8920c3c..6cb26a370 100644 --- a/doc/pub/week39/ipynb/week39.ipynb +++ b/doc/pub/week39/ipynb/week39.ipynb @@ -2,10 +2,8 @@ "cells": [ { "cell_type": "markdown", - "id": "e6d28181", - "metadata": { - "editable": true - }, + "id": "4c73ece8", + "metadata": {}, "source": [ "\n", @@ -14,10 +12,8 @@ }, { "cell_type": "markdown", - "id": "fa5a3702", - "metadata": { - "editable": true - }, + "id": "22602ad0", + "metadata": {}, "source": [ "# Week 39: Optimization and Gradient Methods\n", "**Morten Hjorth-Jensen**, Department of Physics, University of Oslo and Department of Physics and Astronomy and Facility for Rare Isotope Beams, Michigan State University\n", @@ -29,10 +25,8 @@ }, { "cell_type": "markdown", - "id": "d109da99", - "metadata": { - "editable": true - }, + "id": "f2fcd724", + "metadata": {}, "source": [ "## Plan for week 39\n", "\n", @@ -53,10 +47,8 @@ }, { "cell_type": "markdown", - "id": "6962d370", - "metadata": { - "editable": true - }, + "id": "67125149", + "metadata": {}, "source": [ "## Optimization, the central part of any Machine Learning algortithm\n", "\n", @@ -74,10 +66,8 @@ }, { "cell_type": "markdown", - "id": "118ff3da", - "metadata": { - "editable": true - }, + "id": "0d07977c", + "metadata": {}, "source": [ "## Revisiting our Logistic Regression case\n", "\n", @@ -91,10 +81,8 @@ }, { "cell_type": "markdown", - "id": "290c6917", - "metadata": { - "editable": true - }, + "id": "973763d7", + "metadata": {}, "source": [ "$$\n", "\\begin{align*}\n", @@ -106,20 +94,16 @@ }, { "cell_type": "markdown", - "id": "6e462b95", - "metadata": { - "editable": true - }, + "id": "d0a82293", + "metadata": {}, "source": [ "where $\\boldsymbol{\\beta}$ are the weights we wish to extract from data, in our case $\\beta_0$ and $\\beta_1$." ] }, { "cell_type": "markdown", - "id": "ff55d62b", - "metadata": { - "editable": true - }, + "id": "de856843", + "metadata": {}, "source": [ "## The equations to solve\n", "\n", @@ -132,10 +116,8 @@ }, { "cell_type": "markdown", - "id": "47b40f46", - "metadata": { - "editable": true - }, + "id": "a60566a0", + "metadata": {}, "source": [ "$$\n", "\\frac{\\partial \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = -\\boldsymbol{X}^T\\left(\\boldsymbol{y}-\\boldsymbol{p}\\right).\n", @@ -144,10 +126,8 @@ }, { "cell_type": "markdown", - "id": "b42e0f80", - "metadata": { - "editable": true - }, + "id": "ef8826c0", + "metadata": {}, "source": [ "If we in addition define a diagonal matrix $\\boldsymbol{W}$ with elements \n", "$p(y_i\\vert x_i,\\boldsymbol{\\beta})(1-p(y_i\\vert x_i,\\boldsymbol{\\beta})$, we can obtain a compact expression of the second derivative as" @@ -155,10 +135,8 @@ }, { "cell_type": "markdown", - "id": "27b035db", - "metadata": { - "editable": true - }, + "id": "566fdac8", + "metadata": {}, "source": [ "$$\n", "\\frac{\\partial^2 \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}\\partial \\boldsymbol{\\beta}^T} = \\boldsymbol{X}^T\\boldsymbol{W}\\boldsymbol{X}.\n", @@ -167,20 +145,16 @@ }, { "cell_type": "markdown", - "id": "6475213d", - "metadata": { - "editable": true - }, + "id": "69a2105f", + "metadata": {}, "source": [ "This defines what is called the Hessian matrix." ] }, { "cell_type": "markdown", - "id": "67c8df04", - "metadata": { - "editable": true - }, + "id": "0e766c2c", + "metadata": {}, "source": [ "## Solving using Newton-Raphson's method\n", "\n", @@ -191,10 +165,8 @@ }, { "cell_type": "markdown", - "id": "74a165b8", - "metadata": { - "editable": true - }, + "id": "900e0a5d", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{\\beta}^{\\mathrm{new}} = \\boldsymbol{\\beta}^{\\mathrm{old}}-\\left(\\frac{\\partial^2 \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}\\partial \\boldsymbol{\\beta}^T}\\right)^{-1}_{\\boldsymbol{\\beta}^{\\mathrm{old}}}\\times \\left(\\frac{\\partial \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}}\\right)_{\\boldsymbol{\\beta}^{\\mathrm{old}}},\n", @@ -203,20 +175,16 @@ }, { "cell_type": "markdown", - "id": "ad20ab46", - "metadata": { - "editable": true - }, + "id": "fb485e9e", + "metadata": {}, "source": [ "or in matrix form as" ] }, { "cell_type": "markdown", - "id": "91787790", - "metadata": { - "editable": true - }, + "id": "c7110832", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{\\beta}^{\\mathrm{new}} = \\boldsymbol{\\beta}^{\\mathrm{old}}-\\left(\\boldsymbol{X}^T\\boldsymbol{W}\\boldsymbol{X} \\right)^{-1}\\times \\left(-\\boldsymbol{X}^T(\\boldsymbol{y}-\\boldsymbol{p}) \\right)_{\\boldsymbol{\\beta}^{\\mathrm{old}}}.\n", @@ -225,10 +193,8 @@ }, { "cell_type": "markdown", - "id": "939e7f11", - "metadata": { - "editable": true - }, + "id": "db0fd8b9", + "metadata": {}, "source": [ "The right-hand side is computed with the old values of $\\beta$. \n", "\n", @@ -237,10 +203,8 @@ }, { "cell_type": "markdown", - "id": "06bdab12", - "metadata": { - "editable": true - }, + "id": "73cc9db9", + "metadata": {}, "source": [ "## Brief reminder on Newton-Raphson's method\n", "\n", @@ -257,10 +221,8 @@ }, { "cell_type": "markdown", - "id": "de5be449", - "metadata": { - "editable": true - }, + "id": "0483698c", + "metadata": {}, "source": [ "## The equations\n", "\n", @@ -273,10 +235,8 @@ }, { "cell_type": "markdown", - "id": "8cde618b", - "metadata": { - "editable": true - }, + "id": "0b41326e", + "metadata": {}, "source": [ "\n", "
\n", @@ -289,10 +249,8 @@ }, { "cell_type": "markdown", - "id": "2b2088d2", - "metadata": { - "editable": true - }, + "id": "bf22ca78", + "metadata": {}, "source": [ "For small enough values of the function and for well-behaved\n", "functions, the terms beyond linear are unimportant, hence we obtain" @@ -300,10 +258,8 @@ }, { "cell_type": "markdown", - "id": "9eebba32", - "metadata": { - "editable": true - }, + "id": "e70a4b40", + "metadata": {}, "source": [ "$$\n", "f(x)+(s-x)f'(x)\\approx 0,\n", @@ -312,20 +268,16 @@ }, { "cell_type": "markdown", - "id": "41f640fd", - "metadata": { - "editable": true - }, + "id": "e6ab42db", + "metadata": {}, "source": [ "yielding" ] }, { "cell_type": "markdown", - "id": "377a88a5", - "metadata": { - "editable": true - }, + "id": "60f49110", + "metadata": {}, "source": [ "$$\n", "s\\approx x-\\frac{f(x)}{f'(x)}.\n", @@ -334,20 +286,16 @@ }, { "cell_type": "markdown", - "id": "266e19d2", - "metadata": { - "editable": true - }, + "id": "4a5daac5", + "metadata": {}, "source": [ "Having in mind an iterative procedure, it is natural to start iterating with" ] }, { "cell_type": "markdown", - "id": "8f913de7", - "metadata": { - "editable": true - }, + "id": "dc406fad", + "metadata": {}, "source": [ "$$\n", "x_{n+1}=x_n-\\frac{f(x_n)}{f'(x_n)}.\n", @@ -356,10 +304,8 @@ }, { "cell_type": "markdown", - "id": "b5688397", - "metadata": { - "editable": true - }, + "id": "4a01cef1", + "metadata": {}, "source": [ "## Simple geometric interpretation\n", "\n", @@ -378,10 +324,8 @@ }, { "cell_type": "markdown", - "id": "f419f089", - "metadata": { - "editable": true - }, + "id": "b9ab351f", + "metadata": {}, "source": [ "## Extending to more than one variable\n", "\n", @@ -391,10 +335,8 @@ }, { "cell_type": "markdown", - "id": "2094ec46", - "metadata": { - "editable": true - }, + "id": "c4a5c175", + "metadata": {}, "source": [ "$$\n", "\\begin{array}{cc} f_1(x_1,x_2) &=0\\\\\n", @@ -404,20 +346,16 @@ }, { "cell_type": "markdown", - "id": "066054bd", - "metadata": { - "editable": true - }, + "id": "5a0ec73f", + "metadata": {}, "source": [ "which we Taylor expand to obtain" ] }, { "cell_type": "markdown", - "id": "17ab0c82", - "metadata": { - "editable": true - }, + "id": "43a0b666", + "metadata": {}, "source": [ "$$\n", "\\begin{array}{cc} 0=f_1(x_1+h_1,x_2+h_2)=&f_1(x_1,x_2)+h_1\n", @@ -432,20 +370,16 @@ }, { "cell_type": "markdown", - "id": "1e5c616e", - "metadata": { - "editable": true - }, + "id": "9378b391", + "metadata": {}, "source": [ "Defining the Jacobian matrix ${\\bf \\boldsymbol{J}}$ we have" ] }, { "cell_type": "markdown", - "id": "aca5997c", - "metadata": { - "editable": true - }, + "id": "742ab267", + "metadata": {}, "source": [ "$$\n", "{\\bf \\boldsymbol{J}}=\\left( \\begin{array}{cc}\n", @@ -457,20 +391,16 @@ }, { "cell_type": "markdown", - "id": "3c8988ea", - "metadata": { - "editable": true - }, + "id": "974e20a1", + "metadata": {}, "source": [ "we can rephrase Newton's method as" ] }, { "cell_type": "markdown", - "id": "0837e054", - "metadata": { - "editable": true - }, + "id": "65662f4e", + "metadata": {}, "source": [ "$$\n", "\\left(\\begin{array}{c} x_1^{n+1} \\\\ x_2^{n+1} \\end{array} \\right)=\n", @@ -481,20 +411,16 @@ }, { "cell_type": "markdown", - "id": "7363768a", - "metadata": { - "editable": true - }, + "id": "9363cc25", + "metadata": {}, "source": [ "where we have defined" ] }, { "cell_type": "markdown", - "id": "ec159670", - "metadata": { - "editable": true - }, + "id": "6e0064bd", + "metadata": {}, "source": [ "$$\n", "\\left(\\begin{array}{c} h_1^{n} \\\\ h_2^{n} \\end{array} \\right)=\n", @@ -505,10 +431,8 @@ }, { "cell_type": "markdown", - "id": "2ea2c173", - "metadata": { - "editable": true - }, + "id": "94fd2ee4", + "metadata": {}, "source": [ "We need thus to compute the inverse of the Jacobian matrix and it\n", "is to understand that difficulties may\n", @@ -520,10 +444,8 @@ }, { "cell_type": "markdown", - "id": "023920fd", - "metadata": { - "editable": true - }, + "id": "36b663f2", + "metadata": {}, "source": [ "## Steepest descent\n", "\n", @@ -537,10 +459,8 @@ }, { "cell_type": "markdown", - "id": "ca16c582", - "metadata": { - "editable": true - }, + "id": "9d0c9ad9", + "metadata": {}, "source": [ "$$\n", "\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k),\n", @@ -549,10 +469,8 @@ }, { "cell_type": "markdown", - "id": "03d4d84c", - "metadata": { - "editable": true - }, + "id": "47f4fafb", + "metadata": {}, "source": [ "with $\\gamma_k > 0$.\n", "\n", @@ -563,10 +481,8 @@ }, { "cell_type": "markdown", - "id": "dfaa60b4", - "metadata": { - "editable": true - }, + "id": "e380cfcc", + "metadata": {}, "source": [ "## More on Steepest descent\n", "\n", @@ -578,10 +494,8 @@ }, { "cell_type": "markdown", - "id": "363fdd3f", - "metadata": { - "editable": true - }, + "id": "db59d2b8", + "metadata": {}, "source": [ "$$\n", "\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k), \\ \\ k \\geq 0.\n", @@ -590,10 +504,8 @@ }, { "cell_type": "markdown", - "id": "a0e35dff", - "metadata": { - "editable": true - }, + "id": "21c9aac9", + "metadata": {}, "source": [ "The parameter $\\gamma_k$ is often referred to as the step length or\n", "the learning rate within the context of Machine Learning." @@ -601,10 +513,8 @@ }, { "cell_type": "markdown", - "id": "5ffef34f", - "metadata": { - "editable": true - }, + "id": "327ae752", + "metadata": {}, "source": [ "## The ideal\n", "\n", @@ -629,10 +539,8 @@ }, { "cell_type": "markdown", - "id": "b84a98e4", - "metadata": { - "editable": true - }, + "id": "f1c424b9", + "metadata": {}, "source": [ "## The sensitiveness of the gradient descent\n", "\n", @@ -651,10 +559,8 @@ }, { "cell_type": "markdown", - "id": "dfa1b5d0", - "metadata": { - "editable": true - }, + "id": "c30dc8df", + "metadata": {}, "source": [ "## Convex functions\n", "\n", @@ -673,10 +579,8 @@ }, { "cell_type": "markdown", - "id": "c637d309", - "metadata": { - "editable": true - }, + "id": "6298f287", + "metadata": {}, "source": [ "## Convex function\n", "\n", @@ -685,10 +589,8 @@ }, { "cell_type": "markdown", - "id": "f96469d1", - "metadata": { - "editable": true - }, + "id": "ea9513ed", + "metadata": {}, "source": [ "## Conditions on convex functions\n", "\n", @@ -722,10 +624,8 @@ }, { "cell_type": "markdown", - "id": "b4dda17e", - "metadata": { - "editable": true - }, + "id": "2f218b22", + "metadata": {}, "source": [ "## More on convex functions\n", "\n", @@ -750,10 +650,8 @@ }, { "cell_type": "markdown", - "id": "5af5be77", - "metadata": { - "editable": true - }, + "id": "67110e2a", + "metadata": {}, "source": [ "## Some simple problems\n", "\n", @@ -780,10 +678,8 @@ }, { "cell_type": "markdown", - "id": "43becec9", - "metadata": { - "editable": true - }, + "id": "c7ec5012", + "metadata": {}, "source": [ "## Standard steepest descent\n", "\n", @@ -800,10 +696,8 @@ }, { "cell_type": "markdown", - "id": "9b9ba362", - "metadata": { - "editable": true - }, + "id": "54f15818", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{A}\\boldsymbol{x} = \\boldsymbol{b}.\n", @@ -812,20 +706,16 @@ }, { "cell_type": "markdown", - "id": "3d03f376", - "metadata": { - "editable": true - }, + "id": "bb846136", + "metadata": {}, "source": [ "In the iterative process we end up with a problem like" ] }, { "cell_type": "markdown", - "id": "baff0f9d", - "metadata": { - "editable": true - }, + "id": "14a050e6", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{r}= \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x},\n", @@ -834,10 +724,8 @@ }, { "cell_type": "markdown", - "id": "c66fb64f", - "metadata": { - "editable": true - }, + "id": "b5be57be", + "metadata": {}, "source": [ "where $\\boldsymbol{r}$ is the so-called residual or error in the iterative process.\n", "\n", @@ -846,10 +734,8 @@ }, { "cell_type": "markdown", - "id": "21a18d29", - "metadata": { - "editable": true - }, + "id": "6a8ce76f", + "metadata": {}, "source": [ "## Gradient method\n", "\n", @@ -858,10 +744,8 @@ }, { "cell_type": "markdown", - "id": "2c321843", - "metadata": { - "editable": true - }, + "id": "594769d8", + "metadata": {}, "source": [ "$$\n", "P(\\boldsymbol{x})=\\frac{1}{2}\\boldsymbol{x}^T\\boldsymbol{A}\\boldsymbol{x} - \\boldsymbol{x}^T\\boldsymbol{b},\n", @@ -870,10 +754,8 @@ }, { "cell_type": "markdown", - "id": "77463dbe", - "metadata": { - "editable": true - }, + "id": "05f1fe97", + "metadata": {}, "source": [ "with the constraint that the matrix $\\boldsymbol{A}$ is positive definite and\n", "symmetric. This defines also the Hessian and we want it to be positive definite." @@ -881,10 +763,8 @@ }, { "cell_type": "markdown", - "id": "e8e305e8", - "metadata": { - "editable": true - }, + "id": "6efaa986", + "metadata": {}, "source": [ "## Steepest descent method\n", "\n", @@ -894,10 +774,8 @@ }, { "cell_type": "markdown", - "id": "f2332a0e", - "metadata": { - "editable": true - }, + "id": "99e242c6", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{x}_0=0,\n", @@ -906,20 +784,16 @@ }, { "cell_type": "markdown", - "id": "534a1b51", - "metadata": { - "editable": true - }, + "id": "07d95ef1", + "metadata": {}, "source": [ "or consider the system" ] }, { "cell_type": "markdown", - "id": "8bed151e", - "metadata": { - "editable": true - }, + "id": "b81f2f36", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{A}\\boldsymbol{z} = \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_0,\n", @@ -928,20 +802,16 @@ }, { "cell_type": "markdown", - "id": "678df355", - "metadata": { - "editable": true - }, + "id": "83c5e15f", + "metadata": {}, "source": [ "instead." ] }, { "cell_type": "markdown", - "id": "6f23d8bf", - "metadata": { - "editable": true - }, + "id": "0d5239fd", + "metadata": {}, "source": [ "## Steepest descent method\n", "One can show that the solution $\\boldsymbol{x}$ is also the unique minimizer of the quadratic form" @@ -949,10 +819,8 @@ }, { "cell_type": "markdown", - "id": "87918b7a", - "metadata": { - "editable": true - }, + "id": "95cf152f", + "metadata": {}, "source": [ "$$\n", "f(\\boldsymbol{x}) = \\frac{1}{2}\\boldsymbol{x}^T\\boldsymbol{A}\\boldsymbol{x} - \\boldsymbol{x}^T \\boldsymbol{x} , \\quad \\boldsymbol{x}\\in\\mathbf{R}^n.\n", @@ -961,10 +829,8 @@ }, { "cell_type": "markdown", - "id": "ae32eb82", - "metadata": { - "editable": true - }, + "id": "18692235", + "metadata": {}, "source": [ "This suggests taking the first basis vector $\\boldsymbol{r}_1$ (see below for definition) \n", "to be the gradient of $f$ at $\\boldsymbol{x}=\\boldsymbol{x}_0$, \n", @@ -973,10 +839,8 @@ }, { "cell_type": "markdown", - "id": "8f157e23", - "metadata": { - "editable": true - }, + "id": "a5076cdd", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{A}\\boldsymbol{x}_0-\\boldsymbol{b},\n", @@ -985,10 +849,8 @@ }, { "cell_type": "markdown", - "id": "d83d8368", - "metadata": { - "editable": true - }, + "id": "daa366ec", + "metadata": {}, "source": [ "and \n", "$\\boldsymbol{x}_0=0$ it is equal $-\\boldsymbol{b}$." @@ -996,10 +858,8 @@ }, { "cell_type": "markdown", - "id": "a396e128", - "metadata": { - "editable": true - }, + "id": "75a681f3", + "metadata": {}, "source": [ "## Final expressions\n", "We can compute the residual iteratively as" @@ -1007,10 +867,8 @@ }, { "cell_type": "markdown", - "id": "865cdb3d", - "metadata": { - "editable": true - }, + "id": "98536b08", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{r}_{k+1}=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_{k+1},\n", @@ -1019,20 +877,16 @@ }, { "cell_type": "markdown", - "id": "33e21b01", - "metadata": { - "editable": true - }, + "id": "aff9b796", + "metadata": {}, "source": [ "which equals" ] }, { "cell_type": "markdown", - "id": "eae3b871", - "metadata": { - "editable": true - }, + "id": "4c01226c", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{b}-\\boldsymbol{A}(\\boldsymbol{x}_k+\\alpha_k\\boldsymbol{r}_k),\n", @@ -1041,20 +895,16 @@ }, { "cell_type": "markdown", - "id": "16dae522", - "metadata": { - "editable": true - }, + "id": "62d91969", + "metadata": {}, "source": [ "or" ] }, { "cell_type": "markdown", - "id": "d3e3ca2a", - "metadata": { - "editable": true - }, + "id": "a5d9f79a", + "metadata": {}, "source": [ "$$\n", "(\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k)-\\alpha_k\\boldsymbol{A}\\boldsymbol{r}_k,\n", @@ -1063,20 +913,16 @@ }, { "cell_type": "markdown", - "id": "d71254ca", - "metadata": { - "editable": true - }, + "id": "04fb0972", + "metadata": {}, "source": [ "which gives" ] }, { "cell_type": "markdown", - "id": "4681b36b", - "metadata": { - "editable": true - }, + "id": "69f177ee", + "metadata": {}, "source": [ "$$\n", "\\alpha_k = \\frac{\\boldsymbol{r}_k^T\\boldsymbol{r}_k}{\\boldsymbol{r}_k^T\\boldsymbol{A}\\boldsymbol{r}_k}\n", @@ -1085,20 +931,16 @@ }, { "cell_type": "markdown", - "id": "8b55691e", - "metadata": { - "editable": true - }, + "id": "826c4c1a", + "metadata": {}, "source": [ "leading to the iterative scheme" ] }, { "cell_type": "markdown", - "id": "7e54bdbb", - "metadata": { - "editable": true - }, + "id": "5b65620e", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{x}_{k+1}=\\boldsymbol{x}_k+\\alpha_k\\boldsymbol{r}_{k},\n", @@ -1107,10 +949,8 @@ }, { "cell_type": "markdown", - "id": "cade0e16", - "metadata": { - "editable": true - }, + "id": "5ff7d0ef", + "metadata": {}, "source": [ "## Steepest descent example" ] @@ -1118,11 +958,8 @@ { "cell_type": "code", "execution_count": 1, - "id": "431eb09d", - "metadata": { - "collapsed": false, - "editable": true - }, + "id": "aeb6d5c9", + "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", @@ -1151,10 +988,8 @@ }, { "cell_type": "markdown", - "id": "45abe8c8", - "metadata": { - "editable": true - }, + "id": "3ae5899d", + "metadata": {}, "source": [ "And then as countor plot" ] @@ -1162,11 +997,8 @@ { "cell_type": "code", "execution_count": 2, - "id": "918d5156", - "metadata": { - "collapsed": false, - "editable": true - }, + "id": "c6c3a008", + "metadata": {}, "outputs": [], "source": [ "pt.axis(\"equal\")\n", @@ -1176,10 +1008,8 @@ }, { "cell_type": "markdown", - "id": "62ce3f74", - "metadata": { - "editable": true - }, + "id": "0c47c360", + "metadata": {}, "source": [ "Find guesses" ] @@ -1187,11 +1017,8 @@ { "cell_type": "code", "execution_count": 3, - "id": "0cf280cb", - "metadata": { - "collapsed": false, - "editable": true - }, + "id": "db86ff05", + "metadata": {}, "outputs": [], "source": [ "x = guesses[-1]\n", @@ -1200,10 +1027,8 @@ }, { "cell_type": "markdown", - "id": "f84d35a1", - "metadata": { - "editable": true - }, + "id": "9e873223", + "metadata": {}, "source": [ "Run it!" ] @@ -1211,11 +1036,8 @@ { "cell_type": "code", "execution_count": 4, - "id": "b823ed66", - "metadata": { - "collapsed": false, - "editable": true - }, + "id": "71c9d8c1", + "metadata": {}, "outputs": [], "source": [ "def f1d(alpha):\n", @@ -1229,10 +1051,8 @@ }, { "cell_type": "markdown", - "id": "f8c48a33", - "metadata": { - "editable": true - }, + "id": "8ffc7e06", + "metadata": {}, "source": [ "What happened?" ] @@ -1240,11 +1060,8 @@ { "cell_type": "code", "execution_count": 5, - "id": "9cb2845a", - "metadata": { - "collapsed": false, - "editable": true - }, + "id": "857c0d1d", + "metadata": {}, "outputs": [], "source": [ "pt.axis(\"equal\")\n", @@ -1255,20 +1072,16 @@ }, { "cell_type": "markdown", - "id": "91589091", - "metadata": { - "editable": true - }, + "id": "78a9e67c", + "metadata": {}, "source": [ "Note that we did only one iteration here. We can easily add more using our previous guesses." ] }, { "cell_type": "markdown", - "id": "2be4a5ee", - "metadata": { - "editable": true - }, + "id": "a759a930", + "metadata": {}, "source": [ "## Conjugate gradient method\n", "In the CG method we define so-called conjugate directions and two vectors \n", @@ -1279,10 +1092,8 @@ }, { "cell_type": "markdown", - "id": "0a4e1cdc", - "metadata": { - "editable": true - }, + "id": "f185c679", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{s}^T\\boldsymbol{A}\\boldsymbol{t}= 0.\n", @@ -1291,10 +1102,8 @@ }, { "cell_type": "markdown", - "id": "2b998c83", - "metadata": { - "editable": true - }, + "id": "bbef395d", + "metadata": {}, "source": [ "The philosophy of the CG method is to perform searches in various conjugate directions\n", "of our vectors $\\boldsymbol{x}_i$ obeying the above criterion, namely" @@ -1302,10 +1111,8 @@ }, { "cell_type": "markdown", - "id": "2dc34fcc", - "metadata": { - "editable": true - }, + "id": "1f1417d3", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{x}_i^T\\boldsymbol{A}\\boldsymbol{x}_j= 0.\n", @@ -1314,10 +1121,8 @@ }, { "cell_type": "markdown", - "id": "96c0a3f0", - "metadata": { - "editable": true - }, + "id": "8482b2fb", + "metadata": {}, "source": [ "Two vectors are conjugate if they are orthogonal with respect to \n", "this inner product. Being conjugate is a symmetric relation: if $\\boldsymbol{s}$ is conjugate to $\\boldsymbol{t}$, then $\\boldsymbol{t}$ is conjugate to $\\boldsymbol{s}$." @@ -1325,10 +1130,8 @@ }, { "cell_type": "markdown", - "id": "1e311e8a", - "metadata": { - "editable": true - }, + "id": "12aa0a01", + "metadata": {}, "source": [ "## Conjugate gradient method\n", "An example is given by the eigenvectors of the matrix" @@ -1336,10 +1139,8 @@ }, { "cell_type": "markdown", - "id": "90c86903", - "metadata": { - "editable": true - }, + "id": "da7bd359", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{v}_i^T\\boldsymbol{A}\\boldsymbol{v}_j= \\lambda\\boldsymbol{v}_i^T\\boldsymbol{v}_j,\n", @@ -1348,20 +1149,16 @@ }, { "cell_type": "markdown", - "id": "80db69c5", - "metadata": { - "editable": true - }, + "id": "85c05b4f", + "metadata": {}, "source": [ "which is zero unless $i=j$." ] }, { "cell_type": "markdown", - "id": "1811fa1a", - "metadata": { - "editable": true - }, + "id": "57b05592", + "metadata": {}, "source": [ "## Conjugate gradient method\n", "Assume now that we have a symmetric positive-definite matrix $\\boldsymbol{A}$ of size\n", @@ -1370,10 +1167,8 @@ }, { "cell_type": "markdown", - "id": "9a9d7e34", - "metadata": { - "editable": true - }, + "id": "25edaca6", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{x}_{i+1}=\\boldsymbol{x}_{i}+\\alpha_i\\boldsymbol{p}_{i}.\n", @@ -1382,10 +1177,8 @@ }, { "cell_type": "markdown", - "id": "505ed405", - "metadata": { - "editable": true - }, + "id": "36dbf570", + "metadata": {}, "source": [ "We assume that $\\boldsymbol{p}_{i}$ is a sequence of $n$ mutually conjugate directions. \n", "Then the $\\boldsymbol{p}_{i}$ form a basis of $R^n$ and we can expand the solution \n", @@ -1394,10 +1187,8 @@ }, { "cell_type": "markdown", - "id": "43281aa2", - "metadata": { - "editable": true - }, + "id": "a8adfc31", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{x} = \\sum^{n}_{i=1} \\alpha_i \\boldsymbol{p}_i.\n", @@ -1406,10 +1197,8 @@ }, { "cell_type": "markdown", - "id": "df3930c9", - "metadata": { - "editable": true - }, + "id": "8210151d", + "metadata": {}, "source": [ "## Conjugate gradient method\n", "The coefficients are given by" @@ -1417,10 +1206,8 @@ }, { "cell_type": "markdown", - "id": "dae6d4e4", - "metadata": { - "editable": true - }, + "id": "06d06096", + "metadata": {}, "source": [ "$$\n", "\\mathbf{A}\\mathbf{x} = \\sum^{n}_{i=1} \\alpha_i \\mathbf{A} \\mathbf{p}_i = \\mathbf{b}.\n", @@ -1429,20 +1216,16 @@ }, { "cell_type": "markdown", - "id": "3d11a09d", - "metadata": { - "editable": true - }, + "id": "d98b2f5d", + "metadata": {}, "source": [ "Multiplying with $\\boldsymbol{p}_k^T$ from the left gives" ] }, { "cell_type": "markdown", - "id": "4ec0b32d", - "metadata": { - "editable": true - }, + "id": "1b3d21d4", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{p}_k^T \\boldsymbol{A}\\boldsymbol{x} = \\sum^{n}_{i=1} \\alpha_i\\boldsymbol{p}_k^T \\boldsymbol{A}\\boldsymbol{p}_i= \\boldsymbol{p}_k^T \\boldsymbol{b},\n", @@ -1451,20 +1234,16 @@ }, { "cell_type": "markdown", - "id": "ed6c17a7", - "metadata": { - "editable": true - }, + "id": "0fa5c281", + "metadata": {}, "source": [ "and we can define the coefficients $\\alpha_k$ as" ] }, { "cell_type": "markdown", - "id": "81f885b2", - "metadata": { - "editable": true - }, + "id": "36a79c2b", + "metadata": {}, "source": [ "$$\n", "\\alpha_k = \\frac{\\boldsymbol{p}_k^T \\boldsymbol{b}}{\\boldsymbol{p}_k^T \\boldsymbol{A} \\boldsymbol{p}_k}\n", @@ -1473,10 +1252,8 @@ }, { "cell_type": "markdown", - "id": "d13b0cde", - "metadata": { - "editable": true - }, + "id": "7400bf9b", + "metadata": {}, "source": [ "## Conjugate gradient method and iterations\n", "\n", @@ -1493,10 +1270,8 @@ }, { "cell_type": "markdown", - "id": "44ddde9d", - "metadata": { - "editable": true - }, + "id": "05dcda06", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{x}_0=0,\n", @@ -1505,20 +1280,16 @@ }, { "cell_type": "markdown", - "id": "fd476a0f", - "metadata": { - "editable": true - }, + "id": "f59f43f1", + "metadata": {}, "source": [ "or consider the system" ] }, { "cell_type": "markdown", - "id": "20588be3", - "metadata": { - "editable": true - }, + "id": "79375e76", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{A}\\boldsymbol{z} = \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_0,\n", @@ -1527,20 +1298,16 @@ }, { "cell_type": "markdown", - "id": "3d610d43", - "metadata": { - "editable": true - }, + "id": "d8104364", + "metadata": {}, "source": [ "instead." ] }, { "cell_type": "markdown", - "id": "64198b50", - "metadata": { - "editable": true - }, + "id": "c014b000", + "metadata": {}, "source": [ "## Conjugate gradient method\n", "One can show that the solution $\\boldsymbol{x}$ is also the unique minimizer of the quadratic form" @@ -1548,10 +1315,8 @@ }, { "cell_type": "markdown", - "id": "b4ce70c0", - "metadata": { - "editable": true - }, + "id": "ada74dc2", + "metadata": {}, "source": [ "$$\n", "f(\\boldsymbol{x}) = \\frac{1}{2}\\boldsymbol{x}^T\\boldsymbol{A}\\boldsymbol{x} - \\boldsymbol{x}^T \\boldsymbol{x} , \\quad \\boldsymbol{x}\\in\\mathbf{R}^n.\n", @@ -1560,10 +1325,8 @@ }, { "cell_type": "markdown", - "id": "7705277c", - "metadata": { - "editable": true - }, + "id": "183da2ae", + "metadata": {}, "source": [ "This suggests taking the first basis vector $\\boldsymbol{p}_1$ \n", "to be the gradient of $f$ at $\\boldsymbol{x}=\\boldsymbol{x}_0$, \n", @@ -1572,10 +1335,8 @@ }, { "cell_type": "markdown", - "id": "c17e7ac7", - "metadata": { - "editable": true - }, + "id": "edab709c", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{A}\\boldsymbol{x}_0-\\boldsymbol{b},\n", @@ -1584,10 +1345,8 @@ }, { "cell_type": "markdown", - "id": "2469dda5", - "metadata": { - "editable": true - }, + "id": "ed04ea87", + "metadata": {}, "source": [ "and \n", "$\\boldsymbol{x}_0=0$ it is equal $-\\boldsymbol{b}$.\n", @@ -1597,10 +1356,8 @@ }, { "cell_type": "markdown", - "id": "9a0ec4fa", - "metadata": { - "editable": true - }, + "id": "8ca6c92a", + "metadata": {}, "source": [ "## Conjugate gradient method\n", "Let $\\boldsymbol{r}_k$ be the residual at the $k$-th step:" @@ -1608,10 +1365,8 @@ }, { "cell_type": "markdown", - "id": "a536e5fe", - "metadata": { - "editable": true - }, + "id": "e8186d4e", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{r}_k=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k.\n", @@ -1620,10 +1375,8 @@ }, { "cell_type": "markdown", - "id": "0bb1676f", - "metadata": { - "editable": true - }, + "id": "c0709a75", + "metadata": {}, "source": [ "Note that $\\boldsymbol{r}_k$ is the negative gradient of $f$ at \n", "$\\boldsymbol{x}=\\boldsymbol{x}_k$, \n", @@ -1636,10 +1389,8 @@ }, { "cell_type": "markdown", - "id": "aeaba424", - "metadata": { - "editable": true - }, + "id": "e1d261da", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{p}_{k+1}=\\boldsymbol{r}_k-\\frac{\\boldsymbol{p}_k^T \\boldsymbol{A}\\boldsymbol{r}_k}{\\boldsymbol{p}_k^T\\boldsymbol{A}\\boldsymbol{p}_k} \\boldsymbol{p}_k.\n", @@ -1648,10 +1399,8 @@ }, { "cell_type": "markdown", - "id": "b23ea0a2", - "metadata": { - "editable": true - }, + "id": "dd0a7fcb", + "metadata": {}, "source": [ "## Conjugate gradient method\n", "We can also compute the residual iteratively as" @@ -1659,10 +1408,8 @@ }, { "cell_type": "markdown", - "id": "eeccbcb7", - "metadata": { - "editable": true - }, + "id": "a9a717b8", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{r}_{k+1}=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_{k+1},\n", @@ -1671,20 +1418,16 @@ }, { "cell_type": "markdown", - "id": "1c8f9493", - "metadata": { - "editable": true - }, + "id": "b549f75f", + "metadata": {}, "source": [ "which equals" ] }, { "cell_type": "markdown", - "id": "4bbe9780", - "metadata": { - "editable": true - }, + "id": "c4aecd92", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{b}-\\boldsymbol{A}(\\boldsymbol{x}_k+\\alpha_k\\boldsymbol{p}_k),\n", @@ -1693,20 +1436,16 @@ }, { "cell_type": "markdown", - "id": "c7856672", - "metadata": { - "editable": true - }, + "id": "8df935ba", + "metadata": {}, "source": [ "or" ] }, { "cell_type": "markdown", - "id": "ff230aff", - "metadata": { - "editable": true - }, + "id": "3e641382", + "metadata": {}, "source": [ "$$\n", "(\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k)-\\alpha_k\\boldsymbol{A}\\boldsymbol{p}_k,\n", @@ -1715,20 +1454,16 @@ }, { "cell_type": "markdown", - "id": "e5ddd07d", - "metadata": { - "editable": true - }, + "id": "4478daea", + "metadata": {}, "source": [ "which gives" ] }, { "cell_type": "markdown", - "id": "a9cb9057", - "metadata": { - "editable": true - }, + "id": "a08581d0", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{r}_{k+1}=\\boldsymbol{r}_k-\\boldsymbol{A}\\boldsymbol{p}_{k},\n", @@ -1737,10 +1472,8 @@ }, { "cell_type": "markdown", - "id": "3f8de819", - "metadata": { - "editable": true - }, + "id": "29a102a4", + "metadata": {}, "source": [ "## Revisiting our first homework\n", "\n", @@ -1761,11 +1494,8 @@ { "cell_type": "code", "execution_count": 6, - "id": "b6c82967", - "metadata": { - "collapsed": false, - "editable": true - }, + "id": "16f91d0d", + "metadata": {}, "outputs": [], "source": [ "x = 2*np.random.rand(m,1)\n", @@ -1774,10 +1504,8 @@ }, { "cell_type": "markdown", - "id": "eb65e79c", - "metadata": { - "editable": true - }, + "id": "f165490e", + "metadata": {}, "source": [ "with $x_i \\in [0,1] $ is chosen randomly using a uniform distribution. Additionally we have a stochastic noise chosen according to a normal distribution $\\cal {N}(0,1)$. \n", "The linear regression model is given by" @@ -1785,10 +1513,8 @@ }, { "cell_type": "markdown", - "id": "c9a1e5d8", - "metadata": { - "editable": true - }, + "id": "84498422", + "metadata": {}, "source": [ "$$\n", "h_\\beta(x) = \\boldsymbol{y} = \\beta_0 + \\beta_1 x,\n", @@ -1797,20 +1523,16 @@ }, { "cell_type": "markdown", - "id": "ae4f1a9a", - "metadata": { - "editable": true - }, + "id": "f98e851e", + "metadata": {}, "source": [ "such that" ] }, { "cell_type": "markdown", - "id": "db33f468", - "metadata": { - "editable": true - }, + "id": "ab911929", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{y}_i = \\beta_0 + \\beta_1 x_i.\n", @@ -1819,10 +1541,8 @@ }, { "cell_type": "markdown", - "id": "3562d9e9", - "metadata": { - "editable": true - }, + "id": "170e4189", + "metadata": {}, "source": [ "## Gradient descent example\n", "\n", @@ -1833,10 +1553,8 @@ }, { "cell_type": "markdown", - "id": "d07b80c6", - "metadata": { - "editable": true - }, + "id": "1a2651d2", + "metadata": {}, "source": [ "$$\n", "X \\equiv \\begin{bmatrix}\n", @@ -1849,20 +1567,16 @@ }, { "cell_type": "markdown", - "id": "3e9beaaa", - "metadata": { - "editable": true - }, + "id": "310ad769", + "metadata": {}, "source": [ "The cost/loss/risk function is given by (" ] }, { "cell_type": "markdown", - "id": "032534e5", - "metadata": { - "editable": true - }, + "id": "a5b0496c", + "metadata": {}, "source": [ "$$\n", "C(\\beta) = \\frac{1}{n}||X\\beta-\\mathbf{y}||_{2}^{2} = \\frac{1}{n}\\sum_{i=1}^{100}\\left[ (\\beta_0 + \\beta_1 x_i)^2 - 2 y_i (\\beta_0 + \\beta_1 x_i) + y_i^2\\right]\n", @@ -1871,20 +1585,16 @@ }, { "cell_type": "markdown", - "id": "c338adc5", - "metadata": { - "editable": true - }, + "id": "c0759118", + "metadata": {}, "source": [ "and we want to find $\\beta$ such that $C(\\beta)$ is minimized." ] }, { "cell_type": "markdown", - "id": "042cb6a3", - "metadata": { - "editable": true - }, + "id": "c65d80ad", + "metadata": {}, "source": [ "## The derivative of the cost/loss function\n", "\n", @@ -1893,10 +1603,8 @@ }, { "cell_type": "markdown", - "id": "52bc4362", - "metadata": { - "editable": true - }, + "id": "30544a22", + "metadata": {}, "source": [ "$$\n", "\\nabla_{\\beta} C(\\beta) = \\frac{2}{n}\\begin{bmatrix} \\sum_{i=1}^{100} \\left(\\beta_0+\\beta_1x_i-y_i\\right) \\\\\n", @@ -1907,20 +1615,16 @@ }, { "cell_type": "markdown", - "id": "dcd681f0", - "metadata": { - "editable": true - }, + "id": "f7e27f43", + "metadata": {}, "source": [ "where $X$ is the design matrix defined above." ] }, { "cell_type": "markdown", - "id": "650394f1", - "metadata": { - "editable": true - }, + "id": "0c7d8c1d", + "metadata": {}, "source": [ "## The Hessian matrix\n", "The Hessian matrix of $C(\\beta)$ is given by" @@ -1928,10 +1632,8 @@ }, { "cell_type": "markdown", - "id": "ef4eb0f1", - "metadata": { - "editable": true - }, + "id": "afa82cb3", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{H} \\equiv \\begin{bmatrix}\n", @@ -1943,20 +1645,16 @@ }, { "cell_type": "markdown", - "id": "61c1c429", - "metadata": { - "editable": true - }, + "id": "837c1e3f", + "metadata": {}, "source": [ "This result implies that $C(\\beta)$ is a convex function since the matrix $X^T X$ always is positive semi-definite." ] }, { "cell_type": "markdown", - "id": "45ec5fb5", - "metadata": { - "editable": true - }, + "id": "89fc16ec", + "metadata": {}, "source": [ "## Simple program\n", "\n", @@ -1965,10 +1663,8 @@ }, { "cell_type": "markdown", - "id": "070576d6", - "metadata": { - "editable": true - }, + "id": "983001de", + "metadata": {}, "source": [ "$$\n", "\\beta_{k+1} = \\beta_k - \\gamma \\nabla_\\beta C(\\beta_k), \\ k=0,1,\\cdots\n", @@ -1977,10 +1673,8 @@ }, { "cell_type": "markdown", - "id": "f9832704", - "metadata": { - "editable": true - }, + "id": "915c0c75", + "metadata": {}, "source": [ "We can use the expression we computed for the gradient and let use a\n", "$\\beta_0$ be chosen randomly and let $\\gamma = 0.001$. Stop iterating\n", @@ -1992,10 +1686,8 @@ }, { "cell_type": "markdown", - "id": "7dfea6ff", - "metadata": { - "editable": true - }, + "id": "30d20294", + "metadata": {}, "source": [ "## Gradient Descent Example\n", "\n", @@ -2005,11 +1697,8 @@ { "cell_type": "code", "execution_count": 7, - "id": "bb304045", - "metadata": { - "collapsed": false, - "editable": true - }, + "id": "c6017dfa", + "metadata": {}, "outputs": [], "source": [ "\n", @@ -2062,10 +1751,8 @@ }, { "cell_type": "markdown", - "id": "e417c95f", - "metadata": { - "editable": true - }, + "id": "dcc6889f", + "metadata": {}, "source": [ "## And a corresponding example using **scikit-learn**" ] @@ -2073,11 +1760,8 @@ { "cell_type": "code", "execution_count": 8, - "id": "c01ffb63", - "metadata": { - "collapsed": false, - "editable": true - }, + "id": "8acb6aad", + "metadata": {}, "outputs": [], "source": [ "# Importing various packages\n", @@ -2100,10 +1784,8 @@ }, { "cell_type": "markdown", - "id": "99bf3bfa", - "metadata": { - "editable": true - }, + "id": "fcc08db2", + "metadata": {}, "source": [ "## Gradient descent and Ridge\n", "\n", @@ -2112,10 +1794,8 @@ }, { "cell_type": "markdown", - "id": "190d5f89", - "metadata": { - "editable": true - }, + "id": "ad450622", + "metadata": {}, "source": [ "$$\n", "C_{\\text{ridge}}(\\beta) = \\frac{1}{n}||X\\beta -\\mathbf{y}||^2 + \\lambda ||\\beta||^2, \\ \\lambda \\geq 0.\n", @@ -2124,20 +1804,16 @@ }, { "cell_type": "markdown", - "id": "e71de050", - "metadata": { - "editable": true - }, + "id": "d86008e8", + "metadata": {}, "source": [ "In order to minimize $C_{\\text{ridge}}(\\beta)$ using GD we adjust the gradient as follows" ] }, { "cell_type": "markdown", - "id": "a7bfa769", - "metadata": { - "editable": true - }, + "id": "8074070e", + "metadata": {}, "source": [ "$$\n", "\\nabla_\\beta C_{\\text{ridge}}(\\beta) = \\frac{2}{n}\\begin{bmatrix} \\sum_{i=1}^{100} \\left(\\beta_0+\\beta_1x_i-y_i\\right) \\\\\n", @@ -2148,20 +1824,16 @@ }, { "cell_type": "markdown", - "id": "99ec82bf", - "metadata": { - "editable": true - }, + "id": "05356160", + "metadata": {}, "source": [ "We can easily extend our program to minimize $C_{\\text{ridge}}(\\beta)$ using gradient descent and compare with the analytical solution given by" ] }, { "cell_type": "markdown", - "id": "0a94d0e3", - "metadata": { - "editable": true - }, + "id": "58c8ba7c", + "metadata": {}, "source": [ "$$\n", "\\beta_{\\text{ridge}} = \\left(X^T X + n\\lambda I_{2 \\times 2} \\right)^{-1} X^T \\mathbf{y}.\n", @@ -2170,10 +1842,8 @@ }, { "cell_type": "markdown", - "id": "b62bd0f2", - "metadata": { - "editable": true - }, + "id": "abbd7c72", + "metadata": {}, "source": [ "## The Hessian matrix for Ridge Regression\n", "The Hessian matrix of Ridge Regression for our simple example is given by" @@ -2181,10 +1851,8 @@ }, { "cell_type": "markdown", - "id": "1597e821", - "metadata": { - "editable": true - }, + "id": "134a8134", + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{H} \\equiv \\begin{bmatrix}\n", @@ -2196,10 +1864,8 @@ }, { "cell_type": "markdown", - "id": "493239f1", - "metadata": { - "editable": true - }, + "id": "b5b89343", + "metadata": {}, "source": [ "This implies that the Hessian matrix is positive definite, hence the stationary point is a\n", "minimum.\n", @@ -2210,10 +1876,8 @@ }, { "cell_type": "markdown", - "id": "e46daeca", - "metadata": { - "editable": true - }, + "id": "f79ceb7a", + "metadata": {}, "source": [ "## Program example for gradient descent with Ridge Regression" ] @@ -2221,11 +1885,8 @@ { "cell_type": "code", "execution_count": 9, - "id": "57b4ff9f", - "metadata": { - "collapsed": false, - "editable": true - }, + "id": "a9c7f630", + "metadata": {}, "outputs": [], "source": [ "from random import random, seed\n", @@ -2282,10 +1943,8 @@ }, { "cell_type": "markdown", - "id": "ddf6de67", - "metadata": { - "editable": true - }, + "id": "8c6aece2", + "metadata": {}, "source": [ "## Using gradient descent methods, limitations\n", "\n", @@ -2304,10 +1963,8 @@ }, { "cell_type": "markdown", - "id": "b11c2361", - "metadata": { - "editable": true - }, + "id": "ea1e6f53", + "metadata": {}, "source": [ "## Improving gradient descent with momentum\n", "\n", @@ -2316,13 +1973,59 @@ }, { "cell_type": "code", - "execution_count": 10, - "id": "33b8ff87", - "metadata": { - "collapsed": false, - "editable": true - }, - "outputs": [], + "execution_count": 1, + "id": "d1f044c9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + ">0 f([0.74724774]) = 0.55838\n", + ">1 f([0.59779819]) = 0.35736\n", + ">2 f([0.47823856]) = 0.22871\n", + ">3 f([0.38259084]) = 0.14638\n", + ">4 f([0.30607268]) = 0.09368\n", + ">5 f([0.24485814]) = 0.05996\n", + ">6 f([0.19588651]) = 0.03837\n", + ">7 f([0.15670921]) = 0.02456\n", + ">8 f([0.12536737]) = 0.01572\n", + ">9 f([0.10029389]) = 0.01006\n", + ">10 f([0.08023512]) = 0.00644\n", + ">11 f([0.06418809]) = 0.00412\n", + ">12 f([0.05135047]) = 0.00264\n", + ">13 f([0.04108038]) = 0.00169\n", + ">14 f([0.0328643]) = 0.00108\n", + ">15 f([0.02629144]) = 0.00069\n", + ">16 f([0.02103315]) = 0.00044\n", + ">17 f([0.01682652]) = 0.00028\n", + ">18 f([0.01346122]) = 0.00018\n", + ">19 f([0.01076897]) = 0.00012\n", + ">20 f([0.00861518]) = 0.00007\n", + ">21 f([0.00689214]) = 0.00005\n", + ">22 f([0.00551372]) = 0.00003\n", + ">23 f([0.00441097]) = 0.00002\n", + ">24 f([0.00352878]) = 0.00001\n", + ">25 f([0.00282302]) = 0.00001\n", + ">26 f([0.00225842]) = 0.00001\n", + ">27 f([0.00180673]) = 0.00000\n", + ">28 f([0.00144539]) = 0.00000\n", + ">29 f([0.00115631]) = 0.00000\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAtNUlEQVR4nO3dd3wUdf7H8ddnNz0hhJDQEtKooqBAaCqIHcuBFREbpyfq2fXuxDvP7u/0zn7qKWA5PQW7ouKhNAENJYDSISFACiWBhAAhPd/fH7vxVkzIArs7u5vP8/HgQXZmsvNmEt6ZzMx3RowxKKWUCnw2qwMopZTyDC10pZQKElroSikVJLTQlVIqSGihK6VUkAixasUJCQkmLS3NqtUrpVRAWr58+W5jTGJT8ywr9LS0NLKzs61avVJKBSQR2dbcPD3kopRSQUILXSmlgoQWulJKBQktdKWUChJa6EopFSRaLHQReUNEikVkTTPzRUReFJFcEVklIgM8H1MppVRL3NlDfwsYdZj55wE9nH8mAv869lhKKaWOVIuFboxZAJQeZpExwNvGYTEQJyKdPRXwUD8V7OXJrzegt/1VSgWahgbDE1+tY932fV55f08cQ08CClxeFzqn/YqITBSRbBHJLikpOaqVrSrcy6vfbWZVYflRfb5SSlklK28PUxZuYeMu/y10txljJhtjMo0xmYmJTY5cbdGY/klEhtp5b0m+h9MppZR3vbckn7ioUM47wTsHMTxR6EVAV5fXyc5pXhEbEcqYk7ow46ftlFfWems1SinlUcX7q5i1dieXDUgmItTulXV4otBnANc6r3YZCpQbY3Z44H2bddWQVCpr6/lspdd+biillEd9mF1IXYPhyiEpXluHO5ctTgOygF4iUigiN4jIzSJys3ORmUAekAtMAX7vtbROfZPb0i+5Le8u2aYnR5VSfq++wfDeknxO7taebokxXltPi3dbNMZc2cJ8A9zqsURuGj84hUmfrGb5tjIy0+J9vXqllHLbgpwSivZWcv/5vb26noAdKfqbE7vQJjyEd/XkqFLKz727OJ+EmDDO6dPJq+sJ2EKPDg/h4gFJfLV6B2UVNVbHUUqpJm3fW8ncDbsYm9mVsBDvVm7AFjrA+CEp1NQ18PGKQqujKKVUk95fVoABrhzsvZOhjQK60Ht3imVgajveXZKvJ0eVUn6nrr6B6cvyGdEjka7xUV5fX0AXOsBVQ1LYsruCrM17rI6ilFK/MGdDMbv2VXOVFy9VdBXwhX5+387ERYXqyVGllN95d0k+nWIjOKN3B5+sL+ALPSLUzqUDkpm1dicl+6utjqOUUgDk7znIwpwSrhjUlRC7b6o24AsdHCdH6xoMH2QXtLywUkr5wLRl+QgwbnDXFpf1lKAo9G6JMQzLaM+0pfk0NOjJUaWUtWrqGvgwu4Azj+tI57aRPltvUBQ6OPbSC8sqWZBzdLflVUopT/lm3U52H6hhvI9OhjYKmkI/9/hOtI8O05OjSinLvbs4n+R2kYzocXS3CT9aQVPoYSE2xg7qypz1u9hRXml1HKVUK5VbfICsvD1cOTgFu018uu6gKXSAKwelYIDpS/XkqFLKGtOW5hNiE8Zm+u5kaKOgKvSU9lEM75HI+8sKqKtvsDqOUqqVqaqt5+MVhZx7fCcS24T7fP1BVejgGDm6c18VczcUWx1FKdXKzFy9g70Ha302MvRQQVfoZ/buQMfYcD05qpTyuXeX5JOREM2wbu0tWX/QFXqI3ca4QSksyCmhoPSg1XGUUq3Ehp37WL6tjPFDUhDx7cnQRkFX6OAYmSU4Tk4opZQvvLckn7AQG5cOSLYsQ1AWeue2kZzRuyMfZBdQU6cnR5VS3lVRXccnK4q4oG9n2kWHWZYjKAsd4KqhKew+UMM363ZaHUUpFeS++Gk7B6rrLDsZ2ihoC31Ej0SS4iJ5T0+OKqW87L2l+fTsGMPA1HaW5gjaQrfbhPFDUvhh8x42lxywOo5SKkitKtzLqsJyrhqSatnJ0EZBW+gAl2cmE2ITpuleulLKS95bkk9kqJ2LByRZHSW4C71DmwjOPb4TH60opKq23uo4Sqkgs6+qlhk/bWf0iV2IjQi1Ok5wFzo4bqu792AtX6/ZYXUUpVSQ+XxlEQdr6n1+m9zmBH2hD8toT3pCNO8u1sMuSinPMcbw7pJ8TkiKpV9yW6vjAK2g0G02YfzgFLK3lbFx536r4yilgsSK/DI27NzvFydDGwV9oQNcOjCZMLuN95ZsszqKUipIvLskn5jwEEaf2MXqKD9rFYUeHx3G+X078cmKIg7W1FkdRykV4PYerOHLVTu4qH8XosNDrI7zs1ZR6ABXDU1lf3UdX/y03eooSqkA99HyQmrqGhg/ONXqKL/Qago9M7UdPTvG6G11lVLHxBjDe0vzGZASR58usVbH+QW3Cl1ERonIRhHJFZFJTcxPEZF5IrJSRFaJyPmej3psRBwnR1cVlrOqcK/VcZRSASpr8x7ySioYP8S/9s7BjUIXETvwMnAe0Ae4UkT6HLLYA8AHxpj+wDjgFU8H9YRLBiYTEx7C1IVbrI6ilApQUxdtoX10GBf262x1lF9xZw99MJBrjMkzxtQA04ExhyxjgMbfPdoCfnmgOjYilCsHd+Wr1TsoLNOHXyiljkzOrv3M3VDMtcPSiAi1Wx3nV9wp9CSgwOV1oXOaq4eBq0WkEJgJ3N7UG4nIRBHJFpHskpKSo4h77H57SjoCvPn9VkvWr5QKXFMXbiE8xMY1w/zvcAt47qTolcBbxphk4HzgHRH51XsbYyYbYzKNMZmJiYkeWvWR6RIXyYX9OjN9aT7llbWWZFBKBZ7i/VV8urKIyzOTibfwIRaH406hFwFdXV4nO6e5ugH4AMAYkwVEAAmeCOgNvxueQUVNvT6iTinltrd/2EZtQwM3nJphdZRmuVPoy4AeIpIuImE4TnrOOGSZfOBMABE5DkehW3NMxQ0nJLXllO7tefP7LfqIOqVUiw7W1PHO4m2c06cj6QnRVsdpVouFboypA24DZgHrcVzNslZEHhWR0c7F7gVuFJGfgGnABGOM8VZoT7hxeAa79lXrQCOlVIs+zC6kvLKWiSP8d+8cwK0xq8aYmThOdrpOe9Dl43XAKZ6N5l2n9UykV8c2TFmYxyUDkvzm5jpKKf9S32CYuiiPASlxDEyNtzrOYbWakaKHEhF+NzydDTv3szBnt9VxlFJ+atbanRSUVvr93jm04kIHGH1SFzq0CWfKwjyroyil/JAxhtcW5JHaPoqz+3SyOk6LWnWhh4fYmXBKGgtzdrNu+z6r4yil/Ez2tjJ+KtjL705Nx27z/8OyrbrQAa4anEpUmJ2pi3QvXSn1S1MW5NEuKpTLBnZteWE/0OoLvW1UKFcM6sqMH7ezo7zS6jhKKT+RV3KAb9fv4pqhqUSG+d8w/6a0+kIHuP6UdBqM4a0ftlodRSnlJ15ftIVQu41rhqVZHcVtWuhA1/gozu/bmfcW57O/Sm8HoFRrt+dANR8tL+TSAUkktgm3Oo7btNCdJo7IYH91He8vK2h5YaVUUHtn8Taq6/x7mH9TtNCd+iXHMTg9nje/30ptvd4OQKnWqqq2nreztnFm7w507xBjdZwjooXuYuLwDIr2VjJz9Q6royilLPLxikJKK2q4MQAGEh1KC93FGb07kJEYzZSFefj5rWiUUl7Q0GCYunAL/ZLbMiTdv4f5N0UL3YXNJtw4PIM1RfvIyttjdRyllI/NXr+LLbsruHF4RkDe30kL/RAX908iISaMKQt0oJFSrc2UhXkkxUVy3gn+P8y/KVroh4gItXPtsDTmbSxh0679VsdRSvnIivwylm0t44ZT0wmxB2Y1BmZqL7t6aCoRoTam6k27lGo1pi7MIzYihLGDAmOYf1O00JsQHx3G5QO78tnK7RTvq7I6jlLKy7btqeC/a3Zy1dBUYsLdekyEX9JCb8YNp6ZT29DAv7O2Wh1FKeVlbyzagt0mTDg5zeoox0QLvRlpCdGc26cT/1mcT0V1ndVxlFJeUlZRwwfZhYw5KYmOsRFWxzkmWuiHceOIDMora/kwW28HoFSwenfJNipr67lxeOANJDqUFvphDExtx8DUdrz+/Rbq9HYASgWdqtp63vphm+MZw53aWB3nmGmht+DG4RkUlFYya+0uq6MopTzs8x+L2H2gOiCeF+oOLfQWnN2nI2nto5i8YLPeDkCpINLQYJiycAt9Osdycrf2VsfxCC30Fthtwg3DM/ipsJxlW8usjqOU8pD5m4rJLT7AxBGBOcy/KVrobrhsQDLtokKZrLcDUCpoTF6QR+e2EVzQr7PVUTxGC90NkWF2rhmWxpwNu9hccsDqOEqpY7S6sJzFeaVcf0o6oQE6zL8pwfMv8bJrh6USZrfxyrzNVkdRSh2jl+fl0iY8hCsGB+4w/6ZoobspISacq4em8unKQt1LVyqArSkq579rd3L9qenERoRaHcejtNCPwC0juxEeYueF2TlWR1FKHaVnv91E28hQbhiebnUUj9NCPwIJMeFMOCWNL1ZtZ+NOvbWuUoFmRX4ZczcUM3FERtDtnYMW+hGbODyD6LAQnvt2k9VRlFJH6NlvNtE+Oizgb8LVHLcKXURGichGEckVkUnNLDNWRNaJyFoRec+zMf1Hu+gwbjg1nf+u3cmaonKr4yil3LQkbw+Lcndzy8huRAfwLXIPp8VCFxE78DJwHtAHuFJE+hyyTA/gfuAUY8zxwF2ej+o/bhieTtvIUN1LVypAGGN45ptNdGjjuLghWLmzhz4YyDXG5BljaoDpwJhDlrkReNkYUwZgjCn2bEz/EhsRysQRGczZUMyKfB09qpS/W5S7m6VbS7n19O5EhNqtjuM17hR6EuB6/9hC5zRXPYGeIvK9iCwWkVFNvZGITBSRbBHJLikpObrEfmLCyWnER4fpXrpSfq5x77xL2wjGBdl154fy1EnREKAHMBK4EpgiInGHLmSMmWyMyTTGZCYmJnpo1daIDg/hltO6sTBnN0vy9lgdRynVjLkbivmxYC+3n9mD8JDg3TsH9wq9CHD9sZbsnOaqEJhhjKk1xmwBNuEo+KB29dBUOrQJ55lvN+mdGJXyQ8YYnv12EynxUVw2MNnqOF7nTqEvA3qISLqIhAHjgBmHLPMZjr1zRCQBxyGYoL+TVWSYnVtP787SLaV8n6t76Ur5m1lrd7J2+z7uPLNHUN2zpTkt/guNMXXAbcAsYD3wgTFmrYg8KiKjnYvNAvaIyDpgHvBHY0yraLhxg7vSpW0ET3+zUffSlfIj9Q2OvfOMxGgu6n/oab/g5NaPLGPMTGNMT2NMN2PME85pDxpjZjg/NsaYe4wxfYwxfY0x070Z2p+Eh9i5/cwe/Fiwl3kbg/riHqUCypertrNp1wHuPqsndltw3O+8JcH/O4gPXDYwmZT4KJ75Ro+lK+UP6uobeH52Dr07teGCvsFzv/OWaKF7QKjdxh1n9mDt9n3MWrvT6jhKtXqLn3uTq6c/x8MJ+7C1kr1z0EL3mItO6kJGYjTPfruJ+gbdS1fKKrULv2fYnyZy/fIZDJk4FrKyrI7kM1roHhJit3HXWT3ZtOsAX67abnUcpVqtrc++gt00IIDU1MD8+VZH8hktdA+6sG9nenVswwuzc6irb7A6jlKtTlV1LSGLFmIAY7dDWBiMHGl1LJ/RQvcgm024++ye5O2u4LMfdS9dKV9b9tgLpO8uoOC2PyCPPQZz5sCwYVbH8hmx6qqMzMxMk52dbcm6vckYw29eWkR5ZS1z7x3ZKgYzKOUPKkvLOZCWwd72neieuwqxB+cwfxFZbozJbGqeto2HiQj3nt2LgtJKPswutDqOUq3G+rv+TOL+UmqeeTZoy7wlWuheMLJXIv1T4vjn3ByqauutjqNU0KvYtJnjp03hhyHncPwl51odxzJa6F7QuJe+o7yK6UvzrY6jVNDbftPtNGCj7QvPWB3FUlroXnJK9/YMSY/n5fmbqazRvXSlvOXAnPn0mP81315wDccPOcHqOJbSQvcSEeHec3pRsr+adxZvtTqOUsGpoYEDt9zG9jYJdH/mUavTWE4L3YsGp8czvEcCr36Xx4HqOqvjKBV0Kqa8Qaectfz3qjvp06313LOlOVroXnbP2T0prajh3z9stTqKUsFl/37M/fezoksvTn3oDqvT+AUtdC/rn9KOM3t34LXvNlNeWWt1HKWCRsWjjxNTtpv5t/yZnp1irY7jF7TQfeDus3uyr6qOqQuD/iFOSvnGli2Ev/A8nx5/OhfddInVafyGFroPnJDUlgv7dWbygjwKyw5aHUepgLf/rnupQVh/x/1kJMZYHcdvaKH7yP3nH4cIPPHVequjKBXQzHff0WbGp7x5ylgmjh9hdRy/ooXuI0lxkdx2ene+XrOThTklVsdRKjDV17PvltsoapNI7AOTSIgJtzqRX9FC96HfDc8gtX0UD89YS02d3l5XqSNV8/qbtF2/hncuupkrR/a2Oo7f0UL3oYhQOw9e2IfNJRV6GaNSR2r/fmon3c/yLr0Z+dAdhOidTH9Ft4iPnXlcR87o3YHnZ2+ieF+V1XGUChjlf32E6LLdzLv5zwztlmB1HL+khW6BBy/sQ2294cmvN1gdRanAsGULUS+/yOd9z+TqOy63Oo3f0kK3QFpCNDeOSOeTlUUs21pqdRyl/F7xzXdQKzbK//oIndpGWB3Hb2mhW+TW07vTuW0ED32+lvoGa54apVQgqJk7lw7ffMn008dzxcVDrY7j17TQLRIVFsJfLjiOdTv28Z7eM12pptXXU36T4zLF7n9/iPCQ1vkkIndpoVvogr6dGZbRnqdnbaS0osbqOEr5nfJXJpOYu56vrr6LESemWh3H72mhW0hEeGTM8RyoruPpbzZaHUcp/7JvH/LAAyxPPo7zHrvT6jQBQQvdYj07tuG6YWlMW5rP6sJyq+Mo5Te2//EBYveVsuG+R+naPtrqOAFBC90P3HV2D9pHh/HgjDU06AlSpajblEPC668yc8A5XDLxYqvjBAwtdD8QGxHKfaN6szJ/L5+sLLI6jlKWK7rxNmptdiL/8SSRYXoi1F1uFbqIjBKRjSKSKyKTDrPcpSJiRCTTcxFbh0sHJNM/JY4nv17Pvip9EIZqvcpnziJ1wTfMvOA6Rp5+ktVxAkqLhS4iduBl4DygD3CliPRpYrk2wJ3AEk+HbA1sNuHR0Sewp6KGF2bnWB1HKWvU11Px+zspbNuBAc8/hohYnSiguLOHPhjINcbkGWNqgOnAmCaWewx4CtAblBylvsltGTcohbd+2MqmXfutjqOUz+U//RJdtm1k2S330S010eo4AcedQk8CClxeFzqn/UxEBgBdjTFfHe6NRGSiiGSLSHZJid4TvCl/PLcXMeEhPPT5WozRE6Sq9Wgo20vs4w/zY+oJnPXgbVbHCUjHfFJURGzAs8C9LS1rjJlsjMk0xmQmJupP36bER4fxh3N7kZW3h5mrd1odRymf2XjHJGIPlFP2xN9pExlmdZyA5E6hFwFdXV4nO6c1agOcAMwXka3AUGCGnhg9euMHp9CncyyPf7WOgzV1VsdRyuv2r15P92mv892w8xg5fpTVcQKWO4W+DOghIukiEgaMA2Y0zjTGlBtjEowxacaYNGAxMNoYk+2VxK2A3SY8OuZ4dpRX8cq8zVbHUcrrCm+8jRpbCF1eflZPhB6DFgvdGFMH3AbMAtYDHxhj1orIoyIy2tsBW6vMtHgu7p/E5AV5bN1dYXUcpbxm24dfcNySufwwdiK9+veyOk5AE6tOvGVmZprsbN2JP5zifVWc/vR8hmS0540Jg6yOo5THmbo68tN6E1pxgKjNm4iLj7U6kt8TkeXGmCYPaetIUT/WITaCu87qydwNxcxZv8vqOEp5VlYWO86+kNSizeT96SEtcw/QQvdz152cRrfEaB7+Yi0V1XqCVAWJrCzMGWfQef4sGkQYNryf1YmCgha6nwsLsfG3S/pRWFbJ41+tszqOUh5h5s2DqioEx22k7QsXWB0pKGihB4DB6fHcNKIb05YW8O06PfSiAt/6/N0IYESQ8HAYOdLqSEFBCz1A3HN2T/p0jmXSx6so2V9tdRyljtqOH9fR9a3X2JrUDfPoozBnDgwbZnWsoKCFHiDCQmw8P+4k9lfXcd/Hq/S2ACog1dfUsu/SKwAI+/ILbA88oGXuQVroAaRnxzbcf15v5m4o1gdLq4C0cuK99Mpbw9q/PkWXk46zOk7Q0UIPMNcNS2N4jwQe/3I9eSUHrI6jlNu2fP4N/d9+mcWnnM+QP99qdZygpIUeYGw24R+XnUhYiI27P/iJ2voGqyMp1aKq3aVE/vZadsR1pOeH/9bh/V6ihR6AOrWN4P8u7stPBXt5aW6u1XGUalHOZdeSsLeE4n9NJb5zgtVxgpYWeoC6oF9nLumfxEvzclmRX2Z1HKWatfHpf9H3u6/47srfM+CK862OE9S00APYw2OOp1NsBHe//6OOIlV+ad/aDSQ/8AdWpffj5KnPWB0n6GmhB7DYiFCeHXsi+aUHdRSp8jumpoY9F42lHiFs2rtE6kMrvE4LPcANyWivo0iVX9p4259Iz11N1p+eoPeQE6yO0ypooQcBHUWq/E3JzNn0mPpP5g09j7MevsPqOK2GFnoQcB1FOklHkSqLNZSWwTVXUxTXkR7T38Ru00sUfUULPUj07NiGSaN6M2dDMdOWFlgdR7VWxpB3+bW0Kyth07Ovkpza0epErYoWehCZcHIap3ZP4LEv1+koUmWJohcn033ul3x56c2ced1vrI7T6mihBxGbTXj6ch1FqqxRvX4j7e67m+Vp/Rjx+tM6GtQCWuhBplPbCJ64+AQdRap8q7aW3RddTi02qt98i/jYSKsTtUpa6EHown5dfh5FulJHkSofKLjzPpI2rea/dzzCySP7Wx2n1dJCD1I6ilT5yoFv5pL06vN8PWgUox+/y+o4rZoWepBqHEW6rfQgj3+13uo4KkiZ0lJqxo8nP64zKe9MJTLMbnWkVk0LPYgNyWjPxBEZTFuaz4fZeimj8jBj2Hr5tbQp283Sx1/k+F5JVidq9bTQg9wfzunFqd0T+POnq8navMfqOCqIrHvyRdLnfsWMS2/m0psvsTqOQgs96IXabbx81QDS2kdz83+Ws1mvT1cekLNoBWkPTWJV9/6c9+9ndDSon9BCbwXaRobyxoRBhNiE699aRmlFjdWRVADb8/VsYi84FyM2Os/4gKjIcKsjKSct9Faia3wUU67LZGd5FRPfzqaqtt7qSCoAVc5fSNyFo+i4bzeRpo7EvSVWR1IutNBbkQEp7Xh27ElkbyvjPr2JlzpC9Q2G3Nv/hL3BsTNga6iH+fOtDaV+QQu9lbmgX2f+eG4vPv9xO8/NzrE6jgogM/7wFH3XLKbBZgO7HcLCYORIq2MpF24VuoiMEpGNIpIrIpOamH+PiKwTkVUiMkdEUj0fVXnK70d2Y2xmMi/OyeGTFYVWx1EBYPZz/+bCFx4gr98QbHPnwmOPwZw5MGyY1dGUi5CWFhARO/AycDZQCCwTkRnGGNdnnq0EMo0xB0XkFuDvwBXeCKyOnYjw+EV9KSit5L6PV5EUF8mQjPZWx1J+atnH3zLsvpvZkZRB6nezIK4tnHaa1bFUE9zZQx8M5Bpj8owxNcB0YIzrAsaYecaYg86Xi4Fkz8ZUnhYWYuPVqweSEh/FTf9ZzpbdFVZHUn4oN+tH0q8by4E2cSQsmIM9rq3VkdRhuFPoSYDrMMNC57Tm3AB83dQMEZkoItkikl1SomfHrdY2KpQ3JwzGJsJv31xKmV7OqFyUbM4n/DcXEtpQj23WLKLSulodSbXAoydFReRqIBP4R1PzjTGTjTGZxpjMxMRET65aHaWU9lFMuXYg28uruOmd5VTX6eWMCg6W7qXsjFEklO9mz/SPSczsZ3Uk5QZ3Cr0IcP3RnOyc9gsichbwF2C0MUafVBxABqbG84/L+rF0aymTPl6tlzO2cvXVNWw+/QK6FWxk0/OTyRh9ttWRlJvcKfRlQA8RSReRMGAcMMN1ARHpD7yGo8yLPR9TeduYk5K45+yefLqyiBfn6IMxWi1jWHPhFfRd9QNZf3icE2+91upE6gi0eJWLMaZORG4DZgF24A1jzFoReRTINsbMwHGIJQb40PnYqXxjzGgv5lZecPsZ3dm6p4LnZm8iLSGKMSfp3fNamzXX38GJsz9j3hW3MPKpX12hrPxci4UOYIyZCcw8ZNqDLh+f5eFcygIiwt8u6UthWSV//HAVXeIiGZQWb3Us5SObHv47J7z1EvNHjGH4f/6pzwQNQDpSVP1CeIid164eSFK7SCa+nc1WvZyxVSh64z26PzKJxcefTObM6YSE6IMqApEWuvqVdtFhvDFhEAb07oytQNmsOSTcNIG1XXuT+s0MYqIjrI6kjpIWumpSekI0k6/JpHBvJWNfy2L73kqrIykvKPo+m5CLL2J7bAfsX35J5y46YjiQaaGrZg1Oj+ft6wezq7yKS//1Azm79lsdSXnQ1tffI/bMkdQhVH4xkz79MqyOpI6RFro6rKEZ7Xn/pmHUNRguezWL5dvKrI6kPGDd5HdJ+d3VxFRX0Lahhj6i50qCgRa6alGfLrF8csvJtIsK5aqpi5m7YZfVkdQxmP/l93S582YEgwC2ujq9r3mQ0EJXbukaH8VHt5xMjw5tuPHt5Xy8XG+7G4hmvv45fceeT4gA4eF6X/Mgo4Wu3JYQE860iUMZmhHPvR/+xOQFm62OpNxkjOHTJ6Yw8pYrqI9pQ+jybGTePL2veZBxa2CRUo1iwkN4Y8Ig7vngJ/5v5gZ2H6hh0qje2PSp736rvsHw+R2PMfqVR9iZ1otOi+YQ0qWzY6YWeVDRQldHLDzEzj/H9SchOozJC/LYfaCapy7tR6hdf+HzN1U1dXwz/nYu+fhVtgw4hbR5M5HYWKtjKS/RQldHxWYTHh59PAkx4Tzz7SbKKmp4+aoBRIXpt5S/2FdRxZLzxzN6wafknnsx3WdMdxwvV0FLd6nUURMRbj+zB3+7pC/fbSrhqqlL9CEZfqK4uIw1w87h7AWfkjPh93T/+mMt81ZAC10dsysHp/DKVQNZu30fl+uoUssV5Bawc8gIhq5eRM4D/0ePN18GvdFWq6CFrjxi1AmddFSp1bKyKPn9XdgGDaJ3wUa2vfIGPR673+pUyoe00JXHuI4qvfw1HVXqU1lZNIw8nYR/vUCXvbsof+Ip0m+ZYHUq5WNa6MqjGkeVxkU6RpV+8dN2qyMFPdPQQNGkh5CaagTAZiexocrqWMoCWujK4xpHlfbuFMvt01Zy8zvLKd6nBeMNO3Lz+XHgSJIWfIsRG8ZuR8J15GdrpYWuvCIhJpyPbh7GpPN6M29jMWc9+x0fZBfoA6g9pKHBMPv5twnpfxJ9Vi9myZ0PwoIFiI78bNXEqv9gmZmZJjs725J1K9/KKznApI9Xs3RrKad2T+Bvl/Sla3yU1bECVl7hHtZNuJUL57xPYZd0QqZPo9PwIVbHUj4iIsuNMZlNzdM9dOV1GYkxTJ84lMcuOoGV+WWc89wC3vx+C/UNurd+JOrqG5j+1n+pHjiYC+e8T+7l15GUs0bLXP1MC135hM0mXDM0lW/uOY0hGfE88sU6Ln/1B3KL9fJGd+TN+IZl/U/j4t/9huTKUva+/zHdP3gLidLfdNT/aKErn0qKi+TNCYN47ooT2bK7gvNfWMRLc3OorW+wOppfqqqt57O/vkjqRecxbPUiwkwDbd59m7ixl1gdTfkhLXTlcyLCxf2T+fae0zjn+I48/c0mfvPPRawuLLc6ml9ZuXYbn4y6lgufuBubcfzAExFYs8biZMpfaaEryyTEhPPS+AFMvmYgpRU1XPTK9zz59QaqauutjmapisoaPrvzCZKG9Gf83PfYd+pIJCJCH0ahWqS3xlOWO+f4TgzJaM/fZq7n1e82M2vtTp68pC9DMlrRE+izsmD+fDbVhNAwZSoXFW2ioNeJVE75gvjhp/w8n5Ej9ZJE1Sy9bFH5le9zdzPpk1UUlFZycf8krh6awoCUdo5DDUHK/PAD5owzkGrHSM/S6Dj2PvEUGXfcqDfVUr9yuMsWdQ9d+ZVTuicw664RPD87h3cXb+PTlUV07xDDFZlduWRAEu1jwq2O6DHF+6pY+M4XDHjsj6Q5y7xBhDb33kn8nROtjqcCkO6hK79VUV3HV6t2MH1ZPivy9xJqF87u05GxmV0Z3iMRewA+9q5u0fds/egrftyxn7Qf5pJZuI6D4VFE1NUgGCQsTEd6qsM63B66FroKCDm79vP+sgI+WVlEaUUNXdpGcHlmVy7PTCa5nf9fi71tTwXLXn6HMY/cTkhDHQIcaJdA1R/+RMIdt8Dq1XqMXLlFC10Fjeq6emavK+b97AIW5pQAcGr3BMYNSuGsPh0ID7FbnPB/qmrryX7rE2TKZMK2FzGgaAN2HP/fjM2GPPoo/OUvFqdUgUaPoaugER5i54J+nbmgX2cKyw7yYXYhH2YXcOt7K4iPDuOS/klcMagrPTq2sSZgVhYl0z5m3c79hC9bwilbf0IAA1SfeTb27xdCba3j0MoZZ1iTUQUtt/bQRWQU8AJgB6YaY548ZH448DYwENgDXGGM2Xq499Q9dOUp9Q2GRbm7eX9ZPt+u20VtvaF3pzZ06xBD13ZRpMRH0TU+kq7tougSF0lYyDEMv3BePlgXF8++op1s6zuIsoIddPjqM2zFxfRevwwxBgGqwyIIq6ly3KPcbofHHnMcUtFDK+oYHNMhFxGxA5uAs4FCYBlwpTFmncsyvwf6GWNuFpFxwMXGmCsO975a6Mob9hyo5pMVRSzIKaGg9CCFZZXUudwEzCbQuW0kye0i6Rr/y7LvGh9FYkw4tox0GrZtw4hQHxtHTVQ0u1K6syu6HUPmf440NPy81y3OPzhf43xtbHbkxt/B229DTY1jQJCe7FQecKyFPgx42BhzrvP1/QDGmL+5LDPLuUyWiIQAO4FEc5g310JXvlDfYNi5r4qC0oPklx6ksPQgBWWVP78u3l/9i+UXvTKBpP27f/U+h15P01jmriWOzeb4Y8z/Chx0j1x51LEeQ08CClxeFwKH3q/z52WMMXUiUg60B37xP0NEJgITAVJSUtwKr9SxsNuEpLhIkuIiGdrEyNOq2noKyyopKHOUfZenHN+yLV0Q2VjgEhrqKPD6ekeJP/887NnzywLXIlc+4tOTosaYycBkcOyh+3LdSjUlItRO9w4xdO8Q45iQmgrbtjX/CSIQEgJ33w1xcf+7r4ruhSs/4E6hFwFdXV4nO6c1tUyh85BLWxwnR5UKLFu3Qlqao9RFoF07aNMG+veH88779d53Iy1y5QfcKfRlQA8RScdR3OOA8YcsMwO4DsgCLgPmHu74uVJ+betWqxModVRaLHTnMfHbgFk4Llt8wxizVkQeBbKNMTOA14F3RCQXKMVR+koppXzIrWPoxpiZwMxDpj3o8nEVcLlnoymllDoS+oALpZQKElroSikVJLTQlVIqSGihK6VUkLDs9rkiUgIcZgTHYSVwyChUP6G5jozmOnL+mk1zHZljyZVqjElsaoZlhX4sRCS7uXsZWElzHRnNdeT8NZvmOjLeyqWHXJRSKkhooSulVJAI1EKfbHWAZmiuI6O5jpy/ZtNcR8YruQLyGLpSSqlfC9Q9dKWUUofQQldKqSDht4UuIpeLyFoRaRCRZi/vEZFRIrJRRHJFZJLL9HQRWeKc/r6IhHkoV7yIfCsiOc6/2zWxzOki8qPLnyoRucg57y0R2eIy7yRf5XIuV++y7hku063cXieJSJbz671KRK5wmefR7dXc94vL/HDnvz/XuT3SXObd75y+UUTOPZYcR5HrHhFZ59w+c0Qk1WVek19TH+WaICIlLuv/ncu865xf9xwRuc7HuZ5zybRJRPa6zPPm9npDRIpFZE0z80VEXnTmXiUiA1zmHfv2Msb45R/gOKAXMB/IbGYZO7AZyADCgJ+APs55HwDjnB+/CtzioVx/ByY5P54EPNXC8vE4bikc5Xz9FnCZF7aXW7mAA81Mt2x7AT2BHs6PuwA7gDhPb6/Dfb+4LPN74FXnx+OA950f93EuHw6kO9/H7sNcp7t8D93SmOtwX1Mf5ZoAvNTE58YDec6/2zk/buerXIcsfzuO2357dXs533sEMABY08z884GvcTzFcCiwxJPby2/30I0x640xG1tYbDCQa4zJM8bUANOBMSIiwBnAR87l/g1c5KFoY5zv5+77XgZ8bYw56KH1N+dIc/3M6u1ljNlkjMlxfrwdKAaaHAl3jJr8fjlM3o+AM53bZwww3RhTbYzZAuQ6388nuYwx81y+hxbjeHKYt7mzvZpzLvCtMabUGFMGfAuMsijXlcA0D637sIwxC3DswDVnDPC2cVgMxIlIZzy0vfy20N3U1AOsk3A8oHqvMabukOme0NEYs8P58U6gYwvLj+PX30xPOH/dek5Ewn2cK0JEskVkceNhIPxoe4nIYBx7XZtdJntqezX3/dLkMs7t0fjAc3c+15u5XN2AYy+vUVNfU1/mutT59flIRBofV+kX28t5aCodmOsy2Vvbyx3NZffI9vLpQ6IPJSKzgU5NzPqLMeZzX+dpdLhcri+MMUZEmr3u0/mTty+Opz01uh9HsYXhuBb1PuBRH+ZKNcYUiUgGMFdEVuMoraPm4e31DnCdMabBOfmot1cwEpGrgUzgNJfJv/qaGmM2N/0OHvcFMM0YUy0iN+H47eYMH63bHeOAj4wx9S7TrNxeXmVpoRtjzjrGt2juAdZ7cPwqE+Lcy2rqwdZHlUtEdolIZ2PMDmcBFR/mrcYCnxpjal3eu3FvtVpE3gT+4Mtcxpgi5995IjIf6A98jMXbS0Riga9w/DBf7PLeR729mnAsDzx353O9mQsROQvHD8nTjDHVjdOb+Zp6oqBazGWMcX0Y/FQc50waP3fkIZ873wOZ3MrlYhxwq+sEL24vdzSX3SPbK9APufz8AGtxXJUxDphhHGcZ5uE4fg2OB1h7ao+/8YHY7rzvr47dOUut8bj1RUCTZ8O9kUtE2jUeshCRBOAUYJ3V28v5tfsUx7HFjw6Z58nt1eT3y2Hyuj7wfAYwThxXwaQDPYClx5DliHKJSH/gNWC0MabYZXqTX1Mf5urs8nI0sN758SzgHGe+dsA5/PI3Va/mcmbrjeMEY5bLNG9uL3fMAK51Xu0yFCh37rR4Znt562zvsf4BLsZxHKka2AXMck7vAsx0We58YBOOn7B/cZmegeM/XC7wIRDuoVztgTlADjAbiHdOzwSmuiyXhuOnru2Qz58LrMZRTP8BYnyVCzjZue6fnH/f4A/bC7gaqAV+dPlzkje2V1PfLzgO4Yx2fhzh/PfnOrdHhsvn/sX5eRuB8zz8/d5SrtnO/weN22dGS19TH+X6G7DWuf55QG+Xz73euR1zgd/6Mpfz9cPAk4d8nre31zQcV2nV4uivG4CbgZud8wV42Zl7NS5X8Hlie+nQf6WUChKBfshFKaWUkxa6UkoFCS10pZQKElroSikVJLTQlVIqSGihK6VUkNBCV0qpIPH/s/Ss5hTLXcMAAAAASUVORK5CYII=\n", + "text/plain": [ + "