4918 lines
601 KiB
Plaintext
4918 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",
|
||
" [2.08754672]\n",
|
||
"Coefficient beta : \n",
|
||
" [[4.86424078]]\n",
|
||
"Mean squared error: 0.22\n",
|
||
"Variance score: 0.90\n",
|
||
"Mean squared log error: 0.01\n",
|
||
"Mean absolute error: 0.36\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_13_1.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import numpy as np \n",
|
||
"import matplotlib.pyplot as plt \n",
|
||
"from sklearn.linear_model import LinearRegression \n",
|
||
"from sklearn.metrics import mean_squared_error, r2_score, mean_squared_log_error, mean_absolute_error\n",
|
||
"\n",
|
||
"x = np.random.rand(100,1)\n",
|
||
"y = 2.0+ 5*x+0.5*np.random.randn(100,1)\n",
|
||
"linreg = LinearRegression()\n",
|
||
"linreg.fit(x,y)\n",
|
||
"ypredict = linreg.predict(x)\n",
|
||
"print('The intercept alpha: \\n', linreg.intercept_)\n",
|
||
"print('Coefficient beta : \\n', linreg.coef_)\n",
|
||
"# The mean squared error \n",
|
||
"print(\"Mean squared error: %.2f\" % mean_squared_error(y, ypredict))\n",
|
||
"# Explained variance score: 1 is perfect prediction \n",
|
||
"print('Variance score: %.2f' % r2_score(y, ypredict))\n",
|
||
"# Mean squared log error \n",
|
||
"print('Mean squared log error: %.2f' % mean_squared_log_error(y, ypredict) )\n",
|
||
"# Mean absolute error \n",
|
||
"print('Mean absolute error: %.2f' % mean_absolute_error(y, ypredict))\n",
|
||
"plt.plot(x, ypredict, \"r-\")\n",
|
||
"plt.plot(x, y ,'ro')\n",
|
||
"plt.axis([0.0,1.0,1.5, 7.0])\n",
|
||
"plt.xlabel(r'$x$')\n",
|
||
"plt.ylabel(r'$y$')\n",
|
||
"plt.title(r'Linear Regression fit ')\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The function **coef** gives us the parameter $\\beta$ of our fit while **intercept** yields \n",
|
||
"$\\alpha$. Depending on the constant in front of the normal distribution, we get values near or far from $alpha =2$ and $\\beta =5$. Try to play around with different parameters in front of the normal distribution. The function **meansquarederror** gives us the mean square error, a risk metric corresponding to the expected value of the squared (quadratic) error or loss defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"MSE(\\boldsymbol{y},\\boldsymbol{\\tilde{y}}) = \\frac{1}{n}\n",
|
||
"\\sum_{i=0}^{n-1}(y_i-\\tilde{y}_i)^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The smaller the value, the better the fit. Ideally we would like to\n",
|
||
"have an MSE equal zero. The attentive reader has probably recognized\n",
|
||
"this function as being similar to the $\\chi^2$ function defined above.\n",
|
||
"\n",
|
||
"The **r2score** function computes $R^2$, the coefficient of\n",
|
||
"determination. It provides a measure of how well future samples are\n",
|
||
"likely to be predicted by the model. Best possible score is 1.0 and it\n",
|
||
"can be negative (because the model can be arbitrarily worse). A\n",
|
||
"constant model that always predicts the expected value of $\\boldsymbol{y}$,\n",
|
||
"disregarding the input features, would get a $R^2$ score of $0.0$.\n",
|
||
"\n",
|
||
"If $\\tilde{\\boldsymbol{y}}_i$ is the predicted value of the $i-th$ sample and $y_i$ is the corresponding true value, then the score $R^2$ is defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"R^2(\\boldsymbol{y}, \\tilde{\\boldsymbol{y}}) = 1 - \\frac{\\sum_{i=0}^{n - 1} (y_i - \\tilde{y}_i)^2}{\\sum_{i=0}^{n - 1} (y_i - \\bar{y})^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where we have defined the mean value of $\\boldsymbol{y}$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\bar{y} = \\frac{1}{n} \\sum_{i=0}^{n - 1} y_i.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Another quantity taht we will meet again in our discussions of regression analysis is \n",
|
||
" the mean absolute error (MAE), a risk metric corresponding to the expected value of the absolute error loss or what we call the $l1$-norm loss. In our discussion above we presented the relative error.\n",
|
||
"The MAE is defined as follows"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\text{MAE}(\\boldsymbol{y}, \\boldsymbol{\\tilde{y}}) = \\frac{1}{n} \\sum_{i=0}^{n-1} \\left| y_i - \\tilde{y}_i \\right|.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We present the \n",
|
||
"squared logarithmic (quadratic) error"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\text{MSLE}(\\boldsymbol{y}, \\boldsymbol{\\tilde{y}}) = \\frac{1}{n} \\sum_{i=0}^{n - 1} (\\log_e (1 + y_i) - \\log_e (1 + \\tilde{y}_i) )^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\log_e (x)$ stands for the natural logarithm of $x$. This error\n",
|
||
"estimate is best to use when targets having exponential growth, such\n",
|
||
"as population counts, average sales of a commodity over a span of\n",
|
||
"years etc. \n",
|
||
"\n",
|
||
"\n",
|
||
"Finally, another cost function is the Huber cost function used in robust regression.\n",
|
||
"\n",
|
||
"The rationale behind this possible cost function is its reduced\n",
|
||
"sensitivity to outliers in the data set. In our discussions on\n",
|
||
"dimensionality reduction and normalization of data we will meet other\n",
|
||
"ways of dealing with outliers.\n",
|
||
"\n",
|
||
"The Huber cost function is defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"H_{\\delta}(\\boldsymbol{a})=\\left\\{\\begin{array}{cc}\\frac{1}{2} \\boldsymbol{a}^{2}& \\text{for }|\\boldsymbol{a}|\\leq \\delta\\\\ \\delta (|\\boldsymbol{a}|-\\frac{1}{2}\\delta ),&\\text{otherwise}.\\end{array}\\right.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Here $\\boldsymbol{a}=\\boldsymbol{y} - \\boldsymbol{\\tilde{y}}$.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"We will discuss in more\n",
|
||
"detail these and other functions in the various lectures. We conclude this part with another example. Instead of \n",
|
||
"a linear $x$-dependence we study now a cubic polynomial and use the polynomial regression analysis tools of scikit-learn."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_27_0.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.005000000000000009\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import numpy as np\n",
|
||
"import random\n",
|
||
"from sklearn.linear_model import Ridge\n",
|
||
"from sklearn.preprocessing import PolynomialFeatures\n",
|
||
"from sklearn.pipeline import make_pipeline\n",
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"\n",
|
||
"x=np.linspace(0.02,0.98,200)\n",
|
||
"noise = np.asarray(random.sample((range(200)),200))\n",
|
||
"y=x**3*noise\n",
|
||
"yn=x**3*100\n",
|
||
"poly3 = PolynomialFeatures(degree=3)\n",
|
||
"X = poly3.fit_transform(x[:,np.newaxis])\n",
|
||
"clf3 = LinearRegression()\n",
|
||
"clf3.fit(X,y)\n",
|
||
"\n",
|
||
"Xplot=poly3.fit_transform(x[:,np.newaxis])\n",
|
||
"poly3_plot=plt.plot(x, clf3.predict(Xplot), label='Cubic Fit')\n",
|
||
"plt.plot(x,yn, color='red', label=\"True Cubic\")\n",
|
||
"plt.scatter(x, y, label='Data', color='orange', s=15)\n",
|
||
"plt.legend()\n",
|
||
"plt.show()\n",
|
||
"\n",
|
||
"def error(a):\n",
|
||
" for i in y:\n",
|
||
" err=(y-yn)/yn\n",
|
||
" return abs(np.sum(err))/len(err)\n",
|
||
"\n",
|
||
"print (error(y))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let us now dive into nuclear physics and remind ourselves briefly about some basic features about binding\n",
|
||
"energies. A basic quantity which can be measured for the ground\n",
|
||
"states of nuclei is the atomic mass $M(N, Z)$ of the neutral atom with\n",
|
||
"atomic mass number $A$ and charge $Z$. The number of neutrons is $N$. There are indeed several sophisticated experiments worldwide which allow us to measure this quantity to high precision (parts per million even). \n",
|
||
"\n",
|
||
"Atomic masses are usually tabulated in terms of the mass excess defined by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\Delta M(N, Z) = M(N, Z) - uA,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $u$ is the Atomic Mass Unit"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"u = M(^{12}\\mathrm{C})/12 = 931.4940954(57) \\hspace{0.1cm} \\mathrm{MeV}/c^2.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The nucleon masses are"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"m_p = 1.00727646693(9)u,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"m_n = 939.56536(8)\\hspace{0.1cm} \\mathrm{MeV}/c^2 = 1.0086649156(6)u.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In the [2016 mass evaluation of by W.J.Huang, G.Audi, M.Wang, F.G.Kondev, S.Naimi and X.Xu](http://nuclearmasses.org/resources_folder/Wang_2017_Chinese_Phys_C_41_030003.pdf)\n",
|
||
"there are data on masses and decays of 3437 nuclei.\n",
|
||
"\n",
|
||
"The nuclear binding energy is defined as the energy required to break\n",
|
||
"up a given nucleus into its constituent parts of $N$ neutrons and $Z$\n",
|
||
"protons. In terms of the atomic masses $M(N, Z)$ the binding energy is\n",
|
||
"defined by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(N, Z) = ZM_H c^2 + Nm_n c^2 - M(N, Z)c^2 ,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $M_H$ is the mass of the hydrogen atom and $m_n$ is the mass of the neutron.\n",
|
||
"In terms of the mass excess the binding energy is given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(N, Z) = Z\\Delta_H c^2 + N\\Delta_n c^2 -\\Delta(N, Z)c^2 ,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\Delta_H c^2 = 7.2890$ MeV and $\\Delta_n c^2 = 8.0713$ MeV.\n",
|
||
"\n",
|
||
"\n",
|
||
"A popular and physically intuitive model which can be used to parametrize \n",
|
||
"the experimental binding energies as function of $A$, is the so-called \n",
|
||
"**liquid drop model**. The ansatz is based on the following expression"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(N,Z) = a_1A-a_2A^{2/3}-a_3\\frac{Z^2}{A^{1/3}}-a_4\\frac{(N-Z)^2}{A},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $A$ stands for the number of nucleons and the $a_i$s are parameters which are determined by a fit \n",
|
||
"to the experimental data. \n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"To arrive at the above expression we have assumed that we can make the following assumptions:\n",
|
||
"\n",
|
||
" * There is a volume term $a_1A$ proportional with the number of nucleons (the energy is also an extensive quantity). When an assembly of nucleons of the same size is packed together into the smallest volume, each interior nucleon has a certain number of other nucleons in contact with it. This contribution is proportional to the volume.\n",
|
||
"\n",
|
||
" * There is a surface energy term $a_2A^{2/3}$. The assumption here is that a nucleon at the surface of a nucleus interacts with fewer other nucleons than one in the interior of the nucleus and hence its binding energy is less. This surface energy term takes that into account and is therefore negative and is proportional to the surface area.\n",
|
||
"\n",
|
||
" * There is a Coulomb energy term $a_3\\frac{Z^2}{A^{1/3}}$. The electric repulsion between each pair of protons in a nucleus yields less binding. \n",
|
||
"\n",
|
||
" * There is an asymmetry term $a_4\\frac{(N-Z)^2}{A}$. This term is associated with the Pauli exclusion principle and reflects the fact that the proton-neutron interaction is more attractive on the average than the neutron-neutron and proton-proton interactions.\n",
|
||
"\n",
|
||
"We could also add a so-called pairing term, which is a correction term that\n",
|
||
"arises from the tendency of proton pairs and neutron pairs to\n",
|
||
"occur. An even number of particles is more stable than an odd number. \n",
|
||
"\n",
|
||
"\n",
|
||
"### Organizing our data\n",
|
||
"\n",
|
||
"Let us start with reading and organizing our data. \n",
|
||
"We start with the compilation of masses and binding energies from 2016.\n",
|
||
"After having downloaded this file to our own computer, we are now ready to read the file and start structuring our data.\n",
|
||
"\n",
|
||
"\n",
|
||
"We start with preparing folders for storing our calculations and the data file over masses and binding energies. We import also various modules that we will find useful in order to present various Machine Learning methods. Here we focus mainly on the functionality of **scikit-learn**."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Common imports\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import sklearn.linear_model as skl\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error\n",
|
||
"import os\n",
|
||
"\n",
|
||
"# Where to save the figures and data files\n",
|
||
"PROJECT_ROOT_DIR = \"Results\"\n",
|
||
"FIGURE_ID = \"Results/FigureFiles\"\n",
|
||
"DATA_ID = \"DataFiles/\"\n",
|
||
"\n",
|
||
"if not os.path.exists(PROJECT_ROOT_DIR):\n",
|
||
" os.mkdir(PROJECT_ROOT_DIR)\n",
|
||
"\n",
|
||
"if not os.path.exists(FIGURE_ID):\n",
|
||
" os.makedirs(FIGURE_ID)\n",
|
||
"\n",
|
||
"if not os.path.exists(DATA_ID):\n",
|
||
" os.makedirs(DATA_ID)\n",
|
||
"\n",
|
||
"def image_path(fig_id):\n",
|
||
" return os.path.join(FIGURE_ID, fig_id)\n",
|
||
"\n",
|
||
"def data_path(dat_id):\n",
|
||
" return os.path.join(DATA_ID, dat_id)\n",
|
||
"\n",
|
||
"def save_fig(fig_id):\n",
|
||
" plt.savefig(image_path(fig_id) + \".png\", format='png')\n",
|
||
"\n",
|
||
"infile = open(data_path(\"MassEval2016.dat\"),'r')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Before we proceed, we define also a function for making our plots. You can obviously avoid this and simply set up various **matplotlib** commands every time you need them. You may however find it convenient to collect all such commands in one function and simply call this function."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from pylab import plt, mpl\n",
|
||
"plt.style.use('seaborn')\n",
|
||
"mpl.rcParams['font.family'] = 'serif'\n",
|
||
"\n",
|
||
"def MakePlot(x,y, styles, labels, axlabels):\n",
|
||
" plt.figure(figsize=(10,6))\n",
|
||
" for i in range(len(x)):\n",
|
||
" plt.plot(x[i], y[i], styles[i], label = labels[i])\n",
|
||
" plt.xlabel(axlabels[0])\n",
|
||
" plt.ylabel(axlabels[1])\n",
|
||
" plt.legend(loc=0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Our next step is to read the data on experimental binding energies and\n",
|
||
"reorganize them as functions of the mass number $A$, the number of\n",
|
||
"protons $Z$ and neutrons $N$ using **pandas**. Before we do this it is\n",
|
||
"always useful (unless you have a binary file or other types of compressed\n",
|
||
"data) to actually open the file and simply take a look at it!\n",
|
||
"\n",
|
||
"\n",
|
||
"In particular, the program that outputs the final nuclear masses is written in Fortran with a specific format. It means that we need to figure out the format and which columns contain the data we are interested in. Pandas comes with a function that reads formatted output. After having admired the file, we are now ready to start massaging it with **pandas**. The file begins with some basic format information."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"' \\nThis is taken from the data file of the mass 2016 evaluation. \\nAll files are 3436 lines long with 124 character per line. \\n Headers are 39 lines long. \\n col 1 : Fortran character control: 1 = page feed 0 = line feed \\n format : a1,i3,i5,i5,i5,1x,a3,a4,1x,f13.5,f11.5,f11.3,f9.3,1x,a2,f11.3,f9.3,1x,i3,1x,f12.5,f11.5 \\n These formats are reflected in the pandas widths variable below, see the statement \\n widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1), \\n Pandas has also a variable header, with length 39 in this case. \\n'"
|
||
]
|
||
},
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"\"\"\" \n",
|
||
"This is taken from the data file of the mass 2016 evaluation. \n",
|
||
"All files are 3436 lines long with 124 character per line. \n",
|
||
" Headers are 39 lines long. \n",
|
||
" col 1 : Fortran character control: 1 = page feed 0 = line feed \n",
|
||
" format : a1,i3,i5,i5,i5,1x,a3,a4,1x,f13.5,f11.5,f11.3,f9.3,1x,a2,f11.3,f9.3,1x,i3,1x,f12.5,f11.5 \n",
|
||
" These formats are reflected in the pandas widths variable below, see the statement \n",
|
||
" widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1), \n",
|
||
" Pandas has also a variable header, with length 39 in this case. \n",
|
||
"\"\"\""
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The data we are interested in are in columns 2, 3, 4 and 11, giving us\n",
|
||
"the number of neutrons, protons, mass numbers and binding energies,\n",
|
||
"respectively. We add also for the sake of completeness the element name. The data are in fixed-width formatted lines and we will\n",
|
||
"covert them into the **pandas** DataFrame structure."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Read the experimental data with Pandas\n",
|
||
"Masses = pd.read_fwf(infile, usecols=(2,3,4,6,11),\n",
|
||
" names=('N', 'Z', 'A', 'Element', 'Ebinding'),\n",
|
||
" widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1),\n",
|
||
" header=39,\n",
|
||
" index_col=False)\n",
|
||
"\n",
|
||
"# Extrapolated values are indicated by '#' in place of the decimal place, so\n",
|
||
"# the Ebinding column won't be numeric. Coerce to float and drop these entries.\n",
|
||
"Masses['Ebinding'] = pd.to_numeric(Masses['Ebinding'], errors='coerce')\n",
|
||
"Masses = Masses.dropna()\n",
|
||
"# Convert from keV to MeV.\n",
|
||
"Masses['Ebinding'] /= 1000\n",
|
||
"\n",
|
||
"# Group the DataFrame by nucleon number, A.\n",
|
||
"Masses = Masses.groupby('A')\n",
|
||
"# Find the rows of the grouped DataFrame with the maximum binding energy.\n",
|
||
"Masses = Masses.apply(lambda t: t[t.Ebinding==t.Ebinding.max()])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We have now read in the data, grouped them according to the variables we are interested in. \n",
|
||
"We see how easy it is to reorganize the data using **pandas**. If we\n",
|
||
"were to do these operations in C/C++ or Fortran, we would have had to\n",
|
||
"write various functions/subroutines which perform the above\n",
|
||
"reorganizations for us. Having reorganized the data, we can now start\n",
|
||
"to make some simple fits using both the functionalities in **numpy** and\n",
|
||
"**Scikit-Learn** afterwards. \n",
|
||
"\n",
|
||
"Now we define five variables which contain\n",
|
||
"the number of nucleons $A$, the number of protons $Z$ and the number of neutrons $N$, the element name and finally the energies themselves."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" N Z A Element Ebinding\n",
|
||
"A \n",
|
||
"4 0 1 3 4 Li 1.153760\n",
|
||
"5 2 3 2 5 He 5.512132\n",
|
||
"6 7 3 3 6 Li 5.332331\n",
|
||
"7 12 4 3 7 Li 5.606439\n",
|
||
"8 17 4 4 8 Be 7.062435\n",
|
||
"... ... ... ... ... ...\n",
|
||
"264 3297 156 108 264 Hs 7.298375\n",
|
||
"265 3303 157 108 265 Hs 7.296247\n",
|
||
"266 3310 158 108 266 Hs 7.298273\n",
|
||
"269 3331 159 110 269 Ds 7.250154\n",
|
||
"270 3337 160 110 270 Ds 7.253775\n",
|
||
"\n",
|
||
"[264 rows x 5 columns]\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"A = Masses['A']\n",
|
||
"Z = Masses['Z']\n",
|
||
"N = Masses['N']\n",
|
||
"Element = Masses['Element']\n",
|
||
"Energies = Masses['Ebinding']\n",
|
||
"print(Masses)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The next step, and we will define this mathematically later, is to set up the so-called **design matrix**. We will throughout call this matrix $\\boldsymbol{X}$.\n",
|
||
"It has dimensionality $n\\times p$, where $n$ is the number of data points and $p$ are the so-called predictors. In our case here they are given by the number of polynomials in $A$ we wish to include in the fit."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Now we set up the design matrix X\n",
|
||
"X = np.zeros((len(A),5))\n",
|
||
"X[:,0] = 1\n",
|
||
"X[:,1] = A\n",
|
||
"X[:,2] = A**(2.0/3.0)\n",
|
||
"X[:,3] = A**(-1.0/3.0)\n",
|
||
"X[:,4] = A**(-1.0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Note well that we have made life simple here. We perform a fit in\n",
|
||
"terms of the number of nucleons only. A more sophisticated fit can be\n",
|
||
"done by including an explicit dependence on the number of protons and\n",
|
||
"neutrons in the asymmetry and Coulomb terms. We leave this as an exercise to you the reader.\n",
|
||
"\n",
|
||
"With **Scikit-Learn** we are now ready to use linear regression and fit our data."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"clf = skl.LinearRegression().fit(X, Energies)\n",
|
||
"fity = clf.predict(X)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Pretty simple! \n",
|
||
"Now we can print measures of how our fit is doing, the coefficients from the fits and plot the final fit together with our data."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Mean squared error: 0.02\n",
|
||
"Variance score: 0.95\n",
|
||
"Mean absolute error: 0.05\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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qqr47Gc/W6rTf8DeMWwfPo1hi4jIOFeywN69ezdvvfUW3//+90kkEtx8880EAgEuv/zyA35NdXUUv//IwrS+PnHQ11MFQyjnw2/7qD+2gnB9+IjOM1Ecqr5kX6qv4VOdDY/qa3jKob5KFtixWIxZs2aRSBQr9ZRTTuG11147aGB3daWO6Fz19Qna2voO+p629iRWv4uLj+5CBrstf0TnmggOp75kL9XX8KnOhkf1NTwTqb4O9odHyWaJf+hDH6K7uxvHcYBii3vmzJmlOv0HFHIudhYsH/hiZTtZXkREPKJkLeyqqipuvvlmbr31Vqqrq+ns7OS6664r1ek/oNBbAMBELSzLGrNyiIiIHI6STtNetmwZy5YtK+UpD8jpKbb0TVytaxERGf/KNq3cZLGFjQJbREQ8oGzTyul1AbAU2CIi4gFlm1buQJe4WtgiIuIFZZtWJlkMbCuuRVNERGT8K9vAdvuKXeK+RNlWgYiIeEj5plX/QGCrhS0iIh5wyMD+05/+VIpylJybHghsLZoiIiIecMjrsP/u7/4O27a5/PLLueyyy2hoaChFuUZfxgDgi6qFLSIi498hm5fPPPMM//t//2+2bNnCxRdfzFe/+lWefPJJCoVCKco3elLFFratFraIiHjAYaXVhz/8YW6//XZeeOEFli1bxn333ce5557LP/3TP412+UZNob84SzxeHRzjkoiIiBzasJqXsViMv/zLv+RrX/saU6ZM4cEHHxytco0qY8xQYFeX+baaIiLiDYe9lviWLVv49a9/zeOPP86kSZO4/PLL+cQnPjGaZRtxm3f38OdNHZx3whTcvAE/JCpDY10sERGRQzpkYD/44IM8/PDDbN++nUsuuYR//dd/Zf78+aUo24h74o/bAHh8d5qZgB23tVOXiIh4wiED+5lnnuFLX/oSF1xwAdlslqamplKUa1RlevMABOMl3axMRETkiB1yDPtf//Vfueiii3j55Zf5+Mc/zg033ADA22+/zTXXXDPqBRxJFbHiBDM7V3wcrFBgi4iINxz2pLO77rqLhx56iIqKCgAWLlzI9u3bR61go6EqXhyvtrPFx+GKwBiWRkRE5PANa5Z4fX39Po+DQW9dEmUGbgcDO1qlwBYREW847MCOxWK0t7cPTdJauXIliURi1Ao2GowpRradK95GdQ22iIh4xGEP4t58881cffXV7Ny5kyuvvJJt27bx4x//eDTLNuIG8ho7CwG/D39My5KKiIg3HHZgL1q0iH//93/nzTffBOCkk04aGs/2CjPQKT6jKkZ9lauNP0RExDOGNU06kUhw3nnnjVZZRt1gC3tKLIodzGjjDxER8YxDBvYDDzxw0NevuOKKESvMaBscw2Zwa82IWtgiIuINhwzs73znO5x44onMnTu3FOUZVYN5TXpga011iYuIiEccMrBvvfVWHnnkETZu3MinPvUpLrnkEiorK0tRthG3N7CLLWwrqsAWERFvOGRgX3755Vx++eXs2LGDRx99lM997nPMnTuXa6+91nNrig92iZvBFra6xEVExCMOO7GmT5/OVVddxRe/+EVee+013n777dEs16h4fwvbp8u6RETEIw7ZwjbG8OKLL/Lwww+zceNGPvaxj/HLX/6S6dOnl6J8I8plsIXtAj61sEVExDMOGdjnnnvu0P7X1113HZZlkc1m2bRpEwDHHXfcYZ/ss5/9LKFQcT1vn8/Hz3/+8yMs9hEygGsga7CCYEW0taaIiHjDIQM7EAjQ1dXFvffey89+9rO9l0YBlmXx7LPPHvbJzjnnnKHdvsaCMWZopy4r6tNe2CIi4hmHDOzf//73I3ayDRs2sGLFCrLZLAsXLmTp0qUjduzD4ZqBjT8sS93hIiLiKYcM7H/+539m2bJlnHTSSUd9squvvppFixbhOA5XXHEFsViMU0899YDvr66O4vcf2cSw+voPbkwSCvkxlk0waBOrCe/3PeVKdTE8qq/hU50Nj+preMqhvg4Z2PPnz+ff/u3fuOWWWzjttNO44IILOOuss4bGoodj0aJFANi2zZIlS1i5cuVBA7urKzXsc0DxP66tre8Dz6fTeZyUQz7nkHEK+31POTpQfcn+qb6GT3U2PKqv4ZlI9XWwPzwO2S986aWXctddd/Gb3/yGj3zkIzz33HN8/OMf57rrruPhhx+ms7PzsAqxefNmfvWrXw09bmpqKvlMc4PBlwcssMIavxYREe847M0/gsEg5513Hueddx7GGFavXs0zzzzDz372M5544olDfn08Huf555+ntbWVZDLJ5MmT+cQnPnFUhR8uY8AugAX4QhrDFhER7xjWbl2DLMti8eLFLF68mJtvvvmwvqahoYEf/vCHR3K6EWOMwVco3reCamGLiIh3lFUz0xjw5Q1gYamF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ySefzHPPPTe2hRqHNmzYwIoVK1i+fPlQ/Tz//POcdNJJQLHenn/++TEs4di76KKLiMVi+zz33HPPDdXRvHnzWLduHclkkhdffJETTzwRy7IAOOmkk3jhhRdKXuaxtL/6AnjggQe49957+eEPf0h3dzeA6gtYtGgRF1544dBj13WJRCIH/Dn8wx/+wOLFiwHw+/3MmjVrn5blRHeg+gL48Y9/zL333suKFStIp9PAxK6vCdMl3tHRsc8vjXg8TkdHxxiWaHy6+uqrWbRoEY7jcMUVVxCLxfapu3g8Tk9PD4VCAb9/wnx7HLUDfX91dnbu8/xgfZa7U089laVLl1JTU8Pzzz/PN77xDX7+85+rvt7n6aef5uyzz2b27NkH/Dns7Oxk1qxZQ18Tj8fp7OwcqyKPqffW10UXXcS0adOIRqM88MADfOc73+HWW2+d0PU1YVrYtbW19Pf3Dz1OJpPU1taOYYnGp0WLFgFg2zZLlixh5cqV+9RdMpmksrJSYf0+B/r+qqmp2ef5/v5+fd8B06dPp6amBoAPf/jDvP766ziOo/p6j1dffZWVK1fyzW9+E+CAP4fvr7NkMjlUt+Xk/fU1Z84cotEoUPwee/XVVwEmdH1NmMBevHgxu3fvJpfLAfDmm2+ydOnSsS3UOLN582Z+9atfDT1uampi+vTpnHfeeaxatQoo1tt55503VkUct5YuXTpUR+vXr2f+/PnE43HOOecc3n33XczAkvyrVq3i3HPPHcuijgt33HEHhUIBgG3btjFt2jRs21Z9DXjuued46aWX+Na3vkVbWxurVq064M/h0qVLeeuttwDI5/Ns2bKFU089dayKPib2V1+333770OtNTU3MmDEDmNj1NaE2//jjH//Ik08+SXV1NYFAQLPE36elpYXvfOc7HH/88SSTSQqFAn//939Pb28v3/ve95g6dSo7duzgb//2b8t6lvhrr73Go48+yosvvsjnP/95vvzlLwNw++23U19fz/bt2/na1762zyzxd955B9u2mTlzZtnNet5ffT344INs3LiRxsZGNmzYwBe/+MWhccVyr6933nmHK6+8kgULFgCQSqW44oorOP/88w/4c3jPPffQ29tLT08P55577sSZ9XwYDlRfW7duJZ1OU1tby4YNG/j6178+9DM5UetrQgW2iIjIRDVhusRFREQmMgW2iIiIByiwRUREPECBLSIi4gEKbBEREQ9QYIuIiHiAAltERMQDFNgiHvX6668zb948HnnkkaM+1p/+9CfmzZvHj370o6HnVq1axcc+9rGjOu73v/99PvnJT+7zb/78+fzd3/3d0RZZpOwosEU8yHVdvvvd7/LhD3+YtWvXHvXx3n33XRYtWsTTTz+9z3MnnHDCAb/m/PPPP+Rxb7rpJh577LGhf2eccQazZ8/mlltuOeoyi5QbBbaIB/3yl79kxowZfOELX2DdunVHfbw1a9Zw6aWXkk6n2bFjB1AM7BNPPPGojz3ojjvu4LnnnuO+++6bMJsxiJSStmQS8Zje3l5+8pOf8MADD5DP51m/fv1+3/f1r3+dpqam/b724IMPEg6Hhx6vWbOGz3zmMyxbtoynn36aL3/5y6xZs4ZPfvKTI1LmH/zgBzz55JPcf//91NfXj8gxRcqNAlvEY5YvX85ll13GtGnTcF2XXC7Hnj17mDJlyj7vu+uuuw7reNlslq1bt3L88ccTDAa59dZb+au/+is2b978gS7xa665hj179gDQ2to6FOi2bfPwww/v9/g/+tGPePzxx/nFL35BQ0PDcD+uiAxQYIt4yObNm/nlL39JVVUVjz/+OFDcQnDt2rUfCOzDbWGvW7eOxsZGYrEYCxcupKWlhZdeeonJkydTUVGxz9f95Cc/Gbp//vnn89hjjx20vCtWrOChhx7i/vvv/0D5RGR4FNgiHnLrrbfy7W9/m09/+tNDz33rW99i3bp1H5gEdrgt7PeOVVuWxfnnn89dd9110Alnh+NnP/sZv/jFL/jFL35BY2PjUR1LRBTYIp7x7LPP0trayqc+9al9np8zZw5vvvnmER93zZo1+4TzsmXL+MUvfnFUl3Rt3bqV22+/nUmTJnHDDTfs89p1113HRz7ykSM+tki50n7YIiIiHqDLukRERDxAgS0iIuIBCmwREREPUGCLiIh4gAJbRETEAxTYIiIiHqDAFhER8QAFtoiIiAf8/4DBbA/qVQNEAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<Figure size 576x396 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_57_1.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# The mean squared error \n",
|
||
"print(\"Mean squared error: %.2f\" % mean_squared_error(Energies, fity))\n",
|
||
"# Explained variance score: 1 is perfect prediction \n",
|
||
"print('Variance score: %.2f' % r2_score(Energies, fity))\n",
|
||
"# Mean absolute error \n",
|
||
"print('Mean absolute error: %.2f' % mean_absolute_error(Energies, fity))\n",
|
||
"\n",
|
||
"Masses['Eapprox'] = fity\n",
|
||
"# Generate a plot comparing the experimental with the fitted values values.\n",
|
||
"fig, ax = plt.subplots()\n",
|
||
"ax.set_xlabel(r'$A = N + Z$')\n",
|
||
"ax.set_ylabel(r'$E_\\mathrm{bind}\\,/\\mathrm{MeV}$')\n",
|
||
"ax.plot(Masses['A'], Masses['Ebinding'], alpha=0.7, lw=2,\n",
|
||
" label='Ame2016')\n",
|
||
"ax.plot(Masses['A'], Masses['Eapprox'], alpha=0.7, lw=2, c='m',\n",
|
||
" label='Fit')\n",
|
||
"ax.legend()\n",
|
||
"save_fig(\"Masses2016\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"As a teaser, let us now see how we can do this with decision trees using **Scikit-Learn**. Later we will switch to so-called **random forests**!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAesAAAFpCAYAAAC8iwByAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABMiElEQVR4nO3dd3hUVf7H8feU9N5IQu+IdEFUUAmKChYEewF11XXVVde21l3Lzwauuq7gqqy6upa1LAJixQKiIsWGhN4JPT2Z1Cnn98eQgUBCCCQzmczn9Tw8ZGZu+d5Dwifn3nPvsRhjDCIiItJiWQNdgIiIiBycwlpERKSFU1iLiIi0cAprERGRFk5hLSIi0sIprEVERFo4e6ALEGlO33//PU8++SSrVq3i2GOPxRhDZWUlo0eP5qqrriIsLOyItv/jjz/yz3/+k1dfffWgy82ePZuFCxfy2GOPHdH+9jd69GjS0tIA2LBhA8YYunXrBkBubi6fffZZk+5vfzNnzuTFF19k69atDBo0CJfLRV5eHiNGjOC+++7Dag2O/sA555zD1KlT6dSpU6BLEamTRfdZS2u3aNEirrjiCpYvX47dbqewsJA777wTm83Giy++eESBYozB4XAQFxd30OXcbjeVlZXExMQc9r7qMnHiRN544w0A7rnnHlwuF0899dQBnzWnDz74gGeffZb58+cDkJOTw5lnnsnDDz/Meeed1+z7bwolJSXEx8cHugyRegXHr70iTSgpKYlJkyaxaNEiPvzwwyPalsViaTCoAWw2W5MHNcDtt99+WJ81pw4dOtCjRw+ys7MDsv/DoaCWlk6nwSUkpaWlceKJJ/LZZ58xbtw4wHtK9+233yY8PJz09HQefvhhYmNjAe/p9ClTphAWFobH42HChAkcd9xxXH/99SxdupTVq1cD8O677zJ9+nSioqKIjIzkrrvuwuVycdddd1FaWsrXX38NQF5eHg8//DAFBQU4nU4uvfRSxo8fz/bt27n11ltZunQpkyZNYtasWezYsYMnnniCY4455oDjGDRoUL3HOGjQIN59911eeuklBgwYQExMDMuWLSM+Pp433niDb7/9lqlTpxIWFkZsbCwPP/ww6enpAGRnZ/PEE09gsViw2Ww88MADvtPrh8LtdpORkeF7fbDtLVu2jAcffJDw8HB69erFmjVrKCws5M9//jPffvstH330ERMmTGDdunVkZ2dz/vnnc/PNN/Pyyy8zZ84c7HY7vXv35u677yY8PJz169fz8MMPA+Byubjgggs477zzyMvL45577qGqqgqXy8XIkSO57rrrmDRpEv/73/+47777fGcCar4XwsLCSEpK4qGHHiI1NZWpU6fy3//+lzPOOIPS0lJWrlxJnz59mDx58iG3jchhMSKt3MKFC03Pnj2N0+ms9f5jjz1mxowZY4wx5scffzRDhw41+fn5xhhjJk2aZO677z5jjDFbtmwxgwYNMhs3bjTGGLN06VIzYcIEY4wxOTk5pmfPnsYYYxwOhxk6dKipqqoyxhjz2muvmenTp/tqGDlypG/fV155pXnuueeMMcbk5+eb4cOHmyVLltTa5scff2yMMWbatGnm6quvbvA47777bnPHHXcc8P5zzz1nhg0bZvLz843b7TZPPvmk2bJlixk4cKBZv369McaYN99801x55ZXGGGNKSkrMcccdZxYsWGCMMWbu3Lnm9NNPN263u879Tp8+3Zx00km+1ytWrDA333yzKS0tbXB7VVVV5uSTTzazZ8/2rdu7d29fuxljzIQJE8zvfvc743K5zPr16817771nZs2aZUaPHm3Ky8uNx+Mxt9xyi3n++eeNMcbccsstvrbbvXu3ueaaa4wxxkyePNm89NJLxhhjysrKzCWXXFJrHzX7XLJkiTn++ON93wvPP/+8ueKKK2q187nnnmuqqqpMZWWlGTp0qPn5558b+NcROTI6DS4hy+Px+L6eMWMGp5xyCsnJyYB3wNHs2bMxxvDRRx/Rt29fOnfuDED//v259dZbD9iezWYDvL2yiooKLr/8cs4+++wDltu1axc//PAD559/PgDJyclkZWUxffr0WsudfPLJAPTq1YutW7ce0bEOHDiQ5ORkrFYrf/7zn33H1LVrVwDOPvtsfvjhB3bv3s3cuXOJjo7mhBNOACArK4u8vDyWLl1a7/YLCgqYOHEiY8eO9R13zVmJg23v119/JT8/nzFjxgDQu3fvOnvwI0aMwGaz0bVrVy688EJmzJjBWWedRVRUFBaLhbPPPptZs2YBkJCQwGeffcbWrVtJS0tjypQpACQmJvLtt9+ydu1aoqOj6x0UOHPmTLKysnzfC+effz4LFy5k+/btvmWOO+44wsPDiYiIoFOnTkf87yPSEJ0Gl5C1bds2Onbs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63K5sTfhRBs/zliM47xyCmLyOM9xQZNtV0REpLk12LN+6623uPzyywHo1q0b3bp18332/vvvc+GFFx7yzvr37w+AzWZjyJAhLFq0qN6wLiwsP+Tt7istLY7c3NID3i/KL8OOBWPx1Pl5KKuvzaRuaq/GUXs1ntqscVpTe6Wl1T0WrMGwfv311/n555/r/Gz58uWHHNbr16/n559/9i2/efNmRo0adUjrNgV3tRM74RhdsxYRkSDTYFgnJSXx22+/cfbZZ2Oz1T4tvWXLlkPeUWxsLN988w27d+/G4XCQkZHBOeec0/iKD5PH5b1WrfusRUQk2DQY1u+++y7ff/89H374IUOHDmXcuHG+0O7bt+8h7yg9PZ2pU6cefqVHyFXtBCI1wExERILOIT0UZfjw4UyePJm2bdty//338/777+Nyufw6mvtIedwaDS4iIsHpkJ9gBt4R4HfccQczZ87kmmuuaa6amoW7uiasdc1aRESCyyGH9e7du3n00Uc5/fTTycjI4IEHHmjOupqcrlmLiEiwavCa9a5du5g2bRoffPABp512GtOnT/fdX71p0yY6d+7c3DU2Cd9DUVDPWkREgkuDYT1q1CgyMzO599576dy5M/n5+eTn52OM4Y033mDKlCn+qPOIeZx7ng2u+axFRCTINBjWgwYNYvz48QBs27at1mcOh6N5qmoGZs9pcIPCWkREgkuDYX3DDTdwwgkn1PlZly5dmryg5qJng4uISLBqcIBZfUENMHDgwKaspVkZd80AM12zFhGR4NJgWH///fcNbqRmco+WzF1zGlxhLSIiQabBsP7iiy8a3MjcuXObpJjmVNOz1mlwEREJNg1es37nnXd49913ATDGYLFYfJ/VvB4wYEDzVdhEPHuuWaNbt0REJMgc0q1bNc/0rqqqIiIiotmLag57r1mrZy0iIsGlwdPg+96udemll9b67LXXXmvygppLTVija9YiIhJkGgxrY/aGm8dTu1c6a9aspq+omRiPrlmLiEhwajCs971Gve/XUDvIWzqP21urHjcqIiLBpsFr1ps3b+a+++6jX79+VFRU4HQ6CQsLAw4M75Zs72hwhbWIiASXBsN62rRprFixgqVLlxIWFsbgwYNp27YtPXv2ZNeuXf6osUkorEVEJFg1GNZDhgxhyJAhvtfV1dWsWrWK5cuXk5CQ0KzFNSnPntPgumYtIiJBpsGw3l94eDj9+/enf//+zVFPs/F41KMWEZHg1OAAs1ZDo8FFRCRIhUxYmz2jwXWftYiIBJvQCWuPbt0SEZHgFHphHTx3m4mIiAAhFNY1o8F1GlxERIJN6IT1nozWfdYiIhJsQias954GV1iLiEhwCZmw9p0G1wAzEREJMiEU1t6/1LMWEZFg49ewrqys5JxzzmHy5Mn+3K1XzQxhGg0uIiJBxq9h/eyzz3L00Uf7c5c+RmEtIiJBym9hPXPmTI455hjat2/vr13WVvOUUZ0GFxGRINPoiTwOx7p169iwYQO33347q1evPqR1kpKisdtth7W/tLS4A96z1sy9ba3781CnNmkctVfjqL0aT23WOK29vfwS1l988QXh4eFMmzaNn376CafTyWuvvcZVV11V7zqFheWHta+0tDhyc0sPeN/j2vu40bo+D2X1tZnUTe3VOGqvxlObNU5raq/6funwS1jfcMMNvq+rqqooLy8/aFA3K12zFhGRIOPXAWaff/45S5Ys4ddff+Wjjz7y5673uXXLv7sVERE5Un7pWdc444wzOOOMM/y5y718A8wCs3sREZHDFToPRamhsBYRkSATMmHtu2NLYS0iIkEmZMLa1JwGD5kjFhGR1iJkostSM7JMPWsREQkyIRPWPgprEREJMqET1mbvE8xERESCSchE194BZupai4hIcAmZsKZm0q3QOWIREWklQia69g4wU89aRESCS8iEdU3POoSOWEREWonQia49PWuLVT1rEREJLiET1joNLiIiwSp0whr1rEVEJDiFTFjrPmsREQlWIRNdFt8165A5ZBERaSVCJrl816xtOg0uIiLBJWTCuuah4BYNMBMRkSATMmHtOw2unrWIiASZ0AtrXbMWEZEgEzLJpZ61iIgEq5AJa981a/WsRUQkyIRMclmM91DVsxYRkWATQmFdcxo8ZA5ZRERaiZBJLl2zFhGRYBU6Yb3nUK02W4ArERERaZzQCes9PWurToOLiEiQCZnk8oW1PWQOWUREWgm7v3bk8Xi4/vrr6d+/P06nk5ycHB5//HEiIyP9sv+a0eDo1i0REQkyfk2ugQMHctNNN3HbbbdRUVHBnDlz/LbvmvmsbXZdsxYRkeDit7C2Wq3ceOONALhcLnbt2kWXLl38tfu991nrNLiIiAQZv50Gr/Htt9/y2muvkZWVRb9+/fy235pr1upZi4hIsLEYY0wgdnzXXXcxYMAALr/88jo/d7nc2JswWN9IfYUO+d0ofjCXcx+6sMm2KyIi0tz81rNet24dW7duJSsrC4D27duzdevWepcvLCw/rP2kpcWRm1t6wPvWPafBq5yeOj8PZfW1mdRN7dU4aq/GU5s1Tmtqr7S0uDrf91tYh4eH87///Y8VK1bgcrlYv349f/nLX/y1e981a926JSIiwcZvYd2xY0emTp3qr90doCas7eF+v0wvIiJyREKmm+m7dStMA8xERCS4hExY11yzRo8bFRGRIBMyyVVz65Y9IizAlYiIiDROCIW19/S37rMWEZFgE0JhXdOz1gAzEREJLiET1lbfrVvqWYuISHAJmbD2PW40IjzAlYiIiDROyIS1dc81a3tYyByyiIi0EiGTXLpmLSIiwSpkwrrmmrUtXNesRUQkuIRMWPseN6pr1iIiEmRCJqytnj1hHabT4CIiElxCJ6xretZReoKZiIgEl5DpZvrCOkxhLSLSnFasyOaf/3wOl8vFscceR1VVFQATJ/6OuLi652sGeO+9t7noosv8VWZQCZmedc1o8PBoXbMWEWlORx/dl0GDBtO3b3+uueYP3HjjLQwaNJg//el6XC5Xveu9995//VhlcAmJnrXb5cZWc5+1bt0SkRBy2WVRfPll0/6/N2qUi7ffrmjUOiecMJx///tfLFr0AzNn/o8BAwaxZctmTjttNMceexxfffUFDkcpr7zyEp06dWbYsJN48MF7D1guVIVEcnncHu/feDSRh4hIgGRkZLJ9+zYuuugyjj32OEpKirn99ps59tjjOPXU03jhhee45po/AFBZWVnncqEqJMK6urwaAGMxAa5ERMS/GtsDbk47d+5g9Oiz+OWXn1i+fBk2m52iosI6lzXGHNJyoSIkrlm7qp0AuK3uAFciIhKaFi9eSHV1NVu35pCXl8tVV13LJZdcXmsZq9WKMYa1a9cwe/bMepcLRSHRs3ZVqGctIuIvq1atYOnSX3A6nbz22stUVVXhcrl47rkXKCwsZN68r3j++X8QHx+Pw+Fg3ryvyMo6lWHDTmTq1GcBGDt2fL3LhSKLMaZFJlhubulhrZeWFnfAurvW7iBv+HYqwioYsu3EpiivVamrzaR+aq/GUXs1ntqscVpTe6Wl1X1rW2icBq+q6Vl7AlyJiIhI44VEWLurvdeqPQprEREJQiER1s5K7wAz9axFRCQYhURYu5177rO2KqxFRCT4hERY19y6ZWiRY+lEREQOKiTC2uPUNWsREQleIRHWripdsxYRkeDlt7DesmULt99+Oy+//DKPPvooU6dO9deucVV7Z3lRz1pEpPVZs2YNt9xyPZ98Mvuwt/Hee2/7vp4z51NGjx55WNvZsWM7l112PjfddB033XQdU6b8/bBr2pffnmBWVFTEmWeeyahRowA488wzycrKom/fvs2+b4/LexpcTzATkVATf9kFRHw5p0m3WTXqdEre/l+TbvNI9OzZkwEDBh3RNt5777++ubRPP30M06b987C3NWHCVZx55jlHVM/+/BbW/fv3r/Xa4/EQFRXll3179vSsdRpcRKT5ffzxh7z00vNccsnlrF+/lqKiYs488xwWL/6BrVtzePLJvzNnzmds3Lie5OQUdu7cwZ133svGjet5+unJREVFcf/9D3HXXbcxduw4xo27oM79vPHGa2zatIH+/fuwadNGMjPbArBhw3reeut1unXrzubNm7jiiqux2ez84x9/w+l00rdvf3JyNtO5czcmTryKWbM+8E3P2adPP44/fhgA77zzJqtXr6KszMETTzyNzWZj5szpzJ8/74Ba+vTp65sx7Pvv51NUVIjD4eC000bTpUvXI29UEwBz5swxjzzyyEGXcTpdTbe/f3xi5jLX/DfxP022TRERqd+ECRPMggULjDHG3HDDDea9994zxhjzyCOPmM8++8x89dVXxu12+96bO3euMcaYvLw8c8YZZ5j//Oc/5sMPP6x3+6tXrzZjxozxvb7jjjvM9OnTjTHGXHTRReann34yxhizcOFCc+ONNxpjjJk+fbq54447fOuMGTPGrF692hhjzMiRI2ttf+TIkWbjxo3GGGOuu+46s2zZskM67rKyMrNmzRpjjDG5ublm5MiRpri4+JDWPRi/T+SxcOFCFi1axH333XfQ5QoLyw9r+3U9I7aksIwUovBYPK3m+bFNqTU9V9cf1F6No/ZqvNbQZtXVLmJiksnNLSU8PIr4+FRyc0ux2yPZuTOfNm3Sefjhx0hISGTFitV06NB1zzGHM3HiNbzwwnO8996setvh55+zychoS25uKWlpcaSkpFNaWklubimrVq1izpyvmTfve6qrq7DZwsjNLaW0tJKUlHTfNtPT2/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",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/opt/homebrew/lib/python3.9/site-packages/sklearn/neural_network/_multilayer_perceptron.py:692: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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Ht9XaGgoXbt2JS4ujrJlyzJ48GCOHj1K0aJFcTgcGescPHgQgMTExIwhQYfDQdGiRTly5Mhl1aE5WCIiImLK5cXzYLVv356WLVtesNwsvYqPj2f48OFZllWpUoWZM2dmXH7++ed5+OGHefPNNy+4vc128Tlmdvvl1a4OloiIiOQblzMUGBkZSWRkZJZlx48fZ+bMmTz77LMAuN1uHA4HJUuW5MSJEzidTvz8/EhKSiIsLAyAsLAwDh06RJkyZUhPT+fEiROUKFHisurQEKGIiIiYcmL32p9VihQpwgcffMCWLVsAmDNnDo888gj+/v7UrFmTxYsXA8aRhg899BAAERERxMbGArB48WJq1qx5WfOvQJPcpYDTJPcrl74dypXM25PcP/7jHq9tq+3131l2X5s2bSI6OpozZ85QqVIlRo0aRbFixfjnn3+Iiori8OHDlC1blrfffpvixYtz7NgxoqKi2LNnD8WKFSMmJoYKFSpc1rbVwZICTR2sK5c6WHIlUwcr/9McLBERETFVUE806kv6EigiIiJiMSVYIiIiYko/9uy5At/B8tdOv6L5X+Gptb/tyn3+p7mv5BloV/a+FykICnwHS0RERPKW04snGi0s9IiJiIiIWEwJloiIiJhycYXPx7gMSrBERERELKYES0RERExpDpbn9IiJiIiIWEwJloiIiJiy8keYrxR6xEREREQspgRLRERETLn0W4QeU4IlIiIiYjElWCIiImJKc7A8p0dMRERExGLqYImIiIhYTEOEIiIiYsqlE416TI+YiIiIiMWUYImIiIgpp37s2WNKsEREREQspgRLRERETGkOluf0iImIiIhYTAmWiIiImNIcLM8pwRIRERGxmBIsERERMaU5WJ7TIyYiIiJiMSVYIiIiYsqpBMtjesRERERELKYES0REREy5dBShx5RgiYiIiFhMCZaIiIiY0hwsz+kRExEREbGYEiwREREx5XJrDpanlGCJiIiIWEwdLBERERGLaYhQRERETDmVx3hMj5iIiIiIxZRgeWjeFw7mxzoIDIBKFV307JZK8RA4kwKjxwXwyw47LhfcerOLnq+lEhTo6xZb62L1A3wW62DhYgcpKXDTjS769kwlIMC37c0ptxuGjAygSmUXTz+Rnqv7OnoM3hoeyP6DNuw26P1GKrdVcwEQv8yPOXP9sdkgKMjNG13TuLmq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ihUrApCUlERYWBjh4eEZE+HPX25Gc7BERETkihIREUFsbCwAixcvpmbNmvj7+xMREUFcXBwAmzZtIjAwkHLlyvHQQw+xaNEinE4nu3fvZteuXVSvXt10G0qwRERExFRhOw9Wt27diIqKonHjxhQrVoyYmBgAnnnmGQYMGEDjxo0JCAhg1KhRADRs2JCtW7dmTICPjo4mKCjIdBs2d3YDiwXIsX3X+LoJIj7jbytcb3qeSHO7fN0En7qS973AVWV3e3V7T6zv5LVtfVr7Pa9tKy/pFSoiIiJiMQ0RioiIiClvTnIvLJRgiYiIiFhMCZaIiIiY8uaJRgsLJVgiIiIiFlOCJSIiIqY0B8tzSrBERERELKYES0REREwpwfKcEiwRERERiynBEhEREVNKsDynBEtERETEYkqwRERExJQSLM8V+A5WiD3Y100QER8I1vu9iORjBb6DJSIiInlLZ3L3nOZgiYiIiFhMCZaIiIiY0hwszynBEhEREbGYOlgiIiIiFtMQoYiIiJjSEKHnlGCJiIiIWEwJloiIiJhSguU5JVgiIiIiFlOCJSIiIqaUYHlOCZaIiIiIxZRgiYiIiCm3EiyPKcESERERsZgSLBERETGlH3v2nBIsEREREYspwRIRERFTOorQc0qwRERERCymBEtERERM6ShCzynBEhEREbGYEiwRERExpTlYnlOCJSIiImIxdbBERERELKYhQhERETGlSe6eU4IlIiIiYjElWCIiImJKk9w9pwRLRERExGJKsERERMSU2+3rFhQ8SrBERERELKYES0REREy50BwsTynBEhEREbGYEiwRERExpfNgeU4JloiIiIjFlGCJiIiIKZ0Hy3PqYF1EwnoY+z6kpkHVKjC0FxS9Kus6C5fC9Llgs0FQIPR9FardBKmpED0BNvwAVwVDnfugSwewF6C8MCf1f/QFfBJn1H9tORjcE0pdDceS4a234dc/IDgIHouEpx/3TR2XKzf1O50wZBxs2mKs99C90PNlY72CIDfP/ejxsGlr5noHkyC0FMTN8G4NuXGp+mO/hlnzMy8fP2HUufIzKF0S7msG4aGZ13dsA00f8V77cysn+/+c5d9C1DDYFG9cdrlgzBRYtQHsNqhYAd7qASVLeK35uZar9/404zWw+exr4MF7oEcn8PPzfh3iewXoI997jhyDviNg/BCInwMVyhlv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5plnGDBgAI0bNyYgIIBRo0YB0LBhQ7Zu3UqzZsZp+6OjowkKCjLd/iUnued3muQuIiJXGm9Pcr9ujPcmue9843WvbSsvaYhQRERExGIaIhQRERFzBXqsyzeUYImIiIhYTAmWiIiImPLmaRoKCyVYIiIiIhZTgiUiIiLm3DZft6DAUYIlIiIiYjElWCIiImJOc7A8pgRLRERExGJKsERERMSUjiL0nBIsEREREYspwRIRERFzSrA8pgRLRERExGJKsERERMSU5mB5TgmWiIiIiMWUYImIiIg5JVgeU4IlIiIiYjF1sEREREQspiFCERERMachQo8pwRIRERGxmBIsERERMaXTNHhOCZaIiIiIxdTBEhEREbGYOlgiIiIiFtMcLBERETGnOVgeU4IlIiIiYjElWCIiImJKRxF6TgmWiIiIiMWUYImIiIg5JVgeU4IlIiIiYjElWCIiImJOCZbHlGCJiIiIWEwJloiIiJjSUYSeU4IlIiIiYjF1sEREREQspiFCERERMachQo8pwRIRERGxmBIsERERMaVJ7p5TgiUiIiJiMSVYIiIiYk4JlseUYImIiIhYTAmWiIiImFOC5TElWCIiIiIWU4IlIiIipnQUoeeUYImIiIhYTAmWiIiImFOC5TElWCIiIiIWU4IlIiIi5pRgeUwJloiIiIjFlGCJiIiIKR1F6DklWCIiIiIWUwdLRERExGIaIhQRERFzGiL0mBIsEREREYspwRIRERFTmuTuOSVYIiIiIhZTgiUiIiLmlGB5TAmWiIiIiMWUYImIiIg5JVgeU4IlIiIiYjElWCIiImLK5usGXKbNmzczbNgw0tPTKVGiBMOGDaN8+fJs3LiRLl26UKZMGQBuueUWhg8fTnJyMj169GDPnj2ULFmScePGERoaSmpqKn379mX79u0EBQURExPDddddZ7ptJVgiIiJSKPXs2ZPo6Gji4uJo2rQpQ4cOBWDbtm107NiRuLg44uLiGD58OADjxo2jZs2axMfH07p1a6KjowGYPXs2wcHBxMfH06dPH6Kioi65bXWwRERExJzbe3/Jycns3bv3gr/k5GSPmpyamkq3bt246aabAKhatSr79+8HjA7W2rVradGiBZ06dcpYnpCQQNOmTQFo0qQJq1evJi0tjYSEBJo1awZArVq1OHr0KPv27TPdvjpYIiIikm/MmjWL+vXr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W3nJax2sc+bPn098fDzTp0+35P7yqoMlIiKSX6mDlf95fYS4devWtG7d2tubFRERkctViOZGeYvOgyUiIiJiscJ0jIOIiIjkAW/+VE5hoQRLRERExGJKsERERMScEiyPKcESERERsZgSLBERETGlOVieU4IlIiIiYjElWCIiImJOCZbHlGCJiIiIWEwJloiIiJhTguUxJVgiIiIiFlMHS0RERMRiGiIUERERUzpNg+eUYImIiIhYTAmWiIiImFOC5TElWCIiIiIWU4IlIiIipmxuRVieUoIlIiIiYjElWCIiImJOAZbHlGCJiIiIWEwJloiIiJjSebA8pwRLRERExGJKsERERMScEiyPKcESERERsZgSLBERETGlOVieU4IlIiIiYjElWCIiImJOCZbHlGCJiIiIWEwdLBERERGLaYhQRERETGmSu+eUYImIiIhYTAmWiIiImFOC5TF1sESkQHLh8nUTfMquAQiRfE0dLBERETGlOVie01cgEREREYspwRIRERFzbkVYnlKCJSIiImIxJVgiIiJiSnOwPKcES0RERMRiSrBERETEnBIsjynBEhEREbGYEiwRERExZbuyz+t7WZRgiYiIiFhMCZaIiIiY0xwsjynBEhEREbGYOlgiIiIiFtMQoYiIiJjSiUY9pwRLRERExGJKsERERMScfuzZY0qwRERERCymBEtERERMaQ6W55RgiYiIiFhMCZaIiIiYU4LlMSVYIiIiIhZTgiUiIiKmNAfLc0qwREREpFDatGkTjz32GE2bNqVTp078+++/ACQnJ/Piiy8SGRnJU089RVJSEgCpqan07NmTyMhIWrZsyc6dOwFwu92MHDmShg0b0qhRIzZv3nzJbauDJSIiIubcbu/9Wah3796MGjWKRYsWcf311zNt2jQAxo0bR82aNYmPj6d169ZER0cDMHv2bIKDg4mPj6dPnz5ERUUBsGTJEnbu3MnixYuZPHkyUVFRpKenm25bHSwRERHJN5KTk9m7d+8Ff8nJyR7f1+LFi7n++utJS0vj4MGDhISEAJCQkEDTpk0BaNKkCatXryYtLY2EhASaNWsGQK1atTh69Cj79u1j1apVNGrUCLvdTuXKlSlXrhw//vij6bY1B0tERERMeXMO1qxZs5g0adIFy7t06ULXrl09ui9/f3927NhBhw4dcDgcvP766wAkJiYSGhoK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lFwWJVgiIiIiFlOCJSIiIqY0yd1zSrBERERELKYES0RERMwpwPKYEiwRERERiynBEhEREXOag+UxJVgiIiIiFlOCJSIiIqZsCrA8pgRLRERExGJKsERERMSc5mB5TAmWiIiIiMWUYImIiIgpm36L0GNKsEREREQspgRLREREzGkOlseUYImIiIhYTAmWiIiImFOA5TElWCIiIiIWUwdLRERExGIaIhQRERFTNk1y95gSLBERERGLKcESERERc0qwPKYES0RERMRiSrBERETEnH4qx2NKsEREREQspgRLRERETOkoQs8pwRIRERGxmBIsERERMacEy2NKsEREREQspgRLREREzCnB8pg6WCJSIEWWu8PXTfCphf9s8nUTfOqmr17xdRN8avfzvm6BXIo6WCIiImJO58HymOZgiYiIiFhMCZaIiIiY0nmwPKcES0RERMRi6mCJiIiIWExDhCIiImJOQ4QeU4IlIiIiYjElWCIiImJOCZbHlGCJiIiIWEwJloiIiJhTguUxJVgiIiIiFlOCJSIiIub0UzkeU4IlIiIiYjElWCIiImKqoP5UzqZNmxg2bBhpaWmUL1+ekSNHUrx4cTZu3EiXLl0oU6YMALfccgvDhw8nOTmZHj16sGfPHkqWLMm4ceMIDQ0lNTWVvn37sn37doKCgoiJieG6664z3bYSLBERESmUevfuzahRo1i0aBHXX38906ZNA2Dbtm107NiRuLg44uLiGD58OADjxo2jZs2axMfH07p1a6KjowGYPXs2wcHBxMfH06dPH6Kioi65bXWwRERExJzb7bW/5ORk9u7de8FfcnKyx81evHgx119/PWlpaRw8eJCQkBDA6GCtXbuWFi1a0KlTJ/bv3w9AQkICTZs2BaBJkyasXr2atLQ0EhISaNasGQC1atXi6NGj7Nu3z3Tb6mCJiIhIvjFr1izq169/wd+sWbM8vi9/f3927NhBREQE3333HY0bNwagWLFitGvXjtjYWCIiIujevTsAiYmJhIaGAuBwOChatChHjhzJshwgNDSUAwcOmG5bc7BERETEnMt7c7Dat29Py5YtL1h+Ln3KTnx8fMYw3zlVqlRh5syZVK1alXXr1jF37ly6d+/O3LlzGTx4cMZ6Tz75JGPGjOH48ePZ3rfdnn0WdbHl56iDJSIiIvlGSEiIaWcqO5GRkURGRmZZlpKSwvLly3n44YcBaNasGSNHjsTlcjFlyhRefPFF/Pz8MtZ3OByEhYVx6NAhypQpQ3p6OidOnKBEiRKEhYWRlJRExYoVAUhKSiIsLMy0TRoiFBEREXNenINlFYfDwVtvvcX27dsBI+W68847sdvtLFu2jCVLlgAQGxtLjRo1CA4OJiIigtjYWMCYv1WzZk38/f2JiIggLi4OMI5MDAwMpFy5cubbt6wSERERkXzCz8+PsWPHMmDAAJxOJ+Hh4RlHBY4cOZL+/fszefJkSpYsyahRowDo1q0bUVFRNG7cmGLFihETEwPAM888w4ABA2jcuDEBAQEZ65uxud0F9OQWZ7kO3OjrJoiIDzQoV8PXTfCphf9s8nUTfOqmr17xdRN8avfzPb26vcgbe3ltW/G/jfTatvKSEiwRERExV7CzGJ/QHCwRERERiynBEhEREXNKsDymBEtERETEYkqwRERExJwXTzRaWCjBEhEREbGYEiwREREx53b5ugUFjhIsEREREYspwRIRERFzOorQY0qwRERERCymBEtERETM6ShCjynBEhEREbGYEqzzJKyHse9DahpUrQJDe0HRq3K+3vET0G8U/Pm3ccBF84bwQtust927H1q9AB/EQLWbvFOXmdzW7HTCyMmwZqPx/w5PQJvmxm22/QLDJ8HpM8Z1z7eFZo9m3qfbDX1GwA2VoWMb79SbU954LhRE2e2zMykwZCxs+9X4klvjZujfHYICfdvW7DTv3JAmnR7F7Xazf+dBxr74HseSki9cr0tDmneOJPV0Kn//speJXaZx/OiJy95u8dIhvDmrC+EVQ3G5XIx7aQo/r//Nozb52ph3/FiWYCekmJFkVLrWzaiBTgDeneHH0pV27HY3N1d10/91J4H5cP8DxDwUyW9HD/H+to3ZXt+g4g10v+t+XG43ySlnePPbJfx9/Nhlb69kUDBjIxpRvmgILreb3muWsjlxHwDtb7mDp2++Hbfbze7jx4j6dimHz5y67G3lKc3B8pgSrLOOHIO+I2D8EIifAxXKwZgpnq03YRqEh8KimTBvCsyNgx+3Z942JQXeHApp6V4oKAesqPnThbBrLyycYdT84Wew9RfjtdhtAHTpAAumwfujjI7Yrr3G7Xbugg7d4euVXirWA954LhREF9tn782GdCfEToe46UaH6/05PmmiqRvurEKrN5rS7f5+vHjbG/zzx37aD7mwZ1+jzq088WYL3nz4LTrd2ZPv43/ktSkv5WrbXSc9x/Y1v/B8te6MfGYi/ee9QWBwQI7blB9s2W5jxIB05k0z/s51rjb+aGPJN3Y+mZrGZzPSOXnSxicL8t9Hy/UlSvJJo//RpErVi64T6OdgXJ1GvLQ8lkYLZrHs7z94q3a9XG13yH0P8/2BvTz8+QxeS1jMO/WbEeTnoFqpcF6oXovHFn7Eo1/MZNe/x3jjrgdytS3JX/Lfq8BH1m40EqVKFYzLTzaHL5df2Gk3W6/Pq/Dmy8bypMOQmgrFimbedvA4aNEQShTP83JyxIqal38Lj0WCwwHFi0GjerBoqVH7K8/CfTWN25QJg6uLw8FE4/LHsdAyEhrW9UalnvHGc6Egutg+q1UDOrUDux38/ODmG2DfQZ800dTvP/zJsze+yqnkU/gH+lO6XEmOHz5+wXo33FWFH5dv49A/RwBY88V33Nv0Lhz+Dhz+Djq93Z53No3kvR9H03N6Z4oUC85y+57TO/No+zoZl+1+du5pcheLp64AYOeWXfzz+35qNbw9x23ytdRU+PV3Gx9+6sf/nnPwxgAH+8/uY5cLUlKNL5Dp6ca6gQG+bW922t18B/N+286Xf+646Dp+Nhs2m41i/kb8dpUjgBSn0ZH0t9vpf09dvmrRjviW7Yl5KJKi/lkLjXkoklY33Jrl/upfex2f7NgKwM9HEvkr+Sh1rqnM9sMHqTPvA46npRLo50f4VUU5mnLa6rKt43Z776+Q8FoH69tvvyU52Yi9Y2NjGTx4MJ9//rm3Nn9JBxKhbFjm5fBQOHHSxslTOV/PZjM6Gm8OhWYd4O7bofI1xnrzvzTefP7XNM9LyTEraj6QZHSezr/uQBIEBkKrxpnL5y2EU6ehxtn3nv6vQfMGlpdkibx+LhRUF9tn99fKrO2fA0aK2aCON1uWc850J/c1r8Une96j+kO3sGTGhRHqju//4PZ61Qi7tjQADTrUJSDQn5BSRWkT1QJnuotXavai0x09Obz/CM+NeMp0m8VLh2C32/j3UOawX9Lew5SuUCrHbfK1pMNQ6043r76QzqcfpFP9Fhev9XXgdsM9d7m5t6aLhv/zp/5j/hw/Aa2a5r+TUg5Yv4IFf/xsus6p9DT6rFnGF83a8v2TL9Pu1jsYvnEVAC/XuAen20Xj2A+JXDCLg6dOEFXrIdP7KxlUBBs2jpzJ7DgdOHmCMlcVAyDd7eLRitez4clO3FOmAvN/25bLKiU/8cocrOjoaH755RfGjh3LuHHj2LZtG/Xr12fZsmX88ssv9OvXzxvNMOW6yPuB3e75eqP6wcDXjSGyd2ZBvQeMobTZE6xpq1WsqDm76/z+c/upHxkfulNH5895Of+Vl8+Frh2taWN+9NMO6NoPnmoJde/zdWsubl3cRtbFbSTy+foM/7of7W/oivu8b83bvv2F2YPnM+iLnrhdbr6e8Q3Jh4+TlprOPY3vomiJItz18G0AOAIcHEv8F4AJ64cREOhP6LWlub1eNR7r1pif1v3Kx9FfZNsOlzPzCXSpNvla+bIweWTm3Ib2T7iY+qEf+w7Axh/t7NtvY/kXafg7YMBIP8a840dUN6cPW3x5ql5dmm531Obhz2bw9/FjPHvrnbxXvzmRC2ZR/5rrCAkM5IHylQAIsNs5dHa+VGyzpwjwc1D+qmLcV+5aOlaryeaD/zDx/9Znux3XeUfkLd39B0t3/0Gbqrcxu2FrHpo3lfyz5yU3vNLBWrt2LYsWLcLPz4+EhATmzZtHQEAATzzxBE2aNPFGE7I1YRqsXGf8/8RJuLFK5nUHD0HxYm6KZE3/KRtuzDHKbr013xv3EVYarioCjevD0lVw/KRx/207G7dJOgQ9h0LPl6He/Xlb439ZXXPZcOPb7TmJhyD8bKqTmgq9h8PO3TD3HeNNOr/y1nOhIDn/Mal7H7z63MXX/WqFMdG9Xzdo8oh32pcT7d96gtpNjXHq3T/vZeG7S/hp7a8ALJm+km7vvkjRq6/i+JHMCezBRYPYuupnvp7+DQAlworz7OA2HD9yArufnXdem8HGr/8PgKCrgggI8gfg1dp9AGOIcMuqn1g6KwEwhggBipa4ihPHTgJQunxJkvYeptx1Zbi6TIlLtskX3pnuR8JaG2DML6z3oIsmj2Z2Ct1ucPjBitV2Ih9xcVURY/njTVyMGO/niyZn8fqd9/NwxesBWL77D97+Ye0lbxNRoTKbDv6TMan9w59/ZMA9dbk6MBg/u4231n9Dwt6/ACji8CfQz/gIbbHwI8AYItyw/28++/0nwBgiBAgJCCQ5NQWAMkWKsv/kcSqGlCA0+Co2HfwHgHm/bWPY/Y9QPDCIYylnLHoULJSPOvwFhVeGCIOCgjh82PgULlWqFKdOGb3+06dP43D47kDGV58zJmAvmAZz34UtP2dOwv50Yfadn/trXXy9+JUweabxPExNNS7fcyf06Qpff5S5rdDSMLqf9ztXYH3N9e+HLxYbw5/Jx2HxCqh/dp7mawPhxCn4eHL+7lyB954LBcn5j4lZ52pJAgybYBwZm586VwCzBn5Kpzt70unOnix6bwl9P3mNkFLG8Ey9px5g1/a/L+jIlCpXkpiVgzLmVj3dvxUr5xofzpuX/h/NO0fi8Hdgs9l4/f2XeG64+eGhLqeL7776gcYvGQ9O5erXUvGWCmxJ+JmSZUvkqE2+8EpHZ8aE9lc6OBk5wY9/9hvXzYuzc8N1bsLD4OYb3Xyz2k56uvF8/+ZbO7fd4vsP47d/WEujBbNotGBWjjpXANsPHeSestdQOtjoLTaoeAN7jv/L0ZTTrNq7i/a33IG/3Y4NGPFgA3rVetD0/pxuNyv3/MlTN9UA4KaSoVx/dSk27P+bsOCrmFSvKVcHGs+zFtfdwo6jh/Jn50oui83thRz6m2++YdCgQTRu3Jj09HQ2bNhA7dq1WbNmDc8//zyPPfbYZd+368CNlrVz1QbjkPu0NLimPIzoAyVCYPuv0H+08UFjtl7ycRj0Nvz+F9iA+g9C1w4XDi3VfwLGv5U/TtOQ25rT02HUu7Buk3HdE82Mw/d/2AZPdbFR6Rp3lmHBN16CB+7OvNx7eP48TYO3ngsF0X/3WYO2xmkpwkMz17mjGgzonrftaFCuhse3adLpUZq90gBXuovD+44wscs0DuxK5Ma7qvD61JfpdGdPwDh1QrNXGmCz29m+9lcmdZlG6plUAoICeCnmGW6LuBW7n52d/7eLcS9N4dRx88nJJcKK8/rUTpSpHAZumNJjFpuXbTVt06Us/GeTx/XnxldL7Uz/2I7LZSMs1M2gN9MpG25Mbo95x4/vNtsJ8Hdz43Vuer/mzPODOm766pXLut1/T9NQvXQ4Ix9sSKMFswBjMnz7W+8g1enk35Qz9F+3nN+PHSbQz0G/e+pwb9lrsNts/Hw4kd5rlnIiLdV0e6WDizDywQZcU7Q4bmDodwl8+88uAJ6++Xba3Xw76W43iadO0H/tcvac+DdHdex+vudl1X+5Ist29tq24vdP9tq28pJXOlgAe/bsYfny5ezevRun00np0qWpW7cut912W67u18oOlogUHJfTwSpMvN3Bym8ut4NVWKiDlf95bXzummuuoUOHDt7anIiIiFhFc7A8VggGLERERETyF/1UjoiIiJhTguUxJVgiIiIiFlOCJSIiIuZcSrA8pQRLRERExGJKsERERMSU253/fl8yv1OCJSIiImIxJVgiIiJiTnOwPKYES0RERMRiSrBERETEnM6D5TElWCIiIiIWUwdLRERExGIaIhQRERFzLp2mwVNKsEREREQspgRLREREzGmSu8eUYImIiIhYTAmWiIiImHJrDpbHlGCJiIiIWEwJloiIiJjTHCyPKcESERERsZgSLBERETGnH3v2mBIsEREREYspwRIRERFzbh1F6CklWCIiIiIWU4IlIiIiptyag+UxJVgiIiIiFlOCJSIiIuY0B8tjSrBERERELKYOloiIiIjFNEQoIiIipjTJ3XNKsEREREQspgRLREREzGmSu8eUYImIiIhYzOZ2uzWwKiIiImIhJVgiIiIiFlMHS0RERMRi6mCJiIiIWEwdLBERERGLqYMlIiIiYjF1sEREREQspg6WiIiIiMXUwRIRERGxmDpYIiIiIhZTB0tERETEYupgiYiIiFhMHSwRERERi6mDJSIiImIxdbByYdGiRTRq1IhHHnmEjz76yNfN8boTJ07QpEkT9u7d6+umeN2kSZNo3LgxjRs3ZtSoUb5ujteNHz+eRo0a0bhxY2bMmOHr5vjEyJEjiYqK8nUzvK5du3Y0btyY5s2b07x5c7Zs2eLrJnnVN998w2OPPUbDhg0ZOnSor5sj+ZjD1w0oqA4ePMjYsWP54osvCAgIoE2bNtxzzz1cf/31vm6aV2zZsoV+/fqxa9cuXzfF69atW8eaNWtYsGABNpuN559/nmXLlvHII4/4umle8f3337NhwwYWLlxIeno6jRo1IiIigipVqvi6aV6zfv16FixYQJ06dXzdFK9yu938+eefJCQk4HBceR8fe/bsYeDAgcyfP59SpUrRvn17Vq1aRUREhK+bJvmQEqzLtG7dOu69915KlChBkSJFaNCgAV9//bWvm+U18+bNY+DAgYSFhfm6KV4XGhpKVFQUAQEB+Pv7c91117Fv3z5fN8tr7r77bj788EMcDgeHDx/G6XRSpEgRXzfLa44dO8bYsWPp1KmTr5vidX/++Sc2m40XXniBZs2aMWfOHF83yauWLVtGo0aNKFOmDP7+/owdO5YaNWr4ulmST115X0EskpiYSGhoaMblsLAwtm7d6sMWeVd0dLSvm+AzN9xwQ8b/d+3axeLFi5k7d64PW+R9/v7+TJgwgenTp9OwYUPCw8N93SSvGTBgAN27d2f//v2+borXJScnU7t2bQYNGsSZM2do164dlStX5v777/d107xi9+7d+Pv789xzz5GUlETdunV57bXXfN0syaeUYF0mt9t9wTKbzeaDloiv/P7773Ts2JFevXpRqVIlXzfH61599VXWr1/P/v37mTdvnq+b4xXz58+nbNmy1K5d29dN8Yk77riDUaNGUaRIEUqWLEmrVq1YtWqVr5vlNU6nk/Xr1zN69GjmzZvHtm3bWLBgga+bJfmUOliXKTw8nEOHDmVcTkxMvCKHy65Umzdv5tlnn+WNN96gZcuWvm6OV+3cuZNffvkFgODgYB599FF27Njh41Z5x+LFi1m7di3NmzdnwoQJfPPNNwwbNszXzfKaTZs2sX79+ozLbrf7ipqLVbp0aWrXrk3JkiUJCgqifv36V9TIhXhGHazLdN9997F+/XqOHDnC6dOnWbp0KQ899JCvmyVesH//fjp37kxMTAyNGzf2dXO8bu/evfTr14/U1FRSU1NZsWIFd911l6+b5RUzZszgyy+/JC4ujldffZV69erRp08fXzfLa44fP86oUaNISUnhxIkTLFiw4Io5uAOgbt26rFmzhuTkZJxOJ99++y233nqrr5sl+dSV89XDYuHh4XTv3p127dqRlpZGq1atuO2223zdLPGCadOmkZKSwogRIzKWtWnThieffNKHrfKeiIgItmzZQosWLfDz8+PRRx+9IjuaV6K6detm7HuXy0Xbtm254447fN0sr6lRowbPP/88bdu2JS0tjfvvv5/HH3/c182SfMrmzm4ykYiIiIhcNg0RioiIiFhMHSwRERERi6mDJSIiImIxdbBERERELKYOloiIiIjF1MESERERsZg6WCIiIiIWUwdLRDwWGRnJQw89xO+//+7rpoiI5EvqYImIx7788ksqVarEkiVLfN0UEZF8SR0sEfGYn58fd9111xXzI88iIp7SbxGKiMfOnDnDV199hX5pS0Qke0qwRMRjY8eOJTw8nD179nDy5ElfN0dEJN9RB0tEPPLjjz/y9ddfM3HiRIoVK8Zvv/3m6yaJiOQ76mCJSI6lpKTQu3dv3nrrLUqUKMFNN92keVgiItlQB0tEcmz8+PHccccd1KlTB4CbbrqJX3/91beNEhHJh9TBEpEc2bp1K19//TV9+vTJWHbzzTcrwRIRyYbNrcOARERERCylBEtERETEYupgiYiIiFhMHSwRERERi6mDJSIiImIxdbBERERELKYOloiIiIjF1MESERERsdj/A61CXFvLEvW/AAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<Figure size 720x720 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_61_9.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": [
|
||
"[ 2.01527008 -0.01479387 4.95182263]\n",
|
||
"Training R2\n",
|
||
"0.9944140159775704\n",
|
||
"Training MSE\n",
|
||
"0.011573643846900319\n",
|
||
"Test R2\n",
|
||
"0.9944289456992632\n",
|
||
"Test MSE\n",
|
||
"0.014907545832149347\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.999986852042735\n",
|
||
"Training MSE\n",
|
||
"6.585645082614409\n",
|
||
"Test R2\n",
|
||
"0.9999687620446621\n",
|
||
"Test MSE\n",
|
||
"5.732111038377648\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
|
||
} |