{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Resampling Methods\n", "\n", "## Introduction\n", "\n", "Resampling methods are an indispensable tool in modern\n", "statistics. They involve repeatedly drawing samples from a training\n", "set and refitting a model of interest on each sample in order to\n", "obtain additional information about the fitted model. For example, in\n", "order to estimate the variability of a linear regression fit, we can\n", "repeatedly draw different samples from the training data, fit a linear\n", "regression to each new sample, and then examine the extent to which\n", "the resulting fits differ. Such an approach may allow us to obtain\n", "information that would not be available from fitting the model only\n", "once using the original training sample.\n", "\n", "Two resampling methods are often used in Machine Learning analyses,\n", "1. The **bootstrap method**\n", "\n", "2. and **Cross-Validation**\n", "\n", "In addition there are several other methods such as the Jackknife and the Blocking methods. We will discuss in particular\n", "cross-validation and the bootstrap method. \n", "\n", "\n", "Resampling approaches can be computationally expensive, because they\n", "involve fitting the same statistical method multiple times using\n", "different subsets of the training data. However, due to recent\n", "advances in computing power, the computational requirements of\n", "resampling methods generally are not prohibitive. In this chapter, we\n", "discuss two of the most commonly used resampling methods,\n", "cross-validation and the bootstrap. Both methods are important tools\n", "in the practical application of many statistical learning\n", "procedures. For example, cross-validation can be used to estimate the\n", "test error associated with a given statistical learning method in\n", "order to evaluate its performance, or to select the appropriate level\n", "of flexibility. The process of evaluating a model’s performance is\n", "known as model assessment, whereas the process of selecting the proper\n", "level of flexibility for a model is known as model selection. The\n", "bootstrap is widely used.\n", "\n", "\n", "* Our simulations can be treated as *computer experiments*. This is particularly the case for Monte Carlo methods\n", "\n", "* The results can be analysed with the same statistical tools as we would use analysing experimental data.\n", "\n", "* As in all experiments, we are looking for expectation values and an estimate of how accurate they are, i.e., possible sources for errors.\n", "\n", "## Reminder on Statistics\n", "\n", "\n", "* As in other experiments, many numerical experiments have two classes of errors:\n", "\n", " * Statistical errors\n", "\n", " * Systematical errors\n", "\n", "\n", "* Statistical errors can be estimated using standard tools from statistics\n", "\n", "* Systematical errors are method specific and must be treated differently from case to case. \n", "\n", "The\n", "advantage of doing linear regression is that we actually end up with\n", "analytical expressions for several statistical quantities. \n", "Standard least squares and Ridge regression allow us to\n", "derive quantities like the variance and other expectation values in a\n", "rather straightforward way.\n", "\n", "\n", "It is assumed that $\\varepsilon_i\n", "\\sim \\mathcal{N}(0, \\sigma^2)$ and the $\\varepsilon_{i}$ are\n", "independent, i.e.:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\begin{align*} \n", "\\mbox{Cov}(\\varepsilon_{i_1},\n", "\\varepsilon_{i_2}) & = \\left\\{ \\begin{array}{lcc} \\sigma^2 & \\mbox{if}\n", "& i_1 = i_2, \\\\ 0 & \\mbox{if} & i_1 \\not= i_2. \\end{array} \\right.\n", "\\end{align*}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The randomness of $\\varepsilon_i$ implies that\n", "$\\mathbf{y}_i$ is also a random variable. In particular,\n", "$\\mathbf{y}_i$ is normally distributed, because $\\varepsilon_i \\sim\n", "\\mathcal{N}(0, \\sigma^2)$ and $\\mathbf{X}_{i,\\ast} \\, \\boldsymbol{\\beta}$ is a\n", "non-random scalar. To specify the parameters of the distribution of\n", "$\\mathbf{y}_i$ we need to calculate its first two moments. \n", "\n", "Recall that $\\boldsymbol{X}$ is a matrix of dimensionality $n\\times p$. The\n", "notation above $\\mathbf{X}_{i,\\ast}$ means that we are looking at the\n", "row number $i$ and perform a sum over all values $p$.\n", "\n", "\n", "The assumption we have made here can be summarized as (and this is going to be useful when we discuss the bias-variance trade off)\n", "that there exists a function $f(\\boldsymbol{x})$ and a normal distributed error $\\boldsymbol{\\varepsilon}\\sim \\mathcal{N}(0, \\sigma^2)$\n", "which describe our data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\boldsymbol{y} = f(\\boldsymbol{x})+\\boldsymbol{\\varepsilon}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We approximate this function with our model from the solution of the linear regression equations, that is our\n", "function $f$ is approximated by $\\boldsymbol{\\tilde{y}}$ where we want to minimize $(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}})^2$, our MSE, with" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\boldsymbol{\\tilde{y}} = \\boldsymbol{X}\\boldsymbol{\\beta}.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can calculate the expectation value of $\\boldsymbol{y}$ for a given element $i$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\begin{align*} \n", "\\mathbb{E}(y_i) & =\n", "\\mathbb{E}(\\mathbf{X}_{i, \\ast} \\, \\boldsymbol{\\beta}) + \\mathbb{E}(\\varepsilon_i)\n", "\\, \\, \\, = \\, \\, \\, \\mathbf{X}_{i, \\ast} \\, \\beta, \n", "\\end{align*}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "while\n", "its variance is" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\begin{align*} \\mbox{Var}(y_i) & = \\mathbb{E} \\{ [y_i\n", "- \\mathbb{E}(y_i)]^2 \\} \\, \\, \\, = \\, \\, \\, \\mathbb{E} ( y_i^2 ) -\n", "[\\mathbb{E}(y_i)]^2 \\\\ & = \\mathbb{E} [ ( \\mathbf{X}_{i, \\ast} \\,\n", "\\beta + \\varepsilon_i )^2] - ( \\mathbf{X}_{i, \\ast} \\, \\boldsymbol{\\beta})^2 \\\\ &\n", "= \\mathbb{E} [ ( \\mathbf{X}_{i, \\ast} \\, \\boldsymbol{\\beta})^2 + 2 \\varepsilon_i\n", "\\mathbf{X}_{i, \\ast} \\, \\boldsymbol{\\beta} + \\varepsilon_i^2 ] - ( \\mathbf{X}_{i,\n", "\\ast} \\, \\beta)^2 \\\\ & = ( \\mathbf{X}_{i, \\ast} \\, \\boldsymbol{\\beta})^2 + 2\n", "\\mathbb{E}(\\varepsilon_i) \\mathbf{X}_{i, \\ast} \\, \\boldsymbol{\\beta} +\n", "\\mathbb{E}(\\varepsilon_i^2 ) - ( \\mathbf{X}_{i, \\ast} \\, \\boldsymbol{\\beta})^2 \n", "\\\\ & = \\mathbb{E}(\\varepsilon_i^2 ) \\, \\, \\, = \\, \\, \\,\n", "\\mbox{Var}(\\varepsilon_i) \\, \\, \\, = \\, \\, \\, \\sigma^2. \n", "\\end{align*}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hence, $y_i \\sim \\mathcal{N}( \\mathbf{X}_{i, \\ast} \\, \\boldsymbol{\\beta}, \\sigma^2)$, that is $\\boldsymbol{y}$ follows a normal distribution with \n", "mean value $\\boldsymbol{X}\\boldsymbol{\\beta}$ and variance $\\sigma^2$ (not be confused with the singular values of the SVD). \n", "\n", "\n", "With the OLS expressions for the parameters $\\boldsymbol{\\beta}$ we can evaluate the expectation value" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\mathbb{E}(\\boldsymbol{\\beta}) = \\mathbb{E}[ (\\mathbf{X}^{\\top} \\mathbf{X})^{-1}\\mathbf{X}^{T} \\mathbf{Y}]=(\\mathbf{X}^{T} \\mathbf{X})^{-1}\\mathbf{X}^{T} \\mathbb{E}[ \\mathbf{Y}]=(\\mathbf{X}^{T} \\mathbf{X})^{-1} \\mathbf{X}^{T}\\mathbf{X}\\boldsymbol{\\beta}=\\boldsymbol{\\beta}.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This means that the estimator of the regression parameters is unbiased.\n", "v\n", "We can also calculate the variance\n", "\n", "The variance of $\\boldsymbol{\\beta}$ is" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\begin{eqnarray*}\n", "\\mbox{Var}(\\boldsymbol{\\beta}) & = & \\mathbb{E} \\{ [\\boldsymbol{\\beta} - \\mathbb{E}(\\boldsymbol{\\beta})] [\\boldsymbol{\\beta} - \\mathbb{E}(\\boldsymbol{\\beta})]^{T} \\}\n", "\\\\\n", "& = & \\mathbb{E} \\{ [(\\mathbf{X}^{T} \\mathbf{X})^{-1} \\, \\mathbf{X}^{T} \\mathbf{Y} - \\boldsymbol{\\beta}] \\, [(\\mathbf{X}^{T} \\mathbf{X})^{-1} \\, \\mathbf{X}^{T} \\mathbf{Y} - \\boldsymbol{\\beta}]^{T} \\}\n", "\\\\\n", "% & = & \\mathbb{E} \\{ [(\\mathbf{X}^{T} \\mathbf{X})^{-1} \\, \\mathbf{X}^{T} \\mathbf{Y}] \\, [(\\mathbf{X}^{T} \\mathbf{X})^{-1} \\, \\mathbf{X}^{T} \\mathbf{Y}]^{T} \\} - \\boldsymbol{\\beta} \\, \\boldsymbol{\\beta}^{T}\n", "% \\\\\n", "% & = & \\mathbb{E} \\{ (\\mathbf{X}^{T} \\mathbf{X})^{-1} \\, \\mathbf{X}^{T} \\mathbf{Y} \\, \\mathbf{Y}^{T} \\, \\mathbf{X} \\, (\\mathbf{X}^{T} \\mathbf{X})^{-1} \\} - \\boldsymbol{\\beta} \\, \\boldsymbol{\\beta}^{T}\n", "% \\\\\n", "& = & (\\mathbf{X}^{T} \\mathbf{X})^{-1} \\, \\mathbf{X}^{T} \\, \\mathbb{E} \\{ \\mathbf{Y} \\, \\mathbf{Y}^{T} \\} \\, \\mathbf{X} \\, (\\mathbf{X}^{T} \\mathbf{X})^{-1} - \\boldsymbol{\\beta} \\, \\boldsymbol{\\beta}^{T}\n", "\\\\\n", "& = & (\\mathbf{X}^{T} \\mathbf{X})^{-1} \\, \\mathbf{X}^{T} \\, \\{ \\mathbf{X} \\, \\boldsymbol{\\beta} \\, \\boldsymbol{\\beta}^{T} \\, \\mathbf{X}^{T} + \\sigma^2 \\} \\, \\mathbf{X} \\, (\\mathbf{X}^{T} \\mathbf{X})^{-1} - \\boldsymbol{\\beta} \\, \\boldsymbol{\\beta}^{T}\n", "% \\\\\n", "% & = & (\\mathbf{X}^T \\mathbf{X})^{-1} \\, \\mathbf{X}^T \\, \\mathbf{X} \\, \\boldsymbol{\\beta} \\, \\boldsymbol{\\beta}^T \\, \\mathbf{X}^T \\, \\mathbf{X} \\, (\\mathbf{X}^T % \\mathbf{X})^{-1}\n", "% \\\\\n", "% & & + \\, \\, \\sigma^2 \\, (\\mathbf{X}^T \\mathbf{X})^{-1} \\, \\mathbf{X}^T \\, \\mathbf{X} \\, (\\mathbf{X}^T \\mathbf{X})^{-1} - \\boldsymbol{\\beta} \\boldsymbol{\\beta}^T\n", "\\\\\n", "& = & \\boldsymbol{\\beta} \\, \\boldsymbol{\\beta}^{T} + \\sigma^2 \\, (\\mathbf{X}^{T} \\mathbf{X})^{-1} - \\boldsymbol{\\beta} \\, \\boldsymbol{\\beta}^{T}\n", "\\, \\, \\, = \\, \\, \\, \\sigma^2 \\, (\\mathbf{X}^{T} \\mathbf{X})^{-1},\n", "\\end{eqnarray*}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "where we have used that $\\mathbb{E} (\\mathbf{Y} \\mathbf{Y}^{T}) =\n", "\\mathbf{X} \\, \\boldsymbol{\\beta} \\, \\boldsymbol{\\beta}^{T} \\, \\mathbf{X}^{T} +\n", "\\sigma^2 \\, \\mathbf{I}_{nn}$. From $\\mbox{Var}(\\boldsymbol{\\beta}) = \\sigma^2\n", "\\, (\\mathbf{X}^{T} \\mathbf{X})^{-1}$, one obtains an estimate of the\n", "variance of the estimate of the $j$-th regression coefficient:\n", "$\\boldsymbol{\\sigma}^2 (\\boldsymbol{\\beta}_j ) = \\boldsymbol{\\sigma}^2 \\sqrt{\n", "[(\\mathbf{X}^{T} \\mathbf{X})^{-1}]_{jj} }$. This may be used to\n", "construct a confidence interval for the estimates.\n", "\n", "\n", "In a similar way, we can obtain analytical expressions for say the\n", "expectation values of the parameters $\\boldsymbol{\\beta}$ and their variance\n", "when we employ Ridge regression, allowing us again to define a confidence interval. \n", "\n", "It is rather straightforward to show that" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\mathbb{E} \\big[ \\boldsymbol{\\beta}^{\\mathrm{Ridge}} \\big]=(\\mathbf{X}^{T} \\mathbf{X} + \\lambda \\mathbf{I}_{pp})^{-1} (\\mathbf{X}^{\\top} \\mathbf{X})\\boldsymbol{\\beta}^{\\mathrm{OLS}}.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see clearly that \n", "$\\mathbb{E} \\big[ \\boldsymbol{\\beta}^{\\mathrm{Ridge}} \\big] \\not= \\boldsymbol{\\beta}^{\\mathrm{OLS}}$ for any $\\lambda > 0$. We say then that the ridge estimator is biased.\n", "\n", "We can also compute the variance as" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\mbox{Var}[\\boldsymbol{\\beta}^{\\mathrm{Ridge}}]=\\sigma^2[ \\mathbf{X}^{T} \\mathbf{X} + \\lambda \\mathbf{I} ]^{-1} \\mathbf{X}^{T} \\mathbf{X} \\{ [ \\mathbf{X}^{\\top} \\mathbf{X} + \\lambda \\mathbf{I} ]^{-1}\\}^{T},\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and it is easy to see that if the parameter $\\lambda$ goes to infinity then the variance of Ridge parameters $\\boldsymbol{\\beta}$ goes to zero. \n", "\n", "With this, we can compute the difference" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\mbox{Var}[\\boldsymbol{\\beta}^{\\mathrm{OLS}}]-\\mbox{Var}(\\boldsymbol{\\beta}^{\\mathrm{Ridge}})=\\sigma^2 [ \\mathbf{X}^{T} \\mathbf{X} + \\lambda \\mathbf{I} ]^{-1}[ 2\\lambda\\mathbf{I} + \\lambda^2 (\\mathbf{X}^{T} \\mathbf{X})^{-1} ] \\{ [ \\mathbf{X}^{T} \\mathbf{X} + \\lambda \\mathbf{I} ]^{-1}\\}^{T}.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The difference is non-negative definite since each component of the\n", "matrix product is non-negative definite. \n", "This means the variance we obtain with the standard OLS will always for $\\lambda > 0$ be larger than the variance of $\\boldsymbol{\\beta}$ obtained with the Ridge estimator. This has interesting consequences when we discuss the so-called bias-variance trade-off below. \n", "\n", "\n", "\n", "## Resampling methods\n", "\n", "With all these analytical equations for both the OLS and Ridge\n", "regression, we will now outline how to assess a given model. This will\n", "lead us to a discussion of the so-called bias-variance tradeoff (see\n", "below) and so-called resampling methods.\n", "\n", "One of the quantities we have discussed as a way to measure errors is\n", "the mean-squared error (MSE), mainly used for fitting of continuous\n", "functions. Another choice is the absolute error.\n", "\n", "In the discussions below we will focus on the MSE and in particular since we will split the data into test and training data,\n", "we discuss the\n", "1. prediction error or simply the **test error** $\\mathrm{Err_{Test}}$, where we have a fixed training set and the test error is the MSE arising from the data reserved for testing. We discuss also the \n", "\n", "2. training error $\\mathrm{Err_{Train}}$, which is the average loss over the training data.\n", "\n", "As our model becomes more and more complex, more of the training data tends to used. The training may thence adapt to more complicated structures in the data. This may lead to a decrease in the bias (see below for code example) and a slight increase of the variance for the test error.\n", "For a certain level of complexity the test error will reach minimum, before starting to increase again. The\n", "training error reaches a saturation.\n", "\n", "\n", "\n", "Two famous\n", "resampling methods are the **independent bootstrap** and **the jackknife**. \n", "\n", "The jackknife is a special case of the independent bootstrap. Still, the jackknife was made\n", "popular prior to the independent bootstrap. And as the popularity of\n", "the independent bootstrap soared, new variants, such as **the dependent bootstrap**.\n", "\n", "The Jackknife and independent bootstrap work for\n", "independent, identically distributed random variables.\n", "If these conditions are not\n", "satisfied, the methods will fail. Yet, it should be said that if the data are\n", "independent, identically distributed, and we only want to estimate the\n", "variance of $\\overline{X}$ (which often is the case), then there is no\n", "need for bootstrapping. \n", "\n", "\n", "The Jackknife works by making many replicas of the estimator $\\widehat{\\beta}$. \n", "The jackknife is a resampling method where we systematically leave out one observation from the vector of observed values $\\boldsymbol{x} = (x_1,x_2,\\cdots,X_n)$. \n", "Let $\\boldsymbol{x}_i$ denote the vector" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\boldsymbol{x}_i = (x_1,x_2,\\cdots,x_{i-1},x_{i+1},\\cdots,x_n),\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "which equals the vector $\\boldsymbol{x}$ with the exception that observation\n", "number $i$ is left out. Using this notation, define\n", "$\\widehat{\\beta}_i$ to be the estimator\n", "$\\widehat{\\beta}$ computed using $\\vec{X}_i$." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Runtime: 0.0896981 sec\n", "Jackknife Statistics :\n", "original bias std. error\n", " 100.213 100.203 0.148564\n" ] } ], "source": [ "from numpy import *\n", "from numpy.random import randint, randn\n", "from time import time\n", "\n", "def jackknife(data, stat):\n", " n = len(data);t = zeros(n); inds = arange(n); t0 = time()\n", " ## 'jackknifing' by leaving out an observation for each i \n", " for i in range(n):\n", " t[i] = stat(delete(data,i) )\n", "\n", " # analysis \n", " print(\"Runtime: %g sec\" % (time()-t0)); print(\"Jackknife Statistics :\")\n", " print(\"original bias std. error\")\n", " print(\"%8g %14g %15g\" % (stat(data),(n-1)*mean(t)/n, (n*var(t))**.5))\n", "\n", " return t\n", "\n", "\n", "# Returns mean of data samples \n", "def stat(data):\n", " return mean(data)\n", "\n", "\n", "mu, sigma = 100, 15\n", "datapoints = 10000\n", "x = mu + sigma*random.randn(datapoints)\n", "# jackknife returns the data sample \n", "t = jackknife(x, stat)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Bootstrap\n", "\n", "Bootstrapping is a nonparametric approach to statistical inference\n", "that substitutes computation for more traditional distributional\n", "assumptions and asymptotic results. Bootstrapping offers a number of\n", "advantages: \n", "1. The bootstrap is quite general, although there are some cases in which it fails. \n", "\n", "2. Because it does not require distributional assumptions (such as normally distributed errors), the bootstrap can provide more accurate inferences when the data are not well behaved or when the sample size is small. \n", "\n", "3. It is possible to apply the bootstrap to statistics with sampling distributions that are difficult to derive, even asymptotically. \n", "\n", "4. It is relatively simple to apply the bootstrap to complex data-collection plans (such as stratified and clustered samples).\n", "\n", "Since $\\widehat{\\beta} = \\widehat{\\beta}(\\boldsymbol{X})$ is a function of random variables,\n", "$\\widehat{\\beta}$ itself must be a random variable. Thus it has\n", "a pdf, call this function $p(\\boldsymbol{t})$. The aim of the bootstrap is to\n", "estimate $p(\\boldsymbol{t})$ by the relative frequency of\n", "$\\widehat{\\beta}$. You can think of this as using a histogram\n", "in the place of $p(\\boldsymbol{t})$. If the relative frequency closely\n", "resembles $p(\\vec{t})$, then using numerics, it is straight forward to\n", "estimate all the interesting parameters of $p(\\boldsymbol{t})$ using point\n", "estimators. \n", "\n", "\n", "\n", "In the case that $\\widehat{\\beta}$ has\n", "more than one component, and the components are independent, we use the\n", "same estimator on each component separately. If the probability\n", "density function of $X_i$, $p(x)$, had been known, then it would have\n", "been straight forward to do this by: \n", "1. Drawing lots of numbers from $p(x)$, suppose we call one such set of numbers $(X_1^*, X_2^*, \\cdots, X_n^*)$. \n", "\n", "2. Then using these numbers, we could compute a replica of $\\widehat{\\beta}$ called $\\widehat{\\beta}^*$. \n", "\n", "By repeated use of (1) and (2), many\n", "estimates of $\\widehat{\\beta}$ could have been obtained. The\n", "idea is to use the relative frequency of $\\widehat{\\beta}^*$\n", "(think of a histogram) as an estimate of $p(\\boldsymbol{t})$.\n", "\n", "\n", "But\n", "unless there is enough information available about the process that\n", "generated $X_1,X_2,\\cdots,X_n$, $p(x)$ is in general\n", "unknown. Therefore, [Efron in 1979](https://projecteuclid.org/euclid.aos/1176344552) asked the\n", "question: What if we replace $p(x)$ by the relative frequency\n", "of the observation $X_i$; if we draw observations in accordance with\n", "the relative frequency of the observations, will we obtain the same\n", "result in some asymptotic sense? The answer is yes.\n", "\n", "\n", "Instead of generating the histogram for the relative\n", "frequency of the observation $X_i$, just draw the values\n", "$(X_1^*,X_2^*,\\cdots,X_n^*)$ with replacement from the vector\n", "$\\boldsymbol{X}$. \n", "\n", "\n", "The independent bootstrap works like this: \n", "\n", "1. Draw with replacement $n$ numbers for the observed variables $\\boldsymbol{x} = (x_1,x_2,\\cdots,x_n)$. \n", "\n", "2. Define a vector $\\boldsymbol{x}^*$ containing the values which were drawn from $\\boldsymbol{x}$. \n", "\n", "3. Using the vector $\\boldsymbol{x}^*$ compute $\\widehat{\\beta}^*$ by evaluating $\\widehat \\beta$ under the observations $\\boldsymbol{x}^*$. \n", "\n", "4. Repeat this process $k$ times. \n", "\n", "When you are done, you can draw a histogram of the relative frequency\n", "of $\\widehat \\beta^*$. This is your estimate of the probability\n", "distribution $p(t)$. Using this probability distribution you can\n", "estimate any statistics thereof. In principle you never draw the\n", "histogram of the relative frequency of $\\widehat{\\beta}^*$. Instead\n", "you use the estimators corresponding to the statistic of interest. For\n", "example, if you are interested in estimating the variance of $\\widehat\n", "\\beta$, apply the etsimator $\\widehat \\sigma^2$ to the values\n", "$\\widehat \\beta^*$.\n", "\n", "Before we proceed however, we need to remind ourselves about a central\n", "theorem in statistics, namely the so-called **central limit theorem**.\n", "This theorem plays a central role in understanding why the Bootstrap\n", "(and other resampling methods) work so well on independent and\n", "identically distributed variables.\n", "\n", "\n", "Suppose we have a PDF $p(x)$ from which we generate a series $N$\n", "of averages $\\langle x_i \\rangle$. Each mean value $\\langle x_i \\rangle$\n", "is viewed as the average of a specific measurement, e.g., throwing \n", "dice 100 times and then taking the average value, or producing a certain\n", "amount of random numbers. \n", "For notational ease, we set $\\langle x_i \\rangle=x_i$ in the discussion\n", "which follows. \n", "\n", "If we compute the mean $z$ of $m$ such mean values $x_i$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "z=\\frac{x_1+x_2+\\dots+x_m}{m},\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "the question we pose is which is the PDF of the new variable $z$.\n", "\n", "\n", "The probability of obtaining an average value $z$ is the product of the \n", "probabilities of obtaining arbitrary individual mean values $x_i$,\n", "but with the constraint that the average is $z$. We can express this through\n", "the following expression" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\tilde{p}(z)=\\int dx_1p(x_1)\\int dx_2p(x_2)\\dots\\int dx_mp(x_m)\n", " \\delta(z-\\frac{x_1+x_2+\\dots+x_m}{m}),\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "where the $\\delta$-function enbodies the constraint that the mean is $z$.\n", "All measurements that lead to each individual $x_i$ are expected to\n", "be independent, which in turn means that we can express $\\tilde{p}$ as the \n", "product of individual $p(x_i)$. The independence assumption is important in the derivation of the central limit theorem.\n", "\n", "\n", "\n", "If we use the integral expression for the $\\delta$-function" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\delta(z-\\frac{x_1+x_2+\\dots+x_m}{m})=\\frac{1}{2\\pi}\\int_{-\\infty}^{\\infty}\n", " dq\\exp{\\left(iq(z-\\frac{x_1+x_2+\\dots+x_m}{m})\\right)},\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and inserting $e^{i\\mu q-i\\mu q}$ where $\\mu$ is the mean value\n", "we arrive at" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\tilde{p}(z)=\\frac{1}{2\\pi}\\int_{-\\infty}^{\\infty}\n", " dq\\exp{\\left(iq(z-\\mu)\\right)}\\left[\\int_{-\\infty}^{\\infty}\n", " dxp(x)\\exp{\\left(iq(\\mu-x)/m\\right)}\\right]^m,\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "with the integral over $x$ resulting in" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\int_{-\\infty}^{\\infty}dxp(x)\\exp{\\left(iq(\\mu-x)/m\\right)}=\n", " \\int_{-\\infty}^{\\infty}dxp(x)\n", " \\left[1+\\frac{iq(\\mu-x)}{m}-\\frac{q^2(\\mu-x)^2}{2m^2}+\\dots\\right].\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The second term on the rhs disappears since this is just the mean and \n", "employing the definition of $\\sigma^2$ we have" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\int_{-\\infty}^{\\infty}dxp(x)e^{\\left(iq(\\mu-x)/m\\right)}=\n", " 1-\\frac{q^2\\sigma^2}{2m^2}+\\dots,\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "resulting in" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\left[\\int_{-\\infty}^{\\infty}dxp(x)\\exp{\\left(iq(\\mu-x)/m\\right)}\\right]^m\\approx\n", " \\left[1-\\frac{q^2\\sigma^2}{2m^2}+\\dots \\right]^m,\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and in the limit $m\\rightarrow \\infty$ we obtain" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\tilde{p}(z)=\\frac{1}{\\sqrt{2\\pi}(\\sigma/\\sqrt{m})}\n", " \\exp{\\left(-\\frac{(z-\\mu)^2}{2(\\sigma/\\sqrt{m})^2}\\right)},\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "which is the normal distribution with variance\n", "$\\sigma^2_m=\\sigma^2/m$, where $\\sigma$ is the variance of the PDF $p(x)$\n", "and $\\mu$ is also the mean of the PDF $p(x)$. \n", "\n", "\n", "Thus, the central limit theorem states that the PDF $\\tilde{p}(z)$ of\n", "the average of $m$ random values corresponding to a PDF $p(x)$ \n", "is a normal distribution whose mean is the \n", "mean value of the PDF $p(x)$ and whose variance is the variance\n", "of the PDF $p(x)$ divided by $m$, the number of values used to compute $z$.\n", "\n", "The central limit theorem leads to the well-known expression for the\n", "standard deviation, given by" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\sigma_m=\n", "\\frac{\\sigma}{\\sqrt{m}}.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The latter is true only if the average value is known exactly. This is obtained in the limit\n", "$m\\rightarrow \\infty$ only. Because the mean and the variance are measured quantities we obtain \n", "the familiar expression in statistics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\sigma_m\\approx \n", "\\frac{\\sigma}{\\sqrt{m-1}}.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In many cases however the above estimate for the standard deviation,\n", "in particular if correlations are strong, may be too simplistic. Keep\n", "in mind that we have assumed that the variables $x$ are independent\n", "and identically distributed. This is obviously not always the\n", "case. For example, the random numbers (or better pseudorandom numbers)\n", "we generate in various calculations do always exhibit some\n", "correlations.\n", "\n", "\n", "\n", "The theorem is satisfied by a large class of PDFs. Note however that for a\n", "finite $m$, it is not always possible to find a closed form /analytic expression for\n", "$\\tilde{p}(x)$.\n", "\n", "\n", "The following code starts with a Gaussian distribution with mean value\n", "$\\mu =100$ and variance $\\sigma=15$. We use this to generate the data\n", "used in the bootstrap analysis. The bootstrap analysis returns a data\n", "set after a given number of bootstrap operations (as many as we have\n", "data points). This data set consists of estimated mean values for each\n", "bootstrap operation. The histogram generated by the bootstrap method\n", "shows that the distribution for these mean values is also a Gaussian,\n", "centered around the mean value $\\mu=100$ but with standard deviation\n", "$\\sigma/\\sqrt{n}$, where $n$ is the number of bootstrap samples (in\n", "this case the same as the number of original data points). The value\n", "of the standard deviation is what we expect from the central limit\n", "theorem." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Bootstrap Statistics :\n", "original bias std. error\n", " 99.8879 15.0782 99.8894 0.149213\n" ] } ], "source": [ "%matplotlib inline\n", "\n", "import numpy as np\n", "from time import time\n", "from scipy.stats import norm\n", "import matplotlib.pyplot as plt\n", "\n", "# Returns mean of bootstrap samples \n", "# Bootstrap algorithm\n", "def bootstrap(data, datapoints):\n", " t = np.zeros(datapoints)\n", " n = len(data)\n", " # non-parametric bootstrap \n", " for i in range(datapoints):\n", " t[i] = np.mean(data[np.random.randint(0,n,n)])\n", " # analysis \n", " print(\"Bootstrap Statistics :\")\n", " print(\"original bias std. error\")\n", " print(\"%8g %8g %14g %15g\" % (np.mean(data), np.std(data),np.mean(t),np.std(t)))\n", " return t\n", "\n", "# We set the mean value to 100 and the standard deviation to 15\n", "mu, sigma = 100, 15\n", "datapoints = 10000\n", "# We generate random numbers according to the normal distribution\n", "x = mu + sigma*np.random.randn(datapoints)\n", "# bootstrap returns the data sample \n", "t = bootstrap(x, datapoints)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that our new variance and from that the standard deviation, agrees with the central limit theorem.\n", "\n", "We plot then the histogram together with a best fit for the data set." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter3_47_0.png" }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# the histogram of the bootstrapped data (normalized data if density = True)\n", "n, binsboot, patches = plt.hist(t, 50, density=True, facecolor='red', alpha=0.75)\n", "# add a 'best fit' line \n", "y = norm.pdf(binsboot, np.mean(t), np.std(t))\n", "lt = plt.plot(binsboot, y, 'b', linewidth=1)\n", "plt.xlabel('x')\n", "plt.ylabel('Probability')\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The bias-variance tradeoff\n", "\n", "\n", "We will discuss the bias-variance tradeoff in the context of\n", "continuous predictions such as regression. However, many of the\n", "intuitions and ideas discussed here also carry over to classification\n", "tasks. Consider a dataset $\\mathcal{L}$ consisting of the data\n", "$\\mathbf{X}_\\mathcal{L}=\\{(y_j, \\boldsymbol{x}_j), j=0\\ldots n-1\\}$. \n", "\n", "Let us assume that the true data is generated from a noisy model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\boldsymbol{y}=f(\\boldsymbol{x}) + \\boldsymbol{\\epsilon}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "where $\\epsilon$ is normally distributed with mean zero and standard deviation $\\sigma^2$.\n", "\n", "In our derivation of the ordinary least squares method we defined then\n", "an approximation to the function $f$ in terms of the parameters\n", "$\\boldsymbol{\\beta}$ and the design matrix $\\boldsymbol{X}$ which embody our model,\n", "that is $\\boldsymbol{\\tilde{y}}=\\boldsymbol{X}\\boldsymbol{\\beta}$. \n", "\n", "Thereafter we found the parameters $\\boldsymbol{\\beta}$ by optimizing the means squared error via the so-called cost function" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "C(\\boldsymbol{X},\\boldsymbol{\\beta}) =\\frac{1}{n}\\sum_{i=0}^{n-1}(y_i-\\tilde{y}_i)^2=\\mathbb{E}\\left[(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}})^2\\right].\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can rewrite this as" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\mathbb{E}\\left[(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}})^2\\right]=\\frac{1}{n}\\sum_i(f_i-\\mathbb{E}\\left[\\boldsymbol{\\tilde{y}}\\right])^2+\\frac{1}{n}\\sum_i(\\tilde{y}_i-\\mathbb{E}\\left[\\boldsymbol{\\tilde{y}}\\right])^2+\\sigma^2.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The three terms represent the square of the bias of the learning\n", "method, which can be thought of as the error caused by the simplifying\n", "assumptions built into the method. The second term represents the\n", "variance of the chosen model and finally the last terms is variance of\n", "the error $\\boldsymbol{\\epsilon}$.\n", "\n", "To derive this equation, we need to recall that the variance of $\\boldsymbol{y}$ and $\\boldsymbol{\\epsilon}$ are both equal to $\\sigma^2$. The mean value of $\\boldsymbol{\\epsilon}$ is by definition equal to zero. Furthermore, the function $f$ is not a stochastics variable, idem for $\\boldsymbol{\\tilde{y}}$.\n", "We use a more compact notation in terms of the expectation value" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\mathbb{E}\\left[(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}})^2\\right]=\\mathbb{E}\\left[(\\boldsymbol{f}+\\boldsymbol{\\epsilon}-\\boldsymbol{\\tilde{y}})^2\\right],\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and adding and subtracting $\\mathbb{E}\\left[\\boldsymbol{\\tilde{y}}\\right]$ we get" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\mathbb{E}\\left[(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}})^2\\right]=\\mathbb{E}\\left[(\\boldsymbol{f}+\\boldsymbol{\\epsilon}-\\boldsymbol{\\tilde{y}}+\\mathbb{E}\\left[\\boldsymbol{\\tilde{y}}\\right]-\\mathbb{E}\\left[\\boldsymbol{\\tilde{y}}\\right])^2\\right],\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "which, using the abovementioned expectation values can be rewritten as" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\mathbb{E}\\left[(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}})^2\\right]=\\mathbb{E}\\left[(\\boldsymbol{y}-\\mathbb{E}\\left[\\boldsymbol{\\tilde{y}}\\right])^2\\right]+\\mathrm{Var}\\left[\\boldsymbol{\\tilde{y}}\\right]+\\sigma^2,\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "that is the rewriting in terms of the so-called bias, the variance of the model $\\boldsymbol{\\tilde{y}}$ and the variance of $\\boldsymbol{\\epsilon}$." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Error: 0.013121574061370796\n", "Bias^2: 0.012073649472576395\n", "Var: 0.0010479245887943952\n", "0.013121574061370796 >= 0.012073649472576395 + 0.0010479245887943952 = 0.01312157406137079\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter3_61_1.png" }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from sklearn.linear_model import LinearRegression, Ridge, Lasso\n", "from sklearn.preprocessing import PolynomialFeatures\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.pipeline import make_pipeline\n", "from sklearn.utils import resample\n", "\n", "np.random.seed(2018)\n", "\n", "n = 500\n", "n_boostraps = 100\n", "degree = 18 # A quite high value, just to show.\n", "noise = 0.1\n", "\n", "# Make data set.\n", "x = np.linspace(-1, 3, n).reshape(-1, 1)\n", "y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2) + np.random.normal(0, 0.1, x.shape)\n", "\n", "# Hold out some test data that is never used in training.\n", "x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)\n", "\n", "# Combine x transformation and model into one operation.\n", "# Not neccesary, but convenient.\n", "model = make_pipeline(PolynomialFeatures(degree=degree), LinearRegression(fit_intercept=False))\n", "\n", "# The following (m x n_bootstraps) matrix holds the column vectors y_pred\n", "# for each bootstrap iteration.\n", "y_pred = np.empty((y_test.shape[0], n_boostraps))\n", "for i in range(n_boostraps):\n", " x_, y_ = resample(x_train, y_train)\n", "\n", " # Evaluate the new model on the same test data each time.\n", " y_pred[:, i] = model.fit(x_, y_).predict(x_test).ravel()\n", "\n", "# Note: Expectations and variances taken w.r.t. different training\n", "# data sets, hence the axis=1. Subsequent means are taken across the test data\n", "# set in order to obtain a total value, but before this we have error/bias/variance\n", "# calculated per data point in the test set.\n", "# Note 2: The use of keepdims=True is important in the calculation of bias as this \n", "# maintains the column vector form. Dropping this yields very unexpected results.\n", "error = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )\n", "bias = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )\n", "variance = np.mean( np.var(y_pred, axis=1, keepdims=True) )\n", "print('Error:', error)\n", "print('Bias^2:', bias)\n", "print('Var:', variance)\n", "print('{} >= {} + {} = {}'.format(error, bias, variance, bias+variance))\n", "\n", "plt.plot(x[::5, :], y[::5, :], label='f(x)')\n", "plt.scatter(x_test, y_test, label='Data points')\n", "plt.scatter(x_test, np.mean(y_pred, axis=1), label='Pred')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Polynomial degree: 0\n", "Error: 0.32149601703519115\n", "Bias^2: 0.3123314713548606\n", "Var: 0.009164545680330616\n", "0.32149601703519115 >= 0.3123314713548606 + 0.009164545680330616 = 0.3214960170351912\n", "Polynomial degree: 1\n", "Error: 0.08426840630693412\n", "Bias^2: 0.0796891867672603\n", "Var: 0.004579219539673834\n", "0.08426840630693412 >= 0.0796891867672603 + 0.004579219539673834 = 0.08426840630693413\n", "Polynomial degree: 2\n", "Error: 0.10398646080125037\n", "Bias^2: 0.10077114273548984\n", "Var: 0.0032153180657605125\n", "0.10398646080125037 >= 0.10077114273548984 + 0.0032153180657605125 = 0.10398646080125036\n", "Polynomial degree: 3\n", "Error: 0.06547790180152352\n", "Bias^2: 0.06208238634231944\n", "Var: 0.003395515459204093\n", "0.06547790180152352 >= 0.06208238634231944 + 0.003395515459204093 = 0.06547790180152353\n", "Polynomial degree: 4\n", "Error: 0.06844519414009442\n", "Bias^2: 0.06453579006728322\n", "Var: 0.003909404072811217\n", "0.06844519414009442 >= 0.06453579006728322 + 0.003909404072811217 = 0.06844519414009444\n", "Polynomial degree: 5\n", "Error: 0.052279218012057004\n", "Bias^2: 0.048187277304303056\n", "Var: 0.004091940707753948\n", "0.052279218012057004 >= 0.048187277304303056 + 0.004091940707753948 = 0.052279218012057004\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Polynomial degree: 6\n", "Error: 0.037813671417388985\n", "Bias^2: 0.033657685071527624\n", "Var: 0.004155986345861364\n", "0.037813671417388985 >= 0.033657685071527624 + 0.004155986345861364 = 0.03781367141738899\n", "Polynomial degree: 7\n", "Error: 0.027609773491022407\n", "Bias^2: 0.0229994982603662\n", "Var: 0.004610275230656187\n", "0.027609773491022407 >= 0.0229994982603662 + 0.004610275230656187 = 0.027609773491022387\n", "Polynomial degree: 8\n", "Error: 0.017355848195593354\n", "Bias^2: 0.010331721306655144\n", "Var: 0.0070241268889382116\n", "0.017355848195593354 >= 0.010331721306655144 + 0.0070241268889382116 = 0.017355848195593354\n", "Polynomial degree:" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 9\n", "Error: 0.026605727637184613\n", "Bias^2: 0.010018312644139205\n", "Var: 0.016587414993045405\n", "0.026605727637184613 >= 0.010018312644139205 + 0.016587414993045405 = 0.02660572763718461\n", "Polynomial degree: 10\n", "Error: 0.021592704588021167\n", "Bias^2: 0.010516485576646513\n", "Var: 0.01107621901137465\n", "0.021592704588021167 >= 0.010516485576646513 + 0.01107621901137465 = 0.021592704588021164\n", "Polynomial degree: 11\n", "Error: 0.07160048164232467\n", "Bias^2: 0.014436800088896274\n", "Var: 0.057163681553428394\n", "0.07160048164232467 >= 0.014436800088896274 + 0.057163681553428394 = 0.07160048164232467\n", "Polynomial degree: 12\n", "Error: 0.11547777218875695\n", "Bias^2: 0.016285782696017055\n", "Var: 0.0991919894927399\n", "0.11547777218875695 >= 0.016285782696017055 + 0.0991919894927399 = 0.11547777218875696\n", "Polynomial degree: 13\n", "Error: 0.2284246870217459\n", "Bias^2: 0.019754165271682844\n", "Var: 0.20867052175006306\n", "0.2284246870217459 >= 0.019754165271682844 + 0.20867052175006306 = 0.2284246870217459\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter3_62_3.png" }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from sklearn.linear_model import LinearRegression, Ridge, Lasso\n", "from sklearn.preprocessing import PolynomialFeatures\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.pipeline import make_pipeline\n", "from sklearn.utils import resample\n", "\n", "np.random.seed(2018)\n", "\n", "n = 40\n", "n_boostraps = 100\n", "maxdegree = 14\n", "\n", "\n", "# Make data set.\n", "x = np.linspace(-3, 3, n).reshape(-1, 1)\n", "y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)\n", "error = np.zeros(maxdegree)\n", "bias = np.zeros(maxdegree)\n", "variance = np.zeros(maxdegree)\n", "polydegree = np.zeros(maxdegree)\n", "x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)\n", "\n", "for degree in range(maxdegree):\n", " model = make_pipeline(PolynomialFeatures(degree=degree), LinearRegression(fit_intercept=False))\n", " y_pred = np.empty((y_test.shape[0], n_boostraps))\n", " for i in range(n_boostraps):\n", " x_, y_ = resample(x_train, y_train)\n", " y_pred[:, i] = model.fit(x_, y_).predict(x_test).ravel()\n", "\n", " polydegree[degree] = degree\n", " error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )\n", " bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )\n", " variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )\n", " print('Polynomial degree:', degree)\n", " print('Error:', error[degree])\n", " print('Bias^2:', bias[degree])\n", " print('Var:', variance[degree])\n", " print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))\n", "\n", "plt.plot(polydegree, error, label='Error')\n", "plt.plot(polydegree, bias, label='bias')\n", "plt.plot(polydegree, variance, label='Variance')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The bias-variance tradeoff summarizes the fundamental tension in\n", "machine learning, particularly supervised learning, between the\n", "complexity of a model and the amount of training data needed to train\n", "it. Since data is often limited, in practice it is often useful to\n", "use a less-complex model with higher bias, that is a model whose asymptotic\n", "performance is worse than another model because it is easier to\n", "train and less sensitive to sampling noise arising from having a\n", "finite-sized training dataset (smaller variance). \n", "\n", "\n", "\n", "The above equations tell us that in\n", "order to minimize the expected test error, we need to select a\n", "statistical learning method that simultaneously achieves low variance\n", "and low bias. Note that variance is inherently a nonnegative quantity,\n", "and squared bias is also nonnegative. Hence, we see that the expected\n", "test MSE can never lie below $Var(\\epsilon)$, the irreducible error.\n", "\n", "\n", "What do we mean by the variance and bias of a statistical learning\n", "method? The variance refers to the amount by which our model would change if we\n", "estimated it using a different training data set. Since the training\n", "data are used to fit the statistical learning method, different\n", "training data sets will result in a different estimate. But ideally the\n", "estimate for our model should not vary too much between training\n", "sets. However, if a method has high variance then small changes in\n", "the training data can result in large changes in the model. In general, more\n", "flexible statistical methods have higher variance.\n", "\n", "\n", "You may also find this recent [article](https://www.pnas.org/content/116/32/15849) of interest." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "============================\n", "Underfitting vs. Overfitting\n", "============================\n", "\n", "This example demonstrates the problems of underfitting and overfitting and\n", "how we can use linear regression with polynomial features to approximate\n", "nonlinear functions. The plot shows the function that we want to approximate,\n", "which is a part of the cosine function. In addition, the samples from the\n", "real function and the approximations of different models are displayed. The\n", "models have polynomial features of different degrees. We can see that a\n", "linear function (polynomial with degree 1) is not sufficient to fit the\n", "training samples. This is called **underfitting**. A polynomial of degree 4\n", "approximates the true function almost perfectly. However, for higher degrees\n", "the model will **overfit** the training data, i.e. it learns the noise of the\n", "training data.\n", "We evaluate quantitatively **overfitting** / **underfitting** by using\n", "cross-validation. We calculate the mean squared error (MSE) on the validation\n", "set, the higher, the less likely the model generalizes correctly from the\n", "training data.\n", "\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter3_64_1.png" } }, "output_type": "display_data" } ], "source": [ "\"\"\"\n", "============================\n", "Underfitting vs. Overfitting\n", "============================\n", "\n", "This example demonstrates the problems of underfitting and overfitting and\n", "how we can use linear regression with polynomial features to approximate\n", "nonlinear functions. The plot shows the function that we want to approximate,\n", "which is a part of the cosine function. In addition, the samples from the\n", "real function and the approximations of different models are displayed. The\n", "models have polynomial features of different degrees. We can see that a\n", "linear function (polynomial with degree 1) is not sufficient to fit the\n", "training samples. This is called **underfitting**. A polynomial of degree 4\n", "approximates the true function almost perfectly. However, for higher degrees\n", "the model will **overfit** the training data, i.e. it learns the noise of the\n", "training data.\n", "We evaluate quantitatively **overfitting** / **underfitting** by using\n", "cross-validation. We calculate the mean squared error (MSE) on the validation\n", "set, the higher, the less likely the model generalizes correctly from the\n", "training data.\n", "\"\"\"\n", "\n", "print(__doc__)\n", "\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.preprocessing import PolynomialFeatures\n", "from sklearn.linear_model import LinearRegression\n", "from sklearn.model_selection import cross_val_score\n", "\n", "\n", "def true_fun(X):\n", " return np.cos(1.5 * np.pi * X)\n", "\n", "np.random.seed(0)\n", "\n", "n_samples = 30\n", "degrees = [1, 4, 15]\n", "\n", "X = np.sort(np.random.rand(n_samples))\n", "y = true_fun(X) + np.random.randn(n_samples) * 0.1\n", "\n", "plt.figure(figsize=(14, 5))\n", "for i in range(len(degrees)):\n", " ax = plt.subplot(1, len(degrees), i + 1)\n", " plt.setp(ax, xticks=(), yticks=())\n", "\n", " polynomial_features = PolynomialFeatures(degree=degrees[i],\n", " include_bias=False)\n", " linear_regression = LinearRegression()\n", " pipeline = Pipeline([(\"polynomial_features\", polynomial_features),\n", " (\"linear_regression\", linear_regression)])\n", " pipeline.fit(X[:, np.newaxis], y)\n", "\n", " # Evaluate the models using crossvalidation\n", " scores = cross_val_score(pipeline, X[:, np.newaxis], y,\n", " scoring=\"neg_mean_squared_error\", cv=10)\n", "\n", " X_test = np.linspace(0, 1, 100)\n", " plt.plot(X_test, pipeline.predict(X_test[:, np.newaxis]), label=\"Model\")\n", " plt.plot(X_test, true_fun(X_test), label=\"True function\")\n", " plt.scatter(X, y, edgecolor='b', s=20, label=\"Samples\")\n", " plt.xlabel(\"x\")\n", " plt.ylabel(\"y\")\n", " plt.xlim((0, 1))\n", " plt.ylim((-2, 2))\n", " plt.legend(loc=\"best\")\n", " plt.title(\"Degree {}\\nMSE = {:.2e}(+/- {:.2e})\".format(\n", " degrees[i], -scores.mean(), scores.std()))\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Degree of polynomial: 1\n", "Mean squared error on training data: 439230.69504801\n", "Mean squared error on test data: 481979.17861098\n", "Degree of polynomial: 2\n", "Mean squared error on training data: 115822.95008046\n", "Mean squared error on test data: 123711.53703498\n", "Degree of polynomial: 3\n", "Mean squared error on training data: 9011.85263220\n", "Mean squared error on test data: 10913.84780262\n", "Degree of polynomial: 4\n", "Mean squared error on training data: 303.47610036\n", "Mean squared error on test data: 426.30787294\n", "Degree of polynomial: 5\n", "Mean squared error on training data: 3.80354994\n", "Mean squared error on test data: 5.98822371\n", "Degree of polynomial: 6\n", "Mean squared error on training data: 3.66204648\n", "Mean squared error on test data: 8.14812206\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Degree of polynomial: 7\n", "Mean squared error on training data: 0.47075725\n", "Mean squared error on test data: 2.00607783\n", "Degree of polynomial: 8\n", "Mean squared error on training data: 0.04912436\n", "Mean squared error on test data: 0.21596432\n", "Degree of polynomial: 9\n", "Mean squared error on training data: 0.02522069\n", "Mean squared error on test data: 0.08576932\n", "Degree of polynomial: 10\n", "Mean squared error on training data: 0.02511518\n", "Mean squared error on test data: 1.20015436\n", "Degree of polynomial: 11\n", "Mean squared error on training data: 0.01640891\n", "Mean squared error on test data: 1.35533773\n", "Degree of polynomial: 12\n", "Mean squared error on training data: 0.00813803\n", "Mean squared error on test data: 0.17446471\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Degree of polynomial: 13\n", "Mean squared error on training data: 0.00759119\n", "Mean squared error on test data: 1.08131003\n", "Degree of polynomial: 14\n", "Mean squared error on training data: 0.00472199\n", "Mean squared error on test data: 0.81333804\n", "Degree of polynomial: 15\n", "Mean squared error on training data: 0.00410478\n", "Mean squared error on test data: 92.09172408\n", "Degree of polynomial: 16\n", "Mean squared error on training data: 0.00315593\n", "Mean squared error on test data: 234.38533184\n", "Degree of polynomial: 17\n", "Mean squared error on training data: 0.00242999\n", "Mean squared error on test data: 1271.35771842\n", "Degree of polynomial: 18\n", "Mean squared error on training data: 0.00228741\n", "Mean squared error on test data: 108.27092897\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Degree of polynomial: 19\n", "Mean squared error on training data: 0.00156382\n", "Mean squared error on test data: 1371.99049330\n", "Degree of polynomial: 20\n", "Mean squared error on training data: 0.00137823\n", "Mean squared error on test data: 1887.85953586\n", "Degree of polynomial: 21\n", "Mean squared error on training data: 0.00118504\n", "Mean squared error on test data: 14859.70127680\n", "Degree of polynomial: 22\n", "Mean squared error on training data: 0.00092645\n", "Mean squared error on test data: 876.51214899\n", "Degree of polynomial: 23\n", "Mean squared error on training data: 0.00085883\n", "Mean squared error on test data: 5594.60685864\n", "Degree of polynomial: 24\n", "Mean squared error on training data: 0.00084711\n", "Mean squared error on test data: 1277.60619654\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Degree of polynomial: 25\n", "Mean squared error on training data: 0.00079130\n", "Mean squared error on test data: 128664.09744272\n", "Degree of polynomial: 26\n", "Mean squared error on training data: 0.00076919\n", "Mean squared error on test data: 19003.95079764\n", "Degree of polynomial: 27\n", "Mean squared error on training data: 0.00068941\n", "Mean squared error on test data: 2379.66226149\n", "Degree of polynomial: 28\n", "Mean squared error on training data: 0.00062582\n", "Mean squared error on test data: 4082.19994371\n", "Degree of polynomial: 29\n", "Mean squared error on training data: 0.00060708\n", "Mean squared error on test data: 3250.24770094\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ ":73: RuntimeWarning: divide by zero encountered in log10\n", " plt.plot(polynomial, np.log10(trainingerror), label='Training Error')\n", ":74: RuntimeWarning: divide by zero encountered in log10\n", " plt.plot(polynomial, np.log10(testerror), label='Test Error')\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter3_65_6.png" }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Common imports\n", "import os\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from sklearn.linear_model import LinearRegression, Ridge, Lasso\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.utils import resample\n", "from sklearn.metrics import mean_squared_error\n", "# Where to save the figures and data files\n", "PROJECT_ROOT_DIR = \"Results\"\n", "FIGURE_ID = \"Results/FigureFiles\"\n", "DATA_ID = \"DataFiles/\"\n", "\n", "if not os.path.exists(PROJECT_ROOT_DIR):\n", " os.mkdir(PROJECT_ROOT_DIR)\n", "\n", "if not os.path.exists(FIGURE_ID):\n", " os.makedirs(FIGURE_ID)\n", "\n", "if not os.path.exists(DATA_ID):\n", " os.makedirs(DATA_ID)\n", "\n", "def image_path(fig_id):\n", " return os.path.join(FIGURE_ID, fig_id)\n", "\n", "def data_path(dat_id):\n", " return os.path.join(DATA_ID, dat_id)\n", "\n", "def save_fig(fig_id):\n", " plt.savefig(image_path(fig_id) + \".png\", format='png')\n", "\n", "infile = open(data_path(\"EoS.csv\"),'r')\n", "\n", "# Read the EoS data as csv file and organize the data into two arrays with density and energies\n", "EoS = pd.read_csv(infile, names=('Density', 'Energy'))\n", "EoS['Energy'] = pd.to_numeric(EoS['Energy'], errors='coerce')\n", "EoS = EoS.dropna()\n", "Energies = EoS['Energy']\n", "Density = EoS['Density']\n", "# The design matrix now as function of various polytrops\n", "\n", "Maxpolydegree = 30\n", "X = np.zeros((len(Density),Maxpolydegree))\n", "X[:,0] = 1.0\n", "testerror = np.zeros(Maxpolydegree)\n", "trainingerror = np.zeros(Maxpolydegree)\n", "polynomial = np.zeros(Maxpolydegree)\n", "\n", "trials = 100\n", "for polydegree in range(1, Maxpolydegree):\n", " polynomial[polydegree] = polydegree\n", " for degree in range(polydegree):\n", " X[:,degree] = Density**(degree/3.0)\n", "\n", "# loop over trials in order to estimate the expectation value of the MSE\n", " testerror[polydegree] = 0.0\n", " trainingerror[polydegree] = 0.0\n", " for samples in range(trials):\n", " x_train, x_test, y_train, y_test = train_test_split(X, Energies, test_size=0.2)\n", " model = LinearRegression(fit_intercept=False).fit(x_train, y_train)\n", " ypred = model.predict(x_train)\n", " ytilde = model.predict(x_test)\n", " testerror[polydegree] += mean_squared_error(y_test, ytilde)\n", " trainingerror[polydegree] += mean_squared_error(y_train, ypred) \n", "\n", " testerror[polydegree] /= trials\n", " trainingerror[polydegree] /= trials\n", " print(\"Degree of polynomial: %3d\"% polynomial[polydegree])\n", " print(\"Mean squared error on training data: %.8f\" % trainingerror[polydegree])\n", " print(\"Mean squared error on test data: %.8f\" % testerror[polydegree])\n", "\n", "plt.plot(polynomial, np.log10(trainingerror), label='Training Error')\n", "plt.plot(polynomial, np.log10(testerror), label='Test Error')\n", "plt.xlabel('Polynomial degree')\n", "plt.ylabel('log10[MSE]')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Cross-validation\n", "\n", "When the repetitive splitting of the data set is done randomly,\n", "samples may accidently end up in a fast majority of the splits in\n", "either training or test set. Such samples may have an unbalanced\n", "influence on either model building or prediction evaluation. To avoid\n", "this $k$-fold cross-validation structures the data splitting. The\n", "samples are divided into $k$ more or less equally sized exhaustive and\n", "mutually exclusive subsets. In turn (at each split) one of these\n", "subsets plays the role of the test set while the union of the\n", "remaining subsets constitutes the training set. Such a splitting\n", "warrants a balanced representation of each sample in both training and\n", "test set over the splits. Still the division into the $k$ subsets\n", "involves a degree of randomness. This may be fully excluded when\n", "choosing $k=n$. This particular case is referred to as leave-one-out\n", "cross-validation (LOOCV). \n", "\n", "\n", "* Define a range of interest for the penalty parameter.\n", "\n", "* Divide the data set into training and test set comprising samples $\\{1, \\ldots, n\\} \\setminus i$ and $\\{ i \\}$, respectively.\n", "\n", "* Fit the linear regression model by means of ridge estimation for each $\\lambda$ in the grid using the training set, and the corresponding estimate of the error variance $\\boldsymbol{\\sigma}_{-i}^2(\\lambda)$, as" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\begin{align*}\n", "\\boldsymbol{\\beta}_{-i}(\\lambda) & = ( \\boldsymbol{X}_{-i, \\ast}^{T}\n", "\\boldsymbol{X}_{-i, \\ast} + \\lambda \\boldsymbol{I}_{pp})^{-1}\n", "\\boldsymbol{X}_{-i, \\ast}^{T} \\boldsymbol{y}_{-i}\n", "\\end{align*}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Evaluate the prediction performance of these models on the test set by $\\log\\{L[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", "* Repeat the first three steps such that each sample plays the role of the test set once.\n", "\n", "* Average the prediction performances of the test sets at each grid point of the penalty bias/parameter. It is an estimate of the prediction performance of the model corresponding to this value of the penalty parameter on novel data. It is defined as" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\begin{align*}\n", "\\frac{1}{n} \\sum_{i = 1}^n \\log\\{L[y_i, \\mathbf{X}_{i, \\ast}; \\boldsymbol{\\beta}_{-i}(\\lambda), \\boldsymbol{\\sigma}_{-i}^2(\\lambda)]\\}.\n", "\\end{align*}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For the various values of $k$\n", "\n", "1. shuffle the dataset randomly.\n", "\n", "2. Split the dataset into $k$ groups.\n", "\n", "3. For each unique group:\n", "\n", "a. Decide which group to use as set for test data\n", "\n", "b. Take the remaining groups as a training data set\n", "\n", "c. Fit a model on the training set and evaluate it on the test set\n", "\n", "d. Retain the evaluation score and discard the model\n", "\n", "\n", "5. Summarize the model using the sample of model evaluation scores\n", "\n", "The code here uses Ridge regression with cross-validation (CV) resampling and $k$-fold CV in order to fit a specific polynomial." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXgAAAEGCAYAAABvtY4XAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAA3pklEQVR4nO3dd3hU1dbH8e9KIwkJhBRqQAIEIUBCBwEpgiCIiuIFRBTQKyoq9mu7dq9iuRa8iqIiiihFURFQQDpKCy303kNJKIE0Uma/fyTwIiSQxJw5M5P1eZ48kJkze/+GkJWdffbZR4wxKKWU8jxedgdQSillDS3wSinlobTAK6WUh9ICr5RSHkoLvFJKeSgfuwOcLzw83NSuXdvuGEop5TZWrVqVbIyJKOg5lyrwtWvXJj4+3u4YSinlNkRkb2HP6RSNUkp5KC3wSinlobTAK6WUh3KpOfiCZGdnc+DAATIzM+2OokrA39+fyMhIfH197Y6iVJnj8gX+wIEDBAcHU7t2bUTE7jiqGIwxHDt2jAMHDhAVFWV3HKXKHJefosnMzCQsLEyLuxsSEcLCwvS3L6Vs4vIFHtDi7sb0a6eUfVx+ikYp5VoOr9/G3i+/w5w6Rblb+tC0Zwf9Qe6itMArpYrEOBwsH/YkzcZ9SNXcbACGpASTecCH//ZrSo2QAJsTqgu5xRSNurw9e/bQuHFju2MoD2UcDpb3GUzbL95lY4uOHFyZQPrxk3R7eBAbD55i/F3/JnH1RrtjqgvoCP5vysnJwcen7P0zltX3XVZNWLaXPal+OG4eylXff4545Y0NB3WoSIsQb6q+04+TS38kY/M6AkKCbU6rznKr79CXf9nIpsRTpdpmTPUKvHhDo0se8/XXX/POO+8gIsTGxuLt7U1oaChr1qyhefPm3HHHHdx3332kp6dTt25dxo4dS6VKlRg1ahSffPIJPj4+xMTEMHHiRBYuXMjDDz8M5J2AXLRoEcHBF39D9O/fn8GDB9OrVy8AhgwZwg033ECLFi244447SEtLA+B///sf7dq1u+z73LhxI0OHDiUrKwuHw8EPP/xAdHT0Re9t/Pjx7N27l7vuuoukpCQiIiL48ssvqVWrFkOGDPnL+x4+fDgPPPAASUlJBAYG8tlnn9GgQYPifgmUi9uZlMprv26h1e3DeHZoa8Trr/PtDRtHsf7Dz2hyd3+W97+bNrMm25RUXcjSAi8iDwP3AAJ8Zox538r+rLBx40b+85//8McffxAeHs7x48d57LHH2LZtG7///jve3t7Exsby4Ycf0qlTJ1544QVefvll3n//fUaOHMnu3bspV64cJ0+eBOCdd97ho48+on379qSmpuLv719gvwMGDGDSpEn06tWLrKws5s6dy+jRozHGMGfOHPz9/dm+fTu33XZbkTZo++STT3j44Ye5/fbbycrKIjc3t8D3BvDggw9y5513MnjwYMaOHcuIESP46aefAP7yvrt27conn3xCdHQ0y5cvZ/jw4cybN69U/t2V69h/6yB6R8Tw5JMv4OVV8MnUJnf1Y9n0X2n74zi2/DSbBn26OzmlKpAxxpIPoDGwAQgk7wfJ70D0pV7TokULc6FNmzZd9JgzjRo1yjz77LN/eWzw4MFm3LhxxhhjTp48aWrWrHnuuR07dphmzZoZY4zp0aOH6du3rxk/frw5ffq0McaYN954w7Ru3dp88MEHZv/+/YX2m5GRYSIjI01mZqb56aefzMCBA8/1N2jQINO4cWMTFxdnAgICjDHG7N692zRq1KjQ9iZMmGBiYmLMyJEjzbZt2wp9b8YYExYWZrKysowxxmRlZZmwsLCL3vfp06eNv7+/iYuLO/fRoEGDAvu2+2uoSm79Vz8YA2bp/U9f9tjTScfN0eBQs61WA5ObneOEdMoYY4B4U0hNtfIka0NgmTEm3RiTAywEbrawP0sYYwpcAla+fPnLvnbGjBk88MADrFq1ihYtWpCTk8PTTz/N559/TkZGBm3btmXLli0Fvtbf35/OnTsza9YsJk2axIABAwB47733qFKlCuvWrSM+Pp6srKwivY+BAwcybdo0AgIC6NGjB/PmzSv0vV3o/GPOvm+Hw0FISAhr164997F58+YiZVHuw+fllzgcUpmmb/77sscGhVdi66vvMrLVP5iz5agT0qnLsbLAbwA6ikiYiAQCvYCaFx4kIsNEJF5E4pOSkiyMUzJdu3Zl8uTJHDt2DODcNMZZFStWpFKlSixevBiA8ePH06lTJxwOB/v376dLly689dZbnDx5ktTUVHbu3EmTJk146qmnaNmyZaEFHvKmab788ksWL15Mjx49AEhJSaFatWp4eXkxfvx4cnNzi/Q+du3aRZ06dRgxYgQ33ngjCQkJhb63du3aMXHiRAAmTJhA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\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter3_71_0.png" }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from sklearn.model_selection import KFold\n", "from sklearn.linear_model import Ridge\n", "from sklearn.model_selection import cross_val_score\n", "from sklearn.preprocessing import PolynomialFeatures\n", "\n", "# A seed just to ensure that the random numbers are the same for every run.\n", "# Useful for eventual debugging.\n", "np.random.seed(3155)\n", "\n", "# Generate the data.\n", "nsamples = 100\n", "x = 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 = 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 = 5\n", "kfold = KFold(n_splits = k)\n", "\n", "# Perform the cross-validation to estimate MSE\n", "scores_KFold = np.zeros((nlambdas, k))\n", "\n", "i = 0\n", "for lmb in lambdas:\n", " ridge = Ridge(alpha = lmb)\n", " j = 0\n", " for train_inds, test_inds in kfold.split(x):\n", " xtrain = x[train_inds]\n", " ytrain = y[train_inds]\n", "\n", " xtest = x[test_inds]\n", " ytest = y[test_inds]\n", "\n", " Xtrain = poly.fit_transform(xtrain[:, np.newaxis])\n", " ridge.fit(Xtrain, ytrain[:, np.newaxis])\n", "\n", " Xtest = poly.fit_transform(xtest[:, np.newaxis])\n", " ypred = ridge.predict(Xtest)\n", "\n", " scores_KFold[i,j] = np.sum((ypred - ytest[:, np.newaxis])**2)/np.size(ypred)\n", "\n", " j += 1\n", " i += 1\n", "\n", "\n", "estimated_mse_KFold = np.mean(scores_KFold, axis = 1)\n", "\n", "## Cross-validation using cross_val_score from sklearn along with KFold\n", "\n", "# kfold is an instance initialized above as:\n", "# kfold = KFold(n_splits = k)\n", "\n", "estimated_mse_sklearn = np.zeros(nlambdas)\n", "i = 0\n", "for lmb in lambdas:\n", " ridge = Ridge(alpha = lmb)\n", "\n", " X = poly.fit_transform(x[:, np.newaxis])\n", " estimated_mse_folds = cross_val_score(ridge, X, y[:, np.newaxis], scoring='neg_mean_squared_error', cv=kfold)\n", "\n", " # cross_val_score return an array containing the estimated negative mse for every fold.\n", " # we have to the the mean of every array in order to get an estimate of the mse of the model\n", " estimated_mse_sklearn[i] = np.mean(-estimated_mse_folds)\n", "\n", " i += 1\n", "\n", "## Plot and compare the slightly different ways to perform cross-validation\n", "\n", "plt.figure()\n", "\n", "plt.plot(np.log10(lambdas), estimated_mse_sklearn, label = 'cross_val_score')\n", "plt.plot(np.log10(lambdas), estimated_mse_KFold, 'r--', label = 'KFold')\n", "\n", "plt.xlabel('log10(lambda)')\n", "plt.ylabel('mse')\n", "\n", "plt.legend()\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "More examples of the application of cross-validation follow here." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":63: RuntimeWarning: divide by zero encountered in log10\n", " plt.plot(polynomial, np.log10(estimated_mse_sklearn), label='Test Error')\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter3_73_1.png" }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Common imports\n", "import os\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from sklearn.linear_model import LinearRegression, Ridge, Lasso\n", "from sklearn.metrics import mean_squared_error\n", "from sklearn.model_selection import KFold\n", "from sklearn.model_selection import cross_val_score\n", "\n", "\n", "# Where to save the figures and data files\n", "PROJECT_ROOT_DIR = \"Results\"\n", "FIGURE_ID = \"Results/FigureFiles\"\n", "DATA_ID = \"DataFiles/\"\n", "\n", "if not os.path.exists(PROJECT_ROOT_DIR):\n", " os.mkdir(PROJECT_ROOT_DIR)\n", "\n", "if not os.path.exists(FIGURE_ID):\n", " os.makedirs(FIGURE_ID)\n", "\n", "if not os.path.exists(DATA_ID):\n", " os.makedirs(DATA_ID)\n", "\n", "def image_path(fig_id):\n", " return os.path.join(FIGURE_ID, fig_id)\n", "\n", "def data_path(dat_id):\n", " return os.path.join(DATA_ID, dat_id)\n", "\n", "def save_fig(fig_id):\n", " plt.savefig(image_path(fig_id) + \".png\", format='png')\n", "\n", "infile = open(data_path(\"EoS.csv\"),'r')\n", "\n", "# Read the EoS data as csv file and organize the data into two arrays with density and energies\n", "EoS = pd.read_csv(infile, names=('Density', 'Energy'))\n", "EoS['Energy'] = pd.to_numeric(EoS['Energy'], errors='coerce')\n", "EoS = EoS.dropna()\n", "Energies = EoS['Energy']\n", "Density = EoS['Density']\n", "# The design matrix now as function of various polytrops\n", "\n", "Maxpolydegree = 30\n", "X = np.zeros((len(Density),Maxpolydegree))\n", "X[:,0] = 1.0\n", "estimated_mse_sklearn = np.zeros(Maxpolydegree)\n", "polynomial = np.zeros(Maxpolydegree)\n", "k =5\n", "kfold = KFold(n_splits = k)\n", "\n", "for polydegree in range(1, Maxpolydegree):\n", " polynomial[polydegree] = polydegree\n", " for degree in range(polydegree):\n", " X[:,degree] = Density**(degree/3.0)\n", " OLS = LinearRegression(fit_intercept=False)\n", "# loop over trials in order to estimate the expectation value of the MSE\n", " estimated_mse_folds = cross_val_score(OLS, X, Energies, scoring='neg_mean_squared_error', cv=kfold)\n", "#[:, np.newaxis]\n", " estimated_mse_sklearn[polydegree] = np.mean(-estimated_mse_folds)\n", "\n", "plt.plot(polynomial, np.log10(estimated_mse_sklearn), label='Test Error')\n", "plt.xlabel('Polynomial degree')\n", "plt.ylabel('log10[MSE]')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that we have kept the intercept in the first column of design matrix $\\boldsymbol{X}$. When we call the corresponding **Scikit-Learn** function we need thus to set the intercept to **False**. Libraries like **Scikit-Learn** normally scale the design matrix and does not fit intercept. See the discussions below.\n", "\n", "## More on Rescaling data\n", "\n", "We end this chapter by adding some words on scaling and how to deal with the intercept for regression cases.\n", "\n", "When you are comparing your own code with for example **Scikit-Learn**'s\n", "library, there are some technicalities to keep in mind. The examples\n", "here demonstrate some of these aspects with potential pitfalls.\n", "\n", "The discussion here focuses on the role of the intercept, how we can\n", "set up the design matrix, what scaling we should use and other topics\n", "which tend confuse us.\n", "\n", "The intercept can be interpreted as the expected value of our\n", "target/output variables when all other predictors are set to zero.\n", "Thus, if we cannot assume that the expected outputs/targets are zero\n", "when all predictors are zero (the columns in the design matrix), it\n", "may be a bad idea to implement a model which penalizes the intercept.\n", "Furthermore, in for example Ridge and Lasso regression, the default solutions\n", "from the library **Scikit-Learn** (when not shrinking $\\beta_0$) for the unknown parameters\n", "$\\boldsymbol{\\beta}$, are derived under the assumption that both $\\boldsymbol{y}$ and\n", "$\\boldsymbol{X}$ are zero centered, that is we subtract the mean values.\n", "\n", "\n", "If our predictors represent different scales, then it is important to\n", "standardize the design matrix $\\boldsymbol{X}$ by subtracting the mean of each\n", "column from the corresponding column and dividing the column with its\n", "standard deviation. Most machine learning libraries do this as a default. This means that if you compare your code with the results from a given library,\n", "the results may differ. \n", "\n", "The\n", "[Standardscaler](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html)\n", "function in **Scikit-Learn** does this for us. For the data sets we\n", "have been studying in our various examples, the data are in many cases\n", "already scaled and there is no need to scale them. You as a user of different machine learning algorithms, should always perform a\n", "survey of your data, with a critical assessment of them in case you need to scale the data.\n", "\n", "If you need to scale the data, not doing so will give an *unfair*\n", "penalization of the parameters since their magnitude depends on the\n", "scale of their corresponding predictor.\n", "\n", "Suppose as an example that you \n", "you have an input variable given by the heights of different persons.\n", "Human height might be measured in inches or meters or\n", "kilometers. If measured in kilometers, a standard linear regression\n", "model with this predictor would probably give a much bigger\n", "coefficient term, than if measured in millimeters.\n", "This can clearly lead to problems in evaluating the cost/loss functions.\n", "\n", "\n", "\n", "Keep in mind that when you transform your data set before training a model, the same transformation needs to be done\n", "on your eventual new data set before making a prediction. If we translate this into a Python code, it would could be implemented as follows" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "data": { "text/plain": [ "'\\n#Model training, we compute the mean value of y and X\\ny_train_mean = np.mean(y_train)\\nX_train_mean = np.mean(X_train,axis=0)\\nX_train = X_train - X_train_mean\\ny_train = y_train - y_train_mean\\n\\n# The we fit our model with the training data\\ntrained_model = some_model.fit(X_train,y_train)\\n\\n\\n#Model prediction, we need also to transform our data set used for the prediction.\\nX_test = X_test - X_train_mean #Use mean from training data\\ny_pred = trained_model(X_test)\\ny_pred = y_pred + y_train_mean\\n'" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"\"\"\n", "#Model training, we compute the mean value of y and X\n", "y_train_mean = np.mean(y_train)\n", "X_train_mean = np.mean(X_train,axis=0)\n", "X_train = X_train - X_train_mean\n", "y_train = y_train - y_train_mean\n", "\n", "# The we fit our model with the training data\n", "trained_model = some_model.fit(X_train,y_train)\n", "\n", "\n", "#Model prediction, we need also to transform our data set used for the prediction.\n", "X_test = X_test - X_train_mean #Use mean from training data\n", "y_pred = trained_model(X_test)\n", "y_pred = y_pred + y_train_mean\n", "\"\"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us try to understand what this may imply mathematically when we\n", "subtract the mean values, also known as *zero centering*. For\n", "simplicity, we will focus on ordinary regression, as done in the above example.\n", "\n", "The cost/loss function for regression is" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "C(\\beta_0, \\beta_1, ... , \\beta_{p-1}) = \\frac{1}{n}\\sum_{i=0}^{n} \\left(y_i - \\beta_0 - \\sum_{j=1}^{p-1} X_{ij}\\beta_j\\right)^2,.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Recall also that we use the squared value. This expression can lead to an\n", "increased penalty for higher differences between predicted and\n", "output/target values.\n", "\n", "What we have done is to single out the $\\beta_0$ term in the\n", "definition of the mean squared error (MSE). The design matrix $X$\n", "does in this case not contain any intercept column. When we take the\n", "derivative with respect to $\\beta_0$, we want the derivative to obey" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\frac{\\partial C}{\\partial \\beta_j} = 0,\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "for all $j$. For $\\beta_0$ we have" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\frac{\\partial C}{\\partial \\beta_0} = -\\frac{2}{n}\\sum_{i=0}^{n-1} \\left(y_i - \\beta_0 - \\sum_{j=1}^{p-1} X_{ij} \\beta_j\\right).\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Multiplying away the constant $2/n$, we obtain" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\sum_{i=0}^{n-1} \\beta_0 = \\sum_{i=0}^{n-1}y_i - \\sum_{i=0}^{n-1} \\sum_{j=1}^{p-1} X_{ij} \\beta_j.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us specialize first to the case where we have only two parameters $\\beta_0$ and $\\beta_1$.\n", "Our result for $\\beta_0$ simplifies then to" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "n\\beta_0 = \\sum_{i=0}^{n-1}y_i - \\sum_{i=0}^{n-1} X_{i1} \\beta_1.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We obtain then" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\beta_0 = \\frac{1}{n}\\sum_{i=0}^{n-1}y_i - \\beta_1\\frac{1}{n}\\sum_{i=0}^{n-1} X_{i1}.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we define" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\mu_{\\boldsymbol{x}_1}=\\frac{1}{n}\\sum_{i=0}^{n-1} X_{i1},\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and the mean value of the outputs as" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\mu_y=\\frac{1}{n}\\sum_{i=0}^{n-1}y_i,\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "we have" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\beta_0 = \\mu_y - \\beta_1\\mu_{\\boldsymbol{x}_1}.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the general case with more parameters than $\\beta_0$ and $\\beta_1$, we have" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\beta_0 = \\frac{1}{n}\\sum_{i=0}^{n-1}y_i - \\frac{1}{n}\\sum_{i=0}^{n-1}\\sum_{j=1}^{p-1} X_{ij}\\beta_j.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can rewrite the latter equation as" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\beta_0 = \\frac{1}{n}\\sum_{i=0}^{n-1}y_i - \\sum_{j=1}^{p-1} \\mu_{\\boldsymbol{x}_j}\\beta_j,\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "where we have defined" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\mu_{\\boldsymbol{x}_j}=\\frac{1}{n}\\sum_{i=0}^{n-1} X_{ij},\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "the mean value for all elements of the column vector $\\boldsymbol{x}_j$.\n", "\n", "\n", "\n", "Replacing $y_i$ with $y_i - y_i - \\overline{\\boldsymbol{y}}$ and centering also our design matrix results in a cost function (in vector-matrix disguise)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "C(\\boldsymbol{\\beta}) = (\\boldsymbol{\\tilde{y}} - \\tilde{X}\\boldsymbol{\\beta})^T(\\boldsymbol{\\tilde{y}} - \\tilde{X}\\boldsymbol{\\beta}).\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we minimize with respect to $\\boldsymbol{\\beta}$ we have then" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}} = (\\tilde{X}^T\\tilde{X})^{-1}\\tilde{X}^T\\boldsymbol{\\tilde{y}},\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "where $\\boldsymbol{\\tilde{y}} = \\boldsymbol{y} - \\overline{\\boldsymbol{y}}$\n", "and $\\tilde{X}_{ij} = X_{ij} - \\frac{1}{n}\\sum_{k=0}^{n-1}X_{kj}$.\n", "\n", "For Ridge regression we need to add $\\lambda \\boldsymbol{\\beta}^T\\boldsymbol{\\beta}$ to the cost function and get then" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}} = (\\tilde{X}^T\\tilde{X} + \\lambda I)^{-1}\\tilde{X}^T\\boldsymbol{\\tilde{y}}.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What does this mean? And why do we insist on all this? Let us look at some examples.\n", "\n", "\n", "This code shows a simple first-order fit to a data set using the above transformed data, where we consider the role of the intercept first, by either excluding it or including it (*code example thanks to Øyvind Sigmundson Schøyen*). Here our scaling of the data is done by subtracting the mean values only.\n", "Note also that we do not split the data into training and test." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True beta: [2, 0.5, 3.7]\n", "Fitted beta: [2.08376632 0.19569961 3.97898392]\n", "Sklearn fitted beta: [2.08376632 0.19569961 3.97898392]\n", "MSE with intercept column\n", "0.00411363461744314\n", "MSE with intercept column from SKL\n", "0.004113634617443116\n", "Manual intercept: 2.083766322923899\n", "Fitted beta (wiothout intercept): [0.19569961 3.97898392]\n", "Sklearn intercept: 2.0837663229239043\n", "Sklearn fitted beta (without intercept): [0.19569961 3.97898392]\n", "MSE with Manual intercept\n", "0.00411363461744314\n", "MSE with Sklearn intercept\n", "0.004113634617443131\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter3_107_1.png" }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from sklearn.linear_model import LinearRegression\n", "\n", "\n", "np.random.seed(2021)\n", "\n", "def MSE(y_data,y_model):\n", " n = np.size(y_model)\n", " return np.sum((y_data-y_model)**2)/n\n", "\n", "\n", "def fit_beta(X, y):\n", " return np.linalg.pinv(X.T @ X) @ X.T @ y\n", "\n", "\n", "true_beta = [2, 0.5, 3.7]\n", "\n", "x = np.linspace(0, 1, 11)\n", "y = np.sum(\n", " np.asarray([x ** p * b for p, b in enumerate(true_beta)]), axis=0\n", ") + 0.1 * np.random.normal(size=len(x))\n", "\n", "degree = 3\n", "X = np.zeros((len(x), degree))\n", "\n", "# Include the intercept in the design matrix\n", "for p in range(degree):\n", " X[:, p] = x ** p\n", "\n", "beta = fit_beta(X, y)\n", "\n", "# Intercept is included in the design matrix\n", "skl = LinearRegression(fit_intercept=False).fit(X, y)\n", "\n", "print(f\"True beta: {true_beta}\")\n", "print(f\"Fitted beta: {beta}\")\n", "print(f\"Sklearn fitted beta: {skl.coef_}\")\n", "ypredictOwn = X @ beta\n", "ypredictSKL = skl.predict(X)\n", "print(f\"MSE with intercept column\")\n", "print(MSE(y,ypredictOwn))\n", "print(f\"MSE with intercept column from SKL\")\n", "print(MSE(y,ypredictSKL))\n", "\n", "\n", "plt.figure()\n", "plt.scatter(x, y, label=\"Data\")\n", "plt.plot(x, X @ beta, label=\"Fit\")\n", "plt.plot(x, skl.predict(X), label=\"Sklearn (fit_intercept=False)\")\n", "\n", "\n", "# Do not include the intercept in the design matrix\n", "X = np.zeros((len(x), degree - 1))\n", "\n", "for p in range(degree - 1):\n", " X[:, p] = x ** (p + 1)\n", "\n", "# Intercept is not included in the design matrix\n", "skl = LinearRegression(fit_intercept=True).fit(X, y)\n", "\n", "# Use centered values for X and y when computing coefficients\n", "y_offset = np.average(y, axis=0)\n", "X_offset = np.average(X, axis=0)\n", "\n", "beta = fit_beta(X - X_offset, y - y_offset)\n", "intercept = np.mean(y_offset - X_offset @ beta)\n", "\n", "print(f\"Manual intercept: {intercept}\")\n", "print(f\"Fitted beta (wiothout intercept): {beta}\")\n", "print(f\"Sklearn intercept: {skl.intercept_}\")\n", "print(f\"Sklearn fitted beta (without intercept): {skl.coef_}\")\n", "ypredictOwn = X @ beta\n", "ypredictSKL = skl.predict(X)\n", "print(f\"MSE with Manual intercept\")\n", "print(MSE(y,ypredictOwn+intercept))\n", "print(f\"MSE with Sklearn intercept\")\n", "print(MSE(y,ypredictSKL))\n", "\n", "plt.plot(x, X @ beta + intercept, \"--\", label=\"Fit (manual intercept)\")\n", "plt.plot(x, skl.predict(X), \"--\", label=\"Sklearn (fit_intercept=True)\")\n", "plt.grid()\n", "plt.legend()\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The intercept is the value of our output/target variable\n", "when all our features are zero and our function crosses the $y$-axis (for a one-dimensional case). \n", "\n", "Printing the MSE, we see first that both methods give the same MSE, as\n", "they should. However, when we move to for example Ridge regression,\n", "the way we treat the intercept may give a larger or smaller MSE,\n", "meaning that the MSE can be penalized by the value of the\n", "intercept. Not including the intercept in the fit, means that the\n", "regularization term does not include $\\beta_0$. For different values\n", "of $\\lambda$, this may lead to differeing MSE values. \n", "\n", "To remind the reader, the regularization term, with the intercept in Ridge regression, is given by" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\lambda \\vert\\vert \\boldsymbol{\\beta} \\vert\\vert_2^2 = \\lambda \\sum_{j=0}^{p-1}\\beta_j^2,\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "but when we take out the intercept, this equation becomes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\lambda \\vert\\vert \\boldsymbol{\\beta} \\vert\\vert_2^2 = \\lambda \\sum_{j=1}^{p-1}\\beta_j^2.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For Lasso regression we have" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\lambda \\vert\\vert \\boldsymbol{\\beta} \\vert\\vert_1 = \\lambda \\sum_{j=1}^{p-1}\\vert\\beta_j\\vert.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It means that, when scaling the design matrix and the outputs/targets,\n", "by subtracting the mean values, we have an optimization problem which\n", "is not penalized by the intercept. The MSE value can then be smaller\n", "since it focuses only on the remaining quantities. If we however bring\n", "back the intercept, we will get a MSE which then contains the\n", "intercept.\n", "\n", "\n", "Armed with this wisdom, we attempt first to simply set the intercept equal to **False** in our implementation of Ridge regression for our well-known vanilla data set." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Beta values for own Ridge implementation\n", "[ 1.03032441e+00 6.28336218e-02 -6.24175744e-01 5.21169159e-02\n", " 2.80847477e-01 2.12552073e-01 8.13220608e-02 -1.69634577e-02\n", " -6.50846111e-02 -7.38962192e-02 -5.94226022e-02 -3.50227564e-02\n", " -9.80609616e-03 1.08299273e-02 2.41882036e-02 2.93492130e-02\n", " 2.64742912e-02 1.63249532e-02 -5.01831036e-05 -2.15098090e-02]\n", "Beta values for Scikit-Learn Ridge implementation\n", "[ 1.03032441e+00 6.28336218e-02 -6.24175744e-01 5.21169159e-02\n", " 2.80847477e-01 2.12552073e-01 8.13220608e-02 -1.69634577e-02\n", " -6.50846112e-02 -7.38962192e-02 -5.94226022e-02 -3.50227564e-02\n", " -9.80609615e-03 1.08299273e-02 2.41882037e-02 2.93492130e-02\n", " 2.64742912e-02 1.63249532e-02 -5.01831207e-05 -2.15098090e-02]\n", "MSE values for own Ridge implementation\n", "4.363295924430451e-07\n", "MSE values for Scikit-Learn Ridge implementation\n", "4.363295916323784e-07\n", "Beta values for own Ridge implementation\n", "[ 1.03630548 -0.01963611 -0.37900111 -0.07062318 0.12182967 0.16343471\n", " 0.13003291 0.07490892 0.02365049 -0.01449782 -0.03814292 -0.04909093\n", " -0.05009826 -0.04389027 -0.03279636 -0.01866537 -0.00289724 0.01348565\n", " 0.02976145 0.04543942]\n", "Beta values for Scikit-Learn Ridge implementation\n", "[ 1.03630548 -0.01963611 -0.37900111 -0.07062318 0.12182967 0.16343471\n", " 0.13003291 0.07490892 0.02365049 -0.01449782 -0.03814292 -0.04909093\n", " -0.05009826 -0.04389027 -0.03279636 -0.01866537 -0.00289724 0.01348565\n", " 0.02976145 0.04543942]\n", "MSE values for own Ridge implementation\n", "5.19404282648955e-06\n", "MSE values for Scikit-Learn Ridge implementation\n", "5.1940428268204826e-06\n", "Beta values for own Ridge implementation\n", "[ 1.04220758 -0.10931453 -0.17641709 -0.06020587 0.02208512 0.05789007\n", " 0.06491736 0.05785343 0.04537385 0.03196357 0.01969145 0.00934499\n", " 0.00107405 -0.00526348 -0.00992331 -0.01318643 -0.01531845 -0.01655318\n", " -0.01708852 -0.01708781]\n", "Beta values for Scikit-Learn Ridge implementation\n", "[ 1.04220758 -0.10931453 -0.17641709 -0.06020587 0.02208512 0.05789007\n", " 0.06491736 0.05785343 0.04537385 0.03196357 0.01969145 0.00934499\n", " 0.00107405 -0.00526348 -0.00992331 -0.01318643 -0.01531845 -0.01655318\n", " -0.01708852 -0.01708781]\n", "MSE values for own Ridge implementation\n", "2.094082198966615e-05\n", "MSE values for Scikit-Learn Ridge implementation\n", "2.094082198961999e-05\n", "Beta values for own Ridge implementation\n", "[ 1.01219292 -0.06043581 -0.10391807 -0.05651951 -0.01898855 0.00312361\n", " 0.01463049 0.01975848 0.02123176 0.02068067 0.01905883 0.01691985\n", " 0.01458337 0.01223198 0.00996754 0.00784393 0.00588657 0.00410387\n", " 0.00249435 0.00105081]\n", "Beta values for Scikit-Learn Ridge implementation\n", "[ 1.01219292 -0.06043581 -0.10391807 -0.05651951 -0.01898855 0.00312361\n", " 0.01463049 0.01975848 0.02123176 0.02068067 0.01905883 0.01691985\n", " 0.01458337 0.01223198 0.00996754 0.00784393 0.00588657 0.00410387\n", " 0.00249435 0.00105081]\n", "MSE values for own Ridge implementation\n", "0.0003153514830958235\n", "MSE values for Scikit-Learn Ridge implementation\n", "0.00031535148309580783\n", "Beta values for own Ridge implementation\n", "[ 8.38916861e-01 1.31276579e-01 8.97497404e-03 -1.72271878e-02\n", " -2.11744554e-02 -1.91492986e-02 -1.57201944e-02 -1.23002365e-02\n", " -9.30466214e-03 -6.81048318e-03 -4.78184120e-03 -3.15130074e-03\n", " -1.84923989e-03 -8.13661243e-04 7.46984697e-06 6.56636616e-04\n", " 1.16805821e-03 1.56912044e-03 1.88168312e-03 2.12318726e-03]\n", "Beta values for Scikit-Learn Ridge implementation\n", "[ 8.38916861e-01 1.31276579e-01 8.97497404e-03 -1.72271878e-02\n", " -2.11744554e-02 -1.91492986e-02 -1.57201944e-02 -1.23002365e-02\n", " -9.30466214e-03 -6.81048318e-03 -4.78184120e-03 -3.15130074e-03\n", " -1.84923989e-03 -8.13661243e-04 7.46984697e-06 6.56636616e-04\n", " 1.16805821e-03 1.56912044e-03 1.88168312e-03 2.12318726e-03]\n", "MSE values for own Ridge implementation\n", "0.015072388895177239\n", "MSE values for Scikit-Learn Ridge implementation\n", "0.0150723888951771\n", "Beta values for own Ridge implementation\n", "[0.37396662 0.14174745 0.0764924 0.04892055 0.03447512 0.02586427\n", " 0.02024962 0.01633913 0.01347916 0.0113104 0.0096208 0.00827728\n", " 0.00719176 0.00630331 0.00556826 0.0049544 0.00443743 0.0039987\n", " 0.0036237 0.003301 ]\n", "Beta values for Scikit-Learn Ridge implementation\n", "[0.37396662 0.14174745 0.0764924 0.04892055 0.03447512 0.02586427\n", " 0.02024962 0.01633913 0.01347916 0.0113104 0.0096208 0.00827728\n", " 0.00719176 0.00630331 0.00556826 0.0049544 0.00443743 0.0039987\n", " 0.0036237 0.003301 ]\n", "MSE values for own Ridge implementation\n", "0.26409315307910053\n", "MSE values for Scikit-Learn Ridge implementation\n", "0.26409315307910025\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter3_115_1.png" }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from sklearn.model_selection import train_test_split\n", "from sklearn import linear_model\n", "\n", "def MSE(y_data,y_model):\n", " n = np.size(y_model)\n", " return np.sum((y_data-y_model)**2)/n\n", "\n", "\n", "# A seed just to ensure that the random numbers are the same for every run.\n", "# Useful for eventual debugging.\n", "np.random.seed(3155)\n", "\n", "n = 100\n", "x = np.random.rand(n)\n", "y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)\n", "\n", "Maxpolydegree = 20\n", "X = np.zeros((n,Maxpolydegree))\n", "#We include explicitely the intercept column\n", "for degree in range(Maxpolydegree):\n", " X[:,degree] = x**degree\n", "# We split the data in test and training data\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n", "\n", "p = Maxpolydegree\n", "I = np.eye(p,p)\n", "# Decide which values of lambda to use\n", "nlambdas = 6\n", "MSEOwnRidgePredict = np.zeros(nlambdas)\n", "MSERidgePredict = np.zeros(nlambdas)\n", "lambdas = np.logspace(-4, 2, nlambdas)\n", "for i in range(nlambdas):\n", " lmb = lambdas[i]\n", " OwnRidgeBeta = np.linalg.pinv(X_train.T @ X_train+lmb*I) @ X_train.T @ y_train\n", " # Note: we include the intercept column and no scaling\n", " RegRidge = linear_model.Ridge(lmb,fit_intercept=False)\n", " RegRidge.fit(X_train,y_train)\n", " # and then make the prediction\n", " ytildeOwnRidge = X_train @ OwnRidgeBeta\n", " ypredictOwnRidge = X_test @ OwnRidgeBeta\n", " ytildeRidge = RegRidge.predict(X_train)\n", " ypredictRidge = RegRidge.predict(X_test)\n", " MSEOwnRidgePredict[i] = MSE(y_test,ypredictOwnRidge)\n", " MSERidgePredict[i] = MSE(y_test,ypredictRidge)\n", " print(\"Beta values for own Ridge implementation\")\n", " print(OwnRidgeBeta)\n", " print(\"Beta values for Scikit-Learn Ridge implementation\")\n", " print(RegRidge.coef_)\n", " print(\"MSE values for own Ridge implementation\")\n", " print(MSEOwnRidgePredict[i])\n", " print(\"MSE values for Scikit-Learn Ridge implementation\")\n", " print(MSERidgePredict[i])\n", "\n", "# Now plot the results\n", "plt.figure()\n", "plt.plot(np.log10(lambdas), MSEOwnRidgePredict, 'r', label = 'MSE own Ridge Test')\n", "plt.plot(np.log10(lambdas), MSERidgePredict, 'g', label = 'MSE Ridge Test')\n", "\n", "plt.xlabel('log10(lambda)')\n", "plt.ylabel('MSE')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The results here agree when we force **Scikit-Learn**'s Ridge function to include the first column in our design matrix.\n", "We see that the results agree very well. Here we have thus explicitely included the intercept column in the design matrix.\n", "What happens if we do not include the intercept in our fit?\n", "Let us see how we can change this code by zero centering." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Beta values for own Ridge implementation\n", "[ 3.43579948e-02 -5.43330971e-01 -3.10141413e-03 2.47116868e-01\n", " 2.18613217e-01 1.02054837e-01 -4.25617658e-04 -5.90475506e-02\n", " -7.68534263e-02 -6.68929213e-02 -4.24906604e-02 -1.40927184e-02\n", " 1.11482289e-02 2.88529063e-02 3.67047975e-02 3.38135733e-02\n", " 2.02198702e-02 -3.46383925e-03 -3.63025821e-02]\n", "Beta values for Scikit-Learn Ridge implementation\n", "[ 3.43579948e-02 -5.43330971e-01 -3.10141413e-03 2.47116868e-01\n", " 2.18613217e-01 1.02054837e-01 -4.25617654e-04 -5.90475506e-02\n", " -7.68534263e-02 -6.68929213e-02 -4.24906604e-02 -1.40927184e-02\n", " 1.11482289e-02 2.88529063e-02 3.67047975e-02 3.38135733e-02\n", " 2.02198702e-02 -3.46383925e-03 -3.63025821e-02]\n", "Intercept from own implementation:\n", "1.0330308045190182\n", "Intercept from Scikit-Learn Ridge implementation\n", "1.0330308045183219\n", "MSE values for own Ridge implementation\n", "3.13925595925919e-06\n", "MSE values for Scikit-Learn Ridge implementation\n", "3.1392559585048734e-06\n", "Beta values for own Ridge implementation\n", "[-0.05807125 -0.29822833 -0.08551306 0.08156108 0.13679863 0.12333649\n", " 0.08251519 0.03815288 0.00111756 -0.02498832 -0.04010697 -0.04566964\n", " -0.04355837 -0.03562355 -0.02348765 -0.00848904 0.00831018 0.0260906\n", " 0.04423486]\n", "Beta values for Scikit-Learn Ridge implementation\n", "[-0.05807125 -0.29822833 -0.08551306 0.08156108 0.13679863 0.12333649\n", " 0.08251519 0.03815288 0.00111756 -0.02498832 -0.04010697 -0.04566964\n", " -0.04355837 -0.03562355 -0.02348765 -0.00848904 0.00831018 0.0260906\n", " 0.04423486]\n", "Intercept from own implementation:\n", "1.041148729430502\n", "Intercept from Scikit-Learn Ridge implementation\n", "1.041148729430523\n", "MSE values for own Ridge implementation\n", "1.9601304850018328e-05\n", "MSE values for Scikit-Learn Ridge implementation\n", "1.960130485007504e-05\n", "Beta values for own Ridge implementation\n", "[-0.1416398 -0.14021063 -0.05383795 0.01367553 0.04784395 0.05796251\n", " 0.05447415 0.044613 0.03267527 0.02098261 0.01066519 0.00217499\n", " -0.00440346 -0.00917248 -0.01231917 -0.01405935 -0.0146081 -0.01416528\n", " -0.01290947]\n", "Beta values for Scikit-Learn Ridge implementation\n", "[-0.1416398 -0.14021063 -0.05383795 0.01367553 0.04784395 0.05796251\n", " 0.05447415 0.044613 0.03267527 0.02098261 0.01066519 0.00217499\n", " -0.00440346 -0.00917248 -0.01231917 -0.01405935 -0.0146081 -0.01416528\n", " -0.01290947]\n", "Intercept from own implementation:\n", "1.0495569966278238\n", "Intercept from Scikit-Learn Ridge implementation\n", "1.0495569966278269\n", "MSE values for own Ridge implementation\n", "5.4959161509356135e-05\n", "MSE values for Scikit-Learn Ridge implementation\n", "5.495916150936645e-05\n", "Beta values for own Ridge implementation\n", "[-0.13535942 -0.08593216 -0.03568439 -0.0036367 0.01397146 0.02229529\n", " 0.02503753 0.0245528 0.02228115 0.01908936 0.01549377 0.01179792\n", " 0.00817631 0.00472512 0.00149311 -0.00149956 -0.00424967 -0.00676387\n", " -0.00905423]\n", "Beta values for Scikit-Learn Ridge implementation\n", "[-0.13535942 -0.08593216 -0.03568439 -0.0036367 0.01397146 0.02229529\n", " 0.02503753 0.0245528 0.02228115 0.01908936 0.01549377 0.01179792\n", " 0.00817631 0.00472512 0.00149311 -0.00149956 -0.00424967 -0.00676387\n", " -0.00905423]\n", "Intercept from own implementation:\n", "1.0399676689527968\n", "Intercept from Scikit-Learn Ridge implementation\n", "1.0399676689527975\n", "MSE values for own Ridge implementation\n", "7.571105947979336e-05\n", "MSE values for Scikit-Learn Ridge implementation\n", "7.571105947979394e-05\n", "Beta values for own Ridge implementation\n", "[-0.05100875 -0.04063602 -0.02723445 -0.01713366 -0.0100706 -0.00517114\n", " -0.00174276 0.00068734 0.00243186 0.00369758 0.00462287 0.0053018\n", " 0.00579953 0.006162 0.00642221 0.00660427 0.00672607 0.0068011\n", " 0.00683964]\n", "Beta values for Scikit-Learn Ridge implementation\n", "[-0.05100875 -0.04063602 -0.02723445 -0.01713366 -0.0100706 -0.00517114\n", " -0.00174276 0.00068734 0.00243186 0.00369758 0.00462287 0.0053018\n", " 0.00579953 0.006162 0.00642221 0.00660427 0.00672607 0.0068011\n", " 0.00683964]\n", "Intercept from own implementation:\n", "0.9999555851685968\n", "Intercept from Scikit-Learn Ridge implementation\n", "0.999955585168597\n", "MSE values for own Ridge implementation\n", "0.0007698473260556344\n", "MSE values for Scikit-Learn Ridge implementation\n", "0.0007698473260556325\n", "Beta values for own Ridge implementation\n", "[-0.00834567 -0.00803064 -0.00673407 -0.00554552 -0.00458878 -0.0038335\n", " -0.00323332 -0.00274989 -0.0023548 -0.00202756 -0.00175331 -0.00152117\n", " -0.001323 -0.0011526 -0.00100519 -0.00087697 -0.00076495 -0.00066668\n", " -0.00058016]\n", "Beta values for Scikit-Learn Ridge implementation\n", "[-0.00834567 -0.00803064 -0.00673407 -0.00554552 -0.00458878 -0.0038335\n", " -0.00323332 -0.00274989 -0.0023548 -0.00202756 -0.00175331 -0.00152117\n", " -0.001323 -0.0011526 -0.00100519 -0.00087697 -0.00076495 -0.00066668\n", " -0.00058016]\n", "Intercept from own implementation:\n", "0.9637117593816477\n", "Intercept from Scikit-Learn Ridge implementation\n", "0.9637117593816477\n", "MSE values for own Ridge implementation\n", "0.0023813163025848865\n", "MSE values for Scikit-Learn Ridge implementation\n", "0.002381316302584886\n" ] }, { "data": { "image/png": "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8cknnwDQu3dvatSoAcD3339Pv379CAsLA+C6664DICkpiR9//JH+/ftn7yMtLa3Afp62aNEiFi1aRMuWLbP3s2PHDjp27Mjo0aN55JFH6NOnzxl9NKY8ysxy8eG+F6jsas3Ivp19dhxLKkVYurTgssqVCy+vXbvw8qL07duX0aNHs3TpUhISEs4oq1mzJrfccgu33HILffr0YdmyZbRu3brIfeY8zZRbx44d+eqrrwgKCqJr164MHjyYrKys7NNPACEhIYD71FZmZma++zmd2A4cOMBVV13F3Llz6du3b556+V2mW1B8LpeL6tWrF5ow86OqPProo9x99915ytasWcP8+fN59NFHufbaaxk7duxZ7duYsmTse1+QUXU799SbQ0CA7y6Rt9NffmzIkCGMHTuWZs2anfH54sWLs69QSkxMZNeuXVx00UXF2mejRo3Ys2cPO3fuBOCdd96hc2f3Xy2dOnVi8uTJdOjQgcjISBISEti6dStNmjQpUfx169bl2Wef5ZlnnslT1qlTJ957z/3Ugq+++opjx44BcOWVV/LFF1+QmppKUlJS9rxS1apViY6O5qOPPgLcyeLXX38tMobu3bszY8YMkpKSAPjjjz84dOgQ+/fvp3Llytx2222MHj2aX375BYAqVaqQmJhYov4a48+m/jKJSokNeG7Q//n0ODZS8WNRUVH89a9/zfP5mjVrGDFiBJUqVcLlcnHXXXfRpk0b9uzZk33q6bQhQ4accRlvaGgoM2fOpH///mRmZtKmTRuGD3c/ebldu3YcPHiQTp06Ae5TcHXq1DmnG/+uv/56nnjiiTxzO+PGjWPgwIG0atWKzp07ZyfFNm3a0LdvX5o3b079+vWJi4ujWrVqALz33nvcc889TJgwgYyMDAYMGEDz5s0LPf61117Lli1b6NChAwARERG8++677Ny5k4cffpiAgACCgoKYNm0a4J636dmzJ3Xr1rV5FVNuxB8+SZak0bfOKEKDffu1bwtK5lpQcsuWLVx22WUORWTAPe8RERFBcnIynTp1Yvr06bRq1crpsOx3w5RpLpeSmeUiOCjwnPdlC0qaMmXYsGFs3ryZ1NRUBg0a5BcJxZiyauNvBwkJqkRMVC2CA849oRTFkorxO++//77TIRhTbgx8/Uk2Bczm0Jh4aler7PPj2US9McaUU9v2HWFj0Ez+lHlDqSQU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\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter3_117_1.png" }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from sklearn.model_selection import train_test_split\n", "from sklearn import linear_model\n", "from sklearn.preprocessing import StandardScaler\n", "\n", "def MSE(y_data,y_model):\n", " n = np.size(y_model)\n", " return np.sum((y_data-y_model)**2)/n\n", "# A seed just to ensure that the random numbers are the same for every run.\n", "# Useful for eventual debugging.\n", "np.random.seed(315)\n", "\n", "n = 100\n", "x = np.random.rand(n)\n", "y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)\n", "\n", "Maxpolydegree = 20\n", "X = np.zeros((n,Maxpolydegree-1))\n", "\n", "for degree in range(1,Maxpolydegree): #No intercept column\n", " X[:,degree-1] = x**(degree)\n", "\n", "# We split the data in test and training data\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n", "\n", "#For our own implementation, we will need to deal with the intercept by centering the design matrix and the target variable\n", "X_train_mean = np.mean(X_train,axis=0)\n", "#Center by removing mean from each feature\n", "X_train_scaled = X_train - X_train_mean \n", "X_test_scaled = X_test - X_train_mean\n", "#The model intercept (called y_scaler) is given by the mean of the target variable (IF X is centered)\n", "#Remove the intercept from the training data.\n", "y_scaler = np.mean(y_train) \n", "y_train_scaled = y_train - y_scaler \n", "\n", "p = Maxpolydegree-1\n", "I = np.eye(p,p)\n", "# Decide which values of lambda to use\n", "nlambdas = 6\n", "MSEOwnRidgePredict = np.zeros(nlambdas)\n", "MSERidgePredict = np.zeros(nlambdas)\n", "\n", "lambdas = np.logspace(-4, 2, nlambdas)\n", "for i in range(nlambdas):\n", " lmb = lambdas[i]\n", " OwnRidgeBeta = np.linalg.pinv(X_train_scaled.T @ X_train_scaled+lmb*I) @ X_train_scaled.T @ (y_train_scaled)\n", " intercept_ = y_scaler - X_train_mean@OwnRidgeBeta #The intercept can be shifted so the model can predict on uncentered data\n", " #Add intercept to prediction\n", " ypredictOwnRidge = X_test_scaled @ OwnRidgeBeta + y_scaler \n", " RegRidge = linear_model.Ridge(lmb)\n", " RegRidge.fit(X_train,y_train)\n", " ypredictRidge = RegRidge.predict(X_test)\n", " MSEOwnRidgePredict[i] = MSE(y_test,ypredictOwnRidge)\n", " MSERidgePredict[i] = MSE(y_test,ypredictRidge)\n", " print(\"Beta values for own Ridge implementation\")\n", " print(OwnRidgeBeta) #Intercept is given by mean of target variable\n", " print(\"Beta values for Scikit-Learn Ridge implementation\")\n", " print(RegRidge.coef_)\n", " print('Intercept from own implementation:')\n", " print(intercept_)\n", " print('Intercept from Scikit-Learn Ridge implementation')\n", " print(RegRidge.intercept_)\n", " print(\"MSE values for own Ridge implementation\")\n", " print(MSEOwnRidgePredict[i])\n", " print(\"MSE values for Scikit-Learn Ridge implementation\")\n", " print(MSERidgePredict[i])\n", "\n", "\n", "# Now plot the results\n", "plt.figure()\n", "plt.plot(np.log10(lambdas), MSEOwnRidgePredict, 'b--', label = 'MSE own Ridge Test')\n", "plt.plot(np.log10(lambdas), MSERidgePredict, 'g--', label = 'MSE SL Ridge Test')\n", "plt.xlabel('log10(lambda)')\n", "plt.ylabel('MSE')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see here, when compared to the code which includes explicitely the\n", "intercept column, that our MSE value is actually smaller. This is\n", "because the regularization term does not include the intercept value\n", "$\\beta_0$ in the fitting. This applies to Lasso regularization as\n", "well. It means that our optimization is now done only with the\n", "centered matrix and/or vector that enter the fitting procedure. Note\n", "also that the problem with the intercept occurs mainly in these type\n", "of polynomial fitting problem.\n", "\n", "The next example is indeed an example where all these discussions about the role of intercept are not present.\n", "\n", "## More complicated Example: The Ising model\n", "\n", "The one-dimensional Ising model with nearest neighbor interaction, no\n", "external field and a constant coupling constant $J$ is given by" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "$$\n", "\\begin{equation}\n", " H = -J \\sum_{k}^L s_k s_{k + 1},\n", "\\label{_auto1} \\tag{1}\n", "\\end{equation}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "where $s_i \\in \\{-1, 1\\}$ and $s_{N + 1} = s_1$. The number of spins\n", "in the system is determined by $L$. For the one-dimensional system\n", "there is no phase transition.\n", "\n", "We will look at a system of $L = 40$ spins with a coupling constant of\n", "$J = 1$. To get enough training data we will generate 10000 states\n", "with their respective energies." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "editable": true }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from mpl_toolkits.axes_grid1 import make_axes_locatable\n", "import seaborn as sns\n", "import scipy.linalg as scl\n", "from sklearn.model_selection import train_test_split\n", "import tqdm\n", "sns.set(color_codes=True)\n", "cmap_args=dict(vmin=-1., vmax=1., cmap='seismic')\n", "\n", "L = 40\n", "n = int(1e4)\n", "\n", "spins = np.random.choice([-1, 1], size=(n, L))\n", "J = 1.0\n", "\n", "energies = np.zeros(n)\n", "\n", "for i in range(n):\n", " energies[i] = - J * np.dot(spins[i], np.roll(spins[i], 1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we use ordinary least squares\n", "regression to predict the energy for the nearest neighbor\n", "one-dimensional Ising model on a ring, i.e., the endpoints wrap\n", "around. We will use linear regression to fit a value for\n", "the coupling constant to achieve this.\n", "\n", "A more general form for the one-dimensional Ising model is" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "$$\n", "\\begin{equation}\n", " H = - \\sum_j^L \\sum_k^L s_j s_k J_{jk}.\n", "\\label{_auto2} \\tag{2}\n", "\\end{equation}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we allow for interactions beyond the nearest neighbors and a state dependent\n", "coupling constant. This latter expression can be formulated as\n", "a matrix-product" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "$$\n", "\\begin{equation}\n", " \\boldsymbol{H} = \\boldsymbol{X} J,\n", "\\label{_auto3} \\tag{3}\n", "\\end{equation}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "where $X_{jk} = s_j s_k$ and $J$ is a matrix which consists of the\n", "elements $-J_{jk}$. This form of writing the energy fits perfectly\n", "with the form utilized in linear regression, that is" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "$$\n", "\\begin{equation}\n", " \\boldsymbol{y} = \\boldsymbol{X}\\boldsymbol{\\beta} + \\boldsymbol{\\epsilon},\n", "\\label{_auto4} \\tag{4}\n", "\\end{equation}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We split the data in training and test data as discussed in the previous example" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "editable": true }, "outputs": [], "source": [ "X = np.zeros((n, L ** 2))\n", "for i in range(n):\n", " X[i] = np.outer(spins[i], spins[i]).ravel()\n", "y = energies\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the ordinary least squares method we choose the cost function" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "$$\n", "\\begin{equation}\n", " C(\\boldsymbol{X}, \\boldsymbol{\\beta})= \\frac{1}{n}\\left\\{(\\boldsymbol{X}\\boldsymbol{\\beta} - \\boldsymbol{y})^T(\\boldsymbol{X}\\boldsymbol{\\beta} - \\boldsymbol{y})\\right\\}.\n", "\\label{_auto5} \\tag{5}\n", "\\end{equation}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We then find the extremal point of $C$ by taking the derivative with respect to $\\boldsymbol{\\beta}$ as discussed above.\n", "This yields the expression for $\\boldsymbol{\\beta}$ to be" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\boldsymbol{\\beta} = \\frac{\\boldsymbol{X}^T \\boldsymbol{y}}{\\boldsymbol{X}^T \\boldsymbol{X}},\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "which immediately imposes some requirements on $\\boldsymbol{X}$ as there must exist\n", "an inverse of $\\boldsymbol{X}^T \\boldsymbol{X}$. If the expression we are modeling contains an\n", "intercept, i.e., a constant term, we must make sure that the\n", "first column of $\\boldsymbol{X}$ consists of $1$. We do this here" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "editable": true }, "outputs": [], "source": [ "X_train_own = np.concatenate(\n", " (np.ones(len(X_train))[:, np.newaxis], X_train),\n", " axis=1\n", ")\n", "X_test_own = np.concatenate(\n", " (np.ones(len(X_test))[:, np.newaxis], X_test),\n", " axis=1\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Doing the inversion directly turns out to be a bad idea since the matrix\n", "$\\boldsymbol{X}^T\\boldsymbol{X}$ is singular. An alternative approach is to use the **singular\n", "value decomposition**. Using the definition of the Moore-Penrose\n", "pseudoinverse we can write the equation for $\\boldsymbol{\\beta}$ as" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\boldsymbol{\\beta} = \\boldsymbol{X}^{+}\\boldsymbol{y},\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "where the pseudoinverse of $\\boldsymbol{X}$ is given by" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\boldsymbol{X}^{+} = \\frac{\\boldsymbol{X}^T}{\\boldsymbol{X}^T\\boldsymbol{X}}.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using singular value decomposition we can decompose the matrix $\\boldsymbol{X} = \\boldsymbol{U}\\boldsymbol{\\Sigma} \\boldsymbol{V}^T$,\n", "where $\\boldsymbol{U}$ and $\\boldsymbol{V}$ are orthogonal(unitary) matrices and $\\boldsymbol{\\Sigma}$ contains the singular values (more details below).\n", "where $X^{+} = V\\Sigma^{+} U^T$. This reduces the equation for\n", "$\\omega$ to" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "$$\n", "\\begin{equation}\n", " \\boldsymbol{\\beta} = \\boldsymbol{V}\\boldsymbol{\\Sigma}^{+} \\boldsymbol{U}^T \\boldsymbol{y}.\n", "\\label{_auto6} \\tag{6}\n", "\\end{equation}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that solving this equation by actually doing the pseudoinverse\n", "(which is what we will do) is not a good idea as this operation scales\n", "as $\\mathcal{O}(n^3)$, where $n$ is the number of elements in a\n", "general matrix. Instead, doing $QR$-factorization and solving the\n", "linear system as an equation would reduce this down to\n", "$\\mathcal{O}(n^2)$ operations." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false, "editable": true }, "outputs": [], "source": [ "def ols_svd(x: np.ndarray, y: np.ndarray) -> np.ndarray:\n", " u, s, v = scl.svd(x)\n", " return v.T @ scl.pinv(scl.diagsvd(s, u.shape[0], v.shape[0])) @ u.T @ y" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false, "editable": true }, "outputs": [], "source": [ "beta = ols_svd(X_train_own,y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When extracting the $J$-matrix we need to make sure that we remove the intercept, as is done here" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false, "editable": true }, "outputs": [], "source": [ "J = beta[1:].reshape(L, L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A way of looking at the coefficients in $J$ is to plot the matrices as images." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":6: MatplotlibDeprecationWarning: Auto-removal of grids by pcolor() and pcolormesh() is deprecated since 3.5 and will be removed two minor releases later; please call grid(False) first.\n", " cb = fig.colorbar(im)\n", ":7: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " cb.ax.set_yticklabels(cb.ax.get_yticklabels(), fontsize=18)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4IAAAM2CAYAAACjUj0CAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABOFElEQVR4nO3dfbBdVZkg/OeccyffwTKvMRUSBUyR7p74CnmnuNjMjDIYAybBwAABJjZCBB1L/yCUgx9FazfVNg06UoU4NtVBbOACmhqEYcJYlF1DaStKKc4MYBJJiExIXfmQmI8bTLjnnPePkAvx5t67T7LuOevc/ftVUVSds7L3s5+99j7nuWudtSvNZrMZAAAAlEa10wEAAADQXgpBAACAklEIAgAAlIxCEAAAoGQUggAAACWjEAQAACiZnk4HAED3O3DgQPT19cWGDRvi2WefjUqlEu985ztj+fLlcfHFF8fMmTOH2n7uc5+L733ve/FP//RPMX/+/FG322g04jvf+U5873vfiy1btkSj0Yh58+bFkiVL4sorrzxsuwBAcQpBAI7JCy+8EFdeeWU888wzsWTJkjj//POj2WzGL3/5y7j55pvjO9/5Ttx2223xrne9q+VtX3vttfHwww/Hhz70oTj33HOjWq3GU089FevWrYvvf//7cd9998Vb3/rWcTgqAJjYFIIAHLUDBw7EJz/5yXj++efjjjvuiD//8z8feu8jH/lIXHbZZfHxj388rrrqqvjv//2/x9SpUwtv+4knnoiHHnooPve5z8UVV1xx2Hvve9/74uqrr45169bFf/pP/ynZ8QBAWfiNIABH7YEHHoinn346PvvZzx5WBB5yyimnxBe+8IV4/vnn4/bbb29p27/85S8jIuJf/+t/Pey9D33oQzFnzpz4X//rfx1V3ABQdgpBAI7aAw88ENOmTYvzzz9/xDYf/vCHY/bs2fHQQw+1tO3p06dHRMR3v/vdaDQaw97/wQ9+EH19fa0FDABEhEIQgKNUr9fjySefjH/5L/9lTJ48ecR2lUolTj/99PjNb34TL730UuHtL126NN7ylrfEXXfdFUuWLIkbb7wxfvjDH8a+ffsiImLSpEnHfAwAUFYKQQCOyq5du+LAgQMxe/bsMdu+/e1vj4iIF198sfD2Z82aFf/wD/8Q73jHO2LHjh3xrW99K6666qro7e2N//gf/2P8n//zf446dgAoO4UgAEel2WxGREStVhuzbU9Pz2H/pqhTTjklvv/978dtt90WF198ccyfPz9ee+21+J//83/GxRdf3PJ0UwDgIKuGAnBUZs2aFf/iX/yL+N3vfjdm20MjgYdGBlvR09MTZ555Zpx55pkREfHss8/GPffcE3fddVf8zd/8TXzwgx+MKVOmtLxdACgzI4IAHJVKpRKLFy+OJ598Mvbv3z9iu2azGb/4xS/iHe94R0uF4K233hrr168f9vq73vWuuO666+KSSy6J3//+97Fly5ajih8AykwhCMBRW7lyZezduze+853vjNjmn/7pn2L79u1x7rnntrTtBx54IG677bYRp5MuXLgwIqKlZxMCAAcpBAE4av/+3//7WLx4cfzn//yf45//+Z+Hvb9x48b4y7/8y5g/f35ceeWVLW373HPPje3bt8ff//3fD3tv//798cADD8SJJ54Y73rXu446fgAoq0qz1V/uA8CbvPzyy/HJT34ynnzyyVi6dGmcfvrpUavV4n//7/8dDz30UMydOzf+y3/5L3HyySdHRMTnPve5+N73vhcrVqwYelbgm33oQx+KP//zP48//OEPsWbNmvjFL34Rixcvjg984AMxa9as6O/vj4ceeih++9vfxre+9a34V//qX7X7kAGg6ykEAThmBw4ciAceeCDuv//+2LZtWwwODsY73/nOWLZsWVxyySUxc+bMobaHCsGRfP7zn4/LL788IiIGBwfj3nvvjf/xP/5HbN26NQYGBmLWrFlxxhlnxCc+8Yk46aSTxvvQAGBCUggCAACUjN8IAgAAlIxCEAAAoGQUggAAACXT0+kAAAAAGB+7d++O3bt3D3vdYjEAAADH6NVXXomps2Z1Ooxh/vCHP8T73ve+2LVr12Gv51sINhqjv1+tjt0mIk58V7rDe/bZWrJtVWPs2ItqtHmGb8HUd/UxdkKhfBVNfknk2vdpTcq+n7JPpLyHpdT2Y+xAx8/1nt/2PtGhm06u+U9pzHPZQu5zzVfK/pri+/T8+RH//M/pvkvn6lv/5t/E7uef73QYQ46bPz/W/PM/R39/f9Tr9cPem/BTQ597rtMRAABA9/J9urjdzz8fuzJM2Ny5c4e9NuELQQAAgHaoRl6rcY4WS/I4t2/fHp/+9Kejt7c3ent749prr41XXnkl9W4AAAA4SklHBHfu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q2PHjh2HvZVRlAAAAKTW19dnRBAAAKBM5s6dO+y1oyoEr7vuunjuuefirrvuOuz1Cy+8MJ588slh7c8+++y45ZZbjmZXAAAA3aGLVg1tOcr169fH+vXro7e397DXm81mbN26NZYsWRJLly497L158+a1uhsAAADGSeFCsF6vxze/+c249dZbj/j+888/H/v27YsPfOADsXLlymQBAgAAkFahQnD//v1x0UUXxebNm+O8886Lxx57bFibLVu2RETEggUL0kYIAADQDTJdNfRICj0gZf/+/bF37964+eab48Ybb4yeIxzcM888ExFvFIL79u07mlABAAAYZ4XK1RkzZsQjjzxyxALwkGeeeSamT58eN9xwQzz88MOxb9++eMc73hFr166N5cuXJwsYAACAY1OoEKxWq1Gtjj54uGXLlhgYGIg9e/bETTfdFLt3744777wzrrnmmnjttdfivPPOaymwMXZXuE1abd9hvgokP2228sx9R46x/R0/0+xHNJsjT3cYL0XS34m4isj1miy6pWJdP8/eKvet6fZ8pdSBW35ieR5Akag6k/s880ULJvKqoSNZtWpVNBqNWL169dBry5cvjxUrVsRXvvKVOPfcc6M2yhzVP9ZojP5+tTp2m9Sq0eYd5qpg8htJP3zzzH3bj7ETHT/SHmdKtVp97EYF1etj35+Kpj9lXM16Jdm2cr0mi8RVNPfuFa3JNffdnK+UOnTLT6pbr8lO5T7XfCXT/X/ZmFCSnY1LL730sCIwImLKlCmxcuXKePnll4cWkwEAAKCzxn3cctasWRFh8RgAAGCCm2irho7lhRdeiOXLlx/xGYPbtm2LiIj58+en2BUAAADHKEkhOGfOnNizZ0+sX78+9u7dO/R6f39/3H///XH66afH7NmzU+wKAACAY5Rs3PKLX/xifOpTn4pLLrkkLrroohgYGIi+vr7o6emJL33pS6l2AwAAkKcuWjU02WIxS5YsiW984xsxderU+OpXvxp33HFHnHrqqXHvvfcOPWQeAACAzqs0m81mp4M4Eo+PyJjHRwzx+IjO8viI1uR6Teb6CIOU5L413ZyvlDw+Yvx4fESHlOHxEffcE/Gmn8p13IwZEf/hPxzxrYzGLcdHrhdUrl+si6hGwS8PXfzh2+1yzlfKfpGySKoUKN6azVqhIq9IUVlUNeFdenAw3bZSKtYnqtne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\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter3_148_1.png" } }, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(20, 14))\n", "im = plt.imshow(J, **cmap_args)\n", "plt.title(\"OLS\", fontsize=18)\n", "plt.xticks(fontsize=18)\n", "plt.yticks(fontsize=18)\n", "cb = fig.colorbar(im)\n", "cb.ax.set_yticklabels(cb.ax.get_yticklabels(), fontsize=18)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is interesting to note that OLS\n", "considers both $J_{j, j + 1} = -0.5$ and $J_{j, j - 1} = -0.5$ as\n", "valid matrix elements for $J$.\n", "In our discussion below on hyperparameters and Ridge and Lasso regression we will see that\n", "this problem can be removed, partly and only with Lasso regression. \n", "\n", "In this case our matrix inversion was actually possible. The obvious question now is what is the mathematics behind the SVD?\n", "\n", "\n", "\n", "\n", "\n", "Let us now \n", "focus on Ridge and Lasso regression as well. We repeat some of the\n", "basic parts of the Ising model and the setup of the training and test\n", "data. The one-dimensional Ising model with nearest neighbor\n", "interaction, no external field and a constant coupling constant $J$ is\n", "given by" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "$$\n", "\\begin{equation}\n", " H = -J \\sum_{k}^L s_k s_{k + 1},\n", "\\label{_auto7} \\tag{7}\n", "\\end{equation}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "where $s_i \\in \\{-1, 1\\}$ and $s_{N + 1} = s_1$. The number of spins in the system is determined by $L$. For the one-dimensional system there is no phase transition.\n", "\n", "We will look at a system of $L = 40$ spins with a coupling constant of $J = 1$. To get enough training data we will generate 10000 states with their respective energies." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false, "editable": true }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from mpl_toolkits.axes_grid1 import make_axes_locatable\n", "import seaborn as sns\n", "import scipy.linalg as scl\n", "from sklearn.model_selection import train_test_split\n", "import sklearn.linear_model as skl\n", "import tqdm\n", "sns.set(color_codes=True)\n", "cmap_args=dict(vmin=-1., vmax=1., cmap='seismic')\n", "\n", "L = 40\n", "n = int(1e4)\n", "\n", "spins = np.random.choice([-1, 1], size=(n, L))\n", "J = 1.0\n", "\n", "energies = np.zeros(n)\n", "\n", "for i in range(n):\n", " energies[i] = - J * np.dot(spins[i], np.roll(spins[i], 1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A more general form for the one-dimensional Ising model is" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "$$\n", "\\begin{equation}\n", " H = - \\sum_j^L \\sum_k^L s_j s_k J_{jk}.\n", "\\label{_auto8} \\tag{8}\n", "\\end{equation}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we allow for interactions beyond the nearest neighbors and a more\n", "adaptive coupling matrix. This latter expression can be formulated as\n", "a matrix-product on the form" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "$$\n", "\\begin{equation}\n", " H = X J,\n", "\\label{_auto9} \\tag{9}\n", "\\end{equation}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "where $X_{jk} = s_j s_k$ and $J$ is the matrix consisting of the\n", "elements $-J_{jk}$. This form of writing the energy fits perfectly\n", "with the form utilized in linear regression, viz." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "$$\n", "\\begin{equation}\n", " \\boldsymbol{y} = \\boldsymbol{X}\\boldsymbol{\\beta} + \\boldsymbol{\\epsilon}.\n", "\\label{_auto10} \\tag{10}\n", "\\end{equation}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We organize the data as we did above" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false, "editable": true }, "outputs": [], "source": [ "X = np.zeros((n, L ** 2))\n", "for i in range(n):\n", " X[i] = np.outer(spins[i], spins[i]).ravel()\n", "y = energies\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.96)\n", "\n", "X_train_own = np.concatenate(\n", " (np.ones(len(X_train))[:, np.newaxis], X_train),\n", " axis=1\n", ")\n", "\n", "X_test_own = np.concatenate(\n", " (np.ones(len(X_test))[:, np.newaxis], X_test),\n", " axis=1\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will do all fitting with **Scikit-Learn**," ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false, "editable": true }, "outputs": [], "source": [ "clf = skl.LinearRegression().fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When extracting the $J$-matrix we make sure to remove the intercept" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false, "editable": true }, "outputs": [], "source": [ "J_sk = clf.coef_.reshape(L, L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And then we plot the results" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":6: MatplotlibDeprecationWarning: Auto-removal of grids by pcolor() and pcolormesh() is deprecated since 3.5 and will be removed two minor releases later; please call grid(False) first.\n", " cb = fig.colorbar(im)\n", ":7: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " cb.ax.set_yticklabels(cb.ax.get_yticklabels(), fontsize=18)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4IAAAM2CAYAAACjUj0CAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAB7T0lEQVR4nO3de3xU1b3//3dCDMMwjDENJIQ0hIARgXI7GCy1aDGCgho8FbwgqHjp8aBWrKXq4ajlWAFrtUU8aovVglEqlZa2+G2ttVarIj9rOYoY5BYhhARiCCGEECeZ3x+QQMxlb5hPkh3m9Xw8ePhw9ief+WTP2ntmzVpZKyYcDocFAAAAAIgasR1dAAAAAACgfdERBAAAAIAoQ0cQAAAAAKIMHUEAAAAAiDJ0BAEAAAAgytARBAAAAIAoQ0cQQJu5++67dcYZZ6iwsNBVnFetXLlSZ5xxRpN/gwcP1te//nXdfPPN+uijjzq6zHbx3nvv6YwzztDKlSvb9Xl37typ6dOna+jQoRo9erTKysra9fnd+uijj3T77bfrG9/4hoYMGaJzzjlHs2fPPqH2UVhYqDPOOEOPP/54w2NnnHGG7r777lZ/bty4cZo+fXqjxz7//HNVVVU5PqfXr0UAgJ24ji4AAK644gp9/etf7+gyHF1xxRX6t3/7t4b/r6mp0caNG7V8+XL9f//f/6dVq1YpPT29Aytse/3799fDDz+skSNHtuvzLly4UO+//75uvfVW9ezZU4mJie36/G68+eab+o//+A8NGDBAM2bMUGJionbt2qWXX35Zf/rTn/T4448rJyfHdb7ExEQ9/PDDx90xu/fee9WtW7eG///73/+uu+66S7/97W/l9/uPKxcA4ORFRxBAhxsxYoRGjBjR0WU4Gj58uHJzc5s8PnLkSM2ePVu//OUv9cADD7R/Ye0oKSmp2XPQ1jZu3KgzzzxTs2bNavfndutHP/qRBg4cqF//+tc65ZRTGh6fMWOGcnNzNW/ePJ133nmKi3P31uv3+0/oXH+5s/nhhx+qoqLiuPMAAE5uTA0FgAhddNFF6tatm/7v//6vo0s5aX3xxRfq3r17R5fRorKyMhUUFGj06NGNOoGSlJCQoMmTJ6u0tNRxmjQAAO2FjiCADvflv0u6++67deGFF+rDDz/UNddco2HDhmnMmDF68MEHVV1d3ehni4uLNWfOHJ199tn62te+psmTJ+v3v/99k+d49913deONN2r06NEaPHiwvvnNb+q+++5rNFJS/7x5eXk666yzdNZZZ+nNN990rD8mJkZdu3ZVOBxu9PjmzZs1a9YsjRo1SsOGDdOVV16pt956q8nP/9///Z9mzJihESNG6Jvf/KYef/xxLV68uNlz0lxtbs5BOBzW4sWLNWHCBH3ta1/TmDFj9P3vf1+7du1qFPfiiy/qkksu0bBhwzR69GjNmjVLmzZtajje3N8I1tbWasmSJZowYULD38Xdf//9jf6Or/7n3n77bf3whz/U17/+dQ0bNkzXXnut8vPzWzy39T+3c+dOrV27tuFv5uof/+1vf6tLLrlEX/va13TPPfccdz3vvPOO/uu//ktnnXWW/u3f/k333HOPqqqq9Pe//125ubkaNmyYcnNz9e6777ZYoyR169ZNXbp00V//+lft2bOnyfHbbrtNH3/8sTIyMhq9JkuXLtXFF1+soUOHaty4cXrkkUd08OBBSc3/jeCXbdmyRaNHj9aECRNUWloqqfHfCN59991avHixJOn8889v8reDbrTHNXY81zwAwAZTQwF4UllZmW644QZddNFFuvTSS/Xmm29q2bJlio+P15w5cyRJJSUlmjJlisLhsKZPn65TTz1Vf/3rX/X9739fu3fv1o033ihJ+sc//qGbbrpJI0eO1O23366YmBi9/fbb+vWvf60vvvhC8+fPb3jeXbt26YknntCtt96q3bt3a9iwYfrrX//aaq0fffSRysvLNW7cuIbHNm7cqKuvvlpJSUn6zne+o1NOOUV//OMfdfPNN+snP/mJJk6cKElav369ZsyYoaSkJM2aNUsHDx7U0qVLFRvb9Hu65mpzew6eeuopPfHEE5o2bVrDAj5Lly7V+vXr9cc//lFdunTR73//ez3wwAOaPHmypk+frrKyMv3qV7/S9OnT9Ze//EU9evRo9vefPXu2/vznP2v8+PGaMWOGtm3bphdffFFr1qzRihUrFAwGG2Lnzp2rXr166T//8z+1b98+LVmyRDfddJP+9re/NTtlsv5vEufPn6/TTjtN//Ef/6EzzjhD+/btkyTNmzdPubm5mjJlilJTU4+7nrvvvlsDBgzQ9773Pa1du1YrV65UcXGxNmzYoOnTp6tHjx76+c9/ru9+97t67bXXGv3ssbp166aJEyfqD3/4g3JycjRu3Didc845Ovvss9WnT59mf7cf/vCHevHFF/Wtb31LV111lbZt26Zf/vKXKigoaOi8taaoqEgzZ85UIBDQr371KyUlJTWJueKKK1RZWam//OUvuueee3T66ac75j1We11jr7zyiqtrHgBgKAwAbeQHP/hBOCsrK7xjxw5XcV/+/6VLlzaKu+iii8LnnHNOo7js7OxwSUlJo7g777wzPGTIkHBpaWk4HA6Hb7jhhvC3vvWt8KFDhxrFTZ06NTxixIgmz/vyyy83inv55ZfDWVlZ4WXLloU///zzhn9FRUXhv/zlL+GcnJzw0KFDw1u3bm34mWuuuSack5MTPnDgQMNjX3zxRfjqq68OjxkzpqGWGTNmhEeNGhX+/PPPG+I+/vjj8MCBA5s9J1+uze05uOiii8I333xzo5gXX3wxfOmll4Y/++yzcDgcDt94443hSZMmNYp54403whMnTgy///774XA4HF6zZk2jOv7+97+Hs7Kywg8++GCjn3vllVfCWVlZ4YcffrjRz337298Oh0Khhrinn346nJWVFf7HP/4Rbs23vvWt8DXXXNPw//X5jn3sROupra0Nh8PhcG1tbfgb3/hGOCsrK/z3v/+94WdfeuklVzVWVlaG77jjjnBWVlajf5MmTQo///zzDc8TDofDmzZtCp9xxhnhuXPnNsrx6KOPhrOyssKbNm0K79ixI5yVlRVetGhRw/GsrKzwD37wg/Dnn38eHj9+fHjs2LFNrq8vn6tFixa5ug7D4eavxfa4xtxe8wAAO0wNBeBZF110UaP/HzhwoD7//HNJUl1dnV577TWNGjVKcXFxKisra/g3fvx41dTU6O2335YkPf3003r55ZcVHx/fkGvv3r0KBALNLql/zjnnNFvP//zP/+jrX/96w7/zzjtPt912m3r16qXly5erX79+DbnXrl2rc889V9XV1Q11VVRU6IILLlBpaak++ugj7du3T2vXrlVubm6jVTAHDRqkb3zjG83WcGxtx3MOUlJS9N577+lXv/pVwxTCK6+8stFKpykpKdq6dasWL17c8Lds5557rlavXt1otdRjvf7665Kk73znO40ev+iii9SvXz+99tprjR4fP368unTp0vD/Z555piQ1O53SjS+/Vsdbz/nnn98w+hobG6uvfvWr8vl8Gjt2bENMWlqaqxq7d++uxx57TK+88opuu+02jRgxQnFxcdq0aZPmzZun//zP/1Rtba0k6Y033mgYZTvWDTfcoN///vetrj574MAB3Xjjjdq5c6eee+65hvqsdcQ11to1DwCwxdRQAJ715S0C4uPjGz5I7927V/v379drr73W5MN9vfq/f+vSpYt27Nihn/3sZ9q8ebO2b9+ukpKSFp/3K1/5SrOP33DDDTrnnHNUV1en/Px8/fznP1ffvn314x//uGFaoiTt2LFDkrRs2TItW7asxdq6du2quro69e3bt8nxzMzMZv+e8NjajucczJkzR7fccoseeughzZ8/X4MHD9a4ceM0depU9ezZU5I0a9YsrVu3To8//rgef/xxDRgwQOPGjdOUKVNa7JgUFhYqGAw2Oy2xf//+Tf7GsrnXVDrc6TgRX853vPV8OS4uLq5JzvqOotsa+/fvr1tvvVW33nqr9u/frz/96U/62c9+pr/97W/685//rIkTJ2rnzp2S1OhvBiUpGAy2OP203quvvqrY2FjV1dVp/fr1DV9AuFVTU9Mwtbaez+drMvW3I66x1q55AIAtOoIAPKu5v5OrV//hcMKECbryyiubjfnqV78qSVq+fLnuv/9+9evXT6NGjdL48eM1bNgwLVu2TH/4wx+a/NyxI1bHGjBggMaMGSPp8IjG6NGjdfXVV2v69OlasWJFw4fY+tqmTZvW4r5xAwYMUFFRkSQ1GkWp17Vr12Z/7tjajuccDBw4UH/+85/11ltv6W9/+5veeustLVq0SM8995yWL1+u/v37KyUlRatWrdJ7772nv/71r3rrrbf085//XM8++6x++ctfKjs7u0n+8JcWyDlWXV1dkxU0W3tNT8SXX6vjrae51zomJua463jjjTf09ttv6/vf/36j17NHjx6aMmWKsrKyNHXqVP3zn//UxIkTI+rc9OjRQ0899ZTuvfdeLViwQGPHjtWpp57q+uf/9a9/acaMGY0eu+yyy7RgwYJGj3XENWbdPgAALaMjCKBTSkxMVLdu3RQKhRo6Z/WKioq0YcMGdevWTYcOHdKCBQs0evRo/fKXv2y0aMfPfvaziGr42te+pu9973uaP3++5s6dq//93/+VJPXp00fS4Q+7X65t8+bNKiwsVLdu3Ro+RBcUFDTJ/dlnnzk+v9tzUFtbq/z8fAUCAZ1//vk6//zzJUmvvPKKZs+erRUrVujuu+/Wxo0bJalh6qsk/fOf/9S1116rZcuWNdsR7NOnj/7xj3+otLS0yejatm3b1Lt3b8ffw1JH1fPxxx9r6dKluuCCC5o9T/WLtPh8PklqGEHesWOH+vfv3xBXUlKi+fPn65prrlFKSkqzz5WTk6NRo0Zp7ty5uummm/STn/xE8+bNc13rwIED9eyzzzZ6rFevXk3ivHCNAQDaDl+9AeiU4uLiNHbsWP39739vsv3AggULNGvWLO3du1fV1dU6ePCgMjIyGn1A/eSTT7R27VpJUigUOuE6rr32Wo0cOVJ//etf9corr0g6/KF6yJAh+u1vf9toetwXX3yhe++9V7fffrtCoZC+8pWvaMSIEfrjH//YaKrejh07XG1b4fYc1NbWasaMGXrooYcaxQwbNkzS0VGY7373u5ozZ06j0apBgwbplFNOaXGkpn6l1KeffrrR46+99pq2bdum8847z/H3sNRR9UyaNEmxsbFauHBhs5u3//rXv5akhk74ueeeK+nwdh3HWrlypf7f//t/CgQCjs85duxYXXDBBXrppZf0wQcftBhX/9rVj5aeeuqpGjNmTKN/AwYMaPJzXrnGAABtgxFBAG3usccea3Yz8Isuuqhh5OlE3HXXXXrvvfc0bdo0TZs2TampqXrjjTf0t7/9TVdccUXDKMywYcO0cuVKBQIB9evXT5s2bdKKFSsaPiAfOHDguKbWHSsmJkbz5s3TZZddph/96Ef6xje+oVNPPVVz587Vtddeq29/+9u66qqrlJCQoNWrV+v//u//9L3vfU+nnXaaJOkHP/iBpk+frssvv1xXXnmlampqtGzZslanOJ7IOZg+fbqefPJJzZo1S9/85jdVXV2tX//61+rWrZu+/e1vSzr8N5Bz587VddddpwsvvFDhcFirVq3SoUOHdPXVVzf7/Oeee67OP/98LV26VCUlJRo9erQKCgr04osv6qtf/WqTRVvaWkfVk5GRoXvuuUcPPfRQw/YHmZmZqq6u1ttvv62//e1vmj59ukaOHCnp8CI5U6ZM0bJly7R79259/etf1+bNm7V8+XJNnjxZAwcOdLX5/L333qt//OMfuv/++7Vy5comU1+lo393t2TJEo0dO7ahM+qGF64xAEDboCMIoM398Y9/bPbxzMzMiDqC6enpeumll7Ro0SK99NJLqqqq0le/+lXdc889jVZj/NnPfqb58+fr5ZdfVk1Njfr06aObb75Z/fv312233aY1a9ZowoQJJ1zH6aefrhtuuEFPPfWUFixYoPnz52vEiBF68cUX9fjjj+vZZ59VKBRSv379tGDBAl122WUNPztixAgtWbJEjz32mH76058qISFB06dP15YtW/TnP//Z7BzcfvvtSkhI0Msvv6yFCxeqS5cuGjlypH784x83TE2cMmWKTjnlFC1dulSPPvqo6urqNGTIEP3iF7/Q6NGjm33+mJgY/exnP9MvfvEL/e53v9Prr7+ur3zlK7riiit02223OS58Yq0j65kxY4YGDRqkvLy8hn3xfD6fBg4cqEcffVSTJk1qFD9v3jxlZGRoxYoVev3115WamqpZs2Y17M3nRmpqqm655RY9+uijevbZZ3XzzTc3iZk0aZJeffVVrVy5UmvXrj2ujqBXrjEAgL2YsNuvnQEA5vbs2dOwauex/uM//kP5+fl644032r8oAABw0uNvBAGgA02dOlU33HBDo8dKS0v13nvvaejQoR1UFQAAONkxNRQAOtCll16qp556St/73vc0evRoVVRU6KWXXlJdXZ1mzZrV0eUBAICTFFNDAaAD1dXVKS8vTy+99JJ27Nihrl27auTIkfrud7+rgQMHdnR5AADgJEVHEAAAAABOUhUVFc1ubURHEAAAAAAidLCsTN2ObNnjJdXV1Ro7dmyjPYslD3cEt22TWtt/9vTTpU2bnPPk5dnV9MDM7Wa5alLSzXLt3WuWSkVFzjEjRkj/+pdz3JG9qk3EVpSb5drzRYJZrp6nlJvlUjPf1DSRni5td26HW0N27UuSMrvuNMu1P9jHLFcP7TfLter1Ho4xubnSqlXOuY7saW6iR+EnZrkOZpxplqvbhn+a5dqf9W+OMT16SPtdvNzNbFd5wiz3QD90yC5Xjy3rzHLt7z/c+flcnntLPbrWmOXauSfeLFczC/yesNpa55hu3aSDB13EVZREXtAx6nomm+WKLbT77LSzi917W5+961sPGDJEWu8QU2/QoMgLqldWZpfLsEOyLC/y9SW7d5f+/d8NivG4X55zjipc7APbXoJpaZr5j39o165dqv3Sjcezi8WEQtIXX7Qe43Rcsr2eTD8VGHLzZuJWjcv3XrdxZurqvJjKNpnb9uUizrypxtk1MtuvnuySHThgF2f6O7q50blkWpdhz8ZtXd782tId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jY1VbGzL389wHbQtp/MvcS20hwMHDugHP/iBJOnmm2+m3bejL597iTbfHsrLyxtmIHTr1k1z585V165dafvtoKVzL9H2cfLrNB3Buro6xxinD3A4cVOnTlVdXZ2mTZvW8NikSZN08cUX68c//rEuueSShmlEaDtcBx2Pa6FtHTx4ULfccovy8/P1ne98R9nZ2frnP//p+HO0+8g1d+4l2nx7iImJ0WOPPaaamhotW7ZM119/vR599FH17NnT8Wdp+5Fp6dxfeOGFtH2c9DrN3aN+T5dDhw41OVb/2LH7vsDWVVdd1ehGKEk+n0+5ubkqLS1t+INqtC2ug47HtdB2KioqNHPmTL333nv69re/rdmzZ0ui3beHls69RJtvD6eeeqomTpyoyZMnKy8vT6mpqVqwYAFtvx20dO4l2j5Ofp2mI1j/h7t79uxpcmz37t0KBoP8AW8HqN/MtqqqqoMriQ5cB97FtRCZzz//XDNmzNAHH3ygK664Qj/60Y8UExMjiXbf1lo7962hzbcNn8+n8847T7t27VKvXr0k0fbby7HnvqysrMU42j5OFp2mIxgMBpWWlqaPP/64ybENGzZoyJAhHVBVdCgpKdGkSZO0ePHiJse2bdsmSUpLS2vvsqIS10HH4lpoG5WVlbrhhhv0ySef6LrrrtO8efMadURo923H6dzT5tvOli1bNG7cOOXl5TU5duDAAcXExCg+Pp623wbcnPuDBw/S9nHS6zQdQUkaP3683n33XW3ZsqXhsXfeeUfbtm1rdZU/RCY5OVn79+/XihUrVFlZ2fD4rl27tHLlSo0ePdrV3zHABtdBx+FaaBvz5s3TJ598ohkzZuiee+5pNoZ23zaczj1tvu307dtX+/fv1/Lly1VTU9Pw+M6dO/Xqq6/qrLPOUiAQoO23ATfnvk+fPrR9nPRiwuFwuKOLcKusrEwXX3yxunTpopkzZ+rQoUNasmSJ0tPTtXz5csXHx3d0iSet1157TbNmzdLpp5+uKVOm6MCBA8rLy9MXX3yhF198kc1W28i4cePUp08fLVu2rOExroP209z551qwtWXLFk2cOFE9evTQvffe2+zCC7m5ubT7NuD23NPm286qVas0Z84cDR8+XJdeeqn27t3bcG5feOEFZWVl0fbbiJtzT9vHya5TdQQlaevWrZo/f77ef/99+Xw+nXvuuZozZ07DfG20nddee01PP/208vPz5fP5lJ2drTvvvJMbYRtqriMicR20l5bOP9eCnRdffFEPPPBAqzEbN26URLu3djznnjbfdl555RUtWbJEn376qfx+v84++2zNnj1b/fr1a4ih7bcNN+eeto+TWafrCAIAAAAAItOp/kYQAAAAABA5OoIAAAAAEGXoCAIAAABAlKEjCAAAAABRho4gAAAAAEQZOoIAAAAAEGXoCAIAAABAlKEjCAAAAABRho4gAAAAAESZ/x8Xm31jNiTiKgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter3_166_1.png" } }, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(20, 14))\n", "im = plt.imshow(J_sk, **cmap_args)\n", "plt.title(\"LinearRegression from Scikit-learn\", fontsize=18)\n", "plt.xticks(fontsize=18)\n", "plt.yticks(fontsize=18)\n", "cb = fig.colorbar(im)\n", "cb.ax.set_yticklabels(cb.ax.get_yticklabels(), fontsize=18)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The results agree perfectly with our previous discussion where we used our own code.\n", "\n", "\n", "Having explored the ordinary least squares we move on to ridge\n", "regression. In ridge regression we include a **regularizer**. This\n", "involves a new cost function which leads to a new estimate for the\n", "weights $\\boldsymbol{\\beta}$. This results in a penalized regression problem. The\n", "cost function is given by" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "6\n", "0\n", " \n", "<\n", "<\n", "<\n", "!\n", "!\n", "M\n", "A\n", "T\n", "H\n", "_\n", "B\n", "L\n", "O\n", "C\n", "K" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":9: MatplotlibDeprecationWarning: Auto-removal of grids by pcolor() and pcolormesh() is deprecated since 3.5 and will be removed two minor releases later; please call grid(False) first.\n", " cb = fig.colorbar(im)\n", ":10: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " cb.ax.set_yticklabels(cb.ax.get_yticklabels(), fontsize=18)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4IAAAM2CAYAAACjUj0CAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAB4rUlEQVR4nO3de3yU5Zn/8W8mYRiGIcZsIBDSGIFGBBrB1Yisi4oRXVCDrSCKWkVd64/uVlzraT2t61mrLerPusVDkeABl1Urbdd1u1ZbD/xcSylyEhBCgARiCCGEEJKZ3x+QQMzhuXGuJE+Yz/v14uXLea5cc+WZ+3lm7rnv3HdSLBaLCQAAAACQMALdXQAAAAAAoGvREQQAAACABENHEAAAAAASDB1BAAAAAEgwdAQBAAAAIMHQEQQAAACABENHEADacOutt+q4445r9S8/P19nnnmmbr/9dlVUVLT4mQkTJujyyy/3zO0aZ+3FF1/Uaaedpvz8fD322GNd/vwu6uvr9W//9m+64IILNHr0aJ144on67ne/q3/7t3/T3r17Dztf0+vY5Mknn9Rxxx2n0tLSdn9m0aJFOu644/TJJ5+0eHzTpk2ez1daWqrjjjtOTz755GHXCgBAV0rp7gIAwM9uu+02HX300c3/X1NTo48++kj//u//ruXLl+v1119XMBiUJN1+++3q06dPd5XaodWrV+vBBx/U6NGj9aMf/UjDhw/v7pJaaWho0NVXX62lS5dqypQpuvjii9XY2KhPP/1Ujz/+uH73u99p3rx5zefbxcUXX6xTTz31sOo4+eST9cgjj2jo0KHNj1199dXq37+/HnroocPKBQCAX9ERBIAOFBYWKjs7u8VjM2bM0D333KOXX35Z7777riZNmtQc61dr1qyRJF133XWaMGFCN1fTtt/85jdasmSJnnzySU2cOLH58SuuuEJz587Vo48+qtdff12XXnqpc84xY8ZozJgxh1XHt771LX3rW99q8dgf/vAHXXjhhYeVBwAAP2NqKAB8A02dgj//+c/dXImbffv2SZL69u3bzZW0709/+pMk6W/+5m9aHZsxY4Z69eqlpUuXdnFVAAAcmegIAsA30DQFNBaLNT/W1t/+/frXv1ZRUZHy8/N13nnn6eOPP24z3+9//3tNnTpVo0eP1llnnaX58+frn//5n1uN3q1du1azZs3SSSedpBNOOEHTp0/XBx980GGtl19+uW677TZJ+0fXmv5m7vLLL9fVV1+tJ554QmPGjNGpp56q1atXS9o/lfT//J//o5NOOkn5+fmaNm2a3n333VZ5r7vuOr377ru64IIL9J3vfEeTJ0/W73//e9XU1Oiuu+5SQUGBTj31VN11112qq6vrsM6mTuqrr77a6lifPn302Wef6ZFHHmnx+Lp16/SjH/1Ip5xyiv76r/9al19+uT799NPm41//G8G23HPPPTruuOP04osvSmr5N4JNf/MnSf/xH//R5t8Ouli0aJGmTJmi73znOxo7dqxuvfVWbdu2rUVMTU2NfvKTn+jcc8/Vd77zHY0ZM0bTpk3Tf//3fzfHNNXz4osv6pJLLtGoUaN05ZVXNj/+xhtv6IknntD48eP1ne98R1OnTm23zQEAEhtTQwHgG2jqfI0YMaLdmEWLFum2227TmDFj9OMf/1gbN27UD37wA0WjUQ0ePLg57n/+5380a9Ys5eXlafbs2SovL9fDDz+scDjcYgRv9erVuvTSS5WRkaHrrrtOvXr10ttvv62///u/109+8pPmKapf94Mf/EDHHnusXn31Vf3gBz/QkCFDmo999tln2rhxo3784x+rtLRUw4YN07Jly3TFFVcoEonoqquuUt++ffXmm29q1qxZuuuuuzRjxozmn//888/1pz/9SVdccYX69eunZ599VjfccIOOP/549enTR7Nnz9ann36qV199VQMGDNAPf/jDds/XBRdcoBdeeEEPP/ywFi1apMLCQp166qkaM2aMgsFgq78N3LBhg6ZNm6aUlBRddtllSk9P1yuvvKKrrrpKxcXFys/Pb/e5mvz0pz/Vyy+/rNmzZ+vKK69sdTw9PV2PPPKIbr75Zp100kmaNm1ai78ddPHUU0/pySef1DnnnKNp06apvLxc8+fP15IlS/T6668rPT1dsVhM1113nVasWKHLLrtMOTk5Kisr0yuvvKJ/+Id/0H/+53+2mK76s5/9TKeffrrOP/989e7du8Xjffr00cyZM7Vv3z49//zzuu666/Tee++1+FtXAAAUAwC0csstt8Ty8vJin3/+eeyrr75q/rdx48bY/PnzY6NHj4793d/9Xay+vr75Z84888zYZZddFovFYrGGhobYqaeeGvve977XIubf//3fY3l5ec1xsVgsVlhYGJs4cWJsz549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cIOmT5+uoqIiVVZWat68ea2mi95xxx36/ve/r+9973u65JJLlJaWpsWLF+vPf/6z/umf/slse4Cm57nooot0ySWXqG/fvnrrrbf0+eef64477lBqaqrJ83zdrbfeqmXLlunmm2/WW2+9pb/9279VJBJRSUmJFi1apH379umuu+5qjv+nf/onTZ06VVOnTtWMGTMUiUT02muvqba2VjfccIPTc44YMULTp09XcXGxFi9erMmTJ7cZl56eriVLlui1117TaaedpqysLKf8eXl5uvzyy/XSSy+pqqpKhYWFqqqq0vz589W3b1/96Ec/kiSNHz9eL730kq677jpddNFF2rdvn37zm99o+fLlCgQCrRaLAQAgXowIAsA3MHXqVP31X/+1/vjHP+qNN95oM+bMM8/Us88+q1AopMcff1zvvvuu7r///hb7+EnSueeeqyeeeEINDQ169NFH9fbbb+u2227TqFGjWnQGx4wZo5dfflmjRo3SCy+8oEcffVR79uzRQw89pL//+783+92anmfkyJF6/vnn9bOf/Uy9e/fW008/rcsvv9zseb4uPT1dixYt0o9+9CNVVVXp6aef1j333KO3335bEydO1K9+9Svl5uY2xw8dOlSvvvqqvvOd72ju3LmaM2eOBgwYoAULFjRPvXVxww036K/+6q/04IMPtpru2eSmm25SQ0OD/vVf/7XV3wZ6+ed//mfdfffdqqys1MMPP6wFCxbopJNO0oIFC5oX4Bk/frzuu+++5tdz7ty5SktL06uvvqrjjz/+G21iDwBAR5Jirsu4AQDMNTY2aufOnW2uAnn++ecrNTVVxcXF3VAZAAA4kjEiCADdqLGxUePHj28x5VGS1qxZoy+++EL5+fndVBkAADiS8TeCANCNgsGgzj33XL3++utKSkrSqFGjtG3bNr388ss6+uijddVVV3V3iQAA4AjE1FAA6GZ1dXV67rnn9NZbb2nr1q3q16+fTj31VN1www3NexgCAABYoiMIAAAAAEeo6urqNhdDoyMIAAAAAHHaU1mpPm0s/tbd6urqNH78eO3cubPF4/7tCB6ycW+bAgHvGEn/er/dejh33lLvHeRoT2PQO8hRZaVZKrWzcnoLxx8vrVzpEDfU7nxZKt9hd+4zGzab5VJjo3dMTo7ksFH2+oYcg4IOGtK33DvIUVXvTLNcaWG7Nvb+x97t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iCAAAAAAJJJBgwa1esx5UvlHH32kSy65RGPGjNHf/u3f6v7779fu3btbxGzatEk//OEPVVBQoIKCAt18882qrKyMv3IAAAAA8L1GH/5rm9OI4Mcff6yZM2dq5MiRuummm7R161bNmzdPy5cvV3FxsQKBgHbs2KHvf//7qq+v1zXXXKPGxkY999xzWr16tRYuXKhg0O6PtQEAAAAA35xTR/CRRx7RoEGDNH/+fIUOLLM0aNAg3Xvvvfrggw90+umn68UXX1RZWZl+9atfaejQoZKkE044QVdddZXeeOMNTZs2rfN+CwAAAACAM8+poXv37tXRRx+tadOmNXcCJamgYP8S3atXr5YkLV68WAUFBc2dQEkaN26cjj32WC1evNi6bgAAAADwmai6fyroof/a34LGc0Swd+/eeu6551o9vnLlSklSVlaWdu7cqU2bNumcc85pFTdy5Ei99957Xk8DAAAAAOgih71q6ObNm/XJJ5/o4YcfVl5ens4++2xtPLBrYmZmZqv4/v37q6amRrt27VK/fv3irxgAAAAAEJfD6ghWVVVpwoQJkqQ+ffrojjvuUO/evZtXD+3Tp0+rn+ndu7ckqba2lo4gAAAAgCNYoyQf7SivpHaPHFZHMCkpSU888YTq6+v10ksv6aqrrtLjjz+u/v37e/5sIOC8U4UkyWWRUbeFSA/veTsUDtvlMpSV1fXP2cbgbw96PrsTZnvqUx3DvOP82VL3s1xAePx4u1yW598pxpHlazlihGEyy9bvehM78LfpHbE785Jk11i74z7txrGFubz/+fQ90vBTgJ55xjCZa2UOn58WLIizlE41wCxTulkmN65NOienc+v4xoYMMUvVxR/70EUOqyN41FFHadKkSZKkc889V+edd54eeugh/fznP5e0f2GZr2t6rG/fvodVWH19x8eDQe8YSQqmtP8Hkoetrs4uV8phz8pt15YKuw8rycneMZmZUnm5d5zD9wPOtm+3y5XZuMUs1xbLTmWk2jsoNVWq9o6rTbH9OGzYXNXQYJfr00/tco0fbXf+Le8VtRG7D1EbNpil0og0u+tIpaXeMQUF0pIlnmHVw707i65SQw5vMo4s79OHrNsWt/RQrXdQOCzVOsRVVcVdT7OMDLNU0RS7cz9rllkqPfO0w+eTQECKesddeplld1d66im7XOkN28xyVabY3Q+9riPX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s1Q4DNnZf9XdJbTQVM/WrVvV2NhyEZukWCwW646iAAAAAACdq66uTuPHj9fOnTtbPE5HEAAAAACOUNXV1aqurm71OB1BAAAAAEgwCTALHwAAAABwKDqCAAAAAJBg6AgCAAAAQIKhIwgAAAAACYaOIAAAAAAkGDqCAAAAAJBg6AgCAAAAQIKhIwgAAAAACSaluws4XJs2bdLDDz+sJUuWSJLOOOMM3XrrrUpPT+/myo58F110kf7yl7+0evycc87RnDlzuqGiI98dd9yhjRs36qWXXmrxONdB12jv/HMt2Pvggw/0zDPP6PPPP1cgENAJJ5ygG264QaNHj26Ood13DpdzT5vvPB999JHmzJmjVatWKRKJ6Nxzz9UNN9ygvn37NsfQ9juHy7mn7eNI1qM6gjt27ND3v/991dfX65prrlFjY6Oee+45rV69WgsXLlQwGOzuEo9YsVhM69atU2FhoSZOnNji2ODBg7upqiPbwoULtXDhQhUUFLR4nOuga7R3/rkW7C1ZskTXXnutvv3tb2v27NlqaGjQggULdNlll2nBggXKz8+n3XcSl3NPm+88H3/8sWbOnKmRI0fqpptu0tatWzVv3jwtX75cxcXFCgQCtP1O4nLuafs44sV6kMcffzx2/PHHx9auXdv82B//+MdYXl5e7NVXX+3Gyo58JSUlsby8vNi///u/d3cpR7yGhobYk08+GTvuuONieXl5scsuu6zFca6DzuV1/rkW7BUVFcXOOOOMWG1tbfNj27dvj5188smxK6+8MhaL0e47i8u5p813ngsvvDB25plnxvbs2dP82Pz582N5eXmx9957LxaL0fY7i8u5p+3jSNej/kZw8eLFKigo0NChQ5sfGzdunI499lgtXry4Gys78q1du1aSWpx72Nu7d68uvPBCPfnkkyoqKlJmZmarGK6DzuNy/rkWbO3cuVOrVq3Sueeeqz59+jQ/npGRoZNPPll/+tOfJNHuO4PruafNd469e/fq6KOP1rRp0xQKhZofb5qFsHr1akm0/c7geu5p+zjS9ZipoTt37tSmTZt0zjnntDo2cuRIvffee11fVAL54osvJB28GdbW1iocDndnSUekvXv3qqamRk888YQmTZqkCRMmtDjOddC5vM6/xLVgLRKJ6Le//W2LjkiTHTt2KDk5mXbfSVzOvUSb7yy9e/fWc8891+rxlStXSpKysrJo+53E5dxLtH0c+XrMiGB5ebkktfkNff/+/VVTU6Ndu3Z1dVkJ44svvlDfvn314IMPasyYMRozZowKCwv5NtJYJBLRO++8o0mTJrV5nOugc3mdf4lrwVpycrJyc3NbtelVq1bps88+05gxY2j3ncTl3Eu0+a6yefNmLVq0SPfff7/y8vJ09tln0/a7SFvnXqLt48jXY0YEd+/eLUltfnPZu3dvSfu/qenXr1+X1pUo1q5dq927d2vXrl165JFHVF1drXnz5unGG2/Uvn37NGXKlO4u8YgQCAQUCLT//QzXQefyOv8S10JX2L17t2655RZJ0t///d/T7rvQ18+9RJvvClVVVc0zEPr06aM77rhDvXv3pu13gfbOvUTbx5Gvx3QEo9GoZ4zXBzh8c9OmTVM0GtWMGTOaH5s8ebLOO+88Pfroozr//PObpxGh83AddD+uhc61Z88eXX/99Vq1apWuu+46FRQU6H//9389f452H7+2zr1Em+8KSUlJeuKJJ1RfX6+XXnpJV111lR5//HH179/f82dp+/Fp79yfe+65tH0c8XrM3aNpT5e9e/e2Otb02KH7vsDWJZdc0uJGKEmhUEhFRUWqqKho/oNqdC6ug+7HtdB5qqurNXPmTH3yySf63ve+p9mzZ0ui3XeF9s69RJvvCkcddZQmTZqkKVOmqLi4WFlZWXrooYdo+12gvXMv0fZx5OsxHcGmP9zdvn17q2Pbtm1Tamoqf8DbDZo2s62tre3mShID14F/cS3E56uvvtIVV1yhzz77TBdffLHuv/9+JSUlSaLdd7aOzn1HaPOdIxQK6YwzztDWrVs1YMAASbT9rnLoua+srGw3jraPI0WP6QimpqYqOztbn3/+eatjK1as0KhRo7qhqsRQXl6uyZMn66mnnmp17Msvv5QkZWdnd3VZCYnroHtxLXSOmpoaXX311Vq5cqWuvPJK3XvvvS06IrT7zuN17mnznWfdunWaMGGCiouLWx3bvXu3kpKSFAwGafudwOXc79mzh7aPI16P6QhK0sSJE/XRRx9p3bp1zY99+OGH+vLLLztc5Q/xyczM1K5du7Rw4ULV1NQ0P75161YtWrRIp5xyitPfMcAG10H34VroHPfee69WrlypK664QrfddlubMbT7zuF17mnzneeYY47Rrl279Morr6i+vr758c2bN+udd97RySefrEgkQtvvBC7nfvDgwbR9HPGSYrFYrLuLcFVZWanzzjtPycnJmjlzpvbu3au5c+cqJydHr7zyioLBYHeXeMR69913NWvWLH3729/W1KlTtXv3bhUXF2vfvn16+eWX2Wy1k0yYMEGDBw/WSy+91PwY10HXaev8cy3YWrdunSZNmqR+/frp9ttvb3PhhaKiItp9J3A997T5zvPmm2/q5ptv1ujRo3XBBRdox44dzed2wYIFysvLo+13EpdzT9vHka5HdQQlaf369XrwwQf16aefKhQK6fTTT9fNN9/cPF8bnefdd9/Vs88+q1WrVikUCqmgoEA33ngjN8JO1FZHROI66CrtnX+uBTsvv/yy7rnnng5jVq9eLYl2b+1wzj1tvvP8+te/1ty5c7VmzRqFw2GNHTtWs2fP1rHHHtscQ9vvHC7nnraPI1mP6wgCAAAAAOLTo/5GEAAAAAAQPzqCAAAAAJBg6AgCAAAAQIKhIwgAAAAACYaOIAAAAAAkGDqCAAAAAJBg6AgCAAAAQIKhIwgAAAAACYaOIAAAAAAkmP8PGZYR3soopNMAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter3_169_1.png" } }, "output_type": "display_data" } ], "source": [ "_lambda = 0.1\n", "clf_ridge = skl.Ridge(alpha=_lambda).fit(X_train, y_train)\n", "J_ridge_sk = clf_ridge.coef_.reshape(L, L)\n", "fig = plt.figure(figsize=(20, 14))\n", "im = plt.imshow(J_ridge_sk, **cmap_args)\n", "plt.title(\"Ridge from Scikit-learn\", fontsize=18)\n", "plt.xticks(fontsize=18)\n", "plt.yticks(fontsize=18)\n", "cb = fig.colorbar(im)\n", "cb.ax.set_yticklabels(cb.ax.get_yticklabels(), fontsize=18)\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the **Least Absolute Shrinkage and Selection Operator** (LASSO)-method we get a third cost function." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "$$\n", "\\begin{equation}\n", " C(\\boldsymbol{X}, \\boldsymbol{\\beta}; \\lambda) = (\\boldsymbol{X}\\boldsymbol{\\beta} - \\boldsymbol{y})^T(\\boldsymbol{X}\\boldsymbol{\\beta} - \\boldsymbol{y}) + \\lambda \\sqrt{\\boldsymbol{\\beta}^T\\boldsymbol{\\beta}}.\n", "\\label{_auto12} \\tag{12}\n", "\\end{equation}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finding the extremal point of this cost function is not so straight-forward as in least squares and ridge. We will therefore rely solely on the function ``Lasso`` from **Scikit-Learn**." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":8: MatplotlibDeprecationWarning: Auto-removal of grids by pcolor() and pcolormesh() is deprecated since 3.5 and will be removed two minor releases later; please call grid(False) first.\n", " cb = fig.colorbar(im)\n", ":9: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " cb.ax.set_yticklabels(cb.ax.get_yticklabels(), fontsize=18)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4IAAAM2CAYAAACjUj0CAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABNy0lEQVR4nO3de5xWdbko8GdmiDtUHAkRvBAnsANeyA2W7bwgAgEGpqKGV7TcZafEirJDlu6SJBU3appJGjhe4khZwmlbu23b43V32adUMEQkpMkbCMOAXN5Z5w/l1XGYmRdYM++aWd/v5zOfaq3f+1u/eVgv8by/531WRZIkSQAAAJAbleVeAAAAAG1LIggAAJAzEkEAAICckQgCAADkjEQQAAAgZySCAAAAOSMRBHiHr33tazF06NB44YUXyr2UVD3yyCPx8Y9/PIYPHx6f+tSnyr2cJi1dujTOOuusGDlyZBx66KExduzY+Pa3vx0vvfTSbs+1ePHiGDp0aDz++OMREfH444/H0KFDY/HixU2+5oUXXoihQ4fG9ddf3+D4mjVrSrrm6NGj46yzztrttQJAW+pU7gUA0Prq6+vjS1/6UlRVVcWll14a++67b7mXtEtz586Nm2++OY499ti46KKLomvXrrFixYr43//7f8eSJUvinnvuiQMOOKDk+UaOHBlz5syJwYMHl/yaPn36xJw5c2Lo0KHFY9///vfjpz/9afzqV7/ard8HALJKIgiQAy+//HKsW7cuzjvvvJg2bVq5l7NLNTU18cMf/jDOOuusmDVrVoNzkyZNimnTpsW1114b1113Xclz7r///rH//vvv1jq6d+8ekydPbnDs0UcfjUKhsFvzAECWKQ0FyIHt27dHRESPHj3KvJKm/b//9/+iUCjERz/60UbnRowYEYceemj813/9V9svDAA6IIkgwF745S9/GWeeeWYcccQRMXz48Bg9enTMmTMntm3bVhyzbdu2+M53vhPHH398DB8+PI455pi4/PLLY8OGDcUxSZLEDTfcEOPGjYtDDjkkjjrqqPjKV74SNTU1Da63fv36+Na3vhUf+9jHYvjw4TFu3Li45ZZbmt2tuv766+P444+PiIgbbrih+J2566+/Pg455JD41a9+FR/96EdjxIgRsWjRopKvc/3118eIESPi2WefjfPOOy8OP/zw+NjHPhY//OEPI0mSmD9/fhx33HHxoQ99KM4///wWv3O5M0n96U9/2iB+Oy1YsCAefPDBBsc2bdoUV155ZRx77LFx2GGHxYknnlj8HSIaf0dwV5YsWRIf/OAH4wtf+EIUCoVG3xEcPXp0PPHEE7F27dpdfnewFH/84x/jvPPOixEjRsSIESNi+vTp8ac//anBmCRJ4q677opTTjklRowYEYccckiMHz8+brnllkiSpDhu9OjRMWvWrPj6178ehxxySBx99NGxbt26GD16dFx22WVx3333xcSJE+OQQw6JsWPHRnV19W6vF4COT2kowB5atGhRzJo1K0aPHh1f/vKXY/v27fGrX/0q5s+fH927d4/Pf/7zERFxxRVXxP333x9nn3127L///rFixYqorq6O1atXx49+9KOIiLj55pvjxhtvjGnTphUb1SxYsCCefPLJuP/++6Oqqio2bNgQp59+eqxduzZOP/30GDRoUDz88MNxzTXXxNNPP91kyeQJJ5wQvXr1itmzZ8cJJ5wQJ5xwQgwePDieeOKJ2LFjR8yaNSvOP//82LZtWxxxxBG7dZ3t27fHOeecE2PGjImxY8fGvffeG1dffXU89thjsXbt2jjnnHNi/fr1ceutt8all14aCxcubDKeRx55ZAwcODD+9V//NX7/+9/H2LFj46Mf/WiMHDky3v3ud0fnzp0bjN+2bVtMmzYtVqxYEVOnTo2DDz44fvvb38asWbNiy5YtcfbZZ7f4Z/jQQw/FV7/61Tj66KPjmmuuiaqqqkZjvv71r8c111wT69evj0svvbTBdwdL8fDDD8eFF14YBx98cHzxi1+Mbdu2xeLFi2PatGlx2223xT/8wz9ERMR1110XN998c5x00kkxderUqKuri5/97GdxzTXXRN++feOkk04qzrlkyZIYNGhQ/K//9b/ilVdeiT59+hR/n50fTuyzzz5xzz33xBVXXBEDBw6MY445ZrfWDUAHlwDQwFe/+tVkyJAhyZo1a5odN378+OS0005L6uvri8e2b9+eHH300cmkSZOKxw499NDk8ssvb/DauXPnJp/85CeTTZs2JUmSJB//+MeTz3zmMw3G3HXXXcknPvGJZPXq1UmSJMn3vve9ZMiQIcmvfvWrBuO+9a1vJUOGDEkefPDBJte6Zs2aZMiQIcm8efOKx+bNm9fo2O5cZ+frv/vd7xbHrFixIhkyZEgyYsSI5NVXXy0e/9KXvpQMHTo02bp1a5NrTJIkee6555IpU6YkQ4YMKf588IMfTM4666zkoYceajC2uro6GTJkSPLzn/+8eKy+vj751Kc+lXz0ox9NduzYkdx7773JkCFDksceeyxJkiR57LHHkiFDhiT33ntv8oc//CE57LDDknPOOSd5/fXXm43VmWeemRx33HHNrn2n4447LjnzzDOTJEmSQqGQHH/88cnpp5+e7Nixozimrq4uOeGEE5LJkycnSZIk27ZtSz70oQ8lM2bMaDBXbW1tMnz48OTCCy9sMP/BBx9cvC/efnzo0KHJsmXLisdeeumlZOjQockll1xS0toByA+loQB76Oc//3nccsstUVFRUTz26quvRu/evWPz5s3FY/vuu28sXbo0Fi9eHBs3boyIiIsvvjjuvffeYjnkvvvuG48//nj8+Mc/jldeeSUiIk4//fS47777il0yf/Ob38TgwYNjzJgxDdbxuc99LiIi/u3f/m2Pfo9//Md/bPC/d/c6bx930EEHRUTEhz70oeIuVUTEwIEDI0mS4u/WlEGDBsXixYtjwYIFcfbZZ8fgwYOjUCjE448/Hueff37ccsstxbEPPvhg9OnTJyZNmlQ8VlFREXPmzInq6uqorGz6/+JWrFgRF154YQwYMCBuuumm6NKlS7Pr2lNPP/10rFmzJsaMGRMbNmyIdevWxbp16+L111+P4447LpYtWxZ///vf413velc88sgjccUVVzR4/fr166Nnz54N7qeIiAMOOGCX3VMHDRoUBx98cPF/9+3bN/bZZ58W4w5A/igNBdhD73rXu+I///M/4/7774/nnnsu/vrXv8arr74aEREDBgwojvvWt74VF198cVx66aXxjW98Iw4//PA44YQT4uSTT45evXpFRMTMmTPjs5/9bFx55ZUxe/bsGDZsWIwePTqmTp0affv2jYg3nm/3sY99rNE6+vbtG7179461a9fu0e/x3/7bf2vwv3f3Ovvss0/xv3fq1GmXc+4suayvr29xPRUVFXHkkUfGkUceGRERf/vb3+Lee++NH/zgB/Ev//IvMXny5OjXr1+sXbs2DjjggAaJeETD2DflRz/6UVRWVsbrr78eL7/88m49kiIioq6urlFy1qtXr+jatWuDY3/9618jImLOnDkxZ86cXc5VU1MT++67b7zrXe+KBx98MP7t3/4tVq1aFatXry5+jzR523cEIxrHd6e3J987de7cuaS4A5AvEkGAPXTNNdfELbfcEv/jf/yPOPzww2Py5MkxYsSI+Od//ucGTV4+8pGPxL//+78Xfx5++OGYPXt23H777bF48eLo06dPHHzwwfGv//qv8dBDD8W///u/x0MPPRTz5s2L22+/Pe6+++4YPHhwo2Tg7err6+Nd73rXHv0e79w5293r7Op7de9MzkqxcOHC2Lp1a1xwwQUNju+3337xP//n/4wuXbrENddcE//1X/8V48aNi0KhsEfXiYgYOnRoXHbZZXHuuefG5ZdfHvPnz9+t1//oRz+KG264ocGx2bNnxyc/+ckGx3YmYF/84hfj8MMP3+Vc73//+yNJkvjKV74S999/fxxxxBExYsSIOO2002LkyJFxzjnnNHrNrmIe0fjPEgCaIhEE2ANr166NW265JSZPntxop+ftZXjbtm2LZcuWxb777hsTJ06MiRMnRn19fdx2220xZ86cWLJkSXzqU5+K5cuXR8+ePeP4448vdvhcunRpzJgxIxYtWhRf+9rXYsCAAfHcc881WsvLL78cmzZtiv79+6fyu7XVdd7p17/+dfzpT3+KT33qU9G9e/dG54cMGRIRUdx122+//eKZZ55pNO63v/1tLF26NL7yla80ea1zzz03/uEf/iHOPffc+OEPfxj3339/gxLTlkyZMiWOOOKIBsf++3//743G7dyd7N69exx11FENzv3pT3+KDRs2RNeuXeN3v/td3H///fG5z30uvvjFLxbH7NixI1577bXdfhYiALTER4cAe2Bnyd47//H/29/+Np5//vnYsWNHRES89tprcdppp8UPfvCD4pjKyso45JBDiv+9UCjE2WefHVdeeWWDuQ477LDimIiI4447Lp577rn49a9/3WDczu/NHXvssan8bm11nXc68cQTY/PmzfHd7363USljfX19LFq0KHr37h0jR46MiIijjz46XnnllfjVr37VYOyPf/zjePDBB+O9731vi9f83Oc+F/3794/Zs2cXv7+5K5WVlQ3WtP/++8dRRx3V4Od973tfo9cNHz48+vbtGwsXLoy6urri8U2bNhXLhauqquK1116LiMb3009+8pPYsmVL8X4CgLTYEQRowty5c3f5APaPf/zjccQRR8R+++0XN998c2zdujX23Xff+NOf/hQ//elPo0uXLsV/9L/vfe+LE088Me68887YsmVLjBgxIl577bW44447Yp999omPf/zj0blz5zjrrLPipptuiosuuig+9rGPxeuvvx733HNPdOvWLU4++eSIiLjwwgvjgQceiIsvvjjOOOOMOOigg+Kxxx6LBx54IMaOHZva4wHa6jrv9MlPfjIeeuihuOeee+KPf/xjjB8/Pvbdd9949dVX4//8n/8TzzzzTFxzzTXF3cLTTz897r333pgxY0ZMmzYtBg0aFA8++GA8/PDDceWVVzZZPvl23bt3j6997WvxxS9+Ma6++upGzVp26tOnT/znf/5n3HbbbfGhD32omKS35F3veld84xvfiIsvvjg++clPximnnBJdunSJRYsWxd/+9re4+uqro1OnTjFixIjo2bNnzJ49O/72t79F79694/HHH4+lS5c2uJ8AIC0SQYAm3H///bs8/v73vz8+8pGPxC233BLf/e53Y8GCBZEkSRxwwAHx9a9/PXbs2BHf+c534sknn4zhw4fHP//zP8f+++8fS5YsiSVLlkS3bt3iIx/5SMyYMaPY3OMLX/hCvOc974l77703rrrqqqiqqooPfehD8b3vfS8GDx4cERHvec974p577onrrrsuli5dGhs3boz9998/Zs6cGeeee25qv3dbXeedKisr47rrrov77rsv7rvvvrjjjjuitrY23v3ud8cRRxwRl19+eRx66KHF8V27do2FCxfGddddF0uWLIna2toYPHhwXHfddfHxj3+85OuOHz8+/vEf/zF+8pOfxEknnVRszvN2F1xwQTER/eQnP1lyIhgRMW7cuPjRj34UN910U3z/+9+PysrK+MAHPhA33XRTHHfccRHxRsOdW265Ja6++ur4/ve/H507d45BgwbFtddeG3/6059iwYIF8corrzRozAMAe6Miaa4rAAAAAB2O7wgCAADkjEQQAAAgZySCAAAAOaNZDAAAQAe1cePGXT4iSbMYAACAvbRl3bro9mY38Cx5/fXX4+ijjy4+A3mn7CaC73iYcCOVlS2PiYiD3v+DFseU6vnnLkxtrnatxNjTCsS+vMS/fMS+fMS+fMS+fMS+gYPe/8O9nmPgwJ7xf//vtBRWk20/+sd/jI0vvFDuZRT1Hjgwpv/f/xs1NTVRKBQanOvwpaGrV29oeRAAALBLq1c3Litk1za+8EJsWL26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paBv/2n6ETot7gh26dIl5s+f3+j4smXLIiJiv/32iw0bNsSaNWti3LhxjcYNGzYsHnzwwZYuAwAAQBvZ7a6ha9eujccffzyuuuqqGDJkSJxwwgmxevXqiIjo169fo/F9+/aNTZs2RW1tbfTq1WvvVwwAAMBe2a1E8LXXXovRo0dHRES3bt1i1qxZ0aVLl2L30G7dujV6TZcuXSIiYvPmzRJBAACgAytERIaeKB8VTZ7ZrUSwoqIi5s6dG9u2bYuFCxfGeeedF9dee2307du3xddWVpb8pIqdL0hnDK1D7MtH7MtL/MtH7MtH7CNiN565leZsJcQ+SW7Zy7WwS+57OrjdSgTf/e53x4QJEyIiYvz48TFp0qT47ne/GzfffHNEvNFY5p12HuvRo8furay+6S82RsQbb86WxtA6xL58xL68xL98xL58xL6oPsVUsLKZBg5vDSot9hVV/5TCit6SFG5Odb52yX3fOiTXmbLHfxpdu3aNY489NmpqauJ973tfRES8/PLLjca99NJL0bt37+jevfuerxIAACDz6jP4s2stJoIrV66M0aNHR3V1daNzdXV1UVFREZ07d46BAwfGU0891WjM008/HcOHD2/pMgAAALSRFhPBAw88MGpra+Puu++Obdu2FY+vXbs2HnjggRg5cmT07Nkzxo4dG48++misXLmyOOaRRx6JVatWFctJAQAAKL+KJElabGtz3333xcyZM+Pwww+PT3ziE7F+/fqorq6O7du3x5133hlDhgyJdevWxaRJk6KqqiqmT58eW7dujVtvvTUOOOCAuPvuu6Nz5867tzLfEcwusS8fsS8v8S8fsS8fsS/yHcEccd+3jhx8R/CggzbG6tXZuXcOPLAynn++9y7PlZQIRkQsXbo0br311vjLX/4S3bt3jw9/+MMxY8aMGDRoUHHMc889F7Nnz47f/e530bVr1zjmmGNi5syZ0adPn91ftUQwu8S+fMS+vMS/fMS+fMS+SCKYI+771iERbHOpJIJtTiKYXWJfPmJfXuJfPmJfPmJfJBHMEfd965AItrnmEsHdenwEAAAATSlEc506217Te34SQQCAEpS0i1eiUnYXK0scl/YOXkXVl1KbKylck9pcQLo6/v4sAAAADdgRBAAASEX7KQ21IwgAAJAzEkEAAICcURoKAACQivp4ozw0++wIAgAA5IxEEAAA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IX0PPfRQ3HTTTfHUU09FZWVlHHbYYXHxxRfH4YcfXhzjvm8dpcTePd96Hn300Zg3b14sX748evbsGePHj4+LL744evToURzj3m8dpcTevU9H1q4SwfXr18c555wT27ZtiwsuuCAKhULMnz8/nnnmmVi0aFF07ty53EvssJIkiZUrV8aYMWNi7NixDc4NGDCgTKvq2BYtWhSLFi2KUaNGNTjufdA2moq/90L6nnjiifj0pz8dH/jAB2LGjBmxY8eOuPPOO+PMM8+MO++8Mw499FD3fSspJfbu+dbz2GOPxfTp02PYsGHx5S9/OWpqamLBggXx5JNPRnV1dVRWVrr3W0kpsXfv0+El7ci1116bfPCDH0yeffbZ4rGHH344GTJkSHLPPfeUcWUd31//+tdkyJAhyb333lvupXR4O3bsSK6//vpk6NChyZAhQ5IzzzyzwXnvg9bVUvy9F9I3efLk5Nhjj002b95cPPbyyy8nI0eOTM4999wkSdz3raWU2LvnW89JJ52UHHfcccmWLVuKx+64445kyJAhyYMPPpgkiXu/tZQSe/c+HV27+o7gkiVLYtSoUTF48ODisaOOOioGDRoUS5YsKePKOr5nn302IqJB7Enf1q1b46STTorrr78+Jk+eHP369Ws0xvug9ZQSf++FdG3YsCGWL18e48ePj27duhWP77PPPjFy5Mj44x//GBHu+9ZQauzd861j69at8d73vjemTp0aXbt2LR7fWYXwzDPPRIR7vzWUGnv3Ph1duykN3bBhQ6xZsybGjRvX6NywYcPiwQcfbPtF5ciKFSsi4q2/DDdv3hzdu3cv55I6pK1bt8amTZti7ty5MWHChBg9enSD894Hraul+Ed4L6StZ8+e8ctf/rJBIrLT+vXro6qqyn3fSkqJfYR7vrV06dIl5s+f3+j4smXLIiJiv/32c++3klJiH+Hep+NrNzuCL774YkTELj+h79u3b2zatClqa2vbelm5sWLFiujRo0fMnj07RowYESNGjIgxY8b4NDJlPXv2jAceeCAmTJiwy/PeB62rpfhHeC+kraqqKg466KBG9/Ty5cvjD3/4Q4wYMcJ930pKiX2Ee76trF27NhYvXhzf+c53YsiQIXHCCSe499vIrmIf4d6n42s3O4J1dXUREbv85LJLly4R8cYnNb169WrTdeXFs88+G3V1dVFbWxtz5syJjRs3xoIFC+KSSy6J7du3x5QpU8q9xA6hsrIyKiub/nzG+6B1tRT/CO+FtlBXVxdf/epXIyLiM5/5jPu+Db0z9hHu+bbw2muvFSsQunXrFrNmzYouXbq499tAU7GPcO/T8bWbRLC+vr7FMS39A449N3Xq1Kivr49p06YVj02cODEmTZoU3/ve9+LEE08slhHRerwPys97oXVt2bIlPvvZz8by5cvjwgsvjFGjRsXvf//7Fl/nvt97u4p9hHu+LVRUVMTcuXNj27ZtsXDhwjjvvPPi2muvjb59+7b4Wvf+3mkq9uPHj3fv0+G1m789dj7TZevWrY3O7Tz29ue+kK4zzjijwV+EERFdu3aNyZMnxyuvvFL8QjWty/ug/LwXWs/GjRtj+vTp8fjjj8fJJ58cM2bMiAj3fVtoKvYR7vm28O53vzsmTJgQU6ZMierq6thvv/3iu9/9rnu/DTQV+wj3Ph1fu0kEd35x9+WXX2507qWXXorevXv7Am8Z7HyY7ebNm8u8knzwPsgu74W98+qrr8bZZ58df/jDH+K0006L73znO1FRURER7vvW1lzsm+Oebx1du3aNY489NmpqauJ973tfRLj328rbY79u3bomx7n36SjaTSLYu3fvGDhwYDz11FONzj399NMxfPjwMqwqH1588cWYOHFi3HDDDY3OrVq1KiIiBg4c2NbLyiXvg/LyXmgdmzZtivPPPz+WLVsW5557blxxxRUNEhH3fetpKfbu+dazcuXKGD16dFRXVzc6V1dXFxUVFdG5c2f3fisoJfZbtmxx79PhtZtEMCJi7Nix8eijj8bKlSuLxx555JFYtWpVs13+2Dv9+vWL2traWLRoUWzatKl4vKamJhYvXhxHHnlkSd9jIB3eB+XjvdA6rrjiili2bFmcffbZcemll+5yjPu+dbQUe/d86znwwAOjtrY27r777ti2bVvx+Nq1a+OBBx6IkSNHRs+ePd37raCU2A8YMMC9T4dXkSRJUu5FlGrdunUxadKkqKqqiunTp8fWrVvj1ltvjQMOOCDuvvvu6Ny5c7mX2GH9+te/josuuig+8IEPxKmnnhp1dXVRXV0d27dvj7vuusvDVlvJ6NGjY8CAAbFw4cLiMe+DtrOr+HsvpGvlypUxYcKE6NWrV3z961/fZeOFyZMnu+9bQamxd8+3nvvuuy9mzpwZhx9+eHziE5+I9evXF2N75513xpAhQ9z7raSU2Lv36ejaVSIYEfHcc8/F7Nmz43e/+1107do1jjnmmJg5c2axXpvW8+tf/zp+8IMfxPLly6Nr164xatSouOSSS/xF2Ip2lYhEeB+0labi772Qnrvuuiu+9a1vNTvmmWeeiQj3fdp2J/bu+dazdOnSuPXWW+Mvf/lLdO/ePT784Q/HjBkzYtCgQcUx7v3WUUrs3ft0ZO0uEQQAAGDvtKvvCAIAALD3JIIAAAA5IxEEAADIGYkgAABAzkgEAQAAckYiCAAAkDMSQQAAgJyRCAIAAOSMRBAAACBn/j9AxQd63bHGLAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter3_173_1.png" } }, "output_type": "display_data" } ], "source": [ "clf_lasso = skl.Lasso(alpha=_lambda).fit(X_train, y_train)\n", "J_lasso_sk = clf_lasso.coef_.reshape(L, L)\n", "fig = plt.figure(figsize=(20, 14))\n", "im = plt.imshow(J_lasso_sk, **cmap_args)\n", "plt.title(\"Lasso from Scikit-learn\", fontsize=18)\n", "plt.xticks(fontsize=18)\n", "plt.yticks(fontsize=18)\n", "cb = fig.colorbar(im)\n", "cb.ax.set_yticklabels(cb.ax.get_yticklabels(), fontsize=18)\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is quite striking how LASSO breaks the symmetry of the coupling\n", "constant as opposed to ridge and OLS. We get a sparse solution with\n", "$J_{j, j + 1} = -1$.\n", "\n", "\n", "\n", "\n", "We see how the different models perform for a different set of values for $\\lambda$." ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\r", " 0%| | 0/10 [00:00" ] }, "metadata": { "filenames": { "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter3_175_13.png" } }, "output_type": "display_data" } ], "source": [ "lambdas = np.logspace(-4, 5, 10)\n", "\n", "train_errors = {\n", " \"ols_sk\": np.zeros(lambdas.size),\n", " \"ridge_sk\": np.zeros(lambdas.size),\n", " \"lasso_sk\": np.zeros(lambdas.size)\n", "}\n", "\n", "test_errors = {\n", " \"ols_sk\": np.zeros(lambdas.size),\n", " \"ridge_sk\": np.zeros(lambdas.size),\n", " \"lasso_sk\": np.zeros(lambdas.size)\n", "}\n", "\n", "plot_counter = 1\n", "\n", "fig = plt.figure(figsize=(32, 54))\n", "\n", "for i, _lambda in enumerate(tqdm.tqdm(lambdas)):\n", " for key, method in zip(\n", " [\"ols_sk\", \"ridge_sk\", \"lasso_sk\"],\n", " [skl.LinearRegression(), skl.Ridge(alpha=_lambda), skl.Lasso(alpha=_lambda)]\n", " ):\n", " method = method.fit(X_train, y_train)\n", "\n", " train_errors[key][i] = method.score(X_train, y_train)\n", " test_errors[key][i] = method.score(X_test, y_test)\n", "\n", " omega = method.coef_.reshape(L, L)\n", "\n", " plt.subplot(10, 5, plot_counter)\n", " plt.imshow(omega, **cmap_args)\n", " plt.title(r\"%s, $\\lambda = %.4f$\" % (key, _lambda))\n", " plot_counter += 1\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that LASSO reaches a good solution for low\n", "values of $\\lambda$, but will \"wither\" when we increase $\\lambda$ too\n", "much. Ridge is more stable over a larger range of values for\n", "$\\lambda$, but eventually also fades away.\n", "\n", "\n", "To determine which value of $\\lambda$ is best we plot the accuracy of\n", "the models when predicting the training and the testing set. We expect\n", "the accuracy of the training set to be quite good, but if the accuracy\n", "of the testing set is much lower this tells us that we might be\n", "subject to an overfit model. The ideal scenario is an accuracy on the\n", "testing set that is close to the accuracy of the training set." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter3_177_0.png" } }, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(20, 14))\n", "\n", "colors = {\n", " \"ols_sk\": \"r\",\n", " \"ridge_sk\": \"y\",\n", " \"lasso_sk\": \"c\"\n", "}\n", "\n", "for key in train_errors:\n", " plt.semilogx(\n", " lambdas,\n", " train_errors[key],\n", " colors[key],\n", " label=\"Train {0}\".format(key),\n", " linewidth=4.0\n", " )\n", "\n", "for key in test_errors:\n", " plt.semilogx(\n", " lambdas,\n", " test_errors[key],\n", " colors[key] + \"--\",\n", " label=\"Test {0}\".format(key),\n", " linewidth=4.0\n", " )\n", "plt.legend(loc=\"best\", fontsize=18)\n", "plt.xlabel(r\"$\\lambda$\", fontsize=18)\n", "plt.ylabel(r\"$R^2$\", fontsize=18)\n", "plt.tick_params(labelsize=18)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From the above figure we can see that LASSO with $\\lambda = 10^{-2}$\n", "achieves a very good accuracy on the test set. This by far surpasses the\n", "other models for all values of $\\lambda$.\n", "\n", "\n", "\n", "\n", "\n", "\n", "## Exercises and Projects\n", "\n", "\n", "\n", "The main aim of this project is to study in more detail various\n", "regression methods, including the Ordinary Least Squares (OLS) method,\n", "The total score is **100** points. Each subtask has its own final score.\n", "\n", "\n", "We will first study how to fit polynomials to a specific\n", "two-dimensional function called [Franke's\n", "function](http://www.dtic.mil/dtic/tr/fulltext/u2/a081688.pdf). This\n", "is a function which has been widely used when testing various\n", "interpolation and fitting algorithms. Furthermore, after having\n", "established the model and the method, we will employ resamling\n", "techniques such as cross-validation and/or bootstrap in order to perform a\n", "proper assessment of our models. We will also study in detail the\n", "so-called Bias-Variance trade off.\n", "\n", "\n", "The Franke function, which is a weighted sum of four exponentials reads as follows" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\begin{align*}\n", "f(x,y) &= \\frac{3}{4}\\exp{\\left(-\\frac{(9x-2)^2}{4} - \\frac{(9y-2)^2}{4}\\right)}+\\frac{3}{4}\\exp{\\left(-\\frac{(9x+1)^2}{49}- \\frac{(9y+1)}{10}\\right)} \\\\\n", "&+\\frac{1}{2}\\exp{\\left(-\\frac{(9x-7)^2}{4} - \\frac{(9y-3)^2}{4}\\right)} -\\frac{1}{5}\\exp{\\left(-(9x-4)^2 - (9y-7)^2\\right) }.\n", "\\end{align*}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The function will be defined for $x,y\\in [0,1]$. Our first step will\n", "be to perform an OLS regression analysis of this function, trying out\n", "a polynomial fit with an $x$ and $y$ dependence of the form $[x, y,\n", "x^2, y^2, xy, \\dots]$. We will also include bootstrap first as\n", "a resampling technique. After that we will include the cross-validation technique. As in homeworks 1 and 2, we can use a uniform\n", "distribution to set up the arrays of values for $x$ and $y$, or as in\n", "the example below just a set of fixed \n", "values for $x$ and $y$ with a given step\n", "size. We will fit a\n", "function (for example a polynomial) of $x$ and $y$. Thereafter we\n", "will repeat much of the same procedure using the Ridge and Lasso\n", "regression methods, introducing thus a dependence on the bias\n", "(penalty) $\\lambda$.\n", "\n", "Finally we are going to use (real) digital terrain data and try to\n", "reproduce these data using the same methods. We will also try to go\n", "beyond the second-order polynomials metioned above and explore \n", "which polynomial fits the data best.\n", "\n", "\n", "The Python code for the Franke function is included here (it performs also a three-dimensional plot of it)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":9: MatplotlibDeprecationWarning: Calling gca() with keyword arguments was deprecated in Matplotlib 3.4. Starting two minor releases later, gca() will take no keyword arguments. The gca() function should only be used to get the current axes, or if no axes exist, create new axes with default keyword arguments. To create a new axes with non-default arguments, use plt.axes() or plt.subplot().\n", " ax = fig.gca(projection='3d')\n", ":37: MatplotlibDeprecationWarning: Auto-removal of grids by pcolor() and pcolormesh() is deprecated since 3.5 and will be removed two minor releases later; please call grid(False) first.\n", " fig.colorbar(surf, shrink=0.5, aspect=5)\n" ] }, { "data": { "image/png": "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htWLf4Rl7tfTNA2K0locJjUrGZJEirfUcqRarY2rTuTUvuKG5glJolvqbGAvrouigEQihtHRXMfH5QTzEAIa4YmiAEHgx6Va53kOmUwKw8NjHR8bteaVpObxmOtVPM9jYKAn0Lmzbt1a3H33bdB1DSeffDJOOOEEy+OPPfYYVqxYAQDYaaedcNlllyGRSODdd9/F+eefj+HhYXz0ox/FlVdeidyNl0LLjXT8vuxg031In3VZaPvrBBPQ+EssRezL/YGeqcMwnAta9wFg9EHl8+VA7R8Mw+CJrecDALgYB13RLMQEAE9MJ49TkqJEUy5XfLU97bgVKEodlUoVDMMim80bfW8TKRVobWvhG35I1hpRt1Icc0TmrFoXPVTrwfbbKbzqVW+//RYuuOACzJs3D7vt9hF89KN7IZl0dsIcHNyElStvwG233YOtturDcccdh3322cew3c3lcsbopx122AErV67Eddddh4svvhjLli3DwoUL8ZnPfAZ330363xiBBxuiMJeZAJGvH0I9AreVG9JI296UXbLCQ65MQQWS5v49mh554W877Nt8vRgJiXVFa9wnIaBatv7gn5g+H717pDH/iSeQyxXBcZznygNNR2u14K07zRVOc4rhLhXodp3IPLDTXCOKx8mCQSaTDNXcjmHg2tVvrg/ROXOUOIOkXGETuvl4JCmBQw45BH/729/wwAMPYPbsD+K225zHKz311N+w557zkU5nEI/Hceihh2Lt2rU455xzAABvvPEGtt56a4OsDjzwQJx22mn4xje+gSeffBI//vGPAQCHHXYYeW9suGkd4ycUnAB0ubeOnEztEAzQXL5XlHrgKMucMioKGbnkhdeP+XTL3ygxmcHF2BaCGn02h78f8HHs9NAj8FryNteXwmicdZIKSJKInp4kGIadEAdMM2HWagricQm1Wt0iExi/vzkDwD8qo6p1aiTnRN5my+BurQJScByHY489Dqeeeio2bsyiXHb/zQ8NDaK/f8C4P336dDz33HPG/e222w4bNmzASy+9hDlz5uDhhx/G0NAQRkdHkUwmwTdsPvr6+gAADM8BIfbWMSHuq1N0jZxoGtfunDHz8r0oCoH0EHYtEh3K6IbXj/k0Bp8JbvNBo6je3az6jlcOPwi7/O73Tk8x0r7gTgrtgxIALSSbZ6pN1BAEXUeLTGC8SvFOScRd50UK7HSScDfdHoiXkw5BECB4rHj5aX/S6TSuvvpqXHLJJdA0DcceeywEQXDVCDEcD/DhrbAx3GaW1gGtqm1RFAKtPNH0p10Hgna0SDRaciImp6jJjIGP9AAA1Jp1uxcP/SQyszKYccsqAO26YYYnNrTXiewkoWka6nUVHMd21a7XTSne3oircD4Xu2Wws9tDuJFm0Cbo6dNn4Nln/27cHxwctGh/VFXFzJkz8Ytf/AIA8Nxzz2HbbbdFX18f8vk8VFUFx3EYGRnB9OnTN8vIKdTEkudZo/m2UCg3fnz+XzopKMZQqVgdCLyUpKRpN9HwA7cry1u1VV7E5AdKTADAic4f2cbTjwbHsUilmo3Efld/PzuN8YD035UwMpLF4OBoI6Jk0deXwcBAL1KpBCRJHJejgF+EQ1PAXK5oc1iQPB0WupF+URfQWs3u9iBiYKAX/f09oTQu08jJD/Pn742nn34So6OjKJfLWLdunUX7wzAMFi1ahI0bN0LXddx55504/PDDIQgC5s+fj4ceeggAsG7dOvIEKiUI7baZ1Zzqdb3FCtdPqt6Jj7hfLcf+mub60sDuPZ7vYfBp/+VYTmQtEVT27SwyszJ499SjMOuO1b71JXIVlxsiQ7NSuwZdDy7vDwo6B69Wq6NUKrdMqvWa8+aN9iIc6rBgH3HVnNRCIhmGYdvab+CjNRXE3Y5lvCrxoEX3adOmY/His7FkyRnQdQ3HHHMMdt99d4s26LLLLsNpp52GWq2G/fbbD6eeeioAYOnSpbjwwgtx4403Gh7iDCeEnNaFt6+OjyFsm17eRnekVYFHsWj1MTJPNXHzOBJFHjzPWx4nam8OhULFs5bT05PE2FgBlSvOwHvPvInUzDRy72YDvQczQZmjJjPs6R0AS3rnBqoOr1YV5PNFy4qTIPDGIoAo8hgeDna8QUAiOt1YAqcgE3CamqZ2CuuyLEGSBGNs+HhgdliIxaQGaVdDlU2Y9VN+x0LrVTS6DOrCSQaNcigUgrdjhWHTW/31jdCL4enNmEQa0pFnhba/TjDhCnEgWJ8beW4zcrKqvYPVpMzE1A6mfZSsgOgeP0J79ASQCAqnH+1KULQp2BzxmXUzhCjIycnzPKZN623YxNZCUUc7RSO6DsOKNp+nEg6xpbDuNCQzzPTL7LBABi9UDdvk8IZ1BotGrap1LxdO+r3YX2NiLXoBABzfGhmMd3+TjAk5gtY+Ny7QKhYltk6m82684IsobBgziClo1GRG3wf7MfL6sOvjTgQFkPqTnaBoU7D9fd+2vrfl+WcenAfLEhGmc/9bGGOdnOHUpGtPvZrTc7sDhoGhSndyWGhXfGlGJwTfOjWGN+xgMpmU8b0MD49A1+vIZHp890nV4fV6HYsWnWJRh7/44ou48MILjfsjIyPIZDL4zW9+g6eeegpXXXUVFEXBNttsg2uuuYa4BHBcuIQyBWx6u57WcRyLeFxGsVg2PLT9rGqb++IMvVKxGHxAZTwu481Fn7X8rRNy6p1NiMOLoIDWFC8zKwMAmHHLqoazJ1mpKhabRfJbHk0AIHU61/2qOk7/1Jhxn6YZ1vQrmLc47duzp3XtwJyCUm8kTdNQKBRbIojxoK8vg0Kh5CqBsB9HUIcF8hmogX9/QWDuS7z66uW4//77sfPOczB//j747/9eiN7evpbnDA5uwtlnn4bbbrsHgiDinHNOw7XXXmsILs0ol8v4whe+gG9/+9uYP38+Dj74YNx4443YYYcdsGLFCvT09OC0005Ddd1d0MvhTUtiYilIh5wc2v46QeiRk72Ireu6Ydnb7nTeWEwCwzDI5QqBfvg09cteNf5cmRIT4B9BUWy774eM/+feHsbG04/GjvethaLUjasu0CQmgAyBAKwkpaq6adse4/+nf2rM0DU10y8J6XTQtGe8BmhW0SNd3aIRxHisRlqO1OMLdxJfBnFYCHMSb/M4m5KF008/G0cccQT++Mc/4cknn8K//vUK9tpr35bnmNXhAFrU4WbcfPPN2GuvvTB/PmmfeuihhyAIAhRFwcaNG5tDEfiQ07ow99XpIXT7BWSZEEw+Xwoc+VC1d61WhyAEq2vQ54xecSZGXrYarHcSNdnhRVCzP74jNJeTsVJp1tVuf4z2WbW+IZ5nLKTkhFse7YGq6jjrkGxL+mVPe5q1qu6pxUnzch35fNFmfZI2uV+2PzWm3VqWW/+d3WGBtgR1CzzPY88998Quu8zDF7/oXhfzU4dT5PN53H///VizZo3xN0EQ8PLLL+OUU04Bz/M4//zzyQObYVrXNXIyF7ABBCYmc4OwpmkQhHjg54xecea4jpnCHDX5Ydbe2zv+PT2rH7GBHtS+fx5u3+0Gy2M0WgKaEZOZmPwev3Fdxvj/WYcQ4jUby1G1OK0V0Tl43SzUOhWRiSlgO5EdxfiKytb+u6bDgiw33Q3IcYSXilIEkRIEdYb89a9/jYMOOgj9/f2Wv++888544okncN999+Hyyy/H9ddfDzAcwIZIKMxmSk72AnZPj3NnthlORnIMw3ja1ZrrOZSY7FFTfCCF+EDrUi3Lc3j3//7Txrvyjp5YnnONnha9cDbu3v0GOD1M3x/PM471J4Zq4VyypBvXZaBqOs45rLmM7KQWT6USkGUJsZhsiWjG11rjTiJ2HZFzQdv5GMJcBTR/FgyTbkRQjKsL53gRhJz81OEUjzzyCM444wzjfrVaxeOPP46DDjoIAHDkkUcargQ6z0EPNa3bDMkpHm96FgWNltyM5PwU4sZzrmnN1Xu3J/aiVQ8NztZ7zgaAtkjKTFBuURNFeWgMsYEeAMAXnz0T9+xxEwCgrsIxhbPXn1RTOsYLpmhKaX38R2ubcgkzUQHNlpJKhUxMocVkWiR38moKgnZIxBrZmd0EEtB1zSKZCNtD3Hy8NIJrdeFsTmkZT/N0kLrW/Pl74/bbb8Ho6ChisRjWrVuHyy+/3LKNrut44YUX8JGPfMT4G8/zWLZsGWbOnIm5c+fi4YcfNkSYYHlyCwth7qtDhH4E9To5AcxfECUZpyuKKAqIxYIbydmfU732q83XqasGKXnBPhl16z1nGwQVJKXr+2A/4tN6HPfrFj0xjRBI1ah/eGshvLkt+ZfnGNSdSExgDIJyAiUqO0kBTsVkq1dTWOZ2XnAraNNjYBgGsiyjWq2GKpmw/wbd9EzBBzG4vYb3NmZ1uKLUcdxxx7aow0dGRhqrgJLxPI7jcN111+HSSy+FqqqYMWOGMfVEZ1jooaZ1k9++ErqUwMkNM51OoFBobcylrSvEGdL5MKjSu/kcopOq3nUZGFFC6bU3AADSQB8qGwYtz3WLmrzGNpeHg6lsnciJwk5QNHrSdQ13zrvJ9XnVqjsZUJJyIyVzFFV3aGK+ZKHuu4xuVmlLktAQaNYcxYZAcMV1O2AYBgMDvajVahAEAQwT3jj2/v4eZLP5wIRHBzFIkhjIYYFhGMyY0Y+RkYLv4oYZYSjES0+vhV4N8XuQ4oh/9LDQ9tcJJih202EO1c0DBPzU3lSaQLr9SYG9du/VBjFJA0RHYiemThCb3ofY9D6MvPiG53b9c0k6V97oLy8wg2FYnF26BjfEWwcPaqoOoRFNKR7aJ7eoiWs4P1Srzife5T9jAPD42gL343Oag0eW6M1SAUISqqp2xbyNRNlALlc0PN1JYV3uoLBuRbvtik6DGMyz+NxIs5ueUW7QWQ56qGndZlhzcoJZ+9Sc6xa0xqGD55sFduaBawHAQkxO6CRqoujbZTtfgvKCPb0z157Kr72B0w/6De4cPgIAUKm0/pLtJGVP7Wj9yUxS9XrDwZMjjzlduRVFxXcfIAsI53/eX4xpHYLQan9CbVjCJ6nmhcyvsN7e5JrOj9NpFp95NbJcLuPaa6/Drrvugt12+wj6+6d57s9LIQ4AP/rRj7Bq1SpjRtyxxx6Lww47DIsWLTK2yefzkGUZDz30EHSGCzmt22LISTdEle0WywGSyhWLFfCrvw8AYJJJCzGFETXZ4UZQNGoCgNiM/sDRU2zH7VF+9d8AAP61f0JNEnISGkSjeNSQvGpPSk1zJCJKUgBQqbRGGO2QFOB0cnJIpxMQBNIDGGZrjVeh3UkyYZ5c41XcD1OEaSdNTVORy+WwYsUKjIyM4MMf3hPXX3+z44KO2T+cKsTN/uEA8Pzzz+Paa6+1FMQBYPXq1Y3XI0MRTj6ZqLh1joMe6Zy84eYjHo9LUFU9gAEbAZUJkJpG2UJM9XffDfegQVI6O4JEUG4EZY6e+vb7qOWx8mtv4IwPXYObk830TjCtxpXKrcTNN8jGTFJKzT9aqlZVz3FFl/+E/AQuObG9FElV1cYyPJno0rQMNq96dVYnCtqg6ySZaB2OaU5DuyfCZFkOF154EXp70/jzn5/G0NCQ6/sIohB//vnncfPNN+Odd97BXnvthW984xuW4viqVasQi8UMWYHOcNDDjHa2hMiJ5znDCsRum+IGs0yApgxMY4qFnZicoqbxpHRhwk5KsR23BxINzVcuizMKVoKiAYfYMLSrOTQV8xwDRdGNNM4MM0k51Z7s6Vel1IwuOiEps7Fa0zK46FgnamecU6cE4lwjEo00lP6tW5NriC6PwU47zcFOO7lv56cQLxaL2GWXXXD++edj9uzZuPDCC3HDDTfg3HPPBUAuDDfddBNuuKEp7tVZHlqIHkzsFJASdHW9UJZFJBJy40cTLNQXRR7JZMy4Iuq6DvH3twV6bny7WYhvNws9u+6Anl1bmyg7Qd8u2xn/N6d0ZsRm9Lf8rWfvj3hXYBtXTVFgHFc4AUJSosl5U1F0I/3jeRY87/z1uRXFgeYJZCYmMy7/CW8QVTC0nuQ05Rkby2HTphFD25ROJzF9eh8ymSRkWXK0bw5LgNl04Sw0nC/JKmw8LmPatF709WWQSMRaXDjHg6AumH4K8UQigZUrV2L77bcHz/NYtGgRHnvsMePxxx9/HNtttx123nnn5j5YLvTbZKMr9Gj3EZdlMdBKiZOdivrb5tXBHjWxsoT4drNc92cnKEbgkX3h1ZbtnFI6M8ZbILegWGhGT+kMThm9GivTJHqiDrHtaCEpQRHTvmBRT7HQtDtxs3f/1kpykl25ePyOnM12kpLrIIbm6lt3BJjUnZUOALXPvwtjJHzQhQE/hfi7776LJ554AscccwwAQl68Sf39yCOP4PDDD7fsU2M4aJtZWhd65NT00dYMH3E/21mGIa4FxIGgZPw4Yo/d0bItP22acXOC7pI20CGBmd12RGa3Hdt9W9j68E94Pm6Onnr2NhUxA7DyKQO/sdwXTWPvzamdIDCW2pQZtZrmGkmZYSYmANB0cjOjUm6y47dW6gZR2dFJlEPrRGNjeWzaNIJcjqTg5qgKCN9f3U4cNAUdHh7D0NAYarUaRFHEwEBPx37iQcnJ7B9eqVRa/MNlWcZ3v/tdvPXWW9B1HT/96U9x8MEHG48/88wzhksBhcby0FghxNvkp3VdKIjrKJetam9dh+sEFuomYDeSsxBTLAHkxiyEpOXHZ0ma2W1HxyjKC9IHtkX1zbc8t7EQkxts0RNACOqOIbKCRz86hgEkiW0RZ5pX+OzREs+zjvUoAMiOlsELzldETSdRlJmYzHCOpMYf5dA6EU39ZFmCKAoYGOjpSKHtBi/i8JtcE1Q1H3Q1MIhC/LLLLsNZZ50FRVGw55574pRTTjGe/9Zbb2HmzJmWfeosBy3EVIyZAmld6ApxoNUKRpIEsCxr8TQC3EeUxx67gxASRW6s5TWcyMkvanJDbdBfDiB/cDsA8CUnafYHnB9okVc3m6HrA9sAAH4y1lRIlhz0T2aSKpebn5dT4dxOUNnRpmTAjaByI0UAgBwXHR+vlJpR1/e+SvQ9iqK0fK/jAcex6O3NYGhotEWh3an7pX2/7cBJNe82VTiZjEEQRORy7ZnZhaEQ3/jvF6HWw5tPyPECZmy/S2j76wQT0kBjT+uoTEAQeORyJSsx/e1+KzF1GWxPH+QdvdM8SkwAiZ7cIM3bHUj3BHvhYnNFkR96BwBwYk/TtycuM4jL1mhTklhIEmshJgCWormxz0bBPDtathATANQdFicoMQFWEnL72//7QRWLLx8ONJOwPTSjMbryRsdbkaZlHn19PRgY6EEqlQicenUqFKWqeVpYHxvLoV7XWgrrgI5CoRDoNdatW4sTT/wCjjvuKKxadb/rduvXr8cnP/lJ4/67776LE044AYcddhjOOussFIvN70xl+dBvk40JIqdm6YXUpIhJfD5f8v8yA0ZN44UfQY0bAbU7ZoICmiRVqWjGTZY5yLI1+rGv7AHA6HDJlTzMBGUmJopKqWYQkhNZUZy2bBhfXVHEV1cUxz3zDXCvY1GSyGYLGBwcwdhYHpqmIZmMY/r0PvT2phGPy+BcxYPhFNrJROEyRkfNK5EsVq9+AAce+Al88Ysn4vbbb8HQ0JDj86kA84YbbsUdd/wMv/71g/jXv/7Vst3Q0BCuvvpqy9+WLVuGhQsXYu3atZg7d65FSqAxrFEUD+c2+Y2/Exo5UZlApVJ1TAVif7NdRRyIyfU1Okjp2B7rKl1QgnKKnqR5uzfvjCN6AoAjPvg8JBGo1nTjloi3flV2ggIISY0OlzA63OxZDEJQbvAiJjvOumoMX11RNBFFJz+vYCRSr6uWqKpUqoDnefT1pTEw0It02jo0tBuDOoFmYf0zn/ksbr75FsyfPx9/+tPj+Mtf/ui4vVmAGYvFcOCBn8LatWtbtrv44ostokxFUfDkk0/i0EMPBQB8/vOftzxPD5WYQhZ0dogJ663jOBayLLlOXWkhJhd0I2oyQ95xR1RebRbKzSmdGUGK4y3wOUPKyemIFTahZ/R1HLwN8D/vEK+eXIE8hxJUsdT8/ChBVSoqRkcb/Wcyj5qtZYVlnTU4G/4ziHjK3W20mG1GVYmMNd2uu1wQTvrWe9B1Hfdes63hbBDUL6oTErG21sBxaKh50Gs3wPM89t57b8yfvxcWLXL3sLcLMPv7B/D6669Ytrn77rux6667Yo899jD+Njo6imQyaUgKpk2bho0bNxqPq+CghijBYLCZkpM5jSOzxyQAjLFsbIcfMTFHfsUyppxCenDFeA/VEXaC8oMlaqJI9/hGfpWdyHKwIsQcHz94m+fxP+/MRTpJPkwnkioUnAkiCEENvUuGh5byJUeCMhOT+X4ik3AlJqCp8D7+giZ5/2T5NraWEueidhiTjltnAQqIxWJdmAVoBcv6+8D7CTBfeeUVrFu3DnfeeSc2bNjguh1g/aw0sNBCJBRtYpIqT3Q1cmoOKlAgCO71iPLexxr/t48aF0UePJx/sNWjvm6yX1FRKlUh3v8d4/F2Ujo75B13BHxWP8YTPVFiAgBBKRsEZY6exno/iHlbj+K1kQyGsyzEhoRgLKcauzIjlZKQzzdJ3IugKDFRuBGUE4rZIqS45PiY28l+4jebaeudl89EIhFzjarCJAw6NJQWxAuFIiRJRCzmPamlE3Ri0TsyMmwRYK5duxaDg4M4+uijoSgKNm3ahIULF+Kuu+5CPp+HqqrgOK5FuKmDhRZi5KRvzuREequITEBVtUDFUupaYE797KOmzHDSSNWOJcMIOY4F/8trOj5+bdrWYN/zt+9l9z8EGN3g/KBD9FTeaT4Ynx9wOTkdRYk4cs7U3gH6AIDooYazLHrSnEFQqRT5CvP5euN+MIJyQilP6lTxVLwlajKjrtRRzzb3aU/3/PClS8jndcM3MxY9UTfTLzqJ18mChTQsJ2EexV6t1jpqWG7Xonf9+t9j+fIrjceXLFmCJUuWAADefvttnHTSSfjZz37WeO58PPTQQ1iwYAF+9atfWYSbqs6hDX87X7D6ZprWJZMyWJY1BhUA3uE6bXfRdbS4Fripy83k52TRoes6pJOXIpcrtp3+adO2Jv9uNTsQQbULnWFaCMocPZlRZ0WDoN4rpNCfaRIUAAtJBSGojW82V5EYH5IKCkpkXKOx2i2qsuPs5WRyjFbX8OOLMo0ZeHJDhNnbVq3KH85RTbNhGQ6tNapBVEEaloNETnYB5oIFn20RYLph6dKluPDCC3HjjTdiq622wrXXXms8poEJNRXTXLKViURXRJiyzLeEyHa7XQqOY5FMxlCtKoYDoxk8z0GWRRQKTa1OIkHIj7bHOIGke3HkckUkEjLqP7mi+ZhPSkfJydjehaCU7ZoiNcEtegKM6Km8k7XlwE5QdnKi0ROv1TDIzISqcXivkMJgllxTRnPk+XGZwTsbmp+d1riEmgkKAN56xXqMbuQ0tomkfJmBVj91t1oT5+H44EVWmk0seuuyAUiShGKx1JhuLLal0nYDlRnk8+4RoR1UKS5JYqD+u+nT+5DLlaE42CR7IQwR5j9fH0bNpTOgE4g8i10/2NrQPpHoSuRUq9Udu+ztaA4qqLi6FpgjJzoLT1WJRsoLNB1Mp+OkrnDU1wF0VkQPI4KyE5MT7NFTojqKotSLOisCOsCxKmRexbQMMJjl0ZtmMJrTUaro6O0RMDrWmNXGMRgdan4+o0PkohBPx1Ey2SLrmu5KUACQHRp1JKh2IIhCCwGxjR5A+98B4LSlzcjuR99MG/YnVKWdSMQdprX4oxMRprW1ptXYzjwCnb7GZIGkdeG9vqpPfs2pK5GTkwVIJpOwpHlBhhuQfbFIJmWUSlXHHjw38DxnWK/Yt4/94XbX59mjJuM4bORkjpoo3KKn3LZ7QFCcr9hBoycAGNVJxDdUSmEwLyIVU1uiKAAGSTkRVMnBs91MUDRqsiMz0Nt21CR0KMq0v85Nl1ojXept3k5UlUzGoeu6MRV4vKBRlSgK4DgW3/zmRRgY6MdHPrI3dtttd88FILNF7xe+cDzOPPNUy+OPPPIIrr/+eui6jlmzZmH58uXIZDJ46qmncNVVV0FRFGyzzTa4+uqrkcmQWuSz/86FHjntsX3af8MG1qxZgxtvvBH1eh0nn3xyINth+zZ2TBg50Qksuk56kDRNC2Q+x7LEsQCAa33JDlo3YBjGMZUE3AnKjZwAK0E5kRPgTFC5bYlexYmgnIrj7RAUAIzkSGrnRFBAk6T8CMqNmCgSGef0w4mcwiImM+wkBTR73whRiK5RVSoVh6aFR052/Pa3v8ajjz6CZ555BqlUCr/4xRrEYq01xMHBTTj77NMMi94zz1yEH/7w+4ZFb6FQwGGHHYZVq1ZhxowZ+MEPfoB8Po+LL74YBx98MG688UbssMMOWLFiBViWxXnnnQcA+L9/5VH1sHpuF5LAYM8dgqWbGzduxPHHH48HHngAoijiuOOOw7XXXmuxHT7zzDNxxhlntNgOe2ECG2h08DyHWEwKHP0AZAWPYRhks8VAYXk8LjVqCyWk0+6rSOUDF7UQlBcxAZ2ld5SY3BCkOF5ECgmQC4WqceBYFQPxPAD64xExktMhNfp1R7MqJIlcHcZGq5DjAiolBb0DSYwOFVrSO4CkeF7Q6iryw2Mtf+9xMNqrlEgqxrdp5KaqKhiWcT2WxUubrqcrlxGHCreJMWZHgWq1BoZhoevjkwp44YgjPotTT12E119/B2+88R/Isuy4nd2ilyrEqRpcURQsXboUM2bMAEBGj69ZQ1qaHnroIQiCAEVRsHHjRovZnKaz0EKUYGiNFPG9995rWUFNp9NGBAQATzzxBPbdd1/09PQA6Mx22AkTmFiSAQfFYiUQMdGIiX7efsRk9oTK51tn5NkhCBzEz30l8NFTaFvNdo2aAEDpbVpZ2IlJEYIvuW+SPmDcAEJQQyo5IVWNw1glAZ4lYfy0VA19aaCv8XvpzXDozZBopqdXQk+vBDkuQI4L6B0gbgjxtFXTNPLeJqhK+6tilVK55RZLkH3Xlbpx84P5BGBYpqUWZj9BFi8dtJAVhb2tpVKpGNq5RCLWVrNwO6DyjFQqg7lz57nWn5wU4mald29vr+HdVKlUcMsttxg+4YIg4OWXX8YBBxyAv/71r/jMZz5jPE/VmdBvAHDCCSfgU5/6lOV21113Wd7Tpk2bMM1kZzR9+nTLezLbDj/44IPI5XKWvkA3dE0hbkYiIYNhGJRKwdIyu35JFJOe27ut+NGiuP14qAyhUChDPZCM2vGqQ3Ub9uhpQ2oHcFCh2rQmMa6CskquyCmxgnxNBs9qGC1LkEUdI3kWfWkdDUda9GY4jGbJ593TS65SYwC2+kAvXnzqNfRM78XbL79heQ1VUcDZ6iVuU4xlB9EmJSYz/CIoN20TJSjNY3Vu8dJBqA3yu/0q67Rne1RFf3v2qKoTC5aWY/UYImGGn0KcIp/P48tf/jLmzJmDo446yvj7zjvvjCeeeAL33Xcfzj33XNx3332N/bKWwarjhaaRY/rpT3/qGDm1856o7TDFokWLcNFFFxme6G7oauREfKNJ9BNUfUvmosmBIyzaTFwqVR2kCDpg02sQHQ2xajH/IMsHLkIQFPo/iHJyhuc2Su9M13TOLXp6N7kTNqR2wIZUM0/nmNaTNsY163Qpkfy/N1ZFb6yKvpQGWdQhSwxkiUGloiMmsYhJLJSaBqWmIZEQkEgI2HGP7TC2aRTJ3kzLawSJoMIiJoCM2XZyE9BUzSAmlmUd3TFVU1S26KL3sOii9xxfg2EY16iqEwsWp/0HtegdHm6uSNoV4gAMVfjOO+9sjBuvVqt45JFHjG2OPPJIvPzyy8Z9Eu2wId7IebPVVlth1qxZlpudnGbOnInBwWYU62Q7/Mtf/tK4b7cddkPXak6CwCEel43hmfG47OsaQjvZg6RlgLOi3Axz5MQwjFGI95MhBEE5OQOxwkbXx0tiGvHa+JuUOaY1gjKDRlAAIanRsoS+FP0sGnWnrIZ0qvlV5/J1ZHokzD9gZ2THiBbq7+uftexXVRSsXDEbsu78WdVZ60n89WtbiVSQWk90J/kAhZmgFBeJgJmglKqzY8Kii94zUsm7v0scJKhCnKK1VsVDkgRTVNWesV1QF0w/hbiqqjjzzDPx6U9/Gmeffbbxd57nsWzZMsycORNz587Fww8/jD333NN4XNOZFrvl8aCdfX3sYx/D9ddfj5GREcRiMaxbtw6XX3658Ti1Hd5nn30wa9asFtthN3RltU6SeCSTkmV4ZjwuoV7XXIcdeq3g2WUI1KwOAIrFsuuPIp2Oo1CogGHgKfS0HPvzrfYVFIX+D1ruu5HTcB+xXvEiJ/PK3XuJplULyzifCHaCKqsySnWrY2WxZr2fLRNCKpQbPXnZ5r5VDcjlmt/F8fuPQmCa991IidGtx6dw1qImJSknYrLDjajqFovn1i+3bovs7AV0pxrXmlt3Q7FYDuiMEGwF0Aw6LGHEwRvLjnXr1uKee243FOJf+9o5hkJ8w4YN+MpXvmIpds+dOxdXXnmlISVQVRUzZszAZZddZtj1/uF5BeXg7ja+iInAgXODR5Fr1qzBzTffDEVRcMwxx2Dx4sUW1fvvfvc7XH/99Ybt8LJlyyCKzo6rFF2TEnCcNcyNxSRomtaSqrl5iJtBZQiapjd0T2SmnZ89bCoVR62mQJZFo5HY+7hJUb3yp1WOj9vJCXAmKEpOgD9BmYnJOA4HgjKTU05ppoaK5hxVuRFVtkCIalqPhtk9YwCAJGc9oYISkxl2krp0ZfO+WxRkBiUqP7cDOzFZHtf0QMV3Gk0FBY2q7HbB1WrNiNhlWUIyGcfoaPtReRgK8Uf+UQ+dnA6aN7lumF0hJ6DVR1yWyclijlyoHslPv0QjII5jGqliFbWa/48w02hIDTL+3OygwPM8an9+wPK4EzFRmAnKTEwUbgTlRk6AM0GN1txFcXaSchN+x3groZuJSdU5iIw74Yuaty6tzCah6Nar7fLbrN+rF1FRYvGLqHQXkrREXA55ib2w/5PrtnM9Fjc4RVXvvPMe/vrXv2K//faFLLfW8MywCzCPPvpYCzm9+OKL+Na3voVisYj58+dj2bJlyGazWLSoWRPN5/MYHR3F3//edDdY96yKNnwBfREXgUP2mNzm3wkjJ0kSwbKMEe3Q+lKx6K0QB0gEVK+rEEU+ENEAZIWQ53mUSmXfgZ6UJPP5MlS1bih/lb88aGzjRU5Ak6DaIad3hdkQGZfaio2cvIjJDLf6lJmU9EaxM861ChK9yMnYxoGkymxzRdVOUNlaEjfck215DiUqt2jHTFJO25hJym0flKTcVhwpOiEqgERVr7zyIr7+9f+H4eFhbL/9Djj55NPwyU8e1LKtkwDz29++Envv3Vw8OeKII3DFFVfgwx/+MC666CLMnTsXCxcuNB7XNA0nn3wyjj32WCxY0ByI8dDftdDJ6fCPTG4LywS+ug6GMeuRELjwzbIMBIFrWWFz25boo3SoqupbpIzFJEiSgFyuCFVVGmOCKshm86js5l+0M8OJmABSHLfjXWE2AKCmO+f1mqm3KSgxaToLBnrLTeZq0HXGuAGdExMA1FgZNbYpMjQTEwBL7QoAMmIBZ3+xNaIQRAEMw7iqyVmeBcuzrsTDMCwRV3r8hoioU/PsIVRVFccv+TeOX/Jv123cUK/X8aEP7Yi1a3+H++77OQ488CDXKcJOFr3r1z9qPP7OO++gUqngwx/+MIBWK14AWLVqFWKxmIWYgMb8QS3EWxcsjdvFhCWVRPvAIp2Oo1JRDEtVL9BGXwAolaq+S7X2+hXVVznBXFTP5YrQNK1l/5qmo7TLQdA2+f9o3+zb01BxhwVNZ5FVvDVe5m2dIHGtkdl4iMmMGiujrMchovW7pARFoyhKULevKqNSqrUQDiUoc9pHIyezHMH+PK2hwaErfXZNjjliogRlJjP79maCuveHzuPnncBxHHbZZVfMmuX+HCcB5j//+YJx3y5mbLHiVVXcdNNNjgJGTWMwTqmWbX/h7atTTFjkxPMcBIFr6Jf8iYnnOaOgXa+rvh3fohhcH0WjK+pu4ERMln1vvZPv8QJExe0Gc/REoyYKt+hpqJpxLXibMV5i6hRlneiaarr7qos5isqIBSw6OoajPrcVYkkZsWRri4cgCo5OBhS8wIMXeGiqahCTGVQzxXGcaypHFehutSuKdiKpIDonJ7Gi2fjPT8z4+OOPY7vttrOs5FHUVSb022Sja+Rk/p7icQk8zze8nf0V4nai8XLDBEhqRmpG1hl4Ts+jpFepKCiVyv7EJApIp4NFL34oiekWYqKwE9RQtZkGeRFUVRWgaJxxo3AiJicU1Tiquoi8Nr4VIz+CGqpkMFQhZCtyOhYfSxYr7CSlKipURTVIyEnEWVfqYDkOrMsYKNoyw7AsGBfvHkpsLMsYNzvaiZyC6JycBJgDA81IyS5mHBoasogZH3nkERx++OGO+9Z0Ig8J6zYV0rquRk7mfrdisRLI7yYelyDLgo1oWpXeZP9Ev0SEm0WH+pX1eZT08vkyqtVqYxnY/VuIxWQkEjFkswWw091/qIPiNsb/vaInACjX3ZsdKUGZiYnCiaCqamvERUmqoootNx0MimrccjMjr6Ust5zqXuuiUZP1+FsJaqjai6Gq1RMqLdcwXIrh80eQFKeuqBAkwVUbZSYpe1pHSYoSlVN9ipIUw7KuERcAC0n9auWujop0N7Csf+Q0f/7eePrpJzE6StTp69f/Hvvss5/x+DbbbANJkvD0008DAFavXm2x4n3mmWcwf76zL1hdDf822egaOfE8h3Q63pjaWoHfLDIqxGQYBrmctVDuFAGxLGuYfhFHzNZ9mp9HoytSVK87KsrNSCbjEEUBY2N5oy7hRFBmYqJwI6j3lJmOfzfDiZgozATlREwUtCE4CHjWZZWrUTjPqWlPkrLDTFBmUhJYW3+WTFL7zx8xgFRPk+jkpGzczKCk49UOo2u6x1BNUn+iRXQvPHjLLg2r4B709/cgmYy7Frkp2rXo/dKXFuLggw/FrrvOxeLFi/GPf/wDALBixQosX74chx12GEqlEk466STj+W+99ZYhurRDVcO/TTa6JiXo7Y2jXK4a0Y/ZNtcOjmORSMRQqzkruO0aKVr49tM70efxDb8hIuT0TuMYhkE6nWy0uTirfc0FcidyojAXyO3EZNcbGfsrpSHx/houtzqTGzG5pXl+5GRHmss5Rk125GrOPYT2CDBXId9RTWXw6P/mkB9rFTEWRp09ucxRkuqyokcvLF5SAnPt6d4ffgiADl0nFzee5yHLksWqlzYLmy+g/f0ZVCp1VCr+350dYYgwf/IYkA/RqioVA048ILz9dYKuRU65nH/9ByCOgtSx0q+1BGg2BhcKFV8hJsOQ7YMWvjmORU9PCoqieHpN0wjKi5j84JTeDZZIhFKtu1+lS4qAkiKgUudQqY9PJOdGTF7IqWlka941uKFyGjXVxR3TJYISOR17fqQHclyEHBehVBXjJsUlRx/yoE3Fuk+UTCOpn/9oR7AsB4bhwLIsOI6FptVRLBYxMjKKwcFRVKs1yLKIgYFe9PVlkEjEMDY2hnw+H6i3Ttd1/OhH38fChUfjxBO/gOeee8Z120KhgCOOOAJvv/228bcnnngCCxYswCGHHILrrrvO+Htd1UO/TTYmbLXOyRpClkXEYqQHz6u1hD6XTubI50u+I4So6ZiqqiiVKtB1b2ISBB6ZTMoyNsgLXjUoCpreuaVzZoKixEThRVBmmEmq3ajJDW5REwCU6iTd8iMoAIEJimJGj4p99hlA/7QEUr3kZoadpMyREyfw4ByL5w1/bwePKDN+/qOmRo1hGCP9o0RF/q+jVqsgm81h06Zh5PNFsCyD733vanz84x/H6acvws9+drenA8f69Y/iP/95HT/5yS9w1VUrcNVVyxy3f/bZZ3H88cfjjTfeMP5WqVRw0UUX4YYbbsBDDz2E559/Hn/5y18AAFrIKZ02BdK6CVmtc0IyGQPPcw2i8b6y6TqxRgkq3KSFbyIpYHyLlbJMTOtzuWIgmUM7eL3s38dlJyYKO0GVFPc6U6nGI1cRLTeg/XSuHTgR1FDZ+l7cCMoMGj0BhKB2+FAMsz/U40pSVJzpBDNJOfXhUZIyE9V917tfaChREcsWa1SlqgoKhSKWLl2GW2+9Fbvsshsef3w9Nm50n8Tz5z//CZ/61CFgWRYf+MBszJgx09KGQnH//fdj6dKlltW65557DrNnz8a2224LnuexYMECPPbYYwAANeTVuikQOE2kTS8BndCrKKpv4y5AUq1YTGz4P/tHNNRGhbgYaIZlK8MwqNVIV7k5SkskYhAEUvj2K5LbMaNHxsYx/2Oq1AXIvDNJeK3eAU2C6mSyRq4iguecCY2B3rD6tSJI1GRGtpZERnSuCVHUVA4iZ70UC6xqqT+l5ZpBqAAwcxqPDQBKJRHZ4SKkGHmsYBr2Kcaa29dMXa+qUTwn792tWZhhGdz7gw95HnvLcxgGzRVgBgyjI51OYb/99sOuu+7hOxbKSYhpHjtOQX2czHBynPzTn/4EAKjXdYxzYLEFZF+Tq3WaUHLSdR2pVNzwePKDIPCIx6XGqCn/DyqRiIFhgFyuYNSXSqUySqUyOI5tDG0k0gNFqYNlWei6jmw23/EIbC+C2lTuMf7vRlBDJVJclnn3ODpfJSdZXHTpQdOcPxuec35PTGPldKjUWojtj3kTjRMoQdmjJj9QgnprpOmXnomrmNGj4h//IgQFNIvv2eEikrSZ2zaRmBJV2WF4gxtJtUtMdjAMA1EUkEolUSxWA82rcxZiBktgvESamqqHusI2FdK6CSMnSRIbeif/RlyApFqSRKx0GYYxVt6cQKOxel1FoeBcX1JVDeVyFeVyFRzHGsJKhuGQSiUa88dqvimjE5wIykxMFHaCosREHuM8CQogqRtgJSk3YuoEdY3FxiIhmBmJ9ozy/GpQTtHTW2OtK3rvDJFoqq8H2DSkgmUYiCJn2AwDziSlNLoC+IZWqu7QJUBJ6p4V7VmmuEEUeYOYymX3i+2tt96EP/7xfwEAxWLB1wnTDU6Ok/39ZMCEquuhtq9sMWkddSDQNC3QyU8n+lKDOd5jmizHcUgmZcPV0K/wTRTiSVQqFSOtFEWhEVWloaqaQVTt+EoHTfEozMRE4URQNGoyo1TjXaMoCreoKSjsJOWU0pkxVCSPZ2T3mp2ZoJyICQCScaDQCH76ejiMjKno65MxMlKBKHIYHSySWuVYYwR6Q9ekwOYT5kJSYRGTIBBiKpW8iQkATjvtTJx22pkAgN///hH89re/xkEHHYr33nsXb731pucIcjP22GMPvP766/jPf/6DWbNm4Te/+Q1OPPFEAICq6KiHMbW9ATXEfXWKrpGT2RqXLuWnHHynzbBv39yXswk8napRLFagKEqD+LxbUZLJOAqFkiWtNE9tFQTe0rJCjcWCeKBTgnKKmii86k/k8SZBORETBY2i/KItOxgfMawdlKRSUrCFgmxF9CSo14aSEHjbKCxeh1Jvfr9eBNU7LYHRwSJSPYTcKEnJcUKOFdtKq5mkwiMmDuk0IaZSqb2z+MADP4V//vN5nHzy8QCACy+8BLIsY+PGjTj99NOxevVq1+dKkoTvfOc7+MpXvoJqtYoDDjgABxxAxEibY+TUNRGmILBIp2MWh8tkktx36q+jE1ScHAvo1N+cqZ4Qi4kQBKGxeqf6FrOJQlxGLlfwlSE0j4mDKAqQJAEsyxok5lcv+8d7flGGBFnwPl6ZVz3JCQCqipWwM7FGIdgjanIjp7rmXvco1kh0MjPlrPKjUZPlWFwI6u3RWAs5UZgJCmgSFACMjJHvbGSEkM/oYLPmRAnKDDNJ3XGlvzI/KHieQyaTQrlcQ7EYzspuGCLMa35ehcv82I7QkwQu+G/vxZpuo2uRE+2nswoxvSOgUqniUo+y9shRKxRidaL6FrOpaX02m2urpqSqKsplFeVyBSzLQBTFhh1rAorSJCr76+++dRXPvev8xQ4Vyd8rCutJUBtzpMYWl5yP105MQNOKV9eBgZTDMnqbUZMdG/IxV4JqORaPCEqpM64E5QanCAqAYxQFkEiqUqpMeWIKC2pdRz3Eib9qfXJX6oAukpOiqLC3OTmpxP0mqJifZ077yGhz/1aUVCoBXdcxNjY+ryVN01GpVFGpVBurNDxEUUQiEWvUqZoRYiaTxD6xGv5qc9ygxEThRlDZUvODK1WZFoJyIiYK+nEM5a1RlxNZUQSJmig25MnKGiUpp6iJwk5Qb482V+WcCMorvTODEhQAI80DgFRPwiCoOy6fjlpN6WiBwwk8zyKdTqFSmXrEBACqpoU6t04NcaGlU0ywzskaASWT5Meazxd9RJt6o+ctHrjwzbIsMpkkqlVijRImdF1v9FiZ61Qienrkhp6KRFTztlJ9Uzw7QZmJiaJUbbhXukRRQbAp1ySrGenxn1xBoyhKUGZi8oKdoCi+dEAFPM8jlyvgpv9pTYOu+TJ5fwzTC0HgwfM84nEy0Yd+H0HsepxAVndTqFZrKBSmHjEBVEoQ4lDNzVlK4OUS0K4Qkw7gK5UqpquhdytKKpVAsVgOXfHtBEWpG8b3xWKpUSNLgGEY7JtQ8Jd/aS1Rkxl+KR5FqcqA85DEBJVq0ZQRGB9RbcjHwLOdnxB+6d2ndx0FQNJyjuORy5H+tTMOssscmsSr67qlLsjzHERRRDKZAMs2LxyKogT6vDiORSaTQq1Wn7LEBJBpxmGmdfXNOa1zgq7r4DgWshxciCnLojGFlRCT90ksSSTVyueLvqOgwoIsS4jFZGSzzWJ7qVQBy7KQJAEfnyPgV09776OisJ7pGgWdQZeMBf8hekX7b48Q0pzZ0/pd2FM6O8YKhCkH0t6X2ZfeiSHpslDrRFCUlABKTKxBTO2CGBwSIS7LEiEurRvW63WDrJx+VxzHGMSUz7dvYzyRID1xIaZ1U8AJc0LJieNYCAKZoBIkxG7qnYqIxyX09KQ9C9HxuAxJEpHN5tvSKI0HtP0lm21tfyHDEojw85M7Mvj9q+4K6nypGRKJgvOPrFxt/mDsJNWhwN3AhjFyAXAiKT8M5ThfgiqUEIigDtppzPh7MhkHy7LIZsNZhtI0zVQ3BASB6ttkaJpuiap4nkUmk4ai1JHPVzDZrRx+UOsq6gEU6sH3N/laggkjJ2LVywXK/c2F71yuCF0n3kq0XYA09sZNV74aEok4WJbB2FjnrSjtIpUiqUKQ9hdd13HgDln84V+tZnJmYgKAmsK0EJSZmMygJJWQ23/PTrUdSlKpuPcPnUZNFG4E9d5wM/ryIijATkzks83lQlwfN0HX4ZD+CRBFDocc8ilst912+K//2h/77vtf2G678bW5TAQ0VYMW4gV5KtScum6Z0nS4ZBv1Je8rECk+xlGr1VEqlS2Fb1KIriGfL2JkZAyVShWCwKO3NwNB4FGrKYGsgMN4T5kMKcpms4W2yPDAHVrntzmhpjCoNdI8N2JqbguM5hnjZkanCzgbR1hsHGnv5zGU69xfykxMlPS7RUxOqNeJtU6lUsPKlSsxf/58PPTQQzjnnNPbbgifDGiaBlUN7zYV3nNXI6fm6HAF5XINgsB7Diqgjb6lUtXU5+Z+dqmq1hicWUG9XjdWzEiITpb2gwou23lP6XQStVrnq4DmCMoeNdlRC1CHsoMSVG/K/bNzipqcsHGExYw+6w/VHjWZYY6gzFEThVP0ZK4xpVIJo3l7osGy5KKTTO6Krbf+IE455SyoqtqWl/hkoa5oqAfoWQ2+v9B21TG6KMIEUqmYxUrXTYQJNBt9iX+4v+LbqRWF+JU3V2jSaSLOa6cFxQu0L69crqBSGV+B9MAdsvj1c72+2xXLTYKRpdbPzmtNYbBxzvf3tHdsdq89J4Lygl8Nyi29S6XI9+Vk5dxtMAyQTqegqjqy2TJohO/lST6VoGkhp3Wbs85J14GszdaC9tvZQQvf2WwRuq76Cufo6lguV3CsX5lXaIhViohkMma0oFSrtbZX8gRBQCrV2pc3Hhy5+6gnQZmJCQAqVd1CUEEPY3is+f92iYqCpniSuzmEgU1DKjYNAb3usxoMgjrh4xpqtTiZM+fh295NMAyQyaSh63qjRWryT8x2odVVqCGOTNEmZqHbE11N61oV4daTjdajNK1Z+Par3yQSZBKG0+qYE4hVSqXRgsIaqzMcx0FR6g2i8ta8yLKIeDzmSobjwZG7k/DGTlJ2YqKoVMnfnaIoM+ouqy2UqNxG8fk5FFdr3gS1aSj45/PpXUcxNkbSZJZlwHGckTJ3al/TLggxpRq+XiVPs72pDLWuQQ0xrdus21ecYE7raKNvtaqgUqkGbkUBgGw219HSuXUpmWnRvJCpGlaJApUndOKU2Q78oig7RrPkWBLx1nqIGzFRVGs6BkfINtP62qunZHPkBJg+4J/ujGZV9Ga8t0smyaproVCyLe+nDXV3N2qHQDOVI1H++5eYANIHGuZntMXpnGgk1W7hmxahFUVBsRhOKwpd+atWa8ZJQQWcqqqiWlUgCBxYlpswecKRu49CkkTc+b/e1jLlSvNYiiV3knJCtWZ9H4MjWmCCosQEkAjJTlBOUZMbQX1h/qgxgqvQaKBrXd6n9jUJAIwRUYUhrqXExDAMxsbe38QEAHrIUgJ9gnSCXpjQtK45RUUKXPgmwzmTjWXe7qh07ScF1VGxLANVVSHLUtvmc50gFpMhyyJO2C+Hn/65PctbSlKS2P5JNjjSHsFROBGUE+wEdexehJhoA7cb6vU66vW6zWZZBsfxnmJcPxDf77SJmNp6+pREvV539UrvbH+h7apjTGjkFG8YggUtfE9GKwrLMojHY6jVaigWy+B5HpLUNJ+rVsnVO+zaE1Ga01qajuP3GQMA3PvXHst25qjJCbkCOa500mF8ec37uUPD5Mc90N/qI2WOmsygBOVXazITVDqdQr2uolh0JyY7zDbLVjFu0xWiVlMCXEB0pFIkYiKpXOBDmNLQVA1aPUwR5mYeOVGYC98A6Vmq+Zwok9GKQguyZqkAvXoXi2VwHAdJEoym3rDSjGQyAY5jHAWdx+8zZhCUHzFVa83PyYuknFAuN8llaFhxJCg3BC2Cj2ZVnP953fg8O4U5JQfM7qUpAOY2FPv3QialcByLsbESpoDOMDRoqhZqzUkLMNKr2+g6OZlHjZfLVYgih1hMRjIZd3WWJAphdkJbUaiTgZdUgAzoVC1NvXSaS1CXTDvS6WRjpchddEijqNsfc1+bNxOTGbmCinSS842a7DBHUW5RkxljozX09PrrDMZLTE5QlHpD41Y23Eub30sdg4OD2LRpI+bOnQuO4zA2VtysiAkA1LoCNcS0brNfrRMEMnzAXPiuVFRUKjWbs2QcikL65GRZgqZpyGbHZw7XDmj62I5UwNzU245LJgXxp0pCVVXPuosZiw7IehKUG3IFFZWyikzGORoyR012DA0rEATvWtTYaM3414ugvrYgvAUNN7S6lwp49NH/wfLlyzFr1izst9/Hccwxx2GbbWZ19TgmGlpdC1nnNPns3eXIiWk4ENRbVuTszpKyTIZfAkCtRoZhdlLsbBdhpI+tLpnOzcm0xtZsgakFGn1uxqIDSG+emaTcoiaKSoN8slnq1Bk8ZSsWSGoUJCoCvAkqbNM/P9Dv5fjjF2L//Q/Aww+vw5/+9Dj+7/+e2uzIqS/DQa2Hl4r1+UhAJgJdG3AAALEYZ2hVvGA2h6vVFOPkFgTBVX8UBohXEIdcrr3m3XZA34soClBVDYpShySJobTAAISkvMip4hEVZTKCZ9QENMmJwk48NGqyw77d6Z9qbw5eWEgmExBFHmNjpVD8jtatW4u7774N9XodX/jC8Tj66GMtj7/88kv47nevgqIomDFjBi655HKkUt4DDMIYcLA5oqsdjTxPSKevL4NkMg5R5GHXM8myhFQqgVyugGq15ug8IIoCenvTSKeTkGUp0PRfLxCNSzKw3cl4UKspKBRKGBnJolqtIhaTwDDkfcfjsudMviCgkVQnoJGUG+zEBLiTUafbdRP0NxcWMQ0ObsLKlTfghhtuxR13/Ay//vWDeP311yzb/OAHK3DqqWfgrrvuxbbbzsa9994z7tfdUtFVcsrnqxgezqNQqIJhWKRSSfT19SKZTKBWq+COO25DpVLG2FjetdZTqykNosqiUqmC5zn09KSRyaQQi0ltd4zTznPqFTVRoEXaXK6AkZEsCoUiAKJ67+3NGFKCTnDWwXmcdXBrlOsVNQFApVJHLldDLtcekZhrTEG2m4yoKZGIQxQFZLPhEBMAPPXU37DnnvORTmcQi8Vw4IGfwvr1j1q20TQNpRL5XVWrFUjS5I5Xej+j66t1us6gWq2jWq2DYXSIIo+hoY1YsuQrUBQFp5xyCnieg6Kovipd+/BLSaIWKZqhP/KqG1GjevO034mAU8HdqTk5kWg2J3ey8kcJ6kaHAQB2VCrWqIgSVDpN0jGnqMmMdiIoImL1t1gOC4lEvFFHLPq28rSDoaFB9PcPGPf7+wfwz3++YNnmnHPOxXnnnYMf/vB7kOUYbrnlztBef0vDhBrVEKJSsXTpMqRSGaxceSeSyRSSyQT6+nqRSiUgSYKn5xOFotSNdKlYLINlGaTTKfT0pI3GXjMEgUcmk0KpVJpQYorFSPqWzbpHh7Q5eWwsb0SRsZiEvr6etj4TirMOzuOCz3dGBEGjqFy2Yty88K3j1Ua02/xuxpvKeiEej0GWRWSzpVCJCSBRkdlVQ9d1S4mhWq3gO9+5HN///o+xevXvcNRRx+CKK5aGegxbEiZ4NBTBsmVXIR4nxWhiHF+BKPKQJB6JRBzJJINarY5ardoohHvvz6xzsXs5VaukkB6LSROqNAfs/uLBThSn5mQSebk3J9tBtVPnHlnCdb9u7dOzR012bHivMQcu5ZyS2Akpl60gnWkdgXXBMRUoCqAo1kkopIGbMVTdYX0n8XgMsZjUIKbwo7Tp02fg2Wf/btwfGRnGwMA04/5rr/0bkiRh113nAgA++9mjceutN4V+HFsKJsXiL5VK2SIbBrWa2qhRFZHNlqBpGhKJOPr6ehqFcDFQ9EDsVssYHc0hlyuC5zmjbUYUBWPMVLdBpgzzbRGTHXRxIJcrYnTUujjgVHOj9sFmX6Rzjyzh3CODt4mY0c7EEb8ICrB/N8TlIR6Poa8vg1QqAVFsL0I0IxaTDWJSQjT6N2P+/L3x9NNPYnR0FJVKBevX/x777LOf8fg222yLTZs24s033wAAPP74Y5gzZ9euHMuWgK5KCcKAILCQJL6R2jANsWatoRvyfi4dQ57LFRpRCHHbZFnWqFF1I5KikUs3jdNozU0UBUOuIYqCEUG6Yfn93nqlUtG5zkWjKD8SohHUBccE12+ZI0Se5xvasFrgib2xmIx4XEYuV0at1l1n/nXr1uKee26HotSxYMFnccIJJ+PrX1+C0047E3Pm7Io///lPuOmmHwHQ0dPTh29841vYeuttPPcZSQmcMeXJyQxBYBvpnwCOYxtmcVXHHzFt1M3nCy1pIW09EUXRaD3pxB3Tjk5U32FAFHkkkySNpdOIvZqT3QjKjZgoUikpUISUzshtkZMZZk8nqg2jIlanxQ5S04tNCDF1CxE5OeN9RU5m8DwLSeIaRMUZEdULL/wTb775Bo44YkEggqCtJ3Q/na6U0YJ8J6rv8YCOXS+XSZ2KNieLogiWZTwjRDtJ+ZFTKV9BLOG/NH7Fqe29By/Qpl7zYNVKpYZCodCQYMTf18QEROTkhvctOZnB8wwkicff/vZXnHvu1/C5z30OX//6+Y2rbfB6Dx0pLookvVAUJZCNL5UohKX6Dgr6uqWS89h1pwjRiXiX3y8GIiYz3EgqTGKygxLvY4+tx3nnnYePfvSj+PjH98cBBxyMgYEB/x1MUUTk5IzNgpwAYGxsDJ/97KFYuPBEfPWrX0MsRoZ40t62arU9s7jWOojSiEKsK2XUDK9YdCaIboG+btCBC7QJ1ky85ubkS+7wrkTbyQlwJqhukhOFIPB48cUX8PDDv8Njj63HvHl74NJLL+/+C3cJETk5Y7MhJwB4883/4AMfmG3c5zjGKKYTolIb8+zaJSpAFEVLvx9t5E0m4xMuUaC9iPl8yVimbwfm5uTm+yHp37dua93eiZjMoCQ1EcRE/bQKhQoqlbpxoRjPMFW/frk333wD11xzFfL5PPr7+/Htb1+FdLo9p1IvROTkjKk/LbANmIkJAFRVR6mkYHS0hOHhPCqVGgRBQG9vBr29VBDo/xHoOlr6/SSJ9ARqmgaO48bd7xcUTWIqdkRMgPPkZNoW9MOvWcey+BETAJSLE5PKklmFTWICCCmNh5j8+uV0Xcc3vnEeTjzxS7jrrnux44474yc/uXO8byVCAEyKCHMyoGlAuVxHuVwHy5IrMDWLowMNgtrvchwLlmUwNpYDy3KN/aQNu9hqtTutGnSQaNgjquxtQdeeI0MURZxzbfCeuG5HTaJInSuqviLSdmDulwNg9Mt98IMfAkBcBmKxGPbd92MAgJNOOgX5/MRPI94SscWQkxmEqBSUywpYFoY8IRaTjFHmZIWrlQDi8VijoZSIK4kNSvPEbo5ED9bvFxSSRGbnZbOFroxJojCr7Zcv5iDLvTjjqlHP53xvSXebWwkxJVEsVlEuhzsn269f7p133kJfXz+WL78Mr776MmbP/iDOPff8UI8hgjM2q7SuE2gaaefIZssYHi6gVKo2vMRT6OvLGEM88/k8XnvtVcsQAjvISV1quA749/sFBbVXIYZ4E7dkTmtTP/x/Cddtuk1MJI1NolQKn5gA/345VVXx978/jaOOOga33/5TbL31Nrj++utCP44IrdjiyckMXadEVcHwcAHFYhUsy6JcLuIrXzkbP/rRj1AqlQP5P1Gv7NHRpj1KOp1o1LpigZtfm20Z3R3qaQetbeVypNj/vSWSIxE1m5PFcdV+nI+BjgWrolQKn5gA0i83PDxk3Lf3y/X19WPWrA8YbSgHHXQoXnzxhZb9RAgfETm5gBLV8HAexx13POLxBL73vWuRTifR19fjap7nBHu/H6AjmfT3cYrHY5AkoTFteOJmGDWJqYC6bYCZmaS+t0TC6GjWaJ3p7c2Y+iDHR1SEmFIol2tdIybAv19u3rzdMTY2ildffQUA8Kc//S923nlO144nQhOblZSgG1BVFf/zP2vxiU98CrIsG55UksQbqmVaW6rVagCCn5TUx4n2+5nbaBKJZl/gRE2gAcZfdKdaKlHkO14g4HkOmQwhpmKx+9oxv365F154Ht///jUolyuYPn06LrnkMvT29oX2+pGUwBmhkJOfTuTVV1/Gd75zBYrFIj784Y/g61//5oS5A3QXVqJiGBh6oSBWL2aY1dw8z0HTdBSLwQSWYSHs1UC6QCBJzebkalXxrJvxPIt0Oo1qtYZCYfKtficCETk5Y9xpXRBf5csuuwTnnnsB7rvvAei6jjVrfjXel50iMFu95JHLlaHrMKxeUqlkYKM4OmpK08jqX7lcaRjONe1EuglKTNlseDIF6wJBqdEYTepuiUSs5QJF23G2JGKK4I5xk5Ofr/KGDe+hWq1i7tx5AIDDD1+AP/zhkfG+7BSE1ZMqlyu3eFKRorH7HqiTQi5XRKVSRTZbwOhozpjnZy0+h3fkZmLq1mogGT/erLvpuo5kkng5/eMfz+LXv/4VKpUSarV6REwRAIRATk46kU2bNgV+fHNFraaiUKgZ5nmqqiGRiFnM86hPnK7rLSZxFE3DuYKt+GwmvM6ZSpLEBjFNnEyBTE5u2hJv3LgRd9xxOz7xiU/guOOOw3PPPTMhxxFhamPc5OSnE/F7fEuAomgWoqrXNcRiMfT29mDDhndx9NGfw1//+hdfixdz24nVGZOukkltEVVT2Nn5QNHxgmF0HHvsF7Bu3f/g5pvvwF577TMpxxFh6mHcVWk/X2U/HcmWBkXRoChkFepf/3oZS5achf32+xj23ntvMAxrNCb7SQd03dp2Qht5aRsN9Rp3WyWjxJTLTR4xEZFqGopCoszddpuH3XabN+79+i3QUDzxxB9x3XXX4Be/+PW4XzNC+Bh35OSnE5k5cyuIomiE6mvXPmT0KW3pePHFF3HYYZ/BRRctQ7FIJAS0tkQ9wjkuWCRkHt5ZKpWNiSdkP7LFa1yWJz9ias4PVJHLldGOBMMLQRZoAHKR/PGPvz+hMo0I7WHckdO0adOxePHZWLLkDEMnsuuucy06kUsvvQLXXEOkBDvtNAfHHHNcoH37XQEff3w9brvtFui6jq233hrf/ObSUK0suo0FCz5n/L9e11GvKygWFZPVi4REIt62JxXtjwOaTpI9PSlomt5wUWAnXHFuhnmwaTYbHjEB/o28FN/5zhU45ZTFDb/vCFMRoYiNDjnkMBxyyGGWv61Y8UPj/zvuuBNWrry7rX3SK+Btt90DQRBx5pmLsOee840fWbFYwIoV38Gtt96NadOm49Zbb8Ltt9+Cr33t6+N/Q5MMavVSKpmJikQ77XpSmRt56Uw3XQcymaSR+oXpcOAHlgXS6RRUVQ+dmIBggy9/8Yv7sPPOc0JJISN0D1O2fcVPolCv13Heed/AtGnTAQDbb78DNm7cMFmH2zWYPalGRgqoVJSOPKliManRCpPD6Gi2sSpIx6FT3VH3hl0CxLQvnU5D13XkciWETUyA/wLMa6/9C4899nucfPIEOONFGBemrEzb7wqYyfTggAMOBEAmrf7kJ3fhmGP+e8KPcyKhqrrF6iWoJ1UsJjem4DZ79Kzj0DnDYZJhwh92CRBiymRS0HUd2WzJd/R8p/BboPnDHx7F0NAQTjvtJNTrCoaGBnH22afhhhtu7crxROgcUzZyCipBKBQKOP/8r2GHHXbEpz99xEQe4qSCelKNjZUxPJxHuayA58nIddpQzDA6Vq36BUqloudwz6buiA671I1hl8lk3LUxOShIxJSCrqOrxAT4L9CceuoZuO++B3DnnT/Dd7/7AwwMTIuIaYpiypJTEAnC0NAQvvzl07D99jviwgsvmehDnDKgRGX2pNI0DcuWfRt33HE7yuUKOC7YV62qGsrlCrJZIpCs11ULUbXbRkOJiWEYZLPlrhITYF2g+dKXFuLggw81FmheeumfXX3tCOFiyroSDA5uwtlnn4ZbbrkLsVgMZ565CBdccJExh15VVZx++pfwX/91AL70pdMm7TinKm655QasWfMr3HjjLdhttzkQBB66rnc8QJTO96Mj3YOMzWIYHel0GgzDYGys1FYj9JaEqPHXGVOWnABvK4uNGzfi4osvwPbb72hsP2fOLlt0BGXGO++8DUEQMH36DABoWL0IDQeFJlHR+lI7xWn72Cz7mCkCHel0CizLIpst+Y6O35IRkZMzpjQ5dQtbuoI4TE8q+5ipt956Cw8++CAOOGB/zJs3D9lsOSImH0Tk5Iwpu1rXLfjppyg2ZwWxrjOoVlVUqyqAikFUqVQCQKItTyra70cHiuZyefzxj4/jxhtvwIwZM3HMMcfh+ONP7Pp7irD5YYsjp0hBbAexeiF2L02iSiQSSCbbNc/TsdNOO+LnP78fL730b6xf//uOZ+uZsbl3CkRwxhZHTpGC2AtNogKqEEUOosghkYgjmWSgKPWGqrzmQFQ6UqkkeJ5HNlvC9OkzceyxC8d9RFtyp8CWjikrJegWIgVxcATxpKIfZTKZbIzNKkFVw0uFo06BLRdbHDn56afMCuLzz/+qoSDe0mH3pFJV4knV19eD3t40RJHH2Fi4xAT4mxU6dQrsv/8nQj2GCJODLY6cIgXx+EGJamSkiLExYp6Xy5VDJyYg6hTYkrHFkVO3FcTr1q3FiSd+AccddxRWrbq/5fE333wD55xzOk4++Xicd945yOVy437NyQQhpgoUpTt6gahTYMvFFqlz6haoqt1cvP32t680ire6rmPhwqPx1a9+Hfvu+zHceOP10HUdZ5+9ZJKPfOpiS+gUiHROztjiVuu6CT+Zwssvv4RYLGY4gZ500inI5wuTdrzvB/iZGW7cuBGvvPISVFXF+vW/BxB1CmwuiMgpRPjJFN555y309fVj+fLL8OqrL2P27A/i3HPPn4xDfV/By8xwzpxd8fjjT07GYUXoMra4mlM34Ve8VVUVf//70zjqqGNw++0/xdZbb4Prr79uMg41QoQpj4icQoRf8bavrx+zZn0Ac+bsCgA46KBD8eKLL7TsJ0KECBE5hQo/mcK8ebtjbGwUr776CgDgT3/6X+y885zJOtwIEaY0otW6kOFl8zJnzq544YXn8f3vX4NyuYLp06fjkksuQ29v32QfdoRJRLRa54yInN5H8GuAffnll/Dd714FRVEwY8YMXHLJ5Uiloh/+VEdETs6I0rr3CYIMi/zBD1bg1FPPwF133Yttt52Ne++9Z5KO1ht+QtVXX30Zp576RRx33Ofxne9cjno9vEELEd4/iMjpfQK/BliArBaWSkUApM9MkqTJOFRPBCHZyy67BOeeewHuu+8B6LqONWt+NTkHG2FSEZHT+wR+DbAAcM455+Lqq6/EZz97KJ588q/43OeOnujD9IUfyW7Y8B6q1SrmziV2NYcfvgB/+MMjk3W4ESYRETm9T+CnoapWK/jOdy7H97//Y6xe/TscddQxuOKKpZNxqJ7wI9kgJBxhy4CnQjwq1E0dbL/9bDz11FPGd1Kp5PGBD2xj3H/uudeRSMRwwAFEunDqqSfjtttunnLfYSwmgGU147iSSQnxuGjcT6dliCJv3C8W4xAEbsq9jwjdRxQ5vU/wsY99DH/+858xMjKCcrmMdevWYf/99zcenz17NjZs2IDXXiP1m0cffRTz5k09J8+ZM2dicHDQuD84OIjp06e7Pj40NGR5PMKWg4ic3ieYMWMGzj33XJx00kn43Oc+hyOOOAK77747Fi9ejH/84x/IZDJYvnw5vva1r2HBggVYtWoVrrrqqsk+7Bb4kew222wDSZLw9NNPAwBWr15teTzClgNPnVOECN3AmjVrcPPNN0NRFBxzzDFYvHgxFi9ejCVLlmDevHl46aWXcPHFF6NQKGC33XbD8uXLIYriZB92hAlGRE4RIkSYkojSuggRIkxJROQUIUKEKYmInCJEiDAlEZFThAgRpiQicooQIcKUREROESJEmJKIyClChAhTEv8f3UV1QpuQl9wAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "filenames": { "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter3_181_1.png" } }, "output_type": "display_data" } ], "source": [ "from mpl_toolkits.mplot3d import Axes3D\n", "import matplotlib.pyplot as plt\n", "from matplotlib import cm\n", "from matplotlib.ticker import LinearLocator, FormatStrFormatter\n", "import numpy as np\n", "from random import random, seed\n", "\n", "fig = plt.figure()\n", "ax = fig.gca(projection='3d')\n", "\n", "# Make data.\n", "x = np.arange(0, 1, 0.05)\n", "y = np.arange(0, 1, 0.05)\n", "x, y = np.meshgrid(x,y)\n", "\n", "\n", "def FrankeFunction(x,y):\n", " term1 = 0.75*np.exp(-(0.25*(9*x-2)**2) - 0.25*((9*y-2)**2))\n", " term2 = 0.75*np.exp(-((9*x+1)**2)/49.0 - 0.1*(9*y+1))\n", " term3 = 0.5*np.exp(-(9*x-7)**2/4.0 - 0.25*((9*y-3)**2))\n", " term4 = -0.2*np.exp(-(9*x-4)**2 - (9*y-7)**2)\n", " return term1 + term2 + term3 + term4\n", "\n", "\n", "z = FrankeFunction(x, y)\n", "\n", "# Plot the surface.\n", "surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm,\n", " linewidth=0, antialiased=False)\n", "\n", "# Customize the z axis.\n", "ax.set_zlim(-0.10, 1.40)\n", "ax.zaxis.set_major_locator(LinearLocator(10))\n", "ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))\n", "\n", "# Add a color bar which maps values to colors.\n", "fig.colorbar(surf, shrink=0.5, aspect=5)\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise: Ordinary Least Square (OLS) on the Franke function\n", "\n", "We will generate our own dataset for a function\n", "$\\mathrm{FrankeFunction}(x,y)$ with $x,y \\in [0,1]$. The function\n", "$f(x,y)$ is the Franke function. You should explore also the addition\n", "of an added stochastic noise to this function using the normal\n", "distribution $N(0,1)$.\n", "\n", "*Write your own code* (using either a matrix inversion or a singular\n", "value decomposition from e.g., **numpy** ) or use your code from\n", "homeworks 1 and 2 and perform a standard least square regression\n", "analysis using polynomials in $x$ and $y$ up to fifth order. Find the\n", "[confidence intervals](https://en.wikipedia.org/wiki/Confidence_interval) of the parameters (estimators) $\\beta$ by computing their\n", "variances, evaluate the Mean Squared error (MSE)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "MSE(\\hat{y},\\hat{\\tilde{y}}) = \\frac{1}{n}\n", "\\sum_{i=0}^{n-1}(y_i-\\tilde{y}_i)^2,\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and the $R^2$ score function. If $\\tilde{\\hat{y}}_i$ is the predicted\n", "value of the $i-th$ sample and $y_i$ is the corresponding true value,\n", "then the score $R^2$ is defined as" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "R^2(\\hat{y}, \\tilde{\\hat{y}}) = 1 - \\frac{\\sum_{i=0}^{n - 1} (y_i - \\tilde{y}_i)^2}{\\sum_{i=0}^{n - 1} (y_i - \\bar{y})^2},\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "where we have defined the mean value of $\\hat{y}$ as" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\bar{y} = \\frac{1}{n} \\sum_{i=0}^{n - 1} y_i.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Your code has to include a scaling of the data (for example by\n", "subtracting the mean value), and\n", "a split of the data in training and test data. For this exercise you can\n", "either write your own code or use for example the function for\n", "splitting training data provided by the library **Scikit-Learn** (make\n", "sure you have installed it). This function is called\n", "$train\\_test\\_split$. **You should present a critical discussion of why and how you have scaled or not scaled the data**.\n", "\n", "It is normal in essentially all Machine Learning studies to split the\n", "data in a training set and a test set (eventually also an additional\n", "validation set). There\n", "is no explicit recipe for how much data should be included as training\n", "data and say test data. An accepted rule of thumb is to use\n", "approximately $2/3$ to $4/5$ of the data as training data.\n", "\n", "\n", "You can easily reuse the solutions to your exercises from week 35 and week 36.\n", "\n", "\n", "\n", "### Exercise: Bias-variance trade-off and resampling techniques\n", "\n", "Our aim here is to study the bias-variance trade-off by implementing the **bootstrap** resampling technique.\n", "\n", "With a code which does OLS and includes resampling techniques, \n", "we will now discuss the bias-variance trade-off in the context of\n", "continuous predictions such as regression. However, many of the\n", "intuitions and ideas discussed here also carry over to classification\n", "tasks and basically all Machine Learning algorithms. \n", "\n", "Before you perform an analysis of the bias-variance trade-off on your test data, make\n", "first a figure similar to Fig. 2.11 of Hastie, Tibshirani, and\n", "Friedman. Figure 2.11 of this reference displays only the test and training MSEs. The test MSE can be used to \n", "indicate possible regions of low/high bias and variance. You will most likely not get an\n", "equally smooth curve!\n", "\n", "With this result we move on to the bias-variance trade-off analysis.\n", "\n", "Consider a\n", "dataset $\\mathcal{L}$ consisting of the data\n", "$\\mathbf{X}_\\mathcal{L}=\\{(y_j, \\boldsymbol{x}_j), j=0\\ldots n-1\\}$.\n", "\n", "Let us assume that the true data is generated from a noisy model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\boldsymbol{y}=f(\\boldsymbol{x}) + \\boldsymbol{\\epsilon}.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here $\\epsilon$ is normally distributed with mean zero and standard\n", "deviation $\\sigma^2$.\n", "\n", "In our derivation of the ordinary least squares method we defined then\n", "an approximation to the function $f$ in terms of the parameters\n", "$\\boldsymbol{\\beta}$ and the design matrix $\\boldsymbol{X}$ which embody our model,\n", "that is $\\boldsymbol{\\tilde{y}}=\\boldsymbol{X}\\boldsymbol{\\beta}$.\n", "\n", "The parameters $\\boldsymbol{\\beta}$ are in turn found by optimizing the means\n", "squared error via the so-called cost function" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "C(\\boldsymbol{X},\\boldsymbol{\\beta}) =\\frac{1}{n}\\sum_{i=0}^{n-1}(y_i-\\tilde{y}_i)^2=\\mathbb{E}\\left[(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}})^2\\right].\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here the expected value $\\mathbb{E}$ is the sample value. \n", "\n", "Show that you can rewrite this as" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\mathbb{E}\\left[(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}})^2\\right]=\\frac{1}{n}\\sum_i(f_i-\\mathbb{E}\\left[\\boldsymbol{\\tilde{y}}\\right])^2+\\frac{1}{n}\\sum_i(\\tilde{y}_i-\\mathbb{E}\\left[\\boldsymbol{\\tilde{y}}\\right])^2+\\sigma^2.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Explain what the terms mean, which one is the bias and which one is\n", "the variance and discuss their interpretations.\n", "\n", "Perform then a bias-variance analysis of the Franke function by\n", "studying the MSE value as function of the complexity of your model.\n", "\n", "Discuss the bias and variance trade-off as function\n", "of your model complexity (the degree of the polynomial) and the number\n", "of data points, and possibly also your training and test data using the **bootstrap** resampling method.\n", "\n", "Note also that when you calculate the bias, in all applications you don't know the function values $f_i$. You would hence replace them with the actual data points $y_i$.\n", "\n", "\n", "### Exercise: Cross-validation as resampling techniques, adding more complexity\n", "\n", "The aim here is to write your own code for another widely popular\n", "resampling technique, the so-called cross-validation method. Again,\n", "before you start with cross-validation approach, you should scale your\n", "data.\n", "\n", "Implement the $k$-fold cross-validation algorithm (write your own\n", "code) and evaluate again the MSE function resulting\n", "from the test folds. You can compare your own code with that from\n", "**Scikit-Learn** if needed. \n", "\n", "Compare the MSE you get from your cross-validation code with the one\n", "you got from your **bootstrap** code. Comment your results. Try $5-10$\n", "folds. You can also compare your own cross-validation code with the\n", "one provided by **Scikit-Learn**.\n", "\n", "\n", "### Exercise: Ridge Regression on the Franke function with resampling\n", "\n", "Write your own code for the Ridge method, either using matrix\n", "inversion or the singular value decomposition as done in the previous\n", "exercise. Perform the same bootstrap analysis as in the\n", "Exercise 2 (for the same polynomials) and the cross-validation in exercise 3 but now for different values of $\\lambda$. Compare and\n", "analyze your results with those obtained in exercises 1-3. Study the\n", "dependence on $\\lambda$.\n", "\n", "Study also the bias-variance trade-off as function of various values of\n", "the parameter $\\lambda$. For the bias-variance trade-off, use the **bootstrap** resampling method. Comment your results. \n", "\n", "### Exercise: Lasso Regression on the Franke function with resampling\n", "\n", "This exercise is essentially a repeat of the previous two ones, but now\n", "with Lasso regression. Write either your own code (difficult and optional) or, in this case,\n", "you can also use the functionalities of **Scikit-Learn** (recommended). \n", "Give a\n", "critical discussion of the three methods and a judgement of which\n", "model fits the data best. Perform here as well an analysis of the bias-variance trade-off using the **bootstrap** resampling technique and an analysis of the mean squared error using cross-validation. \n", "\n", "### Exercise: Analysis of real data\n", "\n", "With our codes functioning and having been tested properly on a\n", "simpler function we are now ready to look at real data. We will\n", "essentially repeat in this exercise what was done in exercises 1-5. However, we\n", "need first to download the data and prepare properly the inputs to our\n", "codes. We are going to download digital terrain data from the website\n", ",\n", "\n", "Or, if you prefer, we have placed selected datafiles at \n", "\n", "In order to obtain data for a specific region, you need to register as\n", "a user (free) at this website and then decide upon which area you want\n", "to fetch the digital terrain data from. In order to be able to read\n", "the data properly, you need to specify that the format should be **SRTM\n", "Arc-Second Global** and download the data as a **GeoTIF** file. The\n", "files are then stored in *tif* format which can be imported into a\n", "Python program using" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false, "editable": true }, "outputs": [ { "ename": "NameError", "evalue": "name 'scipy' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mscipy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmisc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimread\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'scipy' is not defined" ] } ], "source": [ "scipy.misc.imread" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is a simple part of a Python code which reads and plots the data\n", "from such files" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "editable": true }, "outputs": [], "source": [ "\"\"\"\n", "import numpy as np\n", "from imageio import imread\n", "import matplotlib.pyplot as plt\n", "from mpl_toolkits.mplot3d import Axes3D\n", "from matplotlib import cm\n", "\n", "# Load the terrain\n", "terrain1 = imread('SRTM_data_Norway_1.tif')\n", "# Show the terrain\n", "plt.figure()\n", "plt.title('Terrain over Norway 1')\n", "plt.imshow(terrain1, cmap='gray')\n", "plt.xlabel('X')\n", "plt.ylabel('Y')\n", "plt.show()\n", "\"\"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you should have problems in downloading the digital terrain data,\n", "we provide two examples under the data folder of project 1. One is\n", "from a region close to Stavanger in Norway and the other Møsvatn\n", "Austfjell, again in Norway.\n", "Feel free to produce your own terrain data.\n", "\n", "\n", "Alternatively, if you would like to use another data set, feel free to do so. This could be data close to your reseach area or simply a data set you found interesting. See for example [kaggle.com](https://www.kaggle.com/datasets) for examples.\n", "\n", "\n", "Our final part deals with the parameterization of your digital terrain\n", "data (or your own data). We will apply all three methods for linear regression, the same type (or higher order) of polynomial\n", "approximation and cross-validation as resampling technique to evaluate which\n", "model fits the data best.\n", "\n", "At the end, you should present a critical evaluation of your results\n", "and discuss the applicability of these regression methods to the type\n", "of data presented here (either the terrain data we propose or other data sets)." ] } ], "metadata": { "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" } }, "nbformat": 4, "nbformat_minor": 4 }