4910 lines
601 KiB
Plaintext
4910 lines
601 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.99397105]\n",
|
||
"Coefficient beta : \n",
|
||
" [[4.98029756]]\n",
|
||
"Mean squared error: 0.24\n",
|
||
"Variance score: 0.90\n",
|
||
"Mean squared log error: 0.01\n",
|
||
"Mean absolute error: 0.38\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_13_1.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import numpy as np \n",
|
||
"import matplotlib.pyplot as plt \n",
|
||
"from sklearn.linear_model import LinearRegression \n",
|
||
"from sklearn.metrics import mean_squared_error, r2_score, mean_squared_log_error, mean_absolute_error\n",
|
||
"\n",
|
||
"x = np.random.rand(100,1)\n",
|
||
"y = 2.0+ 5*x+0.5*np.random.randn(100,1)\n",
|
||
"linreg = LinearRegression()\n",
|
||
"linreg.fit(x,y)\n",
|
||
"ypredict = linreg.predict(x)\n",
|
||
"print('The intercept alpha: \\n', linreg.intercept_)\n",
|
||
"print('Coefficient beta : \\n', linreg.coef_)\n",
|
||
"# The mean squared error \n",
|
||
"print(\"Mean squared error: %.2f\" % mean_squared_error(y, ypredict))\n",
|
||
"# Explained variance score: 1 is perfect prediction \n",
|
||
"print('Variance score: %.2f' % r2_score(y, ypredict))\n",
|
||
"# Mean squared log error \n",
|
||
"print('Mean squared log error: %.2f' % mean_squared_log_error(y, ypredict) )\n",
|
||
"# Mean absolute error \n",
|
||
"print('Mean absolute error: %.2f' % mean_absolute_error(y, ypredict))\n",
|
||
"plt.plot(x, ypredict, \"r-\")\n",
|
||
"plt.plot(x, y ,'ro')\n",
|
||
"plt.axis([0.0,1.0,1.5, 7.0])\n",
|
||
"plt.xlabel(r'$x$')\n",
|
||
"plt.ylabel(r'$y$')\n",
|
||
"plt.title(r'Linear Regression fit ')\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The function **coef** gives us the parameter $\\beta$ of our fit while **intercept** yields \n",
|
||
"$\\alpha$. Depending on the constant in front of the normal distribution, we get values near or far from $alpha =2$ and $\\beta =5$. Try to play around with different parameters in front of the normal distribution. The function **meansquarederror** gives us the mean square error, a risk metric corresponding to the expected value of the squared (quadratic) error or loss defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"MSE(\\boldsymbol{y},\\boldsymbol{\\tilde{y}}) = \\frac{1}{n}\n",
|
||
"\\sum_{i=0}^{n-1}(y_i-\\tilde{y}_i)^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The smaller the value, the better the fit. Ideally we would like to\n",
|
||
"have an MSE equal zero. The attentive reader has probably recognized\n",
|
||
"this function as being similar to the $\\chi^2$ function defined above.\n",
|
||
"\n",
|
||
"The **r2score** function computes $R^2$, the coefficient of\n",
|
||
"determination. It provides a measure of how well future samples are\n",
|
||
"likely to be predicted by the model. Best possible score is 1.0 and it\n",
|
||
"can be negative (because the model can be arbitrarily worse). A\n",
|
||
"constant model that always predicts the expected value of $\\boldsymbol{y}$,\n",
|
||
"disregarding the input features, would get a $R^2$ score of $0.0$.\n",
|
||
"\n",
|
||
"If $\\tilde{\\boldsymbol{y}}_i$ is the predicted value of the $i-th$ sample and $y_i$ is the corresponding true value, then the score $R^2$ is defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"R^2(\\boldsymbol{y}, \\tilde{\\boldsymbol{y}}) = 1 - \\frac{\\sum_{i=0}^{n - 1} (y_i - \\tilde{y}_i)^2}{\\sum_{i=0}^{n - 1} (y_i - \\bar{y})^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where we have defined the mean value of $\\boldsymbol{y}$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\bar{y} = \\frac{1}{n} \\sum_{i=0}^{n - 1} y_i.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Another quantity taht we will meet again in our discussions of regression analysis is \n",
|
||
" the mean absolute error (MAE), a risk metric corresponding to the expected value of the absolute error loss or what we call the $l1$-norm loss. In our discussion above we presented the relative error.\n",
|
||
"The MAE is defined as follows"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\text{MAE}(\\boldsymbol{y}, \\boldsymbol{\\tilde{y}}) = \\frac{1}{n} \\sum_{i=0}^{n-1} \\left| y_i - \\tilde{y}_i \\right|.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We present the \n",
|
||
"squared logarithmic (quadratic) error"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\text{MSLE}(\\boldsymbol{y}, \\boldsymbol{\\tilde{y}}) = \\frac{1}{n} \\sum_{i=0}^{n - 1} (\\log_e (1 + y_i) - \\log_e (1 + \\tilde{y}_i) )^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\log_e (x)$ stands for the natural logarithm of $x$. This error\n",
|
||
"estimate is best to use when targets having exponential growth, such\n",
|
||
"as population counts, average sales of a commodity over a span of\n",
|
||
"years etc. \n",
|
||
"\n",
|
||
"\n",
|
||
"Finally, another cost function is the Huber cost function used in robust regression.\n",
|
||
"\n",
|
||
"The rationale behind this possible cost function is its reduced\n",
|
||
"sensitivity to outliers in the data set. In our discussions on\n",
|
||
"dimensionality reduction and normalization of data we will meet other\n",
|
||
"ways of dealing with outliers.\n",
|
||
"\n",
|
||
"The Huber cost function is defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"H_{\\delta}(\\boldsymbol{a})=\\left\\{\\begin{array}{cc}\\frac{1}{2} \\boldsymbol{a}^{2}& \\text{for }|\\boldsymbol{a}|\\leq \\delta\\\\ \\delta (|\\boldsymbol{a}|-\\frac{1}{2}\\delta ),&\\text{otherwise}.\\end{array}\\right.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Here $\\boldsymbol{a}=\\boldsymbol{y} - \\boldsymbol{\\tilde{y}}$.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"We will discuss in more\n",
|
||
"detail these and other functions in the various lectures. We conclude this part with another example. Instead of \n",
|
||
"a linear $x$-dependence we study now a cubic polynomial and use the polynomial regression analysis tools of scikit-learn."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_27_0.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.005000000000000024\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import numpy as np\n",
|
||
"import random\n",
|
||
"from sklearn.linear_model import Ridge\n",
|
||
"from sklearn.preprocessing import PolynomialFeatures\n",
|
||
"from sklearn.pipeline import make_pipeline\n",
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"\n",
|
||
"x=np.linspace(0.02,0.98,200)\n",
|
||
"noise = np.asarray(random.sample((range(200)),200))\n",
|
||
"y=x**3*noise\n",
|
||
"yn=x**3*100\n",
|
||
"poly3 = PolynomialFeatures(degree=3)\n",
|
||
"X = poly3.fit_transform(x[:,np.newaxis])\n",
|
||
"clf3 = LinearRegression()\n",
|
||
"clf3.fit(X,y)\n",
|
||
"\n",
|
||
"Xplot=poly3.fit_transform(x[:,np.newaxis])\n",
|
||
"poly3_plot=plt.plot(x, clf3.predict(Xplot), label='Cubic Fit')\n",
|
||
"plt.plot(x,yn, color='red', label=\"True Cubic\")\n",
|
||
"plt.scatter(x, y, label='Data', color='orange', s=15)\n",
|
||
"plt.legend()\n",
|
||
"plt.show()\n",
|
||
"\n",
|
||
"def error(a):\n",
|
||
" for i in y:\n",
|
||
" err=(y-yn)/yn\n",
|
||
" return abs(np.sum(err))/len(err)\n",
|
||
"\n",
|
||
"print (error(y))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let us now dive into nuclear physics and remind ourselves briefly about some basic features about binding\n",
|
||
"energies. A basic quantity which can be measured for the ground\n",
|
||
"states of nuclei is the atomic mass $M(N, Z)$ of the neutral atom with\n",
|
||
"atomic mass number $A$ and charge $Z$. The number of neutrons is $N$. There are indeed several sophisticated experiments worldwide which allow us to measure this quantity to high precision (parts per million even). \n",
|
||
"\n",
|
||
"Atomic masses are usually tabulated in terms of the mass excess defined by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\Delta M(N, Z) = M(N, Z) - uA,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $u$ is the Atomic Mass Unit"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"u = M(^{12}\\mathrm{C})/12 = 931.4940954(57) \\hspace{0.1cm} \\mathrm{MeV}/c^2.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The nucleon masses are"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"m_p = 1.00727646693(9)u,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"m_n = 939.56536(8)\\hspace{0.1cm} \\mathrm{MeV}/c^2 = 1.0086649156(6)u.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In the [2016 mass evaluation of by W.J.Huang, G.Audi, M.Wang, F.G.Kondev, S.Naimi and X.Xu](http://nuclearmasses.org/resources_folder/Wang_2017_Chinese_Phys_C_41_030003.pdf)\n",
|
||
"there are data on masses and decays of 3437 nuclei.\n",
|
||
"\n",
|
||
"The nuclear binding energy is defined as the energy required to break\n",
|
||
"up a given nucleus into its constituent parts of $N$ neutrons and $Z$\n",
|
||
"protons. In terms of the atomic masses $M(N, Z)$ the binding energy is\n",
|
||
"defined by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(N, Z) = ZM_H c^2 + Nm_n c^2 - M(N, Z)c^2 ,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $M_H$ is the mass of the hydrogen atom and $m_n$ is the mass of the neutron.\n",
|
||
"In terms of the mass excess the binding energy is given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(N, Z) = Z\\Delta_H c^2 + N\\Delta_n c^2 -\\Delta(N, Z)c^2 ,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\Delta_H c^2 = 7.2890$ MeV and $\\Delta_n c^2 = 8.0713$ MeV.\n",
|
||
"\n",
|
||
"\n",
|
||
"A popular and physically intuitive model which can be used to parametrize \n",
|
||
"the experimental binding energies as function of $A$, is the so-called \n",
|
||
"**liquid drop model**. The ansatz is based on the following expression"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(N,Z) = a_1A-a_2A^{2/3}-a_3\\frac{Z^2}{A^{1/3}}-a_4\\frac{(N-Z)^2}{A},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $A$ stands for the number of nucleons and the $a_i$s are parameters which are determined by a fit \n",
|
||
"to the experimental data. \n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"To arrive at the above expression we have assumed that we can make the following assumptions:\n",
|
||
"\n",
|
||
" * There is a volume term $a_1A$ proportional with the number of nucleons (the energy is also an extensive quantity). When an assembly of nucleons of the same size is packed together into the smallest volume, each interior nucleon has a certain number of other nucleons in contact with it. This contribution is proportional to the volume.\n",
|
||
"\n",
|
||
" * There is a surface energy term $a_2A^{2/3}$. The assumption here is that a nucleon at the surface of a nucleus interacts with fewer other nucleons than one in the interior of the nucleus and hence its binding energy is less. This surface energy term takes that into account and is therefore negative and is proportional to the surface area.\n",
|
||
"\n",
|
||
" * There is a Coulomb energy term $a_3\\frac{Z^2}{A^{1/3}}$. The electric repulsion between each pair of protons in a nucleus yields less binding. \n",
|
||
"\n",
|
||
" * There is an asymmetry term $a_4\\frac{(N-Z)^2}{A}$. This term is associated with the Pauli exclusion principle and reflects the fact that the proton-neutron interaction is more attractive on the average than the neutron-neutron and proton-proton interactions.\n",
|
||
"\n",
|
||
"We could also add a so-called pairing term, which is a correction term that\n",
|
||
"arises from the tendency of proton pairs and neutron pairs to\n",
|
||
"occur. An even number of particles is more stable than an odd number. \n",
|
||
"\n",
|
||
"\n",
|
||
"### Organizing our data\n",
|
||
"\n",
|
||
"Let us start with reading and organizing our data. \n",
|
||
"We start with the compilation of masses and binding energies from 2016.\n",
|
||
"After having downloaded this file to our own computer, we are now ready to read the file and start structuring our data.\n",
|
||
"\n",
|
||
"\n",
|
||
"We start with preparing folders for storing our calculations and the data file over masses and binding energies. We import also various modules that we will find useful in order to present various Machine Learning methods. Here we focus mainly on the functionality of **scikit-learn**."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Common imports\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import sklearn.linear_model as skl\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error\n",
|
||
"import os\n",
|
||
"\n",
|
||
"# Where to save the figures and data files\n",
|
||
"PROJECT_ROOT_DIR = \"Results\"\n",
|
||
"FIGURE_ID = \"Results/FigureFiles\"\n",
|
||
"DATA_ID = \"DataFiles/\"\n",
|
||
"\n",
|
||
"if not os.path.exists(PROJECT_ROOT_DIR):\n",
|
||
" os.mkdir(PROJECT_ROOT_DIR)\n",
|
||
"\n",
|
||
"if not os.path.exists(FIGURE_ID):\n",
|
||
" os.makedirs(FIGURE_ID)\n",
|
||
"\n",
|
||
"if not os.path.exists(DATA_ID):\n",
|
||
" os.makedirs(DATA_ID)\n",
|
||
"\n",
|
||
"def image_path(fig_id):\n",
|
||
" return os.path.join(FIGURE_ID, fig_id)\n",
|
||
"\n",
|
||
"def data_path(dat_id):\n",
|
||
" return os.path.join(DATA_ID, dat_id)\n",
|
||
"\n",
|
||
"def save_fig(fig_id):\n",
|
||
" plt.savefig(image_path(fig_id) + \".png\", format='png')\n",
|
||
"\n",
|
||
"infile = open(data_path(\"MassEval2016.dat\"),'r')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Before we proceed, we define also a function for making our plots. You can obviously avoid this and simply set up various **matplotlib** commands every time you need them. You may however find it convenient to collect all such commands in one function and simply call this function."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from pylab import plt, mpl\n",
|
||
"plt.style.use('seaborn')\n",
|
||
"mpl.rcParams['font.family'] = 'serif'\n",
|
||
"\n",
|
||
"def MakePlot(x,y, styles, labels, axlabels):\n",
|
||
" plt.figure(figsize=(10,6))\n",
|
||
" for i in range(len(x)):\n",
|
||
" plt.plot(x[i], y[i], styles[i], label = labels[i])\n",
|
||
" plt.xlabel(axlabels[0])\n",
|
||
" plt.ylabel(axlabels[1])\n",
|
||
" plt.legend(loc=0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Our next step is to read the data on experimental binding energies and\n",
|
||
"reorganize them as functions of the mass number $A$, the number of\n",
|
||
"protons $Z$ and neutrons $N$ using **pandas**. Before we do this it is\n",
|
||
"always useful (unless you have a binary file or other types of compressed\n",
|
||
"data) to actually open the file and simply take a look at it!\n",
|
||
"\n",
|
||
"\n",
|
||
"In particular, the program that outputs the final nuclear masses is written in Fortran with a specific format. It means that we need to figure out the format and which columns contain the data we are interested in. Pandas comes with a function that reads formatted output. After having admired the file, we are now ready to start massaging it with **pandas**. The file begins with some basic format information."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"' \\nThis is taken from the data file of the mass 2016 evaluation. \\nAll files are 3436 lines long with 124 character per line. \\n Headers are 39 lines long. \\n col 1 : Fortran character control: 1 = page feed 0 = line feed \\n format : a1,i3,i5,i5,i5,1x,a3,a4,1x,f13.5,f11.5,f11.3,f9.3,1x,a2,f11.3,f9.3,1x,i3,1x,f12.5,f11.5 \\n These formats are reflected in the pandas widths variable below, see the statement \\n widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1), \\n Pandas has also a variable header, with length 39 in this case. \\n'"
|
||
]
|
||
},
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"\"\"\" \n",
|
||
"This is taken from the data file of the mass 2016 evaluation. \n",
|
||
"All files are 3436 lines long with 124 character per line. \n",
|
||
" Headers are 39 lines long. \n",
|
||
" col 1 : Fortran character control: 1 = page feed 0 = line feed \n",
|
||
" format : a1,i3,i5,i5,i5,1x,a3,a4,1x,f13.5,f11.5,f11.3,f9.3,1x,a2,f11.3,f9.3,1x,i3,1x,f12.5,f11.5 \n",
|
||
" These formats are reflected in the pandas widths variable below, see the statement \n",
|
||
" widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1), \n",
|
||
" Pandas has also a variable header, with length 39 in this case. \n",
|
||
"\"\"\""
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The data we are interested in are in columns 2, 3, 4 and 11, giving us\n",
|
||
"the number of neutrons, protons, mass numbers and binding energies,\n",
|
||
"respectively. We add also for the sake of completeness the element name. The data are in fixed-width formatted lines and we will\n",
|
||
"covert them into the **pandas** DataFrame structure."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Read the experimental data with Pandas\n",
|
||
"Masses = pd.read_fwf(infile, usecols=(2,3,4,6,11),\n",
|
||
" names=('N', 'Z', 'A', 'Element', 'Ebinding'),\n",
|
||
" widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1),\n",
|
||
" header=39,\n",
|
||
" index_col=False)\n",
|
||
"\n",
|
||
"# Extrapolated values are indicated by '#' in place of the decimal place, so\n",
|
||
"# the Ebinding column won't be numeric. Coerce to float and drop these entries.\n",
|
||
"Masses['Ebinding'] = pd.to_numeric(Masses['Ebinding'], errors='coerce')\n",
|
||
"Masses = Masses.dropna()\n",
|
||
"# Convert from keV to MeV.\n",
|
||
"Masses['Ebinding'] /= 1000\n",
|
||
"\n",
|
||
"# Group the DataFrame by nucleon number, A.\n",
|
||
"Masses = Masses.groupby('A')\n",
|
||
"# Find the rows of the grouped DataFrame with the maximum binding energy.\n",
|
||
"Masses = Masses.apply(lambda t: t[t.Ebinding==t.Ebinding.max()])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We have now read in the data, grouped them according to the variables we are interested in. \n",
|
||
"We see how easy it is to reorganize the data using **pandas**. If we\n",
|
||
"were to do these operations in C/C++ or Fortran, we would have had to\n",
|
||
"write various functions/subroutines which perform the above\n",
|
||
"reorganizations for us. Having reorganized the data, we can now start\n",
|
||
"to make some simple fits using both the functionalities in **numpy** and\n",
|
||
"**Scikit-Learn** afterwards. \n",
|
||
"\n",
|
||
"Now we define five variables which contain\n",
|
||
"the number of nucleons $A$, the number of protons $Z$ and the number of neutrons $N$, the element name and finally the energies themselves."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" N Z A Element Ebinding\n",
|
||
"A \n",
|
||
"4 0 1 3 4 Li 1.153760\n",
|
||
"5 2 3 2 5 He 5.512132\n",
|
||
"6 7 3 3 6 Li 5.332331\n",
|
||
"7 12 4 3 7 Li 5.606439\n",
|
||
"8 17 4 4 8 Be 7.062435\n",
|
||
"... ... ... ... ... ...\n",
|
||
"264 3297 156 108 264 Hs 7.298375\n",
|
||
"265 3303 157 108 265 Hs 7.296247\n",
|
||
"266 3310 158 108 266 Hs 7.298273\n",
|
||
"269 3331 159 110 269 Ds 7.250154\n",
|
||
"270 3337 160 110 270 Ds 7.253775\n",
|
||
"\n",
|
||
"[264 rows x 5 columns]\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"A = Masses['A']\n",
|
||
"Z = Masses['Z']\n",
|
||
"N = Masses['N']\n",
|
||
"Element = Masses['Element']\n",
|
||
"Energies = Masses['Ebinding']\n",
|
||
"print(Masses)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The next step, and we will define this mathematically later, is to set up the so-called **design matrix**. We will throughout call this matrix $\\boldsymbol{X}$.\n",
|
||
"It has dimensionality $n\\times p$, where $n$ is the number of data points and $p$ are the so-called predictors. In our case here they are given by the number of polynomials in $A$ we wish to include in the fit."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Now we set up the design matrix X\n",
|
||
"X = np.zeros((len(A),5))\n",
|
||
"X[:,0] = 1\n",
|
||
"X[:,1] = A\n",
|
||
"X[:,2] = A**(2.0/3.0)\n",
|
||
"X[:,3] = A**(-1.0/3.0)\n",
|
||
"X[:,4] = A**(-1.0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Note well that we have made life simple here. We perform a fit in\n",
|
||
"terms of the number of nucleons only. A more sophisticated fit can be\n",
|
||
"done by including an explicit dependence on the number of protons and\n",
|
||
"neutrons in the asymmetry and Coulomb terms. We leave this as an exercise to you the reader.\n",
|
||
"\n",
|
||
"With **Scikit-Learn** we are now ready to use linear regression and fit our data."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"clf = skl.LinearRegression().fit(X, Energies)\n",
|
||
"fity = clf.predict(X)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Pretty simple! \n",
|
||
"Now we can print measures of how our fit is doing, the coefficients from the fits and plot the final fit together with our data."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Mean squared error: 0.02\n",
|
||
"Variance score: 0.95\n",
|
||
"Mean absolute error: 0.05\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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qqr47Gc/W6rTf8DeMWwfPo1hi4jIOFeywN69ezdvvfUW3//+90kkEtx8880EAgEuv/zyA35NdXUUv//IwrS+PnHQ11MFQyjnw2/7qD+2gnB9+IjOM1Ecqr5kX6qv4VOdDY/qa3jKob5KFtixWIxZs2aRSBQr9ZRTTuG11147aGB3daWO6Fz19Qna2voO+p629iRWv4uLj+5CBrstf0TnmggOp75kL9XX8KnOhkf1NTwTqb4O9odHyWaJf+hDH6K7uxvHcYBii3vmzJmlOv0HFHIudhYsH/hiZTtZXkREPKJkLeyqqipuvvlmbr31Vqqrq+ns7OS6664r1ek/oNBbAMBELSzLGrNyiIiIHI6STtNetmwZy5YtK+UpD8jpKbb0TVytaxERGf/KNq3cZLGFjQJbREQ8oGzTyul1AbAU2CIi4gFlm1buQJe4WtgiIuIFZZtWJlkMbCuuRVNERGT8K9vAdvuKXeK+RNlWgYiIeEj5plX/QGCrhS0iIh5wyMD+05/+VIpylJybHghsLZoiIiIecMjrsP/u7/4O27a5/PLLueyyy2hoaChFuUZfxgDgi6qFLSIi498hm5fPPPMM//t//2+2bNnCxRdfzFe/+lWefPJJCoVCKco3elLFFratFraIiHjAYaXVhz/8YW6//XZeeOEFli1bxn333ce5557LP/3TP412+UZNob84SzxeHRzjkoiIiBzasJqXsViMv/zLv+RrX/saU6ZM4cEHHxytco0qY8xQYFeX+baaIiLiDYe9lviWLVv49a9/zeOPP86kSZO4/PLL+cQnPjGaZRtxm3f38OdNHZx3whTcvAE/JCpDY10sERGRQzpkYD/44IM8/PDDbN++nUsuuYR//dd/Zf78+aUo24h74o/bAHh8d5qZgB23tVOXiIh4wiED+5lnnuFLX/oSF1xwAdlslqamplKUa1RlevMABOMl3axMRETkiB1yDPtf//Vfueiii3j55Zf5+Mc/zg033ADA22+/zTXXXDPqBRxJFbHiBDM7V3wcrFBgi4iINxz2pLO77rqLhx56iIqKCgAWLlzI9u3bR61go6EqXhyvtrPFx+GKwBiWRkRE5PANa5Z4fX39Po+DQW9dEmUGbgcDO1qlwBYREW847MCOxWK0t7cPTdJauXIliURi1Ao2GowpRradK95GdQ22iIh4xGEP4t58881cffXV7Ny5kyuvvJJt27bx4x//eDTLNuIG8ho7CwG/D39My5KKiIg3HHZgL1q0iH//93/nzTffBOCkk04aGs/2CjPQKT6jKkZ9lauNP0RExDOGNU06kUhw3nnnjVZZRt1gC3tKLIodzGjjDxER8YxDBvYDDzxw0NevuOKKESvMaBscw2Zwa82IWtgiIuINhwzs73znO5x44onMnTu3FOUZVYN5TXpga011iYuIiEccMrBvvfVWHnnkETZu3MinPvUpLrnkEiorK0tRthG3N7CLLWwrqsAWERFvOGRgX3755Vx++eXs2LGDRx99lM997nPMnTuXa6+91nNrig92iZvBFra6xEVExCMOO7GmT5/OVVddxRe/+EVee+013n777dEs16h4fwvbp8u6RETEIw7ZwjbG8OKLL/Lwww+zceNGPvaxj/HLX/6S6dOnl6J8I8plsIXtAj61sEVExDMOGdjnnnvu0P7X1113HZZlkc1m2bRpEwDHHXfcYZ/ss5/9LKFQcT1vn8/Hz3/+8yMs9hEygGsga7CCYEW0taaIiHjDIQM7EAjQ1dXFvffey89+9rO9l0YBlmXx7LPPHvbJzjnnnKHdvsaCMWZopy4r6tNe2CIi4hmHDOzf//73I3ayDRs2sGLFCrLZLAsXLmTp0qUjduzD4ZqBjT8sS93hIiLiKYcM7H/+539m2bJlnHTSSUd9squvvppFixbhOA5XXHEFsViMU0899YDvr66O4vcf2cSw+voPbkwSCvkxlk0waBOrCe/3PeVKdTE8qq/hU50Nj+preMqhvg4Z2PPnz+ff/u3fuOWWWzjttNO44IILOOuss4bGoodj0aJFANi2zZIlS1i5cuVBA7urKzXsc0DxP66tre8Dz6fTeZyUQz7nkHEK+31POTpQfcn+qb6GT3U2PKqv4ZlI9XWwPzwO2S986aWXctddd/Gb3/yGj3zkIzz33HN8/OMf57rrruPhhx+ms7PzsAqxefNmfvWrXw09bmpqKvlMc4PBlwcssMIavxYREe847M0/gsEg5513Hueddx7GGFavXs0zzzzDz372M5544olDfn08Huf555+ntbWVZDLJ5MmT+cQnPnFUhR8uY8AugAX4QhrDFhER7xjWbl2DLMti8eLFLF68mJtvvvmwvqahoYEf/vCHR3K6EWOMwVco3reCamGLiIh3lFUz0xjw5Q1gYamF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ySefzHPPPTe2hRqHNmzYwIoVK1i+fPlQ/Tz//POcdNJJQLHenn/++TEs4di76KKLiMVi+zz33HPPDdXRvHnzWLduHclkkhdffJETTzwRy7IAOOmkk3jhhRdKXuaxtL/6AnjggQe49957+eEPf0h3dzeA6gtYtGgRF1544dBj13WJRCIH/Dn8wx/+wOLFiwHw+/3MmjVrn5blRHeg+gL48Y9/zL333suKFStIp9PAxK6vCdMl3tHRsc8vjXg8TkdHxxiWaHy6+uqrWbRoEY7jcMUVVxCLxfapu3g8Tk9PD4VCAb9/wnx7HLUDfX91dnbu8/xgfZa7U089laVLl1JTU8Pzzz/PN77xDX7+85+rvt7n6aef5uyzz2b27NkH/Dns7Oxk1qxZQ18Tj8fp7OwcqyKPqffW10UXXcS0adOIRqM88MADfOc73+HWW2+d0PU1YVrYtbW19Pf3Dz1OJpPU1taOYYnGp0WLFgFg2zZLlixh5cqV+9RdMpmksrJSYf0+B/r+qqmp2ef5/v5+fd8B06dPp6amBoAPf/jDvP766ziOo/p6j1dffZWVK1fyzW9+E+CAP4fvr7NkMjlUt+Xk/fU1Z84cotEoUPwee/XVVwEmdH1NmMBevHgxu3fvJpfLAfDmm2+ydOnSsS3UOLN582Z+9atfDT1uampi+vTpnHfeeaxatQoo1tt55503VkUct5YuXTpUR+vXr2f+/PnE43HOOecc3n33XczAkvyrVq3i3HPPHcuijgt33HEHhUIBgG3btjFt2jRs21Z9DXjuued46aWX+Na3vkVbWxurVq064M/h0qVLeeuttwDI5/Ns2bKFU089dayKPib2V1+333770OtNTU3MmDEDmNj1NaE2//jjH//Ik08+SXV1NYFAQLPE36elpYXvfOc7HH/88SSTSQqFAn//939Pb28v3/ve95g6dSo7duzgb//2b8t6lvhrr73Go48+yosvvsjnP/95vvzlLwNw++23U19fz/bt2/na1762zyzxd955B9u2mTlzZtnNet5ffT344INs3LiRxsZGNmzYwBe/+MWhccVyr6933nmHK6+8kgULFgCQSqW44oorOP/88w/4c3jPPffQ29tLT08P55577sSZ9XwYDlRfW7duJZ1OU1tby4YNG/j6178+9DM5UetrQgW2iIjIRDVhusRFREQmMgW2iIiIByiwRUREPECBLSIi4gEKbBEREQ9QYIuIiHiAAltERMQDFNgiHvX6668zb948HnnkkaM+1p/+9CfmzZvHj370o6HnVq1axcc+9rGjOu73v/99PvnJT+7zb/78+fzd3/3d0RZZpOwosEU8yHVdvvvd7/LhD3+YtWvXHvXx3n33XRYtWsTTTz+9z3MnnHDCAb/m/PPPP+Rxb7rpJh577LGhf2eccQazZ8/mlltuOeoyi5QbBbaIB/3yl79kxowZfOELX2DdunVHfbw1a9Zw6aWXkk6n2bFjB1AM7BNPPPGojz3ojjvu4LnnnuO+++6bMJsxiJSStmQS8Zje3l5+8pOf8MADD5DP51m/fv1+3/f1r3+dpqam/b724IMPEg6Hhx6vWbOGz3zmMyxbtoynn36aL3/5y6xZs4ZPfvKTI1LmH/zgBzz55JPcf//91NfXj8gxRcqNAlvEY5YvX85ll13GtGnTcF2XXC7Hnj17mDJlyj7vu+uuuw7reNlslq1bt3L88ccTDAa59dZb+au/+is2b978gS7xa665hj179gDQ2to6FOi2bfPwww/v9/g/+tGPePzxx/nFL35BQ0PDcD+uiAxQYIt4yObNm/nlL39JVVUVjz/+OFDcQnDt2rUfCOzDbWGvW7eOxsZGYrEYCxcupKWlhZdeeonJkydTUVGxz9f95Cc/Gbp//vnn89hjjx20vCtWrOChhx7i/vvv/0D5RGR4FNgiHnLrrbfy7W9/m09/+tNDz33rW99i3bp1H5gEdrgt7PeOVVuWxfnnn89dd9110Alnh+NnP/sZv/jFL/jFL35BY2PjUR1LRBTYIp7x7LPP0trayqc+9al9np8zZw5vvvnmER93zZo1+4TzsmXL+MUvfnFUl3Rt3bqV22+/nUmTJnHDDTfs89p1113HRz7ykSM+tki50n7YIiIiHqDLukRERDxAgS0iIuIBCmwREREPUGCLiIh4gAJbRETEAxTYIiIiHqDAFhER8QAFtoiIiAf8/4DBbA/qVQNEAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<Figure size 576x396 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_57_1.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# The mean squared error \n",
|
||
"print(\"Mean squared error: %.2f\" % mean_squared_error(Energies, fity))\n",
|
||
"# Explained variance score: 1 is perfect prediction \n",
|
||
"print('Variance score: %.2f' % r2_score(Energies, fity))\n",
|
||
"# Mean absolute error \n",
|
||
"print('Mean absolute error: %.2f' % mean_absolute_error(Energies, fity))\n",
|
||
"\n",
|
||
"Masses['Eapprox'] = fity\n",
|
||
"# Generate a plot comparing the experimental with the fitted values values.\n",
|
||
"fig, ax = plt.subplots()\n",
|
||
"ax.set_xlabel(r'$A = N + Z$')\n",
|
||
"ax.set_ylabel(r'$E_\\mathrm{bind}\\,/\\mathrm{MeV}$')\n",
|
||
"ax.plot(Masses['A'], Masses['Ebinding'], alpha=0.7, lw=2,\n",
|
||
" label='Ame2016')\n",
|
||
"ax.plot(Masses['A'], Masses['Eapprox'], alpha=0.7, lw=2, c='m',\n",
|
||
" label='Fit')\n",
|
||
"ax.legend()\n",
|
||
"save_fig(\"Masses2016\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"As a teaser, let us now see how we can do this with decision trees using **Scikit-Learn**. Later we will switch to so-called **random forests**!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAesAAAFpCAYAAAC8iwByAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABMiElEQVR4nO3dd3hUVf7H8feU9N5IQu+IdEFUUAmKChYEewF11XXVVde21l3Lzwauuq7gqqy6upa1LAJixQKiIsWGhN4JPT2Z1Cnn98eQgUBCCCQzmczn9Tw8ZGZu+d5Dwifn3nPvsRhjDCIiItJiWQNdgIiIiBycwlpERKSFU1iLiIi0cAprERGRFk5hLSIi0sIprEVERFo4e6ALEGlO33//PU8++SSrVq3i2GOPxRhDZWUlo0eP5qqrriIsLOyItv/jjz/yz3/+k1dfffWgy82ePZuFCxfy2GOPHdH+9jd69GjS0tIA2LBhA8YYunXrBkBubi6fffZZk+5vfzNnzuTFF19k69atDBo0CJfLRV5eHiNGjOC+++7Dag2O/sA555zD1KlT6dSpU6BLEamTRfdZS2u3aNEirrjiCpYvX47dbqewsJA777wTm83Giy++eESBYozB4XAQFxd30OXcbjeVlZXExMQc9r7qMnHiRN544w0A7rnnHlwuF0899dQBnzWnDz74gGeffZb58+cDkJOTw5lnnsnDDz/Meeed1+z7bwolJSXEx8cHugyRegXHr70iTSgpKYlJkyaxaNEiPvzwwyPalsViaTCoAWw2W5MHNcDtt99+WJ81pw4dOtCjRw+ys7MDsv/DoaCWlk6nwSUkpaWlceKJJ/LZZ58xbtw4wHtK9+233yY8PJz09HQefvhhYmNjAe/p9ClTphAWFobH42HChAkcd9xxXH/99SxdupTVq1cD8O677zJ9+nSioqKIjIzkrrvuwuVycdddd1FaWsrXX38NQF5eHg8//DAFBQU4nU4uvfRSxo8fz/bt27n11ltZunQpkyZNYtasWezYsYMnnniCY4455oDjGDRoUL3HOGjQIN59911eeuklBgwYQExMDMuWLSM+Pp433niDb7/9lqlTpxIWFkZsbCwPP/ww6enpAGRnZ/PEE09gsViw2Ww88MADvtPrh8LtdpORkeF7fbDtLVu2jAcffJDw8HB69erFmjVrKCws5M9//jPffvstH330ERMmTGDdunVkZ2dz/vnnc/PNN/Pyyy8zZ84c7HY7vXv35u677yY8PJz169fz8MMPA+Byubjgggs477zzyMvL45577qGqqgqXy8XIkSO57rrrmDRpEv/73/+47777fGcCar4XwsLCSEpK4qGHHiI1NZWpU6fy3//+lzPOOIPS0lJWrlxJnz59mDx58iG3jchhMSKt3MKFC03Pnj2N0+ms9f5jjz1mxowZY4wx5scffzRDhw41+fn5xhhjJk2aZO677z5jjDFbtmwxgwYNMhs3bjTGGLN06VIzYcIEY4wxOTk5pmfPnsYYYxwOhxk6dKipqqoyxhjz2muvmenTp/tqGDlypG/fV155pXnuueeMMcbk5+eb4cOHmyVLltTa5scff2yMMWbatGnm6quvbvA47777bnPHHXcc8P5zzz1nhg0bZvLz843b7TZPPvmk2bJlixk4cKBZv369McaYN99801x55ZXGGGNKSkrMcccdZxYsWGCMMWbu3Lnm9NNPN263u879Tp8+3Zx00km+1ytWrDA333yzKS0tbXB7VVVV5uSTTzazZ8/2rdu7d29fuxljzIQJE8zvfvc743K5zPr16817771nZs2aZUaPHm3Ky8uNx+Mxt9xyi3n++eeNMcbccsstvrbbvXu3ueaaa4wxxkyePNm89NJLxhhjysrKzCWXXFJrHzX7XLJkiTn++ON93wvPP/+8ueKKK2q187nnnmuqqqpMZWWlGTp0qPn5558b+NcROTI6DS4hy+Px+L6eMWMGp5xyCsnJyYB3wNHs2bMxxvDRRx/Rt29fOnfuDED//v259dZbD9iezWYDvL2yiooKLr/8cs4+++wDltu1axc//PAD559/PgDJyclkZWUxffr0WsudfPLJAPTq1YutW7ce0bEOHDiQ5ORkrFYrf/7zn33H1LVrVwDOPvtsfvjhB3bv3s3cuXOJjo7mhBNOACArK4u8vDyWLl1a7/YLCgqYOHEiY8eO9R13zVmJg23v119/JT8/nzFjxgDQu3fvOnvwI0aMwGaz0bVrVy688EJmzJjBWWedRVRUFBaLhbPPPptZs2YBkJCQwGeffcbWrVtJS0tjypQpACQmJvLtt9+ydu1aoqOj6x0UOHPmTLKysnzfC+effz4LFy5k+/btvmWOO+44wsPDiYiIoFOnTkf87yPSEJ0Gl5C1bds2OnbsCMDOnTtZv349EydOBLynT1NTUyksLGTnzp2+/7hrDB48+IDtRUZG8uabb/LSSy/x7LPPkpWVxZ133nnAujt37gSo9X5ycvIB13hrwi4iIgKn03lEx7r/dfX9jxegXbt25Ofns3PnToqLi2t9lpycTFFRUb3bT05O5o033sDj8XDnnXfyf//3f2RlZREeHn7Q7ZWXlxMfH+/7RQe8oXoo9c+ePZtFixYBUFVV5RsoeN999/Hqq69y5ZVX0qZNG2655RZOOOEErrnmGqKiorjtttuw2Wxcf/31vl8S9t92r169fK+TkpJ877dt2xbY+28DTfPvI9IQhbWEpN27d/P999/7rm1mZmbSoUMHHnzwQd8yBQUFJCcnk5mZycaNG2utn52dTd++fWu953Q6SUlJ4amnnqK0tJR77rmHyZMnH3A9s+ZabkFBge8//4KCAt/1Yn/IzMykb9++TJs2zfdecXExsbGxrFu3joyMjFojyR0OB+Hh4Q1u12q1cvfdd3PqqafyySefMG7cODIzM+vd3q+//kpJSQkulwu73fvf0cF+Kdi3/mHDhnHttdf63isoKAC8I7tvvPFGbrjhBmbNmsUNN9zAggULcDgcTJw4kYkTJ7JgwQL+8Ic/0KdPH98vbPtuu2ZbAIWFhQC1rsGL+JtOg0vIKSoq4t5772Xo0KGce+65AIwfP55vvvmG4uJiwHvP8g033ADAWWedRXZ2Nps3bwbgp59+4oUXXjhgu7t27eKvf/0r4O0J9u7dG7fbfcBy6enpDB8+nA8++ADwhsG8efN8p8X94ayzzmLp0qVs27YNgPz8fCZOnIjH42HkyJEUFhby22+/AVBeXs4VV1yBw+E4pG2np6czbtw4/vOf/wAcdHsDBw4kJSWFTz75BICVK1eyadOmBvcxfvx4PvvsM6qqqgBYuHCh7xete++9l7y8PCwWC8ceeywulwuLxcIzzzzDypUrAe+ljLCwMEwdd66OHz+e+fPn+wJ7xowZHH/88b5frEQCQfdZS6tW10NRKioqGD16NL/73e9qPRRl1qxZvPXWW0RGRhIWFsZf/vIXunTpAsB3333nGzkdGRnJI488Qnh4uG80+NChQ3nppZd49NFH2bhxI1arlYiICB599FFKS0u566672LBhAyNHjuS5554jPz+fhx9+mPz8/FqjwYuKirjuuutYunQpp5xyCn/961+54YYb2LBhA2PGjOHJJ5+s8ziffPJJZs2ahTGGcePGcddddwHeh7H8/e9/p6qqiuHDh9daf99jslgs3H777QwcOBDwnjmYPHkyxhiMMVx77bWMHDnygP3u/1CUKVOmkJiYyObNmxkzZgwDBgxg0qRJlJaW1ru93377jYceeoiIiAj69evH8uXLueCCCxg/fjxPPvkk7733HqmpqVx88cX87ne/8+371Vdf5dNPPyUqKorY2FgeeeQRUlJSmDFjBu+++y7h4eE4HA6uvfZazjzzTObNm8e//vUvbDYbDoeDcePGccUVV/hGg6empnLPPfeQlZXl+17YfzT4v//9b15++WUiIiK49957Wb16Na+99hqpqak8+OCDvuvyIk1NYS0iAVVUVFTrOvVZZ53FXXfdxYgRIwJXlEgLo9PgIhJQf/7zn32nnLOzs8nNzWXAgAEBrkqkZdEAMxEJqOHDh3PttdcSHR1NdXU1//jHP+ocES4SynQaXEREpIXTaXAREZEWTmEtIiLSwrXYa9a5uaWHtV5SUjSFheVNXE3rpjZrHLVX46i9Gk9t1jitqb3S0uqexa/V9aztdlvDC0ktarPGUXs1jtqr8dRmjRMK7dXqwlpERKS18etp8Ndee41du3YRFRVFdXU1d9xxBxaLxZ8liIiIBB2/hfWKFSuYMWOGbxq7m2++mS+//JLTTjvNXyWIiIgEJb+dBt+8eTOZmZm+1+3bt+eHH37w1+5FRESClt961v369eOZZ56hqqqK8PBwsrOza4X3/pKSog970EB9o+mkfmqzxlF7NY7aq/HUZo3T2tvLr08w++GHH1i4cCFJSUnk5OQQGxvLbbfdVueyh3vrVlpa3GGvG6rUZo2j9moctVfjqc0apzW1V4u4dSsxMZHbbruNq666ipKSEsaOHevP3YuIiAQlv44Gf/TRRxkyZAhhYWGccsopdOvWzZ+7FxERCUp+Deu33nrLn7sTERFpFfRQFBERkRZOYS0H5fHAJ5/YWbDARlUVvPOOnY8/tmMMVFeD0+ld5u237bz6ahhud6ArFhFpfVrsRB7iH1u3WoiKgh9/tHLHHZGkpRl69fLw0Ud2YmIMUVGwbJn3FrqYGENZmfeJc926edi2zYLdDp06eVi+3LvMO++EUV7uDfDf/c5Ju3aG5GTDcce5KSuDkhILbdtqCnURkcbw661bjaFbt5qHcRsK38zDXexm6a9WPvrIjs0GxoDbU/c6sTEGY6Cs3EJqqqGi3Pv1vmKiDRYrOBx1Pz42vY2hsNCC0wUnneSme3cPHjdkZhqKi6GszEL7DgYLUFUFEZFNd8xuF2zebCExyZCcfODncaMSiDw66pC3p++xxlF7NZ7arHFaU3vVd+uWetat1K7yXTz6w4OUVtf+Bj76g8GcNWsEAJnA7wEaOnVdts/XefUs09DsdLv3+Xr+nj9A/p63IoDcBjZxJGIB135l1NgwdTUvT/43zkjnIW0rIsJOVZULgGPSB3PLMbc3WZ0iInVRWLdSr2W/zLur3671XkxFDNfNuQaAj475iJKokkCU1qIMWzOMzrmdSX0ziVdOfaXR63+ycTZndzuXrgm6DVFEmo/CupVa/PMv3DnrTrqZY7C5EsnZYqWN00pCRRirU6qJuPUYEl0Wevf2kJAQRXFxRUDqdDggMhJcLvjiCzvJyR66dDF88YUdtxuSkw3LltmIiTEMHuzmhx9sOF0WevX0sGaNFY8Heh3lYd1a71jJk05ysXatlaIiC336uomPM8TFQZ8+HsrKYN16K3m5FhYtsrNhg5XvYmz8Mxcu/vZyjl98CXY7RO857b+rdxVhDxQTGVO75pr2ennZiyzY/h0Ltn2nsBaRZqVr1gFi/2kJEbNneS8WH4bKSm/I7csYyM+3YImr5n9f92TQpkEHrGcwdBk9jzZdCn3vRUeHU15efVh1BDOPxzui/bfZgyGvU53LFLGdkrDtxMYaOncygCEmxk5MjIs54Zv4v46fclxcBP8uOcO/xTeh6jPG4Bx2YrNtP1h+JlsStVnjtKb2qu+atcI6QJKyhmFfkX1Y61aSRi4jMPWcGFkb1xFb6RhKowoYWvECsHfkWCQ7SGDlYe23tfJgpZyOGPZOHFNFBiu5FzcxB1kT3BY3r5/yD17/ajbBOjO7u117Cn5Z0WzbD5afyZZEbdY4ram9NMCshbFuzQGg7J6/YOoZ+vz1x9Hs/iWN3kd5MAa2b7diXDZSHG2w7xMs+7Pt+Z79efSnHN8jC6cT4uP3fu7Yb/nY2AgcjqojOZxWYd+wjQR67VjL9gVtcVVZKS62UFJiwWaDqkpwusGGlXSTyNVf3c431B5kVmWpxtprK2GZRQD06OkhMgJsEW7s0S6/HVNDYiY9gm3bViyOUkxs6561SCSYKawDoaKCN7oU89ogC9Vd59W5SGWBnT+t+SPd3ak4l3vfa7PP5z91Xc2aaO/46bAw78NJrFZISTEUu/JYmbac39/3R+g4ijDgYFekY9PiqGglv5U2JQvQro73ExLi+PzzcpKSDK89/QTjPj2e2KrYWstEmHBY1RVWeV+vnev9223xsLj3BlZ22o7L4/33iowyVIa5KBiegwmr5/45IMIWwU2DbqVjfN2n7A9H5DtvYl+9CtvGDbj6DWiy7YpI01JYB4Bl9y7uPg12xRrY/h1Wj5Uuu7tgMXv7dmN+GUPHklRyknOY23durfWXd1jO4h6LD7qPxIhE/pV5fLPUH+rCw+H44733u/W9NZNzBpxT63OLsZC1PItLFlxCbEXtEG9T0oYTVnTnhBXdD9jutne3Mf/o+XgsdQe20+bk6dFP8o9rnm+iIwF3l27esN6wXmEt0oIprANg17YV7IqFBKeNh/vPxnpFJP2qDrzi6cEQ/WQa0YUXk5lp6NPH+5/4WC5ocB9dE7oRGxbb4HJyZC4+6jLiIxIord7vNrhToeIWFxUUAVBUBG43rNxUTtw7ycRVeB/ZWlBgweOBriURtC9sx6XfX3rQ/Tm/dTL9hWzcJBA2IpG+f4jDZrfQsaPBfhg/ze6u3lHstg3rG7+yiPiNwjoAlm5fTGxFLOeuHIL7xY4MqMqlFDs72XvtOiHB0P7aZE4e24aTA1irHJzdauecbuce+gonAhMOfNvjNCx/vgj3tirCI2DjBisul4WwcMOKFVbKyiykJMxl5KYuHLWlCtgNb+ym6E2DywK7LQabzft8mw3dqym5upzKSENmhoekZMACJubAsaThHSs4PRIiFdYiLZrCOgCWFmTz5JtP0ntbbyCXKqx0eK8nS5YlkJxsOOUUF5mZLXKQvjQTa5iFfrcm+V4fvc9nZ+75e23BAK549iK67exGsiOZc5ecS0ZxBhgAi+9JdANWRMKdBw5aXJO5hrdPfJuimKJa7z90ZRJfZq8irCkPSESalMI6ADavq2TMtt44rdVsTkon5bo2tMuK4uas0LvXWQ5dj+QeXHPBH5iX8zUFFPHvS18nsjwSA5SWWqishOSyWEbOOoneWzpiMXty3ECYx0bPHT156P2HDtiuy+rik8yfcBz/M+4kQ9gxYCIgqoeHdiM8WKzQM6kXCRGJ/j1gEfFRWPuZMYbMFf0BKMzczbm/nBDgiiSYXNv/eq7tf/3BF7p775eVlbBtmwWqPKx/Jg/bkiLsVkNpqYXSEgs2eyVHud1033Yce6IdfqpZ28qWlK3kxufyRernDLvlfLLO6NMMRyUiDVFY+1Hu9jK+/XoZJ67IAqDzaeGBLUhavchI6NbNABa6vZwGpNX63Bj4ZfRJzI5JozC5I4n57Wi3IwObx0b3ne3pmN+RjvkdGbwR3FeU83H8d+zoXEb5uDyijyujV0YvTmo/IiDHJhJKFNZ+4nK7WXDal/TKbQ+kkB+/hX7nt6X+u2pFmp/FAlmZHTnjk9kYu917s/4eHmOj1NadMmsM/+08goHrR9G5OIrOS6NgaSoA25K2MSfuj4zZlk20ZSsR1uI695Nas83EJIpnfIy7R8/mPjSRVkVh7SdvTp3LsbntqbRXUhyTS0L0vyH9H4EuS4SqM88mfM6nWFy1n6xmAxJZRqIbrtq2kOeH/wOPswftdp5E+50jiKxMoV1hOyi8mt/wPnp1aee5rGq/GKt9K/ctWkXHUu+p9ZobE227dxEx6wPK77zHr8coEuwU1s1s7v+VULa5GseGDcBgFg8u5K+//h5LcRW5aW0aXF+kuVVddClV4y/wzmxyEDfu99pVbZj6zP8w326lQ357em7vyTHrRnHMulEAfJ+wm5kdo3ElgfPsYtokf0+nKS8w7Ifvm+lIRFovTeTRjBz5Htb0WUKEZ+/vRNZX2nDyNX3wxMaRv2FbAKvbqyW1WTBQe9W2tTSHvIpc8n6DHVMshG03ZOQVklaWeMCyFWEV5GQswHr05UQmRtHprBi6ZoVjDwerNVinQml6+h5rnNbUXprIIwC+eWkznfcJ6lVppVx0lPcfwtNGvWppHdrHdaB9XAcYhfcPUOQo4dmpr1C5s4w2G9MZ+stRJFRGEeWMomfOqZCzEwD3u7AW7+1jyzouY23GWioinWQOG8ofb7yY8HAFuAgorJuMdeMG7KtqTz3p+KQE6MniHj/TqbgXg8dWE/7JbAA86RkBqFLEPxJj43nontuA2r2e7GtvZOZug/EkE18Rz6CNg0hyJGH32Bm0adDeOdjnQfakxbissCm9mF0dSsBuKOtdjBlWSGQbC+f3urBJJzURackU1k2hqoqk07OwFhf53jJA+5i3AMiwvszFu1fCy3tX8aSn+7dGkRZg8OgRZN34e1xt2+LqPwDa/QxAeVkEO7Z0prI8gRWRFmIL+pFclkyEB/psS6HPthTvBr4D/uXtif/Q7mtynfm08dhITNlJRrst2OyNv6pXnXUqlVf/vgmPUqTpKaybgHXbVqzFRZjoGKpP9t5zuiMvgcQf21IUXcSwHm2p6tJl7wph4VTceEuAqhUJHOdJIyA8nLDt2wnbvt33fhSwJ44ZAnzV2cL8YyKwu6JILBpMVEUGVk8kSYWDiC7vjN0dTd8c78OFSoCS3bBxlRu31c2mNuv5sdtCdiZto3fxGh6bn3PQ/+jC53xG1TnjMGlpB1lKJLAU1k3Att07UMzVrz8l/3mHJ975B92faM/RwNLO6xj+6gxKDr4JkZDgSc+g8Iv52DZtPOhyQ/b8qVsJefl5PD3vW9z5ViKcEQzeMJhOeZ2wuW303NGbnjt6+5b+OMKBwUpJvIOi7ruwxboI6+QgckABEXM+5vj5a0n+4jMqL5vYVIcp0uQU1k3AujUHAHe7dizZ+DND/9qdjOIMcuNycUxokYPtRQLG3fto3L2PbnjBg4gHHp4wHkd1KWbPY1LdlYbiXA8r3qjGsaAST94uOuQ7SKhIACAxN5qOuXsHdubG5bImM5Uv+63jjDe/o127i2g/KIzIeGtduxQJKL+G9csvv8y2bdtISkpi8+bNPPbYY0RGHjg7ULCxbd9GIQPYXjCAD/7xGROKzyAnvoiwt5K4/dhRgS5PpNWKDd/nNpdwSIyHTg/VvNGJH3K+Z9pXr1Pu8JD+W3var2+LpdpGz5x2tClNI600jeFrhgNQdWE2K23VrGy7jt1JeRQnV9MzaxjDTu9NZpd4wm16PLAEjt/COjc3l2nTprFw4UKsVis33HADc+bMYezYsf4qodlUr9vFUp7E9Y2NE1O9vezSEZ248LjuAa5MJLSd0GE4J1w1/ID33S7D6jnVbF9QQdGXU/BUdySlNJWM4gwG5BwNOXsWnAeOhzazJLqQ3cmrcYfnYQ8r4NTqzbSPzMVq2XvmzJOWRslLr2KSUw7Yn8iR8ltYR0VFERYWhsPhID4+nvLycnr06OGv3TeZ/zwxn7Y9Uxl1/t7TeLtWVALh2A10zu1MldXFqQ90DliNInJwNruFo8+M4OgzI4jslonzoZupsIM7Jp5Kz9FUk8yyxJ64qvuTVpJBYnkSieXH+9bfAmyyuCmJ2U1Om2XkJWzBU76LUx9+it5/f1wPeJEm59cnmM2cOZPZs2eTlpaGMYYHHniAmJiYOpd1udzY7TZ/lXZIvvlkDa6zc9iemMvEgkt873/R8UrCcn7ne72qWxzXrxsciBJFpLGMgXXroLy8zo89HsPCH3bx3dy1uPOtuHaX0SunE21K6n+wUVlYJSs7bGZXei5VMW56n3gCZ50zgqSOduJSW9b/axIc/BbWK1eu5K677mLGjBnY7XYmTZqE1WrlrrvuqnP5lvi40Vf++hXHv5QIQMT89nQ/ynuv9Df9/kLqrvF8d/RKUp1ZHPtsGzoeGzzXt1rTo/r8Qe3VOK2tvYwx/Jb7K3klRRQstOOYa8eyA1K3ZpNa1IO4yrofF1lja3IOufG7cdtcWKMLOSoCwsJdRLcpJjqthHCLlaPDU6iscNber81G5aUTcffp25yHF5Ra0/dYwB83umvXLhITE7Hb7XsKSmPHjh3+2n2TKFtXBCQC8MMnq+h+VDqWkmJc7vYAOIbDHx5rH7D6RKT5WSwWBrQZBG2A7sAE7/thc8vJu2Es29Ms4E7BVA0Cdwo7otJwePqS7EglriKO9gUdaF/Q4YDtOoFioNpWza+JOYRbtoHFSUXUFspiNmJsZfT97gd6fvQ5ttgoPx6xtAR+C+uTTjqJb775hkmTJhEXF8fatWu57777/LX7JhG+c+9vunk/e59tbN22jejyzgB0OU5BLRKqnCNPJe3v/yV9W84Bn1WaPArZgqvSwu5VcVQXhbO7uoKNBZVElMcQXRVNu4J2JJUnEe4Op11+N6DbAdvxAMu6/0ZxVBnF0aUURzsoiXFQ2svGlQ+cS2Z6Uu0V7Lo7t7Xw27+kzWbjwQcf9NfumkVq/t5T21E51QCU/ryV+PI0Ku2VDMvqXd+qIhICqsecVe9nNTF6sOekeTyGwl1VfPbJt2xetQlrpZX4dYkk5EYTU1lFcnkkKY40UssSSC1L2LviCtj8aTaL0xbSyTmfU3YuxIabqrPPpeTVN5rk2CSw9GvXIXK7PbQrSva9bp8bBy4Xq+ZvIoIUtqZsYXD8gbeIiIgcKqvVQkpmJLfec16d12At997Cps/eweNKwONJxHgSKbOks8ucSbv8XsTlnA6czqeRxWxNW4ZZs4STPpxP+tiT/X8w0qQU1odo96QpxFeeSEVYBeGucDrmt6WyZ3tMxIXAYAoScgNdooi0cuaJ5+j0xHMHvO92e5j/0WqWvrOM7kvD6ZLXgaNyTgROZMd1Thbc/wEbuhQy/IZRHD9GM5UFI4X1Idr29SKiOJHcxE1EVkfRprgz2VX/I8rhHehRkqn7KkUkMGw2KyPP7c3Ic3vjqCrj68+XUjS7gLglW+m+fTA9d3Wi565OsDCPufEr2Jixivap+XTLKKdLkoc4SxgA7j79qLz8igAfjdRFYX0oPB6KSq1EAVuTLYSbZNoUQ5Qzis2pm1nc4ydG3H92oKsUESE2IoaxY4fBWIi9/nds/fohCqxH8VP8KDruOIk2JW2894ivgUpgYVQRRSnfEGVdSZtPvqDvUX0wg/WciJZGYX0IrJs3UW7aAlCRGcGZ953Ij08V0um8GM4YN5DRlnFYLXr4v4i0LGWPP0XGhyeS6aymD5Dv/Ikta8NZvNJJ9M40MooySCpPImHrucC5AMy7cBcbMz6luIODquOLOf2c4QzsrsGzgaawrsOmtXlkn7uADQOc3PLf87GvWI6lynsbRXSPRNoNDKPdm/U/vUhEpCUwySlUXnWN73U0cNSeP+Adff7R27+wduZvpGwPp/uONFId6aSuA9a1gbnAE+XMjZ7H6i67KehaiLWrjSuvPp/MzKQDdyjNRmFdh4//vpCsvHZ0+cr72r30NzLzRwBwwgV6epCItA5Wq4WxE46BCccAUHHJmczKz8Pj6UV80VEkFPUhtjydNuVxtFkeB8u96+2auooNUdtwxGynMGUljvitRNiKmLizkGRn7bOMJiaa0qkv4eo3wN+H16oorOtgjwnzfb1u5W5KFm0iyjma7Yk7OG2QruWISOsU/4c7uPni8cAqYBYAy9IsLG7TlZjiIYRXdaDc9KBtXncSHV1IdHSh/a69t6wujijFFbmO6oidOOJWUhG9Hrsll7OffYywV94LzEG1EgrrOrjK9j6pbMGMVSTlRdIV2JyZH7iiRESamXPkqeSt2IDFsfce77bAuH2X8Th5Z9kcdq2qwr42gYRVKcQVR5FYbiW9NAWqBgGQtnuMb50l6wrY0W8OJUkWHD3LYIiD2D6Gc4aMITUq1T8HF+QU1nVwl1b7vrZ/9R2m3DsvdXW/5PpWERFpFUxqKia1/gC1AZd37VkzHs3H6Xby8sx3yM0uInJjHGlrkkkujCHDYSWhPJmEcmAXsCoZPvSu81PSD+xO9FCRWE1Z1xISB4UzbngWyWkRBy/SYvHWaAmdW2YV1nWIKCwEvA8OiC2IJa3Ae5160LijD7KWiEjoCrOFccP5E+H82u9bvprDrMcuZ3tke2LK25Ja2I+E0i7ElLejfWFb2hfuWfAXYDpsZzfL4jexI2UFRfFb6FGSw1kbc4hmO1bcvu1Wnnsepf96zV+HF3AK6zrYK/Z+Q3TYeSzh7nDyYgs4ceSgAFYlIhJ8zMhRTHh9EGE/LgY2At9DJLgirHyc1pZN4ZlEVaSTUNQLW1V7khxtSCnpTEpJZ982fgTcFhc7kzaxNW0NRbHbaLt+HafP/5XkkwcG5sD8TGFdB1vV3lMr4W7v5B1Lh5UywqZ7qUVEGsVqpeQ//63zoxP3/Knh9riZv/57Ns8pxfVTGCanivCSbbQrbEN6UTrtCrrTrqC7b/kdF7j5LeZrtrTZwZb2O0lr15/jRwynzzlR2MNb1ylyhXUdwpy2Wq+/672WP75+UYCqEREJDTarjZE9ToYee98rc5axPC+bwiI3u74wVPxiIWxTPrF5u+mQ25O0sgTSNiYweOOeu8ffWckvfypnW/JWchO30TOslO7xFSSmFxIT4SHO473bx4RHUHHjTbi79aijkpZHYV2H8GrvP2b2oI/Z3WEAVz09Dpt61SIifhcTFsPQzOMgE9jnQWqREy9g9dIvcZoMPNU92RnRg7XxGXTcfRRti9rSY2dPeuzsCUARkGd1sbrtaqpilnLi7qW0cWeTWZBPyb/fDMRhNZrCug4RTu+p73YZLi5++dwGlhYREX+r+sdL9PzqC3C7iY+LpKS0klHGYCiieGcp2zfamLs5B0t+JJkFmXTI70CfrX2APpRzGeusLt7JeZ6rKyqwREUF+nAapLCuQ6QzEoDY+AZuHxARkYAwySlUXXiJ90VaHFX7zP8dDXTf86dG8XY3372xmVXff02nzQn03tGVIdl/5J/nTaPP8qFs7R7Jue/1Jy619mXQlkJhXYeoau9vWfHJLf+3LRERaVhCWxtn3d2Vs+gKwGdDX6XDpgFk/eQd4paW7WHBsDlsHmvjqsdOJTyiZYW2wroO0dXRAKS2iQ9wJSIi0hxOn3IMKy9cTIWnCz8O/IxO64fTMb8T7f8D82bPprzDIsIjy8FjIxIPp6QXERdWexsmOYWy+x7AxCc0e70K6/1UlDuJdEbhwUNyRiKuQBckIiJNzjp0AMMzfod903rGLIZK67+Z1fEMrEUTaFfYAQo71Fp+cYSDbRlz6V79GSfvWOELz6qzxuI8aUSz16uw3s+OnCIAKiLKscbHBrYYERFpHhYLJR98SNiSRb63xgCOihLemrUO65ZYwp3huG1u4spi6ba7Cz03nwOcwztJ2yiMLQaLnWPietPTD+UqrPeTu91BLFAR7sDENP+pDRERCQxP+w5Uta/dgw4DrrrswGW//GAlq19ZTr/lSbQvbEf7wnYA/PzdOnoObNPstSqs91Ow0xvW1WHlmJi2gS5HRERagFHn9WbUeb2prvAw+8XfKC0tImNAPBePPcEv+1dY76cktwwIw2kvw0THBLocERFpQcKjrJx/20C/71eP5dpPeWEFAC57GSZGYS0iIoGnsN5PZVElAMaqsBYRkZZBYb0fV0mV9wurToOLiEjL4Ldr1lu3buWqq64iMzMTAIfDQa9evZg0aZK/SjjA4jfnU/ZQCdsHrePy92/1vumo9v5trYCwsHrXFRER8Re/hXVMTAz/93//x7BhwwCYMmUKJ5zgn1F09dn51id0K7mQ0nUbfO9ZHU7v39bKQJUlIiJSi99OgyclJfmCurq6muzsbIYMGeKv3dfJhbfnbHPF+d6zV7q971mrA1KTiIjI/gJy69ZHH33EmWeeedBlkpKisdsP70HqaWlxDS8EuKzeiToiquN964RXWwAIs7sPeTutQSgda1NQezWO2qvx1GaN09rbKyBh/dlnn/H8888fdJnCwvLD2nZaWhy5+0yVdjDVHm/POqoqntwdhWC3E17pPdkQZnMd8naCXWPaTNRejaX2ajy1WeO0pvaq75cOv48GX7RoEQMHDiSsBQzeMm5vLzqmMg6zcycAkdXe318iwk3A6hIREdmX38P63Xff5ZJLLvH3buvmvTxNmCeMghWbAIit9E6PmRxlCVBRIiIitfk9rJ955hmSk5P9vds6WVx7A3nXyhwAksoSAchMaFkTj4uISOgK6YeiWDx7w7po8252bi0hpjqaals1GSnRAaxMRERkr9AOa/fesC7bXcTaZd7r1sUx+VhiNZe1iIi0DCEd1lbP3lPdlcUVbF9bAEB5ZL6eCy4iIi1GaIe1e29Yu8vdFG0pBsAZnq/ngouISIsR2mG9T8/aVFmo2lXmfWFTz1pERFqOEA/rfZ4J4wzHUuB9LngYCmsREWk5QjqsbfuEtcUVRWSJ90EoMZ58TIwGmImISMsQ2mHt3hvWVk8cqSXeyTsSXOpZi4hIyxGQZ4O3FDbP3kee2p3xRDu9vem0qjw86RmBKktERKSWkA5ru3tvWNucScSXJwFgvesvuI/uE6iyREREagntsN6nZ51clkz0nqeXtbnyggBWJSIiUluIX7PeG9bR1d7HixbElGCzhXSziIhICxPSqRTmDj/gvcLosgBUIiIiUr+QDut9r1nX2NHRGYBKRERE6hfSYR3u8vasV2ZuAuDbPmu5+p3xAaxIRETkQCE7wKyqrAq7x44HDz2nHcfKn7dz/Q2XBLosERGRA4RsWDtyvZN2VNurGXxce/of1z7AFYmIiNQtZE+DlxU4AHDZdI1aRERatpANa0e+N6yd9uoAVyIiInJwIRvW5TU9a6t61iIi0rKFbFhXlZYDOg0uIiItX+iGdUkFAG6FtYiItHAhG9bVZVWAToOLiEjLF7Jh7dwT1m6bK8CViIiIHFzIhrWrwjsK3K2etYiItHAhHNbekPZY3QGuRERE5OBCNqzd1d7T326rToOLiEjLFrJh7anyhrTHpp61iIi0bH59NviGDRv4+OOPiYiIYMmSJdx8883079/fnyX4GKfH+7dOg4uISAvnt7B2u91MmjSJF198EavVyrhx47DbAzePiKfaG9IeqydgNYiIiBwKv6XlsmXLMMbwxhtvUFlZSWJiIhdddJG/dn8glwHA2EzgahARETkEfgvr7du38+uvv/LMM88QFxfHnXfeSVhYGOedd16dyyclRWO32w5rX2lpcQ0uY3VbALCEHdryrZ3aoHHUXo2j9mo8tVnjtPb28ltYx8TE0LVrV+LivA06ePBgFi9eXG9YFxaWH9Z+0tLiyM0tbXA5j9Pbo/ZYzSEt35odapuJl9qrcdRejac2a5zW1F71/dLht9HgAwYMoKioCLfbe614+/btdO7c2V+7P4BlT8/av0PsREREGs9vUZWYmMidd97J448/TlJSEgUFBfzxj3/01+4PYPHsCWubJWA1iIiIHAq/9itPO+00TjvtNH/usl4W3zVrhbWIiLRsIftQFKvHO3jNGnZ4g9hERET8JXTD2r0nrCMU1iIi0rKFbljX9KzDNcJMRERathAOa29I26PCAlyJiIjIwYVsWNv2hLVNYS0iIi1c6Ia12xvWYdERAa5ERETk4EI3rD3eHnV4bGSAKxERETm4kA1ru3tPWMcorEVEpGUL4bAOB9SzFhGRli8kw7qipIIkRyoAPU7uHeBqREREDi4kw3rpjEWEecLIjdtJSuc2gS5HRETkoELqiSBvnPYUdkcY9n6RHM0QCuN3BLokERGRBoVUWB+zdCQAq6p+AqA8tiSQ5YiIiBySBsN65syZDW4kKSmJESNGNEU9fnHU1sEAmNQAFyIiInIIGgzrF198kUGDBh10maKioqAK6xoJPXW9WkREWr4Gw/q4447j4YcfPugyjz/+eJMV5E/dTx8Y6BJEREQa1OBo8E2bNlFdXX3QZf70pz81WUHNqdq29zgcEQ56jtBtWyIi0vI12LN2Op088MADxMbGMn78ePr06XPAMjExMc1SXFOzGIvv67yErdjsmstaRERavgbD+vHHH6dz587k5eUxY8YM/vWvfzFkyBDGjh1LfHy8P2psMlaz90RCSVxuACsRERE5dA2GdefOnQFITU3l97//PQA//fQT119/PZmZmTz99NPNWmBTshlvT/rnIXMZeOPIAFcjIiJyaBp1n3VxcTEffvgh77//Pps3b6Zdu3bNVVeTc1Y5fV9P/OTOAFYiIiLSOA2G9QsvvMDAgQN5//33+eqrr+jWrRsXX3wxY8eOJS4uzh81NglXlQsAt8Ud4EpEREQap8GwnjJlCnFxcZx99tm888479O4dnCOoqyuqAPBYPAGuREREpHEaDOuRI0fy97//nfDwcH/U02w81d6etceqsBYRkeDS4H3WkyZNCvqgBqiu9F6zNupZi4hIkGkwrGuuS+fn53P33Xfzpz/9ifLych544AGKi4ubvcCm4q7pWSusRUQkyBzyfNZPPvkkQ4YMITw8nOjoaC655BL+9re/NWdtTcq1ZzS4x2ICXImIiEjjHPKtW+np6Vx44YVkZ2cDcPTRRzd6NPhFF11EREQEAFarlddff71R6x8J156etdFocBERCTKHHNZFRUUAWCzeR3aWl5eTk5PTqJ2ddNJJ3HzzzY1ap6m4qrwhrZ61iIgEm0MO6xNOOIGzzz6b6upqrrvuOrKzs/nLX/7SqJ2tWbOGadOmUVVVRb9+/cjKympsvYfN7fKGtQaYiYhIsLEYYw65q7l+/XoWLlwIeMO7a9eujdrZb7/9Rv/+/XG73Vx++eXccccdHHvssXUu63K5sTfhRBs/zliM47xyCmLyOM9xQZNtV0REpLk12LN+6623uPzyywHo1q0b3bp18332/vvvc+GFFx7yzvr37w+AzWZjyJAhLFq0qN6wLiwsP+Tt7istLY7c3NID3i/KL8OOBWPx1Pl5KKuvzaRuaq/GUXs1ntqscVpTe6Wl1T0WrMGwfv311/n555/r/Gz58uWHHNbr16/n559/9i2/efNmRo0adUjrNgV3tRM74RhdsxYRkSDTYFgnJSXx22+/cfbZZ2Oz1T4tvWXLlkPeUWxsLN988w27d+/G4XCQkZHBOeec0/iKD5PH5b1WrfusRUQk2DQY1u+++y7ff/89H374IUOHDmXcuHG+0O7bt+8h7yg9PZ2pU6cefqVHyFXtBCI1wExERILOIT0UZfjw4UyePJm2bdty//338/777+Nyufw6mvtIedwaDS4iIsHpkJ9gBt4R4HfccQczZ87kmmuuaa6amoW7uiasdc1aRESCyyGH9e7du3n00Uc5/fTTycjI4IEHHmjOupqcrlmLiEiwavCa9a5du5g2bRoffPABp512GtOnT/fdX71p0yY6d+7c3DU2Cd9DUVDPWkREgkuDYT1q1CgyMzO599576dy5M/n5+eTn52OM4Y033mDKlCn+qPOIeZx7ng2u+axFRCTINBjWgwYNYvz48QBs27at1mcOh6N5qmoGZs9pcIPCWkREgkuDYX3DDTdwwgkn1PlZly5dmryg5qJng4uISLBqcIBZfUENMHDgwKaspVkZd80AM12zFhGR4NJgWH///fcNbqRmco+WzF1zGlxhLSIiQabBsP7iiy8a3MjcuXObpJjmVNOz1mlwEREJNg1es37nnXd49913ATDGYLFYfJ/VvB4wYEDzVdhEPHuuWaNbt0REJMgc0q1bNc/0rqqqIiIiotmLag57r1mrZy0iIsGlwdPg+96udemll9b67LXXXmvygppLTVija9YiIhJkGgxrY/aGm8dTu1c6a9aspq+omRiPrlmLiEhwajCs971Gve/XUDvIWzqP21urHjcqIiLBpsFr1ps3b+a+++6jX79+VFRU4HQ6CQsLAw4M75Zs72hwhbWIiASXBsN62rRprFixgqVLlxIWFsbgwYNp27YtPXv2ZNeuXf6osUkorEVEJFg1GNZDhgxhyJAhvtfV1dWsWrWK5cuXk5CQ0KzFNSnPntPgumYtIiJBpsGw3l94eDj9+/enf//+zVFPs/F41KMWEZHg1OAAs1ZDo8FFRCRIhUxYmz2jwXWftYiIBJvQCWuPbt0SEZHgFHphHTx3m4mIiAAhFNY1o8F1GlxERIJN6IT1nozWfdYiIhJsQias954GV1iLiEhwCZmw9p0G1wAzEREJMiEU1t6/1LMWEZFg49ewrqys5JxzzmHy5Mn+3K1XzQxhGg0uIiJBxq9h/eyzz3L00Uf7c5c+RmEtIiJBym9hPXPmTI455hjat2/vr13WVvOUUZ0GFxGRINPoiTwOx7p169iwYQO33347q1evPqR1kpKisdtth7W/tLS4A96z1sy9ba3781CnNmkctVfjqL0aT23WOK29vfwS1l988QXh4eFMmzaNn376CafTyWuvvcZVV11V7zqFheWHta+0tDhyc0sPeN/j2vu40bo+D2X1tZnUTe3VOGqvxlObNU5raq/6funwS1jfcMMNvq+rqqooLy8/aFA3K12zFhGRIOPXAWaff/45S5Ys4ddff+Wjjz7y5673uXXLv7sVERE5Un7pWdc444wzOOOMM/y5y718A8wCs3sREZHDFToPRamhsBYRkSATMmHtu2NLYS0iIkEmZMLa1JwGD5kjFhGR1iJkostSM7JMPWsREQkyIRPWPgprEREJMqET1mbvE8xERESCSchE194BZupai4hIcAmZsKZm0q3QOWIREWklQia69g4wU89aRESCS8iEdU3POoSOWEREWonQia49PWuLVT1rEREJLiET1joNLiIiwSp0whr1rEVEJDiFTFjrPmsREQlWIRNdFt8165A5ZBERaSVCJrl816xtOg0uIiLBJWTCuuah4BYNMBMRkSATMmHtOw2unrWIiASZ0AtrXbMWEZEgEzLJpZ61iIgEq5AJa981a/WsRUQkyIRMclmM91DVsxYRkWATQmFdcxo8ZA5ZRERaiZBJLl2zFhGRYBU6Yb3nUK02W4ArERERaZzQCes9PWurToOLiEiQCZnk8oW1PWQOWUREWgm7v3bk8Xi4/vrr6d+/P06nk5ycHB5//HEiIyP9sv+a0eDo1i0REQkyfk2ugQMHctNNN3HbbbdRUVHBnDlz/LbvmvmsbXZdsxYRkeDit7C2Wq3ceOONALhcLnbt2kWXLl38tfu991nrNLiIiAQZv50Gr/Htt9/y2muvkZWVRb9+/fy235pr1upZi4hIsLEYY0wgdnzXXXcxYMAALr/88jo/d7nc2JswWN9IfYUO+d0ofjCXcx+6sMm2KyIi0tz81rNet24dW7duJSsrC4D27duzdevWepcvLCw/rP2kpcWRm1t6wPvWPafBq5yeOj8PZfW1mdRN7dU4aq/GU5s1Tmtqr7S0uDrf91tYh4eH87///Y8VK1bgcrlYv349f/nLX/y1e981a926JSIiwcZvYd2xY0emTp3qr90doCas7eF+v0wvIiJyREKmm+m7dStMA8xERCS4hExY11yzRo8bFRGRIBMyyVVz65Y9IizAlYiIiDROCIW19/S37rMWEZFgE0JhXdOz1gAzEREJLiET1lbfrVvqWYuISHAJmbD2PW40IjzAlYiIiDROyIS1dc81a3tYyByyiIi0EiGTXLpmLSIiwSpkwrrmmrUtXNesRUQkuIRMWPseN6pr1iIiEmRCJqytnj1hHabT4CIiElxCJ6xretZReoKZiIgEl5DpZvrCOkxhLSLSnFasyOaf/3wOl8vFscceR1VVFQATJ/6OuLi652sGeO+9t7noosv8VWZQCZmedc1o8PBoXbMWEWlORx/dl0GDBtO3b3+uueYP3HjjLQwaNJg//el6XC5Xveu9995//VhlcAmJnrXb5cZWc5+1bt0SkRBy2WVRfPll0/6/N2qUi7ffrmjUOiecMJx///tfLFr0AzNn/o8BAwaxZctmTjttNMceexxfffUFDkcpr7zyEp06dWbYsJN48MF7D1guVIVEcnncHu/feDSRh4hIgGRkZLJ9+zYuuugyjj32OEpKirn99ps59tjjOPXU03jhhee45po/AFBZWVnncqEqJMK6urwaAGMxAa5ERMS/GtsDbk47d+5g9Oiz+OWXn1i+fBk2m52iosI6lzXGHNJyoSIkrlm7qp0AuK3uAFciIhKaFi9eSHV1NVu35pCXl8tVV13LJZdcXmsZq9WKMYa1a9cwe/bMepcLRSHRs3ZVqGctIuIvq1atYOnSX3A6nbz22stUVVXhcrl47rkXKCwsZN68r3j++X8QHx+Pw+Fg3ryvyMo6lWHDTmTq1GcBGDt2fL3LhSKLMaZFJlhubulhrZeWFnfAurvW7iBv+HYqwioYsu3EpiivVamrzaR+aq/GUXs1ntqscVpTe6Wl1X1rW2icBq+q6Vl7AlyJiIhI44VEWLurvdeqPQprEREJQiER1s5K7wAz9axFRCQYhURYu5177rO2KqxFRCT4hERY19y6ZWiRY+lEREQOKiTC2uPUNWsREQleIRHWripdsxYRkeDlt7DesmULt99+Oy+//DKPPvooU6dO9deucVV7Z3lRz1pEpPVZs2YNt9xyPZ98Mvuwt/Hee2/7vp4z51NGjx55WNvZsWM7l112PjfddB033XQdU6b8/bBr2pffnmBWVFTEmWeeyahRowA488wzycrKom/fvs2+b4/LexpcTzATkVATf9kFRHw5p0m3WTXqdEre/l+TbvNI9OzZkwEDBh3RNt5777++ubRPP30M06b987C3NWHCVZx55jlHVM/+/BbW/fv3r/Xa4/EQFRXll3179vSsdRpcRKT5ffzxh7z00vNccsnlrF+/lqKiYs488xwWL/6BrVtzePLJvzNnzmds3Lie5OQUdu7cwZ133svGjet5+unJREVFcf/9D3HXXbcxduw4xo27oM79vPHGa2zatIH+/fuwadNGMjPbArBhw3reeut1unXrzubNm7jiiqux2ez84x9/w+l00rdvf3JyNtO5czcmTryKWbM+8E3P2adPP44/fhgA77zzJqtXr6KszMETTzyNzWZj5szpzJ8/74Ba+vTp65sx7Pvv51NUVIjD4eC000bTpUvXI29UEwBz5swxjzzyyEGXcTpdTbe/f3xi5jLX/DfxP022TRERqd+ECRPMggULjDHG3HDDDea9994zxhjzyCOPmM8++8x89dVXxu12+96bO3euMcaYvLw8c8YZZ5j//Oc/5sMPP6x3+6tXrzZjxozxvb7jjjvM9OnTjTHGXHTRReann34yxhizcOFCc+ONNxpjjJk+fbq54447fOuMGTPGrF692hhjzMiRI2ttf+TIkWbjxo3GGGOuu+46s2zZskM67rKyMrNmzRpjjDG5ublm5MiRpri4+JDWPRi/T+SxcOFCFi1axH333XfQ5QoLyw9r+3U9I7aksIwUovBYPK3m+bFNqTU9V9cf1F6No/ZqvNbQZtXVLmJiksnNLSU8PIr4+FRyc0ux2yPZuTOfNm3Sefjhx0hISGTFitV06NB1zzGHM3HiNbzwwnO8996setvh55+zychoS25uKWlpcaSkpFNaWklubimrVq1izpyvmTfve6qrq7DZwsjNLaW0tJKUlHTfNtPT2/Lz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\n",
|
||
"text/plain": [
|
||
"<Figure size 576x396 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_59_0.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" N Z A Element Ebinding Eapprox\n",
|
||
"A \n",
|
||
"4 0 1 3 4 Li 1.153760 1.153760\n",
|
||
"5 2 3 2 5 He 5.512132 5.512132\n",
|
||
"6 7 3 3 6 Li 5.332331 5.332331\n",
|
||
"7 12 4 3 7 Li 5.606439 5.606439\n",
|
||
"8 17 4 4 8 Be 7.062435 7.062435\n",
|
||
"... ... ... ... ... ... ...\n",
|
||
"264 3297 156 108 264 Hs 7.298375 7.298375\n",
|
||
"265 3303 157 108 265 Hs 7.296247 7.296247\n",
|
||
"266 3310 158 108 266 Hs 7.298273 7.298273\n",
|
||
"269 3331 159 110 269 Ds 7.250154 7.250154\n",
|
||
"270 3337 160 110 270 Ds 7.253775 7.253775\n",
|
||
"\n",
|
||
"[264 rows x 6 columns]\n",
|
||
"0.007012403613997257\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"\n",
|
||
"#Decision Tree Regression\n",
|
||
"from sklearn.tree import DecisionTreeRegressor\n",
|
||
"regr_1=DecisionTreeRegressor(max_depth=5)\n",
|
||
"regr_2=DecisionTreeRegressor(max_depth=7)\n",
|
||
"regr_3=DecisionTreeRegressor(max_depth=9)\n",
|
||
"regr_1.fit(X, Energies)\n",
|
||
"regr_2.fit(X, Energies)\n",
|
||
"regr_3.fit(X, Energies)\n",
|
||
"\n",
|
||
"\n",
|
||
"y_1 = regr_1.predict(X)\n",
|
||
"y_2 = regr_2.predict(X)\n",
|
||
"y_3=regr_3.predict(X)\n",
|
||
"Masses['Eapprox'] = y_3\n",
|
||
"# Plot the results\n",
|
||
"plt.figure()\n",
|
||
"plt.plot(A, Energies, color=\"blue\", label=\"Data\", linewidth=2)\n",
|
||
"plt.plot(A, y_1, color=\"red\", label=\"max_depth=5\", linewidth=2)\n",
|
||
"plt.plot(A, y_2, color=\"green\", label=\"max_depth=7\", linewidth=2)\n",
|
||
"plt.plot(A, y_3, color=\"m\", label=\"max_depth=9\", linewidth=2)\n",
|
||
"\n",
|
||
"plt.xlabel(\"$A$\")\n",
|
||
"plt.ylabel(\"$E$[MeV]\")\n",
|
||
"plt.title(\"Decision Tree Regression\")\n",
|
||
"plt.legend()\n",
|
||
"save_fig(\"Masses2016Trees\")\n",
|
||
"plt.show()\n",
|
||
"print(Masses)\n",
|
||
"print(np.mean( (Energies-y_1)**2))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"With a deeper and deeper tree level, we can almost reproduce every\n",
|
||
"single data point by increasing the max depth of the tree.\n",
|
||
"We can actually decide to make a decision tree which fits every single point.\n",
|
||
"As we will\n",
|
||
"see later, this has the benefit that we can really train a model which\n",
|
||
"traverses every single data point. However, the price we pay is that\n",
|
||
"we will easily overfit. That is, if we apply our model to unseen data,\n",
|
||
"we will most likely fail miserably in our attempt at making\n",
|
||
"predictions. As an exercise, try to make the tree level larger by adjusting the maximum depth variable. When printing out the predicition, you will note that the binding energy of every nucleus is accurately reproduced.\n",
|
||
"\n",
|
||
"\n",
|
||
"The **seaborn** package allows us to visualize data in an efficient way. Note that we use **scikit-learn**'s multi-layer perceptron (or feed forward neural network) \n",
|
||
"functionality."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJjCAYAAADQ22+yAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABycUlEQVR4nO3deZiN9f/H8ec5Z1Z7mBlr1tKGChWVvRi7yo+UhELZIjIIibFOISTJFpWlMoPIVshWqC/aENmyzNga2yxn+f1xM0zGMWfmnjMz5vW4rnNdc+5zn3N/3vdyzvt+fz73PRaXy+VCRERERExjzewGiIiIiNxulGCJiIiImEwJloiIiIjJlGCJiIiImEwJloiIiIjJlGCJiIiImMwnsxsgkpONGDGCbdu2AbB//36KFy9OQEAAAAsWLEj6+1ZeffVV+vfvT/ny5W86z8SJEylVqhQtWrRId7uv6tGjBz/99BPr1q0jMDDQtM8VEcnuLLoPlkjWULduXSZOnEjFihUzuympcvLkSZo3b07lypWpXbs2zz//fGY3SUQky1AXoUgWNWnSJDp16kTTpk3p27cvp06d4vXXX6d169bUrVuXdu3acfr0acBIznbv3s2PP/5ImzZt6NevHy1atKBRo0Zs3boVgLCwMGbMmAFAxYoVmTRpEm3atKFu3brMnj0bAIfDwahRo3jqqad45plneOedd2jXrl2K7Vu4cCHVq1enZcuWfPrpp1x/rrZz505atWpFkyZNaNmyJVu2bHE7vUKFCpw5cybp/Vef//jjjzRr1ow2bdrQrFkzEhISGDFiBK1ataJRo0aEhoayY8cOAC5evMiAAQNo0KABjRo14v333+fSpUtUq1aNv//+O+mzO3TowJo1a8zYRCIiN6UESyQL++eff1i8eDERERF88803PPjggyxYsIC1a9cSEBBAVFTUDe/ZtWsXHTt2JDIykueee47JkyffME9CQgJ33HEH8+fP54MPPuC9994jPj6eRYsW8dtvv7Fs2TLmz5/PkSNHUmyX3W5n4cKFNGvWjLp163L69Gk2bNgAQGJiIt26daNbt24sW7aM4cOHM3LkSBISElKc7nQ63a6Dffv28d5777FkyRJ+++03oqOjWbBgAcuXL6dly5ZMnz4dgA8++ID4+HiWL19OZGQkP//8M7t376ZFixYsWrQIgMOHD/P3339Tp04dj7aDiIinNAZLJAt78MEH8fExDtP27duzfft2Zs2axcGDB9m3bx+VK1e+4T3FihXj3nvvBeC+++5j8eLFKX52vXr1ALj//vtJSEjg0qVLrF+/nubNm+Pv7w9A69atmTt37g3vXbt2LU6nkyeffBIfHx8aNWrEnDlzqFWrFnv37sVqtVK7dm0AHnjgAZYuXcpvv/2W4vRbKVq0KMWLFwfgoYceIn/+/EnJ348//kju3LkB2Lx5MwMGDMBms2Gz2Zg3bx4AwcHBvPjii/Tu3ZsFCxbw3HPPYbPZbrlcEZH0UIIlkoXlypUr6e9x48axa9cunn32WR599FHsdjspDaG8fmC8xWJJcR4gKYmyWCwAuFyupGTuKqs15SL3F198QVxcHE8//TRgVMRiYmLYt28fNpst6TOv2rt3702nly1bNtm0hISEZM+vXwfr1q0jPDycDh06UK9ePcqWLcuSJUsA8PHxSfb5x48fJyAggDJlylChQgXWrl3L0qVLk6pZIiIZSV2EItnExo0bad++PS1atKBQoUJs3rwZh8Nh6jJq1arFkiVLSEhIwG63p1j9+vvvv/npp59YvHgx3333Hd999x0bN26katWqzJkzh7Jly2KxWNi0aRMAv/32G+3bt7/pdKfTScGCBdm9ezcAq1evvmn7Nm3aRJ06dWjbti0VK1ZkzZo1SeugevXqLF68GKfTSUJCAj179ky6QrNt27aMHTuWypUrExISYuo6ExFJiSpYItlEt27dGDt2LB9++CE2m42HH36Yw4cPm7qMZ555hr///psWLVqQK1cuSpQoccPtF7744gvq16/PnXfemWx69+7d6dKlC3369GHSpEmMHDmSsWPH4uvry6RJk/Dz87vp9Lfffpt3332XfPnyUaNGDYKCglJsX5s2bejbty9NmzbFZrNRtWpVVq1ahdPppHv37oSHh9O8eXMcDgeNGjVKqrDVqVOHt99+mzZt2pi6vkREbka3aRCRJBs3buT06dM0b94cMO7T5e/vT79+/TK5Zenz888/M3jwYJYtW3ZDN6WISEZQgiUiSU6ePElYWBinT5/G4XBwzz338M4775A3b97Mblqa9e/fn59++okxY8bwyCOPZHZzRCSHUIIlIiIi2d7SpUuZOnUqiYmJvPzyy7zwwguZ2h6NwRIREZFs7eTJk4wfP56vv/4aPz8/2rRp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TKYKloiIiLjlUD3GY1pjIiIiIiZTBUtERETc0m0aPKc1JiIiImIyVbBERETELf2zZ89pjYmIiIiYTBUsERERccvh0n2wPKUKloiIiIjJVMESERERt3QfLM9pjYmIiIiYTBUsERERccup+2B5TGtMRERExGSqYImIiIhbGoPlOa0xEREREZMpwRIRERExmboIRURExC3daNRzqmCJiIiImEwVLBEREXFL/+zZc9k+wSpgzfYhpIuVnF22deLK7CZkKqsl58YfkMP3fR37OXffl+whZ2cnIiIicksO3WjUY1pjIiIiIiZTBUtERETccubwLum0UAVLRERExGSqYImIiIhb2XUMVmRkJBERERQqVAiA2rVr07t3b44dO0a/fv04ffo0ZcqUISIigty5cxMbG0vfvn05cuQIBQsWZMKECQQFBaVp2dlzjYmIiIjcwu7duwkLCyMqKoqoqCh69+4NwLBhw2jbti3ffvstDzzwAB9++CEAEyZMoGrVqqxYsYJWrVoRHh6e5mUrwRIRERG3HFi99oiNjeXo0aM3PGJjYz1u9+7du4mMjKRZs2b07duXf//9l8TERLZt20aDBg0AeOaZZ/j2228BWLduHU2bNgWgSZMmbNiwgcTExDStMyVYIiIikmXMmTOHevXq3fCYM2eOx58VFBREjx49iIqKomjRorz77rucPXuWPHny4OPjkzTPyZMnAYiOjk7qEvTx8SFPnjycOXMmTXFoDJaIiIi45fTi/yJs3749LVu2vGF6vnz5bvqeFStWMGrUqGTTypYty+zZs5Oev/LKK9SvX5+33nrrhvdbLDePz2pNWy1KCZaIiIhkGfny5XObTKUkNDSU0NDQZNPOnz/P7NmzefnllwFwuVz4+PhQsGBBLly4gMPhwGazERMTQ3BwMADBwcGcOnWKIkWKYLfbuXDhAgUKFEhTHOoiFBEREbe8OQbLLLly5eKTTz5h586dAMybN4+nnnoKX19fqlatyvLlywHjSsOaNWsCUKtWLSIjIwFYvnw5VatWxdfXN03Lt7hcrmz9D53OHSuZ2U3IVPp/ZNl69003Rw6O35bD930d+zl33wcoUOyIV5c38c/6XltWr3vWmPZZ27dvJzw8nLi4OEqXLs3YsWPJmzcv//zzD2FhYZw+fZqiRYvy/vvvkz9/fs6dO0dYWBhHjhwhb968REREUKJE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euK322Hoe8aXk9MJrZpAh9aZG4+nUhP/7j+g73BY+Xny98aeh3feh31/gwVjkH+PbHSbitTE/tli+PxrY4xd/rzw9htwV5nkn3Nvrex3FSGk/9i/avEKYxxSdrqKEHL2vv9fZh0LGcHbVxGWnfC+15Z14I2bXLaazdwywTpy5Ah//vkne/bsYc+ePfz5558cO3aMEiVKsHLlylQvaNu2bVSrVi3p+YEDBzhy5Ai1atVKe+vJuARLREQkq/J6gjXeiwlW79sjwbrlGKySJUtSsmRJnnrqWh/PpUuX2LvXs417fXIFULZsWcqWzaYjQUVERETcSNO1Xbly5eLBBx80uSkiIiKSFd1O96fylmzaMy4iIiKSdWWjuxOJiIhIplAFy2OqYImIiIiYTAmWiIiIiMnURSgiIiLuqYvQY6pgiYiIiJhMFSwRERFxS7dp8JwqWCIiIiImUwVLRERE3HNZMrsF2Y4qWCIiIiImUwVLRERE3NMYLI+pgiUiIiJiMlWwRERExC1dReg5VbBERERETKYKloiIiLinCpbHVMESERERMZkqWCIiIuKWxmB5ThUsEREREZOpgiUiIiLuqYLlMVWwREREREymBEtERETEZOoiFBEREffURegxVbBERERETKYKloiIiLil2zR4ThUsEREREZMpwRIRERExmRIsEREREZNpDJaIiIi4pzFYHlMFS0RERMRkqmCJiIiIW7qK0HOqYImIiIiYTBUsERERcU8VLI+pgiUiIiJiMlWwRERExD1VsDymCpaIiIiIyVTBEhEREbd0FaHnVMESERERMZkSLBERERGTqYtQRERE3FMXocdUwRIRERExmSpYIiIi4pYGuXtOFSwRERERk6mCJSIiIu6pguUxVbBERERETKYKloiIiLinCpbHVMESERERMZkqWCIiIuKWriL0nCpYIiIiIiZTBUtERETcUwXLY6pgiYiIiJhMFSwRERFxTxUsj6mCJSIiImIyVbBERETELV1F6DlVsERERERMpgRLRERExGTqIhQRERH31EXoMVWwREREREymCpaIiIi4pUHunlMFS0RERMRkSrBERETEPZcXHybasWMHzz77LM2bN6d9+/b8888/AMTGxtK5c2dCQ0N54YUXiImJASAhIYF+/foRGhpKy5Yt2b9/vxG+y8WYMWNo2LAhjRo1YseOHbdcthIsERER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txnsDmOsztu94Lr7+2V56T32Z3xhVDFHvJV5MaRHTt/+10vNurjqn+PQrMPtexXhgz28dxXh/ybdHlcRev02DYsWLWLFihXMnDnTlM/LqARLREQkq1KClfV5vXe8VatWtGrVytuLFRERkbS6jcZGeYvugyUiIiJismx6fYeIiIh4i0UVLI+pgiUiIiJiMlWwRERExD1VsDymCpaIiIiIyVTBEhEREbc0BstzqmCJiIiImEwVLBEREXFPFSyPqYIlIiIiYjJVsERERMQ9VbA8pgqWiIiIiMmUYImIiIiYTF2EIiIi4pZu0+A5VbBERERETKYKloiIiLinCpbHVMESERERMZkqWCIiIuKWxaUSlqdUwRIRERExmSpYIiIi4p4KWB5TBUtERETEZKpgiYiIiFu6D5bnVMESERERMZkqWCIiIuKeKlgeUwVLRERExGSqYImIiIhbGoPlOVWwREREREymCpaIiIi4pwqWx1TBEhERETGZEiwRERERk6mLUERERNzSIHfPqYIlIiIiYjJVsERERMQ9VbA8pgRLRESyHSfOzG5CplL3U9anBEtERETc0hgszykJFhERETGZKlgiIiLinkslLE+pgiUiIiJiMlWwRERExC2NwfKcKlgiIiIiJlMFS0RERNxTBctjqmCJiIiImEwVLBEREXHLkrPv65omqmCJiIiImEwVLBEREXFPY7A8pgqWiIiIiMmUYImIiIiYTF2EIiIi4pZuNOo5VbBERERETKYKloiIiLinf/bsMVWwREREREymCpaIiIi4pTFYnlMFS0RERMRkqmCJiIiIe6pgeUwVLBERERGTqYIlIiIibmkMludUwRIRERExmSpYIiIi4p7ug+UxVbBERERETKYKloiIiLilMVieUwVLRERExGSqYImIiIh7qmB5TBUsEREREZMpwRIRERExmboIRURExC0NcvecKlgiIiIiJlMFS0RERNxzqoTlKVWwREREREyWIytY67bA+I8hIREqlIUR/SFP7tTP53DAmCmwcZvxd4fW0Ka58Z6DR+Ht0XAuFnIFwuiBULaU8dq2nRDxEcTHG58zagCULGa89vli+PIb47X7K8CIt8DP7/aKf8ESmPsl2GxQoqgR4x0F4PwFeKIllL3z2rLDusGjD2dM/DeT3vVyvR5vQ3BhGPwGxJ6H9m8kf33vAejXFV5unVHReM6s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xYoVboc55bj7YImIiEjWFRsby9GjR294XL3VkyeWL19O+fLlSUxM5OTJk+TLZ4xnWbduHU2bNgWgSZMmbNiwgcTERNatW0ezZsadwKtVq8bZs2c5duwY69evp1GjRlitVsqUKUOxYsX45Zdf3C47x93JXURERDzkxQrWnDlzmDx58g3Tu3fvTo8et76o5nq+vr7s2bOHDh064OPjQ58+xm02oqOjCQoyBs76+PiQJ08ezpw5k2w6QFBQECdOnCA6Oprg4OAbprujBEtERESyjPbt29OyZcsbpl+tPqVkxYoVjBo1Ktm0smXLMnv2bCpUqMDmzZuZP38+vXv3Zv78+Sl+hvUmN3S0Wq0p3ivwZvNfpQRLRERE3HN6r4KVL18+t8lUSkJDQwkNDU02LT4+njVr1lC/fn0AmjVrxpgxxk2Sg4ODOXXqFEWKFMFut3PhwgUKFChAcHAwMTExlCpVCoCYmBiCg4MJCQkhJubaVbhXp7ujMVgiIiJy2/Hx8WHYsGH8+uuvgFHlevhh4yaTtWrVIjIyEjDGaVWtWhVfX19q1apFVFQUYFyB6O/vT7FixahZsyZLly7F4XBw6NAhDh48SMWKFd0vP+NCExERkduBy5X9boljs9kYP348Q4YMweFwEBISQni48W+/evXqRVhYGI0bNyZv3rxERBj3QWvXrh1DhgyhcePG+Pn5MXbsWAAaNmzIrl27kgbAh4eHExAQ4Hb5XrsPVkbRfbByNt0HS/fByql0HyzdB8ubGhb23v727amPvbasjKQKloiIiLjnxTFYtwuNwRIRERExmSpYIiIi4l72Hk2UKVTBEhERETGZEiwRERERk6mLUERERNxz5uwrttNCFSwRERERk6mCJSIiIu5pkLvHVMESERERMZkqWCIiIuKWS2OwPKYKloiIiIjJVMESERER9zQGy2OqYImIiIiYTBUsERERcU//7NljqmCJiIiImEwVLBEREXHPpasIPaUKloiIiIjJVMESERERt1wag+UxVbBERERETKYKloiIiLinMVgeUwVLRERExGRKsERERERMpi5CERERcUuD3D2nCpaIiIiIyVTBEhEREfc0yN1jqmCJiIiImMzicrnUsSoiIiJiIlWwREREREymBEtERETEZEqwREREREymBEtERETEZEqwREREREymBEtERETEZEqwREREREymBEtERETEZEqwREREREymBEtERETEZEqwREREREymBEtERETEZEqwREREREymBCsdli5dSqNGjXjqqaf47LPPMrs5XnfhwgWaNGnC0aNHM7spXjd58mQaN25M48aNGTt2bGY3x+smTpxIo0aNaNy4MbNmzcrs5mSKMWPGEBYWltnN8LqXXnqJxo0b07x5c5o3b87OnTszu0le9d133/HMM8/QsGFDRowYkdnNkSzMJ7MbkF2dPHmS8ePH8/XXX+Pn50ebNm149NFHKV++fGY3zSt27tzJ22+/zcGDBzO7KV63efNmNm7cyOLFi7FYLLzyyiusXr2ap556KrOb5hU//fQTW7duZcmSJdjtdho1akStWrUoW7ZsZjfNa7Zs2cLixYupXbt2ZjfFq1wuFwcOHGDdunX4+OS8n48jR44wdOhQFi1aRKFChWjfvj3r16+nVq1amd00yYJUwUqjzZs389hjj1GgQAFy5cpFgwYN+PbbbzO7WV6zcOFChg4dSnBwcGY3xeuCgoIICwvDz88PX19fypUrx7FjxzK7WV7zyCOP8Omnn+Lj48Pp06dxOBzkypUrs5vlNefOnWP8+PF07do1s5vidQcOHMBisfDqq6/SrFkz5s2bl9lN8qrVq1fTqFEjihQpgq+vL+PHj6dy5cqZ3SzJonLeKYhJoqOjCQoKSnoeHBzMrl27MrFF3hUeHp7ZTcg0d911V9LfBw8eZPny5cyfPz8TW+R9vr6+fPDBB8ycOZOGDRsSEhKS2U3ymiFDhtC7d2+OHz+e2U3xutjYWKpXr84777xDXFwcL730EmXKlOHxxx/P7KZ5xaFDh/D19aVTp07ExMRQp04d3njjjcxulmRRqmClkcvlumGaxWLJhJZIZtm3bx8dO3akf//+lC5dOrOb43U9e/Zky5YtHD9+nIULF2Z2c7xi0aJFFC1alOrVq2d2UzLFQw89xNixY8mVKxcFCxbkueeeY/369ZndLK9xOBxs2bKFcePGsXDhQnbv3s3ixYszu1mSRSnBSqOQkBBOnTqV9Dw6OjpHdpflVDt27ODll1/mzTffpGXLlpndHK/av38/f/zxBwCBgYE8/fTT7NmzJ5Nb5R3Lly9n06ZNNG/enA8++IDvvvuOkSNHZnazvGb79u1s2bIl6bnL5cpRY7EKFy5M9erVKViwIAEBAdSrVy9H9VyIZ5RgpVGNGjXYsmULZ86c4fLly6xatYqaNWtmdrPEC44fP063bt2IiIigcePGmd0crzt69Chvv/02CQkJJCQksHbtWqpUqZLZzfKKWbNmsWzZMqKioujZsyd169Zl4MCBmd0srzl//jxjx44lPj6eCxcusHjx4hxzcQdAnTp12LhxI7GxsTgcDn744Qfuv//+zG6WZFE559TDZCEhIfTu3ZuXXnqJxMREnnvuOSpVqpTZzRIvmDFjBvHx8YwePTppWps2bXj++eczsVXeU6tWLXbu3EmLFi2w2Ww8/fTTOTLRzInq1KmTtO2dTidt27bloYceyuxmeU3lypV55ZVXaNu2LYmJiTz++OM8++yzmd0syaIsrpQGE4mIiIhImqmLUERERMRkSrBERERETKYES0RERMRkSrBERERETKYES0RERMRkSrBERERETKYES0RERMRkSrBExGOhoaHUrFmTffv2ZXZTRESyJCVYIuKxZcuWUbp0aVauXJnZTRERyZKUYImIx2w2G1WqVMkx/+RZRMRT+l+EIuKxuLg4vvnmG/SftkREUqYKloh4bPz48YSEhHDkyBEuXryY2c0REclylGCJiEd++eUXvv32WyZNmkTevHnZu3dvZjdJRCTLUYIlIqkWHx/PgAEDGDZsGAUKFOCee+7ROCwRkRQowRKRVJs4cSIPPfQQtWvXBuCee+7hzz//zNxGiYhkQUqwRCRVdu3axbfffsvAgQOTpt17772qYImIpMDi0mVAIiIiIqZSBUtERETEZEqwREREREymBEtERETEZEqwREREREymBEtERETEZEqwREREREymBEtERETEZP8PEtaWECqzn4YAAAAASUVORK5CYII=\n",
|
||
"text/plain": [
|
||
"<Figure size 720x720 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_61_8.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.neural_network import MLPRegressor\n",
|
||
"from sklearn.metrics import accuracy_score\n",
|
||
"import seaborn as sns\n",
|
||
"\n",
|
||
"X_train = X\n",
|
||
"Y_train = Energies\n",
|
||
"n_hidden_neurons = 100\n",
|
||
"epochs = 100\n",
|
||
"# store models for later use\n",
|
||
"eta_vals = np.logspace(-5, 1, 7)\n",
|
||
"lmbd_vals = np.logspace(-5, 1, 7)\n",
|
||
"# store the models for later use\n",
|
||
"DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n",
|
||
"train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n",
|
||
"sns.set()\n",
|
||
"for i, eta in enumerate(eta_vals):\n",
|
||
" for j, lmbd in enumerate(lmbd_vals):\n",
|
||
" dnn = MLPRegressor(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',\n",
|
||
" alpha=lmbd, learning_rate_init=eta, max_iter=epochs)\n",
|
||
" dnn.fit(X_train, Y_train)\n",
|
||
" DNN_scikit[i][j] = dnn\n",
|
||
" train_accuracy[i][j] = dnn.score(X_train, Y_train)\n",
|
||
"\n",
|
||
"fig, ax = plt.subplots(figsize = (10, 10))\n",
|
||
"sns.heatmap(train_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n",
|
||
"ax.set_title(\"Training Accuracy\")\n",
|
||
"ax.set_ylabel(\"$\\eta$\")\n",
|
||
"ax.set_xlabel(\"$\\lambda$\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Linear Regression, basic elements\n",
|
||
"\n",
|
||
"\n",
|
||
"[Video of Lecture](https://www.uio.no/studier/emner/matnat/fys/FYS-STK4155/h20/forelesningsvideoer/LectureAug27.mp4?vrtx=view-as-webpage).\n",
|
||
"\n",
|
||
"\n",
|
||
"Fitting a continuous function with linear parameterization in terms of the parameters $\\boldsymbol{\\beta}$.\n",
|
||
"* Method of choice for fitting a continuous function!\n",
|
||
"\n",
|
||
"* Gives an excellent introduction to central Machine Learning features with **understandable pedagogical** links to other methods like **Neural Networks**, **Support Vector Machines** etc\n",
|
||
"\n",
|
||
"* Analytical expression for the fitting parameters $\\boldsymbol{\\beta}$\n",
|
||
"\n",
|
||
"* Analytical expressions for statistical propertiers like mean values, variances, confidence intervals and more\n",
|
||
"\n",
|
||
"* Analytical relation with probabilistic interpretations \n",
|
||
"\n",
|
||
"* Easy to introduce basic concepts like bias-variance tradeoff, cross-validation, resampling and regularization techniques and many other ML topics\n",
|
||
"\n",
|
||
"* Easy to code! And links well with classification problems and logistic regression and neural networks\n",
|
||
"\n",
|
||
"* Allows for **easy** hands-on understanding of gradient descent methods\n",
|
||
"\n",
|
||
"* and many more features\n",
|
||
"\n",
|
||
"For more discussions of Ridge and Lasso regression, [Wessel van Wieringen's](https://arxiv.org/abs/1509.09169) article is highly recommended.\n",
|
||
"Similarly, [Mehta et al's article](https://arxiv.org/abs/1803.08823) is also recommended.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Regression modeling deals with the description of the sampling distribution of a given random variable $y$ and how it varies as function of another variable or a set of such variables $\\boldsymbol{x} =[x_0, x_1,\\dots, x_{n-1}]^T$. \n",
|
||
"The first variable is called the **dependent**, the **outcome** or the **response** variable while the set of variables $\\boldsymbol{x}$ is called the independent variable, or the predictor variable or the explanatory variable. \n",
|
||
"\n",
|
||
"A regression model aims at finding a likelihood function $p(\\boldsymbol{y}\\vert \\boldsymbol{x})$, that is the conditional distribution for $\\boldsymbol{y}$ with a given $\\boldsymbol{x}$. The estimation of $p(\\boldsymbol{y}\\vert \\boldsymbol{x})$ is made using a data set with \n",
|
||
"* $n$ cases $i = 0, 1, 2, \\dots, n-1$ \n",
|
||
"\n",
|
||
"* Response (target, dependent or outcome) variable $y_i$ with $i = 0, 1, 2, \\dots, n-1$ \n",
|
||
"\n",
|
||
"* $p$ so-called explanatory (independent or predictor) variables $\\boldsymbol{x}_i=[x_{i0}, x_{i1}, \\dots, x_{ip-1}]$ with $i = 0, 1, 2, \\dots, n-1$ and explanatory variables running from $0$ to $p-1$. See below for more explicit examples. \n",
|
||
"\n",
|
||
" The goal of the regression analysis is to extract/exploit relationship between $\\boldsymbol{y}$ and $\\boldsymbol{x}$ in or to infer causal dependencies, approximations to the likelihood functions, functional relationships and to make predictions, making fits and many other things.\n",
|
||
"\n",
|
||
"\n",
|
||
"Consider an experiment in which $p$ characteristics of $n$ samples are\n",
|
||
"measured. The data from this experiment, for various explanatory variables $p$ are normally represented by a matrix \n",
|
||
"$\\mathbf{X}$.\n",
|
||
"\n",
|
||
"The matrix $\\mathbf{X}$ is called the *design\n",
|
||
"matrix*. Additional information of the samples is available in the\n",
|
||
"form of $\\boldsymbol{y}$ (also as above). The variable $\\boldsymbol{y}$ is\n",
|
||
"generally referred to as the *response variable*. The aim of\n",
|
||
"regression analysis is to explain $\\boldsymbol{y}$ in terms of\n",
|
||
"$\\boldsymbol{X}$ through a functional relationship like $y_i =\n",
|
||
"f(\\mathbf{X}_{i,\\ast})$. When no prior knowledge on the form of\n",
|
||
"$f(\\cdot)$ is available, it is common to assume a linear relationship\n",
|
||
"between $\\boldsymbol{X}$ and $\\boldsymbol{y}$. This assumption gives rise to\n",
|
||
"the *linear regression model* where $\\boldsymbol{\\beta} = [\\beta_0, \\ldots,\n",
|
||
"\\beta_{p-1}]^{T}$ are the *regression parameters*. \n",
|
||
"\n",
|
||
"Linear regression gives us a set of analytical equations for the parameters $\\beta_j$.\n",
|
||
"\n",
|
||
"\n",
|
||
"In order to understand the relation among the predictors $p$, the set of data $n$ and the target (outcome, output etc) $\\boldsymbol{y}$,\n",
|
||
"consider the model we discussed for describing nuclear binding energies. \n",
|
||
"\n",
|
||
"There we assumed that we could parametrize the data using a polynomial approximation based on the liquid drop model.\n",
|
||
"Assuming"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(A) = a_0+a_1A+a_2A^{2/3}+a_3A^{-1/3}+a_4A^{-1},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we have five predictors, that is the intercept, the $A$ dependent term, the $A^{2/3}$ term and the $A^{-1/3}$ and $A^{-1}$ terms.\n",
|
||
"This gives $p=0,1,2,3,4$. Furthermore we have $n$ entries for each predictor. It means that our design matrix is a \n",
|
||
"$p\\times n$ matrix $\\boldsymbol{X}$.\n",
|
||
"\n",
|
||
"Here the predictors are based on a model we have made. A popular data set which is widely encountered in ML applications is the\n",
|
||
"so-called [credit card default data from Taiwan](https://www.sciencedirect.com/science/article/pii/S0957417407006719?via%3Dihub). The data set contains data on $n=30000$ credit card holders with predictors like gender, marital status, age, profession, education, etc. In total there are $24$ such predictors or attributes leading to a design matrix of dimensionality $24 \\times 30000$. This is however a classification problem and we will come back to it when we discuss Logistic Regression. \n",
|
||
"\n",
|
||
"\n",
|
||
"Before we proceed let us study a case from linear algebra where we aim at fitting a set of data $\\boldsymbol{y}=[y_0,y_1,\\dots,y_{n-1}]$. We could think of these data as a result of an experiment or a complicated numerical experiment. These data are functions of a series of variables $\\boldsymbol{x}=[x_0,x_1,\\dots,x_{n-1}]$, that is $y_i = y(x_i)$ with $i=0,1,2,\\dots,n-1$. The variables $x_i$ could represent physical quantities like time, temperature, position etc. We assume that $y(x)$ is a smooth function. \n",
|
||
"\n",
|
||
"Since obtaining these data points may not be trivial, we want to use these data to fit a function which can allow us to make predictions for values of $y$ which are not in the present set. The perhaps simplest approach is to assume we can parametrize our function in terms of a polynomial of degree $n-1$ with $n$ points, that is"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"y=y(x) \\rightarrow y(x_i)=\\tilde{y}_i+\\epsilon_i=\\sum_{j=0}^{n-1} \\beta_j x_i^j+\\epsilon_i,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\epsilon_i$ is the error in our approximation. \n",
|
||
"\n",
|
||
"\n",
|
||
"For every set of values $y_i,x_i$ we have thus the corresponding set of equations"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{align*}\n",
|
||
"y_0&=\\beta_0+\\beta_1x_0^1+\\beta_2x_0^2+\\dots+\\beta_{n-1}x_0^{n-1}+\\epsilon_0\\\\\n",
|
||
"y_1&=\\beta_0+\\beta_1x_1^1+\\beta_2x_1^2+\\dots+\\beta_{n-1}x_1^{n-1}+\\epsilon_1\\\\\n",
|
||
"y_2&=\\beta_0+\\beta_1x_2^1+\\beta_2x_2^2+\\dots+\\beta_{n-1}x_2^{n-1}+\\epsilon_2\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{n-1}&=\\beta_0+\\beta_1x_{n-1}^1+\\beta_2x_{n-1}^2+\\dots+\\beta_{n-1}x_{n-1}^{n-1}+\\epsilon_{n-1}.\\\\\n",
|
||
"\\end{align*}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Defining the vectors"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{y} = [y_0,y_1, y_2,\\dots, y_{n-1}]^T,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\beta} = [\\beta_0,\\beta_1, \\beta_2,\\dots, \\beta_{n-1}]^T,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\epsilon} = [\\epsilon_0,\\epsilon_1, \\epsilon_2,\\dots, \\epsilon_{n-1}]^T,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and the design matrix"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}=\n",
|
||
"\\begin{bmatrix} \n",
|
||
"1& x_{0}^1 &x_{0}^2& \\dots & \\dots &x_{0}^{n-1}\\\\\n",
|
||
"1& x_{1}^1 &x_{1}^2& \\dots & \\dots &x_{1}^{n-1}\\\\\n",
|
||
"1& x_{2}^1 &x_{2}^2& \\dots & \\dots &x_{2}^{n-1}\\\\ \n",
|
||
"\\dots& \\dots &\\dots& \\dots & \\dots &\\dots\\\\\n",
|
||
"1& x_{n-1}^1 &x_{n-1}^2& \\dots & \\dots &x_{n-1}^{n-1}\\\\\n",
|
||
"\\end{bmatrix}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we can rewrite our equations as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{y} = \\boldsymbol{X}\\boldsymbol{\\beta}+\\boldsymbol{\\epsilon}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The above design matrix is called a [Vandermonde matrix](https://en.wikipedia.org/wiki/Vandermonde_matrix).\n",
|
||
"\n",
|
||
"We are obviously not limited to the above polynomial expansions. We\n",
|
||
"could replace the various powers of $x$ with elements of Fourier\n",
|
||
"series or instead of $x_i^j$ we could have $\\cos{(j x_i)}$ or $\\sin{(j\n",
|
||
"x_i)}$, or time series or other orthogonal functions. For every set\n",
|
||
"of values $y_i,x_i$ we can then generalize the equations to"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{align*}\n",
|
||
"y_0&=\\beta_0x_{00}+\\beta_1x_{01}+\\beta_2x_{02}+\\dots+\\beta_{n-1}x_{0n-1}+\\epsilon_0\\\\\n",
|
||
"y_1&=\\beta_0x_{10}+\\beta_1x_{11}+\\beta_2x_{12}+\\dots+\\beta_{n-1}x_{1n-1}+\\epsilon_1\\\\\n",
|
||
"y_2&=\\beta_0x_{20}+\\beta_1x_{21}+\\beta_2x_{22}+\\dots+\\beta_{n-1}x_{2n-1}+\\epsilon_2\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{i}&=\\beta_0x_{i0}+\\beta_1x_{i1}+\\beta_2x_{i2}+\\dots+\\beta_{n-1}x_{in-1}+\\epsilon_i\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{n-1}&=\\beta_0x_{n-1,0}+\\beta_1x_{n-1,2}+\\beta_2x_{n-1,2}+\\dots+\\beta_{n-1}x_{n-1,n-1}+\\epsilon_{n-1}.\\\\\n",
|
||
"\\end{align*}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**Note that we have $p=n$ here. The matrix is symmetric. This is generally not the case!**\n",
|
||
"\n",
|
||
"We redefine in turn the matrix $\\boldsymbol{X}$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}=\n",
|
||
"\\begin{bmatrix} \n",
|
||
"x_{00}& x_{01} &x_{02}& \\dots & \\dots &x_{0,n-1}\\\\\n",
|
||
"x_{10}& x_{11} &x_{12}& \\dots & \\dots &x_{1,n-1}\\\\\n",
|
||
"x_{20}& x_{21} &x_{22}& \\dots & \\dots &x_{2,n-1}\\\\ \n",
|
||
"\\dots& \\dots &\\dots& \\dots & \\dots &\\dots\\\\\n",
|
||
"x_{n-1,0}& x_{n-1,1} &x_{n-1,2}& \\dots & \\dots &x_{n-1,n-1}\\\\\n",
|
||
"\\end{bmatrix}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and without loss of generality we rewrite again our equations as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{y} = \\boldsymbol{X}\\boldsymbol{\\beta}+\\boldsymbol{\\epsilon}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The left-hand side of this equation is kwown. Our error vector $\\boldsymbol{\\epsilon}$ and the parameter vector $\\boldsymbol{\\beta}$ are our unknow quantities. How can we obtain the optimal set of $\\beta_i$ values? \n",
|
||
"\n",
|
||
"We have defined the matrix $\\boldsymbol{X}$ via the equations"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{align*}\n",
|
||
"y_0&=\\beta_0x_{00}+\\beta_1x_{01}+\\beta_2x_{02}+\\dots+\\beta_{n-1}x_{0n-1}+\\epsilon_0\\\\\n",
|
||
"y_1&=\\beta_0x_{10}+\\beta_1x_{11}+\\beta_2x_{12}+\\dots+\\beta_{n-1}x_{1n-1}+\\epsilon_1\\\\\n",
|
||
"y_2&=\\beta_0x_{20}+\\beta_1x_{21}+\\beta_2x_{22}+\\dots+\\beta_{n-1}x_{2n-1}+\\epsilon_1\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{i}&=\\beta_0x_{i0}+\\beta_1x_{i1}+\\beta_2x_{i2}+\\dots+\\beta_{n-1}x_{in-1}+\\epsilon_1\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{n-1}&=\\beta_0x_{n-1,0}+\\beta_1x_{n-1,2}+\\beta_2x_{n-1,2}+\\dots+\\beta_{n-1}x_{n-1,n-1}+\\epsilon_{n-1}.\\\\\n",
|
||
"\\end{align*}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"As we noted above, we stayed with a system with the design matrix \n",
|
||
" $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times n}$, that is we have $p=n$. For reasons to come later (algorithmic arguments) we will hereafter define \n",
|
||
"our matrix as $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times p}$, with the predictors refering to the column numbers and the entries $n$ being the row elements.\n",
|
||
"\n",
|
||
"In our [introductory notes](https://compphysics.github.io/MachineLearning/doc/pub/How2ReadData/html/How2ReadData.html) we looked at the so-called [liquid drop model](https://en.wikipedia.org/wiki/Semi-empirical_mass_formula). Let us remind ourselves about what we did by looking at the code.\n",
|
||
"\n",
|
||
"We restate the parts of the code we are most interested in."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>1</th>\n",
|
||
" <th>A</th>\n",
|
||
" <th>A^(2/3)</th>\n",
|
||
" <th>A^(-1/3)</th>\n",
|
||
" <th>1/A</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>A</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2.519842</td>\n",
|
||
" <td>0.629961</td>\n",
|
||
" <td>0.250000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>2.924018</td>\n",
|
||
" <td>0.584804</td>\n",
|
||
" <td>0.200000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>6.0</td>\n",
|
||
" <td>3.301927</td>\n",
|
||
" <td>0.550321</td>\n",
|
||
" <td>0.166667</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>3.659306</td>\n",
|
||
" <td>0.522758</td>\n",
|
||
" <td>0.142857</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>8</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>4.000000</td>\n",
|
||
" <td>0.500000</td>\n",
|
||
" <td>0.125000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>264</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>264.0</td>\n",
|
||
" <td>41.153106</td>\n",
|
||
" <td>0.155883</td>\n",
|
||
" <td>0.003788</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>265</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>265.0</td>\n",
|
||
" <td>41.256962</td>\n",
|
||
" <td>0.155687</td>\n",
|
||
" <td>0.003774</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>266</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>266.0</td>\n",
|
||
" <td>41.360688</td>\n",
|
||
" <td>0.155491</td>\n",
|
||
" <td>0.003759</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>269</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>269.0</td>\n",
|
||
" <td>41.671089</td>\n",
|
||
" <td>0.154911</td>\n",
|
||
" <td>0.003717</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>270</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>270.0</td>\n",
|
||
" <td>41.774300</td>\n",
|
||
" <td>0.154720</td>\n",
|
||
" <td>0.003704</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>264 rows × 5 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" 1 A A^(2/3) A^(-1/3) 1/A\n",
|
||
"A \n",
|
||
"4 1.0 4.0 2.519842 0.629961 0.250000\n",
|
||
"5 1.0 5.0 2.924018 0.584804 0.200000\n",
|
||
"6 1.0 6.0 3.301927 0.550321 0.166667\n",
|
||
"7 1.0 7.0 3.659306 0.522758 0.142857\n",
|
||
"8 1.0 8.0 4.000000 0.500000 0.125000\n",
|
||
".. ... ... ... ... ...\n",
|
||
"264 1.0 264.0 41.153106 0.155883 0.003788\n",
|
||
"265 1.0 265.0 41.256962 0.155687 0.003774\n",
|
||
"266 1.0 266.0 41.360688 0.155491 0.003759\n",
|
||
"269 1.0 269.0 41.671089 0.154911 0.003717\n",
|
||
"270 1.0 270.0 41.774300 0.154720 0.003704\n",
|
||
"\n",
|
||
"[264 rows x 5 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Common imports\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from IPython.display import display\n",
|
||
"import os\n",
|
||
"\n",
|
||
"# Where to save the figures and data files\n",
|
||
"PROJECT_ROOT_DIR = \"Results\"\n",
|
||
"FIGURE_ID = \"Results/FigureFiles\"\n",
|
||
"DATA_ID = \"DataFiles/\"\n",
|
||
"\n",
|
||
"if not os.path.exists(PROJECT_ROOT_DIR):\n",
|
||
" os.mkdir(PROJECT_ROOT_DIR)\n",
|
||
"\n",
|
||
"if not os.path.exists(FIGURE_ID):\n",
|
||
" os.makedirs(FIGURE_ID)\n",
|
||
"\n",
|
||
"if not os.path.exists(DATA_ID):\n",
|
||
" os.makedirs(DATA_ID)\n",
|
||
"\n",
|
||
"def image_path(fig_id):\n",
|
||
" return os.path.join(FIGURE_ID, fig_id)\n",
|
||
"\n",
|
||
"def data_path(dat_id):\n",
|
||
" return os.path.join(DATA_ID, dat_id)\n",
|
||
"\n",
|
||
"def save_fig(fig_id):\n",
|
||
" plt.savefig(image_path(fig_id) + \".png\", format='png')\n",
|
||
"\n",
|
||
"infile = open(data_path(\"MassEval2016.dat\"),'r')\n",
|
||
"\n",
|
||
"\n",
|
||
"# Read the experimental data with Pandas\n",
|
||
"Masses = pd.read_fwf(infile, usecols=(2,3,4,6,11),\n",
|
||
" names=('N', 'Z', 'A', 'Element', 'Ebinding'),\n",
|
||
" widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1),\n",
|
||
" header=39,\n",
|
||
" index_col=False)\n",
|
||
"\n",
|
||
"# Extrapolated values are indicated by '#' in place of the decimal place, so\n",
|
||
"# the Ebinding column won't be numeric. Coerce to float and drop these entries.\n",
|
||
"Masses['Ebinding'] = pd.to_numeric(Masses['Ebinding'], errors='coerce')\n",
|
||
"Masses = Masses.dropna()\n",
|
||
"# Convert from keV to MeV.\n",
|
||
"Masses['Ebinding'] /= 1000\n",
|
||
"\n",
|
||
"# Group the DataFrame by nucleon number, A.\n",
|
||
"Masses = Masses.groupby('A')\n",
|
||
"# Find the rows of the grouped DataFrame with the maximum binding energy.\n",
|
||
"Masses = Masses.apply(lambda t: t[t.Ebinding==t.Ebinding.max()])\n",
|
||
"A = Masses['A']\n",
|
||
"Z = Masses['Z']\n",
|
||
"N = Masses['N']\n",
|
||
"Element = Masses['Element']\n",
|
||
"Energies = Masses['Ebinding']\n",
|
||
"\n",
|
||
"# Now we set up the design matrix X\n",
|
||
"X = np.zeros((len(A),5))\n",
|
||
"X[:,0] = 1\n",
|
||
"X[:,1] = A\n",
|
||
"X[:,2] = A**(2.0/3.0)\n",
|
||
"X[:,3] = A**(-1.0/3.0)\n",
|
||
"X[:,4] = A**(-1.0)\n",
|
||
"# Then nice printout using pandas\n",
|
||
"DesignMatrix = pd.DataFrame(X)\n",
|
||
"DesignMatrix.index = A\n",
|
||
"DesignMatrix.columns = ['1', 'A', 'A^(2/3)', 'A^(-1/3)', '1/A']\n",
|
||
"display(DesignMatrix)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"With $\\boldsymbol{\\beta}\\in {\\mathbb{R}}^{p\\times 1}$, it means that we will hereafter write our equations for the approximation as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\tilde{y}}= \\boldsymbol{X}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"throughout these lectures. \n",
|
||
"\n",
|
||
"With the above we use the design matrix to define the approximation $\\boldsymbol{\\tilde{y}}$ via the unknown quantity $\\boldsymbol{\\beta}$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\tilde{y}}= \\boldsymbol{X}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and in order to find the optimal parameters $\\beta_i$ instead of solving the above linear algebra problem, we define a function which gives a measure of the spread between the values $y_i$ (which represent hopefully the exact values) and the parameterized values $\\tilde{y}_i$, namely"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\boldsymbol{\\beta})=\\frac{1}{n}\\sum_{i=0}^{n-1}\\left(y_i-\\tilde{y}_i\\right)^2=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}}\\right)\\right\\},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"or using the matrix $\\boldsymbol{X}$ and in a more compact matrix-vector notation as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\boldsymbol{\\beta})=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)\\right\\}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This function is one possible way to define the so-called cost function.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"It is also common to define\n",
|
||
"the function $C$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\boldsymbol{\\beta})=\\frac{1}{2n}\\sum_{i=0}^{n-1}\\left(y_i-\\tilde{y}_i\\right)^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"since when taking the first derivative with respect to the unknown parameters $\\beta$, the factor of $2$ cancels out. \n",
|
||
"\n",
|
||
"The function"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\boldsymbol{\\beta})=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)\\right\\},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"can be linked to the variance of the quantity $y_i$ if we interpret the latter as the mean value. \n",
|
||
"When linking (see the discussion below) with the maximum likelihood approach below, we will indeed interpret $y_i$ as a mean value"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"y_{i}=\\langle y_i \\rangle = \\beta_0x_{i,0}+\\beta_1x_{i,1}+\\beta_2x_{i,2}+\\dots+\\beta_{n-1}x_{i,n-1}+\\epsilon_i,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\langle y_i \\rangle$ is the mean value. Keep in mind also that\n",
|
||
"till now we have treated $y_i$ as the exact value. Normally, the\n",
|
||
"response (dependent or outcome) variable $y_i$ the outcome of a\n",
|
||
"numerical experiment or another type of experiment and is thus only an\n",
|
||
"approximation to the true value. It is then always accompanied by an\n",
|
||
"error estimate, often limited to a statistical error estimate given by\n",
|
||
"the standard deviation discussed earlier. In the discussion here we\n",
|
||
"will treat $y_i$ as our exact value for the response variable.\n",
|
||
"\n",
|
||
"In order to find the parameters $\\beta_i$ we will then minimize the spread of $C(\\boldsymbol{\\beta})$, that is we are going to solve the problem"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in\n",
|
||
"{\\mathbb{R}}^{p}}}\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)\\right\\}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In practical terms it means we will require"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\beta_j} = \\frac{\\partial }{\\partial \\beta_j}\\left[ \\frac{1}{n}\\sum_{i=0}^{n-1}\\left(y_i-\\beta_0x_{i,0}-\\beta_1x_{i,1}-\\beta_2x_{i,2}-\\dots-\\beta_{n-1}x_{i,n-1}\\right)^2\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"which results in"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\beta_j} = -\\frac{2}{n}\\left[ \\sum_{i=0}^{n-1}x_{ij}\\left(y_i-\\beta_0x_{i,0}-\\beta_1x_{i,1}-\\beta_2x_{i,2}-\\dots-\\beta_{n-1}x_{i,n-1}\\right)\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"or in a matrix-vector form as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = 0 = \\boldsymbol{X}^T\\left( \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can rewrite"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = 0 = \\boldsymbol{X}^T\\left( \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}^T\\boldsymbol{y} = \\boldsymbol{X}^T\\boldsymbol{X}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and if the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$ is invertible we have the solution"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\beta} =\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We note also that since our design matrix is defined as $\\boldsymbol{X}\\in\n",
|
||
"{\\mathbb{R}}^{n\\times p}$, the product $\\boldsymbol{X}^T\\boldsymbol{X} \\in\n",
|
||
"{\\mathbb{R}}^{p\\times p}$. In the above case we have that $p \\ll n$,\n",
|
||
"in our case $p=5$ meaning that we end up with inverting a small\n",
|
||
"$5\\times 5$ matrix. This is a rather common situation, in many cases we end up with low-dimensional\n",
|
||
"matrices to invert. The methods discussed here and for many other\n",
|
||
"supervised learning algorithms like classification with logistic\n",
|
||
"regression or support vector machines, exhibit dimensionalities which\n",
|
||
"allow for the usage of direct linear algebra methods such as **LU** decomposition or **Singular Value Decomposition** (SVD) for finding the inverse of the matrix\n",
|
||
"$\\boldsymbol{X}^T\\boldsymbol{X}$. \n",
|
||
"\n",
|
||
"**Small question**: Do you think the example we have at hand here (the nuclear binding energies) can lead to problems in inverting the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$? What kind of problems can we expect? \n",
|
||
"\n",
|
||
"\n",
|
||
"The following matrix and vector relation will be useful here and for the rest of the course. Vectors are always written as boldfaced lower case letters and \n",
|
||
"matrices as upper case boldfaced letters."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"4\n",
|
||
"3\n",
|
||
" \n",
|
||
"<\n",
|
||
"<\n",
|
||
"<\n",
|
||
"!\n",
|
||
"!\n",
|
||
"M\n",
|
||
"A\n",
|
||
"T\n",
|
||
"H\n",
|
||
"_\n",
|
||
"B\n",
|
||
"L\n",
|
||
"O\n",
|
||
"C\n",
|
||
"K"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"4\n",
|
||
"4\n",
|
||
" \n",
|
||
"<\n",
|
||
"<\n",
|
||
"<\n",
|
||
"!\n",
|
||
"!\n",
|
||
"M\n",
|
||
"A\n",
|
||
"T\n",
|
||
"H\n",
|
||
"_\n",
|
||
"B\n",
|
||
"L\n",
|
||
"O\n",
|
||
"C\n",
|
||
"K"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"4\n",
|
||
"5\n",
|
||
" \n",
|
||
"<\n",
|
||
"<\n",
|
||
"<\n",
|
||
"!\n",
|
||
"!\n",
|
||
"M\n",
|
||
"A\n",
|
||
"T\n",
|
||
"H\n",
|
||
"_\n",
|
||
"B\n",
|
||
"L\n",
|
||
"O\n",
|
||
"C\n",
|
||
"K"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial\\log{\\vert\\boldsymbol{A}\\vert}}{\\partial \\boldsymbol{A}}=(\\boldsymbol{A}^{-1})^T.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can then compute the second derivative of the cost function, which in our case is the second derivative\n",
|
||
"of the means squared error. This leads to"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial^2 C(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}^T\\partial \\boldsymbol{\\beta}} =\\frac{2}{n}\\boldsymbol{X}^T\\boldsymbol{X}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This quantity defines was what is called the Hessian matrix (the second derivative of a function we want to optimize).\n",
|
||
"\n",
|
||
"The Hessian matrix plays an important role and is defined for the mean squared error as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{H}=\\boldsymbol{X}^T\\boldsymbol{X}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The Hessian matrix for ordinary least squares is also proportional to\n",
|
||
"the covariance matrix. As we will see in the chapter on Ridge and Lasso regression, This means that we can use the Singular Value Decomposition of a matrix to find\n",
|
||
"the eigenvalues of the covariance matrix and the Hessian matrix in\n",
|
||
"terms of the singular values.\n",
|
||
"\n",
|
||
"\n",
|
||
"The residuals $\\boldsymbol{\\epsilon}$ are in turn given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\epsilon} = \\boldsymbol{y}-\\boldsymbol{\\tilde{y}} = \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and with"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}^T\\left( \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)= 0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we have"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}^T\\boldsymbol{\\epsilon}=\\boldsymbol{X}^T\\left( \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)= 0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"meaning that the solution for $\\boldsymbol{\\beta}$ is the one which minimizes the residuals. Later we will link this with the maximum likelihood approach.\n",
|
||
"\n",
|
||
"\n",
|
||
"Let us now return to our nuclear binding energies and simply code the above equations. \n",
|
||
"\n",
|
||
"\n",
|
||
"It is rather straightforward to implement the matrix inversion and obtain the parameters $\\boldsymbol{\\beta}$. After having defined the matrix $\\boldsymbol{X}$ we simply need to \n",
|
||
"write"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# matrix inversion to find beta\n",
|
||
"beta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(Energies)\n",
|
||
"# and then make the prediction\n",
|
||
"ytilde = X @ beta"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Alternatively, you can use the least squares functionality in **Numpy** as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"fit = np.linalg.lstsq(X, Energies, rcond =None)[0]\n",
|
||
"ytildenp = np.dot(fit,X.T)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"And finally we plot our fit with and compare with data"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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h85768x1Xfess85yt23btsvr9laXo8Vzzz3nfuITn3Cz2ayby+XcpUuXuo8++qjeY/3YU309+eSTo/L9NSpa5s8//zxz586lpqaGqqoqPvShD/H4448PdbGGlXXr1mEYBp/73Oc455xzWL58ueptD+677z6uv/56xowZA8Brr73GlClTmDRpEl6vl7PPPpvHH3+cLVu2kMlkOPbYYwE477zzRm3dvbfOUqkUzc3NfPOb3+Tss8/mtttuw3GcfutyNGlsbOTaa6/F7/fj8/mYPn06GzZs0HusH3uqr+bm5lH5/vIOdQHKYfv27TQ2NhYfjxkzhtdee20ISzT89PT0MG/ePG644QYymQxLly7lzDPPVL29x4033rjL4z29t7Zt27bb842NjWzbtq1s5RxO3ltn7e3tzJ07l29/+9tUVVXx+c9/nt/85jdUVVXtsS5HkxkzZhQ/3rBhA4899hif/vSn9R7rx57q65577uHFF18cde+vUdEyd113t+cMwxiCkgxfxx13HDfffDNVVVXU1dVx/vnnc9ttt+32OtXbrvp7b+k9179Jkybx4x//mPr6ekKhEJ/+9Kd55plnVGc7Wbt2LZ/97GdZtmwZkydP3u3zeo/tauf6mjZt2qh8f42KMG9qaqKtra34ePv27cUuPyl46aWXeOGFF4qPXddlwoQJqrd96O+99d7nW1tbVXe9Vq9ezRNPPFF87LouXq9XP6e9Xn75ZS6++GK+8pWvcO655+o9tg/vra/R+v4aFWH+gQ98gBdeeIGOjg7S6TRPPvkkJ5988lAXa1iJx+PcfPPNZLNZEokEDz30ELfccovqbR+OOeYY1q9fz8aNG7Ftm//+7//m5JNPZsKECQQCAV5++WUAHn74YdVdL9d1+c53vkN3dzf5fJ7/+q//4owzzui3LkeTrVu3csUVV/C9732PxYsXA3qP7c2e6mu0vr9GxZh5U1MTV199NUuXLiWfz3P++edz9NFHD3WxhpVTTjmFlStX8pGPfATHcbjooouYM2eO6m0fAoEAN910E1/84hfJZrMsWLCAD3/4wwB873vf47rrriOZTHLEEUewdOnSIS7t8DBz5kwuu+wyLrzwQizLYuHChZx11lkA/dblaHHHHXeQzWa56aabis9dcMEFeo/1o7/6Go3vL8Pd00CCiIiIVIxR0c0uIiIykinMRUREKpzCXEREpMIpzEVERCqcwlxERKTCKcxFREQqnMJcRESkwinMRUYQy7I488wzWbhw4aBds7u7m8MPP5xPfOITuzz/rW99i+985zsHfP0f//jHHHfccbv8Oeqoozj88MP53e9+d8DXFxkNRsUOcCKjxb333ktHRwc9PT2kUimqqqoO+JqrVq2isbGRf/zjH7S2thZPnlq1ahUXXXRRv1/3wx/+EIAvfvGLe73+FVdcwRVXXFF8nEwmueSSS6itrR3UX0pERjK1zEVGiHg8zo9+9CO++c1v4vF4WLt27aBc9+233+bII4/kxBNP5KmnngLAtm3WrFnDrFmzBuUefTKZDJdffjmhUIjbbrsNn883qNcXGanUMhcZIX7yk58wadIkzjrrLH7605+yevVqjjnmmN1e9/nPf754OMd7zZkzh9tvv32X59566y1mzpzJ1KlTefTRR7ngggtYt24djuMwffr0QSt/LpfjyiuvJJ/P85//+Z8EAoFBu7bISKcwFxkBNm3axN13380dd9wBwKGHHsrq1av3+Nr3hvW+rFq1itNOO425c+dyww03kEgkWLVqFTNmzBi0lrNlWXz5y1+mvb2dX/7yl4MyPCAymijMRUaAW265hQ984AOccMIJQCHMdz6ffqByuRzr1q1j1qxZVFdXc9RRR/GXv/yFVatWMXPmzN1ev3OrP5vNAvCLX/wC2HOrH8BxHK699lrWr1/P3XffTTQaPeByi4w2CnORCvfSSy/xxBNPEIlEOPHEE4HC2LNp7nlKzKWXXrrXbvaf//znxcdr1qwhGAwyadIkAE4//XSeeuop2traOOOMM3b7+p3Den8nwF1//fW89tprLF++nLq6ur2+VkT2TGEuUsFc1+Wmm27iggsu4Morryw+39zczMc//nGam5sZP378Ll+zc1jvy6pVqzj88MMxDAOAU089ldtuuw3TNPcZ0vvju9/9Ln/961/51a9+xZgxYw74eiKjlcJcpIL99re/pb29nWuuuYZwOFx8vqGhgXA4zOrVq3cL81KsWrVqlxnrEydOZMKECaxevXqP3eylWLNmDXfddRc+n4+zzjprl8+FQiGeffbZfnsXRGRXhuu67lAXQkRERAZOv/aKiIhUOIW5iIhIhVOYi4iIVDiFuYiISIVTmIuIiFQ4hbmIiEiFU5iLiIhUOIW5iIhIhfv/AaB42/HV2OLoAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<Figure size 576x396 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_136_0.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"Masses['Eapprox'] = ytilde\n",
|
||
"# Generate a plot comparing the experimental with the fitted values values.\n",
|
||
"fig, ax = plt.subplots()\n",
|
||
"ax.set_xlabel(r'$A = N + Z$')\n",
|
||
"ax.set_ylabel(r'$E_\\mathrm{bind}\\,/\\mathrm{MeV}$')\n",
|
||
"ax.plot(Masses['A'], Masses['Ebinding'], alpha=0.7, lw=2,\n",
|
||
" label='Ame2016')\n",
|
||
"ax.plot(Masses['A'], Masses['Eapprox'], alpha=0.7, lw=2, c='m',\n",
|
||
" label='Fit')\n",
|
||
"ax.legend()\n",
|
||
"save_fig(\"Masses2016OLS\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can easily test our fit by computing the $R2$ score that we discussed in connection with the functionality of **Scikit-Learn** in the introductory slides.\n",
|
||
"Since we are not using **Scikit-Learn** here we can define our own $R2$ function as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"def R2(y_data, y_model):\n",
|
||
" return 1 - np.sum((y_data - y_model) ** 2) / np.sum((y_data - np.mean(y_data)) ** 2)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and we would be using it as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 20,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.9549351910143222\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"print(R2(Energies,ytilde))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can easily add our **MSE** score as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 21,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.022022882954618378\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"def MSE(y_data,y_model):\n",
|
||
" n = np.size(y_model)\n",
|
||
" return np.sum((y_data-y_model)**2)/n\n",
|
||
"\n",
|
||
"print(MSE(Energies,ytilde))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and finally the relative error as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"A \n",
|
||
"4 0 1.093247\n",
|
||
"5 2 0.275341\n",
|
||
"6 7 0.060080\n",
|
||
"7 12 0.019587\n",
|
||
"8 17 0.117986\n",
|
||
" ... \n",
|
||
"264 3297 0.000148\n",
|
||
"265 3303 0.001263\n",
|
||
"266 3310 0.002948\n",
|
||
"269 3331 0.000599\n",
|
||
"270 3337 0.002526\n",
|
||
"Name: Ebinding, Length: 264, dtype: float64\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"def RelativeError(y_data,y_model):\n",
|
||
" return abs((y_data-y_model)/y_data)\n",
|
||
"print(RelativeError(Energies, ytilde))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### The $\\chi^2$ function\n",
|
||
"\n",
|
||
"Normally, the response (dependent or outcome) variable $y_i$ is the\n",
|
||
"outcome of a numerical experiment or another type of experiment and is\n",
|
||
"thus only an approximation to the true value. It is then always\n",
|
||
"accompanied by an error estimate, often limited to a statistical error\n",
|
||
"estimate given by the standard deviation discussed earlier. In the\n",
|
||
"discussion here we will treat $y_i$ as our exact value for the\n",
|
||
"response variable.\n",
|
||
"\n",
|
||
"Introducing the standard deviation $\\sigma_i$ for each measurement\n",
|
||
"$y_i$, we define now the $\\chi^2$ function (omitting the $1/n$ term)\n",
|
||
"as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\chi^2(\\boldsymbol{\\beta})=\\frac{1}{n}\\sum_{i=0}^{n-1}\\frac{\\left(y_i-\\tilde{y}_i\\right)^2}{\\sigma_i^2}=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}}\\right)^T\\frac{1}{\\boldsymbol{\\Sigma^2}}\\left(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}}\\right)\\right\\},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where the matrix $\\boldsymbol{\\Sigma}$ is a diagonal matrix with $\\sigma_i$ as matrix elements. \n",
|
||
"\n",
|
||
"\n",
|
||
"In order to find the parameters $\\beta_i$ we will then minimize the spread of $\\chi^2(\\boldsymbol{\\beta})$ by requiring"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\beta_j} = \\frac{\\partial }{\\partial \\beta_j}\\left[ \\frac{1}{n}\\sum_{i=0}^{n-1}\\left(\\frac{y_i-\\beta_0x_{i,0}-\\beta_1x_{i,1}-\\beta_2x_{i,2}-\\dots-\\beta_{n-1}x_{i,n-1}}{\\sigma_i}\\right)^2\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"which results in"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\beta_j} = -\\frac{2}{n}\\left[ \\sum_{i=0}^{n-1}\\frac{x_{ij}}{\\sigma_i}\\left(\\frac{y_i-\\beta_0x_{i,0}-\\beta_1x_{i,1}-\\beta_2x_{i,2}-\\dots-\\beta_{n-1}x_{i,n-1}}{\\sigma_i}\\right)\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"or in a matrix-vector form as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = 0 = \\boldsymbol{A}^T\\left( \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{\\beta}\\right).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where we have defined the matrix $\\boldsymbol{A} =\\boldsymbol{X}/\\boldsymbol{\\Sigma}$ with matrix elements $a_{ij} = x_{ij}/\\sigma_i$ and the vector $\\boldsymbol{b}$ with elements $b_i = y_i/\\sigma_i$. \n",
|
||
"\n",
|
||
"We can rewrite"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = 0 = \\boldsymbol{A}^T\\left( \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{\\beta}\\right),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{A}^T\\boldsymbol{b} = \\boldsymbol{A}^T\\boldsymbol{A}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and if the matrix $\\boldsymbol{A}^T\\boldsymbol{A}$ is invertible we have the solution"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\beta} =\\left(\\boldsymbol{A}^T\\boldsymbol{A}\\right)^{-1}\\boldsymbol{A}^T\\boldsymbol{b}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"If we then introduce the matrix"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{H} = \\left(\\boldsymbol{A}^T\\boldsymbol{A}\\right)^{-1},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we have then the following expression for the parameters $\\beta_j$ (the matrix elements of $\\boldsymbol{H}$ are $h_{ij}$)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\beta_j = \\sum_{k=0}^{p-1}h_{jk}\\sum_{i=0}^{n-1}\\frac{y_i}{\\sigma_i}\\frac{x_{ik}}{\\sigma_i} = \\sum_{k=0}^{p-1}h_{jk}\\sum_{i=0}^{n-1}b_ia_{ik}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We state without proof the expression for the uncertainty in the parameters $\\beta_j$ as (we leave this as an exercise)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\sigma^2(\\beta_j) = \\sum_{i=0}^{n-1}\\sigma_i^2\\left( \\frac{\\partial \\beta_j}{\\partial y_i}\\right)^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"resulting in"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\sigma^2(\\beta_j) = \\left(\\sum_{k=0}^{p-1}h_{jk}\\sum_{i=0}^{n-1}a_{ik}\\right)\\left(\\sum_{l=0}^{p-1}h_{jl}\\sum_{m=0}^{n-1}a_{ml}\\right) = h_{jj}!\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The first step here is to approximate the function $y$ with a first-order polynomial, that is we write"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"y=y(x) \\rightarrow y(x_i) \\approx \\beta_0+\\beta_1 x_i.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"By computing the derivatives of $\\chi^2$ with respect to $\\beta_0$ and $\\beta_1$ show that these are given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\beta_0} = -2\\left[ \\frac{1}{n}\\sum_{i=0}^{n-1}\\left(\\frac{y_i-\\beta_0-\\beta_1x_{i}}{\\sigma_i^2}\\right)\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\beta_1} = -\\frac{2}{n}\\left[ \\sum_{i=0}^{n-1}x_i\\left(\\frac{y_i-\\beta_0-\\beta_1x_{i}}{\\sigma_i^2}\\right)\\right]=0.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"For a linear fit (a first-order polynomial) we don't need to invert a matrix!! \n",
|
||
"Defining"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma = \\sum_{i=0}^{n-1}\\frac{1}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma_x = \\sum_{i=0}^{n-1}\\frac{x_{i}}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma_y = \\sum_{i=0}^{n-1}\\left(\\frac{y_i}{\\sigma_i^2}\\right),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma_{xx} = \\sum_{i=0}^{n-1}\\frac{x_ix_{i}}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma_{xy} = \\sum_{i=0}^{n-1}\\frac{y_ix_{i}}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we obtain"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\beta_0 = \\frac{\\gamma_{xx}\\gamma_y-\\gamma_x\\gamma_y}{\\gamma\\gamma_{xx}-\\gamma_x^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\beta_1 = \\frac{\\gamma_{xy}\\gamma-\\gamma_x\\gamma_y}{\\gamma\\gamma_{xx}-\\gamma_x^2}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This approach (different linear and non-linear regression) suffers\n",
|
||
"often from both being underdetermined and overdetermined in the\n",
|
||
"unknown coefficients $\\beta_i$. A better approach is to use the\n",
|
||
"Singular Value Decomposition (SVD) method discussed below. Or using\n",
|
||
"Lasso and Ridge regression. See below.\n",
|
||
"\n",
|
||
"\n",
|
||
"### Fitting an Equation of State for Dense Nuclear Matter\n",
|
||
"\n",
|
||
"Before we continue, let us introduce yet another example. We are going to fit the\n",
|
||
"nuclear equation of state using results from many-body calculations.\n",
|
||
"The equation of state we have made available here, as function of\n",
|
||
"density, has been derived using modern nucleon-nucleon potentials with\n",
|
||
"[the addition of three-body\n",
|
||
"forces](https://www.sciencedirect.com/science/article/pii/S0370157399001106). This\n",
|
||
"time the file is presented as a standard **csv** file.\n",
|
||
"\n",
|
||
"The beginning of the Python code here is similar to what you have seen\n",
|
||
"before, with the same initializations and declarations. We use also\n",
|
||
"**pandas** again, rather extensively in order to organize our data.\n",
|
||
"\n",
|
||
"The difference now is that we use **Scikit-Learn's** regression tools\n",
|
||
"instead of our own matrix inversion implementation."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 23,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Mean squared error: 12.36\n",
|
||
"Variance score: 1.00\n",
|
||
"Mean absolute error: 2.83\n",
|
||
"[ 0. 618.32047562 -861.13519106 1404.91549644] -11.057088709962727\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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jb3WyYo1mRRln8QExMa2YdzEngQG+nm7NPkBBQAREakXxaU1rFiVTk1xFWaziQEDohn1oy6YzWrvb4oUAERE5IrtP3yCdWv246quw9/Pwo+SutK7b5S3y5ILUAAQEZHLZhgGqd/ksXPrYXC4CA0NYOKknkS2b+Xt0sQDBQAREbksDqeLVesPkJtZBIZBVPswJk3uRXBIgLdLk4ugACAiIpestNLOio8zqThejslkomfvSEZf1x2LVQ/zaS4UAERE5JJkHysj5ZNMnBW1WK1mho/oxKDBHTS4TzOjACAiIhfFMAy2fXucHZuzoc5FUJAfY8f3JLZTG2+XJpdBAUBERDxyOF188tlBctILMRkG7WwhTJqsh/k0ZwoAIiJyQeVVtSxflU758QrMJhM9erbjujFxWNXe36wpAIiIyHkdPlbGJ6szcVTWYrWYGTayE/Fq728RFABEROScduw5xldfZIPjVHv/uAk96RjbxttlST1RABARkTM4nC5SPj9EzncFoPb+FksBQERE3MqralnxcQZlx07d3989rh3Xj1V7f0ukACAiIgAcOV7G6tWZOCpqsVjMDBsRy+CrYtTe30IpAIiICGl7j7N1Y9Z/2/vH96Sj7u9v0RQARER8mNN1qr0/e++p9v6IdiFMTu5NWJja+1s6BQARER9VUV3L8lWn2vs53d4/Ru39PkMBQETEB33//n6LxczQ4bFcNUTt/b5EAUBExIcYhsH2b4+xfVOOu71/7ISexOr+fp+jACAi4iMcThcfr9vP0X3F7vv7Jyf3JjRU7f2+SAFARMQHnCyvYcVHGVQWVWIymejZJ5LR13XHYlF7v69q0D3/pz/9icmTJzN58mReeOEFAFJTU0lOTmbcuHG89NJL7vemp6czbdo0xo8fz29+8xscDgcAeXl53H777UyYMIH777+fysrKhixZRKTFOXj4JO++s4vKokqsVgs/urYbY8bG6eTv4y5q79fU1JCZmYlhGNTU1FzUglNTU9m0aRPLly9nxYoV7N27l1WrVvHkk0+yePFiVq9ezZ49e9i4cSMAjz76KE899RRr1qzBMAyWLl0KwDPPPMOMGTNISUmhf//+LF68+DJ/VBER32IYBl9uO0LKynScNQ5CQgO4aWo/Bgxo7+3SpAnwGAB27tzJmDFjmDVrFvn5+SQlJfH11197XLDNZuPxxx/H398f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WCz8/Oc/56677jrrfTNnzmT79u2kpaXx3HPPsWzZMu655x5mzJjBhx9+yJEjR5g0aRK/+tWvePzxx0lLS2PQoEH88Y9/pHXr1thsNpYsWXLOGmpra/H39wcgLCyMoKCghvyRRXyOAoCInOWBBx7g6quvZvPmzaSlpXH33XczZcqUs9731ltvceedd3LDDTdw6623uqevXbuWf/zjHzidTm666SbS09NZsGAB3bt3595772XJkiU8+OCDF6whIyOD3/3ud5jNZgICAnjuuefq/ecU8WUKACJyhs8++wyA++67D4CRI0cSFRVFVlbWRS/jjjvuoF27dgAkJCQQHh5O3759ARg7dixbtmzxuIyBAwfy9ttvX2r5InKRdBeAiJxhw4YNXH/99e7XLpeL8vJyIiIiLnoZ/zn5AwQEBJzxOjAwkKqqqvopVkQumwKAiJxh165dtGnTxv1669athIeH061bN+8VJSL1TgFARNzq6urIzs5mzZo12O129u/fzzPPPMPDDz/s7dJEpJ6pD4CIuB08eJCOHTsSFxfHqFGjiIiI4P7772fChAneLk1E6pmGAhYRtw8//JB169bxyiuvnHP+gAED8Pf358477+SXv/xl4xb3PT/72c/YuXMnAwcO5J///KfX6hBpznQFQETcMjIyLtjW/+233zZiNef3j3/8w9sliDR76gMgIm779u1TZz8RH6EmABERER+kKwAiIiI+SAFARETEBykAiIiI+CAFABERER+kACAiIuKDFABERER8kAKAiIiID1IAEBER8UEKACIiIj7o/wG/u0XiRQqQvQAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<Figure size 576x396 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_183_1.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Common imports\n",
|
||
"import os\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import sklearn.linear_model as skl\n",
|
||
"from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error\n",
|
||
"\n",
|
||
"# Where to save the figures and data files\n",
|
||
"PROJECT_ROOT_DIR = \"Results\"\n",
|
||
"FIGURE_ID = \"Results/FigureFiles\"\n",
|
||
"DATA_ID = \"DataFiles/\"\n",
|
||
"\n",
|
||
"if not os.path.exists(PROJECT_ROOT_DIR):\n",
|
||
" os.mkdir(PROJECT_ROOT_DIR)\n",
|
||
"\n",
|
||
"if not os.path.exists(FIGURE_ID):\n",
|
||
" os.makedirs(FIGURE_ID)\n",
|
||
"\n",
|
||
"if not os.path.exists(DATA_ID):\n",
|
||
" os.makedirs(DATA_ID)\n",
|
||
"\n",
|
||
"def image_path(fig_id):\n",
|
||
" return os.path.join(FIGURE_ID, fig_id)\n",
|
||
"\n",
|
||
"def data_path(dat_id):\n",
|
||
" return os.path.join(DATA_ID, dat_id)\n",
|
||
"\n",
|
||
"def save_fig(fig_id):\n",
|
||
" plt.savefig(image_path(fig_id) + \".png\", format='png')\n",
|
||
"\n",
|
||
"infile = open(data_path(\"EoS.csv\"),'r')\n",
|
||
"\n",
|
||
"# Read the EoS data as csv file and organize the data into two arrays with density and energies\n",
|
||
"EoS = pd.read_csv(infile, names=('Density', 'Energy'))\n",
|
||
"EoS['Energy'] = pd.to_numeric(EoS['Energy'], errors='coerce')\n",
|
||
"EoS = EoS.dropna()\n",
|
||
"Energies = EoS['Energy']\n",
|
||
"Density = EoS['Density']\n",
|
||
"# The design matrix now as function of various polytrops\n",
|
||
"X = np.zeros((len(Density),4))\n",
|
||
"X[:,3] = Density**(4.0/3.0)\n",
|
||
"X[:,2] = Density\n",
|
||
"X[:,1] = Density**(2.0/3.0)\n",
|
||
"X[:,0] = 1\n",
|
||
"\n",
|
||
"# We use now Scikit-Learn's linear regressor and ridge regressor\n",
|
||
"# OLS part\n",
|
||
"clf = skl.LinearRegression().fit(X, Energies)\n",
|
||
"ytilde = clf.predict(X)\n",
|
||
"EoS['Eols'] = ytilde\n",
|
||
"# The mean squared error \n",
|
||
"print(\"Mean squared error: %.2f\" % mean_squared_error(Energies, ytilde))\n",
|
||
"# Explained variance score: 1 is perfect prediction \n",
|
||
"print('Variance score: %.2f' % r2_score(Energies, ytilde))\n",
|
||
"# Mean absolute error \n",
|
||
"print('Mean absolute error: %.2f' % mean_absolute_error(Energies, ytilde))\n",
|
||
"print(clf.coef_, clf.intercept_)\n",
|
||
"\n",
|
||
"\n",
|
||
"fig, ax = plt.subplots()\n",
|
||
"ax.set_xlabel(r'$\\rho[\\mathrm{fm}^{-3}]$')\n",
|
||
"ax.set_ylabel(r'Energy per particle')\n",
|
||
"ax.plot(EoS['Density'], EoS['Energy'], alpha=0.7, lw=2,\n",
|
||
" label='Theoretical data')\n",
|
||
"ax.plot(EoS['Density'], EoS['Eols'], alpha=0.7, lw=2, c='m',\n",
|
||
" label='OLS')\n",
|
||
"ax.legend()\n",
|
||
"save_fig(\"EoSfitting\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The above simple polynomial in density $\\rho$ gives an excellent fit\n",
|
||
"to the data. \n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"## Splitting our Data in Training and Test data\n",
|
||
"\n",
|
||
"\n",
|
||
"It is normal in essentially all Machine Learning studies to split the\n",
|
||
"data in a training set and a test set (sometimes also an additional\n",
|
||
"validation set). **Scikit-Learn** has an own function for this. There\n",
|
||
"is no explicit recipe for how much data should be included as training\n",
|
||
"data and say test data. An accepted rule of thumb is to use\n",
|
||
"approximately $2/3$ to $4/5$ of the data as training data. We will\n",
|
||
"postpone a discussion of this splitting to the end of these notes and\n",
|
||
"our discussion of the so-called **bias-variance** tradeoff. Here we\n",
|
||
"limit ourselves to repeat the above equation of state fitting example\n",
|
||
"but now splitting the data into a training set and a test set.\n",
|
||
"\n",
|
||
"Let us study some examples. The first code here takes a simple\n",
|
||
"one-dimensional second-order polynomial and we fit it to a\n",
|
||
"second-order polynomial. Depending on the strength of the added noise,\n",
|
||
"the various measures like the $R2$ score or the mean-squared error,\n",
|
||
"the fit becomes better or worse."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 24,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"[1.9748951 0.06118722 4.96583694]\n",
|
||
"Training R2\n",
|
||
"0.9941048180010681\n",
|
||
"Training MSE\n",
|
||
"0.013714193616910514\n",
|
||
"Test R2\n",
|
||
"0.9966804290594763\n",
|
||
"Test MSE\n",
|
||
"0.0070460574623899454\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.9999862839596511\n",
|
||
"Training MSE\n",
|
||
"6.753389180187765\n",
|
||
"Test R2\n",
|
||
"0.9999817890900857\n",
|
||
"Test MSE\n",
|
||
"4.757161599902217\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import os\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"# Where to save the figures and data files\n",
|
||
"PROJECT_ROOT_DIR = \"Results\"\n",
|
||
"FIGURE_ID = \"Results/FigureFiles\"\n",
|
||
"DATA_ID = \"DataFiles/\"\n",
|
||
"\n",
|
||
"if not os.path.exists(PROJECT_ROOT_DIR):\n",
|
||
" os.mkdir(PROJECT_ROOT_DIR)\n",
|
||
"\n",
|
||
"if not os.path.exists(FIGURE_ID):\n",
|
||
" os.makedirs(FIGURE_ID)\n",
|
||
"\n",
|
||
"if not os.path.exists(DATA_ID):\n",
|
||
" os.makedirs(DATA_ID)\n",
|
||
"\n",
|
||
"def image_path(fig_id):\n",
|
||
" return os.path.join(FIGURE_ID, fig_id)\n",
|
||
"\n",
|
||
"def data_path(dat_id):\n",
|
||
" return os.path.join(DATA_ID, dat_id)\n",
|
||
"\n",
|
||
"def save_fig(fig_id):\n",
|
||
" plt.savefig(image_path(fig_id) + \".png\", format='png')\n",
|
||
"\n",
|
||
"def R2(y_data, y_model):\n",
|
||
" return 1 - np.sum((y_data - y_model) ** 2) / np.sum((y_data - np.mean(y_data)) ** 2)\n",
|
||
"def MSE(y_data,y_model):\n",
|
||
" n = np.size(y_model)\n",
|
||
" return np.sum((y_data-y_model)**2)/n\n",
|
||
"\n",
|
||
"infile = open(data_path(\"EoS.csv\"),'r')\n",
|
||
"\n",
|
||
"# Read the EoS data as csv file and organized into two arrays with density and energies\n",
|
||
"EoS = pd.read_csv(infile, names=('Density', 'Energy'))\n",
|
||
"EoS['Energy'] = pd.to_numeric(EoS['Energy'], errors='coerce')\n",
|
||
"EoS = EoS.dropna()\n",
|
||
"Energies = EoS['Energy']\n",
|
||
"Density = EoS['Density']\n",
|
||
"# The design matrix now as function of various polytrops\n",
|
||
"X = np.zeros((len(Density),5))\n",
|
||
"X[:,0] = 1\n",
|
||
"X[:,1] = Density**(2.0/3.0)\n",
|
||
"X[:,2] = Density\n",
|
||
"X[:,3] = Density**(4.0/3.0)\n",
|
||
"X[:,4] = Density**(5.0/3.0)\n",
|
||
"# We split the data in test and training data\n",
|
||
"X_train, X_test, y_train, y_test = train_test_split(X, Energies, test_size=0.2)\n",
|
||
"# matrix inversion to find beta\n",
|
||
"beta = np.linalg.inv(X_train.T.dot(X_train)).dot(X_train.T).dot(y_train)\n",
|
||
"# and then make the prediction\n",
|
||
"ytilde = X_train @ beta\n",
|
||
"print(\"Training R2\")\n",
|
||
"print(R2(y_train,ytilde))\n",
|
||
"print(\"Training MSE\")\n",
|
||
"print(MSE(y_train,ytilde))\n",
|
||
"ypredict = X_test @ beta\n",
|
||
"print(\"Test R2\")\n",
|
||
"print(R2(y_test,ypredict))\n",
|
||
"print(\"Test MSE\")\n",
|
||
"print(MSE(y_test,ypredict))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## The Boston housing data example\n",
|
||
"\n",
|
||
"The Boston housing \n",
|
||
"data set was originally a part of UCI Machine Learning Repository\n",
|
||
"and has been removed now. The data set is now included in **Scikit-Learn**'s \n",
|
||
"library. There are 506 samples and 13 feature (predictor) variables\n",
|
||
"in this data set. The objective is to predict the value of prices of\n",
|
||
"the house using the features (predictors) listed here.\n",
|
||
"\n",
|
||
"The features/predictors are\n",
|
||
"1. CRIM: Per capita crime rate by town\n",
|
||
"\n",
|
||
"2. ZN: Proportion of residential land zoned for lots over 25000 square feet\n",
|
||
"\n",
|
||
"3. INDUS: Proportion of non-retail business acres per town\n",
|
||
"\n",
|
||
"4. CHAS: Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)\n",
|
||
"\n",
|
||
"5. NOX: Nitric oxide concentration (parts per 10 million)\n",
|
||
"\n",
|
||
"6. RM: Average number of rooms per dwelling\n",
|
||
"\n",
|
||
"7. AGE: Proportion of owner-occupied units built prior to 1940\n",
|
||
"\n",
|
||
"8. DIS: Weighted distances to five Boston employment centers\n",
|
||
"\n",
|
||
"9. RAD: Index of accessibility to radial highways\n",
|
||
"\n",
|
||
"10. TAX: Full-value property tax rate per USD10000\n",
|
||
"\n",
|
||
"11. B: $1000(Bk - 0.63)^2$, where $Bk$ is the proportion of [people of African American descent] by town\n",
|
||
"\n",
|
||
"12. LSTAT: Percentage of lower status of the population\n",
|
||
"\n",
|
||
"13. MEDV: Median value of owner-occupied homes in USD 1000s\n",
|
||
"\n",
|
||
"## Housing data, the code\n",
|
||
"We start by importing the libraries"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 27,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt \n",
|
||
"\n",
|
||
"import pandas as pd \n",
|
||
"import seaborn as sns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and load the Boston Housing DataSet from **Scikit-Learn**"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 28,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/utils/deprecation.py:87: FutureWarning: Function load_boston is deprecated; `load_boston` is deprecated in 1.0 and will be removed in 1.2.\n",
|
||
"\n",
|
||
" The Boston housing prices dataset has an ethical problem. You can refer to\n",
|
||
" the documentation of this function for further details.\n",
|
||
"\n",
|
||
" The scikit-learn maintainers therefore strongly discourage the use of this\n",
|
||
" dataset unless the purpose of the code is to study and educate about\n",
|
||
" ethical issues in data science and machine learning.\n",
|
||
"\n",
|
||
" In this special case, you can fetch the dataset from the original\n",
|
||
" source::\n",
|
||
"\n",
|
||
" import pandas as pd\n",
|
||
" import numpy as np\n",
|
||
"\n",
|
||
"\n",
|
||
" data_url = \"http://lib.stat.cmu.edu/datasets/boston\"\n",
|
||
" raw_df = pd.read_csv(data_url, sep=\"\\s+\", skiprows=22, header=None)\n",
|
||
" data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])\n",
|
||
" target = raw_df.values[1::2, 2]\n",
|
||
"\n",
|
||
" Alternative datasets include the California housing dataset (i.e.\n",
|
||
" :func:`~sklearn.datasets.fetch_california_housing`) and the Ames housing\n",
|
||
" dataset. You can load the datasets as follows::\n",
|
||
"\n",
|
||
" from sklearn.datasets import fetch_california_housing\n",
|
||
" housing = fetch_california_housing()\n",
|
||
"\n",
|
||
" for the California housing dataset and::\n",
|
||
"\n",
|
||
" from sklearn.datasets import fetch_openml\n",
|
||
" housing = fetch_openml(name=\"house_prices\", as_frame=True)\n",
|
||
"\n",
|
||
" for the Ames housing dataset.\n",
|
||
" \n",
|
||
" warnings.warn(msg, category=FutureWarning)\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename', 'data_module'])"
|
||
]
|
||
},
|
||
"execution_count": 28,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.datasets import load_boston\n",
|
||
"\n",
|
||
"boston_dataset = load_boston()\n",
|
||
"\n",
|
||
"# boston_dataset is a dictionary\n",
|
||
"# let's check what it contains\n",
|
||
"boston_dataset.keys()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Then we invoke Pandas"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 29,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"boston = pd.DataFrame(boston_dataset.data, columns=boston_dataset.feature_names)\n",
|
||
"boston.head()\n",
|
||
"boston['MEDV'] = boston_dataset.target"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and preprocess the data"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 30,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"CRIM 0\n",
|
||
"ZN 0\n",
|
||
"INDUS 0\n",
|
||
"CHAS 0\n",
|
||
"NOX 0\n",
|
||
"RM 0\n",
|
||
"AGE 0\n",
|
||
"DIS 0\n",
|
||
"RAD 0\n",
|
||
"TAX 0\n",
|
||
"PTRATIO 0\n",
|
||
"B 0\n",
|
||
"LSTAT 0\n",
|
||
"MEDV 0\n",
|
||
"dtype: int64"
|
||
]
|
||
},
|
||
"execution_count": 30,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# check for missing values in all the columns\n",
|
||
"boston.isnull().sum()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can then visualize the data"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 31,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/seaborn/distributions.py:2619: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms).\n",
|
||
" warnings.warn(msg, FutureWarning)\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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BiWn06kf/ehH+sY3viGv16vrr79et9xyi9mxotYzzzwjr9erH/3oR1233XPPPRyDAXb99ddrz549uvPOO2Wz2XTzzTdr0aJFSktL4ziYbPXq1Xr44YfV2tqqsWPHavny5WZHimrz58/v+lkIBoO69957NW3aNN6jB9CkSZP0la98Rffee698Pp+uueYafeELX1BBQUGfXo8sxqUGNgEAAABgGAYAAADQHcoyAAAA0A3KMgAAANANyjIAAADQDcoyAAAA0A2mjgOACFNeXq6bbrpJ06dP19q1ay/Y9q1vfUsvv/yytm3bpjlz5qiwsFBW64XnRZ544glJ0oIFC1RYWChJCgaDcjgcWr58ue68806dOXNGt956q7Zs2aKsrKwL9l+8eLG+8Y1v6Oabbw7h/yUAhAfKMgBEIKfTqZMnT6qiokJ5eXmSpLa2tq5FKD7xi1/8oms1q08rLy9XbGysNmzY0HVbRUWF7r//fsXFxWnhwoW65ppr9PLLL+tv/uZvuu6za9cuNTc366abbgrR/xkAhBeGYQBABLLZbLr11lu1cePGrts2b97cpxKbl5enBx54QM8884wk6d5779XLL7+sT0/Hv27dOn3+85+/YPlYAIhmlGUAiFB33nmnfvvb33Z9vX79en32s5+94D733XeflixZ0vXnb//2by/7mMXFxTp8+LAk6brrrpNhGPr4448lnV/Od8uWLfrc5z7Xz/8nABC+GIYBABFq/Pjxslqt2r9/v9LT09Xa2to1BvkT3Q3D6I7FYlFsbKwkyWq16p577tFvfvMbzZo1S7/97W81b948paen9+v/BwCEM8oyAESwO+64Q7/97W+VlpamJUuW9Pnx9u3bd0HhXrZsmW655Ra1tLRo3bp1+t73vtfn5wCASEJZBoAItmTJEt19991KSUnRL3/5yz491okTJ/Tkk0/qoYce6rotNTVV8+fP109+8hPZbDZNnjy5j4kBILJQlgEggmVlZWnkyJFKTExUSkrKRdvvu+++i6aO++Y3v6mRI0eqo6Oj62y01WqV0+nUN7/5Td1www0X3P/ee+/V5z73Of3whz8M1f8GAIQti/Hpy5wBAAAAdGE2DAAAAKAblGUAAACgG5RlAAAAoBuUZQAAAKAblGUAAACgG5RlAAAAoBuUZQAAAKAb/z9mAdtQEKgqHwAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<Figure size 842.4x595.44 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_199_1.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# set the size of the figure\n",
|
||
"sns.set(rc={'figure.figsize':(11.7,8.27)})\n",
|
||
"\n",
|
||
"# plot a histogram showing the distribution of the target values\n",
|
||
"sns.distplot(boston['MEDV'], bins=30)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"It is now useful to look at the correlation matrix"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 32,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<AxesSubplot:>"
|
||
]
|
||
},
|
||
"execution_count": 32,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 842.4x595.44 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_201_1.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# compute the pair wise correlation for all columns \n",
|
||
"correlation_matrix = boston.corr().round(2)\n",
|
||
"# use the heatmap function from seaborn to plot the correlation matrix\n",
|
||
"# annot = True to print the values inside the square\n",
|
||
"sns.heatmap(data=correlation_matrix, annot=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"From the above coorelation plot we can see that **MEDV** is strongly correlated to **LSTAT** and **RM**. We see also that **RAD** and **TAX** are stronly correlated, but we don't include this in our features together to avoid multi-colinearity"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 33,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABJEAAAFRCAYAAADEnjyhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAACCYElEQVR4nO3de3xU9Z0//teZmdwkpGAMphR0/UYhkIqi20sKGmBRiUKK1P68dAFLi/ZBV/2y++Wrde3lt9tVLO2vVl36XSlYtIWqXURDAQtFU4359uINNkGsqTcWIzFCwyWZZGbO74/0DGfOnPuc65zX8x8lc/ucc2bOeX/e5/N5fwRRFEUQERERERERERHpiPndACIiIiIiIiIiCj4mkYiIiIiIiIiIyBCTSEREREREREREZIhJJCIiIiIiIiIiMsQkEhERERERERERGWISiYiIiIiIiIiIDCX8bgARRcPBgwexYMECvPLKK3mPrVu3Dtu2bYMoishkMrjkkkuwcuVKDA4OYvHixQCAkydP4oMPPsA555wDAPjc5z6H22+/HcPDw5g9ezYmT56M9evXAwAeeugh/OpXvwIAvPvuuxg7dixGjx4NAHjggQdw1llnebHJRERERKEwefJkTJo0CbFYDIIgYGBgAJWVlfjOd76D888/H1u2bME3vvENrFixArfddlv2daIoYu7cuaioqMC2bdt83AIi8gqTSETkqx07dmD37t147LHHUF5ejmQyiVtvvRUPPvgg/vEf/xFPPfUUAOB3v/sd/vVf/zX7b8muXbswefJkdHZ2oru7G3V1dbjppptw0003AQAWL16ML33pS5g3b57n20ZEREQUFhs3bsTpp5+e/ff69evx3e9+F4899hgAYPz48Whtbc1JIv3xj3/E4OAgKioqPG8vEfmD09mIyFe9vb1Ip9MYHBwEAJSVleGb3/wm5s6da+r1mzdvxty5c3HllVdi48aNbjaViIiIKBJSqRTef/99fOxjH8v+bdKkSTjttNPw8ssvZ//25JNPoqWlxY8mEpFPmEQiIl9dffXVqKqqwsyZM3Httddi9erVeP/99zFt2jTD17755pt49dVX0dzcjIULF+Kpp57CkSNHPGg1ERERUXFZunQpWlpaMHPmTFxxxRUAgHvuuSfnOVK8BQADAwN46aWXcMkll3jeViLyD5NIROSr0aNHY8OG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ZyMiKkDYh4oXQ72hsB8DIiIKLqevMV5es4rhGk9EwcORSEREBQj7UHHprmeYp4KF/RgQEVFwOX2N8fKapbzGc3U2InICk0hERAUohqHiVuorBFExHAMiIgomp68xXl+z5Nd4rbqCRERWcDobEVEBOFTcfzwGRETkFqevMbxmEVHYcSQSEVEBimE6WNjxGBARkVucvsbwmkVEYcckEhFRgcI+HawY8BgQEZFbnL7G8JpFRGHG6WxERERERERERGSISSQiIiIiIiIiIjLEJBIRERERERERERliEomIiIiIiIiIiAwxiURERERERERERIaYRCIiIiIiIiIiIkNMIhERERERERERkaGE3w1wQiwm+N0E30R524Fob3+Utx3g9kd5+6O87UC0tj9K2xo2UT02Ud1uL3Efu4v7113cv+7jPnaXtH/19rMgiqLoVYOIiIiIiIiIiCicOJ2NiIiIiIiIiIgMMYlERERERERERESGmEQiIiIiIiIiIiJDTCIREREREREREZEhJpGIiIiIiIiIiMgQk0hERERERERERGSISSQiIiIiIiIiIjLEJBIRERERERERERliEomIiIiIiIiIiAwxiURERERERERERIaYRCIiIiIiIiIiIkNMIhERERERERERkaHQJpFaW1tx5ZVX4rLLLsPPf/5zv5vjuSVLluCqq67C5z//eXz+85/Ha6+95neTXHf8+HHMnz8fBw8eBAC8+OKLWLBgAS6//HL88Ic/9Ll17lNu/ze+8Q1cfvnl2e/Arl27fG6hOx588EFcddVVuOqqq/C9730PQLSOvdr2R+XYA8CPfvQjXHnllbjqqqvw8MMPA4jO8Vfb9igde6Kguffee3HHHXf43YyiFMW41kt79uzBokWLMG/ePHz3u9/1uzlF54knnsh+dz//+c/j4osvxr/8y7/43ayi8tRTT2Xj4Xvvvdfv5hSdhx56CFdccQUWLFiAH//4x8YvEEOop6dHnD17tnjkyBHxxIkT4oIFC8Q//elPfjfLM5lMRpwxY4Y4PDzsd1M88+qrr4rz588XGxoaxPfee08cGBgQm5qaxHfffVccHh4Wly1bJj733HN+N9M1yu0XRVGcP3+++MEHH/jcMne1t7eL1157rZhMJsWhoSFxyZIlYmtra2SOvdr2//rXv47EsRdFUfzd734nXnfddeLw8LA4MDAgzp49W9y/f38kjr/atnd3d0fm2BMFzYsvvih+5jOfEW+//Xa/m1J0ohjXeundd98VZ86cKb7//vvi0NCQeP311xfldTMo3njjDfGyyy4T+/r6/G5K0Th58qT4qU99Suzr6xOHh4fFa665Rmxvb/e7WUWjvb1dnD9/vnjs2DExlUqJN998s/jMM8/oviaUI5FefPFFfPazn8WYMWNw2mmn4YorrsDOnTv9bpZn/vznP0MQBCxfvhwtLS342c9+5neTXPf444/j29/+NsaNGwcA2Lt3L84++2xMnDgRiUQCCxYsKOrvgHL7T548iUOHDuGb3/wmFixYgPvvvx+ZTMbnVjqvpqYGd9xxB0pLS1FSUoK6ujq8/fbbkTn2att/6NChSBx7APj0pz+NRx55BIlEAn19fUin0+jv74/E8Vfb9rKyssgce6IgOXr0KH74wx/ia1/7mt9NKUpRjGu9tGvXLlx55ZWora1FSUkJfvjDH+KCCy7wu1lF6zvf+Q5WrlyJ008/3e+mFI10Oo1MJoOBgQGkUimkUimUlZX53ayi0dXVhZkzZ6KyshLxeByXXHIJdu/erfuaUCaRDh8+jJqamuy/x40bhw8++MDHFnmrv78fjY2N+Pd//3f89Kc/xS9+8Qu0t7f73SxX/du//Rv+9m//NvvvqH0HlNvf19eHz372s7j77rvx+OOP449//CN++ctf+thCd5x33nm48MILAQBvv/02tm/fDkEQInPs1bb/kksuicSxl5SUlOD+++/HVVddhcbGxkj99pXbnk6nI3XsiYLiW9/6FlauXImqqiq/m1KUohjXeumdd95BOp3GV77yFbS0tGDTpk342Mc+5nezitKLL76IwcFBNDc3+92UolJZWYnbbrsNzc3NuPTSS/GJT3wCF110kd/NKhoNDQ144YUXcPToUSSTSezZswcffvih7mtCmUQSRTHvb4Ig+NASf0yfPh3f+973cNppp+H000/HNddcg7a2Nr+b5amofwcmTpyIf//3f0d1dTUqKiqwePHiov4O/OlPf8KyZctw++2346yzzsp7vNiPvXz7/8f/+B+ROvYAcOutt6KjowPvv/8+3n777bzHi/n4y7e9o6MjcseeyG9PPPEEPv7xj6OxsdHvphQtxrXuSqfT6OjowJo1a/D4449j3759ePLJJ/1uVlH6xS9+gS9/+ct+N6PovP766/jP//xPPPvss3jhhRcQi8Wwfv16v5tVNBobG7Fo0SIsXrwYX/3qV3HxxRejpKRE9zWhTCKdeeaZOdmxw4cPZ6f5RMEf//hHdHR0ZP8tiiISiYSPLfJe1L8DBw4cwDPPPJP9dzF/B1566SXceOON+Kd/+idcffXVkTv2yu2P0rHv7u7G/v37AQAVFRW4/PLL8bvf/S4Sx19t27dv3x6ZY08UFNu3b0d7ezs+//nP4/7778eePXtw9913+92sosK41l1nnHEGGhsbcfrpp6O8vBx/93d/h7179/rdrKIzNDSEP/zhD5gzZ47fTSk6L7zwAhobG1FdXY3S0lIsWrQIv//97/1uVtE4fvw4LrvsMrS2tuLRRx9FRUUFJk6cqPuaUCaRPve5z6GjowMfffQRBgYG8Otf/xqXXnqp383yzLFjx/C9730PyWQSx48fx5NPPonLLrvM72Z56oILLsBbb72VHaK7bdu2SH0HRFHE3Xffjb/85S8YHh7GY489VpTfgffffx9f//rX8f3vfx9XXXUVgGgde7Xtj8qxB4CDBw/irrvuwtDQEIaGhvCb3/wG1113XSSOv9q2f+pTn4rMsScKiocffhjbtm3DU089hVtvvRVz5szBnXfe6XezigrjWnfNnj0bL7zwAvr7+5FOp/H888+joaHB72YVnQMHDuBv/uZvcNppp/ndlKJTX1+PF198ESdPnoQoitizZw/OP/98v5tVNA4ePIivf/3rSKVSOHbsGJ544gnDKZmhTPOfeeaZWLlyJZYsWYLh4WFcc801mDZtmt/N8szs2bPx2muvYeHChchkMrjhhhswffp0v5vlqbKyMqxevRq33HILkskkmpqaMG/ePL+b5Zn6+nrcdNNNuP7665FKpXD55Zdj/vz5fjfLcevXr0cymcTq1auzf7vuuusic+y1tj8Kxx4Ampqasue6eDyOyy+/HFdddRVOP/30oj/+atv+D//wDxg7dmwkjj0RRQfjWnddcMEF+OpXv4obbrgBw8PDmDFjBr7whS/43ayi895776G2ttbvZhSlmTNnoqurC4sWLUJJSQnOP/983HTTTX43q2jU19fj8ssvR0tLC9LpNG688UZcfPHFuq8RRLXiMkRERERERERERDKhnM5GRERERERERETeYhKJiIiIiIiIiIgMMYlERERERERERESGmEQiIiIiIiIiIiJDTCIREREREREREZGhhN8NIKJoOHjwIBYsWIBXXnkl77F169Zh27ZtEEURmUwGl1xyCVauXInBwUEsXrwYAHDy5El88MEHOOeccwAAn/vc53D77bdjeHgYs2fPxuTJk7F+/XoAwEMPPYRf/epXAIB3330XY8eOxejRowEADzzwAM466ywvNpmIiIgoFCZPnoxJkyYhFotBEAQMDAygsrIS3/nOd3D++edjy5Yt+MY3voEVK1bgtttuy75OFEXMnTsXFRUV2LZtm49bQEReYRKJiHy1Y8cO7N69G4899hjKy8uRTCZx66234sEHH8Q//uM/4qmnngIA/O53v8O//uu/Zv8t2bVrFyZPnozOzk50d3ejrq4ON910E2666SYAwOLFi/GlL30J8+bN83zbiIiIiMJi48aNOP3007P/Xr9+Pb773e/iscceAwCMHz8era2tOUmkP/7xjxgcHERFRYXn7SUif3A6GxH5qre3F+l0GoODgwCAsrIyfPOb38TcuXNNvX7z5s2YO3currzySmzcuNHNphIRERFFQiqVwvvvv4+Pfexj2b9NmjQJp512Gl5++eXs35588km0tLT40UQi8gmTSETkq6uvvhpVVVWYOXMmrr32WqxevRrvv/8+pk2bZvjaN998E6+++iqam5uxcOFCPPXUUzhy5IgHrSYiIiIqLkuXLkVLSwtmzpyJK664AgBwzz335DxHircAYGBgAC+99BIuueQSz9tKRP5hEomIfDV69Ghs2LABO3bswDXXXIO+vj7cdNNNWLNmjeFrN2/ejFmzZmHMmDGYNm0aJkyYkB1yTURERETmbdy4EU8//TQeeughDA4OYvr06aiurs55zoIFC7Br1y4MDw9j165dmDNnDuLxuE8tJiI/MIlERL5at24dXn75ZUycOBFf/OIXsWbNGqxbtw6bNm3Sfd3JkyexdetWvPTSS5gzZw7mzJmD3t5e/PznP8fw8LBHrSciIiIqLlOnTsU3vvEN3HXXXTh48GDOYzU1NZg6dSra2tqwdetWXH311T61koj8wiQSEflqcHAQP/jBD3D06NHs39566y1MnTpV93Wtra0YO3Ysnn/+eezZswd79uzB7t27cfLkSezYscPlVhMREREVr/nz5+PCCy/E3XffnffYwoUL8fDDD+PYsWOYNGmSD60jIj9xdTYi8szJkycxffr0nL9t3rwZgiDguuuugyAIyGQy+OQnP4n77rtP9702b96ML3/5yzlDqKuqqrB48WJs3LiRRR6JiIiICvDNb34TLS0teP7553P+PnfuXHz729/GypUrfWoZEflJEEVR9LsRREREREREREQUbJzORkREREREREREhphEIiIiIiIiIiIiQ0wiERERERERERGRISaRiIiIiIiIiIjIEJNIRERERERERERkiEkkIiIiIiIiIiIyxCQSEREREREREREZYhKJiIiIiIiIiIgM/f8DoNXX46X5bAAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<Figure size 1440x360 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_203_0.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plt.figure(figsize=(20, 5))\n",
|
||
"\n",
|
||
"features = ['LSTAT', 'RM']\n",
|
||
"target = boston['MEDV']\n",
|
||
"\n",
|
||
"for i, col in enumerate(features):\n",
|
||
" plt.subplot(1, len(features) , i+1)\n",
|
||
" x = boston[col]\n",
|
||
" y = target\n",
|
||
" plt.scatter(x, y, marker='o')\n",
|
||
" plt.title(col)\n",
|
||
" plt.xlabel(col)\n",
|
||
" plt.ylabel('MEDV')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Now we start training our model"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 34,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"X = pd.DataFrame(np.c_[boston['LSTAT'], boston['RM']], columns = ['LSTAT','RM'])\n",
|
||
"Y = boston['MEDV']"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We split the data into training and test sets"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 35,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"(404, 2)\n",
|
||
"(102, 2)\n",
|
||
"(404,)\n",
|
||
"(102,)\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"\n",
|
||
"# splits the training and test data set in 80% : 20%\n",
|
||
"# assign random_state to any value.This ensures consistency.\n",
|
||
"X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state=5)\n",
|
||
"print(X_train.shape)\n",
|
||
"print(X_test.shape)\n",
|
||
"print(Y_train.shape)\n",
|
||
"print(Y_test.shape)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Then we use the linear regression functionality from **Scikit-Learn**"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 36,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"The model performance for training set\n",
|
||
"--------------------------------------\n",
|
||
"RMSE is 5.6371293350711955\n",
|
||
"R2 score is 0.6300745149331701\n",
|
||
"\n",
|
||
"\n",
|
||
"The model performance for testing set\n",
|
||
"--------------------------------------\n",
|
||
"RMSE is 5.137400784702911\n",
|
||
"R2 score is 0.6628996975186952\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"from sklearn.metrics import mean_squared_error, r2_score\n",
|
||
"\n",
|
||
"lin_model = LinearRegression()\n",
|
||
"lin_model.fit(X_train, Y_train)\n",
|
||
"\n",
|
||
"# model evaluation for training set\n",
|
||
"\n",
|
||
"y_train_predict = lin_model.predict(X_train)\n",
|
||
"rmse = (np.sqrt(mean_squared_error(Y_train, y_train_predict)))\n",
|
||
"r2 = r2_score(Y_train, y_train_predict)\n",
|
||
"\n",
|
||
"print(\"The model performance for training set\")\n",
|
||
"print(\"--------------------------------------\")\n",
|
||
"print('RMSE is {}'.format(rmse))\n",
|
||
"print('R2 score is {}'.format(r2))\n",
|
||
"print(\"\\n\")\n",
|
||
"\n",
|
||
"# model evaluation for testing set\n",
|
||
"\n",
|
||
"y_test_predict = lin_model.predict(X_test)\n",
|
||
"# root mean square error of the model\n",
|
||
"rmse = (np.sqrt(mean_squared_error(Y_test, y_test_predict)))\n",
|
||
"\n",
|
||
"# r-squared score of the model\n",
|
||
"r2 = r2_score(Y_test, y_test_predict)\n",
|
||
"\n",
|
||
"print(\"The model performance for testing set\")\n",
|
||
"print(\"--------------------------------------\")\n",
|
||
"print('RMSE is {}'.format(rmse))\n",
|
||
"print('R2 score is {}'.format(r2))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 37,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 842.4x595.44 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_210_0.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# plotting the y_test vs y_pred\n",
|
||
"# ideally should have been a straight line\n",
|
||
"plt.scatter(Y_test, y_test_predict)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Reducing the number of degrees of freedom, overarching view\n",
|
||
"\n",
|
||
"Many Machine Learning problems involve thousands or even millions of\n",
|
||
"features for each training instance. Not only does this make training\n",
|
||
"extremely slow, it can also make it much harder to find a good\n",
|
||
"solution, as we will see. This problem is often referred to as the\n",
|
||
"curse of dimensionality. Fortunately, in real-world problems, it is\n",
|
||
"often possible to reduce the number of features considerably, turning\n",
|
||
"an intractable problem into a tractable one.\n",
|
||
"\n",
|
||
"Later we will discuss some of the most popular dimensionality reduction\n",
|
||
"techniques: the principal component analysis (PCA), Kernel PCA, and\n",
|
||
"Locally Linear Embedding (LLE). \n",
|
||
"\n",
|
||
"\n",
|
||
"Principal component analysis and its various variants deal with the\n",
|
||
"problem of fitting a low-dimensional [affine\n",
|
||
"subspace](https://en.wikipedia.org/wiki/Affine_space) to a set of of\n",
|
||
"data points in a high-dimensional space. With its family of methods it\n",
|
||
"is one of the most used tools in data modeling, compression and\n",
|
||
"visualization.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Before we proceed however, we will discuss how to preprocess our\n",
|
||
"data. Till now and in connection with our previous examples we have\n",
|
||
"not met so many cases where we are too sensitive to the scaling of our\n",
|
||
"data. Normally the data may need a rescaling and/or may be sensitive\n",
|
||
"to extreme values. Scaling the data renders our inputs much more\n",
|
||
"suitable for the algorithms we want to employ.\n",
|
||
"\n",
|
||
"For data sets gathered for real world applications, it is rather normal that\n",
|
||
"different features have very different units and\n",
|
||
"numerical scales. For example, a data set detailing health habits may include\n",
|
||
"features such as **age** in the range $0-80$, and **caloric intake** of order $2000$.\n",
|
||
"Many machine learning methods sensitive to the scales of the features and may perform poorly if they\n",
|
||
"are very different scales. Therefore, it is typical to scale\n",
|
||
"the features in a way to avoid such outlier values.\n",
|
||
"\n",
|
||
"\n",
|
||
"**Scikit-Learn** has several functions which allow us to rescale the\n",
|
||
"data, normally resulting in much better results in terms of various\n",
|
||
"accuracy scores. The **StandardScaler** function in **Scikit-Learn**\n",
|
||
"ensures that for each feature/predictor we study the mean value is\n",
|
||
"zero and the variance is one (every column in the design/feature\n",
|
||
"matrix). This scaling has the drawback that it does not ensure that\n",
|
||
"we have a particular maximum or minimum in our data set. Another\n",
|
||
"function included in **Scikit-Learn** is the **MinMaxScaler** which\n",
|
||
"ensures that all features are exactly between $0$ and $1$. The\n",
|
||
"\n",
|
||
"\n",
|
||
"The **Normalizer** scales each data\n",
|
||
"point such that the feature vector has a euclidean length of one. In other words, it\n",
|
||
"projects a data point on the circle (or sphere in the case of higher dimensions) with a\n",
|
||
"radius of 1. This means every data point is scaled by a different number (by the\n",
|
||
"inverse of it’s length).\n",
|
||
"This normalization is often used when only the direction (or angle) of the data matters,\n",
|
||
"not the length of the feature vector.\n",
|
||
"\n",
|
||
"The **RobustScaler** works similarly to the StandardScaler in that it\n",
|
||
"ensures statistical properties for each feature that guarantee that\n",
|
||
"they are on the same scale. However, the RobustScaler uses the median\n",
|
||
"and quartiles, instead of mean and variance. This makes the\n",
|
||
"RobustScaler ignore data points that are very different from the rest\n",
|
||
"(like measurement errors). These odd data points are also called\n",
|
||
"outliers, and might often lead to trouble for other scaling\n",
|
||
"techniques.\n",
|
||
"\n",
|
||
"\n",
|
||
"Many features are often scaled using standardization to improve\n",
|
||
"performance. In **Scikit-Learn** this is given by the **StandardScaler**\n",
|
||
"function as discussed above. It is easy however to write your own.\n",
|
||
"Mathematically, this involves subtracting the mean and divide by the\n",
|
||
"standard deviation over the data set, for each feature:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"x_j^{(i)} \\rightarrow \\frac{x_j^{(i)} - \\overline{x}_j}{\\sigma(x_j)},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\overline{x}_j$ and $\\sigma(x_j)$ are the mean and standard\n",
|
||
"deviation, respectively, of the feature $x_j$. This ensures that each\n",
|
||
"feature has zero mean and unit standard deviation. For data sets\n",
|
||
"where we do not have the standard deviation or don't wish to calculate\n",
|
||
"it, it is then common to simply set it to one.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Let us consider the following vanilla example where we use both\n",
|
||
"**Scikit-Learn** and write our own function as well. We produce a\n",
|
||
"simple test design matrix with random numbers. Each column could then\n",
|
||
"represent a specific feature whose mean value is subracted."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 38,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>0</th>\n",
|
||
" <th>1</th>\n",
|
||
" <th>2</th>\n",
|
||
" <th>3</th>\n",
|
||
" <th>4</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>-1.749765</td>\n",
|
||
" <td>0.342680</td>\n",
|
||
" <td>1.153036</td>\n",
|
||
" <td>-0.252436</td>\n",
|
||
" <td>0.981321</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>0.514219</td>\n",
|
||
" <td>0.221180</td>\n",
|
||
" <td>-1.070043</td>\n",
|
||
" <td>-0.189496</td>\n",
|
||
" <td>0.255001</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>-0.458027</td>\n",
|
||
" <td>0.435163</td>\n",
|
||
" <td>-0.583595</td>\n",
|
||
" <td>0.816847</td>\n",
|
||
" <td>0.672721</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>-0.104411</td>\n",
|
||
" <td>-0.531280</td>\n",
|
||
" <td>1.029733</td>\n",
|
||
" <td>-0.438136</td>\n",
|
||
" <td>-1.118318</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>1.618982</td>\n",
|
||
" <td>1.541605</td>\n",
|
||
" <td>-0.251879</td>\n",
|
||
" <td>-0.842436</td>\n",
|
||
" <td>0.184519</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5</th>\n",
|
||
" <td>0.937082</td>\n",
|
||
" <td>0.731000</td>\n",
|
||
" <td>1.361556</td>\n",
|
||
" <td>-0.326238</td>\n",
|
||
" <td>0.055676</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6</th>\n",
|
||
" <td>0.222400</td>\n",
|
||
" <td>-1.443217</td>\n",
|
||
" <td>-0.756352</td>\n",
|
||
" <td>0.816454</td>\n",
|
||
" <td>0.750445</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7</th>\n",
|
||
" <td>-0.455947</td>\n",
|
||
" <td>1.189622</td>\n",
|
||
" <td>-1.690617</td>\n",
|
||
" <td>-1.356399</td>\n",
|
||
" <td>-1.232435</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>8</th>\n",
|
||
" <td>-0.544439</td>\n",
|
||
" <td>-0.668172</td>\n",
|
||
" <td>0.007315</td>\n",
|
||
" <td>-0.612939</td>\n",
|
||
" <td>1.299748</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>9</th>\n",
|
||
" <td>-1.733096</td>\n",
|
||
" <td>-0.983310</td>\n",
|
||
" <td>0.357508</td>\n",
|
||
" <td>-1.613579</td>\n",
|
||
" <td>1.470714</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" 0 1 2 3 4\n",
|
||
"0 -1.749765 0.342680 1.153036 -0.252436 0.981321\n",
|
||
"1 0.514219 0.221180 -1.070043 -0.189496 0.255001\n",
|
||
"2 -0.458027 0.435163 -0.583595 0.816847 0.672721\n",
|
||
"3 -0.104411 -0.531280 1.029733 -0.438136 -1.118318\n",
|
||
"4 1.618982 1.541605 -0.251879 -0.842436 0.184519\n",
|
||
"5 0.937082 0.731000 1.361556 -0.326238 0.055676\n",
|
||
"6 0.222400 -1.443217 -0.756352 0.816454 0.750445\n",
|
||
"7 -0.455947 1.189622 -1.690617 -1.356399 -1.232435\n",
|
||
"8 -0.544439 -0.668172 0.007315 -0.612939 1.299748\n",
|
||
"9 -1.733096 -0.983310 0.357508 -1.613579 1.470714"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0 -0.175300\n",
|
||
"1 0.083527\n",
|
||
"2 -0.044334\n",
|
||
"3 -0.399836\n",
|
||
"4 0.331939\n",
|
||
"dtype: float64\n",
|
||
"0 1.069584\n",
|
||
"1 0.965548\n",
|
||
"2 1.018232\n",
|
||
"3 0.793167\n",
|
||
"4 0.918992\n",
|
||
"dtype: float64\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>0</th>\n",
|
||
" <th>1</th>\n",
|
||
" <th>2</th>\n",
|
||
" <th>3</th>\n",
|
||
" <th>4</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>-1.574465</td>\n",
|
||
" <td>0.259153</td>\n",
|
||
" <td>1.197370</td>\n",
|
||
" <td>0.147400</td>\n",
|
||
" <td>0.649382</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>0.689519</td>\n",
|
||
" <td>0.137652</td>\n",
|
||
" <td>-1.025709</td>\n",
|
||
" <td>0.210340</td>\n",
|
||
" <td>-0.076938</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>-0.282727</td>\n",
|
||
" <td>0.351636</td>\n",
|
||
" <td>-0.539261</td>\n",
|
||
" <td>1.216683</td>\n",
|
||
" <td>0.340782</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>0.070889</td>\n",
|
||
" <td>-0.614808</td>\n",
|
||
" <td>1.074067</td>\n",
|
||
" <td>-0.038300</td>\n",
|
||
" <td>-1.450257</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>1.794282</td>\n",
|
||
" <td>1.458078</td>\n",
|
||
" <td>-0.207545</td>\n",
|
||
" <td>-0.442600</td>\n",
|
||
" <td>-0.147420</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5</th>\n",
|
||
" <td>1.112383</td>\n",
|
||
" <td>0.647473</td>\n",
|
||
" <td>1.405890</td>\n",
|
||
" <td>0.073598</td>\n",
|
||
" <td>-0.276263</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6</th>\n",
|
||
" <td>0.397700</td>\n",
|
||
" <td>-1.526744</td>\n",
|
||
" <td>-0.712018</td>\n",
|
||
" <td>1.216290</td>\n",
|
||
" <td>0.418506</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7</th>\n",
|
||
" <td>-0.280647</td>\n",
|
||
" <td>1.106095</td>\n",
|
||
" <td>-1.646283</td>\n",
|
||
" <td>-0.956563</td>\n",
|
||
" <td>-1.564374</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>8</th>\n",
|
||
" <td>-0.369139</td>\n",
|
||
" <td>-0.751699</td>\n",
|
||
" <td>0.051649</td>\n",
|
||
" <td>-0.213103</td>\n",
|
||
" <td>0.967809</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>9</th>\n",
|
||
" <td>-1.557795</td>\n",
|
||
" <td>-1.066837</td>\n",
|
||
" <td>0.401842</td>\n",
|
||
" <td>-1.213743</td>\n",
|
||
" <td>1.138775</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" 0 1 2 3 4\n",
|
||
"0 -1.574465 0.259153 1.197370 0.147400 0.649382\n",
|
||
"1 0.689519 0.137652 -1.025709 0.210340 -0.076938\n",
|
||
"2 -0.282727 0.351636 -0.539261 1.216683 0.340782\n",
|
||
"3 0.070889 -0.614808 1.074067 -0.038300 -1.450257\n",
|
||
"4 1.794282 1.458078 -0.207545 -0.442600 -0.147420\n",
|
||
"5 1.112383 0.647473 1.405890 0.073598 -0.276263\n",
|
||
"6 0.397700 -1.526744 -0.712018 1.216290 0.418506\n",
|
||
"7 -0.280647 1.106095 -1.646283 -0.956563 -1.564374\n",
|
||
"8 -0.369139 -0.751699 0.051649 -0.213103 0.967809\n",
|
||
"9 -1.557795 -1.066837 0.401842 -1.213743 1.138775"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>0</th>\n",
|
||
" <th>1</th>\n",
|
||
" <th>2</th>\n",
|
||
" <th>3</th>\n",
|
||
" <th>4</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>8</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>9</th>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" <td>0.0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" 0 1 2 3 4\n",
|
||
"0 0.0 0.0 0.0 0.0 0.0\n",
|
||
"1 0.0 0.0 0.0 0.0 0.0\n",
|
||
"2 0.0 0.0 0.0 0.0 0.0\n",
|
||
"3 0.0 0.0 0.0 0.0 0.0\n",
|
||
"4 0.0 0.0 0.0 0.0 0.0\n",
|
||
"5 0.0 0.0 0.0 0.0 0.0\n",
|
||
"6 0.0 0.0 0.0 0.0 0.0\n",
|
||
"7 0.0 0.0 0.0 0.0 0.0\n",
|
||
"8 0.0 0.0 0.0 0.0 0.0\n",
|
||
"9 0.0 0.0 0.0 0.0 0.0"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import sklearn.linear_model as skl\n",
|
||
"from sklearn.metrics import mean_squared_error\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.preprocessing import MinMaxScaler, StandardScaler, Normalizer\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"from IPython.display import display\n",
|
||
"np.random.seed(100)\n",
|
||
"# setting up a 10 x 5 matrix\n",
|
||
"rows = 10\n",
|
||
"cols = 5\n",
|
||
"X = np.random.randn(rows,cols)\n",
|
||
"XPandas = pd.DataFrame(X)\n",
|
||
"display(XPandas)\n",
|
||
"print(XPandas.mean())\n",
|
||
"print(XPandas.std())\n",
|
||
"XPandas = (XPandas -XPandas.mean())\n",
|
||
"display(XPandas)\n",
|
||
"# This option does not include the standard deviation\n",
|
||
"scaler = StandardScaler(with_std=False)\n",
|
||
"scaler.fit(X)\n",
|
||
"Xscaled = scaler.transform(X)\n",
|
||
"display(XPandas-Xscaled)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Small exercise: perform the standard scaling by including the standard deviation and compare with what Scikit-Learn gives.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Another commonly used scaling method is min-max scaling. This is very\n",
|
||
"useful for when we want the features to lie in a certain interval. To\n",
|
||
"scale the feature $x_j$ to the interval $[a, b]$, we can apply the\n",
|
||
"transformation"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"x_j^{(i)} \\rightarrow (b-a)\\frac{x_j^{(i)} - \\min(x_j)}{\\max(x_j) - \\min(x_j)} - a\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\min(x_j)$ and $\\max(x_j)$ return the minimum and maximum value of $x_j$ over the data set, respectively.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"## Testing the Means Squared Error as function of Complexity\n",
|
||
"\n",
|
||
"\n",
|
||
"Before we proceed with a more detailed analysis of the so-called\n",
|
||
"Bias-Variance tradeoff, we present here an example of the relation\n",
|
||
"between model complexity and the mean squared error for the triaining\n",
|
||
"data and the test data.\n",
|
||
"\n",
|
||
"The results here tell us clearly that for the data not included in the\n",
|
||
"training, there is an optimal model as function of the complexity of\n",
|
||
"ourmodel (here in terms of the polynomial degree of the model).\n",
|
||
"\n",
|
||
"The results here will vary as function of model complexity and the amount od data used for training. \n",
|
||
"\n",
|
||
"\n",
|
||
"Our data is defined by $x\\in [-3,3]$ with a total of for example $100$ data points."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 39,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAr0AAAHmCAYAAAB+hTZxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABXwElEQVR4nO3deZxU1Z3///e9t6q6u3qhq7qrih2kW0UFXEIiosEVEQRRNBmXSJyJS6KTRL7R6CRxRI2jSVScLGZiTOJvIk40iUIwBDFjYkIgxmWEFldQdujqBXpfqqvu74/qLrrprXqrjdfz8ch037VOneGBb4/nfI5h27YtAAAAIIOZyW4AAAAAMNIIvQAAAMh4hF4AAABkPEIvAAAAMh6hFwAAABmP0AsAAICM50h2Awbi4MEGRSKJq7BWVJSnqqr6hH3e0Y7+Thz6OnHo68SivxOHvk4c+jp+pmnI48nt8Vpahd5IxE5o6O34TCQO/Z049HXi0NeJRX8nDn2dOPT10DG9AQAAABmP0AsAAICMR+gFAABAxiP0AgAAIOMRegEAAJDxCL0AAADIeIReAAAAZDxCLwAAADJeXJtTrFmzRj/+8Y8VCoV03XXX6Zprruly/aWXXtL3v/99RSIRTZ8+Xffee69cLpdWrVqlhx56SEVFRZKkc845R8uWLRv+bwEAAICYhx/+jsrKNqutLaQ9e3Zr8uQpkqTPfOZKXXzxJXG9o76+Xvfff7ceeODhbtfOOmumSkuP63LujDPO1E033TL0xo+QfkNveXm5VqxYoeeee04ul0tXXnmlTj/9dJWWlkqSGhsbde+99+r5559XcXGxli1bpueff17/9E//pLKyMt15551auHDhiH8RAAAARH3ta3dIkvbv36cvf/kmPfnk0wN+R11drT788INerw/mncnUb+jduHGjZs2apcLCQknSvHnztG7dOv3rv/6rJMntduvll1+W0+lUY2OjqqqqVFBQIEkqKyvTzp079fjjj+u4447TXXfdpVGjRo3ctwEAAEgBfyvbrw1b9g/Lu5wuS6HWcOz4rBljdOb0MYN61549u/XQQw+otrZGWVnZWrbsdh133FStX79OTz/93zJNU2PHjtVdd92nRx/9niorK/Rv/3abHnjgobg/44orFunEE6fpww/f11133atvf/tujRpVKJcrSytW/FDf//7Dev3112QY0rx5C/S5z12nN998XT/+8fcVDkc0ZUqJvvWtewb1/frSb+gNBoPy+XyxY7/fry1btnS5x+l06pVXXtHXv/51+f1+nXXWWZIkn8+nG2+8UTNmzNAjjzyie++9Vw8/3H2IPF5FRXmDfnawfL78hH/m0Yz+Thz6OnHo68SivxOHvu5dQcFBOV3WsL2v87sKCrLj7vuWllxZlhm7/8tfvlf//u//rhNPPFHbtm3TLbfcohdffFE///l/6dlnn1VRUZFWrFihuroK3Xvvci1dulRPPPGTHt99/fWf63J822236dOf/rQsy9Tcuefpxz/+ofbs2aNdu3bqf//35xo/frxWrlypQ4eqtHbtC2ptbdW1116rU0+drsJCt/bs2a0//elPys8fmT9X/YZe27a7nTMMo9u5s88+W6+++qoeeeQRLV++XA8//LB+9KMfxa5ff/31uuCCC4bU2KqqekUi3dszUny+fFVU1CXs84529Hfi0NeJQ18nFv2dOPR136ZP8mj6JM+wvKunvo6376urGxQOR1RRUafGxkaVlZXp9tvviF2vr2/Qtm27NWvWWfrsZ/9Jn/70OTr77PNUXDxe+/fviz3bkyeeeKrbuYqKOoXDEU2YUKqKijpVVzfI4/EqK2uUKirq9Je/bNC8eQtUXd0oSTr33Av18suv6Mwz52j8+Ilqbpaamwf/58o0jV4HSfut3hAIBFRZWRk7DgaD8vv9seNDhw5pw4YNseNFixbp/fffV11dnZ588snYedu25XDEtW4OAAAAwywSicjlytKTTz4d+9/jjz+pgoJRuvXW2/Ttb39XBQUFuu++u/Tii2uH9FlZWVk9/t598NJWOBzudt9I6Df0zp49W5s2bVJ1dbWampq0fv16zZkzJ3bdtm3dfvvt2rdvnyTpD3/4g0477TS53W498cQT2rx5syTpqaee0ty5c0foawAAAKAveXl5Gj9+QizQvvba33XLLTcqHA7ryisvU2Fhoa699p910UUX64MP3pdlWbFAOlw+8YmZ+sMffq9wOKzm5matX79Op546c1g/ozf9Dr0GAgEtW7ZMS5cuVSgU0hVXXKEZM2bohhtu0Fe+8hVNnz5d9913n2666SYZhqHS0lLdc889sixLjz76qJYvX67m5mZNnjxZ3/3udxPxnQAAANCDu+/+tr73vf/Q00//txwOp+699z/k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r2nevHldzgMAAACJ1m/1hmAwKJ/PFzv2+/3asmVLr9d9Pp/Ky8t18OBB5eXlyeFwdDk/FEVFeUN6fjB8vvyEf+bRjP5OHPo6cejrxKK/E4e+Thz6euj6Db12D3XZOu900tv1/p4bjKqq+mgh7AQ52moQJhv9nTj0deLQ14lFfycOfZ049HX8TNPodZC03+kNgUBAlZWVseNgMCi/39/r9YqKCvn9fnm9XtXX1yscDnc5DwAAACRav6F39uzZ2rRpk6qrq9XU1KT169drzpw5sevjxo1TVlaW3njjDUnSqlWrNGfOHDmdTs2cOVNr167tch4AAABItLhGepctW6alS5fq0ksv1cKFCzVjxgzdcMMNKisrkyQ99NBDeuCBBzR//nw1NTVp6dKlkqS7775bzz77rBYsWKDXX39dt95664h+GQAAAKAnht3T5NsUxZzezEZ/Jw59nTj0dWLR34lDXycOfR2/Ic3pBQAAANIdoRcAAAAZj9ALAACAjEfoBQAAQMYj9AIAACDjEXoBAACQ8frdhjiVmObQtjFOl888mtHfiUNfJw59nVj0d+LQ14lDX8enr35Kqzq9AAAAwGAwvQEAAAAZj9ALAACAjEfoBQAAQMYj9AIAACDjEXoBAACQ8Qi9AAAAyHiEXgAAAGQ8Qi8AAAAyHqEXAAAAGY/QCwAAgIxH6AUAAEDGI/QCAAAg4xF6AQAAkPEIvb1Ys2aNFixYoLlz52rlypXJbk5G++EPf6iLL75YF198sb773e8muzlHhe985zu68847k92MjPfyyy9ryZIluuiii/Ttb3872c3JaKtXr479PfKd73wn2c3JSPX19Vq4cKH27NkjSdq4caMWLVqkCy+8UCtWrEhy6zLLkX39zDPPaOHChVq0aJH+7d/+Ta2trUluYXoi9PagvLxcK1as0NNPP63Vq1frmWee0bZt25LdrIy0ceNGbdiwQc8//7xWrVqlrVu36qWXXkp2szLapk2b9Pzzzye7GRlv9+7duvvuu/XYY49pzZo1euedd/TKK68ku1kZqampSffff79++ctfavXq1Xr99de1cePGZDcro2zevFlXXXWVduzYIUlqbm7WN77xDT322GNau3at3n77bf58D5Mj+/rjjz/Wz372M/3qV7/S7373O0UiET399NPJbWSaIvT2YOPGjZo1a5YKCwvldrs1b948rVu3LtnNykg+n0933nmnXC6XnE6nSkpKtG/fvmQ3K2MdOnRIK1as0Be/+MVkNyXjvfTSS1qwYIFGjx4tp9OpFStW6OSTT052szJSOBxWJBJRU1OT2tra1NbWpqysrGQ3K6M8++yzuvvuu+X3+yVJW7Zs0aRJkzRhwgQ5HA4tWrSIf04OkyP72uVyafny5crLy5NhGDruuOP45+QgOZLdgFQUDAbl8/lix36/X1u2bEliizLXscceG/t9x44dWrt2rX71q18lsUWZ7d///d+1bNky7d+/P9lNyXg7d+6U0+nUF77wBVVUVOjcc8/VrbfemuxmZaS8vDx99atf1fz585Wdna1PfepTOu2005LdrIxy//33dznu6Z+T5eXliW5WRjqyr8eNG6dx48ZJkqqrq7Vy5Uo98MADyWha2mOktwe2bXc7ZxhGElpy9Pjwww/1L//yL7rjjjs0efLkZDcnI/3617/WmDFjdMYZZyS7KUeFcDisTZs26Xvf+56effZZlZWVMa1khLz33nv67W9/qz/96U/asGGDTNPUz372s2Q3K6Pxz8nEKy8v1+c//3ldfvnlOv3005PdnLRE6O1BIBBQZWVl7DgYDMb+MwOG3xtvvKHrrrtOX/va13TZZZcluzkZa+3atfrb3/6mxYsX6/vf/75efvll/cd//Eeym5WxiouLdcYZZ8jr9So7O1vnn38+/8VohGzYsEFnnHGGioqK5HK5tGTJEv3jH/9IdrMyGv+cTKzt27frqquu0mWXXaZbbrkl2c1JW4TeHsyePVubNm1SdXW1mpqatH79es2ZMyfZzcpI+/fv1y233KKHHnpIF198cbKbk9F+8Ytf6IUXXtDq1av1la98Reedd56+8Y1vJLtZGevcc8/Vhg0bVFtbq3A4rL/+9a866aSTkt2sjDR16lRt3LhRjY2Nsm1bL7/8sqZPn57sZmW0k08+WR9//LF27typcDisF154gX9OjpD6+np94Qtf0Fe/+lX9y7/8S7Kbk9aY09uDQCCgZcuWaenSpQqFQrriiis0Y8aMZDcrI/3sZz9TS0uLHnzwwdi5K6+8UldddVUSWwUM3cknn6zrr79eV199tUKhkM4880xdfvnlyW5WRjrrrLP0zjvvaMmSJXI6nZo+fbpuvPHGZDcro2VlZenBBx/Ul7/8ZbW0tOjss8/WRRddlOxmZaTf/OY3qqys1M9//nP9/Oc/lySdd955+upXv5rklqUfw+5pYg4AAACQQZjeAAAAgIxH6AUAAEDGI/QCAAAg4xF6AQAAkPEIvQAAAMh4hF4AAABkPEIvAAAAMt7/D7vNunJDLlVlAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<Figure size 842.4x595.44 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_218_0.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import numpy as np\n",
|
||
"from sklearn.linear_model import LinearRegression, Ridge, Lasso\n",
|
||
"from sklearn.preprocessing import PolynomialFeatures\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.pipeline import make_pipeline\n",
|
||
"\n",
|
||
"\n",
|
||
"np.random.seed(2018)\n",
|
||
"n = 100\n",
|
||
"maxdegree = 14\n",
|
||
"# Make data set.\n",
|
||
"x = np.linspace(-3, 3, n).reshape(-1, 1)\n",
|
||
"y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)\n",
|
||
"TestError = np.zeros(maxdegree)\n",
|
||
"TrainError = np.zeros(maxdegree)\n",
|
||
"polydegree = np.zeros(maxdegree)\n",
|
||
"x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)\n",
|
||
"\n",
|
||
"\n",
|
||
"for degree in range(maxdegree):\n",
|
||
" model = make_pipeline(PolynomialFeatures(degree=degree), LinearRegression(fit_intercept=False))\n",
|
||
" clf = model.fit(x_train,y_train)\n",
|
||
" y_fit = clf.predict(x_train)\n",
|
||
" y_pred = clf.predict(x_test) \n",
|
||
" polydegree[degree] = degree\n",
|
||
" TestError[degree] = np.mean( np.mean((y_test - y_pred)**2) )\n",
|
||
" TrainError[degree] = np.mean( np.mean((y_train - y_fit)**2) )\n",
|
||
"\n",
|
||
"plt.plot(polydegree, TestError, label='Test Error')\n",
|
||
"plt.plot(polydegree, TrainError, label='Train Error')\n",
|
||
"plt.legend()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Exercises\n",
|
||
"\n",
|
||
"### Exercise: Setting up various Python environments\n",
|
||
"\n",
|
||
"The first exercise here is of a mere technical art. We want you to have \n",
|
||
"* git as a version control software and to establish a user account on a provider like GitHub. Other providers like GitLab etc are equally fine. You can also use the University of Oslo [GitHub facilities](https://www.uio.no/tjenester/it/maskin/filer/versjonskontroll/github.html). \n",
|
||
"\n",
|
||
"* Install various Python packages\n",
|
||
"\n",
|
||
"We will make extensive use of Python as programming language and its\n",
|
||
"myriad of available libraries. You will find\n",
|
||
"IPython/Jupyter notebooks invaluable in your work. You can run **R**\n",
|
||
"codes in the Jupyter/IPython notebooks, with the immediate benefit of\n",
|
||
"visualizing your data. You can also use compiled languages like C++,\n",
|
||
"Rust, Fortran etc if you prefer. The focus in these lectures will be\n",
|
||
"on Python.\n",
|
||
"\n",
|
||
"If you have Python installed (we recommend Python3) and you feel\n",
|
||
"pretty familiar with installing different packages, we recommend that\n",
|
||
"you install the following Python packages via **pip** as \n",
|
||
"\n",
|
||
"1. pip install numpy scipy matplotlib ipython scikit-learn sympy pandas pillow \n",
|
||
"\n",
|
||
"For **Tensorflow**, we recommend following the instructions in the text of \n",
|
||
"[Aurelien Geron, Hands‑On Machine Learning with Scikit‑Learn and TensorFlow, O'Reilly](http://shop.oreilly.com/product/0636920052289.do)\n",
|
||
"\n",
|
||
"We will come back to **tensorflow** later. \n",
|
||
"\n",
|
||
"For Python3, replace **pip** with **pip3**.\n",
|
||
"\n",
|
||
"For OSX users we recommend, after having installed Xcode, to\n",
|
||
"install **brew**. Brew allows for a seamless installation of additional\n",
|
||
"software via for example \n",
|
||
"\n",
|
||
"1. brew install python3\n",
|
||
"\n",
|
||
"For Linux users, with its variety of distributions like for example the widely popular Ubuntu distribution,\n",
|
||
"you can use **pip** as well and simply install Python as \n",
|
||
"\n",
|
||
"1. sudo apt-get install python3 (or python for Python2.7)\n",
|
||
"\n",
|
||
"If you don't want to perform these operations separately and venture\n",
|
||
"into the hassle of exploring how to set up dependencies and paths, we\n",
|
||
"recommend two widely used distrubutions which set up all relevant\n",
|
||
"dependencies for Python, namely \n",
|
||
"\n",
|
||
"* [Anaconda](https://docs.anaconda.com/), \n",
|
||
"\n",
|
||
"which is an open source\n",
|
||
"distribution of the Python and R programming languages for large-scale\n",
|
||
"data processing, predictive analytics, and scientific computing, that\n",
|
||
"aims to simplify package management and deployment. Package versions\n",
|
||
"are managed by the package management system **conda**. \n",
|
||
"\n",
|
||
"* [Enthought canopy](https://www.enthought.com/product/canopy/) \n",
|
||
"\n",
|
||
"is a Python\n",
|
||
"distribution for scientific and analytic computing distribution and\n",
|
||
"analysis environment, available for free and under a commercial\n",
|
||
"license.\n",
|
||
"\n",
|
||
"We recommend using **Anaconda** if you are not too familiar with setting paths in a terminal environment.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"### Exercise: making your own data and exploring scikit-learn\n",
|
||
"\n",
|
||
"We will generate our own dataset for a function $y(x)$ where $x \\in [0,1]$ and defined by random numbers computed with the uniform distribution. The function $y$ is a quadratic polynomial in $x$ with added stochastic noise according to the normal distribution $\\cal {N}(0,1)$.\n",
|
||
"The following simple Python instructions define our $x$ and $y$ values (with 100 data points)."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 40,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"x = np.random.rand(100,1)\n",
|
||
"y = 2.0+5*x*x+0.1*np.random.randn(100,1)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"1. Write your own code (following the examples under the [regression notes](https://compphysics.github.io/MachineLearning/doc/LectureNotes/_build/html/chapter1.html)) for computing the parametrization of the data set fitting a second-order polynomial. \n",
|
||
"\n",
|
||
"2. Use thereafter **scikit-learn** (see again the examples in the regression slides) and compare with your own code. \n",
|
||
"\n",
|
||
"3. Using scikit-learn, compute also the mean square error, a risk metric corresponding to the expected value of the squared (quadratic) error defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"MSE(\\boldsymbol{y},\\boldsymbol{\\tilde{y}}) = \\frac{1}{n}\n",
|
||
"\\sum_{i=0}^{n-1}(y_i-\\tilde{y}_i)^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and the $R^2$ score function.\n",
|
||
"If $\\tilde{\\boldsymbol{y}}_i$ is the predicted value of the $i-th$ sample and $y_i$ is the corresponding true value, then the score $R^2$ is defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"R^2(\\boldsymbol{y}, \\tilde{\\boldsymbol{y}}) = 1 - \\frac{\\sum_{i=0}^{n - 1} (y_i - \\tilde{y}_i)^2}{\\sum_{i=0}^{n - 1} (y_i - \\bar{y})^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where we have defined the mean value of $\\boldsymbol{y}$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\bar{y} = \\frac{1}{n} \\sum_{i=0}^{n - 1} y_i.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"You can use the functionality included in scikit-learn. If you feel for it, you can use your own program and define functions which compute the above two functions. \n",
|
||
"Discuss the meaning of these results. Try also to vary the coefficient in front of the added stochastic noise term and discuss the quality of the fits.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"### Exercise: Normalizing our data\n",
|
||
"\n",
|
||
"A much used approach before starting to train the data is to preprocess our\n",
|
||
"data. Normally the data may need a rescaling and/or may be sensitive\n",
|
||
"to extreme values. Scaling the data renders our inputs much more\n",
|
||
"suitable for the algorithms we want to employ.\n",
|
||
"\n",
|
||
"**Scikit-Learn** has several functions which allow us to rescale the\n",
|
||
"data, normally resulting in much better results in terms of various\n",
|
||
"accuracy scores. The **StandardScaler** function in **Scikit-Learn**\n",
|
||
"ensures that for each feature/predictor we study the mean value is\n",
|
||
"zero and the variance is one (every column in the design/feature\n",
|
||
"matrix). This scaling has the drawback that it does not ensure that\n",
|
||
"we have a particular maximum or minimum in our data set. Another\n",
|
||
"function included in **Scikit-Learn** is the **MinMaxScaler** which\n",
|
||
"ensures that all features are exactly between $0$ and $1$. The\n",
|
||
"\n",
|
||
"\n",
|
||
"The **Normalizer** scales each data\n",
|
||
"point such that the feature vector has a euclidean length of one. In other words, it\n",
|
||
"projects a data point on the circle (or sphere in the case of higher dimensions) with a\n",
|
||
"radius of 1. This means every data point is scaled by a different number (by the\n",
|
||
"inverse of it’s length).\n",
|
||
"This normalization is often used when only the direction (or angle) of the data matters,\n",
|
||
"not the length of the feature vector.\n",
|
||
"\n",
|
||
"The **RobustScaler** works similarly to the StandardScaler in that it\n",
|
||
"ensures statistical properties for each feature that guarantee that\n",
|
||
"they are on the same scale. However, the RobustScaler uses the median\n",
|
||
"and quartiles, instead of mean and variance. This makes the\n",
|
||
"RobustScaler ignore data points that are very different from the rest\n",
|
||
"(like measurement errors). These odd data points are also called\n",
|
||
"outliers, and might often lead to trouble for other scaling\n",
|
||
"techniques.\n",
|
||
"\n",
|
||
"\n",
|
||
"It also common to split the data in a **training** set and a **testing** set. A typical split is to use $80\\%$ of the data for training and the rest\n",
|
||
"for testing. This can be done as follows with our design matrix $\\boldsymbol{X}$ and data $\\boldsymbol{y}$ (remember to import **scikit-learn**)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 41,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# split in training and test data\n",
|
||
"# X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Then we can use the standard scaler to scale our data as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 42,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"scaler = StandardScaler()\n",
|
||
"scaler.fit(X_train)\n",
|
||
"X_train_scaled = scaler.transform(X_train)\n",
|
||
"X_test_scaled = scaler.transform(X_test)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In this exercise we want you to to compute the MSE for the training\n",
|
||
"data and the test data as function of the complexity of a polynomial,\n",
|
||
"that is the degree of a given polynomial. We want you also to compute the $R2$ score as function of the complexity of the model for both training data and test data. You should also run the calculation with and without scaling. \n",
|
||
"\n",
|
||
"One of \n",
|
||
"the aims is to reproduce Figure 2.11 of [Hastie et al](https://github.com/CompPhysics/MLErasmus/blob/master/doc/Textbooks/elementsstat.pdf).\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Our data is defined by $x\\in [-3,3]$ with a total of for example $100$ data points."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 43,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"np.random.seed()\n",
|
||
"n = 100\n",
|
||
"maxdegree = 14\n",
|
||
"# Make data set.\n",
|
||
"x = np.linspace(-3, 3, n).reshape(-1, 1)\n",
|
||
"y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $y$ is the function we want to fit with a given polynomial.\n",
|
||
"\n",
|
||
"\n",
|
||
"Write a first code which sets up a design matrix $X$ defined by a\n",
|
||
"fifth-order polynomial. Scale your data and split it in training and\n",
|
||
"test data.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Perform an ordinary least squares and compute the means squared error\n",
|
||
"and the $R2$ factor for the training data and the test data, with and\n",
|
||
"without scaling.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Add now a model which allows you to make polynomials up to degree\n",
|
||
"$15$. Perform a standard OLS fitting of the training data and compute\n",
|
||
"the MSE and $R2$ for the training and test data and plot both test and\n",
|
||
"training data MSE and $R2$ as functions of the polynomial\n",
|
||
"degree. Compare what you see with Figure 2.11 of Hastie et al. Comment\n",
|
||
"your results. For which polynomial degree do you find an optimal MSE\n",
|
||
"(smallest value)?"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.9.7"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
} |