4876 lines
593 KiB
Plaintext
4876 lines
593 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.94994109]\n",
|
||
"Coefficient beta : \n",
|
||
" [[5.0707273]]\n",
|
||
"Mean squared error: 0.24\n",
|
||
"Variance score: 0.90\n",
|
||
"Mean squared log error: 0.01\n",
|
||
"Mean absolute error: 0.42\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAAkkUlEQVR4nO3dfZQdZZ0n8O83r9C8k3QQAt1RRBiMI5As4MEBRnAORFddlRycDgIHJ8ewelBhBzUyMKxxdnQZYGbZgfCiLt2MvIy4rJMdZGZ4kSwwdAARwsRFSELCS5qEQGLIa//2j6q7ffveqnvr1q2Xp6q+n3PuSd+6daueriTPr+r3vNHMICIi1TUh7wKIiEi+FAhERCpOgUBEpOIUCEREKk6BQESk4hQIREQqToFAEkPyD0iuyrscZUDyeZKnp3DcQ0g+QnILyWtIfpvkLUmfR4qFGkcgnSK5GsCXzOyf8i5LGJJXAVgMYAeA3QBWArjUzB7Ls1x5I3kFgOMBfM4a/vOTnAXgZQCTzWx3DsWTnOiJQAqP5KSQj+40s30BTAfwIIC7Uzg3SRbp/1E/gJWNQUCqrUj/gMVxJE8nua7u/WqSl5F8luTbJO8kuVfd558k+QzJzST/D8nfr/vsmyR/66cwVpL8D3WfXUByOclrSW4EcFWrcvl3t0MAZpLs9Y9xAMlbSb5Gcj3J75Kc6H820U+bvEnyZZJfIWm1gEPyIZJLSC4HsA3A+0geQ/IBkptIriI5v6688/zfYYt/rsv87dNJ/tz//TeR/GUtqPjX7kz/56kkryP5qv+6juTU+mtO8lKSG/zf58KQv58fATgfwJ+S3EryTJJXkRz0d3nE/3Oz//lHWl1XKY+wOymRpMwHcBaA7QCWA7gAwI0kjwdwG4B/D2AYwAIA95E82sx2APgtgD8A8DqAcwAMkny/mb3mH/ckAD8BcAiAya0KQHIKgC8C2AjgLX/zjwBsAPB+APsA+DmAVwDcBOBPAJwN4DgAv0Pwk8R5/j6r/O8/B+DP/G0fAvAAyefMbCWAWwHMN7NfkjwIwHv9Y1wKYB2AXv/9yQCC7tQX+58d53/+PwF8B8AV/ufvAXAAgJkAPg7gHpI/M7O36g9iZheQBIB1ZvYd/9p8tG6XU+Glhg5Uaqha9EQgaftrM3vVzDYB+F/wKjMAWAjgJjN7wsz2mNmP4eXzTwYAM7vb/96omd0J4P8COLHuuK+a2d+Y2W4zezfk3PNJbgbwLrzK/fNmtpvkIQDmAfiamf3OzDYAuBbAubXvAbjezNb5lel/CTj2j8zseb/CPAvAajP7oV+epwH8PbwABgC7ABxLcn8ze8vMnqrbfiiAfjPbZWa/DEnZDAC42sw2mNkIgD+HF4hQd5yr/WMsA7AVwNEh10SkiQKBpO31up+3AdjX/7kfwKV+WmSzX2EfAeAwACD5xbq00WYAs+Hl+mteiXDuu8zsQHhPDc8BmFN37skAXqs7/k0AZvifH9Zw/KBz1W/rB3BSw+8yAO9OHQA+By/wrCH5cF3K5QcAXgTwC5IvkfxmyO9xGIA1de/X+NtqNjbcwddfZ5G2lBqSvLwCYImZLWn8gGQ/gJsBnAHgMTPbQ/IZAKzbLXJjp5m9SXIhgGGSd/jn3gFgekgK5DUAh9e9PyLosA2/y8Nm9vGQ8z8J4NMkJwP4CoC7ABxhZlvgpYcuJTkbwL+QfNLM/rnhEK/CCzbP++/7/G1JUwNyRemJQOKaTHKvulenNxU3A/gyyZP8njf7kPwEyf3g5dwNwAgA+I2fs7sprJmtAnA/gD/12xl+AeAakvuTnEDySJKn+bvfBeASkjNJHgjg8jaH/zmAD5A8j+Rk//XvSP4eySkkB0geYGa7ALwDYNT/vT5J8v30EvdvA9hT+6zB3wH4DslektPhtUUMBuzXrRH//O9L4djiMAUCiWsZvNx77XVVJ182s2F4efv/Bq8B90V4DcnwG1ivAfAYgDfgNb4uT6DMPwCwkOQMeI3HU+CNL3gLwD3w8vWAF6R+AeBZAE/D+113w6uog36XLQD+CF4bw6vw0mF/CWCqv8t5AFaTfAfAl+GljQDgKAD/BC+n/xiA/25mDwac4rvwGtSfBfBrAE/52xJlZtsALAGw3E9xnZz0OcRNGlAm0gbJswHcaGb9eZdFJA16IhBpQHJvv+//JJIzAVwJ4N68yyWSltQDAcmj/d4ftdc7JL+W9nlFukB4XTTfgpcaegFeXl6klDJNDdEbubkewElmtqbd/iIikr6sU0NnAPitgoCIiDuyHkdwLryucE38ft4LAWCfffaZc8wxx2RZLhGRzmzaBKxfD+zcCUyZAsycCRx8cDLHXrEi/LM5cwI3r1ix4k0z6w38sI3MUkP+fC+vAvigmb3Rat+5c+fa8PBwJuUSEUnU0BCweDGwdi3Q1wcsWQIMDLT/Xr1Zs4A1AYmT/n7gN78BfvYzYP78cR+RXGFmc+MUOcsngrMBPNUuCIiIFNbQELBwIbBtm/d+zRrvPRA9GAwNAVu3Nm/v6QFOOQWY6g9PmTULOPHE5v1iyLKN4AsISQuJiHRkaMirCCdM8P4cGsq7RJ7Fi8eCQM22bd72KGqBZOPG8dsPPNA7zh13eO/nz08sCAAZBQKS+8CbHvenWZxPREqsVlmuWQOYjd11Jx0M4gSbtWs7294oKJAAwObNYz+//jpw553RjhdRJoHAn+p3mpm9ncX5RKTEur3rjiJusOnrC95+8MHRgkqrgHHvvV5ZDjkkym/QEY0sFpFi6fauO4q4wWbJEi+XX2/yZGDLlmhBJSyQ9PUBn/lM5OJ3SoFARIqlVWWZlLjBZmAAWLrU691Den/uv7/XxbReUFAZGQnuKdTTA3zve9HLHoMCgYgUS9Bdd0+Ptz0p3QSbgQFg9WpgdNT7c9Om4P3qgwoJzJgx9n7ChLFAsnRp591PO6RAICLFEnTXnXRlmWSwaRVULrvM+x3qjY4Ce/aMBZKUgwDg6DTUGlAmIrlLYmBY7Tj1YwsAYO+9gXcbltp++GHg1FNjF7coA8pERIpjYCCZu/HaMS65ZGx8QH0Q6O/37vxzpNSQiEgWGgeJAcDgYO5BAFAgEBFJ17PPAgsWBH+W5NiHLig1JCKSlsaG4EZJjn3oggKBiEjS2gWAmiTHPnRBqSERqYYsJqp79NHmIHDTTV5bQNpjH7qgJwIRKb8kpoduJ+gpoLF7fhLdUVOgcQQiUn6tFnrpttdOUAAYHY2eHkpIN+MIlBoSkfJLY6K6e+5pruyvucZ7Csg4CHRLgUBEyi/q3EFR2xFI4Jxzxm8zA77xjW5LmgsFAhEpvyhzB0VZg4Bsvts3a24LKBgFAhEpvygT1bVag2BoqDkAXHZZ4QNAjRqLRUQALx0UtT50sN5UY7GIuMvVheYbRRncVYI0UBAFAhFJT1YLzSchqB2h5oorShkAahQIRCQ9WSw0n5SBgeayAl57wtFHZ1+eDCkQiEizpNI5WSw0H6TT8gf1Bqpx+SkmIQoEIjJekumcLBaab9RJ+b/+9eYAEJQeSvopxrV2EzNz7jVnzhwTkZz099eaRMe/+vub9x0c9LaT3p+Dg82f9/SMP05PT/N+eZQ/aB8z73cJ+oxMpnwpXRMAwxazztUTgYiMFzWdE+XOO4uF5jstf7tBYWk/xTjYbqJAICLjRa0Io1ZoAwPexG6jo96fAwPppkbCyj9lSnMA+NKXmnsDRRmF3I282k1aUCAQkfGiVoRxK7S0u5SGdQPdsWP8ezPg5pub90v7KaabJ460AmjcnFKaL7URiOSsXe7frLO2hCS+F6f8Ye0AeYrbRtDme+iijSD3Sj/opUAgUgDtKrSwYBKnMTZKYKp3/PHNx//EJ7r/nZPS6e9j1jaAKhCISD7CKrRWQaLTJ4JO76BdfApIQpsA2k0g0KRzIpK8ViuCLVkyftlIwMvph+Xho64uFmWpyCJrcx2cn3SO5IEk7yH5byRfIPmRLM4rIjlp1ZDcaWNsu0bpGTOag8C555YrCACp9mbKavH66wH8o5l9nuQUACEzO4lIKfT1Bd+91nrGDAxE74XT6lhlfwqoV7teixd7QbCvzwsCCfRmSv2JgOQBAE4FcCsAmNlOM9uc9nlFBPlNZZDk3WtYd9DG4FDLmpdZ0JiMBGSRGnovgBEAPyT5NMlbSO7TuBPJhSSHSQ6PjIxkUCyRkstzCugk++LXHyvIH/8xMDjo1tw9BZN6YzHJuQAeB3CKmT1B8noA75jZFWHfUWOxSAKiNrIWRVgaqBbwojY+l5TrjcXrAKwzsyf89/cAOCGD84pUm4NTGcTSbm4gB+fuKZrUA4GZvQ7gFZK1lR3OALAy7fOKVF4eU0BHFaXtIigAfPazze0AZQl4Ocqq19BXAQz5PYZeAnBhRucVqa6w/vpJTZ4WV2Mqp9Z2AXipHDMvQDQKS2O366EkbWUyjsDMnjGzuWb2+2b2GTN7K4vzilRaHlNAR9EqlUM2B4F2vYE67aHk2qIwDtDsoyJlllJ3w8iCKt2wlE3jXf38+dG6g3YS8IaGgAsvHN+T6sILKx8MNMWEiKQjrDfP3nsDGze2/m5a9dL06cHnnjYNePPNdM6ZEdd7DYlIFYWlgIDgAWLA+DRQGimcsADULjCVnAKBiKQjLAW0cWNzgDjllPFPAXkOhqsgBQIRSUfUXjtmwKOPjt+W1tiAadOCt++7b3fHLTgFAhFJR9gcQTWtegOlNTbg+uuBSQG95nfsqPTThgKBiKRjYKD5rh7w5gZq1xic1mC4gQHggAOat+/aVemRyAoEIq4rYr/3Xbtazw3UTopz72PTpuDtFR6JrEAg4rIiNpqSwJQp47d1OkV0moPhXJ56IycKBCKuCLrzL9KEakFzA110UfwxAWkNhkvzaaOgspprSERaCZt/JyjHDriVxti+3Rsk1sjBwaoAUl3pq6g0sljEBWFrB0ycCOzZ07zdlTUFqrRUpOM0slik6MLu8PfsCU5jzJuXbwNyUBro4osVBApKgUDEBWENlbVG0vpG0/PPB37843wakLduDX8KuOGG9M8vqVAgEHFBUAPmlClexXveed7722/30kHLluXTgEwC++03flsVFoyvAAUCERc0dpecNs2rYDdubL7rz3pFrqA00Le/7UYAKOIYCwcpEIi4or675L77eoOy6tXu+rPqB//WW+FpoG67WiZRgRdxjIWjFAhEXNTqrj8ojUR6FWFSd8UkcPDB47d1mwaqVf6kl+7qtgIv0hgLxykQiLio1V1/fRoJ8CrWWgXd7V1xUBroe9/rPg1Uf/cONB8vTgWuResTo0Ag4qJ2o19raaT+/mQq1TfeCE8DfetbnR0rSNDde6NOK3BNFZEYBQIRF0WdayeJu2ISeM97xm9LujdQlPJ0WoFrqojEKBCIuCrKXDvd3BUHpYGuuy6d3kDtyhOnAk9zYrqKUSAQKbI4d8Vr14angS65JNny1YQ1cANjg+QWL+68F1FaE9NVjAKBSJF1eldc26deFoPCgsp5++1jXVHzGiktADTpnEg1BD0B3HKLN0103sIm3HNlYr2C6GbSOU1DLVJmq1YBxxzTvN2lG0B1A82dAoFIWRVliui+vuAnAnUDzYzaCERcFmcqhqDeQIODbgWB+t9r69bmpS3VDTRTeiIQcVXYqmVAcGPwU08Bc+Y0b3cpAADNv9fGjcDkyd5Ee5s2acWwHKixWMRVnTSiFiUNBIT/XtOmeZPtafnIWJxfoYzkapK/JvkMSdXwIlFEaUQNSgPddZe7QQAI/702blQX0pxk2Ubwh2Z2XNyIJVI5rUYNL18e/hRwzjnplqtbURuBNZNoZtRYLOKqsFHDa9YAH/3o+O1FWiks6PcKoy6kmcgqEBiAX5BcQXJh0A4kF5IcJjk8MjKSUbFEEtKud0+c3j+No3GB5hk8ly0rTgCoCRplPG1a8L7qQpoNM0v9BWCm/+cMAL8CcGqr/efMmWMihTE4aNbTU7sn9149Pd72KJ+3c//9479be5VJt9dIDMCwxayjM+81RPIqAFvN7L+G7aNeQ1Io7Xr3dDOFQpF6A3VraMhrE1CvoVi66TWUeiAguQ+ACWa2xf/5AQBXm9k/hn1HgUAKZcKE4MqZ9GbFbPd5kKAA8NBDwGmndVVUKS/Xu48eAuBRkr8C8K8A/qFVEBApnHZrAnSyZsC994Y/BSgISEpSDwRm9pKZfdh/fdDMNG5cyqXdmgBR1wwggc9+dvy2IvQGitMQLk5R91GRbrVbE6Dd50GDwp580v0AAIxflF4DwQpLU0yI5OW224LXA3Dw/2QorSXgDK1HIFI0ZekNpLUESkGpIZEsBaWBfv3reEHAhdx8Jw3h4iwFApEs3HBD+FPA7NmdHy+N3HycwBK1IVycpjYCkbSlkQZKOjffuEYA4FXo9Y3arb6rgWC5c3pAWRwKBFIKQQHgxReBI4/s/thxBqm1okbfwnN9QJlItXz/++FPAUkEASD53LwafStNgUAkSSRw+eXjt4UNCuumsTfp3LwafStNgUDc40JvmE4F9QZavz68LaDbxt6gQWrnn+/l6l0ILFIscactTfOlaagrrGjTEV9+ebwpovv7g7/X3x+vHElct8FB7/yk96er11wCoUjTUEehxuKCSqL3SJEaLbvpDaTGXkmYGoslf0n1ay9Co2VQGmjDhvEVe7v0lhp7xSEKBJKMxYubl1GMs/i4y42WCxeGPwX09o69jxIU1dgrDlEgkGQkdUfqaqMlCdx88/htYb2BogTFdjOSdsrV6yaFoEAgyUjqjjTpCrJbQWmgzZtbtwVEDYoDA17+fnTU+7Ob39G16yaFosZiSUY3UxS4aP584O67m7dH+f+ihlvJgRqLJX9luiMlm4NAJyuFuZqmKeL4DMmEAoEkJ06qI27ldPHFwKRJXqU9aZL3PopW5wtKA23d2vkEcS4GRa0kJq3EHYCQ5ksDyhyUxmCjuIOgFi0KHoy1aFG88x17bLxBYUWS9AA2cQ40oExSlVb+P24ufdIkYM+e5u0TJwK7d3d+vkYO/p/oWtID2MQ5aiOQdCU1RqBR3C6nQUGg1faox92+vZxBANA4A2lJgUDaS2vUatzKaeLEzrZHOa4ZMHVq6+8XmasN2OKEtoGA5AMkP5xFYcRRSd9N1hps16xpbpyNUjktXNjZ9pqgtFBPDzA42Pp7ZeBiA7a4o10jAoATADwI4IcADo3bGNHJS43FjmnVqNtpI3LQscixhsuojdCLFplNnOh9b+LE1g3FQY2kmmFTSgZZNBaT/ByAPwPwUwDfN7N30wlNaix2UtDMokDnjchZDrY68UTgySebt5e1HUAqLfU1i0kSwAcBfBTAdwFsB/AtM7s9zknbUSAoiDiVela9V9JYMF7EYan2GiK5HMB6ANcCmAngAgCnAziR5NI4J5WSiNOInHbvlaBBYXv2tA4CaY641WheKYBJEfZZCGClNT86fJXkCymUSYqiry/4iaBVpb5kSXA6qdveK0ceCbz0UvP2dk8BjWMkaiNuge4bUtM8tkiC2j4RmNnzAUGg5hMJl0eKJE6XxDR6r5DNQaDWLNxOWmMk0j62SIK6GkdgZgG3YFIKUVIacSv1pKZfDkoDjY521hbQzRiJdtdIq4ZJQURJDSWC5EQAwwDWm9knszqvxNBJSmNgIPs0x0EHeWsCNIrTGBwnvQVEu0Zxjy2SsSxHFl8CQG0KReBySoNsDgJR00BB4o64jXKNNJpXCiKTQEDycHjtCbdkcT7pkospjaA0UDcBoCZueivKNdJoXimITGYfJXkPgL8AsB+Ay4JSQyQXwuuhhL6+vjlroswSKelwaYWtqVOBnTubt+c9JsClayQCx2cfJflJABvMbEWr/cxsqZnNNbO5vb29aRdLWnElpUE2B4EkngKS4Mo1EklAFqmhUwB8iuRqAD8B8DGSFZjlqwDCer3kndJIKw2UpLyvkUiCMl2YhuTpCEkN1dMUExlwcbH5oGkhgGQDQNCcSaq8pQScTg2Jo7rpGZTGtAlhcwMlHQTirNuraSKk5LRUZVXFnfwt6SeJLCeHi9PA6+KTk0iA1GcfzZoCQQbi9npJqrdMFmmgRnGCn3oHSUEoNSSdi9vrJYkxBlmkgYLEmfnUxTEVIglTIKiquL1euplGOu/eQHGCnxZ9lwpQIKiyOJO/xalMgwIAkH130DjBT+MFpAIUCKQznVameaWBwnQa/DReQCpAgUA6F1SZNnaxjJsGcrGrZlLTZos4KrNpqKXEgqZkbhTlCUAreonkQk8E0r2gwWk1naSB2g1yc/FpQaQE9EQg3QubKTZsrECYVl019bQgkho9EZRJ0nfM7Y4X1huoptMulq26arq8WI5IwSkQlEXceXTiHq/d3X6cLpatumpqYJdIahQIyiLpO+aw4y1YENwbaHCw+y6WrbpqamCXSGo011BZxJ1EDmiemnnePOBv/zbaebP696PJ30Ra0lxDEv+OOSgFFCUIZD0oTAO7RFKjQFAW7aZCCGv4bdX1M8jgYHFGBYtIJOo+Wha1SjFo9a1WXS87aWwdHFTlK1JCaiOoglZz6gPh4wAa9y36/PtaplJKTG0E0lqrrpdBKaVGZZhtM+nutSIlokBQBa0akhcsaG4j6O0tX6OsBqSJhFIbQRUsWRLc9TLu5HBFpAFpIqH0RFAFjV0vgea74zzXCMiCBqSJhFIgqIqBgbH8eL0vfKHcAaBGK42JhFIgaCftqY+jHL/bMoyOhq8UdscdnZe5iDQgTSScmTn3mjNnjjlhcNCsp6eWNPFePT3e9qyO320Z6r9Xe4lI6QAYtph1rsYRtNKq/30SfeqjHD9uGYKeAC65BLjuuo6LKSLu62YcgXoNtZJ2T5Mox++0DLt3A5MnN293MOCLiBvURtBK2j1Nohy/kzKQzUGg7L2BRKRrCgStpN3TJMrxo+wTtFLYlVcqAIhIJAoEraTd0yTK8Vvts2tXeG+gq64ae69F30WkBTUWF9HQkDc1RKOgv0st6CJSCU5POkdyL5L/SvJXJJ8n+edpn7PUyOYgMGWKN0V0EM2xIyJtZJEa2gHgY2b2YQDHATiL5MkZnLdcduwIXzB+587wil1z7IhIG6kHAn+sw1b/7WT/5V4+ymUksNderfcJq9g1x46ItJFJYzHJiSSfAbABwANm9kTAPgtJDpMcHhkZyaJY6UmqcTaoN1Bvb/C+YRW75tgRkTYyCQRmtsfMjgNwOIATSc4O2Gepmc01s7m9YZVdESSxAMq774b3Brr22s4qds2xIyJtZNp91Mw2A3gQwFlZnjdT3TbOks0Vff2gsCgVe+MTCaBF30UkVBa9hnpJHuj/vDeAjwP4t7TPm5u4jbNBaaAHHgjuEjowEF6xa0lGEelQFk8EhwJ4kOSzAJ6E10bw8wzOm49OG2d/97vwNNCZZ3Z+/nZPJBpcJiINUp90zsyeBXB82udxRtiykEE5/LAA0I1WTySNg8tqTwuA0kUiFaYpJpIWJYcflAZ6/PFk5gZq9USiwWUiEkCBIA1hOfx33gl/CjjppGTO3aq7qAaXiUgABYKskMABB4zflsYU0a2eSDS4TEQCKBCkLSgNtGJFulNEhz2RaHCZiARQIEjL5s3haaATTsi8OAA0uExEApUrELjSNZIEDjpo/DZXVgprNQZBRCqpPIHAhYFUQWmgF15wIwCIiIQoTyDIs2vkpk3haaBjjkn//CIiXUh9QFlm8uoamcagMBGRDJXniSDrrpFBaaCXX1YQEJHCKU8gyKpr5MhI+FNAbaZPEZECcT8QRO0JlEXXSBKYMWP8Nld6A4mIxOR2IOi0J1BaXSOD0kDr1jUHgCy7r9afa/p075V3t1kRKSS3A0FYT6AvfzmbCveNN8LTQDNnjt+WZffVxnNt3Oi9tP6AiMRAczCtMXfuXBseHvYq+ijl6+lJJw3UqFVZZs3yKuFG/f3e00mSws6V9nlFxFkkV5jZ3DjfdfuJIGqPnyTHCwSlgd54o31AyrL7apRjakZREYnI7UDQSY+fbiu+V18NfwpobCAOkmX31SjH1IyiIhKR24FgYACYNi3avt1UfGRzzr/T3kBZzuwZdK4szisipeR2IACA669vXekBwRVflB48QWmgWqNrp7Kc2bPxXNOmeS/NKCoiMbjdWFwzNOS1Aaxd6935z5sHLFs29n7JkvEVX+PavMD4BuX164HDD28+sYPXQkQkim4ai4sRCDrVqgdP0HYHr4GISCfK22sorrCG48Yg8M47CgIiUnnlDATtGo4PO8wLAPvtl015REQcVs5A0KpXjZnXRiAiIgDKGggWLGiemuLWW5UGEhEJUJ6FaYDg3kCnnQY89FAuxRERKYLyBAKtFCYiEkvxU0MHHdQcBLZvdycIZDk1tYhIDMUNBK+84gWAzZvHtl10kRcApk7NrVjjZDk1tYhITMUcUFaUNFCWU1OLSKVVZ0DZjTc2B4GdO90MAkC2U1OLiMSUeiAgeQTJB0muJPk8yUs6PsjOnV4AWLRobFtvr7ftqKPcTbVkOTW1iEhMWTwR7AZwqZkdC+BkAP+R5LEdHeHss8e/J4GREffz7llOTS0iElPqgcDMXjOzp/yftwB4AcDM1t9qcOqpwOTJ9Qcd/3mSK5QlKcupqUVEYsq0sZjkLACPAJhtZu80fLYQwEIA6Ovrm7OmvpE1yhq9JDA6mmh5RUSKohCNxST3BfD3AL7WGAQAwMyWmtlcM5vb29s7/sMojavKu4uIxJJJICA5GV4QGDKzn3Z8gHaVvPLuIiKxZdFriABuBfCCmf1VrIMENbrWupEmnXfXSGARqZgsnghOAXAegI+RfMZ/zevoCEGNrrff7jUar14dLwgEVfgaCSwiFVTMkcXdClvTeO+9vcXrG2kksIg4rpvG4vLMPtqJxYub1yvYtq15W41GAotIiRVriomkdFqxq0eSiJRYNQNBWMU+bZpGAotI5VQzEIRN/XD99RoJLCKVU802glrFvnixlybq6/OCQ227Kn4RqZBqBgLAq+xV4YuIVDQ1JCIi/58CgYhIxSkQiIhUnAKBiEjFKRCIiFScAoGISMUpEIiIVJwCgYhIxTk5DTXJLQBW5V0OR0wH8GbehXCArsMYXYsxuhZjjjaz/eJ80dWRxavizqtdNiSHdS10HerpWozRtRhDMvYiLkoNiYhUnAKBiEjFuRoIluZdAIfoWnh0HcboWozRtRgT+1o42VgsIiLZcfWJQEREMqJAICJScbkFApJnkVxF8kWS3wz4fCrJO/3PnyA5K4diZiLCtfgGyZUknyX5zyT78yhnFtpdi7r9PkfSSJa262CUa0Fyvv9v43mSd2RdxqxE+D/SR/JBkk/7/0/m5VHOLJC8jeQGks+FfE6Sf+1fq2dJntD2oGaW+QvARAC/BfA+AFMA/ArAsQ37XAzgRv/ncwHcmUdZHbkWfwigx/95UZWvhb/ffgAeAfA4gLl5lzvHfxdHAXgawEH++xl5lzvHa7EUwCL/52MBrM673Clej1MBnADguZDP5wH43wAI4GQAT7Q7Zl5PBCcCeNHMXjKznQB+AuDTDft8GsCP/Z/vAXAGSWZYxqy0vRZm9qCZbfPfPg7g8IzLmJUo/y4A4D8D+EsA27MsXMaiXIs/AXCDmb0FAGa2IeMyZiXKtTAA+/s/HwDg1QzLlykzewTApha7fBrA/zDP4wAOJHloq2PmFQhmAnil7v06f1vgPma2G8DbAKZlUrpsRbkW9S6CF+3LqO218B9zjzCzf8iyYDmI8u/iAwA+QHI5ycdJnpVZ6bIV5VpcBWAByXUAlgH4ajZFc1KndYqzU0xIAJILAMwFcFreZckDyQkA/grABTkXxRWT4KWHTof3lPgIyQ+Z2eY8C5WTLwD4kZldQ/IjAG4nOdvMRvMuWBHk9USwHsARde8P97cF7kNyErzHvY2ZlC5bUa4FSJ4JYDGAT5nZjozKlrV212I/ALMBPERyNbz8530lbTCO8u9iHYD7zGyXmb0M4DfwAkPZRLkWFwG4CwDM7DEAe8GbkK6KItUp9fIKBE8COIrke0lOgdcYfF/DPvcBON//+fMA/sX8lpCSaXstSB4P4CZ4QaCseWCgzbUws7fNbLqZzTKzWfDaSz5lZrEn23JYlP8jP4P3NACS0+Glil7KsIxZiXIt1gI4AwBI/h68QDCSaSndcR+AL/q9h04G8LaZvdbqC7mkhsxsN8mvALgfXo+A28zseZJXAxg2s/sA3Arv8e5FeA0j5+ZR1rRFvBY/ALAvgLv99vK1Zvap3AqdkojXohIiXov7AfwRyZUA9gD4T2ZWuqfmiNfiUgA3k/w6vIbjC0p64wiSfwfvBmC63yZyJYDJAGBmN8JrI5kH4EUA2wBc2PaYJb1WIiISkUYWi4hUnAKBiEjFKRCIiFScAoGISMUpEIiIVJwCgYhIxSkQiIhUnAKBSAT+XPcf93/+Lsm/ybtMIknRpHMi0VwJ4GqSMwAcD6B0I7ulujSyWCQikg/Dm+rjdDPbknd5RJKi1JBIBCQ/BOBQADsVBKRsFAhE2vBXdxqCt/LT1hIvACMVpUAg0gLJHgA/BXCpmb0Ab5nMK/MtlUiy1EYgIlJxeiIQEak4BQIRkYpTIBARqTgFAhGRilMgEBGpOAUCEZGKUyAQEam4/wc9bEx9S0SXRgAAAABJRU5ErkJggg==\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.005000000000000007\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",
|
||
"1 0 0 1 1 H 0.000000\n",
|
||
"2 1 1 1 2 H 1.112283\n",
|
||
"3 2 2 1 3 H 2.827265\n",
|
||
"4 6 2 2 4 He 7.073915\n",
|
||
"5 9 3 2 5 He 5.512132\n",
|
||
"... ... ... ... ... ...\n",
|
||
"264 3304 156 108 264 Hs 7.298375\n",
|
||
"265 3310 157 108 265 Hs 7.296247\n",
|
||
"266 3317 158 108 266 Hs 7.298273\n",
|
||
"269 3338 159 110 269 Ds 7.250154\n",
|
||
"270 3344 160 110 270 Ds 7.253775\n",
|
||
"\n",
|
||
"[267 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.04\n",
|
||
"Variance score: 0.95\n",
|
||
"Mean absolute error: 0.05\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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Svd4sbbyWIEtIiJTTSST6c0tbNP15sBWl7iIiEwtkQzs4E0tbNNdua6er6k8VgtbRESmmkgm05tb2Oz2wBgKWYNlWTha6UxERKaYiAb2m57oDSqrnNVUwtqyFNgiIjK1RDSwxya21edjgHINWpZURESmpEim05iVSY3B6g8ITGWnLm38ISIiU1EkA9vsM+rMKYIpAwmLIG7haMCZiIhMQZFMp31XOosNVbrIvZpKyzqbjk1WsURERA4okoE9kteWZVUCG8glKx3lzfWpySuYiIjIAUQysEda2PGYTWzQEASGwVhlLrYCW0REpqKqLk06VYy0sBuzSeyCR9kL2EMZgOa65CSWTEREZP8i2cIemdblOBbNJADIJXxs26KhNjGZRRMREdmviAZ25dayLBqpDDIrZyyaapM4diSrREREprhIptPINWzbgtpy5apAuQZm6Pq1iIhMUZEM7JEWtm1Z2AMBMdemlIHmel2/FhGRqSmig84qiW15hmAooL4uQd1MiyVz6ya5ZCIiIvsX0cCu3LqDldv6uSmuunDRpJVHRETkYCLZJT5yDdsZqiyW4tRF8u8WEREJkUgG9ui0rkLlsV3rTGJpREREDi6SgT2y94eTG75VYIuIyBQXycAebWHnKl3idjaS1SAiIiESyaQandaVr9w6WbWwRURkaotoYA8vnJIbvlVgi4jIFHfQwP7tb39bjXJUVfCmwNY1bBERmeoOOp/pL//yL3EchyuuuILLL7+clpaWapRrQo0MOlMLW0REwuKgLexf/vKX/N3f/R1btmzh4osv5rOf/SwPP/wwnudVo3wTYnSls/xwC1uBLSIiU9y4rmG/+93v5uabb+bJJ5/kggsu4K677uKcc87hH/7hHya6fBNidNDZ0HALW13iIiIyxR3SoLNMJsMf//Ef87nPfY7Zs2dz7733TlS5JpQxBrtssDyDFbOwEtZkF0lERORtjXtNzi1btvDTn/6Uhx56iJkzZ3LFFVdw6aWXTmTZJowxe1c5c7IOlqXAFhGRqe2ggX3vvfdy3333sX37di655BL+7d/+jWXLllWjbBMmMAY3DxYacCYiIuFw0MD+5S9/yac+9SnOP/98isUira2t1SjXhDIG3AKApQFnIiISCge9hv1v//ZvXHjhhTzzzDP80R/9Eddddx0AL7/8Mtdcc82EF3AiVFrYBsvSgDMREQmHcQ86u/XWW/nJT35CbW0tAO94xzvYvn37hBVsIhljhlvYWjRFRETC4ZBGiTc3N495HI/Hj2hhqsUYcIfXEdfGHyIiEgbjTqtMJsPu3btHR1Q/99xzZLPZCSvYRBoddGZp0JmIiITDuKd13XDDDVx99dXs3LmTq666im3btvG9731vIss2YYwBp1i579QosEVEZOobd2AvX76c//iP/2D16tUAnHzyyaPXs8PGGINTNJVpXRl1iYuIyNQ37sAGyGaznHvuuRNVlqoxBpwSYFlYKQW2iIhMfQcN7HvuuedtX//4xz9+xApTLYEx2OXhhVPSCmwREZn6DhrYX/va1zjhhBM45phjqlGeqhi9hp0AO61r2CIiMvUdNLBvuukm7r//fjZt2sQHP/hBLrnkEurq6qpRtgkTBAFuGUiCrS5xEREJgYMG9hVXXMEVV1zBjh07eOCBB/joRz/KMcccw7XXXhvaNcVNGSwfLMfCimnjDxERmfrG3bycP38+n/zkJ/nEJz7B888/z8svvzyR5ZpYhaBym1JYi4hIOBy0hW2M4amnnuK+++5j06ZNXHTRRfzoRz9i/vz51SjfxBgObCup7nAREQmHgwb2OeecM7r/9ec//3ksy6JYLPL6668DcPTRR094IY+44XXE1cIWEZGwOGhgx2Ixenp6uOOOO7jzzjsxxoy+ZlkWjz322IQWcEKMtLA14ExERELioIH9q1/9qhrlqK5C5Y8OdYmLiEhYHDSx/vEf/5GXXnqpGmWpGmsksLVoioiIhMRBE2vZsmX8+7//OxdccAE33ngjv/rVrygWi9Uo24QZCWzNwRYRkbA4aJf4ZZddxmWXXUapVOI3v/kNjz32GDfddBPHHnss559/PitWrKCxsbEaZT1yisMtbA06ExGRkBj35h/xeJxzzz2Xc889F2MMa9eu5Ze//CV33nknP/vZzyayjEecusRFRCRsfq/EsiyLk046iRtuuOGQwrpQKHDppZdy8803/z6nPWJGu8STWkdcRETCoapNzFtuuYXjjz++mqfcv+LwtK60usRFRCQcxt0lvnr16gO+dsoppxz0/Q888ACnnHIKGzduJJfLjfe0E8IaHjNnpdTCFhGRcBh3YD/zzDMArF27liAIOOGEE1i3bh3xeJzvfve7b/ve119/nS1btnD99dezcePGcReuoSGN6x6ZUG1uzo7ej/s2vm3R0JIe87zspXoZP9XVoVF9jZ/qavyiUFfjDuyVK1cC8NnPfpY77rhj9Pmrr776oO999NFHicfjrFq1ihdffJFyucxdd93FJz/5ybd9X0/PkWmJNzdn6eoaGH3sD3oEgWHAK415XireXF9yYKqrQ6P6Gj/V1fhNp7p6uz88xh3YI4rFIo8++ijHHXcc69evH9ec7GuvvXbM+3O53EHDeiJZxZF52LqGLSIi4XDIg85uvfVWWltbuf3222ltbeW2224b93sffvhhXnjhBdasWTOpU8Hs4b8x7LSuYYuISDgccgs7mUyydOlSWlpaMMbw5JNPcumll47rve9///t5//vff8iFPJKMb7DKBiywk2phi4hIOBxyC/szn/kMGzZswPM8fN/H87yJKNeECfIBxoAfB8fRwikiIhIOh9zCzmQyfO5zn5uIslSFyVXmYAexygIwIiIiYXDIgQ1w/fXXs3Tp0tHAu+aaa45ooSZSkA8Agx8H5bWIiITFIQf2pz/96TGPw9ZKNcVKl7ha2CIiEibjDuyHHnqIyy67jBdffHE06IwxWJbF6aefPmEFPNJMqTKlK3DUwhYRkfAYd2Afc8wxAJx66qkTVphqMGWDAQLXwlZii4hISIx7mPSyZcsAOPnkk9m9ezdr165l9+7dnHTSSRNVtgkRDC+aYly1sEVEJDwOeV7TddddR2dnJyeeeCKdnZ1cd911E1GuCWNKARgIXNTCFhGR0DjkQWee540uK/qe97yHp5566kiXaULt7RJXC1tERMJj3IH9ve99D8uysCyLlStXcuyxx7Jx40YSicRElu+IM0UDxhC4lkaJi4hIaBw0sK+77jpuu+02Tj31VIrF4pi9r88444wJLdxEMOUAQ+Uatq28FhGRkDhoYO/YsQOAd73rXVxxxRXcd999o6+NZ4vMqcYU953WpcQWEZFwOKRBZ0EQjHn84IMPHtHCVIMpmcrCKbqGLSIiIXLQwN63FfrmFqkx5siXaIKZ0vBa4holLiIiIXLQLvHW1la+8pWv8I53vIN8Pk+5XCYWiwHh7FIOSvvOww5f+UVEJJoOGtirVq1i3bp1rF27llgsxqmnnsqcOXM45phj6OjoqEYZj6igWGlhG1dhLSIi4XHQwD7ttNM47bTTRh+XSiU2bNjAq6++Sl1d3YQWbiIEw13iJjbJBRERETkEh7xwSjweZ/ny5SxfvnwiyjPhRkaJE1MLW0REwuOQlyYNu70tbAW2iIiER+QCe2R7TbWwRUQkTCIX2KOjxBXYIiISIpELbDM8ShwNOhMRkRCJXGAH6hIXEZEQilxgG03rEhGREIpUYBtjNOhMRERCKVKBjQcYMA7YjgJbRETCI1KBHRQre2Fra00REQmbSAW2KRswRht/iIhI6EQrsEum0sLWXtgiIhIy0Qrs4j57YaPEFhGR8IhWYJcNxgy3sCP1yUVEJOwiFVumaDAYjAOuE6mPLiIiIRep1DLlYLSF7djqEhcRkfCIVmAXR7rELbWwRUQkVCKVWqY0PK3LUQtbRETCJWKBHYxO63K00pmIiIRItAK7bDDGDF/DjtRHFxGRkItUagWlvdO6XLWwRUQkRCIV2KYYjLawNehMRETCJFKpZcqVpUk16ExERMImWoE9Mq0rpsAWEZFwiVZg7zvoTF3iIiISIpFKrco17EqXuKsWtoiIhEi0ArtUWUs8cC3NwxYRkVCJVmB7hsBA4GgetoiIhEukUssElaVJsTUPW0REwiVSgY1XyWtjq4UtIiLhEqnUMn6lS9zYWktcRETCJVKBjWcAM9zCVmCLiEh4RCqwTTDcJW5pHraIiIRLtFLLN5qHLSIioRSpwDZeZR62usRFRCRs3GqdaPv27dxyyy0cf/zxtLe3U19fz8qVK6t1emCfLnFbXeIiIhIuVQvs3t5eLr74Yt73vvcBcPHFF7NixQpOPPHEahVhuEvcYGytdCYiIuFStcBevnz5mMdBEJBKpap1eqAyrcsYwAJX87BFRCREqhbY+3r00Uc566yzWLJkydt+XUNDGtd1jsg5m5uzdLkulm3hplxaWrIk45Py8UOhuTk72UUIDdXVoVF9jZ/qavyiUFdVT6xnn32W5557jq985SsH/dqentwROWdzc5aurgEKuTK+H1Aqe/TsGcLVdez9GqkvOTjV1aFRfY2f6mr8plNdvd0fHlVNrMcff5ynn36aG2+8ka6uLl566aVqnn60S9w4GiUuIiLhUrXAfuWVV/jSl77E2rVr+cQnPsGf/dmfsXXr1mqdHgBTNgDYro1lKbBFRCQ8qtYlfuKJJ1a9Rf1mgV8JbCemsBYRkXCJzEVcE5jK9poWOG5kPraIiEwT0UkuX1triohIeEUmuczIoikWuFo0RUREQiY6ge0ZDCMjxCPzsUVEZJqITnIFjLawtSypiIiETWQCe8wcbAW2iIiETGQCG2/vOuLqEhcRkbCJTHKZgNG9sF2tciYiIiETmcAeaWFX9sJWYIuISLhEJrBHr2FrHraIiIRQdJLLHx4lrha2iIiEUGQC2/jD87B1DVtEREIoWoE92sKOzMcWEZFpIjrJNWYtcbWwRUQkXCIT2CODzrDBVQtbRERCJjrJ5ZvRedhqYYuISNhEJrDNaJe4pVHiIiISOpEJbPYZdKYucRERCZvIJNfYhVPUwhYRkXCJTGDjD68lbimwRUQkfCIT2GbMWuKR+dgiIjJNRCa5TLA3sGMKbBERCZnoJNc+a4nH3Oh8bBERmR4ik1zGMwTGgAJbRERCKDrJ5RuCQC1sEREJp8gklwkY3a1LgS0iImETneTap4UdV2CLiEjIRCa5Ai8YHSWulc5ERCRsIpNcftkAYMdsLEsLp4iISLhEJrC9cgCAHVNYi4hI+EQmsP1SJbBdV4EtIiLhE5nAHmlhO64zySURERE5dJEJ7JEWthNXC1tERMInOoG9z6AzERGRsIlMevne8DVsBbaIiIRQZNJrtEtco8RFRCSEIhPYgVfpEnfjkfnIIiIyjUQmvUa6xB0tSyoiIiEUmfQabWEnIvORRURkGolMeo2MEndjmoctIiLhE5nADjRKXEREQiwy6aUucRERCbPIpFcwvDRpTKPERUQkhCKTXsavtLAV2CIiEkaRSS/NwxYRkTCLTHqNBHYsrlHiIiISPpEJbDMS2AkFtoiIhE+EArtyqxa2iIiEUXQCW4POREQkxCKRXkFgRgNbg85ERCSMIpFeJc/HMmDbFrar7TVFRCR83Gqe7JlnnuGRRx6hqakJy7JYuXJlVc5b9gIsHywLcBTYIiISPlUL7Hw+z9/8zd/w85//nHg8znXXXcdvfvMb3vOe90z4uUvl4Ra2ZWEpsEVEJISq1iW+Zs0a5syZQzweB+CUU07h8ccfr8q5y16AFQy3sKvapyAiInJkVC2+uru7yWQyo49ramro7u5+2/c0NKRx3cOfhlUq+WSSMbKZODNn1h728aKguTk72UUIDdXVoVF9jZ/qavyiUFdVC+ympiaGhoZGHw8ODtLU1PS27+npyR2Zc9dlmNmQwnIturoGjsgxp7Pm5qzqaZxUV4dG9TV+qqvxm0519XZ/eFStS/ykk06ira2NUqkEwOrVq1mxYkVVzj0ypcvSmikiIhJSVWthp1Ip/vZv/5a///u/p6GhgWOPPbYqA85gb2BrhLiIiIRVVYdgnXnmmZx55pnVPGWFX7nRCHEREQmrSCycMrLxB+oSFxGRkIpGYI9cw9YqZyIiElLRCmx1iYuISEhFI7BHusQj8WlFRGQ6ikSEqUtcRETCLhqB7Wlal4iIhFskAjvWGMNyLGItsckuioiIyO8lElthxBpjzL11IXZG87pERCScIhHYAE5dZD6qiIhMQ5HoEhcREQk7BbaIiEgIKLBFRERCQIEtIiISAgpsERGREFBgi4iIhIACW0REJAQU2CIiIiGgwBYREQkBBbaIiEgIKLBFRERCwDLGmMkuhIiIiLw9tbBFRERCQIEtIiISAgpsERGREFBgi4iIhIACW0REJAQU2CIiIiHgTnYBJtozzzzDI488QlNTE5ZlsXLlysku0pTykY98hEQiAYBt2/zgBz+gt7eXb33rW8yfP59t27Zx/fXXM2PGjEku6eTo6urilltuYcOGDfz0pz8FoFgscvPNN9PS0sK2bdv47Gc/y1FHHQXAgw8+yPr167FtmwULFvDRj350MotfVfurq/vuu4//+q//Gv0e+9CHPsTll18ORLuutm/fzi233MLxxx9Pe3s79fX1rFy58m1/9m6//XYGBwfp7+/nzDPP5Pzzz5/kT1E9B6qv2267jeeff37066655hrOPPNMYJrWl5nGcrmced/73meKxaIxxpiVK1eaZ555ZpJLNbXceuutb3nur//6r83Pf/5zY4wxjz32mLnhhhuqXawp4xe/+IV57LHHzAc/+MHR5/71X//VrFq1yhhjzIYNG8yVV15pjDFm165d5rLLLjNBEBhjjLniiivM1q1bq17mybK/uvrpT39qduzY8ZavjXpdrV271jz66KOjjy+66CLz8ssvH/Bnb82aNeYzn/mMMcaYcrlsLrjgAtPf31/9gk+SA9XX/n5/GTN962tad4mvWbOGOXPmEI/HATjllFN4/PHHJ7dQU8xrr73GqlWruO2220br5oknnuDkk08GKnX2xBNPTGIJJ9eFF15IJpMZ89zjjz8+Wj/HHnssGzZsYHBwkKeeeooTTjgBy7IAOPnkk3nyySerXubJsr+6Arjnnnu44447+Jd/+Rd6e3sBIl9Xy5cv533ve9/o4yAISKVSB/zZ+/Wvf81JJ50EgOu6LF68eEzLcro7UH0BfO973+OOO+5g1apV5PN5YPrW17TuEu/u7h7zC6Smpobu7u5JLNHUc/XVV7N8+XJ83+fjH/84mUxmTL3V1NTQ19eH53m47rT+dhm3A31f7dmzZ8zzI3UZZaeffjorVqygsbGRJ554gi9+8Yv84Ac/UF3t49FHH+Wss85iyZIlB/zZ27NnD4sXLx59T01NDXv27JmsIk+qfevrwgsvZO7cuaTTae655x6+9rWvcdNNN03b+prWLeympiaGhoZGHw8ODtLU1DSJJZp6li9fDoDjOJx22mk899xzY+ptcHCQuro6hfU+DvR91djYOOb5oaGhyH+/zZ8/n8bGRgDe/e5388ILL+D7vupq2LPPPstzzz3HV77yFYAD/uy9ub4GBwdH6zVK3lxfS5cuJZ1OA5Xvr2effRZg2tbXtA7sk046iba2NkqlEgCrV69mxYoVk1uoKWTz5s38+Mc/Hn3c2trK/PnzOffcc3nppZeASp2de+65k1XEKWnFihWj9bNx40aWLVtGTU0NZ599Nq+++ipmeHn+l156iXPOOWcyizrpvvWtb+F5HgDbtm1j7ty5OI6juqJyaeXpp5/mxhtvpKuri5deeumAP3srVqxgzZo1AJTLZbZs2cLpp58+WUWfFPurr5tvvnn09dbWVhYsWABM3/qa9pt//O///i8PP/wwDQ0NxGIxjRLfR0dHB1/72tc47rjjGBwcxPM8/uqv/or+/n6++c1vMmfOHHbs2MGf//mfR3aU+PPPP88DDzzAU089xZVXXsmnP/1pAG6++Waam5vZvn07n/vc58aMEn/llVdwHIdFixZFauTz/urq3nvvZdOmTcybN4/XXnuNT3ziE6PXFqNcV6+88gpXXXUVJ554IgC5XI6Pf/zjnHfeeQf82bv99tvp7++nr6+Pc845Z3qMeh6nA9XX1q1byefzNDU18dprr/GFL3xh9GdxOtbXtA9sERGR6WBad4mLiIhMFwpsERGREFBgi4iIhIACW0REJAQU2CIiIiGgwBYREQkBBbaIiEgIKLBFQuqFF17g2GOP5f777z/sY/32t7/l2GOP5Tvf+c7ocy+99BIXXXTRYR33n/7pn/jABz4w5t+yZcv4y7/8y8MtskjkKLBFQigIAr7+9a/z7ne/m/Xr1x/28V599VWWL1/Oo48+Oua5448//oDvOe+88w563Ouvv54HH3xw9N973vMelixZwpe//OXDLrNI1CiwRULoRz/6EQsWLOBjH/sYGzZsOOzjrVu3jssuu4x8Ps+OHTuASmCfcMIJh33sEd/61rd4/PHHueuuu6bFRgwi1aYtmERCpr+/n+9///vcc889lMtlNm7cuN+v+8IXvkBra+t+X7v33ntJJpOjj9etW8eHP/xhLrjgAh599FE+/elPs27dOj7wgQ8ckTJ/+9vf5uGHH+buu++mubn5iBxTJGoU2CIhc9ttt3H55Zczd+5cgiCgVCqxa9cuZs+ePebrbr311nEdr1gssnXrVo477jji8Tg33XQTf/Inf8LmzZvf0iV+zTXXsGvXLgA6OztHA91xHO677779Hv873/kODz30ED/84Q9paWk51I8rIsMU2CIhsnnzZn70ox9RX1/PQw89BFS2D1y/fv1bAnu8LewNGzYwb948MpkM73jHO+jo6ODpp59m1qxZ1NbWjnnf97///dH75513Hg8++ODblnfVqlX85Cc/4e67735L+UTk0CiwRULkpptu4qtf/Sof+tCHRp+78cYb2bBhw1sGgY23hb3vtWrLsjjvvPO49dZb33bA2Xjceeed/PCHP+SHP/wh8+bNO6xjiYgCWyQ0HnvsMTo7O/ngBz845vmlS5eyevXq3/u469atGxPOF1xwAT/84Q8Pa0rX1q1bufnmm5k5cybXXXfdmNc+//nP84d/+Ie/97FFokr7YYuIiISApnWJiIiEgAJbREQkBBTYIiIiIaDAFhERCQEFtoiISAgosEVEREJAgS0iIhICCmwREZEQ+P8BYqe1VChmaXYAAAAASUVORK5CYII=\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": "iVBORw0KGgoAAAANSUhEUgAAAesAAAFpCAYAAAC8iwByAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABLaUlEQVR4nO3deXwU9f3H8deeuUNOCOG+5b4RRAU8EBARtFovPKq1atVWa/Fqtdaq4FUrtCq1rf486lEURK1nRRFFUQEBuQk3hJB7k+w9vz82WQgkZCPJbjb7fj4ePLKZnZ357DcJ7/3OfGe+JsMwDERERKTFMke6ABERETk2hbWIiEgLp7AWERFp4RTWIiIiLZzCWkREpIVTWIuIiLRw1kgXINKcli1bxsMPP8yGDRsYOXIkhmHgdDqZNGkSV155JTab7bi2/8033/C3v/2Nf/7zn8dcb/HixSxfvpwHHnjguPZ3pEmTJpGdnQ3Atm3bMAyDHj16AFBQUMB7773XpPs70sKFC3n66afZvXs3Q4cOxev1cvDgQcaNG8ddd92F2Rwd/YFzzjmHefPm0aVLl0iXIlInk66zltbuq6++4vLLL2fdunVYrVaKi4u57bbbsFgsPP3008cVKIZh4HA4SElJOeZ6Pp8Pp9NJUlLSj95XXWbOnMkLL7wAwB133IHX6+XRRx896rnm9MYbb/DEE0/w2WefAbBr1y6mTJnCfffdx3nnndfs+28KZWVlpKamRroMkXpFx8dekSaUnp7O7Nmz+eqrr3jrrbeOa1smk6nBoAawWCxNHtQAt9566496rjl16tSJXr16sXbt2ojs/8dQUEtLp8PgEpOys7M5+eSTee+995g+fToQOKT78ssvY7fbadeuHffddx/JyclA4HD63Llzsdls+P1+LrvsMk488USuu+46Vq9ezcaNGwF49dVXWbBgAQkJCcTHxzNr1iy8Xi+zZs2ivLyc//3vfwAcPHiQ++67j6KiIjweDxdffDEzZsxg7969/PrXv2b16tXMnj2bRYsWsW/fPh566CGGDRt21PsYOnRove9x6NChvPrqqzzzzDMMHjyYpKQk1qxZQ2pqKi+88AJLly5l3rx52Gw2kpOTue+++2jXrh0Aa9eu5aGHHsJkMmGxWLjnnnuCh9dD4fP5yMnJCX5/rO2tWbOGe++9F7vdTp8+fdi0aRPFxcX89re/ZenSpbz99ttcdtllbNmyhbVr13L++edz00038eyzz/LBBx9gtVrp27cvt99+O3a7na1bt3LfffcB4PV6+clPfsJ5553HwYMHueOOO3C5XHi9XiZMmMC1117L7Nmz+c9//sNdd90VPBJQ87tgs9lIT0/nD3/4A1lZWcybN49///vfnHXWWZSXl7N+/Xr69+/PnDlzQm4bkR/FEGnlli9fbvTu3dvweDy1lj/wwAPG5MmTDcMwjG+++cYYNWqUUVhYaBiGYcyePdu46667DMMwjJ07dxpDhw418vLyDMMwjNWrVxuXXXaZYRiGsWvXLqN3796GYRiGw+EwRo0aZbhcLsMwDOO5554zFixYEKxhwoQJwX1fccUVxpNPPmkYhmEUFhYaY8eONVasWFFrm++8845hGIYxf/5842c/+1mD7/P22283fvOb3xy1/MknnzROOukko7Cw0PD5fMbDDz9s7Ny50xgyZIixdetWwzAM48UXXzSuuOIKwzAMo6yszDjxxBONL774wjAMw/jkk0+MiRMnGj6fr879LliwwDjllFOC3//www/GTTfdZJSXlze4PZfLZZx66qnG4sWLg6/t27dvsN0MwzAuu+wy46qrrjK8Xq+xdetW47XXXjMWLVpkTJo0yaisrDT8fr9x8803G3/9618NwzCMm2++Odh2Bw4cMK6++mrDMAxjzpw5xjPPPGMYhmFUVFQYF110Ua191OxzxYoVxujRo4O/C3/961+Nyy+/vFY7n3vuuYbL5TKcTqcxatQo47vvvmvgpyNyfHQYXGKW3+8PPn7zzTc57bTTyMjIAAIDjhYvXoxhGLz99tsMGDCArl27AjBo0CB+/etfH7U9i8UCBHplVVVVXHrppUydOvWo9fLz8/nyyy85//zzAcjIyGD8+PEsWLCg1nqnnnoqAH369GH37t3H9V6HDBlCRkYGZrOZ3/72t8H31L17dwCmTp3Kl19+yYEDB/jkk09ITExkzJgxAIwfP56DBw+yevXqerdfVFTEzJkzmTZtWvB91xyVONb2Vq1aRWFhIZMnTwagb9++dfbgx40bh8VioXv37lxwwQW8+eabnH322SQkJGAymZg6dSqLFi0CoE2bNrz33nvs3r2b7Oxs5s6dC0BaWhpLly5l8+bNJCYm1jsocOHChYwfPz74u3D++eezfPly9u7dG1znxBNP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+fncf//99O3bF4fDgdfr5c4776SsrIxHH32U3Nxcdu3axW9+85uYHQ3+9ddfs3DhQpYuXcrFF1/Mz372MwDmzJlDdnY2O3fu5Be/+EWt0eBr167FYrHQtWvXmBrhXFdbvfrqq2zevJmOHTuyadMmLr/88uD5xFhuq7Vr1zJz5kwGDBgAQGVlJZdeeimnnXZavX97zz77LGVlZZSWlnLqqae2jhHOIaivrfLy8qiqqiIzM5NNmzZx8803B/8OW2NbteqwFhERaQ1a7WFwERGR1kJhLSIi0sIprEVERFo4hbWIiEgLp7AWERFp4RTWIiIiLZzCWkREpIVTWItILStWrKBPnz68+eabkS5FRKoprEUkyO/388ADDzB69GjWr18f6XJEpJrCWkSCXnvtNTp37swll1zChg0bIl2OiFTTVEoiAkBZWRlPP/00L730Eh6Ph40bN0a6JBGpprAWEQDmzp3L9OnT6dChA36/H7fbzb59+2jfvn2kSxOJeQprEWHr1q289tprpKWl8dZbbwGB6QXXr1+vsBZpATTrlohw9dVXM2XKFM4///zgsrvvvpsOHTpwww03RLAyEQENMBOJeR9//DEHDhxgxowZtZb36tVLg8xEWgj1rEVERFo49axFRERaOIW1iIhIC6ewFhERaeEU1iIiIi2cwlpERKSFU1iLiIi0cAprERGRFk5hLSIi0sL9P9puQA2En1dtAAAAAElFTkSuQmCC\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",
|
||
"1 0 0 1 1 H 0.000000 0.000000\n",
|
||
"2 1 1 1 2 H 1.112283 1.112283\n",
|
||
"3 2 2 1 3 H 2.827265 2.827265\n",
|
||
"4 6 2 2 4 He 7.073915 7.073915\n",
|
||
"5 9 3 2 5 He 5.512132 5.512132\n",
|
||
"... ... ... ... ... ... ...\n",
|
||
"264 3304 156 108 264 Hs 7.298375 7.298375\n",
|
||
"265 3310 157 108 265 Hs 7.296247 7.297260\n",
|
||
"266 3317 158 108 266 Hs 7.298273 7.297260\n",
|
||
"269 3338 159 110 269 Ds 7.250154 7.250154\n",
|
||
"270 3344 160 110 270 Ds 7.253775 7.253775\n",
|
||
"\n",
|
||
"[267 rows x 6 columns]\n",
|
||
"0.00988361564671618\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": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJjCAYAAADQ22+yAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABrL0lEQVR4nO3dZ3gU1cOG8XtLEmqIQEJViiiKIhawawAboaMoRREBRRQQUZCAgorUEASkiQqCWCgqQfwTkA5SFNSXYhcFKYGEZqhJtrwfRhJiwpAlk92U58e1F9nZ2Z1zZmdmzz7nzKzN6/V6ERERERHL2ANdABEREZHCRg0sEREREYupgSUiIiJiMTWwRERERCymBpaIiIiIxdTAEhEREbGYM9AFECnKhg0bxubNmwHYuXMnVapUoVixYgDMnTs3/e8LeeqppxgwYAC1atU67zwTJkygWrVqtG7dOtflPqt37958++23rF69muLFi1v2uiIiBZ1N18ESyR8aN27MhAkTqFu3bqCLkiMHDx6kVatW1KtXj4YNG9KhQ4dAF0lEJN9QF6FIPjVx4kS6detGixYt6NevH4cOHeLZZ5+lXbt2NG7cmE6dOnH48GHAaJxt376db775hvbt29O/f39at25N06ZN2bRpEwDR0dFMnz4dgLp16zJx4kTat29P48aNmTlzJgBut5uRI0dy33338eCDD/Laa6/RqVOnbMs3b948brvtNtq0acMHH3zAud/Vtm7dysMPP0zz5s1p06YNGzduNJ1eu3Ztjhw5kv78s/e/+eYbWrZsSfv27WnZsiWpqakMGzaMhx9+mKZNmxIVFcV3330HwMmTJxk4cCAPPPAATZs25c033+TUqVM0aNCAv/76K/21u3TpwvLly614i0REzksNLJF8bN++fSxYsIDY2Fj+97//cf311zN37lxWrFhBsWLFWLhwYZbnbNu2ja5duxIXF0fbtm2ZNGlSlnlSU1O55JJLmDNnDm+99RZjx44lJSWF+fPn8+OPP/Lll18yZ84c9uzZk225XC4X8+bNo2XLljRu3JjDhw+zdu1aANLS0ujZsyc9e/bkyy+/5I033mDEiBGkpqZmO93j8Ziug99//52xY8fyxRdf8OOPP5KYmMjcuXNZvHgxbdq04d133wXgrbfeIiUlhcWLFxMXF8f333/P9u3bad26NfPnzwfg77//5q+//qJRo0Y+vQ8iIr7SGCyRfOz666/H6TR2086dO7Nlyxbef/99du3axe+//069evWyPKdy5cpcffXVANSpU4cFCxZk+9r33HMPANdccw2pqamcOnWKNWvW0KpVK0JCQgBo164ds2fPzvLcFStW4PF4uOuuu3A6nTRt2pRZs2YRGRnJb7/9ht1up2HDhgBce+21LFq0iB9//DHb6RdSqVIlqlSpAsANN9xAmTJl0ht/33zzDSVLlgRgw4YNDBw4EIfDgcPh4MMPPwQgIiKCxx57jL59+zJ37lzatm2Lw+G44HJFRHJDDSyRfKxEiRLpf48ZM4Zt27bx0EMPccstt+ByuchuCOW5A+NtNlu28wDpjSibzQaA1+tNb8ydZbdnH3J/8sknnDlzhvvvvx8wErGkpCR+//13HA5H+mue9dtvv513es2aNTNNS01NzXT/3HWwevVqhg8fTpcuXbjnnnuoWbMmX3zxBQBOpzPT6yckJFCsWDFq1KhB7dq1WbFiBYsWLUpPs0RE8pK6CEUKiK+//prOnTvTunVrypUrx4YNG3C73ZYuIzIyki+++ILU1FRcLle26ddff/3Ft99+y4IFC1i5ciUrV67k66+/pn79+syaNYuaNWtis9lYv349AD/++COdO3c+73SPx0PZsmXZvn07AMuWLTtv+davX0+jRo3o2LEjdevWZfny5enr4LbbbmPBggV4PB5SU1N57rnn0s/Q7NixIzExMdSrV48KFSpYus5ERLKjBEukgOjZsycxMTFMmTIFh8PBjTfeyN9//23pMh588EH++usvWrduTYkSJahatWqWyy988skn3HvvvVx22WWZpvfq1Yunn36aF154gYkTJzJixAhiYmIICgpi4sSJBAcHn3f6K6+8wtChQwkNDeX2228nPDw82/K1b9+efv360aJFCxwOB/Xr1+err77C4/HQq1cvhg8fTqtWrXC73TRt2jQ9YWvUqBGvvPIK7du3t3R9iYicjy7TICLpvv76aw4fPkyrVq0A4zpdISEh9O/fP8Aly53vv/+ewYMH8+WXX2bpphQRyQtqYIlIuoMHDxIdHc3hw4dxu91cddVVvPbaa5QuXTrQRbtoAwYM4Ntvv2X06NHcfPPNgS6OiBQRamCJiIhIgbdo0SKmTp1KWloaTzzxBI8++mhAy6MxWCIiIlKgHTx4kHHjxvH5558THBxM+/btueWWW0x/PiyvqYElIiIi+UZycjLJyclZpoeGhhIaGprtczZs2MCtt95KWFgYAA888ABLliyhV69eeVlUUwW+gXU6oUagixAwHsyvgF3YuYt477aHol3/IJuuMiNFV8lKu/26PM+BK/22rFnze2f7CxS9evWid+/e2T4nMTEx09nHERERbNu2Lc/KmBMFvoElIiIihUfnzp1p06ZNlunnS6+AbC+oHOgzhtXAEhERkXzDrCvwfCpUqMCWLVvS7ycmJhIREWF10XyijF1ERERMefz472LcfvvtbNy4kSNHjnD69Gm++uor7r77bovXgm+UYImIiEiBVqFCBfr27cvjjz9OWloabdu25brrrgtomQr8dbA0yL3o0iD3ol1/DXKXoszfg9xTEmpeeCaLhFT602/Lyks6QomIiIhYTF2EIiIiYqqoJ+YXQwmWiIiIiMWUYImIiIipoj7m92IowRIRERGxmBIsERERMVXUz9q+GEqwRERERCymBEtERERM6SxC3ynBEhEREbGYGlgiIiIiFlMXoYiIiJhyq4vQZ0qwRERERCymBEtERERMaZC775RgiYiIiFhMCZaIiIiY0oVGfacES0RERMRiSrBERETElH7q2XdKsEREREQspgRLRERETOk6WL5TgiUiIiJiMSVYIiIiYsqtAMtnSrBERERELKYES0REREzpLELfKcESERERsZgSLBERETHlxhboIhQ4SrBERERELKYGloiIiIjF1EUoIiIipjy6TIPPlGCJiIiIWEwJ1kVauc7G4JFO1i9OS5+2fI2N6R85SE2FShVh2EAXYWUCWEiLfbnUzofzMjaZEychMclG/PwUypU1ph1IhM7PhjDnvRQuCQtMOfPKqnV23pkZhM0GoaW9vNIvjapVvLjdMG5KEJs223G74bF2Lh5q6Q50cS0373Mn8+OchARD9Woe+vdJpUxoxuMHE2106xnCh++dKVTb/Vm//2kjZkIQJ06C3Q4vv5hGndpePB546x0nX2+yY7fBpVW9vPJiWqHb/s9Xf4C333fy1So7DjtcXdvLyy+kERIS4AJbxOy4F1YG3pziZOO3dlxueLydm7atCt++DxrkfjGUYF2E3Xth3FQnnnMuDPLjLzZGTXAS+7qLz2a6qFbVy6T3HIErZB5o/oCHOdNTmTM9ldnTUilXFl7q40pvXH25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sERERKRI6dOnD9HR0TRr1ozSpUsTGxsLQKdOnRgyZAjNmjUjODiYmJgYAJo0acK2bdvSB8APHz6cYsWKmS7D5s2uY7EAOZ1QI9BFkACxU7R/fNRDgd51JZeK+vZf1IVU+tOvy3t4wzN+W9b826f6bVl5SV2EIiIiIhZTF6GIiIiY8igx9ZkSLBERERGLKcESERERU/68DlZhoQRLRERExGJKsERERMSUEizfKcESERERsZgaWCIiIiIWUxehiIiImFIXoe8KfAMrxBYU6CKIiIiIZFLgG1giIiKSt5Rg+U5jsEREREQspgRLRERETOmncnynBEtERETEYkqwRERExJTGYPlOCZaIiIiIxZRgiYiIiCklWL5TgiUiIiJiMSVYIiIiYkoJlu+UYImIiIhYTAmWiIiImFKC5TslWCIiIiIWU4IlIiIiprxKsHymBEtERETEYmpgiYiIiFhMXYQiIiJiSj/27DslWCIiIiIWU4IlIiIipnSZBt8pwRIRERGxmBIsERERMaXLNPhOCZaIiIiIxZRgiYiIiCmNwfKdEiwRERERiynBEhEREVMag+U7JVgiIiIiFlOCJSIiIqY0Bst3SrBERERELKYES0REREx5vYEuQcGjBEtERETEYkqwRERExJQHjcHylRIsEREREYupgSUiIiJiMXURioiIiCldaNR3SrBERERELKYE6zxWb4Rx70BqGtSuCcMGQKmSmecZPRmWroYyocb96pfCuNfA44Gx02DNJrDboFpVeL0flA3zcyVyISf1/20nDHsLTpwAuwNefxGuqZ15npGTYPdeeHuU/8qeWzmp+1nL10H0CNgSnzHtoacgJQWCgoz7ze+Fbh3yvtxWuVD945bArPkZ94+fgINJsOpTKF8WPl4An/7PWAfX1IZhL0FwsP/rcbG071/8vl9U6n9Wdvv/pPchfqWxXq650lg3ISH+KXte0oVGfacEKxtHjsHLo2DCGxD/IVStbBw0/uuHHTD2VVgw3biNe82Y/tli+Ok3+Pxd+GImXFbFOCAXFDmp/+kz0K2f0XD4fDo88zj0H5Z5nviVsOgrvxXbEjl97wF27YUxUzNfH+bUadizHxbMyNguClLjKif1b90ko27zphmNqleeN/7/ai189DnMeBMWzYIzKZkbY/md9v3c7ftFof5nZbf/f/sDLF4Jn70HX7wPJ07Ch5/7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IzP/6GPNmjWZOXMmqampREdH43K5ePrpp8/7GvbsLnj27/Tshqufb/6z1MASERERc35MsEJDQ00bU9mJiorK9rJPJ0+e5JlnniEsLIypU6cSFBQEQEREBIcOHaJixYq4XC5OnDhBWFgYERERJCUlUa1aNQCSkpKIiIigQoUKJCUlpb/u2elm/PZbhCIiIiL+1L9/f6pVq8aECRMIDs74UeDIyEji4uIAWLx4MfXr1ycoKIjIyEgWLlwIwJYtWwgJCaFy5crcfffdLFq0CLfbze7du9m1axd169Y1XbYSLBERETFXAM8i/Omnn1ixYgW1atWidevWgJFcvfvuu/Tp04fo6GiaNWtG6dKliY2NBaBTp04MGTKEZs2aERwcTExMDABNmjRh27Zt6QPghw8fTrFixUyXf8HrYOV3ug6WiIgUNf6+Dtblsf67DtbOftZdByuQlGCJiIiIKX+eRVhYaAyWiIiIiMWUYImIiIg5r3692ldKsEREREQspgRLREREzGkMls+UYImIiIhYTA0sEREREYupi1BERERM6TINvlOCJSIiImIxJVgiIiJiTgmWz5RgiYiIiFhMCZaIiIiY0hgs3ynBEhEREbGYEiwRERExpwTLZ0qwRERERCymBEtERETMKcHymRIsEREREYspwRIRERFTOovQd0qwRERERCymBpaIiIiIxdTAEhEREbGYxmCJiIiIOY3B8pkSLBERERGLqYElIiIiYjF1EYqIiIgpXabBd0qwRERERCymBEtERETMKcHymRIsEREREYspwRIRERFzSrB8pgRLRERExGJKsERERMSUziL0nRIsEREREYspwRIRERFzSrB8pgRLRERExGJKsERERMSUxmD5TgmWiIiIiMWUYImIiIg5JVg+U4IlIiIiYjElWCIiImJOCZbPlGCJiIiIWEwNLBERERGLqYtQRERETOkyDb5TgiUiIiJiMSVYIiIiYk4Jls+UYImIiIhYTAmWiIiImFOC5TMlWCIiIiIWU4IlIiIipnQWoe+UYImIiIhYTAmWiIiImFOC5TMlWCIiIiIWU4IlIiIipjQGy3dKsEREREQspgRLREREzCnB8pkSLBERERGLKcESERERc0qwfKYES0RERMRiamCJiIiIWExdhCIiImLKFugCFEBKsEREREQspgRLREREzGmQu8/UwDqP1Rth3DuQmga1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IiIiYjElWCIiImLKpgTLZ0qwRERERCymBpaIiIiIxdRFKCIiIubURegzJVgiIiIiFlOCJSIiIqY0yN13SrBERERELKYES0RERMwpwfKZEiwRERERiynBEhEREXNKsHymBEtERETEYkqwRERExJTOIvSdEiwRERERiynBEhEREXNKsHymBEtERETEYkqwRERExJTNqwjLV0qwRERERCymBEtERETMKcDymRIsEREREYupgSUiIiJiMXURioiIiCldaNR3SrBERERELKYES0RERMwpwfKZEiwRERERiynBEhEREVMag+U7JVgiIiIiFlOCJSIiIuaUYPlMCZaIiIiIxZRgiYiIiCmNwfKdEiwRERERiynBEhEREXNKsHymBpaIiBQoHjyBLkLAqfsp/1MDS0RERExpDJbv1AgWERERsZgSLBERETHnVYTlKyVYIiIiIhZTA0tERETEYuoiFBEREVMa5O47JVgiIiIiFlOCJSIiIuaUYPlMCZaIiIiIxZRgiYiIiCmbLp7vMyVYIiIiIhZTgiUiIiLmNAbLZ0qwRERERCymBEtERERM6TpYvlOCJSIiImIxJVgiIiJiTj/27DMlWCIiIiIWU4IlIiIipjQGy3dKsEREREQspgRLREREzCnB8pkSLBERERGLqYElIiIiYjF1EYqIiIgpDXL3nRIsEREREYspwRIRERFzutCoz5RgiYiIiFhMDSwRERExZfP672alLVu28OCDD9KiRQt69OjBP//8A0BycjLdu3cnKiqKRx99lKSkJABSU1Pp378/UVFRtGnThp07dwLg9XoZPXo0TZo0oWnTpnz33XcXXLYaWCIiIlIoDRw4kJiYGBYtWkStWrWYPn06AOPHj6d+/frEx8fz8MMPM3z4cABmz55N8eLFiY+PZ9CgQURHRwOwdOlSdu7cyeLFi5k8eTLR0dG4XC7TZauBJSIiIua8/rslJyezd+/eLLfk5GSfi7148WJq1apFWloaBw8eJDQ0FIDVq1fTokULAJo3b87atWtJS0tj9erVtGzZEoAGDRpw9OhR9u/fz5o1a2jatCl2u50aNWpQuXJlfvjhB9Nla5C7iIiI5BuzZs1i0qRJWab36tWL3r17+/RaQUFB/Prrr3Tp0gWn08kLL7wAQGJiIuHh4QA4nU5KlSrFkSNHMk0HCA8P58CBAyQmJhIREZFluhk1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GPuqKoEuQsAtrejnBSrB8pkSLBERERGLKcESERERc7rQqM+UYImIiIhYTAmWiIiImNKFRn2nBEtERETEYkqwRERExJwSLJ8pwRIRERGxmBIsERERMacEy2dKsEREREQspgRLREREzCnB8pkSLBERERGLKcESERERc7qSu8+UYImIiIhYTA0sEREREYupi1BERERM6adyfKcES0RERMRiSrBERETEnBIsnynBEhEREbGYEiwREREx5ymYCdaWLVsYMWIEaWlpVKlShdGjR1OmTBk2b95Mr169qFixIgB16tRh5MiRJCcn069fP/bs2UPZsmUZP3484eHhpKam8vLLL7Njxw6KFStGbGwsl19+uemylWCJiIhIoTRw4EBiYmJYtGgRtWrVYvr06QBs376drl27snDhQhYuXMjIkSMBGD9+PPXr1yc+Pp6HH36Y4cOHAzB79myKFy9OfHw8gwYNIjo6+oLLVgNLREREzHm9frslJyezd+/eLLfk5GSfi7148WJq1apFWloaBw8eJDQ0FDAaWOvXr6d169b06NGDhIQEAFavXk2LFi0AaN68OWvXriUtLY3Vq1fTsmVLABo0aMDRo0fZv3+/6bLVwBIREZF8Y9asWdxzzz1ZbrNmzfL5tYKCgvj111+JjIzkm2++oVmzZgCULl2axx9/nLi4OCIjI+nbty8AiYmJhIeHA+B0OilVqhRHjhzJNB0gPDycAwcOmC5bY7BERETEnB/PIuzcuTNt2rTJMv1s+pSd+Pj49G6+s2rWrMnMmTOpXbs2GzZsYM6cOfTt25c5c+YwdOjQ9Pk6dOjA2LFjOX78eLavbbdnn0Wdb/pZamCJiIhIvhEaGmramMpOVFQUUVFRmaalpKSwfPly7r33XgBatmzJ6NGj8Xg8TJs2je7du+NwONLndzqdREREcOjQISpWrIjL5eLEiROEhYURERFBUlIS1apVAyApKYmIiAjTMqmLUERERMz5cQyWVZxOJ6+//jo7duwAjJTrxhtvxG63s2zZMpYuXQpAXFwc9erVo3jx4kRGRhIXFwcY47fq169PUFAQkZGRLFy4EDDOTAwJCaFy5crmy7esJiIiIiL5hMPhYNy4cQwZMgS3202FChXSzwocPXo0gwcPZvLkyZQtW5aYmBgA+vTpQ3R0NM2aNaN06dLExsYC0KlTJ4YMGUKzZs0IDg5O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kv88wa/v7qLByGszzf/z239mukyDO9XDzo/+5uhPx8HjpVS1EtR+sgbOEubxa+o/afzyzl/G+C8b1Hr0MspeV4Zdcfv5a/5eSl1WItP81w+qTVBp84FIHcr5Pl5l9SLjZncYA8s79jLGQe36DT4YZzTEwGhErfrCGLNVojR07AmVqxvdwZ++C79uNbaFSy83LrlQPJvLmZwr+ajx+ocOADZ4uLvRWPvfx8blIKpUzzz/C6OzNvz+a1jNej7Xv3mP+2n57AN4XB4O7z/CxF7TObArkStvqskL7z5Djxv7A8alE1o++wA2u50d639hUq/ppJ5JJbhYME/HduK6yGuwO+zs/L9djH96GqeOm++LYRFleOHdHlSsEQFemNZvFt8t22ZaJjP2VVV8rvtZ/738whWlLqVv7fY8+90Y0/mC7UE8VbMl9cJqYbfZ2XliHxN+m8spt3mXflhQKfrWbk/FYuXwer288+dCvj/6KwDNK91Biyp34vZ6OJzyD5P++JSDZ3J25u7SyPE+1jx3oir19Nuy4hMm+21ZeclvDay8ktsGlhRcvjawCpuLaWAVJhfTwCpMLqaBVVjkpoFVWKiBlf8V+QuNioiIyAUU7CwmIIr0hUZFRERE8oISLBERETGnBMtnSrBERERELKYGloiIiIjF1EUoIiIi5rL7OQoxpQRLRERExGJKsERERMSU1+u58EySiRIsEREREYspwRIRERFzGoPlMyVYIiIiIhZTgiUiIiLmdKFRnynBEhEREbGYEiwREREx59FZhL5SgiUiIiJiMSVYIiIiYk5jsHymBEtERETEYkqwRERExJRXY7B8pgRLRERExGJKsERERMScxmD5TAmWiIiIiMXUwBIRERGxmLoIRURExJx+7NlnSrBERERELKYES0RERMx5dZkGXynBEhEREbGYEiwREREx5dUYLJ8pwRIRERGxmBIsERERMacxWD5TgiUiIiJiMSVYIiIiYkpjsHynBEtERETEYkqwRERExJzGYPlMCZaIiIiIxWxer1cdqyIiIiIWUoIlIiIiYjE1sEREREQspgaWiIiIiMXUwBIRERGxmBpYIiIiIhZTA0tERETEYmpgiYiIiFhMDSwRERERi6mBJSIiImIxNbBERERELKYGloiIiIjF1MASERERsZgaWCIiIiIWUwMrFxYtWkTTpk257777+OijjwJdHL87ceIEzZs3Z+/evYEuit9NmjSJZs2a0axZM2JiYgJdHL+bMGECTZs2pVmzZrz//vuBLk5AjB49mujo6EAXw+8ef/xxmjVrRqtWrWjVqhVbt24NdJH8auXKlTz44IM0adKEYcOGBbo4ko85A12AgurgwYOMGzeOzz//nODgYNq3b88tt9xCrVq1Al00v9i6dSuvvPIKu3btCnRR/G7Dhg18/fXXLFiwAJvNxpNPPsmyZcu47777Al00v/j222/ZtGkTX3zxBS6Xi6ZNmxIZGUnNmjUDXTS/2bhxIwsWLKBhw4aBLopfeb1e/vzzT1avXo3TWfQ+Pvbs2cOrr77K/PnzKVeuHJ07d2bNmjVERkYGumiSDynBukgbNmzg1ltvJSwsjBIlSvDAAw+wZMmSQBfLb+bNm8err75KREREoIvid+Hh4URHRxMcHExQUBCXX345+/fvD3Sx/Obmm2/mgw8+wOl0cvjwYdxuNyVKlAh0sfzm2LFjjBs3jh49egS6KH73559/YrPZeOqpp2jZsiUffvhhoIvkV8uWLaNp06ZUrFiRoKAgxo0bR7169QJdLMmnit5XEIskJiYSHh6efj8iIoJt27YFsET+NXz48EAXIWCuuOKK9L937drF4sWLmTNnTgBL5H9BQUG89dZbzJgxgyZNmlChQoVAF8lvhgwZQt++fUlISAh0UfwuOTmZ2267jddee40zZ87w+OOPU6NGDe64445AF80vdu/eTVBQEN26dSMpKYlGjRrx/PPPB7pYkk8pwbpIXq83yzSbzRaAkkig/P7773Tt2pUBAwZQvXr1QBfH75577jk2btxIQkIC8+bNC3Rx/GL+/PlUqlSJ2267LdBFCYgbbriBmJgYSpQoQdmyZWnbti1r1qwJdLH8xu12s3HjRsaMGcO8efPYvn07CxYsCHSxJJ9SA+siVahQgUOHDqXfT0xMLJLdZUXVd999xxNPPMGLL75ImzZtAl0cv9q5cyc///wzAMWLF+f+++/n119/DXCp/GPx4sWsX7+eVq1a8dZbb7Fy5UpGjBgR6GL5zZYtW9i4cWP6fa/XW6TGYpUvX57bbruNsmXLUqxYMe65554i1XMhvlED6yLdfvvtbNy4kSNHjnD69Gm++uor7r777kAXS/wgISGBnj17EhsbS7NmzQJdHL/bu3cvr7zyCqmpqaSmprJixQpuuummQBfLL95//32+/PJLFi5cyHPPPUfjxo0ZNGhQoIvlN8ePHycmJoaUlBROnDjBggULiszJHQCNGjXi66+/Jjk5Gbfbzbp167jmmmsCXSzJp4rOVw+LVahQgb59+/L444+TlpZG27Ztue666wJdLPGD6dOnk5KSwqhRo9KntW/fng4dOgSwVP4TGRnJ1q1bad26NQ6Hg/vvv79INjSLokaNGqW/9x6Ph44dO3LDDTcEulh+U69ePZ588kk6duxIWload9xxBw899FCgiyX5lM2b3WAiEREREblo6iIUERERsZgaWCIiIiIWUwNLRERExGJqYImIiIhYTA0sEREREYupgSUiIiJiMTWwRERERCymBpaI+CwqKoq7776b33//PdBFERHJl9TAEhGfffnll1SvXp2lS5cGuigiIvmSGlgi4jOHw8FNN91UZH7kWUTEV/otQhHx2ZkzZ/jf//6HfmlLRCR7SrBExGfjxo2jQoUK7Nmzh5MnTwa6OCIi+Y4aWCLikx9++IElS5YwceJESpcuzW+//RboIomI5DtqYIlIjqWkpDBw4EBef/11wsLCuOqqqzQOS0QkG2pgiUiOTZgwgRtuuIGGDRsCcNVVV/HLL78EtlAiIvmQGlgikiPbtm1jyZIlDBo0KH3a1VdfrQRLRCQbNq9OAxIRERGxlBIsEREREYupgSUiIiJiMTWwRERERCymBpaIiIiIxdTAEhEREbGYGlgiIiIiFlMDS0RERMRi/w+I8mbyTfmDGQAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<Figure size 720x720 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_61_10.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>1</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.587401</td>\n",
|
||
" <td>0.793701</td>\n",
|
||
" <td>0.500000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>2.080084</td>\n",
|
||
" <td>0.693361</td>\n",
|
||
" <td>0.333333</td>\n",
|
||
" </tr>\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>...</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>267 rows × 5 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" 1 A A^(2/3) A^(-1/3) 1/A\n",
|
||
"A \n",
|
||
"1 1.0 1.0 1.000000 1.000000 1.000000\n",
|
||
"2 1.0 2.0 1.587401 0.793701 0.500000\n",
|
||
"3 1.0 3.0 2.080084 0.693361 0.333333\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",
|
||
".. ... ... ... ... ...\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",
|
||
"[267 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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0mmMUVluDL7rV+4xD9nqLhERmXqUTmOMqsy90g5qVqh0j3ltQnuZi4jI1KMwH2N4rXfLssA3GAPl9d9obYhPZtNERETGpTAfY3g110jYxvIMvu+T94fDPDZ5DRMREdkBhfkYphzcdYkI0ZCF5xv6yku6ttSrMhcRkalHYT7G8H3mtm3RlIwCUCjvvtJSr8pcRESmHoX5GMPz3ywL6qLlpetDNvU1USLh0OQ1TEREZAcU5mMMz2a3LIu4EwIssC1dLxcRkSlLYT7GcGVuWxZewSMatjEhSzPZRURkyqr6FqhT3ba12Q25XJH6mijh+hgL5jZMZrNERER2SGE+RiXL/dLM9ob6GO8789BJbZOIiMjOaJh9jMp+5l5pBns0pt93RERkalOYj1GZze6VHkSimsEuIiJTm8J8jOFr5qZ8b3k0qspcRESmNoX5GKa8nqspV+bhiMJcRESmtp2Gue/7O/vytFSpzMvXzDXMLiIiU91Ow/zEE0/klltuYeXKldVqz6QzlTAfvmauylxERKa2nYb5jTfeyIYNG7jgggs477zz+P73v09vb2+12jYpyvusjAhzVeYiIjK17bTsPPXUUzn11FMZHBzkwQcf5P777+fWW2/lhBNO4LzzzuPkk08mHA5Xq61VYUYOszshIrpmLiIiU9yEJsDV1dWxbNkyfvzjH/PrX/+aww8/nC9+8YuccMIJ+7p9VTd8a5rvaphdRESCYZdmsxcKBV588UVeeOEFuru7Ofjgg/dVuybNcGXuawKciIgExITKzmeffZb777+fhx56iKamJt7znvdwww03MGfOnH3dvqrzDWAMxh0Oc1XmIiIyte00qb761a/yy1/+kv7+ft71rnfxrW99i2OOOaZabZsUxhiGV3QNR0LYtjW5DRIREXkDOw3z559/nquvvppTTz2VaDRarTZNKmMA32BZWjBGRESCYadp9d3vfrfy+IknnuBXv/oVvb29fOtb3+LFF18klUqxZMmSfd7IajLGYPm6LU1ERIJjQhPg7rrrLm688UYOOOAAnnnmGQBisRhf+cpX9mnjJoNvhv/H0rrsIiISCBMK8+9///t873vf4/LLL8e2S2858MADWbNmzT5t3GQwxmwbZldlLiIiATChME+n08yaNQsAyypNCHNdd9otGAOltdm3DbOrMhcRkalvQmH+tre9je985zujjv3gBz/g2GOP3SeNmkyVCXCg1d9ERCQQJpRW119/PR/96Ee59957SafTnHHGGSSTSb797W/v6/ZV3fAwO44mwImISDBMKMzb2tr42c9+xosvvsjGjRuZNWsWRx55ZOX6+XRSqsxLj8MRhbmIiEx9Ow3zTZs2jXre0tJCS0sLAFu2bAFg9uzZ+6hpk8M3BsuUhtkdZ/r9siIiItPPTsP85JNPrkx4G16zfCTLslixYsW+adkk8Y0pl+eWKnMREQmEnYb5woULyeVynHfeebznPe+hra2tWu2aNMPD7JYFIVXmIiISADsN81/84hesXLmS++67jwsvvJD58+dz7rnncvrppxOLxarVxqoylcocwmFV5iIiMvW9Yel58MEHs3z5ch599FEuueQSfv/733PCCSfw8ssvV6N9Vef7pfvMLcBRmIuISABMeBx57dq1PPPMM/zpT3/i0EMPpa6ubl+2a9IM72NuhSztmCYiIoGw02H2/v5+fvWrX3HfffeRTqc599xzufvuu6fdDPaRPK80xB4K6Xq5iIgEw07D/B3veAdz587l3HPP5aijjgJg3bp1rFu3rvKa6bZrmueWKnNNfhMRkaDYaZi3traSz+f5yU9+wk9+8pPtvm5ZFo888sg+a9xkUJiLiEjQ7DTMH3300Wq1Y8oYvmauMBcRkaDYaZgvXbqUE088kaVLl3L88ccTj8er1a5J47vla+aOZrKLiEgw7LT8vPfeeznyyCO5//77Oemkk7j00ku58847Wb16dbXaV3XDlbmWchURkaDYaWXe1tbG+973Pt73vvfhui7PPPMM//3f/81VV11FsVisVO6LFy8mEolUq837lDc8zB5WmIuISDBMeMNux3FYsmQJS5YsYfny5WzYsIHHHnuMu+++m1WrVvGRj3xkX7azanxXlbmIiATLhMN8rLlz5/LBD36QD37wg7v83n/5l3+hr6+Pm2++eXe//T5j/NI1c0eVuYiIBETVE+upp57ivvvuq/a3nbDhW9O0lKuIiARFVcO8v7+f2267jY9+9KPV/La7ZLgy161pIiISFLs0zP7pT396h1/74he/+Ibv//znP88111zD5s2bd+Xb7lBzc81eOU9ra23lcci2sW2LpqbkqOOyjfpl4tRXu0b9NXHqq4mbCX21S2H+4Q9/GIA777yTI444giOOOIKXXnqJV1999Q3fe++9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rWx3tbbW0lYfwxhDT08a21Z1vjOtrbV0dQ1NdjMCQX21a9RfE6e+mrjp0le2be20gK3qMPtxxx3HU089RW9vL9lslocffpgTTzyxmk3YjjGmMmKgUXYREQmiqlfm11xzDRdffDHFYpELLriAI488sppN2I7xh4Nc18xFRCSYqhrmAOeccw7nnHNOtb/tDvnDVbmG10VEJKBm/JJnfnkvc10rFxGRoJrxYW5UmYuISMDN+DD3fU1+ExGRYJvxYW5Ke6xgK81FRCSgZnyY+34pzTXMLiIiQaUwN5oAJyIiwTbjwzwWC2OHbBI1kcluioiIyG6p+n3mU00k6nDSmYfghGf87zUiIhJQMz7MAaIxdYOIiASXylEREZGAU5iLiIgEnMJcREQk4BTmIiIiAacwFxERCTiFuYiISMApzEVERAJOYS4iIhJwCnMREZGAU5iLiIgEXKDXMd1bO51px7Rdo/6aOPXVrlF/TZz6auKmQ1+90c9gGVPeA1REREQCScPsIiIiAacwFxERCTiFuYiISMApzEVERAJOYS4iIhJwCnMREZGAU5iLiIgEnMJcREQk4BTmIiIiAacwFxERCTiFuYiISMApzEVERAJuRof5Aw88wJlnnslpp53GD3/4w8luzpRz8cUXc9ZZZ3Huuedy7rnn8vzzz6vPxkilUpx99tls2LABgCeffJJzzjmH008/ndtuu63yuhUrVvDe976XM844g89+9rO4rjtZTZ5UY/vr05/+NKeffnrlM/bb3/4W2HE/zhRf+9rXOOusszjrrLO45ZZbAH22dma8/ppxny0zQ23ZssWcdNJJpq+vz6TTaXPOOeeYVatWTXazpgzf983xxx9visVi5Zj6bLQ//elP5uyzzzaLFi0y69evN9ls1ixdutS8/vrrplgsmg9/+MPm97//vTHGmLPOOsv88Y9/NMYY8+lPf9r88Ic/nMSWT46x/WWMMWeffbbp7Owc9bqd9eNM8MQTT5gPfOADJp/Pm0KhYC6++GLzwAMP6LO1A+P118MPPzzjPlsztjJ/8sknWbx4MQ0NDSQSCc444wweeuihyW7WlLF69Wosy+Jv//Zvec973sPdd9+tPhvjJz/5CTfccANtbW0AvPDCC+y///7MmzcPx3E455xzeOihh9i4cSO5XI43v/nNAJx//vkzst/G9lcmk2HTpk187nOf45xzzuH222/H9/0d9uNM0draynXXXUckEiEcDjN//nzWrl2rz9YOjNdfmzZtmnGfLWeyGzBZtm7dSmtra+V5W1sbL7zwwiS2aGoZHBxkyZIl3HjjjeRyOS6++GLe/e53q89G+MIXvjDq+Xifqc7Ozu2Ot7a20tnZWbV2ThVj+6unp4fFixfzj//4jyQSCa644gp++tOfkkgkxu3HmWLBggWVx2vXruXBBx/kQx/6kD5bOzBef/3oRz/i6aefnlGfrRlbmRtjtjtmWdYktGRqOvroo7nllltIJBI0NTVxwQUXcPvtt2/3OvXZNjv6TOmzNr558+bx9a9/nebmZuLxOB/60Id47LHH1F9lq1at4sMf/jDLly9nv/322+7r+myNNrK/DjzwwBn32ZqxYd7e3k53d3fl+datWyvDfwLPPvssTz31VOW5MYY5c+aoz3ZiR5+psce7urrUb8Brr73Gb37zm8pzYwyO4+j/m8Bzzz3HJZdcwic/+UnOO+88fbbewNj+momfrRkb5scddxxPPfUUvb29ZLNZHn74YU488cTJbtaUMTQ0xC233EI+nyeVSnHfffdx6623qs924qijjmLNmjWsW7cOz/P4z//8T0488UTmzJlDNBrlueeeA+AXv/iF+o3SP7A33XQTAwMDFItF/uM//oPTTjtth/04U2zevJkrr7ySL33pS5x11lmAPls7M15/zcTP1oy9Zt7e3s4111zDxRdfTLFY5IILLuDII4+c7GZNGSeddBLPP/88f/VXf4Xv+1x00UUcc8wx6rOdiEaj3HzzzXz84x8nn8+zdOlS3vWudwHwpS99ieuvv550Os1hhx3GxRdfPMmtnXwLFy7k8ssv58ILL8R1XU4//XTOPvtsgB3240xwxx13kM/nufnmmyvHli1bps/WDuyov2baZ8sy411EEBERkcCYscPsIiIi04XCXEREJOAU5iIiIgGnMBcREQk4hbmIiEjAKcxFREQCTmEuIiIScApzkWnEdV3e/e53c/rpp++1cw4MDHDIIYfwgQ98YNTxz3/+89x00017fP6vf/3rHH300aP+HHHEERxyyCH86le/2uPzi8wEM3YFOJHp6J577qG3t5fBwUEymQyJRGKPz7lixQpaW1v585//TFdXV2XXqRUrVnDRRRft8H1f/epXAfj4xz++0/NfeeWVXHnllZXn6XSaSy+9lMbGxr36S4nIdKbKXGSaGBoa4mtf+xqf+9znCIVCrFq1aq+c99VXX+Xwww/n+OOP55FHHgHA8zxWrlzJoYceule+x7BcLsdHP/pR4vE4t99+O+FweK+eX2S6UmUuMk184xvfYN68eZx99tl861vf4rXXXuOoo47a7nVXXHFFZWOOsY455hi+/e1vjzr2yiuvsHDhQt70pjfxwAMPsGzZMlavXo3v+8yfP3+vtb9QKHDVVVdRLBb593//d6LR6F47t8h0pzAXmQbWr1/PXXfdxR133AHAQQcdxGuvvTbua8eG9RtZsWIFp5xyCosXL+bGG28klUqxYsUKFixYsNcqZ9d1+cQnPkFPTw8/+MEP9srlAZGZRGEuMg3ceuutHHfccRx77LFAKcxH7ke/uwqFAqtXr+bQQw+lvr6eI444gv/+7/9mxYoVLFy4cLvXj6z68/k8AN///veB8at+AN/3ue6661izZg133XUXtbW1e9xukZlGYS4ScM8++yy/+c1vqKmp4fjjjwdK155te/wpMZdddtlOh9m/+93vVp6vXLmSWCzGvHnzADj11FN55JFH6O7u5rTTTtvu/SPDeqIT4G644QZeeOEF7r77bpqamnb6WhEZn8JcJMCMMdx8880sW7aMq666qnJ806ZNvP/972fTpk3Mnj171HtGhvUbWbFiBYcccgiWZQFw8sknc/vtt2Pb9huG9ER88Ytf5A9/+AM//OEPaWtr2+PzicxUCnORAPvlL39JT08P1157LclksnK8paWFZDLJa6+9tl2Y74oVK1aMmrE+d+5c5syZw2uvvTbuMPuuWLlyJXfeeSfhcJizzz571Nfi8TiPP/74DkcXRGQ0yxhjJrsRIiIisvv0a6+IiEjAKcxFREQCTmEuIiIScApzERGRgFOYi4iIBJzCXEREJOAU5iIiIgGnMBcREQm4/x8jLm31tc16WQAAAABJRU5ErkJggg==\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.9547578478889096\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.03787596148305236\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",
|
||
"1 0 inf\n",
|
||
"2 1 1.123190\n",
|
||
"3 2 0.327631\n",
|
||
"4 6 0.344172\n",
|
||
"5 9 0.044402\n",
|
||
" ... \n",
|
||
"264 3304 0.009911\n",
|
||
"265 3310 0.009154\n",
|
||
"266 3317 0.007824\n",
|
||
"269 3338 0.011347\n",
|
||
"270 3344 0.009790\n",
|
||
"Name: Ebinding, Length: 267, 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.057088709963637\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/H398fPz8/unfvTnZ2Np07dyY2Nhar1UpycjIpKSnk5uZSU1NDfHw8AFOnTiUlJYW6ujq2b9/O+PHjz5guIiIXVlvn4INV6ezeehhcLtrHtGL6jEFEtQ/zdmnSRHjsA/DCCy/w5ptv8sgjj9C+fXteeOEFFixYwAcffHDBz8XFxbn/n52dzerVq7nzzjux2Wzu6ZGRkeTn51NQUHDGdJvNRn5+PidOnCA0NBSr1XrG9CsRERF6RZ//IZtNB5M3aft7n/aBd51r+xcUV/Lu+3uoLK7CYjUzdHgnxo/rhcmsW/waQnM9BjwGgJqaGnr06OF+nZSUdEbbvSf79+9n1qxZPPbYY1itVrKyss6YbzKZMAzjrM9daPqVKC6uwOU6e7mXw2YLo7CwvF6WJZdO29/7tA+861zbP/1AEZ+vO4Cr1omfv5Vrr+tGz542ioorvFRly9aUjwGz2XTBL70emwCsViulpaXuE++hQ4cueuVpaWncddddPPzww9x8881ERUVRVFTknl9QUEBkZORZ0wsLC4mMjCQ8PJyKigqcTucZ00VE5EyGYbBuUxbrP9mHq9ZJWOtAbvnxAHr2tHn+sPgkjwHg5z//OXfccQfHjx/nV7/6Fbfddhv333+/xwUfO3aMBx54gEWLFjF58mQABg0aRFZWFjk5OTidTlatWkViYiIxMTEEBASQlpYGwIoVK0hMTMTPz4+EhARWr159xnQREfmvqpo63l22h8yv8zAZENulLbfNiCc8PNjbpUkTZjLOdZ39B3Jycti8eTMul4sRI0ac0SRwPs8++ywffPABnTp1ck+bPn06Xbp0YeHChdjtdpKSknjiiScwmUxkZGQwd+5cKisr6du3LwsXLsTf35/c3Fwef/xxiouLiY6O5sUXX6R169aX/QOrCaDl0Pb3Pu0D77LZwvhmTx6ffJxBbUUtZrOJIcNiGTq0o4b0bSRN+Rjw1ARw3gCwd+/eCy64X79+V1aZlygAtBza/t6nfeBdGYdK2JCSieFwERDkx9jxPemsR/g2qqZ8DHgKAOftBDh79uzzfshkMrF+/forq0xERC5LncPJ6nUHyDtQguFyER4ZSvKU3oSGBni7NGlGzhsANmzY4P5/RUUFoaGh2O12KioqiIiIaJTiRETkTCWl1az8KJ3KkmosFjO9+kVx3ejumHWLn1wij50AV69ezdSpU4FTw/JOmTLljHAgIiKNI+NgEUvf3U1lSTVWPwtTburHmOt76OQvl8VjAPjLX/7CW2+9BUDXrl1ZtmwZr7zySoMXJiIipxiGwfovD7F+9T6cdgehp2/xGxwf4+3SpBnzOBCQy+Wiffv/jhsdHR2Ny+Vq0KJEROSU6uo6VqxKp+TYqY5mHbu0ZdLEXvj5WbxcmTR3Hq8AhIeH8+677+JwOHA6nbz//vu0a9euMWoTEfFpR4+VseTtnZQcK8dsNjF0VGduSO6jk7/UC49XAJ555hkefvhh5s+fj8lkol+/fixatKgxahMR8VnbvsllR+phDOepW/zGT+xJbMc23i5LWhCPAeA/7f6lpaVYLBZCQ+v3YToiIvJfdQ4nH6/ZR+7BEgAiokK54YY+BAf5e7kyaWnOGwBee+017r33Xv73f//3nCNKzZ07t0ELExHxNUUlVXz0UTpVpTVgMtFnQHuuTeyC2eyxtVbkkp03AISFnXq8Ydu2bRutGBERX/Vtej6bPs/CVefE6m/h2ut60Kun+ltJwzlvAJg+fTpwqhPgjBkzzpj3t7/9rWGrEhHxEU6Xi7XrD3IooxAMg1bhwSQn96ZN6yBvlyYt3HkDwDvvvENNTQ1vvvkmdrvdPb2uro4lS5Zw3333NUqBIiItVWlZDR9+lE55cRVgolsvG+PG9MBi0SV/aXjnDQBWq5V9+/ZRU1PDvn373NMtFgtPPfVUoxQnItJS7TtYzGefHsBR68BiNTMqsSsD+7f3/EGRenLeAHDrrbdy6623sm7dOsaMGdOYNYmItFgul4vPv8wmffdxMAyCWwUwJbkPtogQb5cmPsbjdaaXXnqpMeoQEWnxKqtq+fd735K+6xgYBjFdw7njjsE6+YtXeBwHoGfPnrz66qskJCQQHBzsnt6vX78GLUxEpCXJOXySNWv2UVddh9liJmFkJ4ZepbH8xXs8BoBdu3axa9cu3nvvPfc0k8nE+vXrG7QwEZGWwDAMUr86zK4duRgug8AQfyZO7k2H9mHeLk18nMcAoEf/iohcnhq7g5Wr0inMLQMgsmNrkif3JjDA459ekQbn8bewpKSElStXUllZiWEYuFwucnJy+MMf/tAY9YmINEtHcktZ88k+7FW1mMwmBiZ05JoRnbxdloibxwDwy1/+ksDAQA4cOMCoUaNITU1lyJAhjVGbiEizYxgGW746ws4dRzFcBv7Bfoyf0JNOepCPNDEe7wLIy8vjb3/7G4mJidxxxx288847HD58uDFqExFpVmpq6nh/2R6+2XYEw2XQLqYVd9w+WCd/aZI8XgFo1+7UWNRdunRh37593HDDDTgcjgYvTESkOTmaW0rKJ5nYq+rAbGLgkBiuGdHpnA9TE2kKPAaAiIgI/v73vxMfH88rr7xCaGgoFRUVjVGbiEiT999L/rkYLhd+QX6Mn9iLzh1be7s0kQvy2AQwf/58/P39SUhIoH///rz88ss88sgjjVGbiEiTVl1dxwfL9p6+5O8iokMr7rhjsE7+0iyYDMMwPL3J6XSSmZmJ2WymV69ezfqSVnFxBS6Xxx/5othsYRQWltfLsuTSaft7ny/vg6NHS1mzZh81lbVgNjHgqhh+NLJxL/n78vZvKpryPjCbTUREhJ53vscmgB07djBnzhwsFgsulws/Pz8WL15Mr1696rVQEZHmwDAMtm47ws7tR3G5DPyC/Bg3oSddYtt4uzSRS+IxADz77LMsWLCAxMRE4NTAQPPmzePdd99t8OJERJqSqupaVq/OJP/0wD7h0WHcMKU3IUH+Xq5M5NJd1EOn/3PyB7juuuuorq5usIJERJqinMMn+b9/7Tx18jeb6J/Qkem3DNDJX5otjwGgd+/erF692v1606ZN9OzZs0GLEhFpKgzD4Isvs/h45XfYq+vwC/Zjyk39SBrVuVn3hxLx2ASwbds2VqxYwTPPPIPVaqW4uJiAgADWrVuHyWTi66+/bow6RUQaXXm5ndWrMyjKP3Xrc7vY1twwsTdBgRrLX5o/j7/FS5YsaYw6RESalAMHivls/QFq7Q6wmBk8PJaRQ2L0rV9aDI8BICZGz6sWEd/hdLrYuDGLjL35GIZBQFgAEyf2IkaP75UWRtexREROKy2t5uNVGZworgKgfbdwksfH4e+nP5XS8ui3WkQESE8v4MuNh6irdWKymhl6dWcSBkbrkr+0WB7vAvj1r3/dGHWIiHhFXZ2TlJRMPlt3gLpaJ4FtApn2k4EMHdRBJ39p0TxeAcjIyMAwDB0IItLiFORXkPJJJuVlNWAy0bFnOyZe3wN/P4u3SxNpcB4DgM1mY/LkyQwaNIiQkBD39Llz517UCioqKpg+fTp/+ctf6NixI0888QRpaWkEBQUB8OCDDzJ27FhSU1NZuHAhdrudiRMnMmfOHADS09OZO3cuFRUVJCQkuG9HFBG5XIZhkJaWy45tR3A6XJgDLIxK7MagPpHeLk2k0Xg8kw4ePJjBgwdf1sJ37drF3Llzyc7Odk/bs2cP//rXv4iM/O+BVlNTw5NPPsmSJUuIjo5m1qxZbNy4kaSkJB599FGeffZZ4uPjefLJJ1m6dCkzZsy4rHpERKqr60j5JJO8o2WAQZgthOTJvWnbKtDbpYk0Ko8B4MEHH6SmpoacnBzi4uKora0lMPDiDpSlS5cyb948dz+Cqqoq8vLyeOqpp8jLy2Ps2LE8+OCD7N69m86dOxMbGwtAcnIyKSkp9OjRg5qaGuLj4wGYOnUqL7/8sgKAiFyWnJwTrP90P9VVdWA20XNQNNdd3QWL+aJGRRdpUTwGgF27dvHAAw9gtVp59913ufHGG3n11Ve56qqrPC58wYIFZ7wuLi5mxIgRzJ8/n+DgYGbNmsX7779PcHAwNpvN/b7IyEjy8/MpKCg4Y7rNZiM/P/9Sfr6zXOjRiJfDZtO9wd6k7e99zWEfuJwu1qzNJG3bUVwuF4GtArnx5v706dHO26Vdseaw/Vu65roPPAaA3/3ud7z55ps88sgjtG/fnhdeeIEFCxbwwQcfXPLKYmNj+fOf/+x+feedd7JixQomTJhw1ntNJhOGYZxz+pUoLq7A5Tp7uZejKT8H2hdo+3tfc9gHZaU1rF6dQXFhJQARsa1JntCLkCC/Jl+7J81h+7d0TXkfmM2mC37p9Xjdq6amhh49erhfJyUl4XQ6L6uYzMxM1qxZ435tGAZWq5WoqCiKiorc0wsKCoiMjDxremFh4Rl9B0REzscwDNK/y+ff7+w6dfK3mhl8dWd+clM/QoL8vF2eiNd5DABWq5XS0lL3N+9Dhw5d9soMw+C5556jtLSUuro6/v3vfzN27FgGDRpEVlYWOTk5OJ1OVq1aRWJiIjExMQQEBJCWlgbAihUrzng0sYjIudTaHXyyOpPP1h+kttZBQOtAbr6lP6OGdNQtzSKneWwCuP/++7njjjsoLCzkV7/6FZs3b2b+/PmXtbLevXtz3333cdttt+FwOBg3bhxTpkwB4Pnnn2f27NnY7XaSkpLczQKLFi1i7ty5VFZW0rdvX2bOnHlZ6xYR35CXW8qna/dTUW4Hk4mYXu2YOLo7Af66fVjk+0zGuRrafyAnJ4fNmzfjcrkYMWLEGU0CzY36ALQc2v7e15T2gctlsHVLDrt3HsPpdGEOtHLNtd0Y0NPm+cPNVFPa/r6qKe8DT30ALioS19bWUltbi9ls1iA8ItLklJVWk/LJPgoLKgBoFR1G8oRetAkL8HJlIk2Xxz4A77zzDjNnziQ9PZ3du3czY8YMVq9e3Ri1iYhc0H87+u0+dfK3mOk/PJbbbxmgk7+IBx6/zr/55pusWLGCqKgoAPLy8rjvvvuYNGlSgxcnInI+9po6Nqw/SNahEgzDwL9VABMm9CS2fStvlybSLHgMAKGhoe6TP0CHDh3w9/dv0KJERC4k92gp6z491dHPMJno2KsdE0Z3J1Ad/UQumsejJSEhgXnz5nH77bdjsVj48MMP6dKlC3v37gWgX79+DV6kiAiA0+lia2oO3+4+/t+OfkldGdBL44OIXCqPAeDTTz8F4Msvvzxj+uzZszGZTKxfv75hKhMR+Z4TJVWsXbOPotMj+rWKDmPKhF60VVu/yGXxGAA2bNjQGHWIiJyTYRjs3nmMbVsPU1vnBKuZ/gkx/CghFrNZg/qIXC41mIlIk1VVWcu6tfs5erQUwzAIaBvExPE9iYms34d6ifgiBQARaZIOHSjm888OUl1dh2E20aVfFOMTu+JntXi7NJEWQQFARJqUulonGz8/xP59hbhcBpYQf669vhu9u0R4uzSRFsXjQECzZ88mNTW1MWoRER93/FgZ/35nJ5kZBbgMiOjShjtmDNLJX6QBeAwA48aNY/HixYwfP57XX3+dkydPNkJZIuJLnE4XWzZn8+GyvZSW1mDytzBsdFd+ktyX0CCNOyLSEDw2ASQnJ5OcnMzBgwf54IMPuPXWW4mPj+fOO+9k4MCBjVGjiLRgJcWVfLp2P0WFVYBBSGQoUyb0pF2bIG+XJtKiXVQfAJfLRU5ODtnZ2TgcDiIiIvjtb3/LyJEjefTRRxu6RhFpgQzDYOfXeezYdoTaOieG1Uzfq2JIGhaLxezx4qSIXCGPAeCll15i2bJlxMbGMmPGDP74xz/i5+dHVVUVo0ePVgAQkUtWXl7DujX7yTtWDqdv75swLo6OUWHeLk3EZ3gMACUlJbz22mv07t37jOnBwcH84Q9/aLDCRKTlMQyDjPQCUjdlU1PjwDCb6DagPWOv6aLb+0Qa2UX1ASgvL2f79u0AmEwmAgMD6dKlC9dcc02DFygiLUN1VS0b1h8kJ/sEhmFgDQvguuu7E9eprbdLE/FJHgPA888/T0ZGBj169MBisbBv3z5sNhvV1dUsWLCAMWPGNEadItKMZR0sYePnB6msrMUwm4juEcGk63oQFKChSES8xePR16FDBx577DGGDx8OwO7du3nzzTf59a9/zf33368AICLnVWt3sPHzQxzYX4TLZWAO9uPqxK4MiGuHyaRx/EW8yWMAOHLkiPvkDzBw4ECys7Np3759gxYmIs3b4ZwTfL7hIOXldjCZCO/chkljetA6RE/vE2kKPAYAq9XKpk2b3O39mzZtws/Pj5KSEhwOR4MXKCLNS12tk01fZpGZUYjT6cIUaGXY1Z0Y0re9vvWLNCEeA8C8efN46KGHMJlMGIaBv78/L7/8Mn//+9+ZPn16Y9QoIs1EXm4pG9YdoLS0BkwmWse0YvK4ONqGBXq7NBH5AY8BoKCggPXr17Nv3z4sFgvdu3fHYrGcdVugiPguh8PFls05fLfnOA6nCwKsXDU8luGDojHrW79Ik3RRAwGNGTOGPn36NEY9ItLMFBwvZ/26A5SUVIHJRFh0GJPGxmkoX5EmzmMA6NmzJ6+++ioJCQkEBwe7p/fr169BCxORps3pdLFubSZbt+TgcLjAz8KAhBiuHhKjoXxFmgGPAWDXrl3s2rWL9957zz3NZDKxfv36Bi1MRJquwvwK1q/bz4kTNbhcLoJtIUwc35P24cGePywiTYLHALBhw4bGqENEmgGn08W2rUf4dlcedQ4X5gArfQd14EdDY7Fa9K1fpDnxeMRWVlYyf/58fvrTn3Ly5EmefvppKisrG6M2EWlCCgsqeO/d3Xydlkudw0VQuxB+9j/DGD2is07+Is2Qx6P22WefJSwsjOLiYgICAqioqODpp59ujNpEpAlwOl1sTc1h+fvfUlxciWE10XtoR2b+ZCCx7Vt5uzwRuUweA0B6ejpz5szBarUSFBTEokWLSE9Pb4zaRMTLCvPLee/dXaTtOP2t3xbMtFsHcP1IfesXae489gEw/6A3r9PpPGuaiLQsToeLr7Ye5tvdx3A4XBhWM30Gx5A0TG39Ii2FxwAwdOhQfv/731NTU8OXX37J22+/fcazAUSkZck/VsaG9QdP3dcPBNtCmDC2B9HtQr1cmYjUJ49R/pFHHiE4OJiwsDBeeuklevXqxa9//evGqE1EGpHD4eLLjVmsWLb31Mnfz0K/4bHM/MlAnfxFWiCPVwD8/Px44IEHeOCBBxqjHhHxgrzcUj5bf5CTJ6sBCIkKYeKYOKIiQrxcmYg0FI8BYNu2bbzyyiuUlpZiGIZ7+kcffdSghYlIw3M/uS+9EKfLBf4WBg3tyKjBMZjNGsNfpCXzGADmz5/PtGnT6Nu3rx7lKdKCHM4+weefHaS83A4mE606hDFxjMbwF/EVF9UE8LOf/awxahGRRmCvqWPj51kcPFCEy2VgCrAyZEQnhg5sryf3ifgQj50A4+LiyMzMvKyFV1RUMGXKFI4ePQpAamoqycnJjBs3jpdeesn9vvT0dKZNm8b48eP5zW9+g8PhACAvL4/bb7+dCRMmcP/992sEQpErYBgG+/cV8X//2sn+fYW4DGgb25rbb4/XY3tFfJDHAHDkyBGmTZvGuHHjSE5Odv/zZNeuXdx2221kZ2cDUFNTw5NPPsnixYtZvXo1e/bsYePGjQA8+uijPPXUU6xZswbDMFi6dCkAzzzzDDNmzCAlJYX+/fuzePHiK/hRRXxXZWUtH3+Uzqdr9lFVVYs5yI9RY7pz2039aB0a4O3yRMQLPDYBzJkz57IWvHTpUubNm+e+ZXD37t107tyZ2NhYAJKTk0lJSaFHjx7U1NQQHx8PwNSpU3n55Ze59dZb2b59O3/+85/d0++44w4effTRy6pHxBcZhsHePcf5asthamocGCYT0d3DGX9dd0KD/L1dnoh40XkDQF5eHh06dGDYsGFnzfviiy88LnjBggVnvC4oKMBms7lfR0ZGkp+ff9Z0m81Gfn4+J06cIDQ0FKvVesb0KxURUb/3M9tsYfW6PLk02v7nV1JcxYcr9nDk8EnAILBNEJMm92Zg76h6XY/2gXdp+3tfc90H5w0ADzzwAMuXLwdg9uzZvPLKK+55L730EomJiZe0ou/fQvgfJpPpkqdfqeLiClyus5d9OWy2MAoLy+tlWXLptP3PzeUy2LH9CDu/zqOuzolhNtG1j43rr+lKYIC1XreZ9oF3aft7X1PeB2az6YJfes8bAL5/Aj5y5Mh5512sqKgoioqK3K8LCgqIjIw8a3phYSGRkZGEh4dTUVGB0+nEYrG4p4vI+eXnl7Nh3QFKik8N4xvYNogx1/egcwc9tU9EznTeToDf/7b9w2/el/NNfNCgQWRlZZGTk4PT6WTVqlUkJiYSExNDQEAAaWlpAKxYsYLExET8/PxISEhg9erVZ0wXkbPV1Tn57LODLH9/z6mTv9VMn4QYfjojXid/ETmni7oCUB8CAgJ4/vnnmT17Nna7naSkJCZMmADAokWLmDt3LpWVlfTt25eZM2cCMG/ePB5//HFeffVVoqOjefHFF+u1JpGWICurhI2fHaKywg5AWPtQJo6Nw9Y22MuViUhTdt4A4HK53MP/Op3OM4YCdjqdF72CDRs2uP8/cuRIVq5cedZ7evfuzfvvv3/W9JiYGJYsWXLR6xLxJVVVdjasP8Th7BMYhoE5wErCyE4kDGivUTtFxKPzBoB9+/YxYsQI90n/+48A1h8XEe8xDIPdu4+xbesRau0OMJmI6tqW8df3ICxYt/aJyMU5bwDIyMhozDpE5CIUF1ex7tP9FBVUAgZ+of4kje5Gr64R3i5NRJoZjwMBiYj3ORxONm/OIX1PPk6nCyxmevSLYvTVXfD3s3i7PBFphhQARJq4rOzTnfzKT3XyC7WFMH5MD9rb6ndQKxHxLQoAIk1UVVUt69Yf5Oh/Ovn5W7hqeCzD4juoH46IXDEFAJEmxjAMvv4mj7RtR6irdYLJRHTXtoy7Po7QYD9vlyciLYQCgEgTcjy/nPXrDnDy9Eh+AWEBXDu6Oz26tPVyZSLS0igAiDQBtbVOPt94iIOZhbhcBiaLmd6DokkcGYvVok5+IlL/FABEvGxvej5bNuVgr64DoG10GOPHxhHRJsjLlYlIS6YAIOIlxSVVrFt3gKLjp54k5hfsx4hrujCwtx56JSINTwFApJE5nC6++DKLzL0FuJwuMJvo1sfG9YnddE+/iDQaBQCRRpSxr5DNX2ZTU1kLQCtbCGPHxNHeFuLlykTE1ygAiDSCEyer+XTdAQrzygCwBloZOrITg/vrwT0i4h0KACINyOFw8cXmbDL35J+63G8y0aVXO8YkdSUgQPf0i4j3KACINJDvMgtJ/TIbe9Xpy/3tQhhzfQ+iozSEr4h4nwKASD0rKqlk3fqDFB871bvfGmhl6IhODB6gy/0i0nQoAIjUk9o6J599kcXB9AIMl4HJbKJrr3Zcl9SNAH8daiLStOivksgVMgyDnXuPs33LEer+M5hPZCjXX9+dKD2xT0SaKAUAkSuQd7ycDZ8dpLSwEgD/ID9GjOrMgH5RXq5MROTCFABELkNVdR3rPz/E4QPFYBiYLWbi+kaSdE1n/Px0WIlI06e/VCKXwOly8dWOXHZ/nYuz1gmYsHVoxZjrexDeVmP3i0jzoQAgcpH2HSpm0xdZVJfZAQgOC+CapK7EdYvwcmUiIpdOAUDEg6IT1azbcIDi3NOj+PlZGDC4A8OHdsRiMXu5OhGRy6MAIHIeNXYHn23K4lB6IbgMTCYTnbqHc93obgQH+Xu7PBGRK6IAIPIDLsNg+848vtl+FGeNA4BwWwjXju5GdPtWXq5ORKR+KACIfM/+7BN8+cUhqk/WABAY7M/wUZ3o1ydSo/iJSIuiACACFJZUsf6zgxTnlYNhYLGa6TugPaNGdsJqtXi7PBGReqcAID6tsrqOzzZlkbOvGJwuTCYTsd3CGX1tN0JDA7xdnohIg1EAEJ/kcLrYkpbLnm9ycdlP3c8fbgshKakbHTqonV9EWj4FAPEphmHwbWYhX205TG356fv5QwMYMbITvXvb1M4vIj5DAUB8xuFjpXy+MZvyggoA/P2t9B/UnqFDO6qdX0R8jgKAtHjFpdVs2JhFfs5JTKfH7e/WI4LExK4EBfl5uzwREa9QAJAWq6qmjo2pORzKKASHC7PJRFRMK669thsRESHeLk9ExKsUAKTFcThdpO44yt5dx3DVOAATbcKDueZHXejcua23yxMRaRIUAKTFMAyDnekFbN96hLqK0x38QvxJGBZL//5R6uAnIvI9CgDS7BmGwYHDJ9m0KZuq4irgdAe/ge0ZOiwWq1UP7BER+SGvBICZM2dSXFyM1Xpq9fPnz+fw4cO8+uqr1NXVcdddd3H77bcDkJqaysKFC7Hb7UycOJE5c+Z4o2RponILyvn8y2xO/mcEP4uZ7j3bcc01nQnSA3tERM6r0QOAYRgcOnSIzz//3B0A8vPzmTNnDsuWLcPf35/p06czfPhwOnbsyJNPPsmSJUuIjo5m1qxZbNy4kaSkpMYuW5qY4tIaVq07QHZGASaXgdlsomPntiQmdqV1myBvlyci0uQ1egA4dOgQJpOJe++9l+LiYn784x8TEhLCiBEjaNOmDQDjx48nJSWFYcOG0blzZ2JjYwFITk4mJSVFAcCHlVfVsjE1h5x9RZhdBmYDbO3D+NGPutA+WiP4iYhcrEYPAGVlZYwcOZLf/va31NTUMHPmTCZOnIjNZnO/JzIykt27d1NQUHDW9Pz8/Ctaf0RE6BV9/odstrB6XZ6cW1VNHZ9uPMjutFwMuwMzJiLahXD9mDh69daT+rxJx4B3aft7X3PdB40eAAYPHszgwYMBCA4O5pZbbmHhwoX8/Oc/P+N9JpMJwzDO+vyV/qEvLq7A5Tp7uZfDZgujsLC8XpYl51bncLH1m1z27DyGq7oOgLCwABKGxfKjxO4UF1dQVFTh5Sp9l44B79L2976mvA/MZtMFv/Q2egDYsWMHdXV1jBw5EjjVJyAmJoaioiL3ewoKCoiMjCQqKuqc06Xlc7pcfL33OF9vz8VRUQtAUJAfAwd3YPDgDlgsZsxmfesXEblcjX5/VHl5OS+88AJ2u52KigqWL1/O73//e7Zs2UJJSQnV1dWsXbuWxMREBg0aRFZWFjk5OTidTlatWkViYmJjlyyNyGUY7Mwo4PUl37DtsywcFbUE+FsZPCSGO2ZeRUJCRywW3dYnInKlGv0KwOjRo9m1axc33XQTLpeLGTNmMGTIEObMmcPMmTOpq6vjlltuYeDAgQA8//zzzJ49G7vdTlJSEhMmTGjskqURGIZB+qFitmw9Qk1JNRgGfn4W4nrZGDEilqBg3dInIlKfTMa5GtpbMPUBaFoMw+DAkZNsTs2hsrAKDAOrxUzX7uGMuroLoWEB5/2str/3aR94l7a/9zXlfdDk+gCIwKkTf1ZuKZtScyjLr8R0ehCf2M5tufrqzrRpG+ztEkVEWjQFAGl0OcfK2JSaw4lj5ZhcBhaziZjYNlx9TRci2ukpfSIijUEBQBrNkfxyvkzNoSS3zH3ibx/Tmquv7kRkew3iIyLSmBQApMHlFVbwxeYcio6Wnjrxm0xERocxcmRnomNaaRAfEREvUACQBnOssIIvUnMoPHLqxG82mbBFhTJiRCc6dmqjE7+IiBcpAEi9O1ZYwRdbDlN4+KT7xN8uMpQRIzsRqxO/iEiToAAg9SavsIIvf/CNv11kKMNHdKJTZ534RUSaEgUAuWJHC8rZlHrY3cZvNploZwtl2PBYOndtqxO/iEgTpAAgl+3I8XK+3PLfXv3ub/zDO9Gpi77xi4g0ZQoAckkMwyAnr4zNWw+77+P/T+e+4SPUxi8i0lwoAMhFMQyDg0dK2fLVYUrzK9z38duiwxg+vBMdY1vrxC8i0owoAMgFGYZBZtYJvtp2mIrTY/VbzCaiYlozckQn2ncI04lfRKQZUgCQc3IZBnv3F7Fj+1GqTj+dz2w20SG2DSNHdCKyfZi3SxQRkSugACBncLpc7PyugG++zsV+sgYAi8VMx05tGTmyk8bqFxFpIRQABIA6h5Ptu46xZ9cx6ipqAbBazXTuFs6IEZ1o0ybIyxWKiEh9UgDwcTW1DrbuyCVjbz7O6joA/PwtdI9rx4jhsYSEBni5QhERaQgKAD6qvLKW1G2HOZRZhKvWCUBAoJVefaIYNjSGgEA/L1coIiINSQHAxxSfrGbzlhyOHjqB4XQBEBTiT7+B7bkqvgN+fhYvVygiIo1BAcBH5B4rZ8vWHPJzy8BlABDWOpD4q2Lo3y8Ks1m38omI+BIFgBYu80AxO3Yc5WRBxekpJsJtoQwdGkP37hG6h19ExEcpALRALpeLnd8eZ/fOY1SWnrqVz2QyEdWxFSOGxxLTobWXKxQREW9TAGhB7PY6tu3IJfO7Auyne/SbrWZiu7Zl1IjOhLfVrXwiInKKAkALcPJENVu3HSHnUAmOulM9+q0BVrr3sjFqeCzBQerRLyIiZ1IAaKYMwyA3t5Tt249yPLcM1+mOfQFhAfTr356hV0VjtahHv4iInJsCQDPjdLrIzChk5zd5nDhxaox+TCbC2oVw1ZAY+vVsp459IiLikQJAM1FVWcuuXcfITC+gsvLUUL1YzNhiWjN8WEc6q2OfiIhcAgWAJswwDIoLK/nm6zxysk9gr3WcmuFvoVP3CEYN7UiExugXEZHLoADQBDkdLg5nnWDXrjzyCypwOE6N2GcJ9adXvyiGDYwmRB37RETkCigANCFVFbXszyzku735nCyrweUyMMwmAiOCGRQfTXwvG35WdewTEZErpwDgZYZhUJRfQcbefLKyTlBRXYdhGBh+FlrHhDJsSAxxsW0wq2OfiIjUIwUAL6mrdXI0+wTf7c2noKCCKrsDTCaMICsdurRheHwMHSKC1aNfREQahAJAI6soqyFrfxGZGUWcKKuhts6JYTFjah1IXK92DO3XnrZhAd4uU0REWjgFgEZgGAaFx8s5kFFETs4JSitrcTpdGP4W/CJDGNg/ikE9bAQHaneIiEjj0BmnATkcLnJzTrAvvYDj+ZWUV9ViAK4gK2FRrUnoF0Xvzm2xWszeLlVERHyMAkADsNc4yDlYTOZ3BRSfrKay2oFhMeEK9SO6cxsS+kTRpX2Y2vdFRMRrFADqkb2mjgMZhWR8V8CJMjv2WgeGnwUjPJAePSIY0stGZNtgb5cpIiKiAFAf6uqc7P+ugG93H+NkuR2Hw4UrwIq1fQj9e0cS36MdYcH+3i5TRETErVkEgI8++ohXX32Vuro67rrrLm6//XZvl+R26GAx21IPc6K0GpfLwBVoJTg6jKv6R9GvSzj+fhq4R0REmp4mHwDy8/N56aWXWLZsGf7+/kyfPp3hw4fTo0cPr9ZVXFrNhx9ncvRQMZweuCeiW2uGDuxAt5hWGrhHRESatCYfAFJTUxkxYgRt2rQBYPz48aSkpPDggw96ta4PP87AXlINQFS3cEaNiKVDu1Cv1iQiInKxmnwAKCgowGazuV9HRkaye/fuy15eRET9nKQjA/2pbAXjk/sS17NdvSxTLp3NFubtEnye9oF3aft7X3PdB00+ABiGcda0K7l9rri4Apfr7GVeqiFDOxLWKpDQ1gEUFpZf8fLk0tlsYdr2XqZ94F3a/t7XlPeB2Wy64JfeJj8CTVRUFEVFRe7XBQUFREZGerGiU6JjW9O1h775i4hI89TkA8CoUaPYsmULJSUlVFdXs3btWhITE71dloiISLPW5JsAoqKimDNnDjNnzqSuro5bbrmFgQMHerssERGRZq3JBwCA5ORkkpOTvV2GiIhIi9HkmwBERESk/ikAiIiI+CAFABERER+kACAiIuKDFABERER8kAKAiIiID1IAEBER8UHNYhyA+mQ21+9jeut7eXJptP29T/vAu7T9va+p7gNPdZmMcz1tR0RERFo0NQGIiIj4IAUAERERH6QAICIi4oMUAERERHyQAoCIiIgPUgAQERHxQQoAIiIiPkgBQERExAcpAIiIiPggBQAREREfpAAgIiLigxQAREREfJACgIiIiA9SALgIH330EZMmTWLs2LG8/fbbZ81PT09n2rRpjB8/nt/85jc4HA4vVNlyedr+f/rTnxg9ejQ33ngjN9544znfI1emoqKCKVOmcPTo0bPm6fe/cVxoH+gYaFh/+tOfmDx5MpMnT+aFF144a36zPQYMuaDjx48bo0ePNk6cOGFUVlYaycnJxv79+894z+TJk41vvvnGMAzDeOKJJ4y3337bC5W2TBez/WfNmmV8/fXXXqqw5du5c6cxZcoUo1+/fsaRI0fOmq/f/4bnaR/oGGg4mzdvNn7yk58YdrvdqK2tNWbOnGmsXbv2jPc012NAVwA8SE1NZcSIEbRp04bg4GDGjx9PSkqKe35ubi41NTXEx8cDMHXq1DPmy5XxtP0B9uzZw2uvvUZycjLz58/Hbrd7qdqWaenSpcybN4/IyMiz5un3v3FcaB+AjoGGZLPZePzxx/H398fPz4/u3buTl5fnnt+cjwEFAA8KCgqw2Wzu15GRkeTn5593vs1mO2O+XBlP27+yspI+ffrw2GOPsXz5csrKyli8eLE3Sm2xFixYQEJCwjnn6fe/cVxoH+gYaFhxcXHuk3t2djarV68mKSnJPb85HwMKAB4YhnHWNJPJdNHz5cp42r4hISG89tprdO7cGavVyt13383GjRsbs0Sfpt9/79Mx0Dj279/P3XffzWOPPUaXLl3c05vzMaAA4EFUVBRFRUXu1wUFBWdchvvh/MLCwvNeppNL52n75+Xl8f7777tfG4aB1Wpt1Bp9mX7/vU/HQMNLS0vjrrvu4uGHH+bmm28+Y15zPgYUADwYNWoUW7ZsoaSkhOrqatauXUtiYqJ7fkxMDAEBAaSlpQGwYsWKM+bLlfG0/QMDA/n973/PkSNHMAyDt99+m7Fjx3qxYt+i33/v0zHQsI4dO8YDDzzAokWLmDx58lnzm/MxoADgQVRUFHPmzGHmzJncdNNNTJkyhYEDB3Lvvffy7bffArBo0SIWLlzIxIkTqa6uZubMmV6uuuXwtP3Dw8OZP38+999/PxMmTMAwDH72s595u+wWT7//3qdjoHG8/vrr2O12nn/+efdtlu+8806LOAZMxrkaMERERKRF0xUAERERH6QAICIi4oMUAERERHyQAoCIiIgPUgAQERHxQQoAIiIiPkjDRYlIk1RUVMSDDz6I1WrFbDazaNGiZjPCmkhzoHEARKRJcjqdmEwmzGYzy5Yt4/jx4/ziF7/wdlkiLYaaAETkovXq1Yv4+Hheeukl97RDhw5x4403MnjwYN566616W5fFYsFsPvUnqrKykri4OPe8mTNnMmDAAG677bZ6W5+Ir1ETgIhckg8//JDOnTu7X//9739n+PDhfPjhh/W+rvT0dJ5++mnKysp444033NPfeustli1bxnvvvVfv6xTxFQoAInJF8vLyzvmQlItRWFjIr371q7Omv/jii9hsNvr06cN7773H6tWr+etf/8r8+fOvtFwROU0BQETOUlFRwe9+9ztSUlKwWCz8/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": [
|
||
"[ 2.01879166 -0.10539223 5.12224228]\n",
|
||
"Training R2\n",
|
||
"0.9953896988605513\n",
|
||
"Training MSE\n",
|
||
"0.008627230881866453\n",
|
||
"Test R2\n",
|
||
"0.9933901005631264\n",
|
||
"Test MSE\n",
|
||
"0.011519511227899348\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.9999901872822963\n",
|
||
"Training MSE\n",
|
||
"3.8316530831689173\n",
|
||
"Test R2\n",
|
||
"0.999959390714798\n",
|
||
"Test MSE\n",
|
||
"24.997147499722345\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": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename'])"
|
||
]
|
||
},
|
||
"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": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/seaborn/distributions.py:2551: 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": "iVBORw0KGgoAAAANSUhEUgAABJEAAAFRCAYAAADEnjyhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAACCYElEQVR4nO3de3xU9Z0//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.637129335071195\n",
|
||
"R2 score is 0.6300745149331701\n",
|
||
"\n",
|
||
"\n",
|
||
"The model performance for testing set\n",
|
||
"--------------------------------------\n",
|
||
"RMSE is 5.137400784702912\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+hTZxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABXwElEQVR4nO3deZxU1Z3///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.8.5"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
} |