4914 lines
604 KiB
Plaintext
4914 lines
604 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Linear Regression\n",
|
||
"\n",
|
||
"\n",
|
||
"## Introduction\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Our emphasis throughout this series of lectures is on understanding\n",
|
||
"the mathematical aspects of different algorithms used in the fields of\n",
|
||
"data analysis and machine learning.\n",
|
||
"\n",
|
||
"However, where possible we will emphasize the importance of using\n",
|
||
"available software. We start thus with a hands-on and top-down\n",
|
||
"approach to machine learning. The aim is thus to start with relevant\n",
|
||
"data or data we have produced and use these to introduce statistical\n",
|
||
"data analysis concepts and machine learning algorithms before we delve\n",
|
||
"into the algorithms themselves. The examples we will use in the\n",
|
||
"beginning, start with simple polynomials with random noise added. We\n",
|
||
"will use the Python software package\n",
|
||
"[Scikit-Learn](http://scikit-learn.org/stable/) and introduce various\n",
|
||
"machine learning algorithms to make fits of the data and\n",
|
||
"predictions. We move thereafter to more interesting cases such as data\n",
|
||
"from say experiments (below we will look at experimental nuclear\n",
|
||
"binding energies as an example). These are examples where we can\n",
|
||
"easily set up the data and then use machine learning algorithms\n",
|
||
"included in for example **Scikit-Learn**.\n",
|
||
"\n",
|
||
"These examples will serve us the purpose of getting\n",
|
||
"started. Furthermore, they allow us to catch more than two birds with\n",
|
||
"a stone. They will allow us to bring in some programming specific\n",
|
||
"topics and tools as well as showing the power of various Python\n",
|
||
"libraries for machine learning and statistical data analysis.\n",
|
||
"\n",
|
||
"Here, we will mainly focus on two specific Python packages for Machine\n",
|
||
"Learning, Scikit-Learn and Tensorflow (see below for links etc).\n",
|
||
"Moreover, the examples we introduce will serve as inputs to many of\n",
|
||
"our discussions later, as well as allowing you to set up models and\n",
|
||
"produce your own data and get started with programming.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"## What is Machine Learning?\n",
|
||
"\n",
|
||
"Statistics, data science and machine learning form important fields of\n",
|
||
"research in modern science. They describe how to learn and make\n",
|
||
"predictions from data, as well as allowing us to extract important\n",
|
||
"correlations about physical process and the underlying laws of motion\n",
|
||
"in large data sets. The latter, big data sets, appear frequently in\n",
|
||
"essentially all disciplines, from the traditional Science, Technology,\n",
|
||
"Mathematics and Engineering fields to Life Science, Law, education\n",
|
||
"research, the Humanities and the Social Sciences. \n",
|
||
"\n",
|
||
"It has become more\n",
|
||
"and more common to see research projects on big data in for example\n",
|
||
"the Social Sciences where extracting patterns from complicated survey\n",
|
||
"data is one of many research directions. Having a solid grasp of data\n",
|
||
"analysis and machine learning is thus becoming central to scientific\n",
|
||
"computing in many fields, and competences and skills within the fields\n",
|
||
"of machine learning and scientific computing are nowadays strongly\n",
|
||
"requested by many potential employers. The latter cannot be\n",
|
||
"overstated, familiarity with machine learning has almost become a\n",
|
||
"prerequisite for many of the most exciting employment opportunities,\n",
|
||
"whether they are in bioinformatics, life science, physics or finance,\n",
|
||
"in the private or the public sector. This author has had several\n",
|
||
"students or met students who have been hired recently based on their\n",
|
||
"skills and competences in scientific computing and data science, often\n",
|
||
"with marginal knowledge of machine learning.\n",
|
||
"\n",
|
||
"Machine learning is a subfield of computer science, and is closely\n",
|
||
"related to computational statistics. It evolved from the study of\n",
|
||
"pattern recognition in artificial intelligence (AI) research, and has\n",
|
||
"made contributions to AI tasks like computer vision, natural language\n",
|
||
"processing and speech recognition. Many of the methods we will study are also \n",
|
||
"strongly rooted in basic mathematics and physics research. \n",
|
||
"\n",
|
||
"Ideally, machine learning represents the science of giving computers\n",
|
||
"the ability to learn without being explicitly programmed. The idea is\n",
|
||
"that there exist generic algorithms which can be used to find patterns\n",
|
||
"in a broad class of data sets without having to write code\n",
|
||
"specifically for each problem. The algorithm will build its own logic\n",
|
||
"based on the data. You should however always keep in mind that\n",
|
||
"machines and algorithms are to a large extent developed by humans. The\n",
|
||
"insights and knowledge we have about a specific system, play a central\n",
|
||
"role when we develop a specific machine learning algorithm. \n",
|
||
"\n",
|
||
"Machine learning is an extremely rich field, in spite of its young\n",
|
||
"age. The increases we have seen during the last three decades in\n",
|
||
"computational capabilities have been followed by developments of\n",
|
||
"methods and techniques for analyzing and handling large date sets,\n",
|
||
"relying heavily on statistics, computer science and mathematics. The\n",
|
||
"field is rather new and developing rapidly. Popular software packages\n",
|
||
"written in Python for machine learning like\n",
|
||
"[Scikit-learn](http://scikit-learn.org/stable/),\n",
|
||
"[Tensorflow](https://www.tensorflow.org/),\n",
|
||
"[PyTorch](http://pytorch.org/) and [Keras](https://keras.io/), all\n",
|
||
"freely available at their respective GitHub sites, encompass\n",
|
||
"communities of developers in the thousands or more. And the number of\n",
|
||
"code developers and contributors keeps increasing. Not all the\n",
|
||
"algorithms and methods can be given a rigorous mathematical\n",
|
||
"justification, opening up thereby large rooms for experimenting and\n",
|
||
"trial and error and thereby exciting new developments. However, a\n",
|
||
"solid command of linear algebra, multivariate theory, probability\n",
|
||
"theory, statistical data analysis, understanding errors and Monte\n",
|
||
"Carlo methods are central elements in a proper understanding of many\n",
|
||
"of algorithms and methods we will discuss.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"The approaches to machine learning are many, but are often split into\n",
|
||
"two main categories. In *supervised learning* we know the answer to a\n",
|
||
"problem, and let the computer deduce the logic behind it. On the other\n",
|
||
"hand, *unsupervised learning* is a method for finding patterns and\n",
|
||
"relationship in data sets without any prior knowledge of the system.\n",
|
||
"Some authours also operate with a third category, namely\n",
|
||
"*reinforcement learning*. This is a paradigm of learning inspired by\n",
|
||
"behavioral psychology, where learning is achieved by trial-and-error,\n",
|
||
"solely from rewards and punishment.\n",
|
||
"\n",
|
||
"Another way to categorize machine learning tasks is to consider the\n",
|
||
"desired output of a system. Some of the most common tasks are:\n",
|
||
"\n",
|
||
" * Classification: Outputs are divided into two or more classes. The goal is to produce a model that assigns inputs into one of these classes. An example is to identify digits based on pictures of hand-written ones. Classification is typically supervised learning.\n",
|
||
"\n",
|
||
" * Regression: Finding a functional relationship between an input data set and a reference data set. The goal is to construct a function that maps input data to continuous output values.\n",
|
||
"\n",
|
||
" * Clustering: Data are divided into groups with certain common traits, without knowing the different groups beforehand. It is thus a form of unsupervised learning.\n",
|
||
"\n",
|
||
"The methods we cover have three main topics in common, irrespective of\n",
|
||
"whether we deal with supervised or unsupervised learning.\n",
|
||
"* The first ingredient is normally our data set (which can be subdivided into training, validation and test data). Many find the most difficult part of using Machine Learning to be the set up of your data in a meaningful way. \n",
|
||
"\n",
|
||
"* The second item is a model which is normally a function of some parameters. The model reflects our knowledge of the system (or lack thereof). As an example, if we know that our data show a behavior similar to what would be predicted by a polynomial, fitting our data to a polynomial of some degree would then determin our model. \n",
|
||
"\n",
|
||
"* The last ingredient is a so-called **cost/loss** function (or error or risk function) which allows us to present an estimate on how good our model is in reproducing the data it is supposed to train. \n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"At the heart of basically all Machine Learning algorithms we will encounter so-called minimization or optimization algorithms. A large family of such methods are so-called **gradient methods**.\n",
|
||
"\n",
|
||
"\n",
|
||
"### A Frequentist approach to data analysis\n",
|
||
"\n",
|
||
"When you hear phrases like **predictions and estimations** and\n",
|
||
"**correlations and causations**, what do you think of? May be you think\n",
|
||
"of the difference between classifying new data points and generating\n",
|
||
"new data points.\n",
|
||
"Or perhaps you consider that correlations represent some kind of symmetric statements like\n",
|
||
"if $A$ is correlated with $B$, then $B$ is correlated with\n",
|
||
"$A$. Causation on the other hand is directional, that is if $A$ causes $B$, $B$ does not\n",
|
||
"necessarily cause $A$.\n",
|
||
"\n",
|
||
"These concepts are in some sense the difference between machine\n",
|
||
"learning and statistics. In machine learning and prediction based\n",
|
||
"tasks, we are often interested in developing algorithms that are\n",
|
||
"capable of learning patterns from given data in an automated fashion,\n",
|
||
"and then using these learned patterns to make predictions or\n",
|
||
"assessments of newly given data. In many cases, our primary concern\n",
|
||
"is the quality of the predictions or assessments, and we are less\n",
|
||
"concerned about the underlying patterns that were learned in order\n",
|
||
"to make these predictions.\n",
|
||
"\n",
|
||
"In machine learning we normally use [a so-called frequentist approach](https://en.wikipedia.org/wiki/Frequentist_inference),\n",
|
||
"where the aim is to make predictions and find correlations. We focus\n",
|
||
"less on for example extracting a probability distribution function (PDF). The PDF can be\n",
|
||
"used in turn to make estimations and find causations such as given $A$\n",
|
||
"what is the likelihood of finding $B$.\n",
|
||
"\n",
|
||
"\n",
|
||
"### What is a good model?\n",
|
||
"\n",
|
||
"In science and engineering we often end up in situations where we want to infer (or learn) a\n",
|
||
"quantitative model $M$ for a given set of sample points $\\boldsymbol{X} \\in [x_1, x_2,\\dots x_N]$.\n",
|
||
"\n",
|
||
"As we will see repeatedely in these lectures, we could try to fit these data points to a model given by a\n",
|
||
"straight line, or if we wish to be more sophisticated to a more complex\n",
|
||
"function.\n",
|
||
"\n",
|
||
"The reason for inferring such a model is that it\n",
|
||
"serves many useful purposes. On the one hand, the model can reveal information\n",
|
||
"encoded in the data or underlying mechanisms from which the data were generated. For instance, we could discover important\n",
|
||
"corelations that relate interesting physics interpretations.\n",
|
||
"\n",
|
||
"In addition, it can simplify the representation of the given data set and help\n",
|
||
"us in making predictions about future data samples.\n",
|
||
"\n",
|
||
"A first important consideration to keep in mind is that inferring the *correct* model\n",
|
||
"for a given data set is an elusive, if not impossible, task. The fundamental difficulty\n",
|
||
"is that if we are not specific about what we mean by a *correct* model, there\n",
|
||
"could easily be many different models that fit the given data set *equally well*.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"The central question is this: what leads us to say that a model is correct or\n",
|
||
"optimal for a given data set? To make the model inference problem well posed, i.e.,\n",
|
||
"to guarantee that there is a unique optimal model for the given data, we need to\n",
|
||
"impose additional assumptions or restrictions on the class of models considered. To\n",
|
||
"this end, we should not be looking for just any model that can describe the data.\n",
|
||
"Instead, we should look for a **model** $M$ that is the best among a restricted class\n",
|
||
"of models. In addition, to make the model inference problem computationally\n",
|
||
"tractable, we need to specify how restricted the class of models needs to be. A\n",
|
||
"common strategy is to start \n",
|
||
"with the simplest possible class of models that is just necessary to describe the data\n",
|
||
"or solve the problem at hand. More precisely, the model class should be rich enough\n",
|
||
"to contain at least one model that can fit the data to a desired accuracy and yet be\n",
|
||
"restricted enough that it is relatively simple to find the best model for the given data.\n",
|
||
"\n",
|
||
"Thus, the most popular strategy is to start from the\n",
|
||
"simplest class of models and increase the complexity of the models only when the\n",
|
||
"simpler models become inadequate. For instance, if we work with a regression problem to fit a set of sample points, one\n",
|
||
"may first try the simplest class of models, namely linear models, followed obviously by more complex models.\n",
|
||
"\n",
|
||
"How to evaluate which model fits best the data is something we will come back to over and over again in these sets of lectures.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"## Simple linear regression model using **scikit-learn**\n",
|
||
"\n",
|
||
"We start with perhaps our simplest possible example, using\n",
|
||
"**Scikit-Learn** to perform linear regression analysis on a data set\n",
|
||
"produced by us.\n",
|
||
"\n",
|
||
"What follows is a simple Python code where we have defined a function\n",
|
||
"$y$ in terms of the variable $x$. Both are defined as vectors with $100$ entries. \n",
|
||
"The numbers in the vector $\\boldsymbol{x}$ are given\n",
|
||
"by random numbers generated with a uniform distribution with entries\n",
|
||
"$x_i \\in [0,1]$ (more about probability distribution functions\n",
|
||
"later). These values are then used to define a function $y(x)$\n",
|
||
"(tabulated again as a vector) with a linear dependence on $x$ plus a\n",
|
||
"random noise added via the normal distribution.\n",
|
||
"\n",
|
||
"\n",
|
||
"The Numpy functions are imported used the **import numpy as np**\n",
|
||
"statement and the random number generator for the uniform distribution\n",
|
||
"is called using the function **np.random.rand()**, where we specificy\n",
|
||
"that we want $100$ random variables. Using Numpy we define\n",
|
||
"automatically an array with the specified number of elements, $100$ in\n",
|
||
"our case. With the Numpy function **randn()** we can compute random\n",
|
||
"numbers with the normal distribution (mean value $\\mu$ equal to zero and\n",
|
||
"variance $\\sigma^2$ set to one) and produce the values of $y$ assuming a linear\n",
|
||
"dependence as function of $x$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"y = 2x+N(0,1),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $N(0,1)$ represents random numbers generated by the normal\n",
|
||
"distribution. From **Scikit-Learn** we import then the\n",
|
||
"**LinearRegression** functionality and make a prediction $\\tilde{y} =\n",
|
||
"\\alpha + \\beta x$ using the function **fit(x,y)**. We call the set of\n",
|
||
"data $(\\boldsymbol{x},\\boldsymbol{y})$ for our training data. The Python package\n",
|
||
"**scikit-learn** has also a functionality which extracts the above\n",
|
||
"fitting parameters $\\alpha$ and $\\beta$ (see below). Later we will\n",
|
||
"distinguish between training data and test data.\n",
|
||
"\n",
|
||
"For plotting we use the Python package\n",
|
||
"[matplotlib](https://matplotlib.org/) which produces publication\n",
|
||
"quality figures. Feel free to explore the extensive\n",
|
||
"[gallery](https://matplotlib.org/gallery/index.html) of examples. In\n",
|
||
"this example we plot our original values of $x$ and $y$ as well as the\n",
|
||
"prediction **ypredict** ($\\tilde{y}$), which attempts at fitting our\n",
|
||
"data with a straight line. Note also that **Scikit-Learn** requires a\n",
|
||
"matrix as input for the input values $x$ and $y$. In the above code we\n",
|
||
"have solved this by declaring $x$ and $y$ as arrays of dimension\n",
|
||
"$n\\times 1$.\n",
|
||
"\n",
|
||
"In the code here we have also made a new array for $x\\in [0,1]$. Our\n",
|
||
"prediction is computed for these values, meaning that they were not\n",
|
||
"included in the data set used to *train* (or fit) the model.\n",
|
||
"This is a recurrring theme in machine learning and data analysis. We would like to train a model on a specific given data set.\n",
|
||
"Thereafter we wish to apply it to data which were not included in the training. Below we will encounter this again in the so-called *train-validate-test* spliting. We will typically split our data into different sets, oen for training, one for validation and finally, our data from the untouched test vault!\n",
|
||
"\n",
|
||
"\n",
|
||
"The Python code follows here."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_3_0.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"%matplotlib inline\n",
|
||
"\n",
|
||
"# Importing various packages\n",
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"\n",
|
||
"x = np.random.rand(100,1)\n",
|
||
"y = 2*x+np.random.randn(100,1)\n",
|
||
"linreg = LinearRegression()\n",
|
||
"linreg.fit(x,y)\n",
|
||
"# This is our new x-array to which we test our model\n",
|
||
"xnew = np.array([[0],[1]])\n",
|
||
"ypredict = linreg.predict(xnew)\n",
|
||
"\n",
|
||
"plt.plot(xnew, ypredict, \"r-\")\n",
|
||
"plt.plot(x, y ,'ro')\n",
|
||
"plt.axis([0,1.0,0, 5.0])\n",
|
||
"plt.xlabel(r'$x$')\n",
|
||
"plt.ylabel(r'$y$')\n",
|
||
"plt.title(r'Simple Linear Regression')\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This example serves several aims. It allows us to demonstrate several\n",
|
||
"aspects of data analysis and later machine learning algorithms. The\n",
|
||
"immediate visualization shows that our linear fit is not\n",
|
||
"impressive. It goes through the data points, but there are many\n",
|
||
"outliers which are not reproduced by our linear regression. We could\n",
|
||
"now play around with this small program and change for example the\n",
|
||
"factor in front of $x$ and the normal distribution. Try to change the\n",
|
||
"function $y$ to"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"y = 10x+0.01 \\times N(0,1),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $x$ is defined as before. Does the fit look better? Indeed, by\n",
|
||
"reducing the role of the noise given by the normal distribution we see immediately that\n",
|
||
"our linear prediction seemingly reproduces better the training\n",
|
||
"set. However, this testing 'by the eye' is obviouly not satisfactory in the\n",
|
||
"long run. Here we have only defined the training data and our model, and \n",
|
||
"have not discussed a more rigorous approach to the **cost** function.\n",
|
||
"\n",
|
||
"We need more rigorous criteria in defining whether we have succeeded or\n",
|
||
"not in modeling our training data. You will be surprised to see that\n",
|
||
"many scientists seldomly venture beyond this 'by the eye' approach. A\n",
|
||
"standard approach for the *cost* function is the so-called $\\chi^2$\n",
|
||
"function (a variant of the mean-squared error (MSE))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\chi^2 = \\frac{1}{n}\n",
|
||
"\\sum_{i=0}^{n-1}\\frac{(y_i-\\tilde{y}_i)^2}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\sigma_i^2$ is the variance (to be defined later) of the entry\n",
|
||
"$y_i$. We may not know the explicit value of $\\sigma_i^2$, it serves\n",
|
||
"however the aim of scaling the equations and make the cost function\n",
|
||
"dimensionless. \n",
|
||
"\n",
|
||
"Minimizing the cost function is a central aspect of\n",
|
||
"our discussions to come. Finding its minima as function of the model\n",
|
||
"parameters ($\\alpha$ and $\\beta$ in our case) will be a recurring\n",
|
||
"theme in these series of lectures. Essentially all machine learning\n",
|
||
"algorithms we will discuss center around the minimization of the\n",
|
||
"chosen cost function. This depends in turn on our specific\n",
|
||
"model for describing the data, a typical situation in supervised\n",
|
||
"learning. Automatizing the search for the minima of the cost function is a\n",
|
||
"central ingredient in all algorithms. Typical methods which are\n",
|
||
"employed are various variants of **gradient** methods. These will be\n",
|
||
"discussed in more detail later. Again, you'll be surprised to hear that\n",
|
||
"many practitioners minimize the above function ''by the eye', popularly dubbed as \n",
|
||
"'chi by the eye'. That is, change a parameter and see (visually and numerically) that \n",
|
||
"the $\\chi^2$ function becomes smaller. \n",
|
||
"\n",
|
||
"There are many ways to define the cost function. A simpler approach is to look at the relative difference between the training data and the predicted data, that is we define \n",
|
||
"the relative error (why would we prefer the MSE instead of the relative error?) as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\epsilon_{\\mathrm{relative}}= \\frac{\\vert \\boldsymbol{y} -\\boldsymbol{\\tilde{y}}\\vert}{\\vert \\boldsymbol{y}\\vert}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The squared cost function results in an arithmetic mean-unbiased\n",
|
||
"estimator, and the absolute-value cost function results in a\n",
|
||
"median-unbiased estimator (in the one-dimensional case, and a\n",
|
||
"geometric median-unbiased estimator for the multi-dimensional\n",
|
||
"case). The squared cost function has the disadvantage that it has the tendency\n",
|
||
"to be dominated by outliers.\n",
|
||
"\n",
|
||
"We can modify easily the above Python code and plot the relative error instead"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_11_0.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"# Number of data points\n",
|
||
"n = 100\n",
|
||
"x = np.random.rand(100,1)\n",
|
||
"y = 5*x+0.01*np.random.randn(100,1)\n",
|
||
"linreg = LinearRegression()\n",
|
||
"linreg.fit(x,y)\n",
|
||
"ypredict = linreg.predict(x)\n",
|
||
"\n",
|
||
"plt.plot(x, np.abs(ypredict-y)/abs(y), \"ro\")\n",
|
||
"plt.axis([0,1.0,0.0, 0.5])\n",
|
||
"plt.xlabel(r'$x$')\n",
|
||
"plt.ylabel(r'$\\epsilon_{\\mathrm{relative}}$')\n",
|
||
"plt.title(r'Relative error')\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Depending on the parameter in front of the normal distribution, we may\n",
|
||
"have a small or larger relative error. Try to play around with\n",
|
||
"different training data sets and study (graphically) the value of the\n",
|
||
"relative error.\n",
|
||
"\n",
|
||
"As mentioned above, **Scikit-Learn** has an impressive functionality.\n",
|
||
"We can for example extract the values of $\\alpha$ and $\\beta$ and\n",
|
||
"their error estimates, or the variance and standard deviation and many\n",
|
||
"other properties from the statistical data analysis. \n",
|
||
"\n",
|
||
"Here we show an\n",
|
||
"example of the functionality of **Scikit-Learn**."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"The intercept alpha: \n",
|
||
" [1.89342228]\n",
|
||
"Coefficient beta : \n",
|
||
" [[5.07308879]]\n",
|
||
"Mean squared error: 0.21\n",
|
||
"Variance score: 0.91\n",
|
||
"Mean squared log error: 0.01\n",
|
||
"Mean absolute error: 0.36\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_13_1.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import numpy as np \n",
|
||
"import matplotlib.pyplot as plt \n",
|
||
"from sklearn.linear_model import LinearRegression \n",
|
||
"from sklearn.metrics import mean_squared_error, r2_score, mean_squared_log_error, mean_absolute_error\n",
|
||
"\n",
|
||
"x = np.random.rand(100,1)\n",
|
||
"y = 2.0+ 5*x+0.5*np.random.randn(100,1)\n",
|
||
"linreg = LinearRegression()\n",
|
||
"linreg.fit(x,y)\n",
|
||
"ypredict = linreg.predict(x)\n",
|
||
"print('The intercept alpha: \\n', linreg.intercept_)\n",
|
||
"print('Coefficient beta : \\n', linreg.coef_)\n",
|
||
"# The mean squared error \n",
|
||
"print(\"Mean squared error: %.2f\" % mean_squared_error(y, ypredict))\n",
|
||
"# Explained variance score: 1 is perfect prediction \n",
|
||
"print('Variance score: %.2f' % r2_score(y, ypredict))\n",
|
||
"# Mean squared log error \n",
|
||
"print('Mean squared log error: %.2f' % mean_squared_log_error(y, ypredict) )\n",
|
||
"# Mean absolute error \n",
|
||
"print('Mean absolute error: %.2f' % mean_absolute_error(y, ypredict))\n",
|
||
"plt.plot(x, ypredict, \"r-\")\n",
|
||
"plt.plot(x, y ,'ro')\n",
|
||
"plt.axis([0.0,1.0,1.5, 7.0])\n",
|
||
"plt.xlabel(r'$x$')\n",
|
||
"plt.ylabel(r'$y$')\n",
|
||
"plt.title(r'Linear Regression fit ')\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The function **coef** gives us the parameter $\\beta$ of our fit while **intercept** yields \n",
|
||
"$\\alpha$. Depending on the constant in front of the normal distribution, we get values near or far from $alpha =2$ and $\\beta =5$. Try to play around with different parameters in front of the normal distribution. The function **meansquarederror** gives us the mean square error, a risk metric corresponding to the expected value of the squared (quadratic) error or loss defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"MSE(\\boldsymbol{y},\\boldsymbol{\\tilde{y}}) = \\frac{1}{n}\n",
|
||
"\\sum_{i=0}^{n-1}(y_i-\\tilde{y}_i)^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The smaller the value, the better the fit. Ideally we would like to\n",
|
||
"have an MSE equal zero. The attentive reader has probably recognized\n",
|
||
"this function as being similar to the $\\chi^2$ function defined above.\n",
|
||
"\n",
|
||
"The **r2score** function computes $R^2$, the coefficient of\n",
|
||
"determination. It provides a measure of how well future samples are\n",
|
||
"likely to be predicted by the model. Best possible score is 1.0 and it\n",
|
||
"can be negative (because the model can be arbitrarily worse). A\n",
|
||
"constant model that always predicts the expected value of $\\boldsymbol{y}$,\n",
|
||
"disregarding the input features, would get a $R^2$ score of $0.0$.\n",
|
||
"\n",
|
||
"If $\\tilde{\\boldsymbol{y}}_i$ is the predicted value of the $i-th$ sample and $y_i$ is the corresponding true value, then the score $R^2$ is defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"R^2(\\boldsymbol{y}, \\tilde{\\boldsymbol{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 $\\boldsymbol{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": [
|
||
"Another quantity taht we will meet again in our discussions of regression analysis is \n",
|
||
" the mean absolute error (MAE), a risk metric corresponding to the expected value of the absolute error loss or what we call the $l1$-norm loss. In our discussion above we presented the relative error.\n",
|
||
"The MAE is defined as follows"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\text{MAE}(\\boldsymbol{y}, \\boldsymbol{\\tilde{y}}) = \\frac{1}{n} \\sum_{i=0}^{n-1} \\left| y_i - \\tilde{y}_i \\right|.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We present the \n",
|
||
"squared logarithmic (quadratic) error"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\text{MSLE}(\\boldsymbol{y}, \\boldsymbol{\\tilde{y}}) = \\frac{1}{n} \\sum_{i=0}^{n - 1} (\\log_e (1 + y_i) - \\log_e (1 + \\tilde{y}_i) )^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\log_e (x)$ stands for the natural logarithm of $x$. This error\n",
|
||
"estimate is best to use when targets having exponential growth, such\n",
|
||
"as population counts, average sales of a commodity over a span of\n",
|
||
"years etc. \n",
|
||
"\n",
|
||
"\n",
|
||
"Finally, another cost function is the Huber cost function used in robust regression.\n",
|
||
"\n",
|
||
"The rationale behind this possible cost function is its reduced\n",
|
||
"sensitivity to outliers in the data set. In our discussions on\n",
|
||
"dimensionality reduction and normalization of data we will meet other\n",
|
||
"ways of dealing with outliers.\n",
|
||
"\n",
|
||
"The Huber cost function is defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"H_{\\delta}(\\boldsymbol{a})=\\left\\{\\begin{array}{cc}\\frac{1}{2} \\boldsymbol{a}^{2}& \\text{for }|\\boldsymbol{a}|\\leq \\delta\\\\ \\delta (|\\boldsymbol{a}|-\\frac{1}{2}\\delta ),&\\text{otherwise}.\\end{array}\\right.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Here $\\boldsymbol{a}=\\boldsymbol{y} - \\boldsymbol{\\tilde{y}}$.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"We will discuss in more\n",
|
||
"detail these and other functions in the various lectures. We conclude this part with another example. Instead of \n",
|
||
"a linear $x$-dependence we study now a cubic polynomial and use the polynomial regression analysis tools of scikit-learn."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_27_0.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.0050000000000000044\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import numpy as np\n",
|
||
"import random\n",
|
||
"from sklearn.linear_model import Ridge\n",
|
||
"from sklearn.preprocessing import PolynomialFeatures\n",
|
||
"from sklearn.pipeline import make_pipeline\n",
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"\n",
|
||
"x=np.linspace(0.02,0.98,200)\n",
|
||
"noise = np.asarray(random.sample((range(200)),200))\n",
|
||
"y=x**3*noise\n",
|
||
"yn=x**3*100\n",
|
||
"poly3 = PolynomialFeatures(degree=3)\n",
|
||
"X = poly3.fit_transform(x[:,np.newaxis])\n",
|
||
"clf3 = LinearRegression()\n",
|
||
"clf3.fit(X,y)\n",
|
||
"\n",
|
||
"Xplot=poly3.fit_transform(x[:,np.newaxis])\n",
|
||
"poly3_plot=plt.plot(x, clf3.predict(Xplot), label='Cubic Fit')\n",
|
||
"plt.plot(x,yn, color='red', label=\"True Cubic\")\n",
|
||
"plt.scatter(x, y, label='Data', color='orange', s=15)\n",
|
||
"plt.legend()\n",
|
||
"plt.show()\n",
|
||
"\n",
|
||
"def error(a):\n",
|
||
" for i in y:\n",
|
||
" err=(y-yn)/yn\n",
|
||
" return abs(np.sum(err))/len(err)\n",
|
||
"\n",
|
||
"print (error(y))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let us now dive into nuclear physics and remind ourselves briefly about some basic features about binding\n",
|
||
"energies. A basic quantity which can be measured for the ground\n",
|
||
"states of nuclei is the atomic mass $M(N, Z)$ of the neutral atom with\n",
|
||
"atomic mass number $A$ and charge $Z$. The number of neutrons is $N$. There are indeed several sophisticated experiments worldwide which allow us to measure this quantity to high precision (parts per million even). \n",
|
||
"\n",
|
||
"Atomic masses are usually tabulated in terms of the mass excess defined by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\Delta M(N, Z) = M(N, Z) - uA,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $u$ is the Atomic Mass Unit"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"u = M(^{12}\\mathrm{C})/12 = 931.4940954(57) \\hspace{0.1cm} \\mathrm{MeV}/c^2.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The nucleon masses are"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"m_p = 1.00727646693(9)u,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"m_n = 939.56536(8)\\hspace{0.1cm} \\mathrm{MeV}/c^2 = 1.0086649156(6)u.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In the [2016 mass evaluation of by W.J.Huang, G.Audi, M.Wang, F.G.Kondev, S.Naimi and X.Xu](http://nuclearmasses.org/resources_folder/Wang_2017_Chinese_Phys_C_41_030003.pdf)\n",
|
||
"there are data on masses and decays of 3437 nuclei.\n",
|
||
"\n",
|
||
"The nuclear binding energy is defined as the energy required to break\n",
|
||
"up a given nucleus into its constituent parts of $N$ neutrons and $Z$\n",
|
||
"protons. In terms of the atomic masses $M(N, Z)$ the binding energy is\n",
|
||
"defined by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(N, Z) = ZM_H c^2 + Nm_n c^2 - M(N, Z)c^2 ,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $M_H$ is the mass of the hydrogen atom and $m_n$ is the mass of the neutron.\n",
|
||
"In terms of the mass excess the binding energy is given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(N, Z) = Z\\Delta_H c^2 + N\\Delta_n c^2 -\\Delta(N, Z)c^2 ,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\Delta_H c^2 = 7.2890$ MeV and $\\Delta_n c^2 = 8.0713$ MeV.\n",
|
||
"\n",
|
||
"\n",
|
||
"A popular and physically intuitive model which can be used to parametrize \n",
|
||
"the experimental binding energies as function of $A$, is the so-called \n",
|
||
"**liquid drop model**. The ansatz is based on the following expression"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(N,Z) = a_1A-a_2A^{2/3}-a_3\\frac{Z^2}{A^{1/3}}-a_4\\frac{(N-Z)^2}{A},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $A$ stands for the number of nucleons and the $a_i$s are parameters which are determined by a fit \n",
|
||
"to the experimental data. \n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"To arrive at the above expression we have assumed that we can make the following assumptions:\n",
|
||
"\n",
|
||
" * There is a volume term $a_1A$ proportional with the number of nucleons (the energy is also an extensive quantity). When an assembly of nucleons of the same size is packed together into the smallest volume, each interior nucleon has a certain number of other nucleons in contact with it. This contribution is proportional to the volume.\n",
|
||
"\n",
|
||
" * There is a surface energy term $a_2A^{2/3}$. The assumption here is that a nucleon at the surface of a nucleus interacts with fewer other nucleons than one in the interior of the nucleus and hence its binding energy is less. This surface energy term takes that into account and is therefore negative and is proportional to the surface area.\n",
|
||
"\n",
|
||
" * There is a Coulomb energy term $a_3\\frac{Z^2}{A^{1/3}}$. The electric repulsion between each pair of protons in a nucleus yields less binding. \n",
|
||
"\n",
|
||
" * There is an asymmetry term $a_4\\frac{(N-Z)^2}{A}$. This term is associated with the Pauli exclusion principle and reflects the fact that the proton-neutron interaction is more attractive on the average than the neutron-neutron and proton-proton interactions.\n",
|
||
"\n",
|
||
"We could also add a so-called pairing term, which is a correction term that\n",
|
||
"arises from the tendency of proton pairs and neutron pairs to\n",
|
||
"occur. An even number of particles is more stable than an odd number. \n",
|
||
"\n",
|
||
"\n",
|
||
"### Organizing our data\n",
|
||
"\n",
|
||
"Let us start with reading and organizing our data. \n",
|
||
"We start with the compilation of masses and binding energies from 2016.\n",
|
||
"After having downloaded this file to our own computer, we are now ready to read the file and start structuring our data.\n",
|
||
"\n",
|
||
"\n",
|
||
"We start with preparing folders for storing our calculations and the data file over masses and binding energies. We import also various modules that we will find useful in order to present various Machine Learning methods. Here we focus mainly on the functionality of **scikit-learn**."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Common imports\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import sklearn.linear_model as skl\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error\n",
|
||
"import os\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(\"MassEval2016.dat\"),'r')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Before we proceed, we define also a function for making our plots. You can obviously avoid this and simply set up various **matplotlib** commands every time you need them. You may however find it convenient to collect all such commands in one function and simply call this function."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from pylab import plt, mpl\n",
|
||
"plt.style.use('seaborn')\n",
|
||
"mpl.rcParams['font.family'] = 'serif'\n",
|
||
"\n",
|
||
"def MakePlot(x,y, styles, labels, axlabels):\n",
|
||
" plt.figure(figsize=(10,6))\n",
|
||
" for i in range(len(x)):\n",
|
||
" plt.plot(x[i], y[i], styles[i], label = labels[i])\n",
|
||
" plt.xlabel(axlabels[0])\n",
|
||
" plt.ylabel(axlabels[1])\n",
|
||
" plt.legend(loc=0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Our next step is to read the data on experimental binding energies and\n",
|
||
"reorganize them as functions of the mass number $A$, the number of\n",
|
||
"protons $Z$ and neutrons $N$ using **pandas**. Before we do this it is\n",
|
||
"always useful (unless you have a binary file or other types of compressed\n",
|
||
"data) to actually open the file and simply take a look at it!\n",
|
||
"\n",
|
||
"\n",
|
||
"In particular, the program that outputs the final nuclear masses is written in Fortran with a specific format. It means that we need to figure out the format and which columns contain the data we are interested in. Pandas comes with a function that reads formatted output. After having admired the file, we are now ready to start massaging it with **pandas**. The file begins with some basic format information."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"' \\nThis is taken from the data file of the mass 2016 evaluation. \\nAll files are 3436 lines long with 124 character per line. \\n Headers are 39 lines long. \\n col 1 : Fortran character control: 1 = page feed 0 = line feed \\n format : a1,i3,i5,i5,i5,1x,a3,a4,1x,f13.5,f11.5,f11.3,f9.3,1x,a2,f11.3,f9.3,1x,i3,1x,f12.5,f11.5 \\n These formats are reflected in the pandas widths variable below, see the statement \\n widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1), \\n Pandas has also a variable header, with length 39 in this case. \\n'"
|
||
]
|
||
},
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"\"\"\" \n",
|
||
"This is taken from the data file of the mass 2016 evaluation. \n",
|
||
"All files are 3436 lines long with 124 character per line. \n",
|
||
" Headers are 39 lines long. \n",
|
||
" col 1 : Fortran character control: 1 = page feed 0 = line feed \n",
|
||
" format : a1,i3,i5,i5,i5,1x,a3,a4,1x,f13.5,f11.5,f11.3,f9.3,1x,a2,f11.3,f9.3,1x,i3,1x,f12.5,f11.5 \n",
|
||
" These formats are reflected in the pandas widths variable below, see the statement \n",
|
||
" widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1), \n",
|
||
" Pandas has also a variable header, with length 39 in this case. \n",
|
||
"\"\"\""
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The data we are interested in are in columns 2, 3, 4 and 11, giving us\n",
|
||
"the number of neutrons, protons, mass numbers and binding energies,\n",
|
||
"respectively. We add also for the sake of completeness the element name. The data are in fixed-width formatted lines and we will\n",
|
||
"covert them into the **pandas** DataFrame structure."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Read the experimental data with Pandas\n",
|
||
"Masses = pd.read_fwf(infile, usecols=(2,3,4,6,11),\n",
|
||
" names=('N', 'Z', 'A', 'Element', 'Ebinding'),\n",
|
||
" widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1),\n",
|
||
" header=39,\n",
|
||
" index_col=False)\n",
|
||
"\n",
|
||
"# Extrapolated values are indicated by '#' in place of the decimal place, so\n",
|
||
"# the Ebinding column won't be numeric. Coerce to float and drop these entries.\n",
|
||
"Masses['Ebinding'] = pd.to_numeric(Masses['Ebinding'], errors='coerce')\n",
|
||
"Masses = Masses.dropna()\n",
|
||
"# Convert from keV to MeV.\n",
|
||
"Masses['Ebinding'] /= 1000\n",
|
||
"\n",
|
||
"# Group the DataFrame by nucleon number, A.\n",
|
||
"Masses = Masses.groupby('A')\n",
|
||
"# Find the rows of the grouped DataFrame with the maximum binding energy.\n",
|
||
"Masses = Masses.apply(lambda t: t[t.Ebinding==t.Ebinding.max()])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We have now read in the data, grouped them according to the variables we are interested in. \n",
|
||
"We see how easy it is to reorganize the data using **pandas**. If we\n",
|
||
"were to do these operations in C/C++ or Fortran, we would have had to\n",
|
||
"write various functions/subroutines which perform the above\n",
|
||
"reorganizations for us. Having reorganized the data, we can now start\n",
|
||
"to make some simple fits using both the functionalities in **numpy** and\n",
|
||
"**Scikit-Learn** afterwards. \n",
|
||
"\n",
|
||
"Now we define five variables which contain\n",
|
||
"the number of nucleons $A$, the number of protons $Z$ and the number of neutrons $N$, the element name and finally the energies themselves."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" N Z A Element Ebinding\n",
|
||
"A \n",
|
||
"4 0 1 3 4 Li 1.153760\n",
|
||
"5 2 3 2 5 He 5.512132\n",
|
||
"6 7 3 3 6 Li 5.332331\n",
|
||
"7 12 4 3 7 Li 5.606439\n",
|
||
"8 17 4 4 8 Be 7.062435\n",
|
||
"... ... ... ... ... ...\n",
|
||
"264 3297 156 108 264 Hs 7.298375\n",
|
||
"265 3303 157 108 265 Hs 7.296247\n",
|
||
"266 3310 158 108 266 Hs 7.298273\n",
|
||
"269 3331 159 110 269 Ds 7.250154\n",
|
||
"270 3337 160 110 270 Ds 7.253775\n",
|
||
"\n",
|
||
"[264 rows x 5 columns]\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"A = Masses['A']\n",
|
||
"Z = Masses['Z']\n",
|
||
"N = Masses['N']\n",
|
||
"Element = Masses['Element']\n",
|
||
"Energies = Masses['Ebinding']\n",
|
||
"print(Masses)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The next step, and we will define this mathematically later, is to set up the so-called **design matrix**. We will throughout call this matrix $\\boldsymbol{X}$.\n",
|
||
"It has dimensionality $n\\times p$, where $n$ is the number of data points and $p$ are the so-called predictors. In our case here they are given by the number of polynomials in $A$ we wish to include in the fit."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Now we set up the design matrix X\n",
|
||
"X = np.zeros((len(A),5))\n",
|
||
"X[:,0] = 1\n",
|
||
"X[:,1] = A\n",
|
||
"X[:,2] = A**(2.0/3.0)\n",
|
||
"X[:,3] = A**(-1.0/3.0)\n",
|
||
"X[:,4] = A**(-1.0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Note well that we have made life simple here. We perform a fit in\n",
|
||
"terms of the number of nucleons only. A more sophisticated fit can be\n",
|
||
"done by including an explicit dependence on the number of protons and\n",
|
||
"neutrons in the asymmetry and Coulomb terms. We leave this as an exercise to you the reader.\n",
|
||
"\n",
|
||
"With **Scikit-Learn** we are now ready to use linear regression and fit our data."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"clf = skl.LinearRegression().fit(X, Energies)\n",
|
||
"fity = clf.predict(X)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Pretty simple! \n",
|
||
"Now we can print measures of how our fit is doing, the coefficients from the fits and plot the final fit together with our data."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Mean squared error: 0.02\n",
|
||
"Variance score: 0.95\n",
|
||
"Mean absolute error: 0.05\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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qqr47Gc/W6rTf8DeMWwfPo1hi4jIOFeywN69ezdvvfUW3//+90kkEtx8880EAgEuv/zyA35NdXUUv//IwrS+PnHQ11MFQyjnw2/7qD+2gnB9+IjOM1Ecqr5kX6qv4VOdDY/qa3jKob5KFtixWIxZs2aRSBQr9ZRTTuG11147aGB3daWO6Fz19Qna2voO+p629iRWv4uLj+5CBrstf0TnmggOp75kL9XX8KnOhkf1NTwTqb4O9odHyWaJf+hDH6K7uxvHcYBii3vmzJmlOv0HFHIudhYsH/hiZTtZXkREPKJkLeyqqipuvvlmbr31Vqqrq+ns7OS6664r1ek/oNBbAMBELSzLGrNyiIiIHI6STtNetmwZy5YtK+UpD8jpKbb0TVytaxERGf/KNq3cZLGFjQJbREQ8oGzTyul1AbAU2CIi4gFlm1buQJe4WtgiIuIFZZtWJlkMbCuuRVNERGT8K9vAdvuKXeK+RNlWgYiIeEj5plX/QGCrhS0iIh5wyMD+05/+VIpylJybHghsLZoiIiIecMjrsP/u7/4O27a5/PLLueyyy2hoaChFuUZfxgDgi6qFLSIi498hm5fPPPMM//t//2+2bNnCxRdfzFe/+lWefPJJCoVCKco3elLFFratFraIiHjAYaXVhz/8YW6//XZeeOEFli1bxn333ce5557LP/3TP412+UZNob84SzxeHRzjkoiIiBzasJqXsViMv/zLv+RrX/saU6ZM4cEHHxytco0qY8xQYFeX+baaIiLiDYe9lviWLVv49a9/zeOPP86kSZO4/PLL+cQnPjGaZRtxm3f38OdNHZx3whTcvAE/JCpDY10sERGRQzpkYD/44IM8/PDDbN++nUsuuYR//dd/Zf78+aUo24h74o/bAHh8d5qZgB23tVOXiIh4wiED+5lnnuFLX/oSF1xwAdlslqamplKUa1RlevMABOMl3axMRETkiB1yDPtf//Vfueiii3j55Zf5+Mc/zg033ADA22+/zTXXXDPqBRxJFbHiBDM7V3wcrFBgi4iINxz2pLO77rqLhx56iIqKCgAWLlzI9u3bR61go6EqXhyvtrPFx+GKwBiWRkRE5PANa5Z4fX39Po+DQW9dEmUGbgcDO1qlwBYREW847MCOxWK0t7cPTdJauXIliURi1Ao2GowpRradK95GdQ22iIh4xGEP4t58881cffXV7Ny5kyuvvJJt27bx4x//eDTLNuIG8ho7CwG/D39My5KKiIg3HHZgL1q0iH//93/nzTffBOCkk04aGs/2CjPQKT6jKkZ9lauNP0RExDOGNU06kUhw3nnnjVZZRt1gC3tKLIodzGjjDxER8YxDBvYDDzxw0NevuOKKESvMaBscw2Zwa82IWtgiIuINhwzs73znO5x44onMnTu3FOUZVYN5TXpga011iYuIiEccMrBvvfVWHnnkETZu3MinPvUpLrnkEiorK0tRthG3N7CLLWwrqsAWERFvOGRgX3755Vx++eXs2LGDRx99lM997nPMnTuXa6+91nNrig92iZvBFra6xEVExCMOO7GmT5/OVVddxRe/+EVee+013n777dEs16h4fwvbp8u6RETEIw7ZwjbG8OKLL/Lwww+zceNGPvaxj/HLX/6S6dOnl6J8I8plsIXtAj61sEVExDMOGdjnnnvu0P7X1113HZZlkc1m2bRpEwDHHXfcYZ/ss5/9LKFQcT1vn8/Hz3/+8yMs9hEygGsga7CCYEW0taaIiHjDIQM7EAjQ1dXFvffey89+9rO9l0YBlmXx7LPPHvbJzjnnnKHdvsaCMWZopy4r6tNe2CIi4hmHDOzf//73I3ayDRs2sGLFCrLZLAsXLmTp0qUjduzD4ZqBjT8sS93hIiLiKYcM7H/+539m2bJlnHTSSUd9squvvppFixbhOA5XXHEFsViMU0899YDvr66O4vcf2cSw+voPbkwSCvkxlk0waBOrCe/3PeVKdTE8qq/hU50Nj+preMqhvg4Z2PPnz+ff/u3fuOWWWzjttNO44IILOOuss4bGoodj0aJFANi2zZIlS1i5cuVBA7urKzXsc0DxP66tre8Dz6fTeZyUQz7nkHEK+31POTpQfcn+qb6GT3U2PKqv4ZlI9XWwPzwO2S986aWXctddd/Gb3/yGj3zkIzz33HN8/OMf57rrruPhhx+ms7PzsAqxefNmfvWrXw09bmpqKvlMc4PBlwcssMIavxYREe847M0/gsEg5513Hueddx7GGFavXs0zzzzDz372M5544olDfn08Huf555+ntbWVZDLJ5MmT+cQnPnFUhR8uY8AugAX4QhrDFhER7xjWbl2DLMti8eLFLF68mJtvvvmwvqahoYEf/vCHR3K6EWOMwVco3reCamGLiIh3lFUz0xjw5Q1gYamF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ySefzHPPPTe2hRqHNmzYwIoVK1i+fPlQ/Tz//POcdNJJQLHenn/++TEs4di76KKLiMVi+zz33HPPDdXRvHnzWLduHclkkhdffJETTzwRy7IAOOmkk3jhhRdKXuaxtL/6AnjggQe49957+eEPf0h3dzeA6gtYtGgRF1544dBj13WJRCIH/Dn8wx/+wOLFiwHw+/3MmjVrn5blRHeg+gL48Y9/zL333suKFStIp9PAxK6vCdMl3tHRsc8vjXg8TkdHxxiWaHy6+uqrWbRoEY7jcMUVVxCLxfapu3g8Tk9PD4VCAb9/wnx7HLUDfX91dnbu8/xgfZa7U089laVLl1JTU8Pzzz/PN77xDX7+85+rvt7n6aef5uyzz2b27NkH/Dns7Oxk1qxZQ18Tj8fp7OwcqyKPqffW10UXXcS0adOIRqM88MADfOc73+HWW2+d0PU1YVrYtbW19Pf3Dz1OJpPU1taOYYnGp0WLFgFg2zZLlixh5cqV+9RdMpmksrJSYf0+B/r+qqmp2ef5/v5+fd8B06dPp6amBoAPf/jDvP766ziOo/p6j1dffZWVK1fyzW9+E+CAP4fvr7NkMjlUt+Xk/fU1Z84cotEoUPwee/XVVwEmdH1NmMBevHgxu3fvJpfLAfDmm2+ydOnSsS3UOLN582Z+9atfDT1uampi+vTpnHfeeaxatQoo1tt55503VkUct5YuXTpUR+vXr2f+/PnE43HOOecc3n33XczAkvyrVq3i3HPPHcuijgt33HEHhUIBgG3btjFt2jRs21Z9DXjuued46aWX+Na3vkVbWxurVq064M/h0qVLeeuttwDI5/Ns2bKFU089dayKPib2V1+333770OtNTU3MmDEDmNj1NaE2//jjH//Ik08+SXV1NYFAQLPE36elpYXvfOc7HH/88SSTSQqFAn//939Pb28v3/ve95g6dSo7duzgb//2b8t6lvhrr73Go48+yosvvsjnP/95vvzlLwNw++23U19fz/bt2/na1762zyzxd955B9u2mTlzZtnNet5ffT344INs3LiRxsZGNmzYwBe/+MWhccVyr6933nmHK6+8kgULFgCQSqW44oorOP/88w/4c3jPPffQ29tLT08P55577sSZ9XwYDlRfW7duJZ1OU1tby4YNG/j6178+9DM5UetrQgW2iIjIRDVhusRFREQmMgW2iIiIByiwRUREPECBLSIi4gEKbBEREQ9QYIuIiHiAAltERMQDFNgiHvX6668zb948HnnkkaM+1p/+9CfmzZvHj370o6HnVq1axcc+9rGjOu73v/99PvnJT+7zb/78+fzd3/3d0RZZpOwosEU8yHVdvvvd7/LhD3+YtWvXHvXx3n33XRYtWsTTTz+9z3MnnHDCAb/m/PPPP+Rxb7rpJh577LGhf2eccQazZ8/mlltuOeoyi5QbBbaIB/3yl79kxowZfOELX2DdunVHfbw1a9Zw6aWXkk6n2bFjB1AM7BNPPPGojz3ojjvu4LnnnuO+++6bMJsxiJSStmQS8Zje3l5+8pOf8MADD5DP51m/fv1+3/f1r3+dpqam/b724IMPEg6Hhx6vWbOGz3zmMyxbtoynn36aL3/5y6xZs4ZPfvKTI1LmH/zgBzz55JPcf//91NfXj8gxRcqNAlvEY5YvX85ll13GtGnTcF2XXC7Hnj17mDJlyj7vu+uuuw7reNlslq1bt3L88ccTDAa59dZb+au/+is2b978gS7xa665hj179gDQ2to6FOi2bfPwww/v9/g/+tGPePzxx/nFL35BQ0PDcD+uiAxQYIt4yObNm/nlL39JVVUVjz/+OFDcQnDt2rUfCOzDbWGvW7eOxsZGYrEYCxcupKWlhZdeeonJkydTUVGxz9f95Cc/Gbp//vnn89hjjx20vCtWrOChhx7i/vvv/0D5RGR4FNgiHnLrrbfy7W9/m09/+tNDz33rW99i3bp1H5gEdrgt7PeOVVuWxfnnn89dd9110Alnh+NnP/sZv/jFL/jFL35BY2PjUR1LRBTYIp7x7LPP0trayqc+9al9np8zZw5vvvnmER93zZo1+4TzsmXL+MUvfnFUl3Rt3bqV22+/nUmTJnHDDTfs89p1113HRz7ykSM+tki50n7YIiIiHqDLukRERDxAgS0iIuIBCmwREREPUGCLiIh4gAJbRETEAxTYIiIiHqDAFhER8QAFtoiIiAf8/4DBbA/qVQNEAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<Figure size 576x396 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_57_1.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# The mean squared error \n",
|
||
"print(\"Mean squared error: %.2f\" % mean_squared_error(Energies, fity))\n",
|
||
"# Explained variance score: 1 is perfect prediction \n",
|
||
"print('Variance score: %.2f' % r2_score(Energies, fity))\n",
|
||
"# Mean absolute error \n",
|
||
"print('Mean absolute error: %.2f' % mean_absolute_error(Energies, fity))\n",
|
||
"\n",
|
||
"Masses['Eapprox'] = fity\n",
|
||
"# Generate a plot comparing the experimental with the fitted values values.\n",
|
||
"fig, ax = plt.subplots()\n",
|
||
"ax.set_xlabel(r'$A = N + Z$')\n",
|
||
"ax.set_ylabel(r'$E_\\mathrm{bind}\\,/\\mathrm{MeV}$')\n",
|
||
"ax.plot(Masses['A'], Masses['Ebinding'], alpha=0.7, lw=2,\n",
|
||
" label='Ame2016')\n",
|
||
"ax.plot(Masses['A'], Masses['Eapprox'], alpha=0.7, lw=2, c='m',\n",
|
||
" label='Fit')\n",
|
||
"ax.legend()\n",
|
||
"save_fig(\"Masses2016\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"As a teaser, let us now see how we can do this with decision trees using **Scikit-Learn**. Later we will switch to so-called **random forests**!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAesAAAFpCAYAAAC8iwByAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABMiElEQVR4nO3dd3hUVf7H8feU9N5IQu+IdEFUUAmKChYEewF11XXVVde21l3Lzwauuq7gqqy6upa1LAJixQKiIsWGhN4JPT2Z1Cnn98eQgUBCCCQzmczn9Tw8ZGZu+d5Dwifn3nPvsRhjDCIiItJiWQNdgIiIiBycwlpERKSFU1iLiIi0cAprERGRFk5hLSIi0sIprEVERFo4e6ALEGlO33//PU8++SSrVq3i2GOPxRhDZWUlo0eP5qqrriIsLOyItv/jjz/yz3/+k1dfffWgy82ePZuFCxfy2GOPHdH+9jd69GjS0tIA2LBhA8YYunXrBkBubi6fffZZk+5vfzNnzuTFF19k69atDBo0CJfLRV5eHiNGjOC+++7Dag2O/sA555zD1KlT6dSpU6BLEamTRfdZS2u3aNEirrjiCpYvX47dbqewsJA777wTm83Giy++eESBYozB4XAQFxd30OXcbjeVlZXExMQc9r7qMnHiRN544w0A7rnnHlwuF0899dQBnzWnDz74gGeffZb58+cDkJOTw5lnnsnDDz/Meeed1+z7bwolJSXEx8cHugyRegXHr70iTSgpKYlJkyaxaNEiPvzwwyPalsViaTCoAWw2W5MHNcDtt99+WJ81pw4dOtCjRw+ys7MDsv/DoaCWlk6nwSUkpaWlceKJJ/LZZ58xbtw4wHtK9+233yY8PJz09HQefvhhYmNjAe/p9ClTphAWFobH42HChAkcd9xxXH/99SxdupTVq1cD8O677zJ9+nSioqKIjIzkrrvuwuVycdddd1FaWsrXX38NQF5eHg8//DAFBQU4nU4uvfRSxo8fz/bt27n11ltZunQpkyZNYtasWezYsYMnnniCY4455oDjGDRoUL3HOGjQIN59911eeuklBgwYQExMDMuWLSM+Pp433niDb7/9lqlTpxIWFkZsbCwPP/ww6enpAGRnZ/PEE09gsViw2Ww88MADvtPrh8LtdpORkeF7fbDtLVu2jAcffJDw8HB69erFmjVrKCws5M9//jPffvstH330ERMmTGDdunVkZ2dz/vnnc/PNN/Pyyy8zZ84c7HY7vXv35u677yY8PJz169fz8MMPA+Byubjgggs477zzyMvL45577qGqqgqXy8XIkSO57rrrmDRpEv/73/+47777fGcCar4XwsLCSEpK4qGHHiI1NZWpU6fy3//+lzPOOIPS0lJWrlxJnz59mDx58iG3jchhMSKt3MKFC03Pnj2N0+ms9f5jjz1mxowZY4wx5scffzRDhw41+fn5xhhjJk2aZO677z5jjDFbtmwxgwYNMhs3bjTGGLN06VIzYcIEY4wxOTk5pmfPnsYYYxwOhxk6dKipqqoyxhjz2muvmenTp/tqGDlypG/fV155pXnuueeMMcbk5+eb4cOHmyVLltTa5scff2yMMWbatGnm6quvbvA47777bnPHHXcc8P5zzz1nhg0bZvLz843b7TZPPvmk2bJlixk4cKBZv369McaYN99801x55ZXGGGNKSkrMcccdZxYsWGCMMWbu3Lnm9NNPN263u879Tp8+3Zx00km+1ytWrDA333yzKS0tbXB7VVVV5uSTTzazZ8/2rdu7d29fuxljzIQJE8zvfvc743K5zPr16817771nZs2aZUaPHm3Ky8uNx+Mxt9xyi3n++eeNMcbccsstvrbbvXu3ueaaa4wxxkyePNm89NJLxhhjysrKzCWXXFJrHzX7XLJkiTn++ON93wvPP/+8ueKKK2q187nnnmuqqqpMZWWlGTp0qPn5558b+NcROTI6DS4hy+Px+L6eMWMGp5xyCsnJyYB3wNHs2bMxxvDRRx/Rt29fOnfuDED//v259dZbD9iezWYDvL2yiooKLr/8cs4+++wDltu1axc//PAD559/PgDJyclkZWUxffr0WsudfPLJAPTq1YutW7ce0bEOHDiQ5ORkrFYrf/7zn33H1LVrVwDOPvtsfvjhB3bv3s3cuXOJjo7mhBNOACArK4u8vDyWLl1a7/YLCgqYOHEiY8eO9R13zVmJg23v119/JT8/nzFjxgDQu3fvOnvwI0aMwGaz0bVrVy688EJmzJjBWWedRVRUFBaLhbPPPptZs2YBkJCQwGeffcbWrVtJS0tjypQpACQmJvLtt9+ydu1aoqOj6x0UOHPmTLKysnzfC+effz4LFy5k+/btvmWOO+44wsPDiYiIoFOnTkf87yPSEJ0Gl5C1bds2Onbs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63K5sTfhRBs/zliM47xyCmLyOM9xQZNtV0REpLk12LN+6623uPzyywHo1q0b3bp18332/vvvc+GFFx7yzvr37w+AzWZjyJAhLFq0qN6wLiwsP+Tt7istLY7c3NID3i/KL8OOBWPx1Pl5KKuvzaRuaq/GUXs1ntqscVpTe6Wl1T0WrMGwfv311/n555/r/Gz58uWHHNbr16/n559/9i2/efNmRo0adUjrNgV3tRM74RhdsxYRkSDTYFgnJSXx22+/cfbZZ2Oz1T4tvWXLlkPeUWxsLN988w27d+/G4XCQkZHBOeec0/iKD5PH5b1WrfusRUQk2DQY1u+++y7ff/89H374IUOHDmXcuHG+0O7bt+8h7yg9PZ2pU6cefqVHyFXtBCI1wExERILOIT0UZfjw4UyePJm2bdty//338/777+Nyufw6mvtIedwaDS4iIsHpkJ9gBt4R4HfccQczZ87kmmuuaa6amoW7uiasdc1aRESCyyGH9e7du3n00Uc5/fTTycjI4IEHHmjOupqcrlmLiEiwavCa9a5du5g2bRoffPABp512GtOnT/fdX71p0yY6d+7c3DU2Cd9DUVDPWkREgkuDYT1q1CgyMzO599576dy5M/n5+eTn52OM4Y033mDKlCn+qPOIeZx7ng2u+axFRCTINBjWgwYNYvz48QBs27at1mcOh6N5qmoGZs9pcIPCWkREgkuDYX3DDTdwwgkn1PlZly5dmryg5qJng4uISLBqcIBZfUENMHDgwKaspVkZd80AM12zFhGR4NJgWH///fcNbqRmco+WzF1zGlxhLSIiQabBsP7iiy8a3MjcuXObpJjmVNOz1mlwEREJNg1es37nnXd49913ATDGYLFYfJ/VvB4wYEDzVdhEPHuuWaNbt0REJMgc0q1bNc/0rqqqIiIiotmLag57r1mrZy0iIsGlwdPg+96udemll9b67LXXXmvygppLTVija9YiIhJkGgxrY/aGm8dTu1c6a9aspq+omRiPrlmLiEhwajCs971Gve/XUDvIWzqP21urHjcqIiLBpsFr1ps3b+a+++6jX79+VFRU4HQ6CQsLAw4M75Zs72hwhbWIiASXBsN62rRprFixgqVLlxIWFsbgwYNp27YtPXv2ZNeuXf6osUkorEVEJFg1GNZDhgxhyJAhvtfV1dWsWrWK5cuXk5CQ0KzFNSnPntPgumYtIiJBpsGw3l94eDj9+/enf//+zVFPs/F41KMWEZHg1OAAs1ZDo8FFRCRIhUxYmz2jwXWftYiIBJvQCWuPbt0SEZHgFHphHTx3m4mIiAAhFNY1o8F1GlxERIJN6IT1nozWfdYiIhJsQias954GV1iLiEhwCZmw9p0G1wAzEREJMiEU1t6/1LMWEZFg49ewrqys5JxzzmHy5Mn+3K1XzQxhGg0uIiJBxq9h/eyzz3L00Uf7c5c+RmEtIiJBym9hPXPmTI455hjat2/vr13WVvOUUZ0GFxGRINPoiTwOx7p169iwYQO33347q1evPqR1kpKisdtth7W/tLS4A96z1sy9ba3781CnNmkctVfjqL0aT23WOK29vfwS1l988QXh4eFMmzaNn376CafTyWuvvcZVV11V7zqFheWHta+0tDhyc0sPeN/j2vu40bo+D2X1tZnUTe3VOGqvxlObNU5raq/6funwS1jfcMMNvq+rqqooLy8/aFA3K12zFhGRIOPXAWaff/45S5Ys4ddff+Wjjz7y5673uXXLv7sVERE5Un7pWdc444wzOOOMM/y5y718A8wCs3sREZHDFToPRamhsBYRkSATMmHtu2NLYS0iIkEmZMLa1JwGD5kjFhGR1iJkostSM7JMPWsREQkyIRPWPgprEREJMqET1mbvE8xERESCSchE194BZupai4hIcAmZsKZm0q3QOWIREWklQia69g4wU89aRESCS8iEdU3POoSOWEREWonQia49PWuLVT1rEREJLiET1joNLiIiwSp0whr1rEVEJDiFTFjrPmsREQlWIRNdFt8165A5ZBERaSVCJrl816xtOg0uIiLBJWTCuuah4BYNMBMRkSATMmHtOw2unrWIiASZ0AtrXbMWEZEgEzLJpZ61iIgEq5AJa981a/WsRUQkyIRMclmM91DVsxYRkWATQmFdcxo8ZA5ZRERaiZBJLl2zFhGRYBU6Yb3nUK02W4ArERERaZzQCes9PWurToOLiEiQCZnk8oW1PWQOWUREWgm7v3bk8Xi4/vrr6d+/P06nk5ycHB5//HEiIyP9sv+a0eDo1i0REQkyfk2ugQMHctNNN3HbbbdRUVHBnDlz/LbvmvmsbXZdsxYRkeDit7C2Wq3ceOONALhcLnbt2kWXLl38tfu991nrNLiIiAQZv50Gr/Htt9/y2muvkZWVRb9+/fy235pr1upZi4hIsLEYY0wgdnzXXXcxYMAALr/88jo/d7nc2JswWN9IfYUO+d0ofjCXcx+6sMm2KyIi0tz81rNet24dW7duJSsrC4D27duzdevWepcvLCw/rP2kpcWRm1t6wPvWPafBq5yeOj8PZfW1mdRN7dU4aq/GU5s1Tmtqr7S0uDrf91tYh4eH87///Y8VK1bgcrlYv349f/nLX/y1e981a926JSIiwcZvYd2xY0emTp3qr90doCas7eF+v0wvIiJyREKmm+m7dStMA8xERCS4hExY11yzRo8bFRGRIBMyyVVz65Y9IizAlYiIiDROCIW19/S37rMWEZFgE0JhXdOz1gAzEREJLiET1lbfrVvqWYuISHAJmbD2PW40IjzAlYiIiDROyIS1dc81a3tYyByyiIi0EiGTXLpmLSIiwSpkwrrmmrUtXNesRUQkuIRMWPseN6pr1iIiEmRCJqytnj1hHabT4CIiElxCJ6xretZReoKZiIgEl5DpZvrCOkxhLSLSnFasyOaf/3wOl8vFscceR1VVFQATJ/6OuLi652sGeO+9t7noosv8VWZQCZmedc1o8PBoXbMWEWlORx/dl0GDBtO3b3+uueYP3HjjLQwaNJg//el6XC5Xveu9995//VhlcAmJnrXb5cZWc5+1bt0SkRBy2WVRfPll0/6/N2qUi7ffrmjUOiecMJx///tfLFr0AzNn/o8BAwaxZctmTjttNMceexxfffUFDkcpr7zyEp06dWbYsJN48MF7D1guVIVEcnncHu/feDSRh4hIgGRkZLJ9+zYuuugyjj32OEpKirn99ps59tjjOPXU03jhhee45po/AFBZWVnncqEqJMK6urwaAGMxAa5ERMS/GtsDbk47d+5g9Oiz+OWXn1i+fBk2m52iosI6lzXGHNJyoSIkrlm7qp0AuK3uAFciIhKaFi9eSHV1NVu35pCXl8tVV13LJZdcXmsZq9WKMYa1a9cwe/bMepcLRSHRs3ZVqGctIuIvq1atYOnSX3A6nbz22stUVVXhcrl47rkXKCwsZN68r3j++X8QHx+Pw+Fg3ryvyMo6lWHDTmTq1GcBGDt2fL3LhSKLMaZFJlhubulhrZeWFnfAurvW7iBv+HYqwioYsu3EpiivVamrzaR+aq/GUXs1ntqscVpTe6Wl1X1rW2icBq+q6Vl7AlyJiIhI44VEWLurvdeqPQprEREJQiER1s5K7wAz9axFRCQYhURYu5177rO2KqxFRCT4hERY19y6ZWiRY+lEREQOKiTC2uPUNWsREQleIRHWripdsxYRkeDlt7DesmULt99+Oy+//DKPPvooU6dO9deucVV7Z3lRz1pEpPVZs2YNt9xyPZ98Mvuwt/Hee2/7vp4z51NGjx55WNvZsWM7l112PjfddB033XQdU6b8/bBr2pffnmBWVFTEmWeeyahRowA488wzycrKom/fvs2+b4/LexpcTzATkVATf9kFRHw5p0m3WTXqdEre/l+TbvNI9OzZkwEDBh3RNt5777++ubRPP30M06b987C3NWHCVZx55jlHVM/+/BbW/fv3r/Xa4/EQFRXll3179vSsdRpcRKT5ffzxh7z00vNccsnlrF+/lqKiYs488xwWL/6BrVtzePLJvzNnzmds3Lie5OQUdu7cwZ133svGjet5+unJREVFcf/9D3HXXbcxduw4xo27oM79vPHGa2zatIH+/fuwadNGMjPbArBhw3reeut1unXrzubNm7jiiqux2ez84x9/w+l00rdvf3JyNtO5czcmTryKWbM+8E3P2adPP44/fhgA77zzJqtXr6KszMETTzyNzWZj5szpzJ8/74Ba+vTp65sx7Pvv51NUVIjD4eC000bTpUvXI29UEwBz5swxjzzyyEGXcTpdTbe/f3xi5jLX/DfxP022TRERqd+ECRPMggULjDHG3HDDDea9994zxhjzyCOPmM8++8x89dVXxu12+96bO3euMcaYvLw8c8YZZ5j//Oc/5sMPP6x3+6tXrzZjxozxvb7jjjvM9OnTjTHGXHTRReann34yxhizcOFCc+ONNxpjjJk+fbq54447fOuMGTPGrF692hhjzMiRI2ttf+TIkWbjxo3GGGOuu+46s2zZskM67rKyMrNmzRpjjDG5ublm5MiRpri4+JDWPRi/T+SxcOFCFi1axH333XfQ5QoLyw9r+3U9I7aksIwUovBYPK3m+bFNqTU9V9cf1F6No/ZqvNbQZtXVLmJiksnNLSU8PIr4+FRyc0ux2yPZuTOfNm3Sefjhx0hISGTFitV06NB1zzGHM3HiNbzwwnO8996setvh55+zychoS25uKWlpcaSkpFNaWklubimrVq1izpyvmTfve6qrq7DZwsjNLaW0tJKUlHTfNtPT2/Lzz9kkJWXidtfOB7fbQ3S0t/6oqFi2bcslPb2UGTP+x7x5Xx9QT58+fbnuuhsBSEzM2LOtCBISkli48GcGDRp8SO1W37PB/RrW8+bN48cff+T+++9n9+7dbN++nUGDjuw6w6Ew7ppr1joNLiLSEvzlL3fz2mv/JSMjg/LyMt/71dXVrFixjHPOGcfUqX/nttvuqnP9zp27sHVrju/19u3baNu2HQDdu/dkxIhT6N69B9XV1cyfP7fWcjW2bcuhS5cuAFgs3vHWa9euoUePnnvesxyw3/HjL2D8+LpPywN8+ulH9Ox5FN26dcflcpGbu9t3ev5I+C2ss7Ozue222+jbty9XXHEF5eXlXH755X4Ja7dTA8xERPxlyZKF7Nq1k08+mc2JJ45g/fq1fP75J6SmprF06S9s2LCOUaNO55lnJtO//wCys39jy5ZNdOrUhTff/DcDBx7DMccM4Y9/vA6bzcbNN99+QHB269ad008fw4MP3sfRR/eipKSY77+fz+DBx3LPPX/lnXfepF27DuTn5zFy5Cjfek6nkzfe+Dfr1q3l9NPH0LVrdwB69TqKF1+cSlRUFDk5W3A4HHz00Sx69Ojlq79//4HY7QePzTZt0nn99Vfo0aMnW7fmcO2115ORkXnEbRoSU2R++bdZZP6tPVtS1zFmxcVNUV6r0hpOufmT2qtx1F6NpzZrnENtr08+mc2OHdt9A8FaopCeIrPmCWZ63KiISGjatWsn338/39ezDzZ+H2AWCB6391q1rlmLiASfuXO/pKKiotZ7WVmnEh0dfcjbSE/P4LHH/tbUpflNaIS1HooiIhK09r3mHKpC4zS42xvS6lmLiEgwComwNupZi4hIEAuJsNY1axERCWYhEda+nrVGg4uItDotadatTz6ZzdVXT/DNunXhheceUV01QiOsPbpmLSLSWjXVrFs1Tj99DLGxsYe1nY4dO/H4408xdeo0pk6dRvfuPcjKOvWIaoMQGQ1u9pwGR9esRSTEXPbRBXy5pWmnyBzV8XTePrv+KTJDedatvn33zjC5du1q2rfv0KhbzOoTEmHt8fWsFdYiIs3trLPG+p6RfdllV3DvvXdQUVHGvfc+wLPPPsWSJYtIS2vDueeeh9Vq5dln/8bixQsZNuxEnnjiKf74x98zb95XXHLJBE4/fXSd+9iwYR2ff/4xb775PmlpcSxdeqvvs8mTH+Wmm26lX78B/Pzzj0yd+ixPPPEUJ52UxY8/Luaqq64FYMKECxk+/ETOPfc83njj3wc82Wz48JO55JIJ3HXXraxdu4ajjurNuHHnM27c+YfUDtOnv+fb15EKibA2rj0DzHTNWkRCzMF6wM2tXbv2AMTGxtG2rffruLg4ysvLadMmnX/+8zkSEhLZuHEjPXseBUBSUjJXXfV736xb9dm4caNv+4BvEg+A9evXsnjxQn799Reqq6uIjo6qc7m2bduzceNG3/PB99e+fQcAEhISfZONHMqsWwAFBflUV1c3yXPBIVTC2qPR4CIiLUlrnXWrxowZ/+Pccw+tB34oQiOs3ToNLiLiL6E86xZ4f+FYvXplk04YEhKzbr1z1T/p98lxLO+4iIt+vLGeNUOXZvhpHLVX46i9Gk9t1jiadau10GhwEZGQplm3goDRaHARkaClWbdCLKzRaHARkaCjWbdC5DS4r2dtVViLiEjwCYmwxqOQFhGR4BUaYb0nq3WftYiIBKOQCGvjmyIzwIWIiIgchpAIa9+4Mo0GFxFpdVrSFJnV1dX87W+P8/rrr/DMM5P58svPD7umfYVEWPsGmGk0uIhIq9OSpsicOfN/hIWFc+WV13DLLXfwwgtTyMvLO6LaIERu3fJ1qEPiVxMRkb02X7YWx5clTbrN2FHxdHq7R72fh/IUmTk5Ob5nlNvtdpKSklm27Ncjvv0sJMLaaDS4iIjfhPIUmf37D+Cbb7wTh5SWlpKTs5mysrJ6lz9UIRHWEZne0xmeJIW2iISWg/WAm1soTpE5atQZlJWV8Z//vEp0dDS9e/chPT3j4A11CEIirC96+XqWffQTl42+NdCliIgIrXeKzNLSEo4/fjgZGRm4XC6+/vpLBg0a3GB7NCQkwhqg39lH3lgiItKwUJ4iMzc3lylTnmHgwGMoLy/njjvuOaRpNRvitykyc3NzefbZZ1m1ahXTp08/hOWbbopMOTi1WeOovRpH7dV4arPG0RSZTeinn37i1FNPpYVOny0iIq2Ypsg8RKNHj2bRokX+2p2IiLQSmiKzBV+zTkqKxm63Hda69Z1GkPqpzRpH7dU4aq/GU5vtddFF4xtcprW3V4sN68LC8sNaT9d6Gk9t1jhqr8ZRezWe2qxxWlN7BfyatYiIiBwev4X14sWLmTVrFrm5ufzzn/+ksrLSX7sWEREJan47DT506FCGDh3qr92JiIi0GjoNLiIi0sIprEVERFo4hbWIiEgL57fHjYqIiMjhUc9aRESkhVNYi4iItHAKaxERkRZOYS0iItLCKaxFRERaOIW1iIhIC9diZ906HAsWLGDOnDmkpKRgsVi46aabAl1Si3PRRRcREREBgNVq5fXXX6eoqIinn36aDh06sGnTJm6//XZSU1MDXGng5Obm8uyzz7Jq1SqmT58OQFVVFZMnTyY9PZ1NmzZx3XXX0aVLFwBmzZrFypUrsVqtdOzYkUsuuSSQ5ftdXe31wQcf8M477/i+184//3zGjRsHqL22bNnCs88+y9FHH83OnTtJTEzkpptuOujP4csvv4zD4aCkpIThw4dz6qmnBvgo/Ke+9poyZQqLFy/2LXf99dczfPhwoJW2l2klysvLzahRo0xVVZUxxpibbrrJLFiwIMBVtTzPPffcAe/99a9/NR9//LExxpivvvrK3Hnnnf4uq0X59NNPzVdffWXGjx/ve++ll14y06ZNM8YYs2rVKnPppZcaY4zZsWOHGTt2rPF4PMYYY8477zyzceNGv9ccSHW11/Tp001OTs4By6q9jFm6dKn54osvfK/HjBljli1bVu/P4a+//mquvfZaY4wxTqfTnHbaaaakpMT/hQdIfe1V1/9lxrTe9mo1p8F//fVX2rZtS3h4OADHHHMM8+bNC2xRLdCaNWuYNm0aU6ZM8bXPN998w6BBgwBvu33zzTcBrDDwRo8eTUxMTK335s2b52ujXr16sWrVKhwOB99++y19+vTBYrEAMGjQIObPn+/3mgOprvYCeOutt3jllVeYOnUqRUVFAGovoH///owaNcr32uPxEBUVVe/P4dy5cxk4cCAAdrudrl271upRtnb1tRfACy+8wCuvvMK0adOoqKgAWm97tZrT4Pn5+bX+w4iNjSU/Pz+AFbVMv//97+nfvz9ut5vLL7+cmJiYWm0XGxtLcXExLpcLu73VfHscsfq+vwoKCmq9X9Oeoe7YY48lKyuL5ORkvvnmG/70pz/x+uuvq73288UXX3DiiSfSrVu3en8OCwoK6Nq1q2+d2NhYCgoKAlVyQO3bXqNHj6Zdu3ZER0fz1ltv8cgjj/D444+32vZqNT3rlJQUysrKfK8dDgcpKSkBrKhl6t+/PwA2m40hQ4awaNGiWm3ncDhISEhQUO+nvu+v5OTkWu+XlZXp+w7o0KEDycnJABx//PEsWbIEt9ut9trHwoULWbRoEffddx9AvT+H+7eZw+HwtW0o2b+9evToQXR0NOD9Hlu4cCFAq22vVhPWAwcOZPv27VRXVwPw888/k5WVFdiiWpj169fz/vvv+15v3ryZDh06MGLECH755RfA224jRowIVIktVlZWlq+NVq9ezVFHHUVsbCwnnXQSy5cvx+x5xP4vv/zCySefHMhSW4Snn34al8sFwKZNm2jXrh02m03ttce8efP47rvvuP/++8nNzeWXX36p9+cwKyuLX3/9FQCn08mGDRs49thjA1V6QNTVXpMnT/Z9vnnzZjp27Ai03vZqVRN5fP/993z++eckJSURFham0eD72bVrF4888gi9e/fG4XDgcrm49957KSkp4amnnqJt27bk5ORwxx13hPRo8MWLFzNz5ky+/fZbLr30Uq6++moAJk+eTFpaGlu2bOEPf/hDrdHg2dnZ2Gw2OnfuHHKjm+tqr3fffZe1a9fSvn171qxZwxVXXOG7jhjq7ZWdnc3EiRPp27cvAOXl5Vx++eWccsop9f4cvvzyy5SUlFBcXMzJJ5/cOkY3H6L62mvjxo1UVFSQkpLCmjVruOWWW3w/k62xvVpVWIuIiLRGreY0uIiISGulsBYREWnhFNYiIiItnMJaRESkhVNYi4iItHAKaxERkRZOYS0iItLCKaxFpJYlS5bQq1cvZsyYEehSRGQPhbWI+Hg8Hh577DGOP/54Vq5cGehyRGQPhbWI+Lz33nt07NiRyy67jFWrVgW6HBHZQ1MriQgAJSUlvPjii7z11ls4nU5Wr14d6JJEZA+FtYgAMGXKFMaNG0e7du3weDxUV1ezY8cOMjMzA12aSMhTWIsI69ev57333iMxMZEPP/wQ8E4vuHLlSoW1SAugWbdEhGuuuYYzzzyT888/3/fe/fffT7t27bjxxhsDWJmIgAaYiYS8r776it27dzN+/Pha7/fo0UODzERaCPWsRUREWjj1rEVERFo4hbWIiEgLp7AWERFp4RTWIiIiLZzCWkREpIVTWIuIiLRwCmsREZEWTmEtIiLSwv0/cktZk/B7kzkAAAAASUVORK5CYII=\n",
|
||
"text/plain": [
|
||
"<Figure size 576x396 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_59_0.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" N Z A Element Ebinding Eapprox\n",
|
||
"A \n",
|
||
"4 0 1 3 4 Li 1.153760 1.153760\n",
|
||
"5 2 3 2 5 He 5.512132 5.512132\n",
|
||
"6 7 3 3 6 Li 5.332331 5.332331\n",
|
||
"7 12 4 3 7 Li 5.606439 5.606439\n",
|
||
"8 17 4 4 8 Be 7.062435 7.062435\n",
|
||
"... ... ... ... ... ... ...\n",
|
||
"264 3297 156 108 264 Hs 7.298375 7.298375\n",
|
||
"265 3303 157 108 265 Hs 7.296247 7.296247\n",
|
||
"266 3310 158 108 266 Hs 7.298273 7.298273\n",
|
||
"269 3331 159 110 269 Ds 7.250154 7.250154\n",
|
||
"270 3337 160 110 270 Ds 7.253775 7.253775\n",
|
||
"\n",
|
||
"[264 rows x 6 columns]\n",
|
||
"0.007012403613997257\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"\n",
|
||
"#Decision Tree Regression\n",
|
||
"from sklearn.tree import DecisionTreeRegressor\n",
|
||
"regr_1=DecisionTreeRegressor(max_depth=5)\n",
|
||
"regr_2=DecisionTreeRegressor(max_depth=7)\n",
|
||
"regr_3=DecisionTreeRegressor(max_depth=9)\n",
|
||
"regr_1.fit(X, Energies)\n",
|
||
"regr_2.fit(X, Energies)\n",
|
||
"regr_3.fit(X, Energies)\n",
|
||
"\n",
|
||
"\n",
|
||
"y_1 = regr_1.predict(X)\n",
|
||
"y_2 = regr_2.predict(X)\n",
|
||
"y_3=regr_3.predict(X)\n",
|
||
"Masses['Eapprox'] = y_3\n",
|
||
"# Plot the results\n",
|
||
"plt.figure()\n",
|
||
"plt.plot(A, Energies, color=\"blue\", label=\"Data\", linewidth=2)\n",
|
||
"plt.plot(A, y_1, color=\"red\", label=\"max_depth=5\", linewidth=2)\n",
|
||
"plt.plot(A, y_2, color=\"green\", label=\"max_depth=7\", linewidth=2)\n",
|
||
"plt.plot(A, y_3, color=\"m\", label=\"max_depth=9\", linewidth=2)\n",
|
||
"\n",
|
||
"plt.xlabel(\"$A$\")\n",
|
||
"plt.ylabel(\"$E$[MeV]\")\n",
|
||
"plt.title(\"Decision Tree Regression\")\n",
|
||
"plt.legend()\n",
|
||
"save_fig(\"Masses2016Trees\")\n",
|
||
"plt.show()\n",
|
||
"print(Masses)\n",
|
||
"print(np.mean( (Energies-y_1)**2))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"With a deeper and deeper tree level, we can almost reproduce every\n",
|
||
"single data point by increasing the max depth of the tree.\n",
|
||
"We can actually decide to make a decision tree which fits every single point.\n",
|
||
"As we will\n",
|
||
"see later, this has the benefit that we can really train a model which\n",
|
||
"traverses every single data point. However, the price we pay is that\n",
|
||
"we will easily overfit. That is, if we apply our model to unseen data,\n",
|
||
"we will most likely fail miserably in our attempt at making\n",
|
||
"predictions. As an exercise, try to make the tree level larger by adjusting the maximum depth variable. When printing out the predicition, you will note that the binding energy of every nucleus is accurately reproduced.\n",
|
||
"\n",
|
||
"\n",
|
||
"The **seaborn** package allows us to visualize data in an efficient way. Note that we use **scikit-learn**'s multi-layer perceptron (or feed forward neural network) \n",
|
||
"functionality."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJjCAYAAADQ22+yAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABv4UlEQVR4nO3dd3gU5dfG8e9uOr0lgdBRilIsgIj+pFkgoUZEEEXErjRREUSKBaQq0lRUkKoCKlUiIAqKgBQVEGlSpJPQDCVtd+f9YyQhL2HNJpPdJNyf69qL7OzszHNmht0z53lm1mYYhoGIiIiIWMbu6waIiIiI5DdKsEREREQspgRLRERExGJKsEREREQspgRLRERExGJKsEREREQs5u/rBohcy4YOHcrGjRsB2Lt3L2XLliU4OBiAOXPmpP79X5566in69evH9ddff9V5xo0bR8WKFWnXrl22231Jz5492bBhA6tWrSIkJMSy5YqI5HU23QdLJHdo1qwZ48aNo3bt2r5uSqacOHGCtm3bctNNN9GkSRMeeughXzdJRCTXUBehSC41YcIEnnjiCVq3bs3LL7/MyZMnef755+nYsSPNmjWjS5cunDp1CjCTs23btvHLL7/QqVMn+vbtS7t27YiKimL9+vUA9O/fnylTpgBQu3ZtJkyYQKdOnWjWrBnTpk0DwOl0Mnz4cO69917uv/9+Xn/9dbp06ZJh++bOnUvDhg2Jjo5mxowZXH6utmXLFjp06ECrVq2Ijo5m3bp1bqdXr16d06dPp77/0vNffvmFNm3a0KlTJ9q0aUNycjJDhw6lQ4cOREVFERkZyebNmwG4cOECr776Ks2bNycqKop3332XixcvUr9+ffbv35+67G7duvHdd99ZsYtERK5KCZZILnbkyBHmz5/PmDFj+Oabb7j55puZM2cOK1euJDg4mIULF17xnq1bt/L444+zYMECHnjgASZOnHjFPMnJyRQvXpwvvviC8ePH884775CUlMS8efPYvn07S5Ys4YsvvuDQoUMZtsvhcDB37lzatGlDs2bNOHXqFD/++CMAKSkpdO/ene7du7NkyRLeeust3n77bZKTkzOc7nK53G6DPXv28M4777Bo0SK2b99ObGwsc+bMYenSpURHR/Pxxx8DMH78eJKSkli6dCkLFizg119/Zdu2bbRr14558+YBcPDgQfbv30/Tpk092g8iIp7SGCyRXOzmm2/G39/8b9q1a1c2bdrEp59+yoEDB9izZw833XTTFe+JiIjghhtuAODGG29k/vz5GS777rvvBqBmzZokJydz8eJFVq9eTdu2bQkKCgKgY8eOzJw584r3rly5EpfLxV133YW/vz9RUVFMnz6dxo0bs3v3bux2O02aNAGgVq1aLF68mO3bt2c4/b+UKVOGsmXLAnDLLbdQtGjR1OTvl19+oWDBggCsXbuWV199FT8/P/z8/Jg1axYAYWFhPPLII/Tp04c5c+bwwAMP4Ofn95/rFRHJDiVYIrlYgQIFUv8ePXo0W7dupX379jRo0ACHw0FGQygvHxhvs9kynAdITaJsNhsAhmGkJnOX2O0ZF7k///xzEhMTue+++wCzIhYXF8eePXvw8/NLXeYlu3fvvur0KlWqpJuWnJyc7vnl22DVqlUMGzaMbt26cffdd1OlShUWLVoEgL+/f7rlHzt2jODgYCpXrkz16tVZuXIlixcvTq1miYjkJHURiuQRa9asoWvXrrRr146SJUuydu1anE6npeto3LgxixYtIjk5GYfDkWH1a//+/WzYsIH58+fz/fff8/3337NmzRrq1avH9OnTqVKlCjabjZ9//hmA7du307Vr16tOd7lclChRgm3btgGwYsWKq7bv559/pmnTpnTu3JnatWvz3XffpW6Dhg0bMn/+fFwuF8nJyfTq1Sv1Cs3OnTszatQobrrpJsLDwy3dZiIiGVEFSySP6N69O6NGjeL999/Hz8+PW2+9lYMHD1q6jvvvv5/9+/fTrl07ChQoQLly5a64/cLnn3/OPffcQ4UKFdJN79GjB8888wwvvvgiEyZM4O2332bUqFEEBAQwYcIEAgMDrzp94MCBvPnmmxQpUoQ77riD0NDQDNvXqVMnXn75ZVq3bo2fnx/16tVj+fLluFwuevTowbBhw2jbti1Op5OoqKjUClvTpk0ZOHAgnTp1snR7iYhcjW7TICKp1qxZw6lTp2jbti1g3qcrKCiIvn37+rhl2fPrr78yaNAglixZckU3pYhITlCCJSKpTpw4Qf/+/Tl16hROp5MaNWrw+uuvU7hwYV83Lcv69evHhg0bGDlyJLfddpuvmyMi1wglWCIiIiIW0yB3ERERyfMWL15MVFQU9957L7Nnz/Z1czTIXURERPK2EydOMHbsWL7++msC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1T73Z0wJwjBg4rvBqdNuqOnk2V55/wRLss9m/P+SUg7ZunUr8+bN46233rJ0ubsO5d7uRW9IvsaH0QXb8vdZ43/xI+93RYpkRco1XlGpXt790Bur9fz1Ya+ta8Kts722rpzktcu96tSpQ506dby1OhERERGfyb/X04uIiIglnFzbFcOsuLb7l0RERERygCpYIiIi4pauIvScKlgiIiIiFlOCJSIiImIxdRGKiIiIWy5D9RhPaYuJiIiIWEwVLBEREXHLpds0eEwVLBERERGLqYIlIiIibjl1mwaPqYIlIiIiYjFVsERERMQtXUXoOW0xEREREYupgiUiIiJu6adyPKcKloiIiIjFVMESERERt3QfLM+pgiUiIiJiMVWwRERExC2NwfKcKlgiIiIiFlMFS0RERNzSfbA8py0mIiIiYjElWCIiIiIWUxehiIiIuKVB7p5TBUtERETEYqpgiYiIiFu60ajnVMESERERsZgqWCIiIuKWxmB5ThUsEREREYupgiUiIiJuqYLlOVWwRERERCymCpaIiIi4pQqW51TBEhEREbGYKlgiIiLilipYnsvzCVbVgEK+boKIiIhIOnk+wRIREZGcpTu5e05jsEREREQspgqWiIiIuKUxWJ5TBUtERETEYkqwRERERCymLkIRERFxS12EnlMFS0RERMRiqmCJiIiIW6pgeU4VLBERERGLqYIlIiIibqmC5TlVsEREREQspgqWiIiIuGWoguUxVbBERERELKYKloiIiLilH3v2nCpYIiIiIhZTBUtERETc0lWEnlMFS0RERMRiqmCJiIiIW7qK0HOqYImIiIhYTAmWiIiIuOUybF575IQ///yTWrVqpT5PTk6mb9++REZGEh0dzd69ewEwDIORI0fSokULoqKi2Lx5c5bXqS5CERERybcSEhJ48803SUlJSZ02c+ZMQkJCiImJYePGjfTv35958+axbNky9u7dy9KlS/n77795+umniYmJwd/f83RJFSwRERHJNeLj4zl8+PAVj/j4+Cwtb8SIETz22GPppq1atYo2bdoAUL9+fc6cOcPRo0dZvXo1UVFR2O12KleuTEREBL/99luW1qsKloiIiLjlzUHu06dPZ+LEiVdM79GjBz179vRoWStXriQxMZEWLVqkmx4bG0toaGjq89DQUI4fP05sbCxhYWFXTM8KJVgiIiKSa3Tt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b550OJ0wbS5E/r9xerlZZuK32cx9fPiY+fzzBVD9OigdBut/NS/0cDjMatjiFXD7rV4NIceoi9BzXvmx54kTJ7J27Vr69+9PnTpmh/TmzZvp0aMHycnJbN68OcvLzqkfe1693rxUNyUFypc1vzAPHzUHbc+fkn7eI8egTTfY/K35/PEXzcu0y5VJm6dsaZg4LEeamiOyEz/AlM/NM7mhr3i33VbQvs98/K8OT3+bhgsXod8ws9vIMODph6HNfd6PITsyE//nC8yB/v5+5i1IBvcx93nzzubA5vDQtOXdUst8Pa/4r/g/nGkm0dX+3/jDqe9C0cLm+KNVa82rKRvcAgN7p130kRdkZv8vWg4ffwYup7mvh/aDiHBzoP/wCWYVz26DW2ubF8KEBFvfTm//2HPtRUO8tq5tbd7w2rpyklcSLIB169YRFhbGddddlzrt2LFjTJ06lddeey3Ly82pBEtERCS38naCVXPh615b1/a23ltXTvJa73jDhg2vmFamTJlsJVciIiIiuVEeGn4oIiIivpALr0fL9XSjURERERGLqYIlIiIibuWnq/u8RRUsEREREYupgiUiIiJuqYLlOVWwRERERCymCpaIiIi4pYsIPacKloiIiIjFVMESERERtzQGy3OqYImIiIhYTBUsERERcU+DsDymCpaIiIiIxZRgiYiIiFhMXYQiIiLilga5e04VLBERERGLqYIlIiIibhka5O4xVbBERERELKYKloiIiLilMVieUwVLRERExGKqYImIiIh7qmB5TBUsEREREYupgiUiIiJu6SpCz6mCJSIiImIxVbBERETEPVWwPKYKloiIiIjFVMESERERt3QfLM+pgiUiIiJiMVWwRERExD2NwfKYKlgiIiIiFlOCJSIiImIxdRGKiIiIWxrk7jlVsEREREQspgqWiIiIuKdB7h5TBUtERETEYqpgiYiIyH/QGCxPqYIlIiIiYjFVsERERMQ9jcHymCpYIiIiIhZTBUtERETcUwXLY6pgiYiIiFhMFSwRERFxT3dy95gqWCIiIiIWUwVLRERE3DI0BstjqmCJiIiIWEwVLBEREXFPFSyPqYIlIiIiYjElWCIiIiIWUxehiIiIuKfbNHhMFSwRERERi6mCJSIiIm7ZNMjdY6pgiYiIiFhMFSwRERFxTxUsj6mCJSIiImIxVbBERETEPV1F6DFV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LI+pgiUiIiJiMSVYIiIiIhZTF6GIiIi4py5Cj6mCJSIiImIxVbBERETELd2mwXOqYImIiIhYTBUsERERcc+w+boFeY4qWCIiIiIWUwVLRERE3NMYLI+pgiUiIiJiMVWwRERExC1dReg5VbBERERELKYKloiIiLinCpbHVMESERERsZgqWCIiIuKWxmB5ThUsEREREYupgiUiIiLuqYLlMVWwRERERCymBEtERETEYuoiFBEREffURegxVbBERERELKYKloiIiLil2zR4ThUsEREREYspwRIRERGxmBIsEREREYtpDJaIiIi4pzFYHlMFS0RERMRiqmCJiIiIW7qK0HOqYImIiIhYTBUsERERcU8VLI+pgiUiIiJiMVWwRERExD1VsDymCpaIiIiIxVTBEhEREbd0FaHnVMESERERsZgSLBERERGLqYtQRERE3FMXocdUwRIRERGxmCpYIiIi4pYGuXtOFSwRERERi6mCJSIiIu6pguUxVbBERERELKYKloiIiLinCpbHVMESERERsZgqWCIiIuKWriL0nCpYIiIiIhZTBUtERETcUwXLY6pgiYiIiFhMFSwRERFxTxUsj6mCJSIiImIxVbBERETELV1F6DlVsEREREQspgRLRERExGLqIhQRERH31EXoMVWwRERERCymCpaIiIi4pUHunlMFS0RERMRiqmCJiIiIe6pgeUwVLBERERGLqYIlIiIi7qmC5TFVsEREREQspgqWiIiIuGXzdQPyIFWwRERERCymCpaIiIi4pzFYHlMFS0RERMRiqmBdxap1MPYjSE6B6lVgaD8oVDD9PCMnwbJVULSI+bxSeRj7OgwbB5u2ps13Ig5CS8LCT73V+uzLTvzJyTBsPKz/FQqGQJM7oEc3sOeRdD47sQMsXw2TZ5nvjwiHEQOgeFFvRpA92Y2//VOQlAQBAebzVvfAEw95q/XWyu62yIsyE/Psr+HzhWCzQYUIeLMvlCwO587DwFGw7yAYLmjbAp7q7Js4rJCZbXHJdz9B/7dhU4x32+gtupO752yGYeTpzeY6Xs3yZZ4+C627wuxJUKkcjPkQLlyEIS+mn6/Tc9CvO9xS6+rLOnIMHukJ7w+HG6pa3tQckd34J0yFrTtg4lDzS3bIGKhxPTx8v9dCyLLsxv7HTnjuVfjifShbBoZPNJON11/yWgjZkt34LyZAkwfg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13y2/7MfGza6VGpOo9CbMIDYxDO8u2sOp5L/cR+/XyC9q3bg+sLlsNtsfPb3Clae2EyzsFt59cYu7D9/FNdl3ZQjdszmwIVj/xnPiibevfQ8skx3r60r5tgkr60rJ3klwQI4dOgQ3333HX///TdOp5NSpUrRtGlT6tSpk63lZjfBEsnLfJFg5RaeJlj5TVYTrHzDwwQrv1GClft5rX+ufPnydOvWzVurExEREatoDJbHcvG1PiIiIiJ5U+67G6CIiIjkLqpgeUwVLBERERGLqYIlIiIi7rlUwfKUKlgiIiIiFlMFS0RERNwyMvq9J3FLFSwRERERi6mCJSIiIu5pDJbHVMESERERsZgqWCIiIuKe7oPlMVWwRERERCymBEtERETEYuoiFBEREfdcuk2Dp1TBEhEREbGYKlgiIiLinga5e0wVLBERERGLqYIlIiIibhkag+UxVbBERERELKYKloiIiLinMVgeUwVLRERExGKqYImIiIh7+rFnj6mCJSIiImIxJVgiIiLinuHy3iMHjBs3jgkTJqQ+37t3L507d6Zt27Z07NiRHTt2AJCcnEzfvn2JjIwkOjqavXv3muEbBiNHjqRFixZERUWxefPm/1ynEiwRERHJl86dO8eAAQOYOnVquukDBw7kqaeeYuHChbzwwgv069cPgJkzZxISEkJMTAwDBgygf//+ACxbtoy9e/eydOlSJk2aRP/+/XE4HG7XrTFYIiIi4pbhxTFY8fHxxMfHXzG9SJEiFClSxKNlrVy5kkqVKtGtW7d00zt06ECjRo0AqF69OseOHQNg1apV9O7dG4D69etz5swZjh49yurVq4mKisJut1O5cmUiIiL47bffqF+//lXXrQRLREREco3p06czceLEK6b36NGDnj17erSsdu3aAaTrHgS4//77U/8eP34899xzDwCxsbGEhoamvhYaGsrx48eJjY0lLCzsiunuKMESERER93JobFRGunbtSnR09BXT3VWvYmJiGD58eLppVapUYdq0aVd9j2EYjBo1ii1btjBjxoyrzme32zEyuA+Y3e5+lJUSLBEREck1stIVGBkZSWRkZKbndzgc9OvXjxMnTjBjxgwKFy4MQFhYGHFxcVSsWBGAuLg4wsLCCA8PJy4uLvX9l6a7o0HuIiIick0ZOXIk58+fZ+rUqanJFUDjxo1ZuHAhAJs2bSIoKIiIiAgaNWrE4sWLcTqd/P333xw4cIDatWu7XYcqWCIiIuKWNwe557TTp08ze/ZsypUrR4cOHVKnL1y4kC5dujB48GBatmxJYGAgo0aNAqBFixZs3bqVNm3aADBs2DCCg4PdrsdmZNSxmIe4jlfzdRNEfOaU64Kvm+AzQ4439XUTfGpPvSRfN8G3vi/n6xb41IomY726vnv9OnptXSucc7y2rpykCpaIiIi458VB7vmFxmCJiIiIWCzPdxGKiIiI5DaqYImIiIhYTAmWiIiIiMWUYImIiIhYTAmWiIiIiMWUYImIiIhYTAmWiIiIiMWUYImIiIhYTAmWiIiIiMWUYImIiIhYTAmWiIiIiMWUYImIiIhYTAmWiIiIiMWUYImIiIhYTAlWNixevJioqCjuvfdeZs+e7evmeN358+dp1aoVhw8f9nVTvG7ixIm0bNmSli1bMmrUKF83x+vGjRtHVFQULVu25NNPP/V1c3xi5MiR9O/f39fN8LpHH32Uli1b0rZtW9q2bcuWLVt83SSv+v7777n//vtp0aIFQ4cO9XVzJBfz93UD8qoTJ04wduxYvv76awIDA+nUqRMNGjTg+uuv93XTvGLLli0MHDiQAwcO+LopXrd27VrWrFnD/PnzsdlsPPnkk6xYsYJ7773X103zig0bNrB+/XoWLVqEw+EgKiqKxo0bU6VKFV83zWvWrVvH/PnzadKkia+b4lWGYbBv3z5WrVqFv/+19/Vx6NAhhgwZwrx58yhZsiRdu3Zl9erVNG7c2NdNk1xIFawsWrt2LbfffjvFihWjQIECNG/enG+//dbXzfKauXPnMmTIEMLCwnzdFK8LDQ2lf//+BAYGEhAQwHXXXcfRo0d93Syvue2225gxYwb+/v6cOnUKp9NJgQIFfN0srzl79ixjx47l2Wef9XVTvG7fvn3YbDaeeuop2rRpw6xZs3zdJK9asWIFUVFRlC5dmoCAAMaOHctNN93k62ZJLnXtnYJYJDY2ltDQ0NTnYWFhbN261Yct8q5hw4b5ugk+U7Vq1dS/Dxw4wNKlS/niiy982CLvCwgIYPz48UydOpUWLVoQHh7u6yZ5zeDBg+nTpw/Hjh3zdVO8Lj4+noYNG/L666+TmJjIo48+SuXKlbnzzjt93TSv+PvvvwkICOCJJ54gLi6Opk2b8sILL/i6WZJLqYKVRYZhXDHNZrP5oCXiK3v27OHxxx+nX79+VKpUydfN8bpevXqxbt06jh07xty5c33dHK+YN28eZcqUoWHDhr5uik/ccsstjBo1igIFClCiRAkeeOABVq9e7etmeY3T6WTdunWMHj2auXPnsm3bNubPn+/rZkkupQQri8LDwzl58mTq89jY2Guyu+xatXnzZh577DFeeukloqOjfd0cr9q7dy87duwAICQkhPvuu49du3b5uFXesXTpUn7++Wfatm3L+PHj+f7773n77bd93Syv2bRpE+vWrUt9bhjGNTUWq1SpUjRs2JASJUoQHBzM3XfffU31XIhnlGBl0R133MG6des4ffo0CQkJLF++nEaNGvm6WeIFx44do3v37owZM4aWLVv6ujled/jwYQYOHEhycjLJycmsXLmSunXr+rpZXvHpp5+yZMkSFi5cSK9evWjWrBkDBgzwdbO85ty5c4waNYqkpCTOnz/P/Pnzr5mLOwCaNm3KmjVriI+Px+l08tNPP1GzZk1fN0tyqWvn1MNi4eHh9OnTh0cffZSUlBQeeOAB6tSp4+tmiRdMmTKFpKQkRowYkTqtU6dOPPTQQz5slfc0btyYLVu20K5dO/z8/LjvvvuuyUTzWtS0adPUfe9yuejcuTO33HKLr5vlNTfddBNPPvkknTt3JiUlhTvvvJP27dv7ulmSS9mMjAYTiYiIiEiWqYtQRERExGJKsEREREQspgRLRERExGJKsEREREQspgRLRERExGJKsEREREQspgRLRERExGJKsETEY5GRkTRq1Ig9e/b4uikiIrmSEiwR8diSJUuoVKkSy5Yt83VTRERyJSVYIuIxPz8/6tate838yLOIiKf0W4Qi4rHExES++eYb9EtbIiIZUwVLRDw2duxYwsPDOXToEBcuXPB1c0REch0lWCLikd9++41vv/2WCRMmULhwYXbv3u3rJomI5DpKsEQk05KSknj11Vd54403KFasGDVq1NA4LBGRDCjBEpFMGzduHLfccgtNmjQBoEaNGuzcudO3jRIRyYWUYIlIpmzdupVvv/2WAQMGpE674YYbVMESEcmAzdBlQCIiIiKWUgVLRERExGJKsEREREQspgRLRERExGJKsEREREQspgRLRERExGJKsEREREQspgRLRERExGL/B0CerAPa1d2tAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<Figure size 720x720 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_61_8.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.neural_network import MLPRegressor\n",
|
||
"from sklearn.metrics import accuracy_score\n",
|
||
"import seaborn as sns\n",
|
||
"\n",
|
||
"X_train = X\n",
|
||
"Y_train = Energies\n",
|
||
"n_hidden_neurons = 100\n",
|
||
"epochs = 100\n",
|
||
"# store models for later use\n",
|
||
"eta_vals = np.logspace(-5, 1, 7)\n",
|
||
"lmbd_vals = np.logspace(-5, 1, 7)\n",
|
||
"# store the models for later use\n",
|
||
"DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n",
|
||
"train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n",
|
||
"sns.set()\n",
|
||
"for i, eta in enumerate(eta_vals):\n",
|
||
" for j, lmbd in enumerate(lmbd_vals):\n",
|
||
" dnn = MLPRegressor(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',\n",
|
||
" alpha=lmbd, learning_rate_init=eta, max_iter=epochs)\n",
|
||
" dnn.fit(X_train, Y_train)\n",
|
||
" DNN_scikit[i][j] = dnn\n",
|
||
" train_accuracy[i][j] = dnn.score(X_train, Y_train)\n",
|
||
"\n",
|
||
"fig, ax = plt.subplots(figsize = (10, 10))\n",
|
||
"sns.heatmap(train_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n",
|
||
"ax.set_title(\"Training Accuracy\")\n",
|
||
"ax.set_ylabel(\"$\\eta$\")\n",
|
||
"ax.set_xlabel(\"$\\lambda$\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Linear Regression, basic elements\n",
|
||
"\n",
|
||
"\n",
|
||
"[Video of Lecture](https://www.uio.no/studier/emner/matnat/fys/FYS-STK4155/h20/forelesningsvideoer/LectureAug27.mp4?vrtx=view-as-webpage).\n",
|
||
"\n",
|
||
"\n",
|
||
"Fitting a continuous function with linear parameterization in terms of the parameters $\\boldsymbol{\\beta}$.\n",
|
||
"* Method of choice for fitting a continuous function!\n",
|
||
"\n",
|
||
"* Gives an excellent introduction to central Machine Learning features with **understandable pedagogical** links to other methods like **Neural Networks**, **Support Vector Machines** etc\n",
|
||
"\n",
|
||
"* Analytical expression for the fitting parameters $\\boldsymbol{\\beta}$\n",
|
||
"\n",
|
||
"* Analytical expressions for statistical propertiers like mean values, variances, confidence intervals and more\n",
|
||
"\n",
|
||
"* Analytical relation with probabilistic interpretations \n",
|
||
"\n",
|
||
"* Easy to introduce basic concepts like bias-variance tradeoff, cross-validation, resampling and regularization techniques and many other ML topics\n",
|
||
"\n",
|
||
"* Easy to code! And links well with classification problems and logistic regression and neural networks\n",
|
||
"\n",
|
||
"* Allows for **easy** hands-on understanding of gradient descent methods\n",
|
||
"\n",
|
||
"* and many more features\n",
|
||
"\n",
|
||
"For more discussions of Ridge and Lasso regression, [Wessel van Wieringen's](https://arxiv.org/abs/1509.09169) article is highly recommended.\n",
|
||
"Similarly, [Mehta et al's article](https://arxiv.org/abs/1803.08823) is also recommended.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Regression modeling deals with the description of the sampling distribution of a given random variable $y$ and how it varies as function of another variable or a set of such variables $\\boldsymbol{x} =[x_0, x_1,\\dots, x_{n-1}]^T$. \n",
|
||
"The first variable is called the **dependent**, the **outcome** or the **response** variable while the set of variables $\\boldsymbol{x}$ is called the independent variable, or the predictor variable or the explanatory variable. \n",
|
||
"\n",
|
||
"A regression model aims at finding a likelihood function $p(\\boldsymbol{y}\\vert \\boldsymbol{x})$, that is the conditional distribution for $\\boldsymbol{y}$ with a given $\\boldsymbol{x}$. The estimation of $p(\\boldsymbol{y}\\vert \\boldsymbol{x})$ is made using a data set with \n",
|
||
"* $n$ cases $i = 0, 1, 2, \\dots, n-1$ \n",
|
||
"\n",
|
||
"* Response (target, dependent or outcome) variable $y_i$ with $i = 0, 1, 2, \\dots, n-1$ \n",
|
||
"\n",
|
||
"* $p$ so-called explanatory (independent or predictor) variables $\\boldsymbol{x}_i=[x_{i0}, x_{i1}, \\dots, x_{ip-1}]$ with $i = 0, 1, 2, \\dots, n-1$ and explanatory variables running from $0$ to $p-1$. See below for more explicit examples. \n",
|
||
"\n",
|
||
" The goal of the regression analysis is to extract/exploit relationship between $\\boldsymbol{y}$ and $\\boldsymbol{x}$ in or to infer causal dependencies, approximations to the likelihood functions, functional relationships and to make predictions, making fits and many other things.\n",
|
||
"\n",
|
||
"\n",
|
||
"Consider an experiment in which $p$ characteristics of $n$ samples are\n",
|
||
"measured. The data from this experiment, for various explanatory variables $p$ are normally represented by a matrix \n",
|
||
"$\\mathbf{X}$.\n",
|
||
"\n",
|
||
"The matrix $\\mathbf{X}$ is called the *design\n",
|
||
"matrix*. Additional information of the samples is available in the\n",
|
||
"form of $\\boldsymbol{y}$ (also as above). The variable $\\boldsymbol{y}$ is\n",
|
||
"generally referred to as the *response variable*. The aim of\n",
|
||
"regression analysis is to explain $\\boldsymbol{y}$ in terms of\n",
|
||
"$\\boldsymbol{X}$ through a functional relationship like $y_i =\n",
|
||
"f(\\mathbf{X}_{i,\\ast})$. When no prior knowledge on the form of\n",
|
||
"$f(\\cdot)$ is available, it is common to assume a linear relationship\n",
|
||
"between $\\boldsymbol{X}$ and $\\boldsymbol{y}$. This assumption gives rise to\n",
|
||
"the *linear regression model* where $\\boldsymbol{\\beta} = [\\beta_0, \\ldots,\n",
|
||
"\\beta_{p-1}]^{T}$ are the *regression parameters*. \n",
|
||
"\n",
|
||
"Linear regression gives us a set of analytical equations for the parameters $\\beta_j$.\n",
|
||
"\n",
|
||
"\n",
|
||
"In order to understand the relation among the predictors $p$, the set of data $n$ and the target (outcome, output etc) $\\boldsymbol{y}$,\n",
|
||
"consider the model we discussed for describing nuclear binding energies. \n",
|
||
"\n",
|
||
"There we assumed that we could parametrize the data using a polynomial approximation based on the liquid drop model.\n",
|
||
"Assuming"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(A) = a_0+a_1A+a_2A^{2/3}+a_3A^{-1/3}+a_4A^{-1},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we have five predictors, that is the intercept, the $A$ dependent term, the $A^{2/3}$ term and the $A^{-1/3}$ and $A^{-1}$ terms.\n",
|
||
"This gives $p=0,1,2,3,4$. Furthermore we have $n$ entries for each predictor. It means that our design matrix is a \n",
|
||
"$p\\times n$ matrix $\\boldsymbol{X}$.\n",
|
||
"\n",
|
||
"Here the predictors are based on a model we have made. A popular data set which is widely encountered in ML applications is the\n",
|
||
"so-called [credit card default data from Taiwan](https://www.sciencedirect.com/science/article/pii/S0957417407006719?via%3Dihub). The data set contains data on $n=30000$ credit card holders with predictors like gender, marital status, age, profession, education, etc. In total there are $24$ such predictors or attributes leading to a design matrix of dimensionality $24 \\times 30000$. This is however a classification problem and we will come back to it when we discuss Logistic Regression. \n",
|
||
"\n",
|
||
"\n",
|
||
"Before we proceed let us study a case from linear algebra where we aim at fitting a set of data $\\boldsymbol{y}=[y_0,y_1,\\dots,y_{n-1}]$. We could think of these data as a result of an experiment or a complicated numerical experiment. These data are functions of a series of variables $\\boldsymbol{x}=[x_0,x_1,\\dots,x_{n-1}]$, that is $y_i = y(x_i)$ with $i=0,1,2,\\dots,n-1$. The variables $x_i$ could represent physical quantities like time, temperature, position etc. We assume that $y(x)$ is a smooth function. \n",
|
||
"\n",
|
||
"Since obtaining these data points may not be trivial, we want to use these data to fit a function which can allow us to make predictions for values of $y$ which are not in the present set. The perhaps simplest approach is to assume we can parametrize our function in terms of a polynomial of degree $n-1$ with $n$ points, that is"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"y=y(x) \\rightarrow y(x_i)=\\tilde{y}_i+\\epsilon_i=\\sum_{j=0}^{n-1} \\beta_j x_i^j+\\epsilon_i,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\epsilon_i$ is the error in our approximation. \n",
|
||
"\n",
|
||
"\n",
|
||
"For every set of values $y_i,x_i$ we have thus the corresponding set of equations"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{align*}\n",
|
||
"y_0&=\\beta_0+\\beta_1x_0^1+\\beta_2x_0^2+\\dots+\\beta_{n-1}x_0^{n-1}+\\epsilon_0\\\\\n",
|
||
"y_1&=\\beta_0+\\beta_1x_1^1+\\beta_2x_1^2+\\dots+\\beta_{n-1}x_1^{n-1}+\\epsilon_1\\\\\n",
|
||
"y_2&=\\beta_0+\\beta_1x_2^1+\\beta_2x_2^2+\\dots+\\beta_{n-1}x_2^{n-1}+\\epsilon_2\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{n-1}&=\\beta_0+\\beta_1x_{n-1}^1+\\beta_2x_{n-1}^2+\\dots+\\beta_{n-1}x_{n-1}^{n-1}+\\epsilon_{n-1}.\\\\\n",
|
||
"\\end{align*}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Defining the vectors"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{y} = [y_0,y_1, y_2,\\dots, y_{n-1}]^T,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\beta} = [\\beta_0,\\beta_1, \\beta_2,\\dots, \\beta_{n-1}]^T,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\epsilon} = [\\epsilon_0,\\epsilon_1, \\epsilon_2,\\dots, \\epsilon_{n-1}]^T,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and the design matrix"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}=\n",
|
||
"\\begin{bmatrix} \n",
|
||
"1& x_{0}^1 &x_{0}^2& \\dots & \\dots &x_{0}^{n-1}\\\\\n",
|
||
"1& x_{1}^1 &x_{1}^2& \\dots & \\dots &x_{1}^{n-1}\\\\\n",
|
||
"1& x_{2}^1 &x_{2}^2& \\dots & \\dots &x_{2}^{n-1}\\\\ \n",
|
||
"\\dots& \\dots &\\dots& \\dots & \\dots &\\dots\\\\\n",
|
||
"1& x_{n-1}^1 &x_{n-1}^2& \\dots & \\dots &x_{n-1}^{n-1}\\\\\n",
|
||
"\\end{bmatrix}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we can rewrite our equations as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{y} = \\boldsymbol{X}\\boldsymbol{\\beta}+\\boldsymbol{\\epsilon}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The above design matrix is called a [Vandermonde matrix](https://en.wikipedia.org/wiki/Vandermonde_matrix).\n",
|
||
"\n",
|
||
"We are obviously not limited to the above polynomial expansions. We\n",
|
||
"could replace the various powers of $x$ with elements of Fourier\n",
|
||
"series or instead of $x_i^j$ we could have $\\cos{(j x_i)}$ or $\\sin{(j\n",
|
||
"x_i)}$, or time series or other orthogonal functions. For every set\n",
|
||
"of values $y_i,x_i$ we can then generalize the equations to"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{align*}\n",
|
||
"y_0&=\\beta_0x_{00}+\\beta_1x_{01}+\\beta_2x_{02}+\\dots+\\beta_{n-1}x_{0n-1}+\\epsilon_0\\\\\n",
|
||
"y_1&=\\beta_0x_{10}+\\beta_1x_{11}+\\beta_2x_{12}+\\dots+\\beta_{n-1}x_{1n-1}+\\epsilon_1\\\\\n",
|
||
"y_2&=\\beta_0x_{20}+\\beta_1x_{21}+\\beta_2x_{22}+\\dots+\\beta_{n-1}x_{2n-1}+\\epsilon_2\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{i}&=\\beta_0x_{i0}+\\beta_1x_{i1}+\\beta_2x_{i2}+\\dots+\\beta_{n-1}x_{in-1}+\\epsilon_i\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{n-1}&=\\beta_0x_{n-1,0}+\\beta_1x_{n-1,2}+\\beta_2x_{n-1,2}+\\dots+\\beta_{n-1}x_{n-1,n-1}+\\epsilon_{n-1}.\\\\\n",
|
||
"\\end{align*}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**Note that we have $p=n$ here. The matrix is symmetric. This is generally not the case!**\n",
|
||
"\n",
|
||
"We redefine in turn the matrix $\\boldsymbol{X}$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}=\n",
|
||
"\\begin{bmatrix} \n",
|
||
"x_{00}& x_{01} &x_{02}& \\dots & \\dots &x_{0,n-1}\\\\\n",
|
||
"x_{10}& x_{11} &x_{12}& \\dots & \\dots &x_{1,n-1}\\\\\n",
|
||
"x_{20}& x_{21} &x_{22}& \\dots & \\dots &x_{2,n-1}\\\\ \n",
|
||
"\\dots& \\dots &\\dots& \\dots & \\dots &\\dots\\\\\n",
|
||
"x_{n-1,0}& x_{n-1,1} &x_{n-1,2}& \\dots & \\dots &x_{n-1,n-1}\\\\\n",
|
||
"\\end{bmatrix}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and without loss of generality we rewrite again our equations as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{y} = \\boldsymbol{X}\\boldsymbol{\\beta}+\\boldsymbol{\\epsilon}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The left-hand side of this equation is kwown. Our error vector $\\boldsymbol{\\epsilon}$ and the parameter vector $\\boldsymbol{\\beta}$ are our unknow quantities. How can we obtain the optimal set of $\\beta_i$ values? \n",
|
||
"\n",
|
||
"We have defined the matrix $\\boldsymbol{X}$ via the equations"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{align*}\n",
|
||
"y_0&=\\beta_0x_{00}+\\beta_1x_{01}+\\beta_2x_{02}+\\dots+\\beta_{n-1}x_{0n-1}+\\epsilon_0\\\\\n",
|
||
"y_1&=\\beta_0x_{10}+\\beta_1x_{11}+\\beta_2x_{12}+\\dots+\\beta_{n-1}x_{1n-1}+\\epsilon_1\\\\\n",
|
||
"y_2&=\\beta_0x_{20}+\\beta_1x_{21}+\\beta_2x_{22}+\\dots+\\beta_{n-1}x_{2n-1}+\\epsilon_1\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{i}&=\\beta_0x_{i0}+\\beta_1x_{i1}+\\beta_2x_{i2}+\\dots+\\beta_{n-1}x_{in-1}+\\epsilon_1\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{n-1}&=\\beta_0x_{n-1,0}+\\beta_1x_{n-1,2}+\\beta_2x_{n-1,2}+\\dots+\\beta_{n-1}x_{n-1,n-1}+\\epsilon_{n-1}.\\\\\n",
|
||
"\\end{align*}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"As we noted above, we stayed with a system with the design matrix \n",
|
||
" $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times n}$, that is we have $p=n$. For reasons to come later (algorithmic arguments) we will hereafter define \n",
|
||
"our matrix as $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times p}$, with the predictors refering to the column numbers and the entries $n$ being the row elements.\n",
|
||
"\n",
|
||
"In our [introductory notes](https://compphysics.github.io/MachineLearning/doc/pub/How2ReadData/html/How2ReadData.html) we looked at the so-called [liquid drop model](https://en.wikipedia.org/wiki/Semi-empirical_mass_formula). Let us remind ourselves about what we did by looking at the code.\n",
|
||
"\n",
|
||
"We restate the parts of the code we are most interested in."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>1</th>\n",
|
||
" <th>A</th>\n",
|
||
" <th>A^(2/3)</th>\n",
|
||
" <th>A^(-1/3)</th>\n",
|
||
" <th>1/A</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>A</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2.519842</td>\n",
|
||
" <td>0.629961</td>\n",
|
||
" <td>0.250000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>2.924018</td>\n",
|
||
" <td>0.584804</td>\n",
|
||
" <td>0.200000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>6.0</td>\n",
|
||
" <td>3.301927</td>\n",
|
||
" <td>0.550321</td>\n",
|
||
" <td>0.166667</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>3.659306</td>\n",
|
||
" <td>0.522758</td>\n",
|
||
" <td>0.142857</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>8</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>4.000000</td>\n",
|
||
" <td>0.500000</td>\n",
|
||
" <td>0.125000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>264</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>264.0</td>\n",
|
||
" <td>41.153106</td>\n",
|
||
" <td>0.155883</td>\n",
|
||
" <td>0.003788</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>265</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>265.0</td>\n",
|
||
" <td>41.256962</td>\n",
|
||
" <td>0.155687</td>\n",
|
||
" <td>0.003774</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>266</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>266.0</td>\n",
|
||
" <td>41.360688</td>\n",
|
||
" <td>0.155491</td>\n",
|
||
" <td>0.003759</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>269</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>269.0</td>\n",
|
||
" <td>41.671089</td>\n",
|
||
" <td>0.154911</td>\n",
|
||
" <td>0.003717</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>270</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>270.0</td>\n",
|
||
" <td>41.774300</td>\n",
|
||
" <td>0.154720</td>\n",
|
||
" <td>0.003704</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>264 rows × 5 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" 1 A A^(2/3) A^(-1/3) 1/A\n",
|
||
"A \n",
|
||
"4 1.0 4.0 2.519842 0.629961 0.250000\n",
|
||
"5 1.0 5.0 2.924018 0.584804 0.200000\n",
|
||
"6 1.0 6.0 3.301927 0.550321 0.166667\n",
|
||
"7 1.0 7.0 3.659306 0.522758 0.142857\n",
|
||
"8 1.0 8.0 4.000000 0.500000 0.125000\n",
|
||
".. ... ... ... ... ...\n",
|
||
"264 1.0 264.0 41.153106 0.155883 0.003788\n",
|
||
"265 1.0 265.0 41.256962 0.155687 0.003774\n",
|
||
"266 1.0 266.0 41.360688 0.155491 0.003759\n",
|
||
"269 1.0 269.0 41.671089 0.154911 0.003717\n",
|
||
"270 1.0 270.0 41.774300 0.154720 0.003704\n",
|
||
"\n",
|
||
"[264 rows x 5 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Common imports\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from IPython.display import display\n",
|
||
"import os\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(\"MassEval2016.dat\"),'r')\n",
|
||
"\n",
|
||
"\n",
|
||
"# Read the experimental data with Pandas\n",
|
||
"Masses = pd.read_fwf(infile, usecols=(2,3,4,6,11),\n",
|
||
" names=('N', 'Z', 'A', 'Element', 'Ebinding'),\n",
|
||
" widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1),\n",
|
||
" header=39,\n",
|
||
" index_col=False)\n",
|
||
"\n",
|
||
"# Extrapolated values are indicated by '#' in place of the decimal place, so\n",
|
||
"# the Ebinding column won't be numeric. Coerce to float and drop these entries.\n",
|
||
"Masses['Ebinding'] = pd.to_numeric(Masses['Ebinding'], errors='coerce')\n",
|
||
"Masses = Masses.dropna()\n",
|
||
"# Convert from keV to MeV.\n",
|
||
"Masses['Ebinding'] /= 1000\n",
|
||
"\n",
|
||
"# Group the DataFrame by nucleon number, A.\n",
|
||
"Masses = Masses.groupby('A')\n",
|
||
"# Find the rows of the grouped DataFrame with the maximum binding energy.\n",
|
||
"Masses = Masses.apply(lambda t: t[t.Ebinding==t.Ebinding.max()])\n",
|
||
"A = Masses['A']\n",
|
||
"Z = Masses['Z']\n",
|
||
"N = Masses['N']\n",
|
||
"Element = Masses['Element']\n",
|
||
"Energies = Masses['Ebinding']\n",
|
||
"\n",
|
||
"# Now we set up the design matrix X\n",
|
||
"X = np.zeros((len(A),5))\n",
|
||
"X[:,0] = 1\n",
|
||
"X[:,1] = A\n",
|
||
"X[:,2] = A**(2.0/3.0)\n",
|
||
"X[:,3] = A**(-1.0/3.0)\n",
|
||
"X[:,4] = A**(-1.0)\n",
|
||
"# Then nice printout using pandas\n",
|
||
"DesignMatrix = pd.DataFrame(X)\n",
|
||
"DesignMatrix.index = A\n",
|
||
"DesignMatrix.columns = ['1', 'A', 'A^(2/3)', 'A^(-1/3)', '1/A']\n",
|
||
"display(DesignMatrix)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"With $\\boldsymbol{\\beta}\\in {\\mathbb{R}}^{p\\times 1}$, it means that we will hereafter write our equations for the approximation as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\tilde{y}}= \\boldsymbol{X}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"throughout these lectures. \n",
|
||
"\n",
|
||
"With the above we use the design matrix to define the approximation $\\boldsymbol{\\tilde{y}}$ via the unknown quantity $\\boldsymbol{\\beta}$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\tilde{y}}= \\boldsymbol{X}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and in order to find the optimal parameters $\\beta_i$ instead of solving the above linear algebra problem, we define a function which gives a measure of the spread between the values $y_i$ (which represent hopefully the exact values) and the parameterized values $\\tilde{y}_i$, namely"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\boldsymbol{\\beta})=\\frac{1}{n}\\sum_{i=0}^{n-1}\\left(y_i-\\tilde{y}_i\\right)^2=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}}\\right)\\right\\},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"or using the matrix $\\boldsymbol{X}$ and in a more compact matrix-vector notation as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\boldsymbol{\\beta})=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)\\right\\}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This function is one possible way to define the so-called cost function.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"It is also common to define\n",
|
||
"the function $C$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\boldsymbol{\\beta})=\\frac{1}{2n}\\sum_{i=0}^{n-1}\\left(y_i-\\tilde{y}_i\\right)^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"since when taking the first derivative with respect to the unknown parameters $\\beta$, the factor of $2$ cancels out. \n",
|
||
"\n",
|
||
"The function"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\boldsymbol{\\beta})=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)\\right\\},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"can be linked to the variance of the quantity $y_i$ if we interpret the latter as the mean value. \n",
|
||
"When linking (see the discussion below) with the maximum likelihood approach below, we will indeed interpret $y_i$ as a mean value"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"y_{i}=\\langle y_i \\rangle = \\beta_0x_{i,0}+\\beta_1x_{i,1}+\\beta_2x_{i,2}+\\dots+\\beta_{n-1}x_{i,n-1}+\\epsilon_i,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\langle y_i \\rangle$ is the mean value. Keep in mind also that\n",
|
||
"till now we have treated $y_i$ as the exact value. Normally, the\n",
|
||
"response (dependent or outcome) variable $y_i$ the outcome of a\n",
|
||
"numerical experiment or another type of experiment and is thus only an\n",
|
||
"approximation to the true value. It is then always accompanied by an\n",
|
||
"error estimate, often limited to a statistical error estimate given by\n",
|
||
"the standard deviation discussed earlier. In the discussion here we\n",
|
||
"will treat $y_i$ as our exact value for the response variable.\n",
|
||
"\n",
|
||
"In order to find the parameters $\\beta_i$ we will then minimize the spread of $C(\\boldsymbol{\\beta})$, that is we are going to solve the problem"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in\n",
|
||
"{\\mathbb{R}}^{p}}}\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)\\right\\}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In practical terms it means we will require"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\beta_j} = \\frac{\\partial }{\\partial \\beta_j}\\left[ \\frac{1}{n}\\sum_{i=0}^{n-1}\\left(y_i-\\beta_0x_{i,0}-\\beta_1x_{i,1}-\\beta_2x_{i,2}-\\dots-\\beta_{n-1}x_{i,n-1}\\right)^2\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"which results in"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\beta_j} = -\\frac{2}{n}\\left[ \\sum_{i=0}^{n-1}x_{ij}\\left(y_i-\\beta_0x_{i,0}-\\beta_1x_{i,1}-\\beta_2x_{i,2}-\\dots-\\beta_{n-1}x_{i,n-1}\\right)\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"or in a matrix-vector form as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = 0 = \\boldsymbol{X}^T\\left( \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can rewrite"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = 0 = \\boldsymbol{X}^T\\left( \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}^T\\boldsymbol{y} = \\boldsymbol{X}^T\\boldsymbol{X}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and if the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$ is invertible we have the solution"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\beta} =\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We note also that since our design matrix is defined as $\\boldsymbol{X}\\in\n",
|
||
"{\\mathbb{R}}^{n\\times p}$, the product $\\boldsymbol{X}^T\\boldsymbol{X} \\in\n",
|
||
"{\\mathbb{R}}^{p\\times p}$. In the above case we have that $p \\ll n$,\n",
|
||
"in our case $p=5$ meaning that we end up with inverting a small\n",
|
||
"$5\\times 5$ matrix. This is a rather common situation, in many cases we end up with low-dimensional\n",
|
||
"matrices to invert. The methods discussed here and for many other\n",
|
||
"supervised learning algorithms like classification with logistic\n",
|
||
"regression or support vector machines, exhibit dimensionalities which\n",
|
||
"allow for the usage of direct linear algebra methods such as **LU** decomposition or **Singular Value Decomposition** (SVD) for finding the inverse of the matrix\n",
|
||
"$\\boldsymbol{X}^T\\boldsymbol{X}$. \n",
|
||
"\n",
|
||
"**Small question**: Do you think the example we have at hand here (the nuclear binding energies) can lead to problems in inverting the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$? What kind of problems can we expect? \n",
|
||
"\n",
|
||
"\n",
|
||
"The following matrix and vector relation will be useful here and for the rest of the course. Vectors are always written as boldfaced lower case letters and \n",
|
||
"matrices as upper case boldfaced letters."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"4\n",
|
||
"3\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": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"4\n",
|
||
"4\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": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"4\n",
|
||
"5\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": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial\\log{\\vert\\boldsymbol{A}\\vert}}{\\partial \\boldsymbol{A}}=(\\boldsymbol{A}^{-1})^T.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can then compute the second derivative of the cost function, which in our case is the second derivative\n",
|
||
"of the means squared error. This leads to"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial^2 C(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}^T\\partial \\boldsymbol{\\beta}} =\\frac{2}{n}\\boldsymbol{X}^T\\boldsymbol{X}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This quantity defines was what is called the Hessian matrix (the second derivative of a function we want to optimize).\n",
|
||
"\n",
|
||
"The Hessian matrix plays an important role and is defined for the mean squared error as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{H}=\\boldsymbol{X}^T\\boldsymbol{X}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The Hessian matrix for ordinary least squares is also proportional to\n",
|
||
"the covariance matrix. As we will see in the chapter on Ridge and Lasso regression, This means that we can use the Singular Value Decomposition of a matrix to find\n",
|
||
"the eigenvalues of the covariance matrix and the Hessian matrix in\n",
|
||
"terms of the singular values.\n",
|
||
"\n",
|
||
"\n",
|
||
"The residuals $\\boldsymbol{\\epsilon}$ are in turn given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\epsilon} = \\boldsymbol{y}-\\boldsymbol{\\tilde{y}} = \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and with"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}^T\\left( \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)= 0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we have"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}^T\\boldsymbol{\\epsilon}=\\boldsymbol{X}^T\\left( \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)= 0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"meaning that the solution for $\\boldsymbol{\\beta}$ is the one which minimizes the residuals. Later we will link this with the maximum likelihood approach.\n",
|
||
"\n",
|
||
"\n",
|
||
"Let us now return to our nuclear binding energies and simply code the above equations. \n",
|
||
"\n",
|
||
"\n",
|
||
"It is rather straightforward to implement the matrix inversion and obtain the parameters $\\boldsymbol{\\beta}$. After having defined the matrix $\\boldsymbol{X}$ we simply need to \n",
|
||
"write"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# matrix inversion to find beta\n",
|
||
"beta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(Energies)\n",
|
||
"# and then make the prediction\n",
|
||
"ytilde = X @ beta"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Alternatively, you can use the least squares functionality in **Numpy** as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"fit = np.linalg.lstsq(X, Energies, rcond =None)[0]\n",
|
||
"ytildenp = np.dot(fit,X.T)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"And finally we plot our fit with and compare with data"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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h85768x1Xfess85yt23btsvr9laXo8Vzzz3nfuITn3Cz2ayby+XcpUuXuo8++qjeY/3YU309+eSTo/L9NSpa5s8//zxz586lpqaGqqoqPvShD/H4448PdbGGlXXr1mEYBp/73Oc455xzWL58ueptD+677z6uv/56xowZA8Brr73GlClTmDRpEl6vl7PPPpvHH3+cLVu2kMlkOPbYYwE477zzRm3dvbfOUqkUzc3NfPOb3+Tss8/mtttuw3GcfutyNGlsbOTaa6/F7/fj8/mYPn06GzZs0HusH3uqr+bm5lH5/vIOdQHKYfv27TQ2NhYfjxkzhtdee20ISzT89PT0MG/ePG644QYymQxLly7lzDPPVL29x4033rjL4z29t7Zt27bb842NjWzbtq1s5RxO3ltn7e3tzJ07l29/+9tUVVXx+c9/nt/85jdUVVXtsS5HkxkzZhQ/3rBhA4899hif/vSn9R7rx57q65577uHFF18cde+vUdEyd113t+cMwxiCkgxfxx13HDfffDNVVVXU1dVx/vnnc9ttt+32OtXbrvp7b+k9179Jkybx4x//mPr6ekKhEJ/+9Kd55plnVGc7Wbt2LZ/97GdZtmwZkydP3u3zeo/tauf6mjZt2qh8f42KMG9qaqKtra34ePv27cUuPyl46aWXeOGFF4qPXddlwoQJqrd96O+99d7nW1tbVXe9Vq9ezRNPPFF87LouXq9XP6e9Xn75ZS6++GK+8pWvcO655+o9tg/vra/R+v4aFWH+gQ98gBdeeIGOjg7S6TRPPvkkJ5988lAXa1iJx+PcfPPNZLNZEokEDz30ELfccovqbR+OOeYY1q9fz8aNG7Ftm//+7//m5JNPZsKECQQCAV5++WUAHn74YdVdL9d1+c53vkN3dzf5fJ7/+q//4owzzui3LkeTrVu3csUVV/C9732PxYsXA3qP7c2e6mu0vr9GxZh5U1MTV199NUuXLiWfz3P++edz9NFHD3WxhpVTTjmFlStX8pGPfATHcbjooouYM2eO6m0fAoEAN910E1/84hfJZrMsWLCAD3/4wwB873vf47rrriOZTHLEEUewdOnSIS7t8DBz5kwuu+wyLrzwQizLYuHChZx11lkA/dblaHHHHXeQzWa56aabis9dcMEFeo/1o7/6Go3vL8Pd00CCiIiIVIxR0c0uIiIykinMRUREKpzCXEREpMIpzEVERCqcwlxERKTCKcxFREQqnMJcRESkwinMRUYQy7I488wzWbhw4aBds7u7m8MPP5xPfOITuzz/rW99i+985zsHfP0f//jHHHfccbv8Oeqoozj88MP53e9+d8DXFxkNRsUOcCKjxb333ktHRwc9PT2kUimqqqoO+JqrVq2isbGRf/zjH7S2thZPnlq1ahUXXXRRv1/3wx/+EIAvfvGLe73+FVdcwRVXXFF8nEwmueSSS6itrR3UX0pERjK1zEVGiHg8zo9+9CO++c1v4vF4WLt27aBc9+233+bII4/kxBNP5KmnngLAtm3WrFnDrFmzBuUefTKZDJdffjmhUIjbbrsNn883qNcXGanUMhcZIX7yk58wadIkzjrrLH7605+yevVqjjnmmN1e9/nPf754OMd7zZkzh9tvv32X59566y1mzpzJ1KlTefTRR7ngggtYt24djuMwffr0QSt/LpfjyiuvJJ/P85//+Z8EAoFBu7bISKcwFxkBNm3axN13380dd9wBwKGHHsrq1av3+Nr3hvW+rFq1itNOO425c+dyww03kEgkWLVqFTNmzBi0lrNlWXz5y1+mvb2dX/7yl4MyPCAymijMRUaAW265hQ984AOccMIJQCHMdz6ffqByuRzr1q1j1qxZVFdXc9RRR/GXv/yFVatWMXPmzN1ev3OrP5vNAvCLX/wC2HOrH8BxHK699lrWr1/P3XffTTQaPeByi4w2CnORCvfSSy/xxBNPEIlEOPHEE4HC2LNp7nlKzKWXXrrXbvaf//znxcdr1qwhGAwyadIkAE4//XSeeuop2traOOOMM3b7+p3Den8nwF1//fW89tprLF++nLq6ur2+VkT2TGEuUsFc1+Wmm27iggsu4Morryw+39zczMc//nGam5sZP378Ll+zc1jvy6pVqzj88MMxDAOAU089ldtuuw3TNPcZ0vvju9/9Ln/961/51a9+xZgxYw74eiKjlcJcpIL99re/pb29nWuuuYZwOFx8vqGhgXA4zOrVq3cL81KsWrVqlxnrEydOZMKECaxevXqP3eylWLNmDXfddRc+n4+zzjprl8+FQiGeffbZfnsXRGRXhuu67lAXQkRERAZOv/aKiIhUOIW5iIhIhVOYi4iIVDiFuYiISIVTmIuIiFQ4hbmIiEiFU5iLiIhUOIW5iIhIhfv/AaB42/HV2OLoAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<Figure size 576x396 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_136_0.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"Masses['Eapprox'] = ytilde\n",
|
||
"# Generate a plot comparing the experimental with the fitted values values.\n",
|
||
"fig, ax = plt.subplots()\n",
|
||
"ax.set_xlabel(r'$A = N + Z$')\n",
|
||
"ax.set_ylabel(r'$E_\\mathrm{bind}\\,/\\mathrm{MeV}$')\n",
|
||
"ax.plot(Masses['A'], Masses['Ebinding'], alpha=0.7, lw=2,\n",
|
||
" label='Ame2016')\n",
|
||
"ax.plot(Masses['A'], Masses['Eapprox'], alpha=0.7, lw=2, c='m',\n",
|
||
" label='Fit')\n",
|
||
"ax.legend()\n",
|
||
"save_fig(\"Masses2016OLS\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can easily test our fit by computing the $R2$ score that we discussed in connection with the functionality of **Scikit-Learn** in the introductory slides.\n",
|
||
"Since we are not using **Scikit-Learn** here we can define our own $R2$ function as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"def R2(y_data, y_model):\n",
|
||
" return 1 - np.sum((y_data - y_model) ** 2) / np.sum((y_data - np.mean(y_data)) ** 2)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and we would be using it as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 20,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.9549351910143222\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"print(R2(Energies,ytilde))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can easily add our **MSE** score as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 21,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.022022882954618378\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"def MSE(y_data,y_model):\n",
|
||
" n = np.size(y_model)\n",
|
||
" return np.sum((y_data-y_model)**2)/n\n",
|
||
"\n",
|
||
"print(MSE(Energies,ytilde))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and finally the relative error as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"A \n",
|
||
"4 0 1.093247\n",
|
||
"5 2 0.275341\n",
|
||
"6 7 0.060080\n",
|
||
"7 12 0.019587\n",
|
||
"8 17 0.117986\n",
|
||
" ... \n",
|
||
"264 3297 0.000148\n",
|
||
"265 3303 0.001263\n",
|
||
"266 3310 0.002948\n",
|
||
"269 3331 0.000599\n",
|
||
"270 3337 0.002526\n",
|
||
"Name: Ebinding, Length: 264, dtype: float64\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"def RelativeError(y_data,y_model):\n",
|
||
" return abs((y_data-y_model)/y_data)\n",
|
||
"print(RelativeError(Energies, ytilde))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### The $\\chi^2$ function\n",
|
||
"\n",
|
||
"Normally, the response (dependent or outcome) variable $y_i$ is the\n",
|
||
"outcome of a numerical experiment or another type of experiment and is\n",
|
||
"thus only an approximation to the true value. It is then always\n",
|
||
"accompanied by an error estimate, often limited to a statistical error\n",
|
||
"estimate given by the standard deviation discussed earlier. In the\n",
|
||
"discussion here we will treat $y_i$ as our exact value for the\n",
|
||
"response variable.\n",
|
||
"\n",
|
||
"Introducing the standard deviation $\\sigma_i$ for each measurement\n",
|
||
"$y_i$, we define now the $\\chi^2$ function (omitting the $1/n$ term)\n",
|
||
"as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\chi^2(\\boldsymbol{\\beta})=\\frac{1}{n}\\sum_{i=0}^{n-1}\\frac{\\left(y_i-\\tilde{y}_i\\right)^2}{\\sigma_i^2}=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}}\\right)^T\\frac{1}{\\boldsymbol{\\Sigma^2}}\\left(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}}\\right)\\right\\},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where the matrix $\\boldsymbol{\\Sigma}$ is a diagonal matrix with $\\sigma_i$ as matrix elements. \n",
|
||
"\n",
|
||
"\n",
|
||
"In order to find the parameters $\\beta_i$ we will then minimize the spread of $\\chi^2(\\boldsymbol{\\beta})$ by requiring"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\beta_j} = \\frac{\\partial }{\\partial \\beta_j}\\left[ \\frac{1}{n}\\sum_{i=0}^{n-1}\\left(\\frac{y_i-\\beta_0x_{i,0}-\\beta_1x_{i,1}-\\beta_2x_{i,2}-\\dots-\\beta_{n-1}x_{i,n-1}}{\\sigma_i}\\right)^2\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"which results in"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\beta_j} = -\\frac{2}{n}\\left[ \\sum_{i=0}^{n-1}\\frac{x_{ij}}{\\sigma_i}\\left(\\frac{y_i-\\beta_0x_{i,0}-\\beta_1x_{i,1}-\\beta_2x_{i,2}-\\dots-\\beta_{n-1}x_{i,n-1}}{\\sigma_i}\\right)\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"or in a matrix-vector form as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = 0 = \\boldsymbol{A}^T\\left( \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{\\beta}\\right).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where we have defined the matrix $\\boldsymbol{A} =\\boldsymbol{X}/\\boldsymbol{\\Sigma}$ with matrix elements $a_{ij} = x_{ij}/\\sigma_i$ and the vector $\\boldsymbol{b}$ with elements $b_i = y_i/\\sigma_i$. \n",
|
||
"\n",
|
||
"We can rewrite"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = 0 = \\boldsymbol{A}^T\\left( \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{\\beta}\\right),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{A}^T\\boldsymbol{b} = \\boldsymbol{A}^T\\boldsymbol{A}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and if the matrix $\\boldsymbol{A}^T\\boldsymbol{A}$ is invertible we have the solution"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\beta} =\\left(\\boldsymbol{A}^T\\boldsymbol{A}\\right)^{-1}\\boldsymbol{A}^T\\boldsymbol{b}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"If we then introduce the matrix"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{H} = \\left(\\boldsymbol{A}^T\\boldsymbol{A}\\right)^{-1},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we have then the following expression for the parameters $\\beta_j$ (the matrix elements of $\\boldsymbol{H}$ are $h_{ij}$)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\beta_j = \\sum_{k=0}^{p-1}h_{jk}\\sum_{i=0}^{n-1}\\frac{y_i}{\\sigma_i}\\frac{x_{ik}}{\\sigma_i} = \\sum_{k=0}^{p-1}h_{jk}\\sum_{i=0}^{n-1}b_ia_{ik}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We state without proof the expression for the uncertainty in the parameters $\\beta_j$ as (we leave this as an exercise)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\sigma^2(\\beta_j) = \\sum_{i=0}^{n-1}\\sigma_i^2\\left( \\frac{\\partial \\beta_j}{\\partial y_i}\\right)^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"resulting in"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\sigma^2(\\beta_j) = \\left(\\sum_{k=0}^{p-1}h_{jk}\\sum_{i=0}^{n-1}a_{ik}\\right)\\left(\\sum_{l=0}^{p-1}h_{jl}\\sum_{m=0}^{n-1}a_{ml}\\right) = h_{jj}!\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The first step here is to approximate the function $y$ with a first-order polynomial, that is we write"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"y=y(x) \\rightarrow y(x_i) \\approx \\beta_0+\\beta_1 x_i.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"By computing the derivatives of $\\chi^2$ with respect to $\\beta_0$ and $\\beta_1$ show that these are given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\beta_0} = -2\\left[ \\frac{1}{n}\\sum_{i=0}^{n-1}\\left(\\frac{y_i-\\beta_0-\\beta_1x_{i}}{\\sigma_i^2}\\right)\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\beta_1} = -\\frac{2}{n}\\left[ \\sum_{i=0}^{n-1}x_i\\left(\\frac{y_i-\\beta_0-\\beta_1x_{i}}{\\sigma_i^2}\\right)\\right]=0.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"For a linear fit (a first-order polynomial) we don't need to invert a matrix!! \n",
|
||
"Defining"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma = \\sum_{i=0}^{n-1}\\frac{1}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma_x = \\sum_{i=0}^{n-1}\\frac{x_{i}}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma_y = \\sum_{i=0}^{n-1}\\left(\\frac{y_i}{\\sigma_i^2}\\right),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma_{xx} = \\sum_{i=0}^{n-1}\\frac{x_ix_{i}}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma_{xy} = \\sum_{i=0}^{n-1}\\frac{y_ix_{i}}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we obtain"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\beta_0 = \\frac{\\gamma_{xx}\\gamma_y-\\gamma_x\\gamma_y}{\\gamma\\gamma_{xx}-\\gamma_x^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\beta_1 = \\frac{\\gamma_{xy}\\gamma-\\gamma_x\\gamma_y}{\\gamma\\gamma_{xx}-\\gamma_x^2}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This approach (different linear and non-linear regression) suffers\n",
|
||
"often from both being underdetermined and overdetermined in the\n",
|
||
"unknown coefficients $\\beta_i$. A better approach is to use the\n",
|
||
"Singular Value Decomposition (SVD) method discussed below. Or using\n",
|
||
"Lasso and Ridge regression. See below.\n",
|
||
"\n",
|
||
"\n",
|
||
"### Fitting an Equation of State for Dense Nuclear Matter\n",
|
||
"\n",
|
||
"Before we continue, let us introduce yet another example. We are going to fit the\n",
|
||
"nuclear equation of state using results from many-body calculations.\n",
|
||
"The equation of state we have made available here, as function of\n",
|
||
"density, has been derived using modern nucleon-nucleon potentials with\n",
|
||
"[the addition of three-body\n",
|
||
"forces](https://www.sciencedirect.com/science/article/pii/S0370157399001106). This\n",
|
||
"time the file is presented as a standard **csv** file.\n",
|
||
"\n",
|
||
"The beginning of the Python code here is similar to what you have seen\n",
|
||
"before, with the same initializations and declarations. We use also\n",
|
||
"**pandas** again, rather extensively in order to organize our data.\n",
|
||
"\n",
|
||
"The difference now is that we use **Scikit-Learn's** regression tools\n",
|
||
"instead of our own matrix inversion implementation."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 23,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Mean squared error: 12.36\n",
|
||
"Variance score: 1.00\n",
|
||
"Mean absolute error: 2.83\n",
|
||
"[ 0. 618.32047562 -861.13519106 1404.91549644] -11.057088709962727\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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jb3WyYo1mRRln8QExMa2YdzEngQG+nm7NPkBBQAREakXxaU1rFiVTk1xFWaziQEDohn1oy6YzWrvb4oUAERE5IrtP3yCdWv246quw9/Pwo+SutK7b5S3y5ILUAAQEZHLZhgGqd/ksXPrYXC4CA0NYOKknkS2b+Xt0sQDBQAREbksDqeLVesPkJtZBIZBVPswJk3uRXBIgLdLk4ugACAiIpestNLOio8zqThejslkomfvSEZf1x2LVQ/zaS4UAERE5JJkHysj5ZNMnBW1WK1mho/oxKDBHTS4TzOjACAiIhfFMAy2fXucHZuzoc5FUJAfY8f3JLZTG2+XJpdBAUBERDxyOF188tlBctILMRkG7WwhTJqsh/k0ZwoAIiJyQeVVtSxflU758QrMJhM9erbjujFxWNXe36wpAIiIyHkdPlbGJ6szcVTWYrWYGTayE/Fq728RFABEROScduw5xldfZIPjVHv/uAk96RjbxttlST1RABARkTM4nC5SPj9EzncFoPb+FksBQERE3MqralnxcQZlx07d3989rh3Xj1V7f0ukACAiIgAcOV7G6tWZOCpqsVjMDBsRy+CrYtTe30IpAIiICGl7j7N1Y9Z/2/vH96Sj7u9v0RQARER8mNN1qr0/e++p9v6IdiFMTu5NWJja+1s6BQARER9VUV3L8lWn2vs53d4/Ru39PkMBQETEB33//n6LxczQ4bFcNUTt/b5EAUBExIcYhsH2b4+xfVOOu71/7ISexOr+fp+jACAi4iMcThcfr9vP0X3F7vv7Jyf3JjRU7f2+SAFARMQHnCyvYcVHGVQWVWIymejZJ5LR13XHYlF7v69q0D3/pz/9icmTJzN58mReeOEFAFJTU0lOTmbcuHG89NJL7vemp6czbdo0xo8fz29+8xscDgcAeXl53H777UyYMIH777+fysrKhixZRKTFOXj4JO++s4vKokqsVgs/urYbY8bG6eTv4y5q79fU1JCZmYlhGNTU1FzUglNTU9m0aRPLly9nxYoV7N27l1WrVvHkk0+yePFiVq9ezZ49e9i4cSMAjz76KE899RRr1qzBMAyWLl0KwDPPPMOMGTNISUmhf//+LF68+DJ/VBER32IYBl9uO0LKynScNQ5CQgO4aWo/Bgxo7+3SpAnwGAB27tzJmDFjmDVrFvn5+SQlJfH11197XLDNZuPxxx/H398f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WCz8/Oc/56677jrrfTNnzmT79u2kpaXx3HPPsWzZMu655x5mzJjBhx9+yJEjR5g0aRK/+tWvePzxx0lLS2PQoEH88Y9/pHXr1thsNpYsWXLOGmpra/H39wcgLCyMoKCghvyRRXyOAoCInOWBBx7g6quvZvPmzaSlpXH33XczZcqUs9731ltvceedd3LDDTdw6623uqevXbuWf/zjHzidTm666SbS09NZsGAB3bt3595772XJkiU8+OCDF6whIyOD3/3ud5jNZgICAnjuuefq/ecU8WUKACJyhs8++wyA++67D4CRI0cSFRVFVlbWRS/jjjvuoF27dgAkJCQQHh5O3759ARg7dixbtmzxuIyBAwfy9ttvX2r5InKRdBeAiJxhw4YNXH/99e7XLpeL8vJyIiIiLnoZ/zn5AwQEBJzxOjAwkKqqqvopVkQumwKAiJxh165dtGnTxv1669athIeH061bN+8VJSL1TgFARNzq6urIzs5mzZo12O129u/fzzPPPMPDDz/s7dJEpJ6pD4CIuB08eJCOHTsSFxfHqFGjiIiI4P7772fChAneLk1E6pmGAhYRtw8//JB169bxyiuvnHP+gAED8Pf358477+SXv/xl4xb3PT/72c/YuXMnAwcO5J///KfX6hBpznQFQETcMjIyLtjW/+233zZiNef3j3/8w9sliDR76gMgIm779u1TZz8RH6EmABERER+kKwAiIiI+SAFARETEBykAiIiI+CAFABERER+kACAiIuKDFABERER8kAKAiIiID1IAEBER8UEKACIiIj7o/wG/u0XiRQqQvQAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<Figure size 576x396 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_183_1.png"
|
||
}
|
||
},
|
||
"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",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import sklearn.linear_model as skl\n",
|
||
"from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error\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",
|
||
"X = np.zeros((len(Density),4))\n",
|
||
"X[:,3] = Density**(4.0/3.0)\n",
|
||
"X[:,2] = Density\n",
|
||
"X[:,1] = Density**(2.0/3.0)\n",
|
||
"X[:,0] = 1\n",
|
||
"\n",
|
||
"# We use now Scikit-Learn's linear regressor and ridge regressor\n",
|
||
"# OLS part\n",
|
||
"clf = skl.LinearRegression().fit(X, Energies)\n",
|
||
"ytilde = clf.predict(X)\n",
|
||
"EoS['Eols'] = ytilde\n",
|
||
"# The mean squared error \n",
|
||
"print(\"Mean squared error: %.2f\" % mean_squared_error(Energies, ytilde))\n",
|
||
"# Explained variance score: 1 is perfect prediction \n",
|
||
"print('Variance score: %.2f' % r2_score(Energies, ytilde))\n",
|
||
"# Mean absolute error \n",
|
||
"print('Mean absolute error: %.2f' % mean_absolute_error(Energies, ytilde))\n",
|
||
"print(clf.coef_, clf.intercept_)\n",
|
||
"\n",
|
||
"\n",
|
||
"fig, ax = plt.subplots()\n",
|
||
"ax.set_xlabel(r'$\\rho[\\mathrm{fm}^{-3}]$')\n",
|
||
"ax.set_ylabel(r'Energy per particle')\n",
|
||
"ax.plot(EoS['Density'], EoS['Energy'], alpha=0.7, lw=2,\n",
|
||
" label='Theoretical data')\n",
|
||
"ax.plot(EoS['Density'], EoS['Eols'], alpha=0.7, lw=2, c='m',\n",
|
||
" label='OLS')\n",
|
||
"ax.legend()\n",
|
||
"save_fig(\"EoSfitting\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The above simple polynomial in density $\\rho$ gives an excellent fit\n",
|
||
"to the data. \n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"## Splitting our Data in Training and Test data\n",
|
||
"\n",
|
||
"\n",
|
||
"It is normal in essentially all Machine Learning studies to split the\n",
|
||
"data in a training set and a test set (sometimes also an additional\n",
|
||
"validation set). **Scikit-Learn** has an own function for this. 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. We will\n",
|
||
"postpone a discussion of this splitting to the end of these notes and\n",
|
||
"our discussion of the so-called **bias-variance** tradeoff. Here we\n",
|
||
"limit ourselves to repeat the above equation of state fitting example\n",
|
||
"but now splitting the data into a training set and a test set.\n",
|
||
"\n",
|
||
"Let us study some examples. The first code here takes a simple\n",
|
||
"one-dimensional second-order polynomial and we fit it to a\n",
|
||
"second-order polynomial. Depending on the strength of the added noise,\n",
|
||
"the various measures like the $R2$ score or the mean-squared error,\n",
|
||
"the fit becomes better or worse."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 24,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"[1.92453978 0.40268983 4.64949142]\n",
|
||
"Training R2\n",
|
||
"0.9955243414157036\n",
|
||
"Training MSE\n",
|
||
"0.010551175036576054\n",
|
||
"Test R2\n",
|
||
"0.9970085524282044\n",
|
||
"Test MSE\n",
|
||
"0.008178361333005103\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import os\n",
|
||
"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",
|
||
"\n",
|
||
"\n",
|
||
"def R2(y_data, y_model):\n",
|
||
" return 1 - np.sum((y_data - y_model) ** 2) / np.sum((y_data - np.mean(y_data)) ** 2)\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",
|
||
"x = np.random.rand(100)\n",
|
||
"y = 2.0+5*x*x+0.1*np.random.randn(100)\n",
|
||
"\n",
|
||
"\n",
|
||
"# The design matrix now as function of a given polynomial\n",
|
||
"X = np.zeros((len(x),3))\n",
|
||
"X[:,0] = 1.0\n",
|
||
"X[:,1] = x\n",
|
||
"X[:,2] = x**2\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",
|
||
"# matrix inversion to find beta\n",
|
||
"beta = np.linalg.inv(X_train.T @ X_train) @ X_train.T @ y_train\n",
|
||
"print(beta)\n",
|
||
"# and then make the prediction\n",
|
||
"ytilde = X_train @ beta\n",
|
||
"print(\"Training R2\")\n",
|
||
"print(R2(y_train,ytilde))\n",
|
||
"print(\"Training MSE\")\n",
|
||
"print(MSE(y_train,ytilde))\n",
|
||
"ypredict = X_test @ beta\n",
|
||
"print(\"Test R2\")\n",
|
||
"print(R2(y_test,ypredict))\n",
|
||
"print(\"Test MSE\")\n",
|
||
"print(MSE(y_test,ypredict))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Alternatively, you could write your own test-train splitting function as shown here."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 25,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# equivalently in numpy\n",
|
||
"def train_test_split_numpy(inputs, labels, train_size, test_size):\n",
|
||
" n_inputs = len(inputs)\n",
|
||
" inputs_shuffled = inputs.copy()\n",
|
||
" labels_shuffled = labels.copy()\n",
|
||
"\n",
|
||
" np.random.shuffle(inputs_shuffled)\n",
|
||
" np.random.shuffle(labels_shuffled)\n",
|
||
"\n",
|
||
" train_end = int(n_inputs*train_size)\n",
|
||
" X_train, X_test = inputs_shuffled[:train_end], inputs_shuffled[train_end:]\n",
|
||
" Y_train, Y_test = labels_shuffled[:train_end], labels_shuffled[train_end:]\n",
|
||
"\n",
|
||
" return X_train, X_test, Y_train, Y_test"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"But since **scikit-learn** has its own function for doing this and since\n",
|
||
"it interfaces easily with **tensorflow** and other libraries, we\n",
|
||
"normally recommend using the latter functionality.\n",
|
||
"\n",
|
||
"\n",
|
||
"As another example, we apply the training and testing split to \n",
|
||
"to the above equation of state fitting example\n",
|
||
"but now splitting the data into a training set and a test set."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 26,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Training R2\n",
|
||
"0.9999911950922993\n",
|
||
"Training MSE\n",
|
||
"3.8076601164885733\n",
|
||
"Test R2\n",
|
||
"0.9999511330806471\n",
|
||
"Test MSE\n",
|
||
"24.486869065060258\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import os\n",
|
||
"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",
|
||
"# 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",
|
||
"def R2(y_data, y_model):\n",
|
||
" return 1 - np.sum((y_data - y_model) ** 2) / np.sum((y_data - np.mean(y_data)) ** 2)\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",
|
||
"infile = open(data_path(\"EoS.csv\"),'r')\n",
|
||
"\n",
|
||
"# Read the EoS data as csv file and organized 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",
|
||
"X = np.zeros((len(Density),5))\n",
|
||
"X[:,0] = 1\n",
|
||
"X[:,1] = Density**(2.0/3.0)\n",
|
||
"X[:,2] = Density\n",
|
||
"X[:,3] = Density**(4.0/3.0)\n",
|
||
"X[:,4] = Density**(5.0/3.0)\n",
|
||
"# We split the data in test and training data\n",
|
||
"X_train, X_test, y_train, y_test = train_test_split(X, Energies, test_size=0.2)\n",
|
||
"# matrix inversion to find beta\n",
|
||
"beta = np.linalg.inv(X_train.T.dot(X_train)).dot(X_train.T).dot(y_train)\n",
|
||
"# and then make the prediction\n",
|
||
"ytilde = X_train @ beta\n",
|
||
"print(\"Training R2\")\n",
|
||
"print(R2(y_train,ytilde))\n",
|
||
"print(\"Training MSE\")\n",
|
||
"print(MSE(y_train,ytilde))\n",
|
||
"ypredict = X_test @ beta\n",
|
||
"print(\"Test R2\")\n",
|
||
"print(R2(y_test,ypredict))\n",
|
||
"print(\"Test MSE\")\n",
|
||
"print(MSE(y_test,ypredict))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## The Boston housing data example\n",
|
||
"\n",
|
||
"The Boston housing \n",
|
||
"data set was originally a part of UCI Machine Learning Repository\n",
|
||
"and has been removed now. The data set is now included in **Scikit-Learn**'s \n",
|
||
"library. There are 506 samples and 13 feature (predictor) variables\n",
|
||
"in this data set. The objective is to predict the value of prices of\n",
|
||
"the house using the features (predictors) listed here.\n",
|
||
"\n",
|
||
"The features/predictors are\n",
|
||
"1. CRIM: Per capita crime rate by town\n",
|
||
"\n",
|
||
"2. ZN: Proportion of residential land zoned for lots over 25000 square feet\n",
|
||
"\n",
|
||
"3. INDUS: Proportion of non-retail business acres per town\n",
|
||
"\n",
|
||
"4. CHAS: Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)\n",
|
||
"\n",
|
||
"5. NOX: Nitric oxide concentration (parts per 10 million)\n",
|
||
"\n",
|
||
"6. RM: Average number of rooms per dwelling\n",
|
||
"\n",
|
||
"7. AGE: Proportion of owner-occupied units built prior to 1940\n",
|
||
"\n",
|
||
"8. DIS: Weighted distances to five Boston employment centers\n",
|
||
"\n",
|
||
"9. RAD: Index of accessibility to radial highways\n",
|
||
"\n",
|
||
"10. TAX: Full-value property tax rate per USD10000\n",
|
||
"\n",
|
||
"11. B: $1000(Bk - 0.63)^2$, where $Bk$ is the proportion of [people of African American descent] by town\n",
|
||
"\n",
|
||
"12. LSTAT: Percentage of lower status of the population\n",
|
||
"\n",
|
||
"13. MEDV: Median value of owner-occupied homes in USD 1000s\n",
|
||
"\n",
|
||
"## Housing data, the code\n",
|
||
"We start by importing the libraries"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 27,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt \n",
|
||
"\n",
|
||
"import pandas as pd \n",
|
||
"import seaborn as sns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and load the Boston Housing DataSet from **Scikit-Learn**"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 28,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/utils/deprecation.py:87: FutureWarning: Function load_boston is deprecated; `load_boston` is deprecated in 1.0 and will be removed in 1.2.\n",
|
||
"\n",
|
||
" The Boston housing prices dataset has an ethical problem. You can refer to\n",
|
||
" the documentation of this function for further details.\n",
|
||
"\n",
|
||
" The scikit-learn maintainers therefore strongly discourage the use of this\n",
|
||
" dataset unless the purpose of the code is to study and educate about\n",
|
||
" ethical issues in data science and machine learning.\n",
|
||
"\n",
|
||
" In this special case, you can fetch the dataset from the original\n",
|
||
" source::\n",
|
||
"\n",
|
||
" import pandas as pd\n",
|
||
" import numpy as np\n",
|
||
"\n",
|
||
"\n",
|
||
" data_url = \"http://lib.stat.cmu.edu/datasets/boston\"\n",
|
||
" raw_df = pd.read_csv(data_url, sep=\"\\s+\", skiprows=22, header=None)\n",
|
||
" data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])\n",
|
||
" target = raw_df.values[1::2, 2]\n",
|
||
"\n",
|
||
" Alternative datasets include the California housing dataset (i.e.\n",
|
||
" :func:`~sklearn.datasets.fetch_california_housing`) and the Ames housing\n",
|
||
" dataset. You can load the datasets as follows::\n",
|
||
"\n",
|
||
" from sklearn.datasets import fetch_california_housing\n",
|
||
" housing = fetch_california_housing()\n",
|
||
"\n",
|
||
" for the California housing dataset and::\n",
|
||
"\n",
|
||
" from sklearn.datasets import fetch_openml\n",
|
||
" housing = fetch_openml(name=\"house_prices\", as_frame=True)\n",
|
||
"\n",
|
||
" for the Ames housing dataset.\n",
|
||
" \n",
|
||
" warnings.warn(msg, category=FutureWarning)\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename', 'data_module'])"
|
||
]
|
||
},
|
||
"execution_count": 28,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.datasets import load_boston\n",
|
||
"\n",
|
||
"boston_dataset = load_boston()\n",
|
||
"\n",
|
||
"# boston_dataset is a dictionary\n",
|
||
"# let's check what it contains\n",
|
||
"boston_dataset.keys()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Then we invoke Pandas"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 29,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"boston = pd.DataFrame(boston_dataset.data, columns=boston_dataset.feature_names)\n",
|
||
"boston.head()\n",
|
||
"boston['MEDV'] = boston_dataset.target"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and preprocess the data"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 30,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"CRIM 0\n",
|
||
"ZN 0\n",
|
||
"INDUS 0\n",
|
||
"CHAS 0\n",
|
||
"NOX 0\n",
|
||
"RM 0\n",
|
||
"AGE 0\n",
|
||
"DIS 0\n",
|
||
"RAD 0\n",
|
||
"TAX 0\n",
|
||
"PTRATIO 0\n",
|
||
"B 0\n",
|
||
"LSTAT 0\n",
|
||
"MEDV 0\n",
|
||
"dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 30,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# check for missing values in all the columns\n",
|
||
"boston.isnull().sum()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can then visualize the data"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 31,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/seaborn/distributions.py:2619: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms).\n",
|
||
" warnings.warn(msg, FutureWarning)\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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BiWn06kf/ehH+sY3viGv16vrr79et9xyi9mxotYzzzwjr9erH/3oR1233XPPPRyDAXb99ddrz549uvPOO2Wz2XTzzTdr0aJFSktL4ziYbPXq1Xr44YfV2tqqsWPHavny5WZHimrz58/v+lkIBoO69957NW3aNN6jB9CkSZP0la98Rffee698Pp+uueYafeELX1BBQUGfXo8sxqUGNgEAAABgGAYAAADQHcoyAAAA0A3KMgAAANANyjIAAADQDcoyAAAA0A2mjgOACFNeXq6bbrpJ06dP19q1ay/Y9q1vfUsvv/yytm3bpjlz5qiwsFBW64XnRZ544glJ0oIFC1RYWChJCgaDcjgcWr58ue68806dOXNGt956q7Zs2aKsrKwL9l+8eLG+8Y1v6Oabbw7h/yUAhAfKMgBEIKfTqZMnT6qiokJ5eXmSpLa2tq5FKD7xi1/8oms1q08rLy9XbGysNmzY0HVbRUWF7r//fsXFxWnhwoW65ppr9PLLL+tv/uZvuu6za9cuNTc366abbgrR/xkAhBeGYQBABLLZbLr11lu1cePGrts2b97cpxKbl5enBx54QM8884wk6d5779XLL7+sT0/Hv27dOn3+85+/YPlYAIhmlGUAiFB33nmnfvvb33Z9vX79en32s5+94D733XeflixZ0vXnb//2by/7mMXFxTp8+LAk6brrrpNhGPr4448lnV/Od8uWLfrc5z7Xz/8nABC+GIYBABFq/Pjxslqt2r9/v9LT09Xa2to1BvkT3Q3D6I7FYlFsbKwkyWq16p577tFvfvMbzZo1S7/97W81b948paen9+v/BwCEM8oyAESwO+64Q7/97W+VlpamJUuW9Pnx9u3bd0HhXrZsmW655Ra1tLRo3bp1+t73vtfn5wCASEJZBoAItmTJEt19991KSUnRL3/5yz491okTJ/Tkk0/qoYce6rotNTVV8+fP109+8hPZbDZNnjy5j4kBILJQlgEggmVlZWnkyJFKTExUSkrKRdvvu+++i6aO++Y3v6mRI0eqo6Oj62y01WqV0+nUN7/5Td1www0X3P/ee+/V5z73Of3whz8M1f8GAIQti/Hpy5wBAAAAdGE2DAAAAKAblGUAAACgG5RlAAAAoBuUZQAAAKAblGUAAACgG5RlAAAAoBuUZQAAAKAb/z9mAdtQEKgqHwAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<Figure size 842.4x595.44 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_199_1.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# set the size of the figure\n",
|
||
"sns.set(rc={'figure.figsize':(11.7,8.27)})\n",
|
||
"\n",
|
||
"# plot a histogram showing the distribution of the target values\n",
|
||
"sns.distplot(boston['MEDV'], bins=30)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"It is now useful to look at the correlation matrix"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 32,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<AxesSubplot:>"
|
||
]
|
||
},
|
||
"execution_count": 32,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 842.4x595.44 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_201_1.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# compute the pair wise correlation for all columns \n",
|
||
"correlation_matrix = boston.corr().round(2)\n",
|
||
"# use the heatmap function from seaborn to plot the correlation matrix\n",
|
||
"# annot = True to print the values inside the square\n",
|
||
"sns.heatmap(data=correlation_matrix, annot=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"From the above coorelation plot we can see that **MEDV** is strongly correlated to **LSTAT** and **RM**. We see also that **RAD** and **TAX** are stronly correlated, but we don't include this in our features together to avoid multi-colinearity"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 33,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABJEAAAFRCAYAAADEnjyhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAACCYElEQVR4nO3de3xU9Z0//teZmdwkpGAMphR0/UYhkIqi20sKGmBRiUKK1P68dAFLi/ZBV/2y++Wrde3lt9tVLO2vVl36XSlYtIWqXURDAQtFU4359uINNkGsqTcWIzFCwyWZZGbO74/0DGfOnPuc65zX8x8lc/ucc2bOeX/e5/N5fwRRFEUQERERERERERHpiPndACIiIiIiIiIiCj4mkYiIiIiIiIiIyBCTSEREREREREREZIhJJCIiIiIiIiIiMsQkEhERERERERERGWISiYiIiIiIiIiIDCX8bgARRcPBgwexYMECvPLKK3mPrVu3Dtu2bYMoishkMrjkkkuwcuVKDA4OYvHixQCAkydP4oMPPsA555wDAPjc5z6H22+/HcPDw5g9ezYmT56M9evXAwAeeugh/OpXvwIAvPvuuxg7dixGjx4NAHjggQdw1llnebHJRERERKEwefJkTJo0CbFYDIIgYGBgAJWVlfjOd76D888/H1u2bME3vvENrFixArfddlv2daIoYu7cuaioqMC2bdt83AIi8gqTSETkqx07dmD37t147LHHUF5ejmQyiVtvvRUPPvgg/vEf/xFPPfUUAOB3v/sd/vVf/zX7b8muXbswefJkdHZ2oru7G3V1dbjppptw0003AQAWL16ML33pS5g3b57n20ZEREQUFhs3bsTpp5+e/ff69evx3e9+F4899hgAYPz48Whtbc1JIv3xj3/E4OAgKioqPG8vEfmD09mIyFe9vb1Ip9MYHBwEAJSVleGb3/wm5s6da+r1mzdvxty5c3HllVdi48aNbjaViIiIKBJSqRTef/99fOxjH8v+bdKkSTjttNPw8ssvZ//25JNPoqWlxY8mEpFPmEQiIl9dffXVqKqqwsyZM3Httddi9erVeP/99zFt2jTD17755pt49dVX0dzcjIULF+Kpp57CkSNHPGg1ERERUXFZunQpWlpaMHPmTFxxxRUAgHvuuSfnOVK8BQADAwN46aWXcMkll3jeViLyD5NIROSr0aNHY8OG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ZyMiKkDYh4oXQ72hsB8DIiIKLqevMV5es4rhGk9EwcORSEREBQj7UHHprmeYp4KF/RgQEVFwOX2N8fKapbzGc3U2InICk0hERAUohqHiVuorBFExHAMiIgomp68xXl+z5Nd4rbqCRERWcDobEVEBOFTcfzwGRETkFqevMbxmEVHYcSQSEVEBimE6WNjxGBARkVucvsbwmkVEYcckEhFRgcI+HawY8BgQEZFbnL7G8JpFRGHG6WxERERERERERGSISSQiIiIiIiIiIjLEJBIRERERERERERliEomIiIiIiIiIiAwxiURERERERERERIaYRCIiIiIiIiIiIkNMIhERERERERERkaGE3w1wQiwm+N0E30R524Fob3+Utx3g9kd5+6O87UC0tj9K2xo2UT02Ud1uL3Efu4v7113cv+7jPnaXtH/19rMgiqLoVYOIiIiIiIiIiCicOJ2NiIiIiIiIiIgMMYlERERERERERESGmEQiIiIiIiIiIiJDTCIREREREREREZEhJpGIiIiIiIiIiMgQk0hERERERERERGSISSQiIiIiIiIiIjLEJBIRERERERERERliEomIiIiIiIiIiAwxiURERERERERERIaYRCIiIiIiIiIiIkNMIhERERERERERkaHQJpFaW1tx5ZVX4rLLLsPPf/5zv5vjuSVLluCqq67C5z//eXz+85/Ha6+95neTXHf8+HHMnz8fBw8eBAC8+OKLWLBgAS6//HL88Ic/9Ll17lNu/ze+8Q1cfvnl2e/Arl27fG6hOx588EFcddVVuOqqq/C9730PQLSOvdr2R+XYA8CPfvQjXHnllbjqqqvw8MMPA4jO8Vfb9igde6Kguffee3HHHXf43YyiFMW41kt79uzBokWLMG/ePHz3u9/1uzlF54knnsh+dz//+c/j4osvxr/8y7/43ayi8tRTT2Xj4Xvvvdfv5hSdhx56CFdccQUWLFiAH//4x8YvEEOop6dHnD17tnjkyBHxxIkT4oIFC8Q//elPfjfLM5lMRpwxY4Y4PDzsd1M88+qrr4rz588XGxoaxPfee08cGBgQm5qaxHfffVccHh4Wly1bJj733HN+N9M1yu0XRVGcP3+++MEHH/jcMne1t7eL1157rZhMJsWhoSFxyZIlYmtra2SOvdr2//rXv47EsRdFUfzd734nXnfddeLw8LA4MDAgzp49W9y/f38kjr/atnd3d0fm2BMFzYsvvih+5jOfEW+//Xa/m1J0ohjXeundd98VZ86cKb7//vvi0NCQeP311xfldTMo3njjDfGyyy4T+/r6/G5K0Th58qT4qU99Suzr6xOHh4fFa665Rmxvb/e7WUWjvb1dnD9/vnjs2DExlUqJN998s/jMM8/oviaUI5FefPFFfPazn8WYMWNw2mmn4YorrsDOnTv9bpZn/vznP0MQBCxfvhwtLS342c9+5neTXPf444/j29/+NsaNGwcA2Lt3L84++2xMnDgRiUQCCxYsKOrvgHL7T548iUOHDuGb3/wmFixYgPvvvx+ZTMbnVjqvpqYGd9xxB0pLS1FSUoK6ujq8/fbbkTn2att/6NChSBx7APj0pz+NRx55BIlEAn19fUin0+jv74/E8Vfb9rKyssgce6IgOXr0KH74wx/ia1/7mt9NKUpRjGu9tGvXLlx55ZWora1FSUkJfvjDH+KCCy7wu1lF6zvf+Q5WrlyJ008/3e+mFI10Oo1MJoOBgQGkUimkUimUlZX53ayi0dXVhZkzZ6KyshLxeByXXHIJdu/erfuaUCaRDh8+jJqamuy/x40bhw8++MDHFnmrv78fjY2N+Pd//3f89Kc/xS9+8Qu0t7f73SxX/du//Rv+9m//NvvvqH0HlNvf19eHz372s7j77rvx+OOP449//CN++ctf+thCd5x33nm48MILAQBvv/02tm/fDkEQInPs1bb/kksuicSxl5SUlOD+++/HVVddhcbGxkj99pXbnk6nI3XsiYLiW9/6FlauXImqqiq/m1KUohjXeumdd95BOp3GV77yFbS0tGDTpk342Mc+5nezitKLL76IwcFBNDc3+92UolJZWYnbbrsNzc3NuPTSS/GJT3wCF110kd/NKhoNDQ144YUXcPToUSSTSezZswcffvih7mtCmUQSRTHvb4Ig+NASf0yfPh3f+973cNppp+H000/HNddcg7a2Nr+b5amofwcmTpyIf//3f0d1dTUqKiqwePHiov4O/OlPf8KyZctw++2346yzzsp7vNiPvXz7/8f/+B+ROvYAcOutt6KjowPvv/8+3n777bzHi/n4y7e9o6MjcseeyG9PPPEEPv7xj6OxsdHvphQtxrXuSqfT6OjowJo1a/D4449j3759ePLJJ/1uVlH6xS9+gS9/+ct+N6PovP766/jP//xPPPvss3jhhRcQi8Wwfv16v5tVNBobG7Fo0SIsXrwYX/3qV3HxxRejpKRE9zWhTCKdeeaZOdmxw4cPZ6f5RMEf//hHdHR0ZP8tiiISiYSPLfJe1L8DBw4cwDPPPJP9dzF/B1566SXceOON+Kd/+idcffXVkTv2yu2P0rHv7u7G/v37AQAVFRW4/PLL8bvf/S4Sx19t27dv3x6ZY08UFNu3b0d7ezs+//nP4/7778eePXtw9913+92sosK41l1nnHEGGhsbcfrpp6O8vBx/93d/h7179/rdrKIzNDSEP/zhD5gzZ47fTSk6L7zwAhobG1FdXY3S0lIsWrQIv//97/1uVtE4fvw4LrvsMrS2tuLRRx9FRUUFJk6cqPuaUCaRPve5z6GjowMfffQRBgYG8Otf/xqXXnqp383yzLFjx/C9730PyWQSx48fx5NPPonLLrvM72Z56oILLsBbb72VHaK7bdu2SH0HRFHE3Xffjb/85S8YHh7GY489VpTfgffffx9f//rX8f3vfx9XXXUVgGgde7Xtj8qxB4CDBw/irrvuwtDQEIaGhvCb3/wG1113XSSOv9q2f+pTn4rMsScKiocffhjbtm3DU089hVtvvRVz5szBnXfe6XezigrjWnfNnj0bL7zwAvr7+5FOp/H888+joaHB72YVnQMHDuBv/uZvcNppp/ndlKJTX1+PF198ESdPnoQoitizZw/OP/98v5tVNA4ePIivf/3rSKVSOHbsGJ544gnDKZmhTPOfeeaZWLlyJZYsWYLh4WFcc801mDZtmt/N8szs2bPx2muvYeHChchkMrjhhhswffp0v5vlqbKyMqxevRq33HILkskkmpqaMG/ePL+b5Zn6+nrcdNNNuP7665FKpXD55Zdj/vz5fjfLcevXr0cymcTq1auzf7vuuusic+y1tj8Kxx4Ampqasue6eDyOyy+/HFdddRVOP/30oj/+atv+D//wDxg7dmwkjj0RRQfjWnddcMEF+OpXv4obbrgBw8PDmDFjBr7whS/43ayi895776G2ttbvZhSlmTNnoqurC4sWLUJJSQnOP/983HTTTX43q2jU19fj8ssvR0tLC9LpNG688UZcfPHFuq8RRLXiMkRERERERERERDKhnM5GRERERERERETeYhKJiIiIiIiIiIgMMYlERERERERERESGmEQiIiIiIiIiIiJDTCIREREREREREZGhhN8NIKJoOHjwIBYsWIBXXnkl77F169Zh27ZtEEURmUwGl1xyCVauXInBwUEsXrwYAHDy5El88MEHOOeccwAAn/vc53D77bdjeHgYs2fPxuTJk7F+/XoAwEMPPYRf/epXAIB3330XY8eOxejRowEADzzwAM466ywvNpmIiIgoFCZPnoxJkyYhFotBEAQMDAygsrIS3/nOd3D++edjy5Yt+MY3voEVK1bgtttuy75OFEXMnTsXFRUV2LZtm49bQEReYRKJiHy1Y8cO7N69G4899hjKy8uRTCZx66234sEHH8Q//uM/4qmnngIA/O53v8O//uu/Zv8t2bVrFyZPnozOzk50d3ejrq4ON910E2666SYAwOLFi/GlL30J8+bN83zbiIiIiMJi48aNOP3007P/Xr9+Pb773e/iscceAwCMHz8era2tOUmkP/7xjxgcHERFRYXn7SUif3A6GxH5qre3F+l0GoODgwCAsrIyfPOb38TcuXNNvX7z5s2YO3currzySmzcuNHNphIRERFFQiqVwvvvv4+Pfexj2b9NmjQJp512Gl5++eXs35588km0tLT40UQi8gmTSETkq6uvvhpVVVWYOXMmrr32WqxevRrvv/8+pk2bZvjaN998E6+++iqam5uxcOFCPPXUUzhy5IgHrSYiIiIqLkuXLkVLSwtmzpyJK664AgBwzz335DxHircAYGBgAC+99BIuueQSz9tKRP5hEomIfDV69Ghs2LABO3bswDXXXIO+vj7cdNNNWLNmjeFrN2/ejFmzZmHMmDGYNm0aJkyYkB1yTURERETmbdy4EU8//TQeeughDA4OYvr06aiurs55zoIFC7Br1y4MDw9j165dmDNnDuLxuE8tJiI/MIlERL5at24dXn75ZUycOBFf/OIXsWbNGqxbtw6bNm3Sfd3JkyexdetWvPTSS5gzZw7mzJmD3t5e/PznP8fw8LBHrSciIiIqLlOnTsU3vvEN3HXXXTh48GDOYzU1NZg6dSra2tqwdetWXH311T61koj8wiQSEflqcHAQP/jBD3D06NHs39566y1MnTpV93Wtra0YO3Ysnn/+eezZswd79uzB7t27cfLkSezYscPlVhMREREVr/nz5+PCCy/E3XffnffYwoUL8fDDD+PYsWOYNGmSD60jIj9xdTYi8szJkycxffr0nL9t3rwZgiDguuuugyAIyGQy+OQnP4n77rtP9702b96ML3/5yzlDqKuqqrB48WJs3LiRRR6JiIiICvDNb34TLS0teP7553P+PnfuXHz729/GypUrfWoZEflJEEVR9LsRREREREREREQUbJzORkREREREREREhphEIiIiIiIiIiIiQ0wiERERERERERGRISaRiIiIiIiIiIjIEJNIRERERERERERkiEkkIiIiIiIiIiIyxCQSEREREREREREZYhKJiIiIiIiIiIgM/f8DoNXX46X5bAAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<Figure size 1440x360 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_203_0.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plt.figure(figsize=(20, 5))\n",
|
||
"\n",
|
||
"features = ['LSTAT', 'RM']\n",
|
||
"target = boston['MEDV']\n",
|
||
"\n",
|
||
"for i, col in enumerate(features):\n",
|
||
" plt.subplot(1, len(features) , i+1)\n",
|
||
" x = boston[col]\n",
|
||
" y = target\n",
|
||
" plt.scatter(x, y, marker='o')\n",
|
||
" plt.title(col)\n",
|
||
" plt.xlabel(col)\n",
|
||
" plt.ylabel('MEDV')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Now we start training our model"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 34,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"X = pd.DataFrame(np.c_[boston['LSTAT'], boston['RM']], columns = ['LSTAT','RM'])\n",
|
||
"Y = boston['MEDV']"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We split the data into training and test sets"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 35,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"(404, 2)\n",
|
||
"(102, 2)\n",
|
||
"(404,)\n",
|
||
"(102,)\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"\n",
|
||
"# splits the training and test data set in 80% : 20%\n",
|
||
"# assign random_state to any value.This ensures consistency.\n",
|
||
"X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state=5)\n",
|
||
"print(X_train.shape)\n",
|
||
"print(X_test.shape)\n",
|
||
"print(Y_train.shape)\n",
|
||
"print(Y_test.shape)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Then we use the linear regression functionality from **Scikit-Learn**"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 36,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"The model performance for training set\n",
|
||
"--------------------------------------\n",
|
||
"RMSE is 5.6371293350711955\n",
|
||
"R2 score is 0.6300745149331701\n",
|
||
"\n",
|
||
"\n",
|
||
"The model performance for testing set\n",
|
||
"--------------------------------------\n",
|
||
"RMSE is 5.137400784702911\n",
|
||
"R2 score is 0.6628996975186952\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"from sklearn.metrics import mean_squared_error, r2_score\n",
|
||
"\n",
|
||
"lin_model = LinearRegression()\n",
|
||
"lin_model.fit(X_train, Y_train)\n",
|
||
"\n",
|
||
"# model evaluation for training set\n",
|
||
"\n",
|
||
"y_train_predict = lin_model.predict(X_train)\n",
|
||
"rmse = (np.sqrt(mean_squared_error(Y_train, y_train_predict)))\n",
|
||
"r2 = r2_score(Y_train, y_train_predict)\n",
|
||
"\n",
|
||
"print(\"The model performance for training set\")\n",
|
||
"print(\"--------------------------------------\")\n",
|
||
"print('RMSE is {}'.format(rmse))\n",
|
||
"print('R2 score is {}'.format(r2))\n",
|
||
"print(\"\\n\")\n",
|
||
"\n",
|
||
"# model evaluation for testing set\n",
|
||
"\n",
|
||
"y_test_predict = lin_model.predict(X_test)\n",
|
||
"# root mean square error of the model\n",
|
||
"rmse = (np.sqrt(mean_squared_error(Y_test, y_test_predict)))\n",
|
||
"\n",
|
||
"# r-squared score of the model\n",
|
||
"r2 = r2_score(Y_test, y_test_predict)\n",
|
||
"\n",
|
||
"print(\"The model performance for testing set\")\n",
|
||
"print(\"--------------------------------------\")\n",
|
||
"print('RMSE is {}'.format(rmse))\n",
|
||
"print('R2 score is {}'.format(r2))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 37,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 842.4x595.44 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_210_0.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# plotting the y_test vs y_pred\n",
|
||
"# ideally should have been a straight line\n",
|
||
"plt.scatter(Y_test, y_test_predict)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Reducing the number of degrees of freedom, overarching view\n",
|
||
"\n",
|
||
"Many Machine Learning problems involve thousands or even millions of\n",
|
||
"features for each training instance. Not only does this make training\n",
|
||
"extremely slow, it can also make it much harder to find a good\n",
|
||
"solution, as we will see. This problem is often referred to as the\n",
|
||
"curse of dimensionality. Fortunately, in real-world problems, it is\n",
|
||
"often possible to reduce the number of features considerably, turning\n",
|
||
"an intractable problem into a tractable one.\n",
|
||
"\n",
|
||
"Later we will discuss some of the most popular dimensionality reduction\n",
|
||
"techniques: the principal component analysis (PCA), Kernel PCA, and\n",
|
||
"Locally Linear Embedding (LLE). \n",
|
||
"\n",
|
||
"\n",
|
||
"Principal component analysis and its various variants deal with the\n",
|
||
"problem of fitting a low-dimensional [affine\n",
|
||
"subspace](https://en.wikipedia.org/wiki/Affine_space) to a set of of\n",
|
||
"data points in a high-dimensional space. With its family of methods it\n",
|
||
"is one of the most used tools in data modeling, compression and\n",
|
||
"visualization.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Before we proceed however, we will discuss how to preprocess our\n",
|
||
"data. Till now and in connection with our previous examples we have\n",
|
||
"not met so many cases where we are too sensitive to the scaling of our\n",
|
||
"data. Normally the data may need a rescaling and/or may be sensitive\n",
|
||
"to extreme values. Scaling the data renders our inputs much more\n",
|
||
"suitable for the algorithms we want to employ.\n",
|
||
"\n",
|
||
"For data sets gathered for real world applications, it is rather normal that\n",
|
||
"different features have very different units and\n",
|
||
"numerical scales. For example, a data set detailing health habits may include\n",
|
||
"features such as **age** in the range $0-80$, and **caloric intake** of order $2000$.\n",
|
||
"Many machine learning methods sensitive to the scales of the features and may perform poorly if they\n",
|
||
"are very different scales. Therefore, it is typical to scale\n",
|
||
"the features in a way to avoid such outlier values.\n",
|
||
"\n",
|
||
"\n",
|
||
"**Scikit-Learn** has several functions which allow us to rescale the\n",
|
||
"data, normally resulting in much better results in terms of various\n",
|
||
"accuracy scores. The **StandardScaler** function in **Scikit-Learn**\n",
|
||
"ensures that for each feature/predictor we study the mean value is\n",
|
||
"zero and the variance is one (every column in the design/feature\n",
|
||
"matrix). This scaling has the drawback that it does not ensure that\n",
|
||
"we have a particular maximum or minimum in our data set. Another\n",
|
||
"function included in **Scikit-Learn** is the **MinMaxScaler** which\n",
|
||
"ensures that all features are exactly between $0$ and $1$. The\n",
|
||
"\n",
|
||
"\n",
|
||
"The **Normalizer** scales each data\n",
|
||
"point such that the feature vector has a euclidean length of one. In other words, it\n",
|
||
"projects a data point on the circle (or sphere in the case of higher dimensions) with a\n",
|
||
"radius of 1. This means every data point is scaled by a different number (by the\n",
|
||
"inverse of it’s length).\n",
|
||
"This normalization is often used when only the direction (or angle) of the data matters,\n",
|
||
"not the length of the feature vector.\n",
|
||
"\n",
|
||
"The **RobustScaler** works similarly to the StandardScaler in that it\n",
|
||
"ensures statistical properties for each feature that guarantee that\n",
|
||
"they are on the same scale. However, the RobustScaler uses the median\n",
|
||
"and quartiles, instead of mean and variance. This makes the\n",
|
||
"RobustScaler ignore data points that are very different from the rest\n",
|
||
"(like measurement errors). These odd data points are also called\n",
|
||
"outliers, and might often lead to trouble for other scaling\n",
|
||
"techniques.\n",
|
||
"\n",
|
||
"\n",
|
||
"Many features are often scaled using standardization to improve\n",
|
||
"performance. In **Scikit-Learn** this is given by the **StandardScaler**\n",
|
||
"function as discussed above. It is easy however to write your own.\n",
|
||
"Mathematically, this involves subtracting the mean and divide by the\n",
|
||
"standard deviation over the data set, for each feature:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"x_j^{(i)} \\rightarrow \\frac{x_j^{(i)} - \\overline{x}_j}{\\sigma(x_j)},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\overline{x}_j$ and $\\sigma(x_j)$ are the mean and standard\n",
|
||
"deviation, respectively, of the feature $x_j$. This ensures that each\n",
|
||
"feature has zero mean and unit standard deviation. For data sets\n",
|
||
"where we do not have the standard deviation or don't wish to calculate\n",
|
||
"it, it is then common to simply set it to one.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Let us consider the following vanilla example where we use both\n",
|
||
"**Scikit-Learn** and write our own function as well. We produce a\n",
|
||
"simple test design matrix with random numbers. Each column could then\n",
|
||
"represent a specific feature whose mean value is subracted."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 38,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>0</th>\n",
|
||
" <th>1</th>\n",
|
||
" <th>2</th>\n",
|
||
" <th>3</th>\n",
|
||
" <th>4</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>-1.749765</td>\n",
|
||
" <td>0.342680</td>\n",
|
||
" <td>1.153036</td>\n",
|
||
" <td>-0.252436</td>\n",
|
||
" <td>0.981321</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>0.514219</td>\n",
|
||
" <td>0.221180</td>\n",
|
||
" <td>-1.070043</td>\n",
|
||
" <td>-0.189496</td>\n",
|
||
" <td>0.255001</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>-0.458027</td>\n",
|
||
" <td>0.435163</td>\n",
|
||
" <td>-0.583595</td>\n",
|
||
" <td>0.816847</td>\n",
|
||
" <td>0.672721</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>-0.104411</td>\n",
|
||
" <td>-0.531280</td>\n",
|
||
" <td>1.029733</td>\n",
|
||
" <td>-0.438136</td>\n",
|
||
" <td>-1.118318</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>1.618982</td>\n",
|
||
" <td>1.541605</td>\n",
|
||
" <td>-0.251879</td>\n",
|
||
" <td>-0.842436</td>\n",
|
||
" <td>0.184519</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5</th>\n",
|
||
" <td>0.937082</td>\n",
|
||
" <td>0.731000</td>\n",
|
||
" <td>1.361556</td>\n",
|
||
" <td>-0.326238</td>\n",
|
||
" <td>0.055676</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6</th>\n",
|
||
" <td>0.222400</td>\n",
|
||
" <td>-1.443217</td>\n",
|
||
" <td>-0.756352</td>\n",
|
||
" <td>0.816454</td>\n",
|
||
" <td>0.750445</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7</th>\n",
|
||
" <td>-0.455947</td>\n",
|
||
" <td>1.189622</td>\n",
|
||
" <td>-1.690617</td>\n",
|
||
" <td>-1.356399</td>\n",
|
||
" <td>-1.232435</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>8</th>\n",
|
||
" <td>-0.544439</td>\n",
|
||
" <td>-0.668172</td>\n",
|
||
" <td>0.007315</td>\n",
|
||
" <td>-0.612939</td>\n",
|
||
" <td>1.299748</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>9</th>\n",
|
||
" <td>-1.733096</td>\n",
|
||
" <td>-0.983310</td>\n",
|
||
" <td>0.357508</td>\n",
|
||
" <td>-1.613579</td>\n",
|
||
" <td>1.470714</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" 0 1 2 3 4\n",
|
||
"0 -1.749765 0.342680 1.153036 -0.252436 0.981321\n",
|
||
"1 0.514219 0.221180 -1.070043 -0.189496 0.255001\n",
|
||
"2 -0.458027 0.435163 -0.583595 0.816847 0.672721\n",
|
||
"3 -0.104411 -0.531280 1.029733 -0.438136 -1.118318\n",
|
||
"4 1.618982 1.541605 -0.251879 -0.842436 0.184519\n",
|
||
"5 0.937082 0.731000 1.361556 -0.326238 0.055676\n",
|
||
"6 0.222400 -1.443217 -0.756352 0.816454 0.750445\n",
|
||
"7 -0.455947 1.189622 -1.690617 -1.356399 -1.232435\n",
|
||
"8 -0.544439 -0.668172 0.007315 -0.612939 1.299748\n",
|
||
"9 -1.733096 -0.983310 0.357508 -1.613579 1.470714"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0 -0.175300\n",
|
||
"1 0.083527\n",
|
||
"2 -0.044334\n",
|
||
"3 -0.399836\n",
|
||
"4 0.331939\n",
|
||
"dtype: float64\n",
|
||
"0 1.069584\n",
|
||
"1 0.965548\n",
|
||
"2 1.018232\n",
|
||
"3 0.793167\n",
|
||
"4 0.918992\n",
|
||
"dtype: float64\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>0</th>\n",
|
||
" <th>1</th>\n",
|
||
" <th>2</th>\n",
|
||
" <th>3</th>\n",
|
||
" <th>4</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>-1.574465</td>\n",
|
||
" <td>0.259153</td>\n",
|
||
" <td>1.197370</td>\n",
|
||
" <td>0.147400</td>\n",
|
||
" <td>0.649382</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>0.689519</td>\n",
|
||
" <td>0.137652</td>\n",
|
||
" <td>-1.025709</td>\n",
|
||
" <td>0.210340</td>\n",
|
||
" <td>-0.076938</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>-0.282727</td>\n",
|
||
" <td>0.351636</td>\n",
|
||
" <td>-0.539261</td>\n",
|
||
" <td>1.216683</td>\n",
|
||
" <td>0.340782</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>0.070889</td>\n",
|
||
" <td>-0.614808</td>\n",
|
||
" <td>1.074067</td>\n",
|
||
" <td>-0.038300</td>\n",
|
||
" <td>-1.450257</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>1.794282</td>\n",
|
||
" <td>1.458078</td>\n",
|
||
" <td>-0.207545</td>\n",
|
||
" <td>-0.442600</td>\n",
|
||
" <td>-0.147420</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5</th>\n",
|
||
" <td>1.112383</td>\n",
|
||
" <td>0.647473</td>\n",
|
||
" <td>1.405890</td>\n",
|
||
" <td>0.073598</td>\n",
|
||
" <td>-0.276263</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6</th>\n",
|
||
" <td>0.397700</td>\n",
|
||
" <td>-1.526744</td>\n",
|
||
" <td>-0.712018</td>\n",
|
||
" <td>1.216290</td>\n",
|
||
" <td>0.418506</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7</th>\n",
|
||
" <td>-0.280647</td>\n",
|
||
" <td>1.106095</td>\n",
|
||
" <td>-1.646283</td>\n",
|
||
" <td>-0.956563</td>\n",
|
||
" <td>-1.564374</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>8</th>\n",
|
||
" <td>-0.369139</td>\n",
|
||
" <td>-0.751699</td>\n",
|
||
" <td>0.051649</td>\n",
|
||
" <td>-0.213103</td>\n",
|
||
" <td>0.967809</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>9</th>\n",
|
||
" <td>-1.557795</td>\n",
|
||
" <td>-1.066837</td>\n",
|
||
" <td>0.401842</td>\n",
|
||
" <td>-1.213743</td>\n",
|
||
" <td>1.138775</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" 0 1 2 3 4\n",
|
||
"0 -1.574465 0.259153 1.197370 0.147400 0.649382\n",
|
||
"1 0.689519 0.137652 -1.025709 0.210340 -0.076938\n",
|
||
"2 -0.282727 0.351636 -0.539261 1.216683 0.340782\n",
|
||
"3 0.070889 -0.614808 1.074067 -0.038300 -1.450257\n",
|
||
"4 1.794282 1.458078 -0.207545 -0.442600 -0.147420\n",
|
||
"5 1.112383 0.647473 1.405890 0.073598 -0.276263\n",
|
||
"6 0.397700 -1.526744 -0.712018 1.216290 0.418506\n",
|
||
"7 -0.280647 1.106095 -1.646283 -0.956563 -1.564374\n",
|
||
"8 -0.369139 -0.751699 0.051649 -0.213103 0.967809\n",
|
||
"9 -1.557795 -1.066837 0.401842 -1.213743 1.138775"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>0</th>\n",
|
||
" <th>1</th>\n",
|
||
" <th>2</th>\n",
|
||
" <th>3</th>\n",
|
||
" <th>4</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>8</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>9</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" 0 1 2 3 4\n",
|
||
"0 0.0 0.0 0.0 0.0 0.0\n",
|
||
"1 0.0 0.0 0.0 0.0 0.0\n",
|
||
"2 0.0 0.0 0.0 0.0 0.0\n",
|
||
"3 0.0 0.0 0.0 0.0 0.0\n",
|
||
"4 0.0 0.0 0.0 0.0 0.0\n",
|
||
"5 0.0 0.0 0.0 0.0 0.0\n",
|
||
"6 0.0 0.0 0.0 0.0 0.0\n",
|
||
"7 0.0 0.0 0.0 0.0 0.0\n",
|
||
"8 0.0 0.0 0.0 0.0 0.0\n",
|
||
"9 0.0 0.0 0.0 0.0 0.0"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import sklearn.linear_model as skl\n",
|
||
"from sklearn.metrics import mean_squared_error\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.preprocessing import MinMaxScaler, StandardScaler, Normalizer\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"from IPython.display import display\n",
|
||
"np.random.seed(100)\n",
|
||
"# setting up a 10 x 5 matrix\n",
|
||
"rows = 10\n",
|
||
"cols = 5\n",
|
||
"X = np.random.randn(rows,cols)\n",
|
||
"XPandas = pd.DataFrame(X)\n",
|
||
"display(XPandas)\n",
|
||
"print(XPandas.mean())\n",
|
||
"print(XPandas.std())\n",
|
||
"XPandas = (XPandas -XPandas.mean())\n",
|
||
"display(XPandas)\n",
|
||
"# This option does not include the standard deviation\n",
|
||
"scaler = StandardScaler(with_std=False)\n",
|
||
"scaler.fit(X)\n",
|
||
"Xscaled = scaler.transform(X)\n",
|
||
"display(XPandas-Xscaled)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Small exercise: perform the standard scaling by including the standard deviation and compare with what Scikit-Learn gives.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Another commonly used scaling method is min-max scaling. This is very\n",
|
||
"useful for when we want the features to lie in a certain interval. To\n",
|
||
"scale the feature $x_j$ to the interval $[a, b]$, we can apply the\n",
|
||
"transformation"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"x_j^{(i)} \\rightarrow (b-a)\\frac{x_j^{(i)} - \\min(x_j)}{\\max(x_j) - \\min(x_j)} - a\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\min(x_j)$ and $\\max(x_j)$ return the minimum and maximum value of $x_j$ over the data set, respectively.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"## Testing the Means Squared Error as function of Complexity\n",
|
||
"\n",
|
||
"\n",
|
||
"Before we proceed with a more detailed analysis of the so-called\n",
|
||
"Bias-Variance tradeoff, we present here an example of the relation\n",
|
||
"between model complexity and the mean squared error for the triaining\n",
|
||
"data and the test data.\n",
|
||
"\n",
|
||
"The results here tell us clearly that for the data not included in the\n",
|
||
"training, there is an optimal model as function of the complexity of\n",
|
||
"ourmodel (here in terms of the polynomial degree of the model).\n",
|
||
"\n",
|
||
"The results here will vary as function of model complexity and the amount od data used for training. \n",
|
||
"\n",
|
||
"\n",
|
||
"Our data is defined by $x\\in [-3,3]$ with a total of for example $100$ data points."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 39,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAr0AAAHmCAYAAAB+hTZxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABXwElEQVR4nO3deZxU1Z3///e9t6q6u3qhq7qrih2kW0UFXEIiosEVEQRRNBmXSJyJS6KTRL7R6CRxRI2jSVScLGZiTOJvIk40iUIwBDFjYkIgxmWEFldQdujqBXpfqqvu74/qLrrprXqrjdfz8ch037VOneGBb4/nfI5h27YtAAAAIIOZyW4AAAAAMNIIvQAAAMh4hF4AAABkPEIvAAAAMh6hFwAAABmP0AsAAICM50h2Awbi4MEGRSKJq7BWVJSnqqr6hH3e0Y7+Thz6OnHo68SivxOHvk4c+jp+pmnI48nt8Vpahd5IxE5o6O34TCQO/Z049HXi0NeJRX8nDn2dOPT10DG9AQAAABmP0AsAAICMR+gFAABAxiP0AgAAIOMRegEAAJDxCL0AAADIeIReAAAAZDxCLwAAADJeXJtTrFmzRj/+8Y8VCoV03XXX6Zprruly/aWXXtL3v/99RSIRTZ8+Xffee69cLpdWrVqlhx56SEVFRZKkc845R8uWLRv+bwEAAICYhx/+jsrKNqutLaQ9e3Zr8uQpkqTPfOZKXXzxJXG9o76+Xvfff7ceeODhbtfOOmumSkuP63LujDPO1E033TL0xo+QfkNveXm5VqxYoeeee04ul0tXXnmlTj/9dJWWlkqSGhsbde+99+r5559XcXGxli1bpueff17/9E//pLKyMt15551auHDhiH8RAAAARH3ta3dIkvbv36cvf/kmPfnk0wN+R11drT788INerw/mncnUb+jduHGjZs2apcLCQknSvHnztG7dOv3rv/6rJMntduvll1+W0+lUY2OjqqqqVFBQIEkqKyvTzp079fjjj+u4447TXXfdpVGjRo3ctwEAAEgBfyvbrw1b9g/Lu5wuS6HWcOz4rBljdOb0MYN61549u/XQQw+otrZGWVnZWrbsdh133FStX79OTz/93zJNU2PHjtVdd92nRx/9niorK/Rv/3abHnjgobg/44orFunEE6fpww/f11133atvf/tujRpVKJcrSytW/FDf//7Dev3112QY0rx5C/S5z12nN998XT/+8fcVDkc0ZUqJvvWtewb1/frSb+gNBoPy+XyxY7/fry1btnS5x+l06pVXXtHXv/51+f1+nXXWWZIkn8+nG2+8UTNmzNAjjzyie++9Vw8/3H2IPF5FRXmDfnawfL78hH/m0Yz+Thz6OnHo68SivxOHvu5dQcFBOV3WsL2v87sKCrLj7vuWllxZlhm7/8tfvlf//u//rhNPPFHbtm3TLbfcohdffFE///l/6dlnn1VRUZFWrFihuroK3Xvvci1dulRPPPGTHt99/fWf63J822236dOf/rQsy9Tcuefpxz/+ofbs2aNdu3bqf//35xo/frxWrlypQ4eqtHbtC2ptbdW1116rU0+drsJCt/bs2a0//elPys8fmT9X/YZe27a7nTMMo9u5s88+W6+++qoeeeQRLV++XA8//LB+9KMfxa5ff/31uuCCC4bU2KqqekUi3dszUny+fFVU1CXs84529Hfi0NeJQ18nFv2dOPR136ZP8mj6JM+wvKunvo6376urGxQOR1RRUafGxkaVlZXp9tvviF2vr2/Qtm27NWvWWfrsZ/9Jn/70OTr77PNUXDxe+/fviz3bkyeeeKrbuYqKOoXDEU2YUKqKijpVVzfI4/EqK2uUKirq9Je/bNC8eQtUXd0oSTr33Av18suv6Mwz52j8+Ilqbpaamwf/58o0jV4HSfut3hAIBFRZWRk7DgaD8vv9seNDhw5pw4YNseNFixbp/fffV11dnZ588snYedu25XDEtW4OAAAAwywSicjlytKTTz4d+9/jjz+pgoJRuvXW2/Ttb39XBQUFuu++u/Tii2uH9FlZWVk9/t598NJWOBzudt9I6Df0zp49W5s2bVJ1dbWampq0fv16zZkzJ3bdtm3dfvvt2rdvnyTpD3/4g0477TS53W498cQT2rx5syTpqaee0ty5c0foawAAAKAveXl5Gj9+QizQvvba33XLLTcqHA7ryisvU2Fhoa699p910UUX64MP3pdlWbFAOlw+8YmZ+sMffq9wOKzm5matX79Op546c1g/ozf9Dr0GAgEtW7ZMS5cuVSgU0hVXXKEZM2bohhtu0Fe+8hVNnz5d9913n2666SYZhqHS0lLdc889sixLjz76qJYvX67m5mZNnjxZ3/3udxPxnQAAANCDu+/+tr73vf/Q00//txwOp+699z/k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r2nevHldzgMAAACJ1m/1hmAwKJ/PFzv2+/3asmVLr9d9Pp/Ky8t18OBB5eXlyeFwdDk/FEVFeUN6fjB8vvyEf+bRjP5OHPo6cejrxKK/E4e+Thz6euj6Db12D3XZOu900tv1/p4bjKqq+mgh7AQ52moQJhv9nTj0deLQ14lFfycOfZ049HX8TNPodZC03+kNgUBAlZWVseNgMCi/39/r9YqKCvn9fnm9XtXX1yscDnc5DwAAACRav6F39uzZ2rRpk6qrq9XU1KT169drzpw5sevjxo1TVlaW3njjDUnSqlWrNGfOHDmdTs2cOVNr167tch4AAABItLhGepctW6alS5fq0ksv1cKFCzVjxgzdcMMNKisrkyQ99NBDeuCBBzR//nw1NTVp6dKlkqS7775bzz77rBYsWKDXX39dt95664h+GQAAAKAnht3T5NsUxZzezEZ/Jw59nTj0dWLR34lDXycOfR2/Ic3pBQAAANIdoRcAAAAZj9ALAACAjEfoBQAAQMYj9AIAACDjEXoBAACQ8frdhjiVmObQtjFOl888mtHfiUNfJw59nVj0d+LQ14lDX8enr35Kqzq9AAAAwGAwvQEAAAAZj9ALAACAjEfoBQAAQMYj9AIAACDjEXoBAACQ8Qi9AAAAyHiEXgAAAGQ8Qi8AAAAyHqEXAAAAGY/QCwAAgIxH6AUAAEDGI/QCAAAg4xF6AQAAkPEIvb1Ys2aNFixYoLlz52rlypXJbk5G++EPf6iLL75YF198sb773e8muzlHhe985zu68847k92MjPfyyy9ryZIluuiii/Ttb3872c3JaKtXr479PfKd73wn2c3JSPX19Vq4cKH27NkjSdq4caMWLVqkCy+8UCtWrEhy6zLLkX39zDPPaOHChVq0aJH+7d/+Ta2trUluYXoi9PagvLxcK1as0NNPP63Vq1frmWee0bZt25LdrIy0ceNGbdiwQc8//7xWrVqlrVu36qWXXkp2szLapk2b9Pzzzye7GRlv9+7duvvuu/XYY49pzZo1euedd/TKK68ku1kZqampSffff79++ctfavXq1Xr99de1cePGZDcro2zevFlXXXWVduzYIUlqbm7WN77xDT322GNau3at3n77bf58D5Mj+/rjjz/Wz372M/3qV7/S7373O0UiET399NPJbWSaIvT2YOPGjZo1a5YKCwvldrs1b948rVu3LtnNykg+n0933nmnXC6XnE6nSkpKtG/fvmQ3K2MdOnRIK1as0Be/+MVkNyXjvfTSS1qwYIFGjx4tp9OpFStW6OSTT052szJSOBxWJBJRU1OT2tra1NbWpqysrGQ3K6M8++yzuvvuu+X3+yVJW7Zs0aRJkzRhwgQ5HA4tWrSIf04OkyP72uVyafny5crLy5NhGDruuOP45+QgOZLdgFQUDAbl8/lix36/X1u2bEliizLXscceG/t9x44dWrt2rX71q18lsUWZ7d///d+1bNky7d+/P9lNyXg7d+6U0+nUF77wBVVUVOjcc8/VrbfemuxmZaS8vDx99atf1fz585Wdna1PfepTOu2005LdrIxy//33dznu6Z+T5eXliW5WRjqyr8eNG6dx48ZJkqqrq7Vy5Uo98MADyWha2mOktwe2bXc7ZxhGElpy9Pjwww/1L//yL7rjjjs0efLkZDcnI/3617/WmDFjdMYZZyS7KUeFcDisTZs26Xvf+56effZZlZWVMa1khLz33nv67W9/qz/96U/asGGDTNPUz372s2Q3K6Pxz8nEKy8v1+c//3ldfvnlOv3005PdnLRE6O1BIBBQZWVl7DgYDMb+MwOG3xtvvKHrrrtOX/va13TZZZcluzkZa+3atfrb3/6mxYsX6/vf/75efvll/cd//Eeym5WxiouLdcYZZ8jr9So7O1vnn38+/8VohGzYsEFnnHGGioqK5HK5tGTJEv3jH/9IdrMyGv+cTKzt27frqquu0mWXXaZbbrkl2c1JW4TeHsyePVubNm1SdXW1mpqatH79es2ZMyfZzcpI+/fv1y233KKHHnpIF198cbKbk9F+8Ytf6IUXXtDq1av1la98Reedd56+8Y1vJLtZGevcc8/Vhg0bVFtbq3A4rL/+9a866aSTkt2sjDR16lRt3LhRjY2Nsm1bL7/8sqZPn57sZmW0k08+WR9//LF27typcDisF154gX9OjpD6+np94Qtf0Fe/+lX9y7/8S7Kbk9aY09uDQCCgZcuWaenSpQqFQrriiis0Y8aMZDcrI/3sZz9TS0uLHnzwwdi5K6+8UldddVUSWwUM3cknn6zrr79eV199tUKhkM4880xdfvnlyW5WRjrrrLP0zjvvaMmSJXI6nZo+fbpuvPHGZDcro2VlZenBBx/Ul7/8ZbW0tOjss8/WRRddlOxmZaTf/OY3qqys1M9//nP9/Oc/lySdd955+upXv5rklqUfw+5pYg4AAACQQZjeAAAAgIxH6AUAAEDGI/QCAAAg4xF6AQAAkPEIvQAAAMh4hF4AAABkPEIvAAAAMt7/D7vNunJDLlVlAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<Figure size 842.4x595.44 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_218_0.png"
|
||
}
|
||
},
|
||
"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",
|
||
"\n",
|
||
"\n",
|
||
"np.random.seed(2018)\n",
|
||
"n = 100\n",
|
||
"maxdegree = 14\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",
|
||
"TestError = np.zeros(maxdegree)\n",
|
||
"TrainError = 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",
|
||
"\n",
|
||
"for degree in range(maxdegree):\n",
|
||
" model = make_pipeline(PolynomialFeatures(degree=degree), LinearRegression(fit_intercept=False))\n",
|
||
" clf = model.fit(x_train,y_train)\n",
|
||
" y_fit = clf.predict(x_train)\n",
|
||
" y_pred = clf.predict(x_test) \n",
|
||
" polydegree[degree] = degree\n",
|
||
" TestError[degree] = np.mean( np.mean((y_test - y_pred)**2) )\n",
|
||
" TrainError[degree] = np.mean( np.mean((y_train - y_fit)**2) )\n",
|
||
"\n",
|
||
"plt.plot(polydegree, TestError, label='Test Error')\n",
|
||
"plt.plot(polydegree, TrainError, label='Train Error')\n",
|
||
"plt.legend()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Exercises\n",
|
||
"\n",
|
||
"### Exercise: Setting up various Python environments\n",
|
||
"\n",
|
||
"The first exercise here is of a mere technical art. We want you to have \n",
|
||
"* git as a version control software and to establish a user account on a provider like GitHub. Other providers like GitLab etc are equally fine. You can also use the University of Oslo [GitHub facilities](https://www.uio.no/tjenester/it/maskin/filer/versjonskontroll/github.html). \n",
|
||
"\n",
|
||
"* Install various Python packages\n",
|
||
"\n",
|
||
"We will make extensive use of Python as programming language and its\n",
|
||
"myriad of available libraries. You will find\n",
|
||
"IPython/Jupyter notebooks invaluable in your work. You can run **R**\n",
|
||
"codes in the Jupyter/IPython notebooks, with the immediate benefit of\n",
|
||
"visualizing your data. You can also use compiled languages like C++,\n",
|
||
"Rust, Fortran etc if you prefer. The focus in these lectures will be\n",
|
||
"on Python.\n",
|
||
"\n",
|
||
"If you have Python installed (we recommend Python3) and you feel\n",
|
||
"pretty familiar with installing different packages, we recommend that\n",
|
||
"you install the following Python packages via **pip** as \n",
|
||
"\n",
|
||
"1. pip install numpy scipy matplotlib ipython scikit-learn sympy pandas pillow \n",
|
||
"\n",
|
||
"For **Tensorflow**, we recommend following the instructions in the text of \n",
|
||
"[Aurelien Geron, Hands‑On Machine Learning with Scikit‑Learn and TensorFlow, O'Reilly](http://shop.oreilly.com/product/0636920052289.do)\n",
|
||
"\n",
|
||
"We will come back to **tensorflow** later. \n",
|
||
"\n",
|
||
"For Python3, replace **pip** with **pip3**.\n",
|
||
"\n",
|
||
"For OSX users we recommend, after having installed Xcode, to\n",
|
||
"install **brew**. Brew allows for a seamless installation of additional\n",
|
||
"software via for example \n",
|
||
"\n",
|
||
"1. brew install python3\n",
|
||
"\n",
|
||
"For Linux users, with its variety of distributions like for example the widely popular Ubuntu distribution,\n",
|
||
"you can use **pip** as well and simply install Python as \n",
|
||
"\n",
|
||
"1. sudo apt-get install python3 (or python for Python2.7)\n",
|
||
"\n",
|
||
"If you don't want to perform these operations separately and venture\n",
|
||
"into the hassle of exploring how to set up dependencies and paths, we\n",
|
||
"recommend two widely used distrubutions which set up all relevant\n",
|
||
"dependencies for Python, namely \n",
|
||
"\n",
|
||
"* [Anaconda](https://docs.anaconda.com/), \n",
|
||
"\n",
|
||
"which is an open source\n",
|
||
"distribution of the Python and R programming languages for large-scale\n",
|
||
"data processing, predictive analytics, and scientific computing, that\n",
|
||
"aims to simplify package management and deployment. Package versions\n",
|
||
"are managed by the package management system **conda**. \n",
|
||
"\n",
|
||
"* [Enthought canopy](https://www.enthought.com/product/canopy/) \n",
|
||
"\n",
|
||
"is a Python\n",
|
||
"distribution for scientific and analytic computing distribution and\n",
|
||
"analysis environment, available for free and under a commercial\n",
|
||
"license.\n",
|
||
"\n",
|
||
"We recommend using **Anaconda** if you are not too familiar with setting paths in a terminal environment.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"### Exercise: making your own data and exploring scikit-learn\n",
|
||
"\n",
|
||
"We will generate our own dataset for a function $y(x)$ where $x \\in [0,1]$ and defined by random numbers computed with the uniform distribution. The function $y$ is a quadratic polynomial in $x$ with added stochastic noise according to the normal distribution $\\cal {N}(0,1)$.\n",
|
||
"The following simple Python instructions define our $x$ and $y$ values (with 100 data points)."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 40,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"x = np.random.rand(100,1)\n",
|
||
"y = 2.0+5*x*x+0.1*np.random.randn(100,1)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"1. Write your own code (following the examples under the [regression notes](https://compphysics.github.io/MachineLearning/doc/LectureNotes/_build/html/chapter1.html)) for computing the parametrization of the data set fitting a second-order polynomial. \n",
|
||
"\n",
|
||
"2. Use thereafter **scikit-learn** (see again the examples in the regression slides) and compare with your own code. \n",
|
||
"\n",
|
||
"3. Using scikit-learn, compute also the mean square error, a risk metric corresponding to the expected value of the squared (quadratic) error defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"MSE(\\boldsymbol{y},\\boldsymbol{\\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.\n",
|
||
"If $\\tilde{\\boldsymbol{y}}_i$ is the predicted value of the $i-th$ sample and $y_i$ is the corresponding true value, then the score $R^2$ is defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"R^2(\\boldsymbol{y}, \\tilde{\\boldsymbol{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 $\\boldsymbol{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": [
|
||
"You can use the functionality included in scikit-learn. If you feel for it, you can use your own program and define functions which compute the above two functions. \n",
|
||
"Discuss the meaning of these results. Try also to vary the coefficient in front of the added stochastic noise term and discuss the quality of the fits.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"### Exercise: Normalizing our data\n",
|
||
"\n",
|
||
"A much used approach before starting to train the data is to preprocess our\n",
|
||
"data. Normally the data may need a rescaling and/or may be sensitive\n",
|
||
"to extreme values. Scaling the data renders our inputs much more\n",
|
||
"suitable for the algorithms we want to employ.\n",
|
||
"\n",
|
||
"**Scikit-Learn** has several functions which allow us to rescale the\n",
|
||
"data, normally resulting in much better results in terms of various\n",
|
||
"accuracy scores. The **StandardScaler** function in **Scikit-Learn**\n",
|
||
"ensures that for each feature/predictor we study the mean value is\n",
|
||
"zero and the variance is one (every column in the design/feature\n",
|
||
"matrix). This scaling has the drawback that it does not ensure that\n",
|
||
"we have a particular maximum or minimum in our data set. Another\n",
|
||
"function included in **Scikit-Learn** is the **MinMaxScaler** which\n",
|
||
"ensures that all features are exactly between $0$ and $1$. The\n",
|
||
"\n",
|
||
"\n",
|
||
"The **Normalizer** scales each data\n",
|
||
"point such that the feature vector has a euclidean length of one. In other words, it\n",
|
||
"projects a data point on the circle (or sphere in the case of higher dimensions) with a\n",
|
||
"radius of 1. This means every data point is scaled by a different number (by the\n",
|
||
"inverse of it’s length).\n",
|
||
"This normalization is often used when only the direction (or angle) of the data matters,\n",
|
||
"not the length of the feature vector.\n",
|
||
"\n",
|
||
"The **RobustScaler** works similarly to the StandardScaler in that it\n",
|
||
"ensures statistical properties for each feature that guarantee that\n",
|
||
"they are on the same scale. However, the RobustScaler uses the median\n",
|
||
"and quartiles, instead of mean and variance. This makes the\n",
|
||
"RobustScaler ignore data points that are very different from the rest\n",
|
||
"(like measurement errors). These odd data points are also called\n",
|
||
"outliers, and might often lead to trouble for other scaling\n",
|
||
"techniques.\n",
|
||
"\n",
|
||
"\n",
|
||
"It also common to split the data in a **training** set and a **testing** set. A typical split is to use $80\\%$ of the data for training and the rest\n",
|
||
"for testing. This can be done as follows with our design matrix $\\boldsymbol{X}$ and data $\\boldsymbol{y}$ (remember to import **scikit-learn**)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 41,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# split in training and test data\n",
|
||
"# X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Then we can use the standard scaler to scale our data as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 42,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"scaler = StandardScaler()\n",
|
||
"scaler.fit(X_train)\n",
|
||
"X_train_scaled = scaler.transform(X_train)\n",
|
||
"X_test_scaled = scaler.transform(X_test)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In this exercise we want you to to compute the MSE for the training\n",
|
||
"data and the test data as function of the complexity of a polynomial,\n",
|
||
"that is the degree of a given polynomial. We want you also to compute the $R2$ score as function of the complexity of the model for both training data and test data. You should also run the calculation with and without scaling. \n",
|
||
"\n",
|
||
"One of \n",
|
||
"the aims is to reproduce Figure 2.11 of [Hastie et al](https://github.com/CompPhysics/MLErasmus/blob/master/doc/Textbooks/elementsstat.pdf).\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Our data is defined by $x\\in [-3,3]$ with a total of for example $100$ data points."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 43,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"np.random.seed()\n",
|
||
"n = 100\n",
|
||
"maxdegree = 14\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)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $y$ is the function we want to fit with a given polynomial.\n",
|
||
"\n",
|
||
"\n",
|
||
"Write a first code which sets up a design matrix $X$ defined by a\n",
|
||
"fifth-order polynomial. Scale your data and split it in training and\n",
|
||
"test data.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Perform an ordinary least squares and compute the means squared error\n",
|
||
"and the $R2$ factor for the training data and the test data, with and\n",
|
||
"without scaling.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Add now a model which allows you to make polynomials up to degree\n",
|
||
"$15$. Perform a standard OLS fitting of the training data and compute\n",
|
||
"the MSE and $R2$ for the training and test data and plot both test and\n",
|
||
"training data MSE and $R2$ as functions of the polynomial\n",
|
||
"degree. Compare what you see with Figure 2.11 of Hastie et al. Comment\n",
|
||
"your results. For which polynomial degree do you find an optimal MSE\n",
|
||
"(smallest value)?"
|
||
]
|
||
}
|
||
],
|
||
"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.7"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
} |