diff --git a/doc/pub/week38/ipynb/week38.ipynb b/doc/pub/week38/ipynb/week38.ipynb index 8e33a53e5..7d0cbbbf0 100644 --- a/doc/pub/week38/ipynb/week38.ipynb +++ b/doc/pub/week38/ipynb/week38.ipynb @@ -3,9 +3,7 @@ { "cell_type": "markdown", "id": "e1437fb7", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "\n", @@ -15,9 +13,7 @@ { "cell_type": "markdown", "id": "7edae964", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "# Data Analysis and Machine Learning: Logistic Regression\n", "**Morten Hjorth-Jensen**, Department of Physics and Center for Computing in Science Education, University of Oslo and Department of Physics and Astronomy and Facility for Rare Isotope Beams, Michigan State University\n", @@ -28,9 +24,7 @@ { "cell_type": "markdown", "id": "b080984b", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Plans for week 38\n", "\n", @@ -54,9 +48,7 @@ { "cell_type": "markdown", "id": "8766162e", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Ridge and LASSO Regression, reminder\n", "\n", @@ -67,9 +59,7 @@ { "cell_type": "markdown", "id": "a0f26a88", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in {\\mathbb{R}}^{p}}}\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)\\right\\}.\n", @@ -79,9 +69,7 @@ { "cell_type": "markdown", "id": "2ab8174d", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "or we can state it as" ] @@ -89,9 +77,7 @@ { "cell_type": "markdown", "id": "7310c495", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in\n", @@ -102,9 +88,7 @@ { "cell_type": "markdown", "id": "cf23c167", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "where we have used the definition of a norm-2 vector, that is" ] @@ -112,9 +96,7 @@ { "cell_type": "markdown", "id": "99d4c9b7", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\vert\\vert \\boldsymbol{x}\\vert\\vert_2 = \\sqrt{\\sum_i x_i^2}.\n", @@ -124,9 +106,7 @@ { "cell_type": "markdown", "id": "bd386f6d", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "By minimizing the above equation with respect to the parameters\n", "$\\boldsymbol{\\beta}$ we could then obtain an analytical expression for the\n", @@ -137,9 +117,7 @@ { "cell_type": "markdown", "id": "182d5d41", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in\n", @@ -150,9 +128,7 @@ { "cell_type": "markdown", "id": "0d3682e5", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "which leads to the Ridge regression minimization problem where we\n", "require that $\\vert\\vert \\boldsymbol{\\beta}\\vert\\vert_2^2\\le t$, where $t$ is\n", @@ -162,9 +138,7 @@ { "cell_type": "markdown", "id": "25248610", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "C(\\boldsymbol{X},\\boldsymbol{\\beta})=\\frac{1}{n}\\vert\\vert \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\vert\\vert_2^2+\\lambda\\vert\\vert \\boldsymbol{\\beta}\\vert\\vert_1,\n", @@ -174,9 +148,7 @@ { "cell_type": "markdown", "id": "da238137", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "we have a new optimization equation" ] @@ -184,9 +156,7 @@ { "cell_type": "markdown", "id": "f9bb791c", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in\n", @@ -197,9 +167,7 @@ { "cell_type": "markdown", "id": "01cb254e", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "which leads to Lasso regression. Lasso stands for least absolute shrinkage and selection operator. \n", "\n", @@ -209,9 +177,7 @@ { "cell_type": "markdown", "id": "b6ab9d2d", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\vert\\vert \\boldsymbol{x}\\vert\\vert_1 = \\sum_i \\vert x_i\\vert.\n", @@ -221,9 +187,7 @@ { "cell_type": "markdown", "id": "a5fd2fb1", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Various steps in cross-validation\n", "\n", @@ -246,9 +210,7 @@ { "cell_type": "markdown", "id": "567db724", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## How to set up the cross-validation for Ridge and/or Lasso\n", "\n", @@ -262,9 +224,7 @@ { "cell_type": "markdown", "id": "db50c5d3", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\begin{align*}\n", @@ -278,9 +238,7 @@ { "cell_type": "markdown", "id": "77644e97", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "* Evaluate the prediction performance of these models on the test set by $C[y_i, \\boldsymbol{X}_{i, \\ast}; \\boldsymbol{\\beta}_{-i}(\\lambda), \\boldsymbol{\\sigma}_{-i}^2(\\lambda)]$. Or, by the prediction error $|y_i - \\boldsymbol{X}_{i, \\ast} \\boldsymbol{\\beta}_{-i}(\\lambda)|$, the relative error, the error squared or the R2 score function.\n", "\n", @@ -292,9 +250,7 @@ { "cell_type": "markdown", "id": "222c145f", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Cross-validation in brief\n", "\n", @@ -320,9 +276,7 @@ { "cell_type": "markdown", "id": "1906df63", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Code Example for Cross-validation and $k$-fold Cross-validation\n", "\n", @@ -333,10 +287,7 @@ "cell_type": "code", "execution_count": 1, "id": "c152fd7e", - "metadata": { - "collapsed": false, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", @@ -435,9 +386,7 @@ { "cell_type": "markdown", "id": "5d7ccc04", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Logistic Regression\n", "\n", @@ -457,9 +406,7 @@ { "cell_type": "markdown", "id": "b84fbc4f", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Classification problems\n", "\n", @@ -483,9 +430,7 @@ { "cell_type": "markdown", "id": "495a8bd0", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Optimization and Deep learning\n", "\n", @@ -507,9 +452,7 @@ { "cell_type": "markdown", "id": "48b58d37", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Basics\n", "\n", @@ -532,9 +475,7 @@ { "cell_type": "markdown", "id": "cf4ea236", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "y_i = \\begin{bmatrix} 0 & \\mathrm{no}\\\\ 1 & \\mathrm{yes} \\end{bmatrix}.\n", @@ -544,9 +485,7 @@ { "cell_type": "markdown", "id": "eeb9a563", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Linear classifier\n", "\n", @@ -562,9 +501,7 @@ { "cell_type": "markdown", "id": "5d676ec0", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "\n", "
\n", @@ -580,9 +517,7 @@ { "cell_type": "markdown", "id": "4f1c8890", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "where $\\boldsymbol{y}$ is a vector representing the possible outcomes, $\\boldsymbol{X}$ is our\n", "$n\\times p$ design matrix and $\\boldsymbol{\\beta}$ represents our estimators/predictors." @@ -591,9 +526,7 @@ { "cell_type": "markdown", "id": "95d3b55e", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Some selected properties\n", "\n", @@ -618,9 +551,7 @@ { "cell_type": "markdown", "id": "a58cb406", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Simple example\n", "\n", @@ -631,10 +562,7 @@ "cell_type": "code", "execution_count": 2, "id": "cccbdeef", - "metadata": { - "collapsed": false, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "# Common imports\n", @@ -696,9 +624,7 @@ { "cell_type": "markdown", "id": "eda7b9f2", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Plotting the mean value for each group\n", "\n", @@ -709,10 +635,7 @@ "cell_type": "code", "execution_count": 3, "id": "c657b457", - "metadata": { - "collapsed": false, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "agegroupmean = np.array([0.1, 0.133, 0.250, 0.333, 0.462, 0.625, 0.765, 0.800])\n", @@ -728,9 +651,7 @@ { "cell_type": "markdown", "id": "c027575d", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "We are now trying to find a function $f(y\\vert x)$, that is a function which gives us an expected value for the output $y$ with a given input $x$.\n", "In standard linear regression with a linear dependence on $x$, we would write this in terms of our model" @@ -739,9 +660,7 @@ { "cell_type": "markdown", "id": "02de7a3d", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "f(y_i\\vert x_i)=\\beta_0+\\beta_1 x_i.\n", @@ -751,9 +670,7 @@ { "cell_type": "markdown", "id": "64969b5a", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "This expression implies however that $f(y_i\\vert x_i)$ could take any\n", "value from minus infinity to plus infinity. If we however let\n", @@ -770,9 +687,7 @@ { "cell_type": "markdown", "id": "c8870523", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## The logistic function\n", "\n", @@ -792,9 +707,7 @@ { "cell_type": "markdown", "id": "17cebf36", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "p(t) = \\frac{1}{1+\\mathrm \\exp{-t}}=\\frac{\\exp{t}}{1+\\mathrm \\exp{t}}.\n", @@ -804,9 +717,7 @@ { "cell_type": "markdown", "id": "ef1c3060", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "Note that $1-p(t)= p(-t)$." ] @@ -814,9 +725,7 @@ { "cell_type": "markdown", "id": "65471b2a", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Examples of likelihood functions used in logistic regression and nueral networks\n", "\n", @@ -827,10 +736,7 @@ "cell_type": "code", "execution_count": 4, "id": "e9a4591d", - "metadata": { - "collapsed": false, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "\"\"\"The sigmoid function (or the logistic curve) is a\n", @@ -892,9 +798,7 @@ { "cell_type": "markdown", "id": "b988efeb", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Two parameters\n", "\n", @@ -904,9 +808,7 @@ { "cell_type": "markdown", "id": "cfb6a943", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\begin{align*}\n", @@ -919,9 +821,7 @@ { "cell_type": "markdown", "id": "2361aee9", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "where $\\boldsymbol{\\beta}$ are the weights we wish to extract from data, in our case $\\beta_0$ and $\\beta_1$. \n", "\n", @@ -931,9 +831,7 @@ { "cell_type": "markdown", "id": "847fd47b", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "p(y_i=0\\vert x_i, \\boldsymbol{\\beta}) = 1-p(y_i=1\\vert x_i, \\boldsymbol{\\beta}).\n", @@ -943,9 +841,7 @@ { "cell_type": "markdown", "id": "be4b11d1", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Maximum likelihood\n", "\n", @@ -960,9 +856,7 @@ { "cell_type": "markdown", "id": "0c649e6a", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\begin{align*}\n", @@ -974,9 +868,7 @@ { "cell_type": "markdown", "id": "a2382368", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "from which we obtain the log-likelihood and our **cost/loss** function" ] @@ -984,9 +876,7 @@ { "cell_type": "markdown", "id": "8e56dda5", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\mathcal{C}(\\boldsymbol{\\beta}) = \\sum_{i=1}^n \\left( y_i\\log{p(y_i=1|x_i,\\boldsymbol{\\beta})} + (1-y_i)\\log\\left[1-p(y_i=1|x_i,\\boldsymbol{\\beta}))\\right]\\right).\n", @@ -996,9 +886,7 @@ { "cell_type": "markdown", "id": "c77515e4", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## The cost function rewritten\n", "\n", @@ -1008,9 +896,7 @@ { "cell_type": "markdown", "id": "d0d27dc3", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\mathcal{C}(\\boldsymbol{\\beta}) = \\sum_{i=1}^n \\left(y_i(\\beta_0+\\beta_1x_i) -\\log{(1+\\exp{(\\beta_0+\\beta_1x_i)})}\\right).\n", @@ -1020,9 +906,7 @@ { "cell_type": "markdown", "id": "4955b6b1", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "The maximum likelihood estimator is defined as the set of parameters that maximize the log-likelihood where we maximize with respect to $\\beta$.\n", "Since the cost (error) function is just the negative log-likelihood, for logistic regression we have that" @@ -1031,9 +915,7 @@ { "cell_type": "markdown", "id": "c3e91e52", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\mathcal{C}(\\boldsymbol{\\beta})=-\\sum_{i=1}^n \\left(y_i(\\beta_0+\\beta_1x_i) -\\log{(1+\\exp{(\\beta_0+\\beta_1x_i)})}\\right).\n", @@ -1043,9 +925,7 @@ { "cell_type": "markdown", "id": "3b3d97b6", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "This equation is known in statistics as the **cross entropy**. Finally, we note that just as in linear regression, \n", "in practice we often supplement the cross-entropy with additional regularization terms, usually $L_1$ and $L_2$ regularization as we did for Ridge and Lasso regression." @@ -1054,9 +934,7 @@ { "cell_type": "markdown", "id": "47890d23", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Minimizing the cross entropy\n", "\n", @@ -1070,9 +948,7 @@ { "cell_type": "markdown", "id": "71d34eed", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\frac{\\partial \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\beta_0} = -\\sum_{i=1}^n \\left(y_i -\\frac{\\exp{(\\beta_0+\\beta_1x_i)}}{1+\\exp{(\\beta_0+\\beta_1x_i)}}\\right),\n", @@ -1082,9 +958,7 @@ { "cell_type": "markdown", "id": "243773d3", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "and" ] @@ -1092,9 +966,7 @@ { "cell_type": "markdown", "id": "81fd7337", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\frac{\\partial \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\beta_1} = -\\sum_{i=1}^n \\left(y_ix_i -x_i\\frac{\\exp{(\\beta_0+\\beta_1x_i)}}{1+\\exp{(\\beta_0+\\beta_1x_i)}}\\right).\n", @@ -1104,9 +976,7 @@ { "cell_type": "markdown", "id": "38fbde35", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## A more compact expression\n", "\n", @@ -1119,9 +989,7 @@ { "cell_type": "markdown", "id": "bd7644e6", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\frac{\\partial \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = -\\boldsymbol{X}^T\\left(\\boldsymbol{y}-\\boldsymbol{p}\\right).\n", @@ -1131,9 +999,7 @@ { "cell_type": "markdown", "id": "0fcc74e2", - "metadata": { - "editable": true - }, + "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" @@ -1142,9 +1008,7 @@ { "cell_type": "markdown", "id": "7b5aa78f", - "metadata": { - "editable": true - }, + "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", @@ -1154,9 +1018,7 @@ { "cell_type": "markdown", "id": "45ee534e", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Extending to more predictors\n", "\n", @@ -1166,9 +1028,7 @@ { "cell_type": "markdown", "id": "f62d8583", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\log{ \\frac{p(\\boldsymbol{\\beta}\\boldsymbol{x})}{1-p(\\boldsymbol{\\beta}\\boldsymbol{x})}} = \\beta_0+\\beta_1x_1+\\beta_2x_2+\\dots+\\beta_px_p.\n", @@ -1178,9 +1038,7 @@ { "cell_type": "markdown", "id": "837cc6c1", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "Here we defined $\\boldsymbol{x}=[1,x_1,x_2,\\dots,x_p]$ and $\\boldsymbol{\\beta}=[\\beta_0, \\beta_1, \\dots, \\beta_p]$ leading to" ] @@ -1188,9 +1046,7 @@ { "cell_type": "markdown", "id": "75b9139f", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "p(\\boldsymbol{\\beta}\\boldsymbol{x})=\\frac{ \\exp{(\\beta_0+\\beta_1x_1+\\beta_2x_2+\\dots+\\beta_px_p)}}{1+\\exp{(\\beta_0+\\beta_1x_1+\\beta_2x_2+\\dots+\\beta_px_p)}}.\n", @@ -1200,9 +1056,7 @@ { "cell_type": "markdown", "id": "372ee8ea", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Including more classes\n", "\n", @@ -1214,9 +1068,7 @@ { "cell_type": "markdown", "id": "b171dd51", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\log{\\frac{p(C=1\\vert x)}{p(K\\vert x)}} = \\beta_{10}+\\beta_{11}x_1,\n", @@ -1226,9 +1078,7 @@ { "cell_type": "markdown", "id": "7816121e", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "and" ] @@ -1236,9 +1086,7 @@ { "cell_type": "markdown", "id": "b58d0bc3", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\log{\\frac{p(C=2\\vert x)}{p(K\\vert x)}} = \\beta_{20}+\\beta_{21}x_1,\n", @@ -1248,9 +1096,7 @@ { "cell_type": "markdown", "id": "0d75989b", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "and so on till the class $C=K-1$ class" ] @@ -1258,9 +1104,7 @@ { "cell_type": "markdown", "id": "af883d63", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\log{\\frac{p(C=K-1\\vert x)}{p(K\\vert x)}} = \\beta_{(K-1)0}+\\beta_{(K-1)1}x_1,\n", @@ -1270,9 +1114,7 @@ { "cell_type": "markdown", "id": "6727eebf", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "and the model is specified in term of $K-1$ so-called log-odds or\n", "**logit** transformations." @@ -1281,9 +1123,7 @@ { "cell_type": "markdown", "id": "c8713334", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## More classes\n", "\n", @@ -1304,9 +1144,7 @@ { "cell_type": "markdown", "id": "7819ea46", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "p(C=k\\vert \\mathbf {x} )=\\frac{\\exp{(\\beta_{k0}+\\beta_{k1}x_1)}}{1+\\sum_{l=1}^{K-1}\\exp{(\\beta_{l0}+\\beta_{l1}x_1)}}.\n", @@ -1316,9 +1154,7 @@ { "cell_type": "markdown", "id": "278c2527", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "It is easy to extend to more predictors. The final class is" ] @@ -1326,9 +1162,7 @@ { "cell_type": "markdown", "id": "376c873f", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "p(C=K\\vert \\mathbf {x} )=\\frac{1}{1+\\sum_{l=1}^{K-1}\\exp{(\\beta_{l0}+\\beta_{l1}x_1)}},\n", @@ -1338,9 +1172,7 @@ { "cell_type": "markdown", "id": "389cdb39", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "and they sum to one. Our earlier discussions were all specialized to\n", "the case with two classes only. It is easy to see from the above that\n", @@ -1355,9 +1187,7 @@ { "cell_type": "markdown", "id": "5a3810ce", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Friday September 23" ] @@ -1365,9 +1195,7 @@ { "cell_type": "markdown", "id": "f1e08704", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Searching for Optimal Regularization Parameters $\\lambda$\n", "\n", @@ -1384,10 +1212,7 @@ "cell_type": "code", "execution_count": 5, "id": "d2e8e94e", - "metadata": { - "collapsed": false, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", @@ -1439,9 +1264,7 @@ { "cell_type": "markdown", "id": "d9054061", - "metadata": { - "editable": true - }, + "metadata": {}, "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", @@ -1451,9 +1274,7 @@ { "cell_type": "markdown", "id": "e8d8872f", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Grid Search\n", "\n", @@ -1466,10 +1287,7 @@ "cell_type": "code", "execution_count": 6, "id": "212e1c6b", - "metadata": { - "collapsed": false, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", @@ -1519,9 +1337,7 @@ { "cell_type": "markdown", "id": "91b3b83c", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "By default the grid search function includes cross validation with\n", "five folds. The [Scikit-Learn\n", @@ -1534,9 +1350,7 @@ { "cell_type": "markdown", "id": "7e0ab91a", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Randomized Grid Search\n", "\n", @@ -1554,10 +1368,7 @@ "cell_type": "code", "execution_count": 7, "id": "92c30256", - "metadata": { - "collapsed": false, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", @@ -1608,9 +1419,7 @@ { "cell_type": "markdown", "id": "fb8e4f5a", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Wisconsin Cancer Data\n", "\n", @@ -1623,10 +1432,7 @@ "cell_type": "code", "execution_count": 8, "id": "d040e14f", - "metadata": { - "collapsed": false, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", @@ -1650,9 +1456,7 @@ { "cell_type": "markdown", "id": "47009c95", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Using the correlation matrix\n", "\n", @@ -1664,10 +1468,7 @@ "cell_type": "code", "execution_count": 9, "id": "40128247", - "metadata": { - "collapsed": false, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", @@ -1709,9 +1510,7 @@ { "cell_type": "markdown", "id": "dc60a6ef", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Discussing the correlation data\n", "\n", @@ -1734,10 +1533,7 @@ "cell_type": "code", "execution_count": 10, "id": "47ec15b8", - "metadata": { - "collapsed": false, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "cancerpd = pd.DataFrame(cancer.data, columns=cancer.feature_names)" @@ -1746,9 +1542,7 @@ { "cell_type": "markdown", "id": "eb8b4198", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "and then" ] @@ -1757,10 +1551,7 @@ "cell_type": "code", "execution_count": 11, "id": "58486f42", - "metadata": { - "collapsed": false, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "correlation_matrix = cancerpd.corr().round(1)" @@ -1769,9 +1560,7 @@ { "cell_type": "markdown", "id": "07834b9b", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "Diagonalizing this matrix we can in turn say something about which\n", "features are of relevance and which are not. This leads us to\n", @@ -1782,9 +1571,7 @@ { "cell_type": "markdown", "id": "9908e2e3", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Other measures in classification studies: Cancer Data again" ] @@ -1793,10 +1580,7 @@ "cell_type": "code", "execution_count": 12, "id": "645bfbca", - "metadata": { - "collapsed": false, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", @@ -1836,9 +1620,7 @@ { "cell_type": "markdown", "id": "f528c325", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Optimization, the central part of any Machine Learning algortithm\n", "\n", @@ -1857,9 +1639,7 @@ { "cell_type": "markdown", "id": "ff30edd5", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Revisiting our Logistic Regression case\n", "\n", @@ -1874,9 +1654,7 @@ { "cell_type": "markdown", "id": "847724bd", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\begin{align*}\n", @@ -1889,9 +1667,7 @@ { "cell_type": "markdown", "id": "f1969cb5", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "where $\\boldsymbol{\\beta}$ are the weights we wish to extract from data, in our case $\\beta_0$ and $\\beta_1$." ] @@ -1899,9 +1675,7 @@ { "cell_type": "markdown", "id": "e163f74c", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## The equations to solve\n", "\n", @@ -1915,9 +1689,7 @@ { "cell_type": "markdown", "id": "9b49b101", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\frac{\\partial \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = -\\boldsymbol{X}^T\\left(\\boldsymbol{y}-\\boldsymbol{p}\\right).\n", @@ -1927,9 +1699,7 @@ { "cell_type": "markdown", "id": "f19697ae", - "metadata": { - "editable": true - }, + "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" @@ -1938,9 +1708,7 @@ { "cell_type": "markdown", "id": "3f641f13", - "metadata": { - "editable": true - }, + "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", @@ -1950,9 +1718,7 @@ { "cell_type": "markdown", "id": "d82f5c8e", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "This defines what is called the Hessian matrix." ] @@ -1960,9 +1726,7 @@ { "cell_type": "markdown", "id": "f8d50532", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Solving using Newton-Raphson's method\n", "\n", @@ -1974,9 +1738,7 @@ { "cell_type": "markdown", "id": "81e002c2", - "metadata": { - "editable": true - }, + "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", @@ -1986,9 +1748,7 @@ { "cell_type": "markdown", "id": "9ec52629", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "or in matrix form as" ] @@ -1996,9 +1756,7 @@ { "cell_type": "markdown", "id": "d0b02495", - "metadata": { - "editable": true - }, + "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", @@ -2008,9 +1766,7 @@ { "cell_type": "markdown", "id": "b1475d07", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "The right-hand side is computed with the old values of $\\beta$. \n", "\n", @@ -2020,9 +1776,7 @@ { "cell_type": "markdown", "id": "7297eb74", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Brief reminder on Newton-Raphson's method\n", "\n", @@ -2040,9 +1794,7 @@ { "cell_type": "markdown", "id": "5ca9494b", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## The equations\n", "\n", @@ -2056,9 +1808,7 @@ { "cell_type": "markdown", "id": "ec42264c", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "\n", "\n", @@ -2072,9 +1822,7 @@ { "cell_type": "markdown", "id": "0d0c3ae9", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "For small enough values of the function and for well-behaved\n", "functions, the terms beyond linear are unimportant, hence we obtain" @@ -2083,9 +1831,7 @@ { "cell_type": "markdown", "id": "df03a2fd", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "f(x)+(s-x)f'(x)\\approx 0,\n", @@ -2095,9 +1841,7 @@ { "cell_type": "markdown", "id": "f6b5cd5a", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "yielding" ] @@ -2105,9 +1849,7 @@ { "cell_type": "markdown", "id": "251ef281", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "s\\approx x-\\frac{f(x)}{f'(x)}.\n", @@ -2117,9 +1859,7 @@ { "cell_type": "markdown", "id": "84013f15", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "Having in mind an iterative procedure, it is natural to start iterating with" ] @@ -2127,9 +1867,7 @@ { "cell_type": "markdown", "id": "0498425e", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "x_{n+1}=x_n-\\frac{f(x_n)}{f'(x_n)}.\n", @@ -2139,9 +1877,7 @@ { "cell_type": "markdown", "id": "096433ab", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Simple geometric interpretation\n", "\n", @@ -2161,9 +1897,7 @@ { "cell_type": "markdown", "id": "b0851d8d", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Extending to more than one variable\n", "\n", @@ -2174,9 +1908,7 @@ { "cell_type": "markdown", "id": "010769ef", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\begin{array}{cc} f_1(x_1,x_2) &=0\\\\\n", @@ -2187,9 +1919,7 @@ { "cell_type": "markdown", "id": "d853f614", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "which we Taylor expand to obtain" ] @@ -2197,9 +1927,7 @@ { "cell_type": "markdown", "id": "4bac06cd", - "metadata": { - "editable": true - }, + "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", @@ -2215,9 +1943,7 @@ { "cell_type": "markdown", "id": "85987829", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "Defining the Jacobian matrix ${\\bf \\boldsymbol{J}}$ we have" ] @@ -2225,9 +1951,7 @@ { "cell_type": "markdown", "id": "e0708642", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "{\\bf \\boldsymbol{J}}=\\left( \\begin{array}{cc}\n", @@ -2240,9 +1964,7 @@ { "cell_type": "markdown", "id": "8c47428d", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "we can rephrase Newton's method as" ] @@ -2250,9 +1972,7 @@ { "cell_type": "markdown", "id": "5b1a1b9b", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\left(\\begin{array}{c} x_1^{n+1} \\\\ x_2^{n+1} \\end{array} \\right)=\n", @@ -2264,9 +1984,7 @@ { "cell_type": "markdown", "id": "688f39ed", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "where we have defined" ] @@ -2274,9 +1992,7 @@ { "cell_type": "markdown", "id": "0540c80a", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\left(\\begin{array}{c} h_1^{n} \\\\ h_2^{n} \\end{array} \\right)=\n", @@ -2288,9 +2004,7 @@ { "cell_type": "markdown", "id": "8749a5d9", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "We need thus to compute the inverse of the Jacobian matrix and it\n", "is to understand that difficulties may\n", @@ -2303,9 +2017,7 @@ { "cell_type": "markdown", "id": "10468ee8", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Steepest descent\n", "\n", @@ -2320,9 +2032,7 @@ { "cell_type": "markdown", "id": "fd5204db", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k),\n", @@ -2332,9 +2042,7 @@ { "cell_type": "markdown", "id": "3643016f", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "with $\\gamma_k > 0$.\n", "\n", @@ -2346,9 +2054,7 @@ { "cell_type": "markdown", "id": "3f3e0600", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## More on Steepest descent\n", "\n", @@ -2361,9 +2067,7 @@ { "cell_type": "markdown", "id": "51927cc7", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k), \\ \\ k \\geq 0.\n", @@ -2373,9 +2077,7 @@ { "cell_type": "markdown", "id": "62148b2a", - "metadata": { - "editable": true - }, + "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." @@ -2384,9 +2086,7 @@ { "cell_type": "markdown", "id": "0aaedf94", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## The ideal\n", "\n", @@ -2412,9 +2112,7 @@ { "cell_type": "markdown", "id": "13569ae6", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## The sensitiveness of the gradient descent\n", "\n", @@ -2434,9 +2132,7 @@ { "cell_type": "markdown", "id": "bfdc53c0", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Convex functions\n", "\n", @@ -2456,9 +2152,7 @@ { "cell_type": "markdown", "id": "a73c982b", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Convex function\n", "\n", @@ -2468,9 +2162,7 @@ { "cell_type": "markdown", "id": "a56a2ae9", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Conditions on convex functions\n", "\n", @@ -2505,9 +2197,7 @@ { "cell_type": "markdown", "id": "3090b99d", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## More on convex functions\n", "\n", @@ -2533,9 +2223,7 @@ { "cell_type": "markdown", "id": "093b11b8", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Some simple problems\n", "\n", @@ -2563,9 +2251,7 @@ { "cell_type": "markdown", "id": "6f15fc92", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Revisiting our first homework\n", "\n", @@ -2587,10 +2273,7 @@ "cell_type": "code", "execution_count": 13, "id": "ce786ea2", - "metadata": { - "collapsed": false, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "x = 2*np.random.rand(m,1)\n", @@ -2600,9 +2283,7 @@ { "cell_type": "markdown", "id": "02fce565", - "metadata": { - "editable": true - }, + "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" @@ -2611,9 +2292,7 @@ { "cell_type": "markdown", "id": "f2ae83a6", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "h_\\beta(x) = \\boldsymbol{y} = \\beta_0 + \\beta_1 x,\n", @@ -2623,9 +2302,7 @@ { "cell_type": "markdown", "id": "9016e945", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "such that" ] @@ -2633,9 +2310,7 @@ { "cell_type": "markdown", "id": "9195a113", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{y}_i = \\beta_0 + \\beta_1 x_i.\n", @@ -2645,9 +2320,7 @@ { "cell_type": "markdown", "id": "e66e1135", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Gradient descent example\n", "\n", @@ -2659,9 +2332,7 @@ { "cell_type": "markdown", "id": "4e5fe9a8", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "X \\equiv \\begin{bmatrix}\n", @@ -2675,9 +2346,7 @@ { "cell_type": "markdown", "id": "4178bf2b", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "The cost/loss/risk function is given by (" ] @@ -2685,9 +2354,7 @@ { "cell_type": "markdown", "id": "91dbd291", - "metadata": { - "editable": true - }, + "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", @@ -2697,9 +2364,7 @@ { "cell_type": "markdown", "id": "b36bcd33", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "and we want to find $\\beta$ such that $C(\\beta)$ is minimized." ] @@ -2707,9 +2372,7 @@ { "cell_type": "markdown", "id": "dcfc85c6", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## The derivative of the cost/loss function\n", "\n", @@ -2719,9 +2382,7 @@ { "cell_type": "markdown", "id": "cd6314b3", - "metadata": { - "editable": true - }, + "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", @@ -2733,9 +2394,7 @@ { "cell_type": "markdown", "id": "54f6c9ae", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "where $X$ is the design matrix defined above." ] @@ -2743,9 +2402,7 @@ { "cell_type": "markdown", "id": "9b2c6838", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## The Hessian matrix\n", "The Hessian matrix of $C(\\beta)$ is given by" @@ -2754,9 +2411,7 @@ { "cell_type": "markdown", "id": "46b26877", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\boldsymbol{H} \\equiv \\begin{bmatrix}\n", @@ -2769,9 +2424,7 @@ { "cell_type": "markdown", "id": "4972c71f", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "This result implies that $C(\\beta)$ is a convex function since the matrix $X^T X$ always is positive semi-definite." ] @@ -2779,9 +2432,7 @@ { "cell_type": "markdown", "id": "f8ed6356", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Simple program\n", "\n", @@ -2791,9 +2442,7 @@ { "cell_type": "markdown", "id": "643c173d", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "$$\n", "\\beta_{k+1} = \\beta_k - \\gamma \\nabla_\\beta C(\\beta_k), \\ k=0,1,\\cdots\n", @@ -2803,9 +2452,7 @@ { "cell_type": "markdown", "id": "c5629d6e", - "metadata": { - "editable": true - }, + "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", @@ -2818,9 +2465,7 @@ { "cell_type": "markdown", "id": "ec12f593", - "metadata": { - "editable": true - }, + "metadata": {}, "source": [ "## Gradient Descent Example\n", "\n", @@ -2829,13 +2474,34 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 17, "id": "27555cc9", - "metadata": { - "collapsed": false, - "editable": true - }, - "outputs": [], + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Eigenvalues of Hessian Matrix:[0.28065531 4.4834507 ]\n", + "[[4.31499792]\n", + " [2.76774725]]\n", + "[[4.31499792]\n", + " [2.76774725]]\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "