diff --git a/doc/pub/week39/html/week39-reveal.html b/doc/pub/week39/html/week39-reveal.html index 3bc363cd9..907ea81d3 100644 --- a/doc/pub/week39/html/week39-reveal.html +++ b/doc/pub/week39/html/week39-reveal.html @@ -1774,7 +1774,7 @@ $$
This implies that the Hessian matrix is positive definite, hence the stationary point is a minimum. -Note that the Ridge loss function is convex, as a sum of two convex +Note that the Ridge cost function is convex being a sum of two convex functions. Therefore, the stationary point is a global minimum of this function.
diff --git a/doc/pub/week39/html/week39-solarized.html b/doc/pub/week39/html/week39-solarized.html index db67d2a6f..811dab43e 100644 --- a/doc/pub/week39/html/week39-solarized.html +++ b/doc/pub/week39/html/week39-solarized.html @@ -1681,7 +1681,7 @@ $$This implies that the Hessian matrix is positive definite, hence the stationary point is a minimum. -Note that the Ridge loss function is convex, as a sum of two convex +Note that the Ridge cost function is convex being a sum of two convex functions. Therefore, the stationary point is a global minimum of this function.
diff --git a/doc/pub/week39/html/week39.html b/doc/pub/week39/html/week39.html index 7464180a5..e8db8fc1e 100644 --- a/doc/pub/week39/html/week39.html +++ b/doc/pub/week39/html/week39.html @@ -1758,7 +1758,7 @@ $$This implies that the Hessian matrix is positive definite, hence the stationary point is a minimum. -Note that the Ridge loss function is convex, as a sum of two convex +Note that the Ridge cost function is convex being a sum of two convex functions. Therefore, the stationary point is a global minimum of this function.
diff --git a/doc/pub/week39/ipynb/ipynb-week39-src.tar.gz b/doc/pub/week39/ipynb/ipynb-week39-src.tar.gz index d511de4b1..aa4cca30f 100644 Binary files a/doc/pub/week39/ipynb/ipynb-week39-src.tar.gz and b/doc/pub/week39/ipynb/ipynb-week39-src.tar.gz differ diff --git a/doc/pub/week39/ipynb/week39.ipynb b/doc/pub/week39/ipynb/week39.ipynb index 881d1a9b6..5bf0c2358 100644 --- a/doc/pub/week39/ipynb/week39.ipynb +++ b/doc/pub/week39/ipynb/week39.ipynb @@ -2,8 +2,10 @@ "cells": [ { "cell_type": "markdown", - "id": "c4da4e52", - "metadata": {}, + "id": "27989178", + "metadata": { + "editable": true + }, "source": [ "\n", @@ -12,8 +14,10 @@ }, { "cell_type": "markdown", - "id": "f29028c4", - "metadata": {}, + "id": "1deb5178", + "metadata": { + "editable": true + }, "source": [ "# Week 39: Optimization and Gradient Methods\n", "**Morten Hjorth-Jensen**, Department of Physics, University of Oslo and Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University\n", @@ -25,8 +29,10 @@ }, { "cell_type": "markdown", - "id": "7f7ee367", - "metadata": {}, + "id": "59210b98", + "metadata": { + "editable": true + }, "source": [ "## Plan for week 39\n", "\n", @@ -49,8 +55,10 @@ }, { "cell_type": "markdown", - "id": "fc2a836f", - "metadata": {}, + "id": "b70375c6", + "metadata": { + "editable": true + }, "source": [ "## Thursday September 30\n", "\n", @@ -59,8 +67,10 @@ }, { "cell_type": "markdown", - "id": "9617382d", - "metadata": {}, + "id": "83e12c9e", + "metadata": { + "editable": true + }, "source": [ "## Searching for Optimal Regularization Parameters $\\lambda$\n", "\n", @@ -76,8 +86,11 @@ { "cell_type": "code", "execution_count": 1, - "id": "d49166c2", - "metadata": {}, + "id": "8cc00952", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "%matplotlib inline\n", @@ -130,8 +143,10 @@ }, { "cell_type": "markdown", - "id": "19a9a5ab", - "metadata": {}, + "id": "c2e91e0f", + "metadata": { + "editable": true + }, "source": [ "Here we have performed a rather data greedy calculation as function of the regularization parameter $\\lambda$. There is no resampling here. The latter can easily be added by employing the function **RidgeCV** instead of just calling the **Ridge** function. For **RidgeCV** we need to pass the array of $\\lambda$ values.\n", "By inspecting the figure we can in turn determine which is the optimal regularization parameter.\n", @@ -140,8 +155,10 @@ }, { "cell_type": "markdown", - "id": "edeb088d", - "metadata": {}, + "id": "3469cb13", + "metadata": { + "editable": true + }, "source": [ "## Grid Search\n", "\n", @@ -153,8 +170,11 @@ { "cell_type": "code", "execution_count": 2, - "id": "71bdc0a2", - "metadata": {}, + "id": "183fbef5", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import numpy as np\n", @@ -203,8 +223,10 @@ }, { "cell_type": "markdown", - "id": "0ff3515b", - "metadata": {}, + "id": "fbd82e6a", + "metadata": { + "editable": true + }, "source": [ "By default the grid search function includes cross validation with\n", "five folds. The [Scikit-Learn\n", @@ -216,8 +238,10 @@ }, { "cell_type": "markdown", - "id": "fb36d7f9", - "metadata": {}, + "id": "d90912a2", + "metadata": { + "editable": true + }, "source": [ "## Randomized Grid Search\n", "\n", @@ -234,8 +258,11 @@ { "cell_type": "code", "execution_count": 3, - "id": "0dc5c1a6", - "metadata": {}, + "id": "031a0009", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import numpy as np\n", @@ -285,8 +312,10 @@ }, { "cell_type": "markdown", - "id": "c0482352", - "metadata": {}, + "id": "2dae05d8", + "metadata": { + "editable": true + }, "source": [ "## Optimization, the central part of any Machine Learning algortithm\n", "\n", @@ -302,8 +331,10 @@ }, { "cell_type": "markdown", - "id": "f13f9cf3", - "metadata": {}, + "id": "dde56423", + "metadata": { + "editable": true + }, "source": [ "## Revisiting our Logistic Regression case\n", "\n", @@ -317,8 +348,10 @@ }, { "cell_type": "markdown", - "id": "563d2108", - "metadata": {}, + "id": "287dd911", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{align*}\n", @@ -330,16 +363,20 @@ }, { "cell_type": "markdown", - "id": "cfebfdde", - "metadata": {}, + "id": "3e95f118", + "metadata": { + "editable": true + }, "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": "f732663f", - "metadata": {}, + "id": "50bacdb9", + "metadata": { + "editable": true + }, "source": [ "## The equations to solve\n", "\n", @@ -352,8 +389,10 @@ }, { "cell_type": "markdown", - "id": "a4f74c15", - "metadata": {}, + "id": "331fc9ec", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = -\\boldsymbol{X}^T\\left(\\boldsymbol{y}-\\boldsymbol{p}\\right).\n", @@ -362,8 +401,10 @@ }, { "cell_type": "markdown", - "id": "ce57218f", - "metadata": {}, + "id": "dab31d07", + "metadata": { + "editable": true + }, "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" @@ -371,8 +412,10 @@ }, { "cell_type": "markdown", - "id": "e40a4cac", - "metadata": {}, + "id": "d235b146", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial^2 \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}\\partial \\boldsymbol{\\beta}^T} = \\boldsymbol{X}^T\\boldsymbol{W}\\boldsymbol{X}.\n", @@ -381,16 +424,20 @@ }, { "cell_type": "markdown", - "id": "2eafcd65", - "metadata": {}, + "id": "077d1780", + "metadata": { + "editable": true + }, "source": [ "This defines what is called the Hessian matrix." ] }, { "cell_type": "markdown", - "id": "bdb8d75d", - "metadata": {}, + "id": "2ef1828a", + "metadata": { + "editable": true + }, "source": [ "## Solving using Newton-Raphson's method\n", "\n", @@ -401,8 +448,10 @@ }, { "cell_type": "markdown", - "id": "7304cc0b", - "metadata": {}, + "id": "ab007df8", + "metadata": { + "editable": true + }, "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", @@ -411,16 +460,20 @@ }, { "cell_type": "markdown", - "id": "d04b9c03", - "metadata": {}, + "id": "a2232f70", + "metadata": { + "editable": true + }, "source": [ "or in matrix form as" ] }, { "cell_type": "markdown", - "id": "43c885d7", - "metadata": {}, + "id": "2550c2f0", + "metadata": { + "editable": true + }, "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", @@ -429,8 +482,10 @@ }, { "cell_type": "markdown", - "id": "46bde37c", - "metadata": {}, + "id": "0743917a", + "metadata": { + "editable": true + }, "source": [ "The right-hand side is computed with the old values of $\\beta$. \n", "\n", @@ -439,8 +494,10 @@ }, { "cell_type": "markdown", - "id": "a0b72eb7", - "metadata": {}, + "id": "8e14cb5e", + "metadata": { + "editable": true + }, "source": [ "## Brief reminder on Newton-Raphson's method\n", "\n", @@ -457,8 +514,10 @@ }, { "cell_type": "markdown", - "id": "5b7485f1", - "metadata": {}, + "id": "74a0765f", + "metadata": { + "editable": true + }, "source": [ "## The equations\n", "\n", @@ -471,8 +530,10 @@ }, { "cell_type": "markdown", - "id": "4ba6228a", - "metadata": {}, + "id": "a322bd0e", + "metadata": { + "editable": true + }, "source": [ "\n", "\n", @@ -485,8 +546,10 @@ }, { "cell_type": "markdown", - "id": "30380d0c", - "metadata": {}, + "id": "c2a5bad6", + "metadata": { + "editable": true + }, "source": [ "For small enough values of the function and for well-behaved\n", "functions, the terms beyond linear are unimportant, hence we obtain" @@ -494,8 +557,10 @@ }, { "cell_type": "markdown", - "id": "23c99855", - "metadata": {}, + "id": "ad427199", + "metadata": { + "editable": true + }, "source": [ "$$\n", "f(x)+(s-x)f'(x)\\approx 0,\n", @@ -504,16 +569,20 @@ }, { "cell_type": "markdown", - "id": "08273eaa", - "metadata": {}, + "id": "ee10e015", + "metadata": { + "editable": true + }, "source": [ "yielding" ] }, { "cell_type": "markdown", - "id": "e77fa937", - "metadata": {}, + "id": "724d2e8a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "s\\approx x-\\frac{f(x)}{f'(x)}.\n", @@ -522,16 +591,20 @@ }, { "cell_type": "markdown", - "id": "52d8ac79", - "metadata": {}, + "id": "d5873493", + "metadata": { + "editable": true + }, "source": [ "Having in mind an iterative procedure, it is natural to start iterating with" ] }, { "cell_type": "markdown", - "id": "c749910f", - "metadata": {}, + "id": "d880bf0b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "x_{n+1}=x_n-\\frac{f(x_n)}{f'(x_n)}.\n", @@ -540,8 +613,10 @@ }, { "cell_type": "markdown", - "id": "ce3de0ff", - "metadata": {}, + "id": "15aece47", + "metadata": { + "editable": true + }, "source": [ "## Simple geometric interpretation\n", "\n", @@ -560,8 +635,10 @@ }, { "cell_type": "markdown", - "id": "7e046c1f", - "metadata": {}, + "id": "fc3d79af", + "metadata": { + "editable": true + }, "source": [ "## Extending to more than one variable\n", "\n", @@ -571,8 +648,10 @@ }, { "cell_type": "markdown", - "id": "6b1748dc", - "metadata": {}, + "id": "e357107f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{array}{cc} f_1(x_1,x_2) &=0\\\\\n", @@ -582,16 +661,20 @@ }, { "cell_type": "markdown", - "id": "81266388", - "metadata": {}, + "id": "34b27705", + "metadata": { + "editable": true + }, "source": [ "which we Taylor expand to obtain" ] }, { "cell_type": "markdown", - "id": "b8b28a01", - "metadata": {}, + "id": "7d0e5513", + "metadata": { + "editable": true + }, "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", @@ -606,16 +689,20 @@ }, { "cell_type": "markdown", - "id": "a37caf24", - "metadata": {}, + "id": "b622ab6c", + "metadata": { + "editable": true + }, "source": [ "Defining the Jacobian matrix ${\\bf \\boldsymbol{J}}$ we have" ] }, { "cell_type": "markdown", - "id": "4421201b", - "metadata": {}, + "id": "eff30163", + "metadata": { + "editable": true + }, "source": [ "$$\n", "{\\bf \\boldsymbol{J}}=\\left( \\begin{array}{cc}\n", @@ -627,16 +714,20 @@ }, { "cell_type": "markdown", - "id": "156aa5ac", - "metadata": {}, + "id": "25b8eae6", + "metadata": { + "editable": true + }, "source": [ "we can rephrase Newton's method as" ] }, { "cell_type": "markdown", - "id": "19c663a4", - "metadata": {}, + "id": "fb33d901", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\begin{array}{c} x_1^{n+1} \\\\ x_2^{n+1} \\end{array} \\right)=\n", @@ -647,16 +738,20 @@ }, { "cell_type": "markdown", - "id": "fab6f264", - "metadata": {}, + "id": "56d2b104", + "metadata": { + "editable": true + }, "source": [ "where we have defined" ] }, { "cell_type": "markdown", - "id": "d3726f16", - "metadata": {}, + "id": "3d27ac93", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\begin{array}{c} h_1^{n} \\\\ h_2^{n} \\end{array} \\right)=\n", @@ -667,8 +762,10 @@ }, { "cell_type": "markdown", - "id": "091973c9", - "metadata": {}, + "id": "21070210", + "metadata": { + "editable": true + }, "source": [ "We need thus to compute the inverse of the Jacobian matrix and it\n", "is to understand that difficulties may\n", @@ -680,8 +777,10 @@ }, { "cell_type": "markdown", - "id": "2042ba02", - "metadata": {}, + "id": "e9a8d5ab", + "metadata": { + "editable": true + }, "source": [ "## Steepest descent\n", "\n", @@ -695,8 +794,10 @@ }, { "cell_type": "markdown", - "id": "66e3647e", - "metadata": {}, + "id": "301ef6ac", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k),\n", @@ -705,8 +806,10 @@ }, { "cell_type": "markdown", - "id": "038d29b8", - "metadata": {}, + "id": "9ac00842", + "metadata": { + "editable": true + }, "source": [ "with $\\gamma_k > 0$.\n", "\n", @@ -717,8 +820,10 @@ }, { "cell_type": "markdown", - "id": "7b2aec41", - "metadata": {}, + "id": "f07f5084", + "metadata": { + "editable": true + }, "source": [ "## More on Steepest descent\n", "\n", @@ -730,8 +835,10 @@ }, { "cell_type": "markdown", - "id": "c5344c2b", - "metadata": {}, + "id": "194ec701", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k), \\ \\ k \\geq 0.\n", @@ -740,8 +847,10 @@ }, { "cell_type": "markdown", - "id": "e42471e7", - "metadata": {}, + "id": "33b8042a", + "metadata": { + "editable": true + }, "source": [ "The parameter $\\gamma_k$ is often referred to as the step length or\n", "the learning rate within the context of Machine Learning." @@ -749,8 +858,10 @@ }, { "cell_type": "markdown", - "id": "b38320ec", - "metadata": {}, + "id": "cfe687c2", + "metadata": { + "editable": true + }, "source": [ "## The ideal\n", "\n", @@ -775,8 +886,10 @@ }, { "cell_type": "markdown", - "id": "792e177b", - "metadata": {}, + "id": "8b49c45b", + "metadata": { + "editable": true + }, "source": [ "## The sensitiveness of the gradient descent\n", "\n", @@ -795,8 +908,10 @@ }, { "cell_type": "markdown", - "id": "760fca67", - "metadata": {}, + "id": "d0472c94", + "metadata": { + "editable": true + }, "source": [ "## Convex functions\n", "\n", @@ -815,8 +930,10 @@ }, { "cell_type": "markdown", - "id": "52452fa9", - "metadata": {}, + "id": "38efa238", + "metadata": { + "editable": true + }, "source": [ "## Convex function\n", "\n", @@ -825,8 +942,10 @@ }, { "cell_type": "markdown", - "id": "3dffb542", - "metadata": {}, + "id": "ba410ba0", + "metadata": { + "editable": true + }, "source": [ "## Conditions on convex functions\n", "\n", @@ -860,8 +979,10 @@ }, { "cell_type": "markdown", - "id": "24a9cadc", - "metadata": {}, + "id": "4f3b7299", + "metadata": { + "editable": true + }, "source": [ "## More on convex functions\n", "\n", @@ -886,8 +1007,10 @@ }, { "cell_type": "markdown", - "id": "b9748fe1", - "metadata": {}, + "id": "023159dc", + "metadata": { + "editable": true + }, "source": [ "## Some simple problems\n", "\n", @@ -914,8 +1037,10 @@ }, { "cell_type": "markdown", - "id": "4d93454f", - "metadata": {}, + "id": "e09d96ad", + "metadata": { + "editable": true + }, "source": [ "## Standard steepest descent\n", "\n", @@ -932,8 +1057,10 @@ }, { "cell_type": "markdown", - "id": "3b02576e", - "metadata": {}, + "id": "0c736f59", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}\\boldsymbol{x} = \\boldsymbol{b}.\n", @@ -942,16 +1069,20 @@ }, { "cell_type": "markdown", - "id": "c34de3f5", - "metadata": {}, + "id": "bbc1eae2", + "metadata": { + "editable": true + }, "source": [ "In the iterative process we end up with a problem like" ] }, { "cell_type": "markdown", - "id": "cfc60396", - "metadata": {}, + "id": "b8e12b0e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{r}= \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x},\n", @@ -960,8 +1091,10 @@ }, { "cell_type": "markdown", - "id": "b6bc2825", - "metadata": {}, + "id": "7776d4c5", + "metadata": { + "editable": true + }, "source": [ "where $\\boldsymbol{r}$ is the so-called residual or error in the iterative process.\n", "\n", @@ -970,8 +1103,10 @@ }, { "cell_type": "markdown", - "id": "71cce93d", - "metadata": {}, + "id": "cc2b2591", + "metadata": { + "editable": true + }, "source": [ "## Gradient method\n", "\n", @@ -980,8 +1115,10 @@ }, { "cell_type": "markdown", - "id": "39b1c049", - "metadata": {}, + "id": "30813f54", + "metadata": { + "editable": true + }, "source": [ "$$\n", "P(\\boldsymbol{x})=\\frac{1}{2}\\boldsymbol{x}^T\\boldsymbol{A}\\boldsymbol{x} - \\boldsymbol{x}^T\\boldsymbol{b},\n", @@ -990,8 +1127,10 @@ }, { "cell_type": "markdown", - "id": "ab1ecb22", - "metadata": {}, + "id": "b9f2a68a", + "metadata": { + "editable": true + }, "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." @@ -999,8 +1138,10 @@ }, { "cell_type": "markdown", - "id": "a3495238", - "metadata": {}, + "id": "dc4f825d", + "metadata": { + "editable": true + }, "source": [ "## Steepest descent method\n", "\n", @@ -1010,8 +1151,10 @@ }, { "cell_type": "markdown", - "id": "44d95f33", - "metadata": {}, + "id": "9b6412ee", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{x}_0=0,\n", @@ -1020,16 +1163,20 @@ }, { "cell_type": "markdown", - "id": "694edeb5", - "metadata": {}, + "id": "8034df75", + "metadata": { + "editable": true + }, "source": [ "or consider the system" ] }, { "cell_type": "markdown", - "id": "4ec42882", - "metadata": {}, + "id": "ec6b3f52", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}\\boldsymbol{z} = \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_0,\n", @@ -1038,16 +1185,20 @@ }, { "cell_type": "markdown", - "id": "5e3ada87", - "metadata": {}, + "id": "97eab53d", + "metadata": { + "editable": true + }, "source": [ "instead." ] }, { "cell_type": "markdown", - "id": "f996558a", - "metadata": {}, + "id": "294bafec", + "metadata": { + "editable": true + }, "source": [ "## Steepest descent method\n", "One can show that the solution $\\boldsymbol{x}$ is also the unique minimizer of the quadratic form" @@ -1055,8 +1206,10 @@ }, { "cell_type": "markdown", - "id": "043db570", - "metadata": {}, + "id": "b614fd3a", + "metadata": { + "editable": true + }, "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", @@ -1065,8 +1218,10 @@ }, { "cell_type": "markdown", - "id": "b2e31383", - "metadata": {}, + "id": "66e7d9f9", + "metadata": { + "editable": true + }, "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", @@ -1075,8 +1230,10 @@ }, { "cell_type": "markdown", - "id": "381b2b84", - "metadata": {}, + "id": "a4970262", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}\\boldsymbol{x}_0-\\boldsymbol{b},\n", @@ -1085,8 +1242,10 @@ }, { "cell_type": "markdown", - "id": "0025ebc9", - "metadata": {}, + "id": "d1492859", + "metadata": { + "editable": true + }, "source": [ "and \n", "$\\boldsymbol{x}_0=0$ it is equal $-\\boldsymbol{b}$." @@ -1094,8 +1253,10 @@ }, { "cell_type": "markdown", - "id": "a39f2ec2", - "metadata": {}, + "id": "298fed8e", + "metadata": { + "editable": true + }, "source": [ "## Final expressions\n", "We can compute the residual iteratively as" @@ -1103,8 +1264,10 @@ }, { "cell_type": "markdown", - "id": "6374696c", - "metadata": {}, + "id": "e5ae1578", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{r}_{k+1}=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_{k+1},\n", @@ -1113,16 +1276,20 @@ }, { "cell_type": "markdown", - "id": "acb922cb", - "metadata": {}, + "id": "0311229d", + "metadata": { + "editable": true + }, "source": [ "which equals" ] }, { "cell_type": "markdown", - "id": "05c95a7a", - "metadata": {}, + "id": "99eb2181", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{b}-\\boldsymbol{A}(\\boldsymbol{x}_k+\\alpha_k\\boldsymbol{r}_k),\n", @@ -1131,16 +1298,20 @@ }, { "cell_type": "markdown", - "id": "9a1924d0", - "metadata": {}, + "id": "08b7b7f5", + "metadata": { + "editable": true + }, "source": [ "or" ] }, { "cell_type": "markdown", - "id": "86c03b30", - "metadata": {}, + "id": "8a89c9f8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "(\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k)-\\alpha_k\\boldsymbol{A}\\boldsymbol{r}_k,\n", @@ -1149,16 +1320,20 @@ }, { "cell_type": "markdown", - "id": "150d301d", - "metadata": {}, + "id": "e491710b", + "metadata": { + "editable": true + }, "source": [ "which gives" ] }, { "cell_type": "markdown", - "id": "e7fab9f4", - "metadata": {}, + "id": "ce03e660", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\alpha_k = \\frac{\\boldsymbol{r}_k^T\\boldsymbol{r}_k}{\\boldsymbol{r}_k^T\\boldsymbol{A}\\boldsymbol{r}_k}\n", @@ -1167,16 +1342,20 @@ }, { "cell_type": "markdown", - "id": "5447c085", - "metadata": {}, + "id": "66cd9e49", + "metadata": { + "editable": true + }, "source": [ "leading to the iterative scheme" ] }, { "cell_type": "markdown", - "id": "dee1b865", - "metadata": {}, + "id": "34ad9715", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{x}_{k+1}=\\boldsymbol{x}_k-\\alpha_k\\boldsymbol{r}_{k},\n", @@ -1185,8 +1364,10 @@ }, { "cell_type": "markdown", - "id": "04f189e7", - "metadata": {}, + "id": "0d46875f", + "metadata": { + "editable": true + }, "source": [ "## Steepest descent example" ] @@ -1194,8 +1375,11 @@ { "cell_type": "code", "execution_count": 4, - "id": "fcb1d6ec", - "metadata": {}, + "id": "72331d76", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import numpy as np\n", @@ -1222,8 +1406,10 @@ }, { "cell_type": "markdown", - "id": "78e14695", - "metadata": {}, + "id": "f9baba11", + "metadata": { + "editable": true + }, "source": [ "And then as countor plot" ] @@ -1231,8 +1417,11 @@ { "cell_type": "code", "execution_count": 5, - "id": "4f10e658", - "metadata": {}, + "id": "b0aec5c4", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "pt.axis(\"equal\")\n", @@ -1242,8 +1431,10 @@ }, { "cell_type": "markdown", - "id": "10fb194e", - "metadata": {}, + "id": "aab04a85", + "metadata": { + "editable": true + }, "source": [ "Find guesses" ] @@ -1251,8 +1442,11 @@ { "cell_type": "code", "execution_count": 6, - "id": "ee47201f", - "metadata": {}, + "id": "35ab2a27", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "x = guesses[-1]\n", @@ -1261,8 +1455,10 @@ }, { "cell_type": "markdown", - "id": "844b4c66", - "metadata": {}, + "id": "38845ab4", + "metadata": { + "editable": true + }, "source": [ "Run it!" ] @@ -1270,8 +1466,11 @@ { "cell_type": "code", "execution_count": 7, - "id": "e68ec7b1", - "metadata": {}, + "id": "e40e952d", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "def f1d(alpha):\n", @@ -1285,8 +1484,10 @@ }, { "cell_type": "markdown", - "id": "8a3d5762", - "metadata": {}, + "id": "b17e7f44", + "metadata": { + "editable": true + }, "source": [ "What happened?" ] @@ -1294,8 +1495,11 @@ { "cell_type": "code", "execution_count": 8, - "id": "29bd976c", - "metadata": {}, + "id": "d65ee839", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "pt.axis(\"equal\")\n", @@ -1306,16 +1510,20 @@ }, { "cell_type": "markdown", - "id": "0aee2856", - "metadata": {}, + "id": "18c7c22e", + "metadata": { + "editable": true + }, "source": [ "Note that we did only one iteration here. We can easily add more using our previous guesses." ] }, { "cell_type": "markdown", - "id": "8c7e6157", - "metadata": {}, + "id": "7f1456dc", + "metadata": { + "editable": true + }, "source": [ "## Conjugate gradient method\n", "In the CG method we define so-called conjugate directions and two vectors \n", @@ -1326,8 +1534,10 @@ }, { "cell_type": "markdown", - "id": "cb19fc55", - "metadata": {}, + "id": "dd173dfb", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{s}^T\\boldsymbol{A}\\boldsymbol{t}= 0.\n", @@ -1336,8 +1546,10 @@ }, { "cell_type": "markdown", - "id": "fb0fa7bb", - "metadata": {}, + "id": "d701c9fb", + "metadata": { + "editable": true + }, "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" @@ -1345,8 +1557,10 @@ }, { "cell_type": "markdown", - "id": "b65328b9", - "metadata": {}, + "id": "f9a8b68b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{x}_i^T\\boldsymbol{A}\\boldsymbol{x}_j= 0.\n", @@ -1355,8 +1569,10 @@ }, { "cell_type": "markdown", - "id": "efd9856f", - "metadata": {}, + "id": "a2dce53d", + "metadata": { + "editable": true + }, "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}$." @@ -1364,8 +1580,10 @@ }, { "cell_type": "markdown", - "id": "d0feaf6a", - "metadata": {}, + "id": "19ff9038", + "metadata": { + "editable": true + }, "source": [ "## Conjugate gradient method\n", "An example is given by the eigenvectors of the matrix" @@ -1373,8 +1591,10 @@ }, { "cell_type": "markdown", - "id": "e2994fb3", - "metadata": {}, + "id": "8cbcc7e2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{v}_i^T\\boldsymbol{A}\\boldsymbol{v}_j= \\lambda\\boldsymbol{v}_i^T\\boldsymbol{v}_j,\n", @@ -1383,16 +1603,20 @@ }, { "cell_type": "markdown", - "id": "a09153f7", - "metadata": {}, + "id": "e9ea4968", + "metadata": { + "editable": true + }, "source": [ "which is zero unless $i=j$." ] }, { "cell_type": "markdown", - "id": "96825360", - "metadata": {}, + "id": "412198c3", + "metadata": { + "editable": true + }, "source": [ "## Conjugate gradient method\n", "Assume now that we have a symmetric positive-definite matrix $\\boldsymbol{A}$ of size\n", @@ -1401,8 +1625,10 @@ }, { "cell_type": "markdown", - "id": "697f4b69", - "metadata": {}, + "id": "4e53e367", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{x}_{i+1}=\\boldsymbol{x}_{i}+\\alpha_i\\boldsymbol{p}_{i}.\n", @@ -1411,8 +1637,10 @@ }, { "cell_type": "markdown", - "id": "06baeae1", - "metadata": {}, + "id": "c5c23589", + "metadata": { + "editable": true + }, "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", @@ -1421,8 +1649,10 @@ }, { "cell_type": "markdown", - "id": "10331baf", - "metadata": {}, + "id": "cb47cf57", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{x} = \\sum^{n}_{i=1} \\alpha_i \\boldsymbol{p}_i.\n", @@ -1431,8 +1661,10 @@ }, { "cell_type": "markdown", - "id": "9c07ca94", - "metadata": {}, + "id": "5bdec91c", + "metadata": { + "editable": true + }, "source": [ "## Conjugate gradient method\n", "The coefficients are given by" @@ -1440,8 +1672,10 @@ }, { "cell_type": "markdown", - "id": "def0608f", - "metadata": {}, + "id": "ce3082b7", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbf{A}\\mathbf{x} = \\sum^{n}_{i=1} \\alpha_i \\mathbf{A} \\mathbf{p}_i = \\mathbf{b}.\n", @@ -1450,16 +1684,20 @@ }, { "cell_type": "markdown", - "id": "cc38bf53", - "metadata": {}, + "id": "8b1139e9", + "metadata": { + "editable": true + }, "source": [ "Multiplying with $\\boldsymbol{p}_k^T$ from the left gives" ] }, { "cell_type": "markdown", - "id": "fb4d2066", - "metadata": {}, + "id": "58d65744", + "metadata": { + "editable": true + }, "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", @@ -1468,16 +1706,20 @@ }, { "cell_type": "markdown", - "id": "7c605c08", - "metadata": {}, + "id": "85fe84cb", + "metadata": { + "editable": true + }, "source": [ "and we can define the coefficients $\\alpha_k$ as" ] }, { "cell_type": "markdown", - "id": "27d71b17", - "metadata": {}, + "id": "8e4ea650", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\alpha_k = \\frac{\\boldsymbol{p}_k^T \\boldsymbol{b}}{\\boldsymbol{p}_k^T \\boldsymbol{A} \\boldsymbol{p}_k}\n", @@ -1486,8 +1728,10 @@ }, { "cell_type": "markdown", - "id": "33a2ec8f", - "metadata": {}, + "id": "7fc2b5db", + "metadata": { + "editable": true + }, "source": [ "## Conjugate gradient method and iterations\n", "\n", @@ -1504,8 +1748,10 @@ }, { "cell_type": "markdown", - "id": "874a4bf8", - "metadata": {}, + "id": "a653e167", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{x}_0=0,\n", @@ -1514,16 +1760,20 @@ }, { "cell_type": "markdown", - "id": "38431600", - "metadata": {}, + "id": "140a6cf3", + "metadata": { + "editable": true + }, "source": [ "or consider the system" ] }, { "cell_type": "markdown", - "id": "a0efad46", - "metadata": {}, + "id": "0e842bf0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}\\boldsymbol{z} = \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_0,\n", @@ -1532,16 +1782,20 @@ }, { "cell_type": "markdown", - "id": "4c79cfc4", - "metadata": {}, + "id": "2d539424", + "metadata": { + "editable": true + }, "source": [ "instead." ] }, { "cell_type": "markdown", - "id": "e5be0110", - "metadata": {}, + "id": "4027b150", + "metadata": { + "editable": true + }, "source": [ "## Conjugate gradient method\n", "One can show that the solution $\\boldsymbol{x}$ is also the unique minimizer of the quadratic form" @@ -1549,8 +1803,10 @@ }, { "cell_type": "markdown", - "id": "f9840d01", - "metadata": {}, + "id": "51bb612d", + "metadata": { + "editable": true + }, "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", @@ -1559,8 +1815,10 @@ }, { "cell_type": "markdown", - "id": "2cd5295a", - "metadata": {}, + "id": "3eabe463", + "metadata": { + "editable": true + }, "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", @@ -1569,8 +1827,10 @@ }, { "cell_type": "markdown", - "id": "df1c1121", - "metadata": {}, + "id": "5680938b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}\\boldsymbol{x}_0-\\boldsymbol{b},\n", @@ -1579,8 +1839,10 @@ }, { "cell_type": "markdown", - "id": "e0ee3be5", - "metadata": {}, + "id": "9342de43", + "metadata": { + "editable": true + }, "source": [ "and \n", "$\\boldsymbol{x}_0=0$ it is equal $-\\boldsymbol{b}$.\n", @@ -1590,8 +1852,10 @@ }, { "cell_type": "markdown", - "id": "4c6749b3", - "metadata": {}, + "id": "dc6b0289", + "metadata": { + "editable": true + }, "source": [ "## Conjugate gradient method\n", "Let $\\boldsymbol{r}_k$ be the residual at the $k$-th step:" @@ -1599,8 +1863,10 @@ }, { "cell_type": "markdown", - "id": "93a6c073", - "metadata": {}, + "id": "d662d6cb", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{r}_k=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k.\n", @@ -1609,8 +1875,10 @@ }, { "cell_type": "markdown", - "id": "64e5b77a", - "metadata": {}, + "id": "a1dfc17e", + "metadata": { + "editable": true + }, "source": [ "Note that $\\boldsymbol{r}_k$ is the negative gradient of $f$ at \n", "$\\boldsymbol{x}=\\boldsymbol{x}_k$, \n", @@ -1623,8 +1891,10 @@ }, { "cell_type": "markdown", - "id": "7948355f", - "metadata": {}, + "id": "e7217dd4", + "metadata": { + "editable": true + }, "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", @@ -1633,8 +1903,10 @@ }, { "cell_type": "markdown", - "id": "b203f48c", - "metadata": {}, + "id": "fc97e4f1", + "metadata": { + "editable": true + }, "source": [ "## Conjugate gradient method\n", "We can also compute the residual iteratively as" @@ -1642,8 +1914,10 @@ }, { "cell_type": "markdown", - "id": "7e4420a7", - "metadata": {}, + "id": "d68b2934", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{r}_{k+1}=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_{k+1},\n", @@ -1652,16 +1926,20 @@ }, { "cell_type": "markdown", - "id": "8e6faf5a", - "metadata": {}, + "id": "7be1c818", + "metadata": { + "editable": true + }, "source": [ "which equals" ] }, { "cell_type": "markdown", - "id": "36a01503", - "metadata": {}, + "id": "71ce7281", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{b}-\\boldsymbol{A}(\\boldsymbol{x}_k+\\alpha_k\\boldsymbol{p}_k),\n", @@ -1670,16 +1948,20 @@ }, { "cell_type": "markdown", - "id": "7134e172", - "metadata": {}, + "id": "cbf9ce5a", + "metadata": { + "editable": true + }, "source": [ "or" ] }, { "cell_type": "markdown", - "id": "b4a913e5", - "metadata": {}, + "id": "d7960c30", + "metadata": { + "editable": true + }, "source": [ "$$\n", "(\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k)-\\alpha_k\\boldsymbol{A}\\boldsymbol{p}_k,\n", @@ -1688,16 +1970,20 @@ }, { "cell_type": "markdown", - "id": "5a3c105a", - "metadata": {}, + "id": "cffbbb79", + "metadata": { + "editable": true + }, "source": [ "which gives" ] }, { "cell_type": "markdown", - "id": "341d2ab4", - "metadata": {}, + "id": "718a0a6f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{r}_{k+1}=\\boldsymbol{r}_k-\\boldsymbol{A}\\boldsymbol{p}_{k},\n", @@ -1706,8 +1992,10 @@ }, { "cell_type": "markdown", - "id": "617425bb", - "metadata": {}, + "id": "4db7f5dc", + "metadata": { + "editable": true + }, "source": [ "## Revisiting our first homework\n", "\n", @@ -1728,8 +2016,11 @@ { "cell_type": "code", "execution_count": 9, - "id": "76c38d50", - "metadata": {}, + "id": "27af777d", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "x = 2*np.random.rand(m,1)\n", @@ -1738,8 +2029,10 @@ }, { "cell_type": "markdown", - "id": "a4f55bbd", - "metadata": {}, + "id": "b5400386", + "metadata": { + "editable": true + }, "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" @@ -1747,8 +2040,10 @@ }, { "cell_type": "markdown", - "id": "c9072fa0", - "metadata": {}, + "id": "24ed3756", + "metadata": { + "editable": true + }, "source": [ "$$\n", "h_\\beta(x) = \\boldsymbol{y} = \\beta_0 + \\beta_1 x,\n", @@ -1757,16 +2052,20 @@ }, { "cell_type": "markdown", - "id": "6e55a2c7", - "metadata": {}, + "id": "00d1f306", + "metadata": { + "editable": true + }, "source": [ "such that" ] }, { "cell_type": "markdown", - "id": "41bacc77", - "metadata": {}, + "id": "f30c3b64", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{y}_i = \\beta_0 + \\beta_1 x_i.\n", @@ -1775,8 +2074,10 @@ }, { "cell_type": "markdown", - "id": "dc8223ad", - "metadata": {}, + "id": "165a54d8", + "metadata": { + "editable": true + }, "source": [ "## Gradient descent example\n", "\n", @@ -1787,8 +2088,10 @@ }, { "cell_type": "markdown", - "id": "a8b03557", - "metadata": {}, + "id": "a9891168", + "metadata": { + "editable": true + }, "source": [ "$$\n", "X \\equiv \\begin{bmatrix}\n", @@ -1801,16 +2104,20 @@ }, { "cell_type": "markdown", - "id": "63fbae73", - "metadata": {}, + "id": "7d7d1698", + "metadata": { + "editable": true + }, "source": [ "The cost/loss/risk function is given by (" ] }, { "cell_type": "markdown", - "id": "4ad922b7", - "metadata": {}, + "id": "8f31115e", + "metadata": { + "editable": true + }, "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", @@ -1819,16 +2126,20 @@ }, { "cell_type": "markdown", - "id": "190ae31f", - "metadata": {}, + "id": "c0eb6ac5", + "metadata": { + "editable": true + }, "source": [ "and we want to find $\\beta$ such that $C(\\beta)$ is minimized." ] }, { "cell_type": "markdown", - "id": "ffff543c", - "metadata": {}, + "id": "adff23ee", + "metadata": { + "editable": true + }, "source": [ "## The derivative of the cost/loss function\n", "\n", @@ -1837,8 +2148,10 @@ }, { "cell_type": "markdown", - "id": "92aa8f9d", - "metadata": {}, + "id": "071987fc", + "metadata": { + "editable": true + }, "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", @@ -1849,16 +2162,20 @@ }, { "cell_type": "markdown", - "id": "7654f8fa", - "metadata": {}, + "id": "384bc1a2", + "metadata": { + "editable": true + }, "source": [ "where $X$ is the design matrix defined above." ] }, { "cell_type": "markdown", - "id": "703447b3", - "metadata": {}, + "id": "f2d21cdc", + "metadata": { + "editable": true + }, "source": [ "## The Hessian matrix\n", "The Hessian matrix of $C(\\beta)$ is given by" @@ -1866,8 +2183,10 @@ }, { "cell_type": "markdown", - "id": "856d4fd1", - "metadata": {}, + "id": "1e8bca50", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{H} \\equiv \\begin{bmatrix}\n", @@ -1879,16 +2198,20 @@ }, { "cell_type": "markdown", - "id": "a05f6979", - "metadata": {}, + "id": "f9fca584", + "metadata": { + "editable": true + }, "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": "a6df9f0f", - "metadata": {}, + "id": "0860c223", + "metadata": { + "editable": true + }, "source": [ "## Simple program\n", "\n", @@ -1897,8 +2220,10 @@ }, { "cell_type": "markdown", - "id": "a643f0c7", - "metadata": {}, + "id": "130d7405", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\beta_{k+1} = \\beta_k - \\gamma \\nabla_\\beta C(\\beta_k), \\ k=0,1,\\cdots\n", @@ -1907,8 +2232,10 @@ }, { "cell_type": "markdown", - "id": "86c2a1fb", - "metadata": {}, + "id": "122ab1a1", + "metadata": { + "editable": true + }, "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", @@ -1920,8 +2247,10 @@ }, { "cell_type": "markdown", - "id": "f6eb295f", - "metadata": {}, + "id": "cd9cc831", + "metadata": { + "editable": true + }, "source": [ "## Gradient Descent Example\n", "\n", @@ -1931,8 +2260,11 @@ { "cell_type": "code", "execution_count": 10, - "id": "14bf489d", - "metadata": {}, + "id": "d927a289", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "\n", @@ -1985,8 +2317,10 @@ }, { "cell_type": "markdown", - "id": "fa4674f0", - "metadata": {}, + "id": "6c19826d", + "metadata": { + "editable": true + }, "source": [ "## And a corresponding example using **scikit-learn**" ] @@ -1994,8 +2328,11 @@ { "cell_type": "code", "execution_count": 11, - "id": "1eef9dcb", - "metadata": {}, + "id": "f6b889bd", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "# Importing various packages\n", @@ -2018,8 +2355,10 @@ }, { "cell_type": "markdown", - "id": "92ad46a0", - "metadata": {}, + "id": "21739cb2", + "metadata": { + "editable": true + }, "source": [ "## Gradient descent and Ridge\n", "\n", @@ -2028,8 +2367,10 @@ }, { "cell_type": "markdown", - "id": "0bb24dc6", - "metadata": {}, + "id": "c05f8428", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C_{\\text{ridge}}(\\beta) = \\frac{1}{n}||X\\beta -\\mathbf{y}||^2 + \\lambda ||\\beta||^2, \\ \\lambda \\geq 0.\n", @@ -2038,16 +2379,20 @@ }, { "cell_type": "markdown", - "id": "10a9fcb2", - "metadata": {}, + "id": "6c8ced5e", + "metadata": { + "editable": true + }, "source": [ "In order to minimize $C_{\\text{ridge}}(\\beta)$ using GD we adjust the gradient as follows" ] }, { "cell_type": "markdown", - "id": "495dbade", - "metadata": {}, + "id": "14452016", + "metadata": { + "editable": true + }, "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", @@ -2058,16 +2403,20 @@ }, { "cell_type": "markdown", - "id": "4b263196", - "metadata": {}, + "id": "542f52f5", + "metadata": { + "editable": true + }, "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": "2a0b4fb5", - "metadata": {}, + "id": "f5c485ed", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\beta_{\\text{ridge}} = \\left(X^T X + n\\lambda I_{2 \\times 2} \\right)^{-1} X^T \\mathbf{y}.\n", @@ -2076,8 +2425,10 @@ }, { "cell_type": "markdown", - "id": "a2b60831", - "metadata": {}, + "id": "1e4bbe6a", + "metadata": { + "editable": true + }, "source": [ "## The Hessian matrix for Ridge Regression\n", "The Hessian matrix of Ridge Regression for our simple example is given by" @@ -2085,8 +2436,10 @@ }, { "cell_type": "markdown", - "id": "a82f529c", - "metadata": {}, + "id": "8395f779", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{H} \\equiv \\begin{bmatrix}\n", @@ -2098,54 +2451,37 @@ }, { "cell_type": "markdown", - "id": "8fe1c41e", - "metadata": {}, + "id": "57327b35", + "metadata": { + "editable": true + }, "source": [ "This implies that the Hessian matrix is positive definite, hence the stationary point is a\n", "minimum.\n", - "Note that the Ridge loss function is convex, as a sum of two convex\n", + "Note that the Ridge cost function is convex being a sum of two convex\n", "functions. Therefore, the stationary point is a global\n", "minimum of this function." ] }, { "cell_type": "markdown", - "id": "a03ad61b", - "metadata": {}, + "id": "86d6e4b0", + "metadata": { + "editable": true + }, "source": [ "## Program example for gradient descent with Ridge Regression" ] }, { "cell_type": "code", - "execution_count": 13, - "id": "f0a079df", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Eigenvalues of Hessian Matrix:[0.29294218 4.47046976]\n", - "[[4.03410523]\n", - " [3.03026348]]\n", - "[[4.03408456]\n", - " [3.03028067]]\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "