diff --git a/doc/pub/week38/html/._week38-bs001.html b/doc/pub/week38/html/._week38-bs001.html
index b21adf5a0..4ca649286 100644
--- a/doc/pub/week38/html/._week38-bs001.html
+++ b/doc/pub/week38/html/._week38-bs001.html
@@ -327,6 +327,8 @@ MathJax.Hub.Config({
- Logistic regression as our first encounter of classification methods. From binary cases to several categories.
- Start gradient and optimization methods
+ - Video of lecture
+ - Whiteboard notes at https://github.com/CompPhysics/MachineLearning/blob/master/doc/HandWrittenNotes/2023/NotesSep21.pdf
- Readings and Videos:
- Hastie et al 4.1, 4.2 and 4.3 on logistic regression
diff --git a/doc/pub/week38/html/week38-reveal.html b/doc/pub/week38/html/week38-reveal.html
index 005047fcf..6d56a3f14 100644
--- a/doc/pub/week38/html/week38-reveal.html
+++ b/doc/pub/week38/html/week38-reveal.html
@@ -221,6 +221,10 @@ MathJax.Hub.Config({
- Start gradient and optimization methods
+- Video of lecture
+
+- Whiteboard notes at https://github.com/CompPhysics/MachineLearning/blob/master/doc/HandWrittenNotes/2023/NotesSep21.pdf
+
- Readings and Videos:
diff --git a/doc/pub/week38/html/week38-solarized.html b/doc/pub/week38/html/week38-solarized.html
index 314cbfa6a..e06a69a03 100644
--- a/doc/pub/week38/html/week38-solarized.html
+++ b/doc/pub/week38/html/week38-solarized.html
@@ -288,6 +288,8 @@ MathJax.Hub.Config({
- Logistic regression as our first encounter of classification methods. From binary cases to several categories.
- Start gradient and optimization methods
+ - Video of lecture
+ - Whiteboard notes at https://github.com/CompPhysics/MachineLearning/blob/master/doc/HandWrittenNotes/2023/NotesSep21.pdf
- Readings and Videos:
- Hastie et al 4.1, 4.2 and 4.3 on logistic regression
diff --git a/doc/pub/week38/html/week38.html b/doc/pub/week38/html/week38.html
index 7e83b641a..0ea8c3885 100644
--- a/doc/pub/week38/html/week38.html
+++ b/doc/pub/week38/html/week38.html
@@ -365,6 +365,8 @@ MathJax.Hub.Config({
- Logistic regression as our first encounter of classification methods. From binary cases to several categories.
- Start gradient and optimization methods
+ - Video of lecture
+ - Whiteboard notes at https://github.com/CompPhysics/MachineLearning/blob/master/doc/HandWrittenNotes/2023/NotesSep21.pdf
- Readings and Videos:
- Hastie et al 4.1, 4.2 and 4.3 on logistic regression
diff --git a/doc/pub/week38/ipynb/ipynb-week38-src.tar.gz b/doc/pub/week38/ipynb/ipynb-week38-src.tar.gz
index a18aa7b9a..6a4453ce4 100644
Binary files a/doc/pub/week38/ipynb/ipynb-week38-src.tar.gz and b/doc/pub/week38/ipynb/ipynb-week38-src.tar.gz differ
diff --git a/doc/pub/week38/ipynb/week38.ipynb b/doc/pub/week38/ipynb/week38.ipynb
index 155f2d74c..eef9cea6a 100644
--- a/doc/pub/week38/ipynb/week38.ipynb
+++ b/doc/pub/week38/ipynb/week38.ipynb
@@ -2,8 +2,10 @@
"cells": [
{
"cell_type": "markdown",
- "id": "92c39815",
- "metadata": {},
+ "id": "9cc2eba5",
+ "metadata": {
+ "editable": true
+ },
"source": [
"\n",
@@ -12,8 +14,10 @@
},
{
"cell_type": "markdown",
- "id": "c28ac15e",
- "metadata": {},
+ "id": "a8183a7a",
+ "metadata": {
+ "editable": true
+ },
"source": [
"# Week 38: Logistic Regression and Optimization\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",
@@ -23,8 +27,10 @@
},
{
"cell_type": "markdown",
- "id": "04bf16b5",
- "metadata": {},
+ "id": "31d68051",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Plans for week 38\n",
"\n",
@@ -45,6 +51,10 @@
"\n",
" * Start gradient and optimization methods\n",
"\n",
+ " * [Video of lecture](https://youtu.be/cJrSwRsVSGM)\n",
+ "\n",
+ " * Whiteboard notes at \n",
+ "\n",
" * Readings and Videos:\n",
"\n",
" * Hastie et al 4.1, 4.2 and 4.3 on logistic regression\n",
@@ -62,16 +72,20 @@
},
{
"cell_type": "markdown",
- "id": "e47b1a7c",
- "metadata": {},
+ "id": "1ef593e2",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Material from last week and relevant for the first project"
]
},
{
"cell_type": "markdown",
- "id": "1ad44c38",
- "metadata": {},
+ "id": "d690f648",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Various steps in cross-validation\n",
"\n",
@@ -93,8 +107,10 @@
},
{
"cell_type": "markdown",
- "id": "48181efc",
- "metadata": {},
+ "id": "3c88f88a",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## How to set up the cross-validation for Ridge and/or Lasso\n",
"\n",
@@ -107,8 +123,10 @@
},
{
"cell_type": "markdown",
- "id": "62106e79",
- "metadata": {},
+ "id": "d5927384",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"\\begin{align*}\n",
@@ -121,8 +139,10 @@
},
{
"cell_type": "markdown",
- "id": "7d392fb4",
- "metadata": {},
+ "id": "1e8e6d71",
+ "metadata": {
+ "editable": true
+ },
"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",
@@ -133,8 +153,10 @@
},
{
"cell_type": "markdown",
- "id": "883c8ba9",
- "metadata": {},
+ "id": "e43296fa",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Cross-validation in brief\n",
"\n",
@@ -159,8 +181,10 @@
},
{
"cell_type": "markdown",
- "id": "2db06c8a",
- "metadata": {},
+ "id": "a2cb346d",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Code Example for Cross-validation and $k$-fold Cross-validation\n",
"\n",
@@ -169,21 +193,13 @@
},
{
"cell_type": "code",
- "execution_count": 8,
- "id": "7487b649",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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RLpGrU+BJScno3bt2jh+/DjatGmjXP/ll1/i999/x9WrV0vs06BBA7z11luYM2eOct2xY8fQrl07pKSkwMmp5BdCaSNArq6uVX4KjIiIiKqP1pwCs7e3h76+fonRnrS0tBKjPE85OTmV2t7AwAB2dnal7iOVSiGVljMqQ0RERFpFrS+DNzIygr+/PyIiIlTWR0REIDAwsNR92rRpU6J9eHg4WrRoUer8HyIiItI9al0AAcD06dPx66+/4rfffkNcXBw++OADJCYmYvz4J5N/58yZg5CQEGX78ePH486dO5g+fTri4uLw22+/YdWqVZgxY4ZYXSAiIiI1o9anwABg6NChSE9Px2effYaUlBQ0adIEe/bsgbu7OwAgJSUFiYn/Xf7t6emJPXv24IMPPsCKFSvg4uKCpUuX8h5AREREpKTWk6DFUl33ASIiIqLqU5Hvb7U/BUZERERU1VgAERERkc5hAUREREQ6hwUQERER6RwWQERERKRzWAARERGRzmEBRERERDqHBRARERHpHBZAREREpHPU/lEYYnh6c2yZTCZyEiIiInpZT7+3X+YhFyyASpGVlQUAcHV1FTkJERERVVRWVhasrKzKbcNngZVCoVAgOTkZFhYWkEgkVXpsmUwGV1dXJCUlaeVzxrS9f4D295H903za3kf2T/NVVx8FQUBWVhZcXFygp1f+LB+OAJVCT08PderUqdb3sLS01NofbED7+wdofx/ZP82n7X1k/zRfdfTxRSM/T3ESNBEREekcFkBERESkc1gA1TCpVIp58+ZBKpWKHaVaaHv/AO3vI/un+bS9j+yf5lOHPnISNBEREekcjgARERGRzmEBRERERDqHBRARERHpHBZAREREpHNYAImob9++cHNzg7GxMZydnTFq1CgkJyeLHatK3L59G++88w48PT1hYmKCevXqYd68eSgoKBA7WpX68ssvERgYCFNTU1hbW4sd55X98MMP8PT0hLGxMfz9/XHkyBGxI1WZw4cPo0+fPnBxcYFEIsGOHTvEjlSlQkND0bJlS1hYWMDBwQH9+/fHtWvXxI5VpX788Uc0bdpUefO8Nm3aYO/evWLHqjahoaGQSCSYNm2a2FGqxPz58yGRSFReTk5OouVhASSiTp06YcuWLbh27Rq2bt2KmzdvYtCgQWLHqhJXr16FQqHAypUrERsbiyVLluCnn37C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IkJlXXh4OAIDA5XLfn5+uHLlSrnHOXLkCPr164c333wTvr6+qFu3bolJ26/ixIkTyj9nZGTg+vXraNSoEYAnn9ez259v/zTfmDFjMGDAAPj4+MDJyUl5T6NnXb58Gc2bN6+y3ES6igUQEVWYl5cX+vXrh3HjxuHo0aO4cOEC3nzzTdSuXRv9+vUDAEyePBl79uzB4sWLER8fj5UrV2Lv3r0lRoViYmIQExOD7OxsPHjwADExMSrFzNSpUxEeHo5Fixbh6tWrWLRoESIjI1XuGdS9e3fExsaWOwpUv359RERE4Pjx44iLi8N7771XYmTpVXz22Wc4cOAALl++jDFjxsDe3h79+/cHAEyZMgX79u3D119/jevXr2P58uXYt29fiXzbtm1DTEwMLly4gBEjRpQ6ynTkyJESk8KJqOJYABFRpaxevRr+/v7o3bs32rRpA0EQsGfPHuXporZt2+Knn37C4sWL4evri3379uGDDz4oMVfHz88Pfn5+OHv2LDZs2AA/Pz/07NlTuT0wMBCbNm3C6tWr0bRpU6xZswabN29WmX/k4+ODFi1aYMuWLWXmnTt3Lpo3b47u3bujY8eOcHJyUhYoVeGrr77C1KlT4e/vj5SUFOzatQtGRkYAgICAAPz6669YtmwZmjVrhvDwcHzyyScq+y9ZsgQ2NjYIDAxEnz590L179xIjPffu3cPx48fx1ltvVVluIl0lESpzUp6IqBLGjRuHq1evVstl3Hv27MGMGTNw+fJl6Olp5+92M2fORGZmJn7++WexoxBpPE6CJqJq8+233yIoKAhmZmbYu3cv1q5dix9++KFa3qtnz56Ij4/HvXv34OrqWi3vITYHBwfMmDFD7BhEWoEjQERUbYYMGYKoqChkZWWhbt26mDx5MsaPHy92LCIiFkBERESke7TzRDkRERFROVgAERERkc5hAUREREQ6hwUQERER6RwWQERERKRzWAARERGRzmEBRERERDqHBRARERHpHBZAREREpHP+H9FXLY0QKD/jAAAAAElFTkSuQmCC\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "execution_count": 1,
+ "id": "1e3f279d",
+ "metadata": {
+ "collapsed": false,
+ "editable": true
+ },
+ "outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
@@ -201,19 +217,19 @@
"# Generate the data.\n",
"nsamples = 100\n",
"x = np.random.randn(nsamples)\n",
- "y = 3*x**2#+ np.random.randn(nsamples)\n",
+ "y = 3*x**2 + np.random.randn(nsamples)\n",
"\n",
"## Cross-validation on Ridge regression using KFold only\n",
"\n",
"# Decide degree on polynomial to fit\n",
- "poly = PolynomialFeatures(degree = 2)\n",
+ "poly = PolynomialFeatures(degree = 6)\n",
"\n",
"# Decide which values of lambda to use\n",
"nlambdas = 500\n",
"lambdas = np.logspace(-3, 5, nlambdas)\n",
"\n",
"# Initialize a KFold instance\n",
- "k = 10\n",
+ "k = 5\n",
"kfold = KFold(n_splits = k)\n",
"\n",
"# Perform the cross-validation to estimate MSE\n",
@@ -280,16 +296,20 @@
},
{
"cell_type": "markdown",
- "id": "3d38a274",
- "metadata": {},
+ "id": "1de41ebb",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Material for lecture Thursday September 21"
]
},
{
"cell_type": "markdown",
- "id": "53cb96b0",
- "metadata": {},
+ "id": "c7c59b25",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Logistic Regression\n",
"\n",
@@ -308,8 +328,10 @@
},
{
"cell_type": "markdown",
- "id": "6120b1c7",
- "metadata": {},
+ "id": "dffe4c20",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Classification problems\n",
"\n",
@@ -332,8 +354,10 @@
},
{
"cell_type": "markdown",
- "id": "936083c0",
- "metadata": {},
+ "id": "4622a0ef",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Optimization and Deep learning\n",
"\n",
@@ -354,8 +378,10 @@
},
{
"cell_type": "markdown",
- "id": "32780c62",
- "metadata": {},
+ "id": "98aee52d",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Basics\n",
"\n",
@@ -377,8 +403,10 @@
},
{
"cell_type": "markdown",
- "id": "20d08abd",
- "metadata": {},
+ "id": "8c5ed826",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"y_i = \\begin{bmatrix} 0 & \\mathrm{no}\\\\ 1 & \\mathrm{yes} \\end{bmatrix}.\n",
@@ -387,8 +415,10 @@
},
{
"cell_type": "markdown",
- "id": "58b3452f",
- "metadata": {},
+ "id": "9d206548",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Linear classifier\n",
"\n",
@@ -403,8 +433,10 @@
},
{
"cell_type": "markdown",
- "id": "7f605f89",
- "metadata": {},
+ "id": "0d15e902",
+ "metadata": {
+ "editable": true
+ },
"source": [
"\n",
"\n",
@@ -419,8 +451,10 @@
},
{
"cell_type": "markdown",
- "id": "40905342",
- "metadata": {},
+ "id": "80839355",
+ "metadata": {
+ "editable": true
+ },
"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."
@@ -428,8 +462,10 @@
},
{
"cell_type": "markdown",
- "id": "77f09c4f",
- "metadata": {},
+ "id": "0d6274e7",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Some selected properties\n",
"\n",
@@ -453,8 +489,10 @@
},
{
"cell_type": "markdown",
- "id": "4eea9d16",
- "metadata": {},
+ "id": "a334d17f",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Simple example\n",
"\n",
@@ -464,8 +502,11 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "fdccf16e",
- "metadata": {},
+ "id": "389b3fd0",
+ "metadata": {
+ "collapsed": false,
+ "editable": true
+ },
"outputs": [],
"source": [
"# Common imports\n",
@@ -526,8 +567,10 @@
},
{
"cell_type": "markdown",
- "id": "3db91831",
- "metadata": {},
+ "id": "79264b3f",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Plotting the mean value for each group\n",
"\n",
@@ -537,8 +580,11 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "b570a592",
- "metadata": {},
+ "id": "363298b9",
+ "metadata": {
+ "collapsed": false,
+ "editable": true
+ },
"outputs": [],
"source": [
"agegroupmean = np.array([0.1, 0.133, 0.250, 0.333, 0.462, 0.625, 0.765, 0.800])\n",
@@ -553,8 +599,10 @@
},
{
"cell_type": "markdown",
- "id": "45e5a12a",
- "metadata": {},
+ "id": "8726b22c",
+ "metadata": {
+ "editable": true
+ },
"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"
@@ -562,8 +610,10 @@
},
{
"cell_type": "markdown",
- "id": "21d22b13",
- "metadata": {},
+ "id": "4cae8892",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"f(y_i\\vert x_i)=\\beta_0+\\beta_1 x_i.\n",
@@ -572,8 +622,10 @@
},
{
"cell_type": "markdown",
- "id": "e6b2b13a",
- "metadata": {},
+ "id": "067b39b0",
+ "metadata": {
+ "editable": true
+ },
"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",
@@ -589,8 +641,10 @@
},
{
"cell_type": "markdown",
- "id": "038a694a",
- "metadata": {},
+ "id": "64df3b8b",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## The logistic function\n",
"\n",
@@ -609,8 +663,10 @@
},
{
"cell_type": "markdown",
- "id": "581a37c8",
- "metadata": {},
+ "id": "395ebb35",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"p(t) = \\frac{1}{1+\\mathrm \\exp{-t}}=\\frac{\\exp{t}}{1+\\mathrm \\exp{t}}.\n",
@@ -619,16 +675,20 @@
},
{
"cell_type": "markdown",
- "id": "8e6ff605",
- "metadata": {},
+ "id": "1664d57c",
+ "metadata": {
+ "editable": true
+ },
"source": [
"Note that $1-p(t)= p(-t)$."
]
},
{
"cell_type": "markdown",
- "id": "07e8c6c7",
- "metadata": {},
+ "id": "a9d24fae",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Examples of likelihood functions used in logistic regression and nueral networks\n",
"\n",
@@ -638,8 +698,11 @@
{
"cell_type": "code",
"execution_count": 4,
- "id": "82e381c1",
- "metadata": {},
+ "id": "9f45ea41",
+ "metadata": {
+ "collapsed": false,
+ "editable": true
+ },
"outputs": [],
"source": [
"\"\"\"The sigmoid function (or the logistic curve) is a\n",
@@ -700,8 +763,10 @@
},
{
"cell_type": "markdown",
- "id": "cffc710d",
- "metadata": {},
+ "id": "5523d26d",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Two parameters\n",
"\n",
@@ -710,8 +775,10 @@
},
{
"cell_type": "markdown",
- "id": "077523d2",
- "metadata": {},
+ "id": "2acaf89d",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"\\begin{align*}\n",
@@ -723,8 +790,10 @@
},
{
"cell_type": "markdown",
- "id": "378c1ba1",
- "metadata": {},
+ "id": "a18fd4cf",
+ "metadata": {
+ "editable": true
+ },
"source": [
"where $\\boldsymbol{\\beta}$ are the weights we wish to extract from data, in our case $\\beta_0$ and $\\beta_1$. \n",
"\n",
@@ -733,8 +802,10 @@
},
{
"cell_type": "markdown",
- "id": "12641f70",
- "metadata": {},
+ "id": "b082e7fd",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"p(y_i=0\\vert x_i, \\boldsymbol{\\beta}) = 1-p(y_i=1\\vert x_i, \\boldsymbol{\\beta}).\n",
@@ -743,8 +814,10 @@
},
{
"cell_type": "markdown",
- "id": "72d4d322",
- "metadata": {},
+ "id": "db385c32",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Maximum likelihood\n",
"\n",
@@ -758,8 +831,10 @@
},
{
"cell_type": "markdown",
- "id": "218bad85",
- "metadata": {},
+ "id": "274e8ace",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"\\begin{align*}\n",
@@ -770,16 +845,20 @@
},
{
"cell_type": "markdown",
- "id": "7f1151b5",
- "metadata": {},
+ "id": "13b0bc0c",
+ "metadata": {
+ "editable": true
+ },
"source": [
"from which we obtain the log-likelihood and our **cost/loss** function"
]
},
{
"cell_type": "markdown",
- "id": "c31ffe4e",
- "metadata": {},
+ "id": "c5e6ed58",
+ "metadata": {
+ "editable": true
+ },
"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",
@@ -788,8 +867,10 @@
},
{
"cell_type": "markdown",
- "id": "f653cea3",
- "metadata": {},
+ "id": "05da3d11",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## The cost function rewritten\n",
"\n",
@@ -798,8 +879,10 @@
},
{
"cell_type": "markdown",
- "id": "d117384a",
- "metadata": {},
+ "id": "197b7a03",
+ "metadata": {
+ "editable": true
+ },
"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",
@@ -808,8 +891,10 @@
},
{
"cell_type": "markdown",
- "id": "3f7763f2",
- "metadata": {},
+ "id": "04c5a708",
+ "metadata": {
+ "editable": true
+ },
"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"
@@ -817,8 +902,10 @@
},
{
"cell_type": "markdown",
- "id": "0c5d4782",
- "metadata": {},
+ "id": "433c8b68",
+ "metadata": {
+ "editable": true
+ },
"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",
@@ -827,8 +914,10 @@
},
{
"cell_type": "markdown",
- "id": "e47ac025",
- "metadata": {},
+ "id": "1dd419f9",
+ "metadata": {
+ "editable": true
+ },
"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."
@@ -836,8 +925,10 @@
},
{
"cell_type": "markdown",
- "id": "0775be1d",
- "metadata": {},
+ "id": "f6da85f3",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Minimizing the cross entropy\n",
"\n",
@@ -850,8 +941,10 @@
},
{
"cell_type": "markdown",
- "id": "2c6d8021",
- "metadata": {},
+ "id": "b218ca83",
+ "metadata": {
+ "editable": true
+ },
"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",
@@ -860,16 +953,20 @@
},
{
"cell_type": "markdown",
- "id": "934b3029",
- "metadata": {},
+ "id": "9df81637",
+ "metadata": {
+ "editable": true
+ },
"source": [
"and"
]
},
{
"cell_type": "markdown",
- "id": "5736ce62",
- "metadata": {},
+ "id": "2c6810d9",
+ "metadata": {
+ "editable": true
+ },
"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",
@@ -878,8 +975,10 @@
},
{
"cell_type": "markdown",
- "id": "24448336",
- "metadata": {},
+ "id": "cf887b17",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## A more compact expression\n",
"\n",
@@ -891,8 +990,10 @@
},
{
"cell_type": "markdown",
- "id": "62af3134",
- "metadata": {},
+ "id": "b8d00a49",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"\\frac{\\partial \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = -\\boldsymbol{X}^T\\left(\\boldsymbol{y}-\\boldsymbol{p}\\right).\n",
@@ -901,8 +1002,10 @@
},
{
"cell_type": "markdown",
- "id": "e75f8b6b",
- "metadata": {},
+ "id": "2f792720",
+ "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"
@@ -910,8 +1013,10 @@
},
{
"cell_type": "markdown",
- "id": "afbcdd5a",
- "metadata": {},
+ "id": "eb2085a0",
+ "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",
@@ -920,8 +1025,10 @@
},
{
"cell_type": "markdown",
- "id": "6a4b6b7f",
- "metadata": {},
+ "id": "79468f06",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Extending to more predictors\n",
"\n",
@@ -930,8 +1037,10 @@
},
{
"cell_type": "markdown",
- "id": "0487a05f",
- "metadata": {},
+ "id": "6c8c7cf8",
+ "metadata": {
+ "editable": true
+ },
"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",
@@ -940,16 +1049,20 @@
},
{
"cell_type": "markdown",
- "id": "55d00e90",
- "metadata": {},
+ "id": "1c371a59",
+ "metadata": {
+ "editable": true
+ },
"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"
]
},
{
"cell_type": "markdown",
- "id": "13f16948",
- "metadata": {},
+ "id": "bddcf893",
+ "metadata": {
+ "editable": true
+ },
"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",
@@ -958,8 +1071,10 @@
},
{
"cell_type": "markdown",
- "id": "99af8c4d",
- "metadata": {},
+ "id": "130af732",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Including more classes\n",
"\n",
@@ -970,8 +1085,10 @@
},
{
"cell_type": "markdown",
- "id": "8ba91bb6",
- "metadata": {},
+ "id": "e221378d",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"\\log{\\frac{p(C=1\\vert x)}{p(K\\vert x)}} = \\beta_{10}+\\beta_{11}x_1,\n",
@@ -980,16 +1097,20 @@
},
{
"cell_type": "markdown",
- "id": "f5833039",
- "metadata": {},
+ "id": "10ec286a",
+ "metadata": {
+ "editable": true
+ },
"source": [
"and"
]
},
{
"cell_type": "markdown",
- "id": "451f2890",
- "metadata": {},
+ "id": "233ef2db",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"\\log{\\frac{p(C=2\\vert x)}{p(K\\vert x)}} = \\beta_{20}+\\beta_{21}x_1,\n",
@@ -998,16 +1119,20 @@
},
{
"cell_type": "markdown",
- "id": "1ae365e3",
- "metadata": {},
+ "id": "4cc7a244",
+ "metadata": {
+ "editable": true
+ },
"source": [
"and so on till the class $C=K-1$ class"
]
},
{
"cell_type": "markdown",
- "id": "b3187ffb",
- "metadata": {},
+ "id": "15d596d5",
+ "metadata": {
+ "editable": true
+ },
"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",
@@ -1016,8 +1141,10 @@
},
{
"cell_type": "markdown",
- "id": "edc72487",
- "metadata": {},
+ "id": "66cd8be9",
+ "metadata": {
+ "editable": true
+ },
"source": [
"and the model is specified in term of $K-1$ so-called log-odds or\n",
"**logit** transformations."
@@ -1025,8 +1152,10 @@
},
{
"cell_type": "markdown",
- "id": "1e550b7a",
- "metadata": {},
+ "id": "e5d7c12a",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## More classes\n",
"\n",
@@ -1046,8 +1175,10 @@
},
{
"cell_type": "markdown",
- "id": "dc2781ed",
- "metadata": {},
+ "id": "ac38c1a6",
+ "metadata": {
+ "editable": true
+ },
"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",
@@ -1056,16 +1187,20 @@
},
{
"cell_type": "markdown",
- "id": "720ee440",
- "metadata": {},
+ "id": "42a1c905",
+ "metadata": {
+ "editable": true
+ },
"source": [
"It is easy to extend to more predictors. The final class is"
]
},
{
"cell_type": "markdown",
- "id": "eaa0254a",
- "metadata": {},
+ "id": "a0cf54f7",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"p(C=K\\vert \\mathbf {x} )=\\frac{1}{1+\\sum_{l=1}^{K-1}\\exp{(\\beta_{l0}+\\beta_{l1}x_1)}},\n",
@@ -1074,8 +1209,10 @@
},
{
"cell_type": "markdown",
- "id": "f6bc3445",
- "metadata": {},
+ "id": "c36dab59",
+ "metadata": {
+ "editable": true
+ },
"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",
@@ -1089,16 +1226,20 @@
},
{
"cell_type": "markdown",
- "id": "b25b0241",
- "metadata": {},
+ "id": "976a80db",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Friday September 23"
]
},
{
"cell_type": "markdown",
- "id": "380d3c17",
- "metadata": {},
+ "id": "c1e05822",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Searching for Optimal Regularization Parameters $\\lambda$\n",
"\n",
@@ -1114,8 +1255,11 @@
{
"cell_type": "code",
"execution_count": 5,
- "id": "b1e69471",
- "metadata": {},
+ "id": "2718e48d",
+ "metadata": {
+ "collapsed": false,
+ "editable": true
+ },
"outputs": [],
"source": [
"import numpy as np\n",
@@ -1166,8 +1310,10 @@
},
{
"cell_type": "markdown",
- "id": "e82def1d",
- "metadata": {},
+ "id": "a2e5858b",
+ "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",
@@ -1176,8 +1322,10 @@
},
{
"cell_type": "markdown",
- "id": "325e0956",
- "metadata": {},
+ "id": "98b90510",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Grid Search\n",
"\n",
@@ -1189,8 +1337,11 @@
{
"cell_type": "code",
"execution_count": 6,
- "id": "557868b5",
- "metadata": {},
+ "id": "5eac16a1",
+ "metadata": {
+ "collapsed": false,
+ "editable": true
+ },
"outputs": [],
"source": [
"import numpy as np\n",
@@ -1239,8 +1390,10 @@
},
{
"cell_type": "markdown",
- "id": "72f0779e",
- "metadata": {},
+ "id": "1ca2c928",
+ "metadata": {
+ "editable": true
+ },
"source": [
"By default the grid search function includes cross validation with\n",
"five folds. The [Scikit-Learn\n",
@@ -1252,8 +1405,10 @@
},
{
"cell_type": "markdown",
- "id": "e6f83d4a",
- "metadata": {},
+ "id": "2b23985a",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Randomized Grid Search\n",
"\n",
@@ -1270,8 +1425,11 @@
{
"cell_type": "code",
"execution_count": 7,
- "id": "fadead70",
- "metadata": {},
+ "id": "959dfd40",
+ "metadata": {
+ "collapsed": false,
+ "editable": true
+ },
"outputs": [],
"source": [
"import numpy as np\n",
@@ -1321,8 +1479,10 @@
},
{
"cell_type": "markdown",
- "id": "42658f49",
- "metadata": {},
+ "id": "5d99762f",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Wisconsin Cancer Data\n",
"\n",
@@ -1334,8 +1494,11 @@
{
"cell_type": "code",
"execution_count": 8,
- "id": "01c1d986",
- "metadata": {},
+ "id": "ebb174de",
+ "metadata": {
+ "collapsed": false,
+ "editable": true
+ },
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
@@ -1358,8 +1521,10 @@
},
{
"cell_type": "markdown",
- "id": "a86570ee",
- "metadata": {},
+ "id": "d274920d",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Using the correlation matrix\n",
"\n",
@@ -1370,8 +1535,11 @@
{
"cell_type": "code",
"execution_count": 9,
- "id": "e241e87e",
- "metadata": {},
+ "id": "3449f395",
+ "metadata": {
+ "collapsed": false,
+ "editable": true
+ },
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
@@ -1412,8 +1580,10 @@
},
{
"cell_type": "markdown",
- "id": "31db566e",
- "metadata": {},
+ "id": "664bfafd",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Discussing the correlation data\n",
"\n",
@@ -1435,8 +1605,11 @@
{
"cell_type": "code",
"execution_count": 10,
- "id": "5ddb180b",
- "metadata": {},
+ "id": "361ab50d",
+ "metadata": {
+ "collapsed": false,
+ "editable": true
+ },
"outputs": [],
"source": [
"cancerpd = pd.DataFrame(cancer.data, columns=cancer.feature_names)"
@@ -1444,8 +1617,10 @@
},
{
"cell_type": "markdown",
- "id": "95c6a55b",
- "metadata": {},
+ "id": "615cd236",
+ "metadata": {
+ "editable": true
+ },
"source": [
"and then"
]
@@ -1453,8 +1628,11 @@
{
"cell_type": "code",
"execution_count": 11,
- "id": "f3347712",
- "metadata": {},
+ "id": "20df5011",
+ "metadata": {
+ "collapsed": false,
+ "editable": true
+ },
"outputs": [],
"source": [
"correlation_matrix = cancerpd.corr().round(1)"
@@ -1462,8 +1640,10 @@
},
{
"cell_type": "markdown",
- "id": "f60362a3",
- "metadata": {},
+ "id": "748bf832",
+ "metadata": {
+ "editable": true
+ },
"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",
@@ -1473,8 +1653,10 @@
},
{
"cell_type": "markdown",
- "id": "232f7e0d",
- "metadata": {},
+ "id": "e7ffdb9e",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Other measures in classification studies: Cancer Data again"
]
@@ -1482,8 +1664,11 @@
{
"cell_type": "code",
"execution_count": 12,
- "id": "552632a5",
- "metadata": {},
+ "id": "f98af390",
+ "metadata": {
+ "collapsed": false,
+ "editable": true
+ },
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
@@ -1522,8 +1707,10 @@
},
{
"cell_type": "markdown",
- "id": "7752c5ea",
- "metadata": {},
+ "id": "07bcaf40",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Optimization, the central part of any Machine Learning algortithm\n",
"\n",
@@ -1541,8 +1728,10 @@
},
{
"cell_type": "markdown",
- "id": "f307c73e",
- "metadata": {},
+ "id": "861a7704",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Revisiting our Logistic Regression case\n",
"\n",
@@ -1556,8 +1745,10 @@
},
{
"cell_type": "markdown",
- "id": "921fcab7",
- "metadata": {},
+ "id": "9b924e09",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"\\begin{align*}\n",
@@ -1569,16 +1760,20 @@
},
{
"cell_type": "markdown",
- "id": "9863a96d",
- "metadata": {},
+ "id": "2b49dd7b",
+ "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": "69a4b9a3",
- "metadata": {},
+ "id": "09c1f325",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## The equations to solve\n",
"\n",
@@ -1591,8 +1786,10 @@
},
{
"cell_type": "markdown",
- "id": "f3f454ef",
- "metadata": {},
+ "id": "f904df15",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"\\frac{\\partial \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = -\\boldsymbol{X}^T\\left(\\boldsymbol{y}-\\boldsymbol{p}\\right).\n",
@@ -1601,8 +1798,10 @@
},
{
"cell_type": "markdown",
- "id": "8ba81e87",
- "metadata": {},
+ "id": "70c2631f",
+ "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"
@@ -1610,8 +1809,10 @@
},
{
"cell_type": "markdown",
- "id": "0b87735e",
- "metadata": {},
+ "id": "8ace89bc",
+ "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",
@@ -1620,16 +1821,20 @@
},
{
"cell_type": "markdown",
- "id": "3de8fc00",
- "metadata": {},
+ "id": "77a52027",
+ "metadata": {
+ "editable": true
+ },
"source": [
"This defines what is called the Hessian matrix."
]
},
{
"cell_type": "markdown",
- "id": "a582cfba",
- "metadata": {},
+ "id": "f64c6f88",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Solving using Newton-Raphson's method\n",
"\n",
@@ -1640,8 +1845,10 @@
},
{
"cell_type": "markdown",
- "id": "7cb1055f",
- "metadata": {},
+ "id": "e9f0ab43",
+ "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",
@@ -1650,16 +1857,20 @@
},
{
"cell_type": "markdown",
- "id": "ecea7f51",
- "metadata": {},
+ "id": "41bd2b63",
+ "metadata": {
+ "editable": true
+ },
"source": [
"or in matrix form as"
]
},
{
"cell_type": "markdown",
- "id": "f98861e3",
- "metadata": {},
+ "id": "fdbab7f4",
+ "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",
@@ -1668,8 +1879,10 @@
},
{
"cell_type": "markdown",
- "id": "4fd11bf8",
- "metadata": {},
+ "id": "33f46848",
+ "metadata": {
+ "editable": true
+ },
"source": [
"The right-hand side is computed with the old values of $\\beta$. \n",
"\n",
@@ -1678,8 +1891,10 @@
},
{
"cell_type": "markdown",
- "id": "9b7f27a4",
- "metadata": {},
+ "id": "ad2a7d0a",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Brief reminder on Newton-Raphson's method\n",
"\n",
@@ -1696,8 +1911,10 @@
},
{
"cell_type": "markdown",
- "id": "50e2e1f0",
- "metadata": {},
+ "id": "f716cd22",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## The equations\n",
"\n",
@@ -1710,8 +1927,10 @@
},
{
"cell_type": "markdown",
- "id": "5605583d",
- "metadata": {},
+ "id": "e5210d0f",
+ "metadata": {
+ "editable": true
+ },
"source": [
"\n",
"\n",
@@ -1724,8 +1943,10 @@
},
{
"cell_type": "markdown",
- "id": "d6ce1a0c",
- "metadata": {},
+ "id": "4f3aa8ed",
+ "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"
@@ -1733,8 +1954,10 @@
},
{
"cell_type": "markdown",
- "id": "7462cf59",
- "metadata": {},
+ "id": "da20d4ff",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"f(x)+(s-x)f'(x)\\approx 0,\n",
@@ -1743,16 +1966,20 @@
},
{
"cell_type": "markdown",
- "id": "b3609230",
- "metadata": {},
+ "id": "ffe32653",
+ "metadata": {
+ "editable": true
+ },
"source": [
"yielding"
]
},
{
"cell_type": "markdown",
- "id": "63c5804e",
- "metadata": {},
+ "id": "63c73cd9",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"s\\approx x-\\frac{f(x)}{f'(x)}.\n",
@@ -1761,16 +1988,20 @@
},
{
"cell_type": "markdown",
- "id": "2f6643d0",
- "metadata": {},
+ "id": "f2c4c201",
+ "metadata": {
+ "editable": true
+ },
"source": [
"Having in mind an iterative procedure, it is natural to start iterating with"
]
},
{
"cell_type": "markdown",
- "id": "58afbcf0",
- "metadata": {},
+ "id": "a43b3360",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"x_{n+1}=x_n-\\frac{f(x_n)}{f'(x_n)}.\n",
@@ -1779,8 +2010,10 @@
},
{
"cell_type": "markdown",
- "id": "61a12296",
- "metadata": {},
+ "id": "1de9199a",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Simple geometric interpretation\n",
"\n",
@@ -1799,8 +2032,10 @@
},
{
"cell_type": "markdown",
- "id": "39144130",
- "metadata": {},
+ "id": "be74493c",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Extending to more than one variable\n",
"\n",
@@ -1810,8 +2045,10 @@
},
{
"cell_type": "markdown",
- "id": "b98db024",
- "metadata": {},
+ "id": "c9403406",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"\\begin{array}{cc} f_1(x_1,x_2) &=0\\\\\n",
@@ -1821,16 +2058,20 @@
},
{
"cell_type": "markdown",
- "id": "79154f84",
- "metadata": {},
+ "id": "de21ed85",
+ "metadata": {
+ "editable": true
+ },
"source": [
"which we Taylor expand to obtain"
]
},
{
"cell_type": "markdown",
- "id": "2b225307",
- "metadata": {},
+ "id": "981503d6",
+ "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",
@@ -1845,16 +2086,20 @@
},
{
"cell_type": "markdown",
- "id": "72363dfd",
- "metadata": {},
+ "id": "0748abb5",
+ "metadata": {
+ "editable": true
+ },
"source": [
"Defining the Jacobian matrix ${\\bf \\boldsymbol{J}}$ we have"
]
},
{
"cell_type": "markdown",
- "id": "7608f604",
- "metadata": {},
+ "id": "d868ebd3",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"{\\bf \\boldsymbol{J}}=\\left( \\begin{array}{cc}\n",
@@ -1866,16 +2111,20 @@
},
{
"cell_type": "markdown",
- "id": "d10f9e88",
- "metadata": {},
+ "id": "1abc622c",
+ "metadata": {
+ "editable": true
+ },
"source": [
"we can rephrase Newton's method as"
]
},
{
"cell_type": "markdown",
- "id": "e8a79127",
- "metadata": {},
+ "id": "0ade8cd3",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"\\left(\\begin{array}{c} x_1^{n+1} \\\\ x_2^{n+1} \\end{array} \\right)=\n",
@@ -1886,16 +2135,20 @@
},
{
"cell_type": "markdown",
- "id": "d8451a71",
- "metadata": {},
+ "id": "ccf6c19a",
+ "metadata": {
+ "editable": true
+ },
"source": [
"where we have defined"
]
},
{
"cell_type": "markdown",
- "id": "8c2c4387",
- "metadata": {},
+ "id": "04910c1c",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"\\left(\\begin{array}{c} h_1^{n} \\\\ h_2^{n} \\end{array} \\right)=\n",
@@ -1906,8 +2159,10 @@
},
{
"cell_type": "markdown",
- "id": "3dc3a90d",
- "metadata": {},
+ "id": "9ccc0fdd",
+ "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",
@@ -1919,8 +2174,10 @@
},
{
"cell_type": "markdown",
- "id": "fee016c8",
- "metadata": {},
+ "id": "7a2a5b20",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Steepest descent\n",
"\n",
@@ -1934,8 +2191,10 @@
},
{
"cell_type": "markdown",
- "id": "e4340278",
- "metadata": {},
+ "id": "3db0a74b",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k),\n",
@@ -1944,8 +2203,10 @@
},
{
"cell_type": "markdown",
- "id": "d2af5812",
- "metadata": {},
+ "id": "af2b0746",
+ "metadata": {
+ "editable": true
+ },
"source": [
"with $\\gamma_k > 0$.\n",
"\n",
@@ -1956,8 +2217,10 @@
},
{
"cell_type": "markdown",
- "id": "a8237bc8",
- "metadata": {},
+ "id": "8bdb9863",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## More on Steepest descent\n",
"\n",
@@ -1969,8 +2232,10 @@
},
{
"cell_type": "markdown",
- "id": "079c64d8",
- "metadata": {},
+ "id": "80223e09",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k), \\ \\ k \\geq 0.\n",
@@ -1979,8 +2244,10 @@
},
{
"cell_type": "markdown",
- "id": "08da6b25",
- "metadata": {},
+ "id": "ae46c661",
+ "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."
@@ -1988,8 +2255,10 @@
},
{
"cell_type": "markdown",
- "id": "7c1a4917",
- "metadata": {},
+ "id": "dc9af2ce",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## The ideal\n",
"\n",
@@ -2014,8 +2283,10 @@
},
{
"cell_type": "markdown",
- "id": "4d2aabf0",
- "metadata": {},
+ "id": "873ccd0e",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## The sensitiveness of the gradient descent\n",
"\n",
@@ -2034,8 +2305,10 @@
},
{
"cell_type": "markdown",
- "id": "7377154c",
- "metadata": {},
+ "id": "0ecc1560",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Convex functions\n",
"\n",
@@ -2054,8 +2327,10 @@
},
{
"cell_type": "markdown",
- "id": "697326eb",
- "metadata": {},
+ "id": "999efd0b",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Convex function\n",
"\n",
@@ -2064,8 +2339,10 @@
},
{
"cell_type": "markdown",
- "id": "a532b777",
- "metadata": {},
+ "id": "dbe04f76",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Conditions on convex functions\n",
"\n",
@@ -2099,8 +2376,10 @@
},
{
"cell_type": "markdown",
- "id": "ad4152f5",
- "metadata": {},
+ "id": "cd2756b4",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## More on convex functions\n",
"\n",
@@ -2125,8 +2404,10 @@
},
{
"cell_type": "markdown",
- "id": "e48d339b",
- "metadata": {},
+ "id": "45ce738a",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Some simple problems\n",
"\n",
@@ -2153,8 +2434,10 @@
},
{
"cell_type": "markdown",
- "id": "9ae5c509",
- "metadata": {},
+ "id": "dfb5ef6d",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Revisiting our first homework\n",
"\n",
@@ -2175,8 +2458,11 @@
{
"cell_type": "code",
"execution_count": 13,
- "id": "dd182f20",
- "metadata": {},
+ "id": "9dfbaf09",
+ "metadata": {
+ "collapsed": false,
+ "editable": true
+ },
"outputs": [],
"source": [
"x = 2*np.random.rand(m,1)\n",
@@ -2185,8 +2471,10 @@
},
{
"cell_type": "markdown",
- "id": "eef5bc40",
- "metadata": {},
+ "id": "35a79da9",
+ "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"
@@ -2194,8 +2482,10 @@
},
{
"cell_type": "markdown",
- "id": "2af1247d",
- "metadata": {},
+ "id": "06967409",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"h_\\beta(x) = \\boldsymbol{y} = \\beta_0 + \\beta_1 x,\n",
@@ -2204,16 +2494,20 @@
},
{
"cell_type": "markdown",
- "id": "20fcf8f2",
- "metadata": {},
+ "id": "ddbd2526",
+ "metadata": {
+ "editable": true
+ },
"source": [
"such that"
]
},
{
"cell_type": "markdown",
- "id": "2b6947aa",
- "metadata": {},
+ "id": "1733a15b",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"\\boldsymbol{y}_i = \\beta_0 + \\beta_1 x_i.\n",
@@ -2222,8 +2516,10 @@
},
{
"cell_type": "markdown",
- "id": "c5838344",
- "metadata": {},
+ "id": "bee0148d",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Gradient descent example\n",
"\n",
@@ -2234,8 +2530,10 @@
},
{
"cell_type": "markdown",
- "id": "c5af1dca",
- "metadata": {},
+ "id": "f8bf3934",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"X \\equiv \\begin{bmatrix}\n",
@@ -2248,16 +2546,20 @@
},
{
"cell_type": "markdown",
- "id": "f380504f",
- "metadata": {},
+ "id": "a14b7c83",
+ "metadata": {
+ "editable": true
+ },
"source": [
"The cost/loss/risk function is given by ("
]
},
{
"cell_type": "markdown",
- "id": "c4e7530e",
- "metadata": {},
+ "id": "255750cb",
+ "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",
@@ -2266,16 +2568,20 @@
},
{
"cell_type": "markdown",
- "id": "babaeeee",
- "metadata": {},
+ "id": "c67da34c",
+ "metadata": {
+ "editable": true
+ },
"source": [
"and we want to find $\\beta$ such that $C(\\beta)$ is minimized."
]
},
{
"cell_type": "markdown",
- "id": "1f25dc02",
- "metadata": {},
+ "id": "f5f3d460",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## The derivative of the cost/loss function\n",
"\n",
@@ -2284,8 +2590,10 @@
},
{
"cell_type": "markdown",
- "id": "58eb4735",
- "metadata": {},
+ "id": "3d1ede19",
+ "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",
@@ -2296,16 +2604,20 @@
},
{
"cell_type": "markdown",
- "id": "32f33b17",
- "metadata": {},
+ "id": "0685b6b7",
+ "metadata": {
+ "editable": true
+ },
"source": [
"where $X$ is the design matrix defined above."
]
},
{
"cell_type": "markdown",
- "id": "02ffa8c7",
- "metadata": {},
+ "id": "e3c9410a",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## The Hessian matrix\n",
"The Hessian matrix of $C(\\beta)$ is given by"
@@ -2313,8 +2625,10 @@
},
{
"cell_type": "markdown",
- "id": "7009c819",
- "metadata": {},
+ "id": "fcde03f8",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"\\boldsymbol{H} \\equiv \\begin{bmatrix}\n",
@@ -2326,16 +2640,20 @@
},
{
"cell_type": "markdown",
- "id": "71cf8211",
- "metadata": {},
+ "id": "bd7c7145",
+ "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": "b41b50aa",
- "metadata": {},
+ "id": "273862c8",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Simple program\n",
"\n",
@@ -2344,8 +2662,10 @@
},
{
"cell_type": "markdown",
- "id": "1b52d696",
- "metadata": {},
+ "id": "ff091180",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"\\beta_{k+1} = \\beta_k - \\gamma \\nabla_\\beta C(\\beta_k), \\ k=0,1,\\cdots\n",
@@ -2354,8 +2674,10 @@
},
{
"cell_type": "markdown",
- "id": "ef629c8b",
- "metadata": {},
+ "id": "510ded4a",
+ "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",
@@ -2367,8 +2689,10 @@
},
{
"cell_type": "markdown",
- "id": "0c30718a",
- "metadata": {},
+ "id": "b465897d",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Gradient Descent Example\n",
"\n",
@@ -2378,8 +2702,11 @@
{
"cell_type": "code",
"execution_count": 14,
- "id": "84f33bde",
- "metadata": {},
+ "id": "55de11e8",
+ "metadata": {
+ "collapsed": false,
+ "editable": true
+ },
"outputs": [],
"source": [
"\n",
@@ -2432,8 +2759,10 @@
},
{
"cell_type": "markdown",
- "id": "d332552b",
- "metadata": {},
+ "id": "fa823fff",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## And a corresponding example using **scikit-learn**"
]
@@ -2441,8 +2770,11 @@
{
"cell_type": "code",
"execution_count": 15,
- "id": "c46612a1",
- "metadata": {},
+ "id": "cd62db07",
+ "metadata": {
+ "collapsed": false,
+ "editable": true
+ },
"outputs": [],
"source": [
"# Importing various packages\n",
@@ -2465,8 +2797,10 @@
},
{
"cell_type": "markdown",
- "id": "2aa00fc2",
- "metadata": {},
+ "id": "748b7943",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Gradient descent and Ridge\n",
"\n",
@@ -2475,8 +2809,10 @@
},
{
"cell_type": "markdown",
- "id": "c2d248a4",
- "metadata": {},
+ "id": "0d71b09d",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"C_{\\text{ridge}}(\\beta) = \\frac{1}{n}||X\\beta -\\mathbf{y}||^2 + \\lambda ||\\beta||^2, \\ \\lambda \\geq 0.\n",
@@ -2485,16 +2821,20 @@
},
{
"cell_type": "markdown",
- "id": "fa969e77",
- "metadata": {},
+ "id": "42d5847c",
+ "metadata": {
+ "editable": true
+ },
"source": [
"In order to minimize $C_{\\text{ridge}}(\\beta)$ using GD we adjust the gradient as follows"
]
},
{
"cell_type": "markdown",
- "id": "60d7d114",
- "metadata": {},
+ "id": "ea239249",
+ "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",
@@ -2505,16 +2845,20 @@
},
{
"cell_type": "markdown",
- "id": "a281f2c0",
- "metadata": {},
+ "id": "fbc34af7",
+ "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": "5c40a890",
- "metadata": {},
+ "id": "add0ed1b",
+ "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",
@@ -2523,8 +2867,10 @@
},
{
"cell_type": "markdown",
- "id": "5e848da6",
- "metadata": {},
+ "id": "dff6e4c5",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## The Hessian matrix for Ridge Regression\n",
"The Hessian matrix of Ridge Regression for our simple example is given by"
@@ -2532,8 +2878,10 @@
},
{
"cell_type": "markdown",
- "id": "54b17645",
- "metadata": {},
+ "id": "a8ac4e98",
+ "metadata": {
+ "editable": true
+ },
"source": [
"$$\n",
"\\boldsymbol{H} \\equiv \\begin{bmatrix}\n",
@@ -2545,8 +2893,10 @@
},
{
"cell_type": "markdown",
- "id": "a8bb3901",
- "metadata": {},
+ "id": "6503aeb0",
+ "metadata": {
+ "editable": true
+ },
"source": [
"This implies that the Hessian matrix is positive definite, hence the stationary point is a\n",
"minimum.\n",
@@ -2557,8 +2907,10 @@
},
{
"cell_type": "markdown",
- "id": "61ab0a41",
- "metadata": {},
+ "id": "68447ce5",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Program example for gradient descent with Ridge Regression"
]
@@ -2566,8 +2918,11 @@
{
"cell_type": "code",
"execution_count": 16,
- "id": "630a15e8",
- "metadata": {},
+ "id": "65927570",
+ "metadata": {
+ "collapsed": false,
+ "editable": true
+ },
"outputs": [],
"source": [
"from random import random, seed\n",
@@ -2624,8 +2979,10 @@
},
{
"cell_type": "markdown",
- "id": "21abaca5",
- "metadata": {},
+ "id": "81a4c315",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Using gradient descent methods, limitations\n",
"\n",
@@ -2644,8 +3001,10 @@
},
{
"cell_type": "markdown",
- "id": "5753b51d",
- "metadata": {},
+ "id": "5c2b7530",
+ "metadata": {
+ "editable": true
+ },
"source": [
"## Challenge yourself the coming weekend\n",
"\n",
@@ -2653,25 +3012,7 @@
]
}
],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3 (ipykernel)",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.9.10"
- }
- },
+ "metadata": {},
"nbformat": 4,
"nbformat_minor": 5
}
diff --git a/doc/src/week38/week38.do.txt b/doc/src/week38/week38.do.txt
index 2e6ce1aca..518e5da84 100644
--- a/doc/src/week38/week38.do.txt
+++ b/doc/src/week38/week38.do.txt
@@ -17,6 +17,8 @@ DATE: September 18-22
!bblock Material for the lecture on Thursday September 21
* Logistic regression as our first encounter of classification methods. From binary cases to several categories.
* Start gradient and optimization methods
+ * "Video of lecture":"https://youtu.be/cJrSwRsVSGM"
+ * Whiteboard notes at URL:"https://github.com/CompPhysics/MachineLearning/blob/master/doc/HandWrittenNotes/2023/NotesSep21.pdf"
* Readings and Videos:
* Hastie et al 4.1, 4.2 and 4.3 on logistic regression
* For a good discussion on gradient methods, see Goodfellow et al section 4.3-4.5 and chapter 8. We will come back to the latter chapter in our discussion of Neural networks as well.