4270 lines
554 KiB
Plaintext
4270 lines
554 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Linear Regression\n",
|
||
"\n",
|
||
"[Video of Lecture](https://www.uio.no/studier/emner/matnat/fys/FYS-STK3155/h20/forelesningsvideoer/LectureAug21.mp4?vrtx=view-as-webpage)\n",
|
||
"\n",
|
||
"\n",
|
||
"## Introduction\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Our emphasis throughout this series of lectures (small change) \n",
|
||
"is on understanding the mathematical aspects of\n",
|
||
"different algorithms used in the fields of data analysis and machine learning. \n",
|
||
"\n",
|
||
"However, where possible we will emphasize the\n",
|
||
"importance of using available software. We start thus with a hands-on\n",
|
||
"and top-down approach to machine learning. The aim is thus to start with\n",
|
||
"relevant data or data we have produced \n",
|
||
"and use these to introduce statistical data analysis\n",
|
||
"concepts and machine learning algorithms before we delve into the\n",
|
||
"algorithms themselves. The examples we will use in the beginning, start with simple\n",
|
||
"polynomials with random noise added. We will use the Python\n",
|
||
"software package [Scikit-Learn](http://scikit-learn.org/stable/) and\n",
|
||
"introduce various machine learning algorithms to make fits of\n",
|
||
"the data and predictions. We move thereafter to more interesting\n",
|
||
"cases such as data from say experiments (below we will look at experimental nuclear binding energies as an example).\n",
|
||
"These are examples where we can easily set up the data and\n",
|
||
"then use machine learning algorithms included in for example\n",
|
||
"**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\n",
|
||
"specific Python packages for Machine Learning, Scikit-Learn and\n",
|
||
"Tensorflow (see below for links etc). Moreover, the examples we\n",
|
||
"introduce will serve as inputs to many of our discussions later, as\n",
|
||
"well as allowing you to set up models and produce your own data and\n",
|
||
"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 **Scikit-Learn** to perform linear regression analysis on a data set 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.\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",
|
||
"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",
|
||
"\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.15024669]\n",
|
||
"Coefficient beta : \n",
|
||
" [[4.89975818]]\n",
|
||
"Mean squared error: 0.26\n",
|
||
"Variance score: 0.90\n",
|
||
"Mean squared log error: 0.01\n",
|
||
"Mean absolute error: 0.42\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAAkTklEQVR4nO3dfbRdd13n8fcnaUKbtrTkoVALuZWpFhCkkAyU5YhAxYWVKTNLp+K6rW1RsnRGFwxleJjU4TFLXYqCzowlglB7o7Yi1VgZbZXyVKGS0lJoaeXBpE9I0qYpralN0vudP/Y55txz9z5nn3P24zmf11p35d59ztnnd3eS/T2/7+/3+/4UEZiZ2exaUXcDzMysXg4EZmYzzoHAzGzGORCYmc04BwIzsxnnQGBmNuMcCKwwkn5Y0l11t2MaSLpd0stKOO9TJX1G0iOS3ifpf0r6UNHvY+0iryOwUUnaDfx8RPxt3W3JIumdwFbgceAIcAdwaUR8vs521U3SrwAvAH4y+v7zSzod+CdgVUQcqaF5VhP3CKz1JB2T8dBVEXECsB64AfjTEt5bktr0/2gOuKM/CNhsa9M/YGs4SS+TdG/Pz7slvVnSbZIelnSVpGN7Hn+1pFslHZD095J+sOext0n6ZieFcYek/9zz2MWSbpT025IeBN45qF2dT7c7gNMkbeic4yRJH5b0bUn3SXqvpJWdx1Z20iYPSPonSb8kKboBR9KnJG2TdCNwEHimpGdJul7Sfkl3STq/p73ndn6HRzrv9ebO8fWSru38/vslfbYbVDrX7kc73z9J0vsl3d/5er+kJ/Vec0mXStrb+X0uyfj7+ShwEfAWSY9K+lFJ75S00HnKZzp/Hug8/pJB19WmR9YnKbOinA+8CvhX4EbgYuBySS8A/gD4j8Au4AJgp6QzI+Jx4JvADwP/DPwXYEHSGRHx7c55Xwz8CfBUYNWgBkhaDfws8CDwUOfwR4G9wBnA8cC1wD3AB4HXAz8OnAX8C+k9iQs7z7mr8/qvAv+rc+x5wPWSvhoRdwAfBs6PiM9KegrwvZ1zXArcC2zo/Hw2kPZJfWvnsbM6j/8FcBnwK53HnwacBJwGvBL4mKQ/j4iHek8SERdLArg3Ii7rXJv/0POUl5Kkhk52ami2uEdgZfudiLg/IvYDf0lyMwPYAnwwIm6KiCci4gqSfP7ZABHxp53XLUbEVcDXgRf1nPf+iPjdiDgSEY9lvPf5kg4Aj5Hc3H8qIo5IeipwLvDGiPiXiNgL/Dbw2u7rgA9ExL2dm+mvpZz7oxFxe+eG+Spgd0R8pNOeW4A/IwlgAIeB50h6ckQ8FBFf6jl+KjAXEYcj4rMZKZt54N0RsTci9gHvIglE9Jzn3Z1zfAJ4FDgz45qYLeNAYGX7557vDwIndL6fAy7tpEUOdG7YzwC+B0DSz/akjQ4AzyXJ9Xfdk+O9r46Ik0l6DV8FNvW89yrg2z3n/yBwSufx7+k7f9p79R6bA17c97vMk3xSB/hJksCzR9Kne1IuvwF8A7hO0rckvS3j9/geYE/Pz3s6x7oe7PsE33udzYZyasjqcg+wLSK29T8gaQ74feAc4PMR8YSkWwH1PC33YGdEPCBpC7BL0h913vtxYH1GCuTbwNN7fn5G2mn7fpdPR8QrM97/i8BrJK0Cfgm4GnhGRDxCkh66VNJzgU9K+mJE/F3fKe4nCTa3d37e2DlWNA8gzyj3CGxcqyQd2/M16oeK3wd+QdKLOzNvjpf0E5JOJMm5B7APoDP4+dxJGhsRdwF/A7ylM85wHfA+SU+WtELSv5P0I52nXw28QdJpkk4G3jrk9NcC3y/pQkmrOl//XtKzJa2WNC/ppIg4DHwXWOz8Xq+WdIaSxP3DwBPdx/r8MXCZpA2S1pOMRSykPG9S+zrv/8wSzm0N5kBg4/oESe69+/XOUV4cEbtI8vb/m2QA9xskA8l0BljfB3we+A7J4OuNBbT5N4Atkk4hGTxeTbK+4CHgYyT5ekiC1HXAbcAtJL/rEZIbddrv8gjwYyRjDPeTpMN+HXhS5ykXArslfRf4BZK0EcD3AX9LktP/PPB/I+KGlLd4L8mA+m3AV4AvdY4VKiIOAtuAGzsprrOLfg9rJi8oMxtC0o8Dl0fEXN1tMSuDewRmfSQd15n7f4yk04B3ANfU3S6zspQeCCSd2Zn90f36rqQ3lv2+ZhMQyRTNh0hSQ18jycubTaVKU0NKVm7eB7w4IvYMe76ZmZWv6tTQOcA3HQTMzJqj6nUEryWZCrdMZ573FoDjjz9+07Oe9awq22VmttRXvgKHDi0/vno1PO95xb92/37YswcWe2YQr1gBc3Owdu3RY/fcA3v3Ln3tpk3cfPPND0TEBsZQWWqoU+/lfuAHIuI7g567efPm2LVrVyXtMjNLtWMHbNkCBw8ePbZmDWzfDvPz2a8b97Wnn54Egn5zc7B7N3zqU/Dyly997OtfhzPOAEDSzRGxedivlabK1NCPA18aFgTMzBphfj65ca9bd/TYcceN9tq5OZCSP4cFkLvvzj4uLQ0CP//zEPFvQWBSVaaGfoaMtJCZWWM91lPT8MEHk0/6MLxXMD8//Dm9Nm5M7xH0Z21KyOJU0iOQdDxJedyPV/F+ZmaF2Lp1aXoHkp+3bi3+vbZtS9JHWR55pJQgABUFgk6p33UR8XAV72dmM2LHjiS3vmJF8ueOHcWef1C6pmjz8/D61y8//va3JwHghPIKyrr6qJm1U/+A7J49+dM2eWWlazZuLOb8XRFJMEs7XgGXmDCzZsn7Kb+KtE1aumbNmuR4UaTlQSCisiAADgRm1iTdT/l79iQ3wu6n/LRgUEXaZpzZP3mtXJmcs9f111caALoaWX3U6wjMZtSwufTjPrdJvvxlOOus5ccnvBe3ZR2Bmdlgo3zKryJtUzRpeRCoOA2UxoHAzJojaxA27XiZaZuiScvTQIcO1R4AuhwIzKw5Rv2UPz+fpIEWF5M/mxYEfvqnlweA97wnCQCrVtXTphQOBGbWHE34lF/E2oQDB5L2X3310uMRcNllBTSyWF5HYGbNMmpphiIVsTahvwcAjUkBZXGPwMysa5K1CWnjAPff3/ggAA4EZjYL8qZ7xlmb8Ju/uTwAzM0lAeDUU8dpbeWcGjKz6ZY33bNjRxIonnhi+TnSZi0tLiaLwvq1oAfQzz0CM5tuedI93WCRFgTSZi1Jy4PAJOsByi6eN4QDgZlNtzzpnrRgAcnNvnfWUto4wDXXTNYLGKWsRkkBwyUmzGy65SlFsWJF+s1cSlJAn/wknHPO8seLuH/mLZUxZPtLl5gwM8sybJFad2wgzdq1STDoDwJFloXIO0BdYrVVBwIza79BKZNBi9QGjQ1AsjVlrzVrYGGh2LbnLatRYrVVp4bMrN2GpEwGykrLDFJ0ddO87R+SQnJqyMxm1yQpk3E+TRe9TWXesholVlt1IDCz0dQ81XGZSVImg7acnJsb/TXjylM8r8Q6TA4EZpbfKFMdqzJK6ep+aamWY49NxgHq3u8gLeCWVG3VgcDM8qtin+BRjXPD3rAhvTjcypVwySVHC9/VVQm14oDrwWIzy2/YfPu67NiRBKO77056Atu2pd+wDx+G1asHnyvvQHOZxtiG04PFZlaNSdIwRetNnWzdmtz8B6VMpOVBIG0coO4eDpQ6VTSNA4GZ5Vd33rxrlNRJWlmIX/u15HUV33BzqzjgOhCYWX5N2EEM8o1VvPnN2ZvEvPWtyfdN6uH0qjjgugy1mY2mzh3EuoZ9ks+7S9i2bemLuaru4fTrXt884x4FcI/AzNon6xN7xPIgcPhwdl2gpvRwstpWwlTRNA4EZlat3kHe9euTr1EXp6WlTtJEwDFDEh8V3nCbyqkhM6tOf12d3qJuo2wU33380kvhO99Z/ngDp8U3mdcRmFl18hR5y1vULe84wIxo/DoCSSdL+pikOyV9TdJLqnhfM2uYPNMy9+wZnCpKmw56223FBoGm1VMqWVWpoQ8Afx0RPyVpNZAjuWdmU2fjxnxln3vXBkCSCkrrAXSfW6S8m91PkdJ7BJJOAl4KfBggIg5FxIGy39fMGijvIG/XwYPw9rdnp4HKSAU1sZ5SyapIDX0vsA/4iKRbJH1I0vH9T5K0RdIuSbv27dtXQbPMrHL90zXXrUu+sj7tA9xzz9KfywoAXU1dbVyiKgLBMcALgd+LiBcA/wK8rf9JEbE9IjZHxOYNGzZU0Cwzm8igPPqwrSO70zUfeCD5WlzMrv/f9a53VTMY3NTVxiWqYozgXuDeiLip8/PHSAkEZtYig/LoMF6Ofds2uOii9P2Dq5wN1NTVxiUqvUcQEf8M3CPpzM6hc4A7yn5fMyvRoDz6uDn2Cy5YHgQWFqqfEjrJauOWzjaqZB2BpLOADwGrgW8Bl0TEQ1nP9zoCs4YbtC8BjLZnQdr4wJEjySYxbZJ3E/qSNH4dQUTc2sn//2BE/KdBQcDMWmBQHj1vjj1tPQAkQaRtQQBaPdvItYbMbHSDyiQPK6G8c2e100Gr0uLZRq41ZGajy1MmOe2xaS4LkbVYrgWzjdwjMLPxDKra2f/YBRcsDwK3315NEKhqALcpu7eNwT0CMytPVWUhslRZLqLizWSK5B6BmRXv4YeHjwNU8Ul90ABuGe/f0r0N3CMws2LlGQeo6pN61kBt9/1mqLDcIO4RmFkx0qaDbt2angaqaqpl1kDtypWtnepZBgcCs7K0dJXpyJ7//OxewHvfm/6aqqZaZg3gppWxgKRnMM1/VxkcCMzK0E197NmztLb+tN1gpGRTmF551gNUVdgtq1zEoAJ30/p3NYC3qjQrQ9aWjHm3YWy6tB7A4uLgctK9ai7HkPr+/Vr2d9X4EhNmM6fqVaZVpaEGlYXIGwRgssJuReh9/ywtWBFcFAcCszJUWdO+ijTUFVcUXxai7qmW3ffPCgYtWBFcFAcCszJUucq07Bk4Elx88dJjba8L1KvFK4KL4kBgNqm0tEyVqY+y0lBpaaCvf736AFB22qvuNFUDeLDYbBJ1D3pC8QPTdZeF6JV2faWkLXNzrSnhUAUPFpvVpQk16ItKbezd24zy0L09gIsuWn59u22ZwWmeZXEgMJtEE2rQF5HakOCpT116rI5xgP6B76yFX10zvBq4SA4EZpOocnbQIOPOwEkbB/jVX61vIDithzXMDE3zLIuLzplNYtu29DGCps84WbsWHkrZMbbuMcNxbuozNM2zLO4RmE2ijTNOpOVBoCnTQQcViYPlvZc2BN0WcCAwm1TdC6PySksDLS42IwB0ZQ18X3FF0s4rr2xX0G0Jp4bMpl3WdNCFhdHKQlRh2C5f8/O+8ZfAPQKzafVbvzX4Rt/UqZdt6WFNEQcCs2kkwaWXDn7OKFMvZ2VvhRnlQGDWdr036bRxgHvvze4Z5JmlMyt7K8wwBwKzNuu/SfeLgNNOm2y9QxNWT1upHAjMutqY/njrW9MXYM3NLQ0Mk5ShaMLqaSuVA4EZFJP+KCqQ5D2PBPfdl/5Y/016kvUOTVk9beWJiMZ9bdq0KcwqNTfXXVK19GtuLt/rFxYi1qxZ+to1a5Ljo8hznrR2jtvuKn83KxWwK8a857oMtRkkn77T/i9IyTTGYYoqBT3oPGnHIUnxlF0Ge8eO7Ln91giNL0Mtabekr0i6VZLv8NY8k6Y/isqjZz0/LQh0P59XUeLCc/unWpVjBC+PiLPGjVhmpZq0pn9RefQ8z++vC+SbtE3Ig8VmMHnxuKI2h0k7T9eGDc2qC2RTo6paQwFcJymAD0bE9v4nSNoCbAHY6NkIVodJ6tgMq5GT1+7d6dNBHQCsRJUMFks6LSLuk3QKcD3wyxHxmazne7DYZlLWNpFmOTR+sDgi7uv8uRe4BnhRFe9r1gppZSH27nUQsMqUHggkHS/pxO73wI8BXy37fc0aLy0AQBIANmyovj02s6roETwV+JykLwP/APxVRPx1Be9r1kz/+I/ZAcC9AKtB6YPFEfEt4Pllv49ZK3gcwBrI00fNqpCWBrrySgcBawRvVWlWpqx9ABwArEHcIzArw+KixwGsNRwIzIomwcqVS491Vyy3ZZ+DadfGvSdK5NSQWVHSegAnnghPPHG0aFx3nwNwTaC6dPee6K7g9t+JewRmE3vd67LTQGvXepvHpvHWm8u4R2A2iWHTQb3NY/P472QZ9whsOlSd802bDvrQQ8sHgr3NY/P472QZBwJrvyL2G85rUFmIk09efryo8tRWHP+dLONAYO1XRc735pvTA8DCwuDpoJPuczAJz4xJV+ffSUN5z2Jrv0n3Gx4ma1EYlLM/cBH6Z8ZAc9tqhWh8GWqzUpWV881KA/Vq6mwTz4yxETgQWPtt2warVy89tnr1+DnfrACQFRSaONvEM2NsBA4ENh36U0PjpDyPHBlcFqJNs03a1FarnQOBtd/WrXD48NJjhw+PlgaRYNWqpcf66wK1abZJm9pqtXMgsPbpnw3TLd/QL08aJC0NdMYZ6T2KNs02aVNbrXaeNWTtkjYbRkq/cc/Nwe7d6ed5zWtg587lx4v6/7BjR9IjufvuJB2zbZtvwlaqSWYNucSEtUvabJiI5cFgUBqk7F3CXNTMWsapIWuXrHRPxPA0SFoa6NFHi98fwFM3rWXcI7B22bgxfUxgUBqo6l3CPHXTWsY9AmuXUWbD3HBDPbuEeeqmtYwDgbVL3tkwErziFUuPVbVNpKduWss4EFj7zM8naaDFxeTP3iCQNg7wpjdVu0+wp25aywwNBJKul/T8KhpjlipPFc1BdYEuv7z6ypuDgpVZw+TpEbwVeL+kj0g6tewGmS0xbK+Bxx9vb2E4s4YYGggi4ksR8XLgWuCvJb1D0nHlN81aqega+IOmYkpw7LFLH8sKCnv2uDa/WYZcYwSSBNwF/B7wy8DXJV1YZsOsYfLc4MvYKSxrymX/FNKXvGRwYTipmh3MzFoozxjBjcB9wG8DpwEXAy8DXiRpe5mNm2lN2l0q7w2+jIVUeaZcRsDf/33yfdqMnbQSFE4Xmf2bobWGJP0AcEekPFHS1yLi2UU3auZrDTVtd6mswm79i7jK2Cks7Vp0Zf3b7a/zk1WUrqgdzMwaYJJaQxMVnZP0zIj41tgnyDDzgSDvjbcqeW/wZbQ7Lef/0Y/CRRflP0fTrqdZCWrbqrKMIGAUX6Jg0jRT3pWyeRdSTTIdNGK0IDBKu8xmVURU8gWsBG4Brh323E2bNsVMm5vrroFd+jU3N/q5FhYi1qxZep41a5LjZZxjYSFpp5T82f+cYee67rr0331Sw9pl1nLArhjz/lzZfgSS3gRsBp4cEa8e9NyZTw0VOUZQVFqkqPr6g9qTdryB+2WYNVFtqaG8JD0d+AngQ1W8X+sVWaKgqDRTd6XslVcmP1944XhpprzTQT/3OQcBs4pUVYb6/cBbgBOzniBpC7AFYKOrNCY33iJmCGXNmhnnGhex4cqgWTxdDgBmlSq9RyDp1cDeiLh50PMiYntEbI6IzRs2bCi7WbOjyIHSItYJbNsGx2UsTK+qOqiZLVFFauiHgPMk7Qb+BHiFpIUK3tegeWmmCy6Axx5bemxhwQHArEaVbl4v6WXAmz1Y3FKTDDynTQU9/3y46qoiWmY28xo/WGxTYpw009lnZ68HcBAwa4RK9yyOiE8Bn6ryPa1A3XRS3mmkWQHAzBrFm9fbaPLMZkoLAEeOwMqV5bTJzCbiQGDFydoLwL0As0bzGMG0qaN89TXXZKeBHATMGs89gmlSxIKvUXkcwKz13COYJmVsDJMlrTrorbc6CJi1kAPBNCm6fDUsTzUNKg/9/OeP/z5mVhsHgmmSd9+AvNK2qOzncQCz1nMgmCZFb8CSlmrqcgAwmxoOBNOkyLpCMHivXzObGp41NG2KKF/9whfCLbdkP+4y4WZTxYHAlhr2ad97/ZpNHaeGLJE2G2hxMSkRXVSqycwayT2CWTesLERRO6WZWWO5RzCrPv5xl4UwM8A9gtnkshBm1sM9gmmQt9Bc2jjAN7/pIGA249wjaLs8heZcHtrMBnCPoK26vYALLsguNHfggMcBzGwo9wjaqL8XkGbPHnjKU5Ye883fzFK4R9AEo24mM6gGUJrt2x0EzCyTewR1G2czmVHKSjsAmNkQze4R1LHtYtXG2UwmT60fjwOYWU7NDQRptfC3bCk3GNQReMbZTCat3HTX4uLwADALAdbMclM08FPj5s2bY9cDD6SXQZ6bg927i3/TtAHYNWvKr61z+umj/55pM4HyXpe6fk8zK5WkmyNi8zivbW6PoIxtFwepcr/fXqNsJvOXf5k9HTRvcMz6Pd/whnyvN7Op09xAUPS2i8NUHXi68m4mI8F55y09Ns44QNbv8+CD5aWInIoya7TmBoKit10cpurA02t+PvlEv7iY/NkbBNLKQuzdmy8ApN2AB/0+ZfR+6hjrMbORNDcQFL3t4jBVB55h0gIAJDfTDRuGvz7rBnzuudmvGdT7GfdTfV0pNzPLrbmDxbt2Vf/GO3YkN6i7704+OW/bVv0A6r59cMopy4+P+vc0aBD60UeTVFDaY2ljDZMMMK9Ykd52KekBmVkhpnOwuA6DUjRVkJYHgVHGAXo/tWdtPH/33fCBD4zW+5nkU32dKTczy6X0QCDpWEn/IOnLkm6X9K6RTjALA41paaCrrx6tF9CfCsqycePoabdJBtKblnIzs+UiotQvQMAJne9XATcBZw96zaZNmyIiIhYWItas6X4mTr7WrEmOT4NXvnLp79b9ymNhIWJuLkJK/ly3Lv1cRVy7ubn0883NjdfWafn7M2sQYFeMeZ+udIxA0hrgc8AvRsRNWc/7tzGCcRZbtUFE0sNJO55HnuqjvaTJxjy8CM2s8Ro/RiBppaRbgb3A9WlBQNIWSbsk7dq3b19ysK65/WWSlgeBUdcDjFJ9dG5utDGPHTtg/fqj6ar165PjVc7gMrNKVRIIIuKJiDgLeDrwIknPTXnO9ojYHBGbN3SnR0460Nik8YW0cYDzzhuvMFzeQCgNni7ab8cOuOSSpTOKHnwQXve65Ps6B9LNrDSVzhqKiAPADcCrcr1gkoHGMhYyjRNYdu7MXg/wF38xXjuyAuHxxy99rwi44orR5vwfPrz8+KFDnvdvNsVKHyOQtAE4HBEHJB0HXAf8ekRcm/Wazc98ZuxaXEw++a5dmxzcv3+0PHfR4wvj5MmzAsCkstpy3HGjrQ/olzXnHzzv36zhmj5GcCpwg6TbgC+SjBFkBgEguYF3P8k/+CA89hhceeVoKYlB4wvjfLIfZS59Whpo//7i9gfImv65f3/68/Omkgal3NaubU6azcwK1cyVxVIsW1c86if5rB7BunVJYBl1BkyeFbJpPQCoboOYSXtB3TGC/vTQypXJ16FDR4951pBZozS9R1CMUWcKZY0vwHirZAcNXH/nO9lpoCoD7aSLt+bn4SMfSYJl17p1cPLJS4MAuF6Q2RRpTyAYtSRB0emTrJvsnj3wtKctPV7XNpFFFOqbn4cHHjj6OzzwwOQpJzNrtGamhlauTAaLu4pMQ6xfnz6gum5dctMbpLcoXdp1+/Sn4aUvnbyNTTOtC/vMpsj0pYbm5tI/1da9LmB+Hs4+Oz0IRExnEADXCzKbcsfU3YBUa9dCfxnq/imT3XUBMFpPISvNkXW8a9KyEG3Wvb51l+g2s1I0MzWUth/BoFlAJ5yQ/wZV1GbxDbxuZja7pi81lGbQXrujrB4eJc2Rth7gPe9xEDCzqdKeQJB31tCwaY15ZtZce212L+Cyy0Zrt5lZw7UnNTRK6eVJyiE4DWRmLTQbqaG0T/K9C596jbMNYloa6OBBBwEzm3rtCQSwfE/hUffeTXPSScsDwJlnJgHguOMmbbGZWeO1KxD0G2Ulbf8ahMsvT17z3e8ufV4E3HlnFa03M2uE9owRTCLP+EIDr4OZWV6zMUYwiUFbO955p4OAmc202QgEaQvIIEkNnXlmtW0xM2uY6Q4EEdl7BMB4s4vMzKbM9AYCKb02UFcVRdPqLpJnZpbD9AWCs85a3gv47GdhYWGyOv2j6g5Qj1L+wsysBtMza+jOO+HZz15+vK7fzzX8zaxCk8waamYZ6lE1sSxEVpE87+plZg3T7tRQWlmII0fqDwIweI9jM7MGaWcg+MM/XB4ArrkmCQArV9bTpn7e1cvMWqJdqaHHHlt+cz31VLj//nraM4h39TKzlmhPj0BaHgQi8gUBT+M0M8vU/EDwlrcsTwM98kj+cYC6pnF6+qiZtURzp4/u3Amnnbb0ge3b4fWvH+1kdU3j9PRRM6vQ9E0fPXRoaRCYn08WhI2jrmmcnj5qZi3RzNRQdz+AJz0pCQDjBgGobxqnp4+aWUs0MxAcPpz8+fjjk+fV65rG6emjZtYSzQwEvQ4eTKZgjmuUXcyKVNf7mpmNqJmDxVIsqTQkJfsU99qxw3P0zcw6Gr1DmaRnSLpB0h2Sbpf0hpFP0p9X99RMM7PCVJEaOgJcGhHPAc4G/puk5+R+dVpePW3ryUlTSGZmM6r0QBAR346IL3W+fwT4GnDawBetXj04r+6pmWZmhal0sFjS6cALgJtSHtsiaZekXfue9rRkTGD37vS8f51TM12uwsymTGWBQNIJwJ8Bb4yI7/Y/HhHbI2JzRGzesGHD4JMVPTUz783dYxNmNoUqCQSSVpEEgR0R8fGJT1jk1MxRbu55xibcYzCzlil9+qgkAVcA+yPijXleM9ZWleMapSbQihXpxe6601u7QaU3WKxZ4/UDZla6Rk8fBX4IuBB4haRbO1/nVvC++Ywy8DxsbMKzmcyshaqYNfS5iFBE/GBEnNX5+kTZ75vbKAPPw8YmPJvJzFqo+SUmyjbKwPOwsQkXmjOzFnIgGHXgeX4+GTtIm97qQnNm1kLN3I+gavPzxQzmep9iM2shB4KiFRVUzMwq4tSQmdmMcyAwM5txDgRmZjPOgcDMbMY5EJiZzTgHAjOzGedAYGY24xwIzMxmnAOBmdmMcyAwM5txpW9MMw5JjwB31d2OhlgPPFB3IxrA1+EoX4ujfC2OOjMiThznhU2tNXTXuDvtTBtJu3wtfB16+Voc5WtxlKSxt3V0asjMbMY5EJiZzbimBoLtdTegQXwtEr4OR/laHOVrcdTY16KRg8VmZladpvYIzMysIg4EZmYzrrZAIOlVku6S9A1Jb0t5/EmSruo8fpOk02toZiVyXIs3SbpD0m2S/k7SXB3trMKwa9HzvJ+UFJKmdupgnmsh6fzOv43bJf1R1W2sSo7/Ixsl3SDpls7/k3PraGcVJP2BpL2SvprxuCT9Tuda3SbphUNPGhGVfwErgW8CzwRWA18GntP3nP8KXN75/rXAVXW0tSHX4uXAms73vzjL16LzvBOBzwBfADbX3e4a/118H3AL8JTOz6fU3e4ar8V24Bc73z8H2F13u0u8Hi8FXgh8NePxc4H/Bwg4G7hp2Dnr6hG8CPhGRHwrIg4BfwK8pu85rwGu6Hz/MeAcSaqwjVUZei0i4oaIONj58QvA0ytuY1Xy/LsAeA/w68C/Vtm4iuW5Fq8H/k9EPAQQEXsrbmNV8lyLAJ7c+f4k4P4K21epiPgMsH/AU14D/GEkvgCcLOnUQeesKxCcBtzT8/O9nWOpz4mII8DDwLpKWletPNei18+RRPtpNPRadLq5z4iIv6qyYTXI8+/i+4Hvl3SjpC9IelVlratWnmvxTuACSfcCnwB+uZqmNdKo95TGlpiwFJIuADYDP1J3W+ogaQXwW8DFNTelKY4hSQ+9jKSX+BlJz4uIA3U2qiY/A3w0It4n6SXAlZKeGxGLdTesDerqEdwHPKPn56d3jqU+R9IxJN29BytpXbXyXAsk/SiwFTgvIh6vqG1VG3YtTgSeC3xK0m6S/OfOKR0wzvPv4l5gZ0Qcjoh/Av6RJDBMmzzX4ueAqwEi4vPAsSQF6WZRrntKr7oCwReB75P0vZJWkwwG7+x7zk7gos73PwV8MjojIVNm6LWQ9ALggyRBYFrzwDDkWkTEwxGxPiJOj4jTScZLzouIsYttNVie/yN/TtIbQNJ6klTRtypsY1XyXIu7gXMAJD2bJBDsq7SVzbET+NnO7KGzgYcj4tuDXlBLaigijkj6JeBvSGYE/EFE3C7p3cCuiNgJfJike/cNkoGR19bR1rLlvBa/AZwA/GlnvPzuiDivtkaXJOe1mAk5r8XfAD8m6Q7gCeB/RMTU9ZpzXotLgd+X9N9JBo4vntIPjkj6Y5IPAOs7YyLvAFYBRMTlJGMk5wLfAA4Clww955ReKzMzy8kri83MZpwDgZnZjHMgMDObcQ4EZmYzzoHAzGzGORCYmc04BwIzsxnnQGCWQ6fW/Ss7379X0u/W3SazorjonFk+7wDeLekU4AXA1K3sttnllcVmOUn6NEmpj5dFxCN1t8esKE4NmeUg6XnAqcAhBwGbNg4EZkN0dnfaQbLz06NTvAGMzSgHArMBJK0BPg5cGhFfI9km8x31tsqsWB4jMDObce4RmJnNOAcCM7MZ50BgZjbjHAjMzGacA4GZ2YxzIDAzm3EOBGZmM+7/Aw8n6FCR3xZyAAAAAElFTkSuQmCC\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}(a)=\\left\\{\\begin{array}\\frac{1}{2}a^{2}&{\\text{for }}|a|\\leq \\delta ,\\\\ \\delta (|a|-\\frac {1}{2}\\del\\\n",
|
||
"ta ),&{\\text{otherwise.}\\end{array}\\right.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Here $a=\\boldsymbol{y} - \\boldsymbol{\\tilde{y}}$.\n",
|
||
"We will discuss in more\n",
|
||
"detail these and other functions in the various lectures. We conclude this part with another example. Instead of \n",
|
||
"a linear $x$-dependence we study now a cubic polynomial and use the polynomial regression analysis tools of scikit-learn."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_27_0.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.0050000000000000044\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import numpy as np\n",
|
||
"import random\n",
|
||
"from sklearn.linear_model import Ridge\n",
|
||
"from sklearn.preprocessing import PolynomialFeatures\n",
|
||
"from sklearn.pipeline import make_pipeline\n",
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"\n",
|
||
"x=np.linspace(0.02,0.98,200)\n",
|
||
"noise = np.asarray(random.sample((range(200)),200))\n",
|
||
"y=x**3*noise\n",
|
||
"yn=x**3*100\n",
|
||
"poly3 = PolynomialFeatures(degree=3)\n",
|
||
"X = poly3.fit_transform(x[:,np.newaxis])\n",
|
||
"clf3 = LinearRegression()\n",
|
||
"clf3.fit(X,y)\n",
|
||
"\n",
|
||
"Xplot=poly3.fit_transform(x[:,np.newaxis])\n",
|
||
"poly3_plot=plt.plot(x, clf3.predict(Xplot), label='Cubic Fit')\n",
|
||
"plt.plot(x,yn, color='red', label=\"True Cubic\")\n",
|
||
"plt.scatter(x, y, label='Data', color='orange', s=15)\n",
|
||
"plt.legend()\n",
|
||
"plt.show()\n",
|
||
"\n",
|
||
"def error(a):\n",
|
||
" for i in y:\n",
|
||
" err=(y-yn)/yn\n",
|
||
" return abs(np.sum(err))/len(err)\n",
|
||
"\n",
|
||
"print (error(y))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let us now dive into nuclear physics and remind ourselves briefly about some basic features about binding\n",
|
||
"energies. A basic quantity which can be measured for the ground\n",
|
||
"states of nuclei is the atomic mass $M(N, Z)$ of the neutral atom with\n",
|
||
"atomic mass number $A$ and charge $Z$. The number of neutrons is $N$. There are indeed several sophisticated experiments worldwide which allow us to measure this quantity to high precision (parts per million even). \n",
|
||
"\n",
|
||
"Atomic masses are usually tabulated in terms of the mass excess defined by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\Delta M(N, Z) = M(N, Z) - uA,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $u$ is the Atomic Mass Unit"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"u = M(^{12}\\mathrm{C})/12 = 931.4940954(57) \\hspace{0.1cm} \\mathrm{MeV}/c^2.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The nucleon masses are"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"m_p = 1.00727646693(9)u,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"m_n = 939.56536(8)\\hspace{0.1cm} \\mathrm{MeV}/c^2 = 1.0086649156(6)u.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In the [2016 mass evaluation of by W.J.Huang, G.Audi, M.Wang, F.G.Kondev, S.Naimi and X.Xu](http://nuclearmasses.org/resources_folder/Wang_2017_Chinese_Phys_C_41_030003.pdf)\n",
|
||
"there are data on masses and decays of 3437 nuclei.\n",
|
||
"\n",
|
||
"The nuclear binding energy is defined as the energy required to break\n",
|
||
"up a given nucleus into its constituent parts of $N$ neutrons and $Z$\n",
|
||
"protons. In terms of the atomic masses $M(N, Z)$ the binding energy is\n",
|
||
"defined by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(N, Z) = ZM_H c^2 + Nm_n c^2 - M(N, Z)c^2 ,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $M_H$ is the mass of the hydrogen atom and $m_n$ is the mass of the neutron.\n",
|
||
"In terms of the mass excess the binding energy is given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(N, Z) = Z\\Delta_H c^2 + N\\Delta_n c^2 -\\Delta(N, Z)c^2 ,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\Delta_H c^2 = 7.2890$ MeV and $\\Delta_n c^2 = 8.0713$ MeV.\n",
|
||
"\n",
|
||
"\n",
|
||
"A popular and physically intuitive model which can be used to parametrize \n",
|
||
"the experimental binding energies as function of $A$, is the so-called \n",
|
||
"**liquid drop model**. The ansatz is based on the following expression"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(N,Z) = a_1A-a_2A^{2/3}-a_3\\frac{Z^2}{A^{1/3}}-a_4\\frac{(N-Z)^2}{A},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $A$ stands for the number of nucleons and the $a_i$s are parameters which are determined by a fit \n",
|
||
"to the experimental data. \n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"To arrive at the above expression we have assumed that we can make the following assumptions:\n",
|
||
"\n",
|
||
" * There is a volume term $a_1A$ proportional with the number of nucleons (the energy is also an extensive quantity). When an assembly of nucleons of the same size is packed together into the smallest volume, each interior nucleon has a certain number of other nucleons in contact with it. This contribution is proportional to the volume.\n",
|
||
"\n",
|
||
" * There is a surface energy term $a_2A^{2/3}$. The assumption here is that a nucleon at the surface of a nucleus interacts with fewer other nucleons than one in the interior of the nucleus and hence its binding energy is less. This surface energy term takes that into account and is therefore negative and is proportional to the surface area.\n",
|
||
"\n",
|
||
" * There is a Coulomb energy term $a_3\\frac{Z^2}{A^{1/3}}$. The electric repulsion between each pair of protons in a nucleus yields less binding. \n",
|
||
"\n",
|
||
" * There is an asymmetry term $a_4\\frac{(N-Z)^2}{A}$. This term is associated with the Pauli exclusion principle and reflects the fact that the proton-neutron interaction is more attractive on the average than the neutron-neutron and proton-proton interactions.\n",
|
||
"\n",
|
||
"We could also add a so-called pairing term, which is a correction term that\n",
|
||
"arises from the tendency of proton pairs and neutron pairs to\n",
|
||
"occur. An even number of particles is more stable than an odd number. \n",
|
||
"\n",
|
||
"\n",
|
||
"### Organizing our data\n",
|
||
"\n",
|
||
"Let us start with reading and organizing our data. \n",
|
||
"We start with the compilation of masses and binding energies from 2016.\n",
|
||
"After having downloaded this file to our own computer, we are now ready to read the file and start structuring our data.\n",
|
||
"\n",
|
||
"\n",
|
||
"We start with preparing folders for storing our calculations and the data file over masses and binding energies. We import also various modules that we will find useful in order to present various Machine Learning methods. Here we focus mainly on the functionality of **scikit-learn**."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Common imports\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import sklearn.linear_model as skl\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error\n",
|
||
"import os\n",
|
||
"\n",
|
||
"# Where to save the figures and data files\n",
|
||
"PROJECT_ROOT_DIR = \"Results\"\n",
|
||
"FIGURE_ID = \"Results/FigureFiles\"\n",
|
||
"DATA_ID = \"DataFiles/\"\n",
|
||
"\n",
|
||
"if not os.path.exists(PROJECT_ROOT_DIR):\n",
|
||
" os.mkdir(PROJECT_ROOT_DIR)\n",
|
||
"\n",
|
||
"if not os.path.exists(FIGURE_ID):\n",
|
||
" os.makedirs(FIGURE_ID)\n",
|
||
"\n",
|
||
"if not os.path.exists(DATA_ID):\n",
|
||
" os.makedirs(DATA_ID)\n",
|
||
"\n",
|
||
"def image_path(fig_id):\n",
|
||
" return os.path.join(FIGURE_ID, fig_id)\n",
|
||
"\n",
|
||
"def data_path(dat_id):\n",
|
||
" return os.path.join(DATA_ID, dat_id)\n",
|
||
"\n",
|
||
"def save_fig(fig_id):\n",
|
||
" plt.savefig(image_path(fig_id) + \".png\", format='png')\n",
|
||
"\n",
|
||
"infile = open(data_path(\"MassEval2016.dat\"),'r')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Before we proceed, we define also a function for making our plots. You can obviously avoid this and simply set up various **matplotlib** commands every time you need them. You may however find it convenient to collect all such commands in one function and simply call this function."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from pylab import plt, mpl\n",
|
||
"plt.style.use('seaborn')\n",
|
||
"mpl.rcParams['font.family'] = 'serif'\n",
|
||
"\n",
|
||
"def MakePlot(x,y, styles, labels, axlabels):\n",
|
||
" plt.figure(figsize=(10,6))\n",
|
||
" for i in range(len(x)):\n",
|
||
" plt.plot(x[i], y[i], styles[i], label = labels[i])\n",
|
||
" plt.xlabel(axlabels[0])\n",
|
||
" plt.ylabel(axlabels[1])\n",
|
||
" plt.legend(loc=0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Our next step is to read the data on experimental binding energies and\n",
|
||
"reorganize them as functions of the mass number $A$, the number of\n",
|
||
"protons $Z$ and neutrons $N$ using **pandas**. Before we do this it is\n",
|
||
"always useful (unless you have a binary file or other types of compressed\n",
|
||
"data) to actually open the file and simply take a look at it!\n",
|
||
"\n",
|
||
"\n",
|
||
"In particular, the program that outputs the final nuclear masses is written in Fortran with a specific format. It means that we need to figure out the format and which columns contain the data we are interested in. Pandas comes with a function that reads formatted output. After having admired the file, we are now ready to start massaging it with **pandas**. The file begins with some basic format information."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"' \\nThis is taken from the data file of the mass 2016 evaluation. \\nAll files are 3436 lines long with 124 character per line. \\n Headers are 39 lines long. \\n col 1 : Fortran character control: 1 = page feed 0 = line feed \\n format : a1,i3,i5,i5,i5,1x,a3,a4,1x,f13.5,f11.5,f11.3,f9.3,1x,a2,f11.3,f9.3,1x,i3,1x,f12.5,f11.5 \\n These formats are reflected in the pandas widths variable below, see the statement \\n widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1), \\n Pandas has also a variable header, with length 39 in this case. \\n'"
|
||
]
|
||
},
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"\"\"\" \n",
|
||
"This is taken from the data file of the mass 2016 evaluation. \n",
|
||
"All files are 3436 lines long with 124 character per line. \n",
|
||
" Headers are 39 lines long. \n",
|
||
" col 1 : Fortran character control: 1 = page feed 0 = line feed \n",
|
||
" format : a1,i3,i5,i5,i5,1x,a3,a4,1x,f13.5,f11.5,f11.3,f9.3,1x,a2,f11.3,f9.3,1x,i3,1x,f12.5,f11.5 \n",
|
||
" These formats are reflected in the pandas widths variable below, see the statement \n",
|
||
" widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1), \n",
|
||
" Pandas has also a variable header, with length 39 in this case. \n",
|
||
"\"\"\""
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The data we are interested in are in columns 2, 3, 4 and 11, giving us\n",
|
||
"the number of neutrons, protons, mass numbers and binding energies,\n",
|
||
"respectively. We add also for the sake of completeness the element name. The data are in fixed-width formatted lines and we will\n",
|
||
"covert them into the **pandas** DataFrame structure."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Read the experimental data with Pandas\n",
|
||
"Masses = pd.read_fwf(infile, usecols=(2,3,4,6,11),\n",
|
||
" names=('N', 'Z', 'A', 'Element', 'Ebinding'),\n",
|
||
" widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1),\n",
|
||
" header=39,\n",
|
||
" index_col=False)\n",
|
||
"\n",
|
||
"# Extrapolated values are indicated by '#' in place of the decimal place, so\n",
|
||
"# the Ebinding column won't be numeric. Coerce to float and drop these entries.\n",
|
||
"Masses['Ebinding'] = pd.to_numeric(Masses['Ebinding'], errors='coerce')\n",
|
||
"Masses = Masses.dropna()\n",
|
||
"# Convert from keV to MeV.\n",
|
||
"Masses['Ebinding'] /= 1000\n",
|
||
"\n",
|
||
"# Group the DataFrame by nucleon number, A.\n",
|
||
"Masses = Masses.groupby('A')\n",
|
||
"# Find the rows of the grouped DataFrame with the maximum binding energy.\n",
|
||
"Masses = Masses.apply(lambda t: t[t.Ebinding==t.Ebinding.max()])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We have now read in the data, grouped them according to the variables we are interested in. \n",
|
||
"We see how easy it is to reorganize the data using **pandas**. If we\n",
|
||
"were to do these operations in C/C++ or Fortran, we would have had to\n",
|
||
"write various functions/subroutines which perform the above\n",
|
||
"reorganizations for us. Having reorganized the data, we can now start\n",
|
||
"to make some simple fits using both the functionalities in **numpy** and\n",
|
||
"**Scikit-Learn** afterwards. \n",
|
||
"\n",
|
||
"Now we define five variables which contain\n",
|
||
"the number of nucleons $A$, the number of protons $Z$ and the number of neutrons $N$, the element name and finally the energies themselves."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" N Z A Element Ebinding\n",
|
||
"A \n",
|
||
"1 0 0 1 1 H 0.000000\n",
|
||
"2 1 1 1 2 H 1.112283\n",
|
||
"3 2 2 1 3 H 2.827265\n",
|
||
"4 6 2 2 4 He 7.073915\n",
|
||
"5 9 3 2 5 He 5.512132\n",
|
||
"... ... ... ... ... ...\n",
|
||
"264 3304 156 108 264 Hs 7.298375\n",
|
||
"265 3310 157 108 265 Hs 7.296247\n",
|
||
"266 3317 158 108 266 Hs 7.298273\n",
|
||
"269 3338 159 110 269 Ds 7.250154\n",
|
||
"270 3344 160 110 270 Ds 7.253775\n",
|
||
"\n",
|
||
"[267 rows x 5 columns]\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"A = Masses['A']\n",
|
||
"Z = Masses['Z']\n",
|
||
"N = Masses['N']\n",
|
||
"Element = Masses['Element']\n",
|
||
"Energies = Masses['Ebinding']\n",
|
||
"print(Masses)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The next step, and we will define this mathematically later, is to set up the so-called **design matrix**. We will throughout call this matrix $\\boldsymbol{X}$.\n",
|
||
"It has dimensionality $p\\times n$, 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": [
|
||
"With **scikitlearn** we are now ready to use linear regression and fit our data."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"clf = skl.LinearRegression().fit(X, Energies)\n",
|
||
"fity = clf.predict(X)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Pretty simple! \n",
|
||
"Now we can print measures of how our fit is doing, the coefficients from the fits and plot the final fit together with our data."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Mean squared error: 0.04\n",
|
||
"Variance score: 0.95\n",
|
||
"Mean absolute error: 0.05\n",
|
||
"[ 0.00000000e+00 7.06492086e-03 -1.73091052e-01 -1.66020213e+01\n",
|
||
" 1.17385778e+00] 15.212327334149492\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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Svd4sbbyWIEtIiJTTSST6c0tbNP15sBWl7iIiEwtkQzs4E0tbNNdua6er6k8VgtbRESmmkgm05tb2Oz2wBgKWYNlWTha6UxERKaYiAb2m57oDSqrnNVUwtqyFNgiIjK1RDSwxya21edjgHINWpZURESmpEim05iVSY3B6g8ITGWnLm38ISIiU1EkA9vsM+rMKYIpAwmLIG7haMCZiIhMQZFMp31XOosNVbrIvZpKyzqbjk1WsURERA4okoE9kteWZVUCG8glKx3lzfWpySuYiIjIAUQysEda2PGYTWzQEASGwVhlLrYCW0REpqKqLk06VYy0sBuzSeyCR9kL2EMZgOa65CSWTEREZP8i2cIemdblOBbNJADIJXxs26KhNjGZRRMREdmviAZ25dayLBqpDDIrZyyaapM4diSrREREprhIptPINWzbgtpy5apAuQZm6Pq1iIhMUZEM7JEWtm1Z2AMBMdemlIHmel2/FhGRqSmig84qiW15hmAooL4uQd1MiyVz6ya5ZCIiIvsX0cCu3LqDldv6uSmuunDRpJVHRETkYCLZJT5yDdsZqiyW4tRF8u8WEREJkUgG9ui0rkLlsV3rTGJpREREDi6SgT2y94eTG75VYIuIyBQXycAebWHnKl3idjaS1SAiIiESyaQandaVr9w6WbWwRURkaotoYA8vnJIbvlVgi4jIFHfQwP7tb39bjXJUVfCmwNY1bBERmeoOOp/pL//yL3EchyuuuILLL7+clpaWapRrQo0MOlMLW0REwuKgLexf/vKX/N3f/R1btmzh4osv5rOf/SwPP/wwnudVo3wTYnSls/xwC1uBLSIiU9y4rmG/+93v5uabb+bJJ5/kggsu4K677uKcc87hH/7hHya6fBNidNDZ0HALW13iIiIyxR3SoLNMJsMf//Ef87nPfY7Zs2dz7733TlS5JpQxBrtssDyDFbOwEtZkF0lERORtjXtNzi1btvDTn/6Uhx56iJkzZ3LFFVdw6aWXTmTZJowxe1c5c7IOlqXAFhGRqe2ggX3vvfdy3333sX37di655BL+7d/+jWXLllWjbBMmMAY3DxYacCYiIuFw0MD+5S9/yac+9SnOP/98isUira2t1SjXhDIG3AKApQFnIiISCge9hv1v//ZvXHjhhTzzzDP80R/9Eddddx0AL7/8Mtdcc82EF3AiVFrYBsvSgDMREQmHcQ86u/XWW/nJT35CbW0tAO94xzvYvn37hBVsIhljhlvYWjRFRETC4ZBGiTc3N495HI/Hj2hhqsUYcIfXEdfGHyIiEgbjTqtMJsPu3btHR1Q/99xzZLPZCSvYRBoddGZp0JmIiITDuKd13XDDDVx99dXs3LmTq666im3btvG9731vIss2YYwBp1i579QosEVEZOobd2AvX76c//iP/2D16tUAnHzyyaPXs8PGGINTNJVpXRl1iYuIyNQ37sAGyGaznHvuuRNVlqoxBpwSYFlYKQW2iIhMfQcN7HvuuedtX//4xz9+xApTLYEx2OXhhVPSCmwREZn6DhrYX/va1zjhhBM45phjqlGeqhi9hp0AO61r2CIiMvUdNLBvuukm7r//fjZt2sQHP/hBLrnkEurq6qpRtgkTBAFuGUiCrS5xEREJgYMG9hVXXMEVV1zBjh07eOCBB/joRz/KMcccw7XXXhvaNcVNGSwfLMfCimnjDxERmfrG3bycP38+n/zkJ/nEJz7B888/z8svvzyR5ZpYhaBym1JYi4hIOBy0hW2M4amnnuK+++5j06ZNXHTRRfzoRz9i/vz51SjfxBgObCup7nAREQmHgwb2OeecM7r/9ec//3ksy6JYLPL6668DcPTRR094IY+44XXE1cIWEZGwOGhgx2Ixenp6uOOOO7jzzjsxxoy+ZlkWjz322IQWcEKMtLA14ExERELioIH9q1/9qhrlqK5C5Y8OdYmLiEhYHDSx/vEf/5GXXnqpGmWpGmsksLVoioiIhMRBE2vZsmX8+7//OxdccAE33ngjv/rVrygWi9Uo24QZCWzNwRYRkbA4aJf4ZZddxmWXXUapVOI3v/kNjz32GDfddBPHHnss559/PitWrKCxsbEaZT1yisMtbA06ExGRkBj35h/xeJxzzz2Xc889F2MMa9eu5Ze//CV33nknP/vZzyayjEecusRFRCRsfq/EsiyLk046iRtuuOGQwrpQKHDppZdy8803/z6nPWJGu8STWkdcRETCoapNzFtuuYXjjz++mqfcv+LwtK60usRFRCQcxt0lvnr16gO+dsoppxz0/Q888ACnnHIKGzduJJfLjfe0E8IaHjNnpdTCFhGRcBh3YD/zzDMArF27liAIOOGEE1i3bh3xeJzvfve7b/ve119/nS1btnD99dezcePGcReuoSGN6x6ZUG1u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ra2NUqkEwOrVq1mxYkVVzj0ypcvSmikiIhJSVWthp1Ip/vZv/5a///u/p6GhgWOPPbYqA85gb2BrhLiIiIRVVYdgnXnmmZx55pnVPGWFX7nRCHEREQmrSCycMrLxB+oSFxGRkIpGYI9cw9YqZyIiElLRCmx1iYuISEhFI7BHusQj8WlFRGQ6ikSEqUtcRETCLhqB7Wlal4iIhFskAjvWGMNyLGItsckuioiIyO8lElthxBpjzL11IXZG87pERCScIhHYAE5dZD6qiIhMQ5HoEhcREQk7BbaIiEgIKLBFRERCQIEtIiISAgpsERGREFBgi4iIhIACW0REJAQU2CIiIiGgwBYREQkBBbaIiEgIKLBFRERCwDLGmMkuhIiIiLw9tbBFRERCQIEtIiISAgpsERGREFBgi4iIhIACW0REJAQU2CIiIiHgTnYBJtozzzzDI488QlNTE5ZlsXLlysku0pTykY98hEQiAYBt2/zgBz+gt7eXb33rW8yfP59t27Zx/fXXM2PGjEku6eTo6urilltuYcOGDfz0pz8FoFgscvPNN9PS0sK2bdv47Gc/y1FHHQXAgw8+yPr167FtmwULFvDRj350MotfVfurq/vuu4//+q//Gv0e+9CHPsTll18ORLuutm/fzi233MLxxx9Pe3s79fX1rFy58m1/9m6//XYGBwfp7+/nzDPP5Pzzz5/kT1E9B6qv2267jeeff37066655hrOPPNMYJrWl5nGcrmced/73meKxaIxxpiVK1eaZ555ZpJLNbXceuutb3nur//6r83Pf/5zY4wxjz32mLnhhhuqXawp4xe/+IV57LHHzAc/+MHR5/71X//VrFq1yhhjzIYNG8yVV15pjDFm165d5rLLLjNBEBhjjLniiivM1q1bq17mybK/uvrpT39qduzY8ZavjXpdrV271jz66KOjjy+66CLz8ssvH/Bnb82aNeYzn/mMMcaYcrlsLrjgAtPf31/9gk+SA9XX/n5/GTN962tad4mvWbOGOXPmEI/HATjllFN4/PHHJ7dQU8xrr73GqlWruO2220br5oknnuDkk08GKnX2xBNPTGIJJ9eFF15IJpMZ89zjjz8+Wj/HHnssGzZsYHBwkKeeeooTTjgBy7IAOPnkk3nyySerXubJsr+6Arjnnnu44447+Jd/+Rd6e3sBIl9Xy5cv533ve9/o4yAISKVSB/zZ+/Wvf81JJ50EgOu6LF68eEzLcro7UH0BfO973+OOO+5g1apV5PN5YPrW17TuEu/u7h7zC6Smpobu7u5JLNHUc/XVV7N8+XJ83+fjH/84mUxmTL3V1NTQ19eH53m47rT+dhm3A31f7dmzZ8zzI3UZZaeffjorVqygsbGRJ554gi9+8Yv84Ac/UF3t49FHH+Wss85iyZIlB/zZ27NnD4sXLx59T01NDXv27JmsIk+qfevrwgsvZO7cuaTTae655x6+9rWvcdNNN03b+prWLeympiaGhoZGHw8ODtLU1DSJJZp6li9fDoDjOJx22mk899xzY+ptcHCQuro6hfU+DvR91djYOOb5oaGhyH+/zZ8/n8bGRgDe/e5388ILL+D7vupq2LPPPstzzz3HV77yFYAD/uy9ub4GBwdH6zVK3lxfS5cuJZ1OA5Xvr2effRZg2tbXtA7sk046iba2NkqlEgCrV69mxYoVk1uoKWTz5s38+Mc/Hn3c2trK/PnzOffcc3nppZeASp2de+65k1XEKWnFihWj9bNx40aWLVtGTU0NZ599Nq+++ipmeHn+l156iXPOOWcyizrpvvWtb+F5HgDbtm1j7ty5OI6juqJyaeXpp5/mxhtvpKuri5deeumAP3srVqxgzZo1AJTLZbZs2cLpp58+WUWfFPurr5tvvnn09dbWVhYsWABM3/qa9pt//O///i8PP/wwDQ0NxGIxjRLfR0dHB1/72tc47rjjGBwcxPM8/uqv/or+/n6++c1vMmfOHHbs2MGf//mfR3aU+PPPP88DDzzAU089xZVXXsmnP/1pAG6++Waam5vZvn07n/vc58aMEn/llVdwHIdFixZFauTz/urq3nvvZdOmTcybN4/XXnuNT3ziE6PXFqNcV6+88gpXXXUVJ554IgC5XI6Pf/zjnHfeeQf82bv99tvp7++nr6+Pc845Z3qMeh6nA9XX1q1byefzNDU18dprr/GFL3xh9GdxOtbXtA9sERGR6WBad4mLiIhMFwpsERGREFBgi4iIhIACW0REJAQU2CIiIiGgwBYREQkBBbaIiEgIKLBFQuqFF17g2GOP5f777z/sY/32t7/l2GOP5Tvf+c7ocy+99BIXXXTRYR33n/7pn/jABz4w5t+yZcv4y7/8y8MtskjkKLBFQigIAr7+9a/z7ne/m/Xr1x/28V599VWWL1/Oo48+Oua5448//oDvOe+88w563Ouvv54HH3xw9N973vMelixZwpe//OXDLrNI1CiwRULoRz/6EQsWLOBjH/sYGzZsOOzjrVu3jssuu4x8Ps+OHTuASmCfcMIJh33sEd/61rd4/PHHueuuu6bFRgwi1aYtmERCpr+/n+9///vcc889lMtlNm7cuN+v+8IXvkBra+t+X7v33ntJJpOjj9etW8eHP/xhLrjgAh599FE+/elPs27dOj7wgQ8ckTJ/+9vf5uGHH+buu++mubn5iBxTJGoU2CIhc9ttt3H55Zczd+5cgiCgVCqxa9cuZs+ePebrbr311nEdr1gssnXrVo477jji8Tg33XQTf/Inf8LmzZvf0iV+zTXXsGvXLgA6OztHA91xHO677779Hv873/kODz30ED/84Q9paWk51I8rIsMU2CIhsnnzZn70ox9RX1/PQw89BFS2D1y/fv1bAnu8LewNGzYwb948MpkM73jHO+jo6ODpp59m1qxZ1NbWjnnf97///dH75513Hg8++ODblnfVqlX85Cc/4e67735L+UTk0CiwRULkpptu4qtf/Sof+tCHRp+78cYb2bBhw1sGgY23hb3vtWrLsjjvvPO49dZb33bA2Xjceeed/PCHP+SHP/wh8+bNO6xjiYgCWyQ0HnvsMTo7O/ngBz845vmlS5eyevXq3/u469atGxPOF1xwAT/84Q8Pa0rX1q1bufnmm5k5cybXXXfdmNc+//nP84d/+Ie/97FFokr7YYuIiISApnWJiIiEgAJbREQkBBTYIiIiIaDAFhERCQEFtoiISAgosEVEREJAgS0iIhICCmwREZEQ+P8BYqe1VChmaXYAAAAASUVORK5CYII=\n",
|
||
"text/plain": [
|
||
"<Figure size 576x396 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_57_1.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# The mean squared error \n",
|
||
"print(\"Mean squared error: %.2f\" % mean_squared_error(Energies, fity))\n",
|
||
"# Explained variance score: 1 is perfect prediction \n",
|
||
"print('Variance score: %.2f' % r2_score(Energies, fity))\n",
|
||
"# Mean absolute error \n",
|
||
"print('Mean absolute error: %.2f' % mean_absolute_error(Energies, fity))\n",
|
||
"print(clf.coef_, clf.intercept_)\n",
|
||
"\n",
|
||
"Masses['Eapprox'] = fity\n",
|
||
"# Generate a plot comparing the experimental with the fitted values values.\n",
|
||
"fig, ax = plt.subplots()\n",
|
||
"ax.set_xlabel(r'$A = N + Z$')\n",
|
||
"ax.set_ylabel(r'$E_\\mathrm{bind}\\,/\\mathrm{MeV}$')\n",
|
||
"ax.plot(Masses['A'], Masses['Ebinding'], alpha=0.7, lw=2,\n",
|
||
" label='Ame2016')\n",
|
||
"ax.plot(Masses['A'], Masses['Eapprox'], alpha=0.7, lw=2, c='m',\n",
|
||
" label='Fit')\n",
|
||
"ax.legend()\n",
|
||
"save_fig(\"Masses2016\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"As a teaser, let us now see how we can do this with decision trees using **scikit-learn**. Later we will switch to so-called **random forests**!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAesAAAFpCAYAAAC8iwByAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABLaUlEQVR4nO3deXwU9f3H8deeuUNOCOG+5b4RRAU8EBARtFovPKq1atVWa/Fqtdaq4FUrtCq1rf486lEURK1nRRFFUQEBuQk3hJB7k+w9vz82WQgkZCPJbjb7fj4ePLKZnZ357DcJ7/3OfGe+JsMwDERERKTFMke6ABERETk2hbWIiEgLp7AWERFp4RTWIiIiLZzCWkREpIVTWIuIiLRw1kgXINKcli1bxsMPP8yGDRsYOXIkhmHgdDqZNGkSV155JTab7bi2/8033/C3v/2Nf/7zn8dcb/HixSxfvpwHHnjguPZ3pEmTJpGdnQ3Atm3bMAyDHj16AFBQUMB7773XpPs70sKFC3n66afZvXs3Q4cOxev1cvDgQcaNG8ddd92F2Rwd/YFzzjmHefPm0aVLl0iXIlInk66zltbuq6++4vLLL2fdunVYrVaKi4u57bbbsFgsPP3008cVKIZh4HA4SElJOeZ6Pp8Pp9NJUlLSj95XXWbOnMkLL7wAwB133IHX6+XRRx896rnm9MYbb/DEE0/w2WefAbBr1y6mTJnCfffdx3nnndfs+28KZWVlpKamRroMkXpFx8dekSaUnp7O7Nmz+eqrr3jrrbeOa1smk6nBoAawWCxNHtQAt9566496rjl16tSJXr16sXbt2ojs/8dQUEtLp8PgEpOys7M5+eSTee+995g+fToQOKT78ssvY7fbadeuHffddx/JyclA4HD63Llzsdls+P1+LrvsMk488USuu+46Vq9ezcaNGwF49dVXWbBgAQkJCcTHxzNr1iy8Xi+zZs2ivLyc//3vfwAcPHiQ++67j6KiIjweDxdffDEzZsxg7969/PrXv2b16tXMnj2bRYsWsW/fPh566CGGDRt21PsYOnRove9x6NChvPrqqzzzzDMMHjyYpKQk1qxZQ2pqKi+88AJLly5l3rx52Gw2kpOTue+++2jXrh0Aa9eu5aGHHsJkMmGxWLjnnnuCh9dD4fP5yMnJCX5/rO2tWbOGe++9F7vdTp8+fdi0aRPFxcX89re/ZenSpbz99ttcdtllbNmyhbVr13L++edz00038eyzz/LBBx9gtVrp27cvt99+O3a7na1bt3LfffcB4PV6+clPfsJ5553HwYMHueOOO3C5XHi9XiZMmMC1117L7Nmz+c9//sNdd90VPBJQ87tgs9lIT0/nD3/4A1lZWcybN49///vfnHXWWZSXl7N+/Xr69+/PnDlzQm4bkR/FEGnlli9fbvTu3dvweDy1lj/wwAPG5MmTDcMwjG+++cYYNWqUUVhYaBiGYcyePdu46667DMMwjJ07dxpDhw418vLyDMMwjNWrVxuXXXaZYRiGsWvXLqN3796GYRiGw+EwRo0aZbhcLsMwDOO5554zFixYEKxhwoQJwX1fccUVxpNPPmkYhmEUFhYaY8eONVasWFFrm++8845hGIYxf/5842c/+1mD7/P22283fvOb3xy1/MknnzROOukko7Cw0PD5fMbDDz9s7Ny50xgyZIixdetWwzAM48UXXzSuuOIKwzAMo6yszDjxxBONL774wjAMw/jkk0+MiRMnGj6fr879LliwwDjllFOC3//www/GTTfdZJSXlze4PZfLZZx66qnG4sWLg6/t27dvsN0MwzAuu+wy46qrrjK8Xq+xdetW47XXXjMWLVpkTJo0yaisrDT8fr9x8803G3/9618NwzCMm2++Odh2Bw4cMK6++mrDMAxjzpw5xjPPPGMYhmFUVFQYF110Ua191OxzxYoVxujRo4O/C3/961+Nyy+/vFY7n3vuuYbL5TKcTqcxatQo47vvvmvgpyNyfHQYXGKW3+8PPn7zzTc57bTTyMjIAAIDjhYvXoxhGLz99tsMGDCArl27AjBo0CB+/etfH7U9i8UCBHplVVVVXHrppUydOvWo9fLz8/nyyy85//zzAcjIyGD8+PEsWLCg1nqnnnoqAH369GH37t3H9V6HDBlCRkYGZrOZ3/72t8H31L17dwCmTp3Kl19+yYEDB/jkk09ITExkzJgxAIwfP56DBw+yevXqerdfVFTEzJkzmTZtWvB91xyVONb2Vq1aRWFhIZMnTwagb9++dfbgx40bh8VioXv37lxwwQW8+eabnH322SQkJGAymZg6dSqLFi0CoE2bNrz33nvs3r2b7Oxs5s6dC0BaWhpLly5l8+bNJCYm1jsocOHChYwfPz74u3D++eezfPly9u7dG1znxBNP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+fncf//99O3bF4fDgdfr5c4776SsrIxHH32U3Nxcdu3axW9+85uYHQ3+9ddfs3DhQpYuXcrFF1/Mz372MwDmzJlDdnY2O3fu5Be/+EWt0eBr167FYrHQtWvXmBrhXFdbvfrqq2zevJmOHTuyadMmLr/88uD5xFhuq7Vr1zJz5kwGDBgAQGVlJZdeeimnnXZavX97zz77LGVlZZSWlnLqqae2jhHOIaivrfLy8qiqqiIzM5NNmzZx8803B/8OW2NbteqwFhERaQ1a7WFwERGR1kJhLSIi0sIprEVERFo4hbWIiEgLp7AWERFp4RTWIiIiLZzCWkREpIVTWItILStWrKBPnz68+eabkS5FRKoprEUkyO/388ADDzB69GjWr18f6XJEpJrCWkSCXnvtNTp37swll1zChg0bIl2OiFTTVEoiAkBZWRlPP/00L730Eh6Ph40bN0a6JBGpprAWEQDmzp3L9OnT6dChA36/H7fbzb59+2jfvn2kSxOJeQprEWHr1q289tprpKWl8dZbbwGB6QXXr1+vsBZpATTrlohw9dVXM2XKFM4///zgsrvvvpsOHTpwww03RLAyEQENMBOJeR9//DEHDhxgxowZtZb36tVLg8xEWgj1rEVERFo49axFRERaOIW1iIhIC6ewFhERaeEU1iIiIi2cwlpERKSFU1iLiIi0cAprERGRFk5hLSIi0sL9P9puQA2En1dtAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<Figure size 576x396 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_59_0.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" N Z A Element Ebinding Eapprox\n",
|
||
"A \n",
|
||
"1 0 0 1 1 H 0.000000 0.000000\n",
|
||
"2 1 1 1 2 H 1.112283 1.112283\n",
|
||
"3 2 2 1 3 H 2.827265 2.827265\n",
|
||
"4 6 2 2 4 He 7.073915 7.073915\n",
|
||
"5 9 3 2 5 He 5.512132 5.512132\n",
|
||
"... ... ... ... ... ... ...\n",
|
||
"264 3304 156 108 264 Hs 7.298375 7.298375\n",
|
||
"265 3310 157 108 265 Hs 7.296247 7.297260\n",
|
||
"266 3317 158 108 266 Hs 7.298273 7.297260\n",
|
||
"269 3338 159 110 269 Ds 7.250154 7.250154\n",
|
||
"270 3344 160 110 270 Ds 7.253775 7.253775\n",
|
||
"\n",
|
||
"[267 rows x 6 columns]\n",
|
||
"0.009883615646716182\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": [
|
||
"The **seaborn** package allows us to visualize data in an efficient way. Note that we use **scikit-learn**'s multi-layer perceptron (or feed forward neural network) \n",
|
||
"functionality."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJjCAYAAADQ22+yAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABlUUlEQVR4nO3dd3QU1f/G8fduNo0SahIIKEUFGyoKKqggqJCEGhVBFCkiolQLElHAAlKVriJdRCkqBJAIggKCiIL+wI5fEAEhJBQNBFK2/P4YSYiBJUsmu9nkeZ2Tc7KzZe6dmex+9rl3JhaXy+VCRERERExj9XUDRERERIobFVgiIiIiJlOBJSIiImIyFVgiIiIiJlOBJSIiImIyFVgiIiIiJrP5ugEiJdmIESP49ttvAdi9ezfVqlUjJCQEgEWLFmX/fiGPPfYYgwcP5vLLLz/vYyZNmkSNGjVo3759gdt9Rr9+/fjmm29Yv349oaGhpr2uiIi/s+g6WCJFQ/PmzZk0aRL16tXzdVPy5fDhw7Rr147rr7+eO++8kwcffNDXTRIRKTI0RChSRE2ZMoVHH32UNm3a8Oyzz3LkyBGefPJJOnbsSPPmzenSpQtHjx4FjOLshx9+YOvWrXTq1IlBgwbRvn17YmNj+frrrwGIj49n1qxZANSrV48pU6bQqVMnmjdvzty5cwFwOByMGjWKe+65h3vvvZeXXnqJLl26nLN9ixcvplGjRsTFxfHuu+9y9ne1HTt20KFDB1q3bk1cXBxbtmxxu7xu3bocO3Ys+/lnbm/dupW2bdvSqVMn2rZtS2ZmJiNGjKBDhw7ExsYSExPD9u3bAUhLS+P555+nZcuWxMbG8sYbb3Dq1CkaNmzIH3/8kf3a3bt3Z+3atWbsIhGR81KBJVKE/fXXXyxdupTx48fzySefcMMNN7Bo0SLWrVtHSEgICQkJeZ6zc+dOevTowbJly7j//vuZOnVqnsdkZmZSoUIFFi5cyOTJk3n99dfJyMhgyZIl/PTTT6xcuZKFCxeyf//+c7bLbrezePFi2rZtS/PmzTl69CgbN24EICsriz59+tCnTx9WrlzJq6++ymuvvUZmZuY5lzudTrfb4Pfff+f1119n+fLl/PTTTyQnJ7No0SJWrVpFXFwcM2bMAGDy5MlkZGSwatUqli1bxnfffccPP/xA+/btWbJkCQD79u3jjz/+oFmzZh7tBxERT2kOlkgRdsMNN2CzGX+mXbt2Zdu2bcyZM4e9e/fy+++/c/311+d5TlRUFFdddRUAV199NUuXLj3na991110AXHPNNWRmZnLq1Ck2bNhAu3btCA4OBqBjx47Mnz8/z3PXrVuH0+nkjjvuwGazERsby7x582jatCm7du3CarVy5513AnDttdeyYsUKfvrpp3Muv5CqVatSrVo1AOrXr0+5cuWyi7+tW7dSunRpAL766iuef/55AgICCAgI4L333gMgIiKChx9+mKeeeopFixZx//33ExAQcMH1iogUhAoskSKsVKlS2b+PGzeOnTt3ct9993HLLbdgt9s51xTKsyfGWyyWcz4GyC6iLBYLAC6XK7uYO8NqPXfI/cEHH5Cenk6LFi0AIxFLSUnh999/JyAgIPs1z9i1a9d5l9euXTvXsszMzFy3z94G69evZ+TIkXTv3p277rqL2rVrs3z5cgBsNluu1z906BAhISHUqlWLunXrsm7dOlasWJGdZomIFCYNEYr4iU2bNtG1a1fat29PpUqV+Oqrr3A4HKauo2nTpixfvpzMzEzsdvs5068//viDb775hqVLl/L555/z+eefs2nTJho0aMC8efOoXbs2FouFzZs3A/DTTz/RtWvX8y53Op1UrFiRH374AYDPPvvsvO3bvHkzzZo1o3PnztSrV4+1a9dmb4NGjRqxdOlSnE4nmZmZ9O/fP/sMzc6dOzN27Fiuv/56IiMjTd1mIiLnogRLxE/06dOHsWPH8uabbxIQEMCNN97Ivn37TF3Hvffeyx9//EH79u0pVaoU1atXz3P5hQ8++IC7776bSy+9NNfyvn378vjjj/P0008zZcoUXnvtNcaOHUtgYCBTpkwhKCjovMtffPFFXnnlFcLCwmjcuDHh4eHnbF+nTp149tlnadOmDQEBATRo0IA1a9bgdDrp27cvI0eOpF27djgcDmJjY7MTtmbNmvHiiy/SqVMnU7eXiMj56DINIpJt06ZNHD16lHbt2gHGdbqCg4MZNGiQj1tWMN999x1Dhw5l5cqVeYYpRUQKgwosEcl2+PBh4uPjOXr0KA6HgyuvvJKXXnqJsmXL+rppF23w4MF88803jBkzhptvvtnXzRGREkIFloiIiIjJNMldRERE/N6KFSuIjY3lnnvuYcGCBb5ujia5i4iIiH87fPgw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u6+m19bV8NK9XltXYSpmUzFFREREfK+Ynu8gIiIiZilOZ/d5ixIsEREREZMpwRIRERG3dBah55RgiYiIiJhMBZaIiIiIyTREKCIiIm45XMpjPKUtJiIiImIyJVgiIiLillN5jMe0xURERERMpgRLRERE3NJlGjynBEtERETEZEqwRERExC2dReg5bTERERERkynBEhEREbecmoPlMSVYIiIiIiZTgiUiIiJuOZTHeExbTERERMRkSrBERETELZ1F6DltMRERERGTKcESERERt/S/CD2nLSYiIiJiMhVYIiIiIibTEKGIiIi45XDpQqOeUoIlIiIiYjIlWCIiIuKWLjTqOW0xEREREZMpwRIRERG3nLrQqMe0xURERERMpgRLRERE3PLXOVjbt2/ntddew263U758eV577TWqVatGamoqzz77LPv376dixYpMnDiR8PBwMjMzeeGFF/jxxx8JCQlh/PjxXHbZZRe1bv/cYiIiIiIXMGjQIEaOHElCQgJt2rRhxIgRAEycOJEGDRqQmJhIhw4dGDlyJADz588nNDSUxMREhgwZQnx8/EWvWwWWiIiIuOVwWbz2k5qayoEDB/L8pKametTmzMxMBgwYwJVXXglA3bp1OXToEADr16+nTZs2ALRu3ZqNGzeSlZXF+vXradu2LQANGzbk+PHjHDx48KK2mYYIRUREpMiYN28eU6dOzbO8b9++9OvXL9+vExQURLt27QBwOp1MnTqVu+++G4Dk5GTCw8MBsNlslClThmPHjuVaDhAeHk5SUhJRUVEe98PvC6wgi64uW1KVLeG7PtBSsgPoAEr2AeDA5esm+IyzBPfdV7z5z567du1KXFxcnuVhYWHnfU5iYiKjRo3Ktax27drMnTuXzMxM4uPjsdvtPP744+d9Dav13H083/IL8fsCS0RERIqPsLAwt8XUucTExBATE5NneVpaGk888QTly5fnrbfeIjAwEICIiAiOHDlClSpVsNvtnDx5kvLlyxMREUFKSgo1atQAICUlhYiIiIvqR8n+CiwiIiIX5HBZvfZjpkGDBlGjRg0mTZpEUFBQ9vKmTZuybNkyAFatWkWDBg0IDAykadOmJCQkALBt2zaCg4MvangQwOJyufw6az3418V1XPxfSf92oCFCDRGWVBoihPCov7y6vtm7bvfaunrU2WTK6/z888/ExcVx+eWX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iImJyffjIyIiOHLkCFWqVMFut3Py5EnKly9PREQEKSkp1KhRA4CUlBQiIiKIjIzMngh/9nJ3NAdLRERESpSmTZuybNkyAFatWkWDBg0IDAykadOmJCQkALBt2zaCg4OJioqiSZMmrFixAofDwZ9//snevXupV6+e23UowRIRERG3its/ex4wYADx8fG0atWKsmXLMn78eAC6dOnCsGHDaNWqFUFBQYwdOxaA6Ohodu7cmT0BfuTIkYSEhLhdh8V1roFFP+JMquPrJoiIiHiVtcour67v5m5veG1d38x92mvrKkxKsERERMQ9v45ifENzsERERERMpgRLRERE3Cpuc7C8QQmWiIiIiMmUYImIiIh7SrA8pgJLRMQP7bWf8HUTfKZaQKivm+Bzwb5ugFyQCiwRERFxS3OwPKc5WCIiIiImU4IlIiIi7vn3Ncl9QgmWiIiIiMlUYImIiIiYTEOEIiIi4pYmuXtOCZaIiIiIyZRgiYiIiHtKsDymBEtERETEZEqwRERExC2L09ct8D9KsERERERMpgRLRERE3NMcLI8pwRIRERExmRIsERERcUvXwfKcEiwRERERkynBEhEREff0z549pgRLRERExGRKsERERMQtzcHynBIsEREREZMpwRIRERH3lGB5TAmWiIiIiMlUYImIiIiYTEOEIiIi4pYmuXtOCZaIiIiIyZRgiYiIiHu60KjHlGCJiIiImEwJloiIiLilOVieU4IlIiIiYjIlWCIiIuKeEiyPKcESERERMZkSLBEREXFLc7A8pwRLRERExGRKsERERMQ9pyIsTynBEhERETGZEqzzWL8FJrwDmVlQtzaMGAxlSud+zPI1MHshWCwQEgwv9Idrr4TMTBg5Gb7+DkqHwp2NoW93sBbBcjY//XT3OIcDxkyDTd8av3fvCJ3a5X7ugUNw/2Mwc7yxfZZ9CvOW5Nx/4iQcToEvPoTKFQu3v/mV3+3icsGQ0XBFLejRyVjmcMCrE2HbDuN2k1th0BPGceKPznecn+2rbTDurZzb6Rmwd7+FD99xcU1d77a3oLTv81q7JpClHwZl305Ls3AkxcL8hSeZNjmEQwdz3tySkqzUu87OSyNO+6KphcblgqGjA7i8lotunZyA8d41fGwAf+yz4HJB25ZOenR2+rilhUQBlseK4Ee+7x37G14YDZNehcT3oHoUvD4992P+2Gd8oLwzDpbOgt6PQP+hxn3T34ODh2H5HPhwBqQchQ+WebsXF5affl7ocYuWw94DRl8XT4d3P4Sdv+Q8NyMDnhsBWfacZe2jjW22dJbxnMoV4cWBRae4yu922b0Xuj8Fn36Re/nyNbB3PyTMgaWz4dv/g9XrC7/dhcHdcX62xg1y9unSWVCnNjz2kP8VV9r353Z3iyymvZPGtHfSmPRmGhUqOHmyXzoVKrp48aXT2ff1f/o0ZUq76NM/3ddNNtWeP6Hn0wGsWZ+7Up4220pkuIulc+28/7adxQlWdvzk59W0mMYrBdbOnTuzf9+yZQujR49m/Pjx7Nixwxur99jmb41v6DWrG7cfbAcr1+b+V0xBgfDqcxBRybh9bV04csz41vvTLohtDsHBRmp11x2weoP3+3Eh+ennhR639ku4NwZsNihX1uj3ijU5z31lolFQlS937jbMfB8qVYCObU3v3kXL73Z5fxnExUB0s9zLHU44nW4cC5mZRnEZHIRfcnecn8/yNfBXEvTv4Z02mkn7/sKWLAyifAUXsW1yHwRZWfD6mFB69UknPKJ4xR0Ll1ppH+OkxZ25+zW4n5NnnjASqyNHjf1epnTx6vsZFpf3fooLrxRYw4cPB2DBggW89tprVKlShcqVKzNs2DDee+89bzTBI0nJUDUi53ZkOJxMs5B2KmdZtapwZyPjd5fLGCZrdpvxgXTdVZD4OaSdMv7gPllrpFhFTX76eaHHJaVAlf/cl5Ri/L5kJdjt8ECbc6//+N8wdxE838+U7pgmv9tl6EBo1zLv8+OiIaws3HkfNLkXLq1mHBv+yN1xfi6ZWcbw2vN9jaLb32jfu/fPPxY+XhLM40/mTahWJwZSqbKL2263n+OZ/m3IQCdtWuT95LdYjOP8+REB3NvdRoMbXNS8xAcNlCLJq0OEixcv5t1336Vbt25069aNBQsWFMkCy3meIfRzzaE6dRqeGg5//gWvDjKW9ewMl9eCB5+EHk/DDddCYBH8sMlvP9097lz3BViNFG/RcnjpmfOvf/EKaH47VK+av/Z6iyf7/1ymzYUK5eDLZbD+Q/gnFeYsMqt1vnGu4/xc1qyHS6rBTdd5rWmm0r53L3FlILc2zqJK1bzFxrIPg3jwoQwftMr3Rr3oYGOCndQT8Pa7mnkjBq8cCXa7HafTSaVKlShVqlT28qCgIKxFcOZ31cjcidPhI1CurItSobkfd/AwdO4D1gCYN9H45grGm2q3jrB8Lrw3xXjDvbSat1rv3uRZEPeo8fPhJ/nrp7vt8d/7ko9AZAQkrIaTacb2iXsUUo7AoBHw+eacxyZ+YQyzFDX53f/n89mXcF+skfKULWMMkW79vnDaWhjOPkYmzzr/cX4uiV8YQ8b+qqTv+7O9OyeYPr1K06dXad6dEwzAxvWB3BOdd3z4f79bcTgt1Lve4e1mFopps610eNRGh0dtTJt9/s+ozd9YSD5i/F6qFMQ0d/LLrmI6B8vl8t5PMeGV6qZChQo0bdqU//3vf9nDhVu2bKFTp05ER0d7owkeua0h7PjZmLwNRhLT/D8x/9+p8Eh/uKcJvDHcOLvqjC82w0vjjeMk7RTMWwxt7vFe+93p/2jOROSFb124n+B+e9x1G3y8yhgKTD0Bq9bBXbfDkH7w6YKcdYVXhnEv5jzvnxOw7y+of23h99lT+dn/7lx9hVFogDEH5/PNcP3V5rezsJx9jDzS4fzH+X+5XMbZc7fe6L22mq2k7/uzPdI9I3vy+iPdMzhxAg4etHL1NXmLqB922rj+Brvfny15Rp8eTpbMsrNklp0+Pc5/VuCa9VbenmfF5TLm3K1eb+WWG4tPgSAF45WBq3fffReAPXv2kJqaChjpVf/+/bnzzju90QSPVKoAI+Nh4DBj4uYl1WD0EPjxVxj679lUCxPgULIxyXvtlznPnf0G3BsLO36BNt2MIYcOraHlnb7qzfmdr5+Qu6/uHtepHew7CO0fNe7r2BZuvuHC6953AMIrFc2h0/zsf3fi+8LISRDbxRhaanSjMWzsj9wd51lZ8PhgmD4GIirD8X+MocSz5+T5G+378zv4l5WKFV3nnFt38ICVyCrF9PIEbjzzhIMRbxjzrywWaH67k4fuK57boThNPvcWi8vl33mcM6mOr5sgIuJ1e+0nfN0En6kWkM8x22IsuOoer66vWcsxXlvXF6sHe21dhakI5gciIiJSpPh1FOMbRW+GuYiIiIifU4IlIiIibln8ezaRTyjBEhERETGZEiwRERFxr3ieHFmolGCJiIiImEwJloiIiLilOVieU4IlIiIiYjIlWCIiIuKeAiyPKcESERERMZkSLBEREXFPc7A8pgRLRERExGRKsERERMQtiwIsjynBEhERETGZCiwRERERk2mIUERERNzTJHePKcESERERMZkSLBEREXHLon/27DElWCIiIlKsTZo0iSlTpmTf3r17N507d6Zdu3Z07NiRX375BYDMzEwGDRpETEwMcXFx7N69GwCXy8WYMWOIjo4mNjaW7du3X3CdKrBERETEPZfLez8mOnHiBEOGDGH27Nm5lr/44os89thjJCQkMHDgQAYPHgzA/PnzCQ0NJTExkSFDhhAfHw/A6tWr2b17N6tWrWLatGnEx8djt9vdrltDhCIiIlJkpKamkpqammd5WFgYYWFhHr3WunXrqFmzJt27d8+1vEOHDjRp0gSAunXrcujQIQDWr1/PgAEDAGjYsCHHjx/n4MGDbNiwgdjYWKxWK7Vq1SIqKorvv/+ehg0bnnfdKrBERETEPS+eRDhv3jymTp2aZ3nfvn3p16+fR6/Vvn17gFzDgwD33ntv9u+TJ0/m7rvvBiA5OZnw8PDs+8LDw0lKSiI5OZmIiIg8y91RgSUiIiJFRteuXYmLi8uz3F16lZiYyKhRo3Itq127NnPnzj3vc1wuF2PHjmXHjh28++67532c1WrFdY6hS6vV/SwrFVgiIiLilsWL18G6mKHAmJgYYmJi8v14u93O4MGDOXz4MO+++y5ly5YFICIigpSUFGrUqAFASkoKERERREZGkpKSkv38M8vd0SR3ERERKVHGjBnDyZMnmT17dnZxBdC0aVMSEhIA2LZtG8HBwURFRdGkSRNWrFiBw+Hgzz//ZO/evdSrV8/tOpRgiYiIiHvF6Erux44dY8GCBVSvXp0OHTpkL09ISKBLly4MGzaMVq1aERQUxNixYwGIjo5m586dtG3bFoCRI0cSEhLidj0W17kGFv2IM6mOr5sgIuJ1e+0nfN0En6kWEOrrJvhccNU9Xl1fi1tf8dq61nw9zGvrKkxKsERERMQ9XcndY5qDJSIiImIyJVgiIiLiljfPIiwulGCJiIiImEwFloiIiIjJNEQoIiIi7mmI0GNKsERERERMpgRLxE/d80trXzfBpz6qu8TXTfCpQIuvW+A7ravd5Osm+Nxn3r5sghIsjynBEhERETGZEiwRERFxTxca9ZgSLBERERGTKcESERERt3ShUc8pwRIRERExmRIsERERcU8JlseUYImIiIiYTAmWiIiIuKcEy2NKsERERERMpgRLRERE3FOC5TElWCIiIiImU4IlIiIi7ulK7h5TgiUiIiJiMhVYIiIiIibTEKGIiIi4pX+V4zklWCIiIiImU4IlIiIi7inB8pgSLBERERGTKcESERER95xKsDylBEtERETEZEqwRERExD3NwfKYEiwRERERkynBEhEREfeUYHlMCZaIiIiIyZRgiYiIiHtKsDymBEtERETEZEqwRERExD1dB8tjSrBERERETKYES0RERNxzOX3dAr+jBEtERETEZCqwREREREymIUIRERFxT5dp8JgSLBERERGTKcESERER93SZBo+VyAJr/RaY8A5kZkHd2jBiMJQpnf/HORwwZhps+tb4vXtH6NTOeM7eA/DiaPg7FUqFwughULuGcd+cRfDRKrAFQIXy8PIzcGk147EvvwG//g9CQ+DeGHj4vuLVf5cLJs2CtRuNx117JQx/2ujvsb9h+HjY95fxek0bwTOPg9VH+Wp+t4/LBUNGwxW1oEenvPf3exEiKsPQgYXeZI/dVvlaBl/VmbZfDnH7uLplL2XijX3p+NXLpGalXfT6rFh44vJ2NKhYlwBLAIv3f8HKg1v+XcclPHlFe0KsQVgtVhbt+5y1h7df9LoKy5KlNj5KsGGxQLUoJ0OezaRihdyPGTwsiMqVXAwakOWbRhaiPXusTJ0SQlqahQArDHz6NHXqOMnKgqlTQvjhhwAAbr7ZzmO9MggI8HGDz2PQ7D788dM+Pnx9hdvHNW7XkOfm9aV9+a4FWl9waBBPz3iCy+vXxGK1MjP+Pb5K+BaAJh0a8dALxpv9P0dOMKn3dP76X1KB1idFR4kbIjz2N7wwGia9ConvQfUoeH26Z49btNwoJJbPgcXT4d0PYecvxn3PvWoUGyvfhb7dof8w44P4q23w0Sew8E1YNhvuucP4cAYYPdUoRlbOg4Vvwcat8MVXxav/n30JX30LH8+CFfMgPR3mf5jT/8tqQsIc+GgG7PgZliYWTv8vJL/bZ/de6P4UfPrFuV9n5vuwfWdhtvTiVQutzOOXtcWKxe3jwgJLM7DufQRZC/49rHVUI6qVCufRb8fx5PYJ3Fe9CXXLXgrA8Gu7Me+PT3l82+s8v/Mdel/elmqhlQu8TjP98puFBYtszJyazgdz0rmkuovpswNzPWb+Bzb+b2cRrSoKKD0d4p8rRceOmUx/J42HumQwamQoAAnLgvjnbwszZ6UxY2YaP/0UwIb1Re+7+6VXVmPs2uE0eaDRBR9b7fIq9Br3CFYTvuV1eekBTqel8+g1TzG4xav0n9aTytUqUj6iHAPe6sWLrUfx+A3PsnnpVvpOebTA6ys0Lpf3fooJrxVYX375JampqQAsW7aMV155hY8++shbq8+2+VsjPalZ3bj9YDtYuTbvPnX3uLVfGimTzQblykJsc1ixBg6nwJ59EHuX8Zwmt8LpdPj5d6hcEYY9nZOEXHslHDxs/P7TLmjXAgICICjQSHDWbChe/W/RBBZMM/qXdgqO/g3lw4zH3X0HPBRn/B4cbCRCZ7aNt+V3+7y/DOJiILpZ3tfY+h1s+gY6tiv05nos2BrI81c/xFv/S3D7OAsWnr/qIWbtWZXnvpiqt/BWg6d4u8HTjL2+N5eUish1f8sqDXnuytyR3u3h9fj00Dc4XU5O2k/zRfL/cXeVmwi02pi/dw3fHf8dgCMZ/5CalUZ4cPmCddRkV9V18eF76ZQpAxmZkHLEQrmwnPu3fW9ly7cBxLW1+66RhWj7NhtVo5zccqvRv8aN7QwddhqA+ztk8uKw01itkPqPhbSTFsqGFb0PybZ9olkz9ws2Lt7i9nHBoUEMnt+f6c/My3Nf5yH38ua2Mbz93The+ngQlarmjjC7DO9Al+Edci27vf3NrJqxFoCU/UfYvmYnTR9ozN/J//BAlZ6kHDiKNcBKRI1wUo+eLGAvpSjxSoE1cuRIpk+fTkZGBhMnTmTFihVcfvnlfPbZZ4wYMcIbTciWlAxVz/o8iAyHk2kW0k7l/3FJKVDlP/clpcChZGNI6OwvPVXCjcKjTm24+QZjWWYmvDEdou80bl93FSSsgSy7UXx8tgFSjprZ6/z1K7+Pu5j+AwTaYMHH0PwBOP4P3N3EWN6iKYRXMn7/eRd8ss4ounwhv9tn6EBo1zLv85OPwGtTYOxQCCiC+fBTdTuw8q8t7Ek76PZx3WpF89uJfWw79luu5deVv4wWVRow8Lup9N72Bov2fc7L13a74HrDg8uTkvF39u0jGX8THlyOLKedxENbs5e3qnorIQHB/Jz6p0f98gabDTZsCqBNh1D+b6eV1jFGsZFyxMKEqUG88kJGkdznZjhwwErFii7Gjwvhyd6leW5QKRyOnPttNpjxTjBdHi5D+Qou6tVznP/FfGRqv1msfW/jBR838O3H+eSdz9izM/cxeHeXJtS89lL63vI8vW8cxDeJ3/P0jN4XfL3wSyqRsj/nDT3lr6NUrm684TnsDurcVJsP9k+n1WN3s2yqj6L7/FCC5TGv5LibN29mxYoVBAQEsH79ehYvXkxQUBAdO3akdevW3mhCNud5Lkb73yTY3ePOdV+A9fzHxdmvfexvGDAMypaGgY8ZywY/CWPfgnt7QnhFaNwAvv/RbTcumq/7/9C90DnOmI81YBjMn5xz36Zv4LkR8EJ/uOqK8/ehMOV3+5xLlh2efhme7wcRlcxtlxnaRjXG4XLyadI3RIZUOO/jbql0FVeFXcrgHe/kue/WSlcRFVqZyTf2z15W1laKsrZSdK8VzTXlalE2sBShAcFMb/AMWS47fbdPwmrJOxzp/M+VoTtd2px7qzchfsc7ZDqL5hymprc7aHr7aZatDGDAc8EsmpvOi68G8VSfTCoXwX1uFrsdvtlqY/wbp7jqqnQ2b7Yx5PlSLPjgJEFBxmMe65VB9x4ZvPF6CJMmhjA4Pt23jb4IbZ5ogcPuYPWcL4isEZ7rvltb3UTdmy/nzW/HAGANsBJcyuj88I8GUbVWBBWqlAfgtnY3c+iPZF6+bxyWc7x5OB05x/6u7XvoGPUYDVrewIiVz/PIZX1I++dUnueI//FKgRUSEsLRo0eJiIigUqVKnDp1iqCgIE6fPo3NVvhNmDwrZ07TyTQjTTrj8BEoV9ZFqdDcz6kamTOv6L+PqxqZO2FKPgKREUbyceSYUWic+Tw5nGKkOAC/7YYnhxjpzHNPkD0J9OQpeLZ3zpDZjPfh0urFq/+//s8oXq6uY9zXoVXOHCyAuYuMfo8fZhSYvuKu3xfy46/w1yHjBAAwtoXDYQwpjXiucNp7Id1qRdOo0jUA2F0Ogq2BTG/wDIHWAIICjN+H7JzB0czU7OdEV7mFysHlebvB09nLXr/hScb9+gFWrKxN2s6MPSsBYyixUnAYJ+ynmPz7x4AxRHh9+csY++vC7OcfTv+bikE5Y2qVgsuRkvEPAIGWAJ676kFqlK5Cv+8mcTj9eOFtEA9Mnx3Il18Zf6S1aji5r72dG+oZH4xtYhyMmRDEL79ZOXjIwsQ3jQ/ao8csOJ2QmWnhhUGZPmu7GebOCWbLV8b7c2qqhUsucXLVVUYyddttdt4YD4cOWTlxwkL5ci6qX+LEZoMWLbOYOiXEl00HoOvLHWnUxngz2bJiG/OGL7rgc1p0bUZwqSDe/m4ctiAbQaHG7y+0eg1rgJVFYxNY+fYaAAKDbJSpUAaAl+8bB5A9PDj/5SXZr5m87wgVq5bn+OG/AagcVZHdO/ZSqWoFatW7lG1rdgCwbfX/cSr1FFGXVeH37/aYsxHMVIySJW/xSoHVt29f7r//flq1akXt2rXp0qULjRo1YtOmTfTs2bPQ19//UeMH4OhxaNfdmKRds7oxYbv5bXmfc1tDGPvmuR93123w8Spo1hhOnYZV62D4M8aw2SVRsOpzaHWXkchYrUZB8+cB6DoQBvWG+1rlXteiBKPIGjrQ+FD+cCWMH1q8+r/iM5i7GN6fZpw5uGw13Hqj8XpzFxlzmha+ZTzfl9z1+0LqXwtfnFU0Tp1jDIX68izCuX98ytw/Ps2zPDKkArMaPsfj217Pc9/LP83NdXtdszd45v/eJDUrjbDA0jxd9wE+OrCBY5knaBPViHsvaUK3raPdtuOrIz8SU/Vmthz9idCAIJpF1GfiLmNjDbu2K1aLlf7bJ5PuLDpFyeM9sni8h5Gkfb/TyouvBPHezHTKl4PVawOoXdPF9fWcrFick9TMmBvI3/9QLM4i7NY9g27dMwA4dszCo93LsGuXlTp1nOzcEYDFAlWrOvlyYxA//xzAqyNOY7HAurWB1K/v+7lo84YvyldRdbZ+tz6f/XtkjXBm/PAGvW8cBMC2NTto1esePl/wJadOnKbrKx25vH5t4lu+6vY1tyz/lla97mHykzOoXK0iDaJvYMHIjwgMCeSFhU/Rp2E8B3cncf2d1xBgC2DfLwc876wUSV4psJo3b84VV1zB2rVr+fPPP7nhhhsoXbo0o0eP5rrrrvNGE7JVqgAj42HgMMjKgkuqGZcSACOBGDoOls5y/7hO7WDfQWj/qHFfx7Y586teHw7DxsHb8yE4CCa8bBQZM983zsR572PjB4wJ34vehl4Pw+CR0Kab8SWhTzeod1Xx6n+7lsZlGDr0MpK7y2saqU5mFkyeDWXLQP+zisqWd0LvLoWzDdw5X7/P3jbFUaWgMF677rE8adZ/bTv2G4v2fc7Y63vjwkWaPZ3hP8zJ9ZjVSd+yOunbXMuWH/yKqNDKzGj4LDZLACsPbmHn37u5plxNGle+lv2nkpl0Y7/sx8/YszLP/C9fqn+dk+4P23liYAgBAVC5sotxIzJ83SyvqVjRxcuvnGLyxFDS0yEwEIa/fJqgIOjYKZM3p4XQq2dpLFa49loHj/b0n21T56baPD3jiexC6nwSZ66jcrWKTN7yGi6Xi+R9RxjXfVqux5ydXJ0xb/hiBrz5GDN+eANrgJUZz83n0B7jLJ7Xe77FsA+fARec/DuNoW1Hk3G66HzJyOV88yfkvCwul3/nfs6kOr5ugohP3POLd+cvFjUf1c37YVaSnHD5PiXylR6X3O7rJvjcZ07vHv8xVft4bV2Jh6Zd+EF+oOhdrERERESKFv/OYnyimJ5ULCIiIuI7SrBERETEPSVYHlOCJSIiImIyFVgiIiIiJtMQoYiIiLjn1BChp5RgiYiIiJhMCZaIiIi45XLpQqOeUoIlIiIiYjIlWCIiIuKe5mB5TAmWiIiIiMmUYImIiIh7utCox5RgiYiIiJhMCZaIiIi459RZhJ5SgiUiIiJiMhVYIiIi4p7L5b2fQjBp0iSmTJmSZ3lSUhI333wzBw4c+LebLsaMGUN0dDSxsbFs3749+7GzZ88mOjqali1bsmbNmguuU0OEIiIiUiydOHGCUaNG8cknn9CzZ89c9zmdTl544QWysrKyl61evZrdu3ezatUq/vzzT3r16kViYiI///wzy5cvJyEhgZMnT9KxY0duvvlmypcvf951q8ASERERt1xenIOVmppKampqnuVhYWGEhYV59Frr1q2jZs2adO/ePc99M2fOpHHjxvzxxx/ZyzZs2EBsbCxWq5VatWoRFRXF999/z9atW7nnnnsIDg4mODiYm2++mfXr19O+ffvzrltDhCIiIlJkzJs3j7vuuivPz7x58zx+rfbt29OrVy8CAgJyLf/xxx/ZunVrnsIrOTmZiIiI7Nvh4eEkJSWdd7k7SrBERETEPS9eB6tr167ExcXlWe4uvUpMTGTUqFG5ltWuXZu5c+fmeezp06d55ZVXmDhxIlZr7pzJdY5+Wq3W8y53RwWWiIiIFBkXMxQYExNDTExMvh67bds2jhw5whNPPAEYqVWvXr2YOnUqkZGRpKSkZD82JSWFiIiIcy6vVauW2/VoiFBERERKjDvuuIPPP/+chIQEEhISiIiI4J133qF27do0adKEFStW4HA4+PPPP9m7dy/16tWjSZMmrFmzhtOnT3Ps2DG+/vprGjVq5HY9SrBERETEvRLyz56jo6PZuXMnbdu2BWDkyJGEhIRw3XXX0bZtW+6//37sdjv9+/cnMjLS7WtZXOcaWPQjzqQ6vm6CiE/c80trXzfBpz6qu8TXTfCpEy67r5vgMz0uud3XTfC5z5zePf5bhnbx2rpWn57vtXUVJiVYIiIi4p5L/yrHU5qDJSIiImIyJVgiIiLilquEzMEykxIsEREREZMpwRIRERH3NAfLY0qwREREREymBEtERETc0hwszynBEhERETGZEiwRERFxT3OwPKYES0RERMRkfv+vckRERESKGiVYIiIiIiZTgSUiIiJiMhVYIiIiIiZTgSUiIiJiMhVYIiIiIiZTgSUiIiJiMhVYIiIiIiZTgSUiIiJiMhVYIiIiIiZTgSUiIiJiMhVYIiIiIiZTgSUiIiJiMhVYIiIiIiZTgVUAK1asIDY2lnvuuYcFCxb4ujled/LkSVq3bs2BAwd83RSvmzp1Kq1ataJVq1aMHTvW183xukmTJhEbG0urVq2YM2eOr5vjE2PGjCE+Pt7XzfC6Rx55hFatWtGuXTvatWvHjh07fN0kr/r888+59957iY6OZsSIEb5ujhRhNl83wF8dPnyYCRMm8PHHHxMUFESnTp245ZZbuPzyy33dNK/YsWMHL774Inv37vV1U7zuq6++YtOmTSxduhSLxULPnj357LPPuOeee3zdNK/45ptv+Prrr1m+fDl2u53Y2FiaNm1K7dq1fd00r9myZQtLly7lzjvv9HVTvMrlcrFnzx7Wr1+PzVbyPj7279/P8OHDWbJkCZUqVaJr165s2LCBpk2b+rppUgQpwbpIX331Fbfeeivly5enVKlStGzZkk8//dTXzfKaxYsXM3z4cCIiInzdFK8LDw8nPj6eoKAgAgMDueyyyzh48KCvm+U1N998M++++y42m42jR4/icDgoVaqUr5vlNX///TcTJkygd+/evm6K1+3ZsweLxcJjjz1G27Ztee+993zdJK/67LPPiI2NpUqVKgQGBjJhwgSuv/56XzdLiqiS9xXEJMnJyYSHh2ffjoiIYOfOnT5skXeNHDnS103wmSuuuCL7971797Jq1SoWLlzowxZ5X2BgIJMnT2b27NlER0cTGRnp6yZ5zbBhw3jqqac4dOiQr5vidampqTRq1IiXXnqJ9PR0HnnkEWrVqsVtt93m66Z5xZ9//klgYCCPPvooKSkpNGvWjIEDB/q6WVJEKcG6SC6XK88yi8Xig5aIr/z+++/06NGDwYMHU7NmTV83x+v69+/Pli1bOHToEIsXL/Z1c7xiyZIlVK1alUaNGvm6KT5Rv359xo4dS6lSpahYsSL3338/GzZs8HWzvMbhcLBlyxbGjRvH4sWL+eGHH1i6dKmvmyVFlAqsixQZGcmRI0eybycnJ5fI4bKSavv27XTr1o1nnnmGuLg4XzfHq3bv3s0vv/wCQGhoKC1atOC3337zcau8Y9WqVWzevJl27doxefJkPv/8c1577TVfN8trtm3bxpYtW7Jvu1yuEjUXq3LlyjRq1IiKFSsSEhLCXXfdVaJGLsQzKrAuUuPGjdmyZQvHjh3j9OnTrFmzhiZNmvi6WeIFhw4dok+fPowfP55WrVr5ujled+DAAV588UUyMzPJzMxk3bp13HTTTb5ullfMmTOHlStXkpCQQP/+/WnevDlDhgzxdbO85sSJE4wdO5aMjAxOnjzJ0qVLS8zJHQDNmjVj06ZNpKam4nA4+PLLL7nmmmt83SwpokrOVw+TRUZG8tRTT/HII4+QlZXF/fffz3XXXefrZokXzJo1i4yMDEaPHp29rFOnTjz44IM+bJX3NG3alB07dtC+fXsCAgJo0aJFiSw0S6JmzZpl73un00nnzp2pX7++r5vlNddffz09e/akc+fOZGVlcdttt3Hffff5ullSRFlc55pMJCIiIiIXTUOEIiIiIiZTgSUiIiJiMhVYIiIiIiZTgSUiIiJiMhVYIiIiIiZTgSUiIiJiMhVYIiIiIiZTgSUiHouJiaFJkyb8/vvvvm6KiEiRpAJLRDy2cuVKatasyerVq33dFBGRIkkFloh4LCAggJtuuqnE/JNnERFP6X8RiojH0tPT+eSTT9B/2hIROTclWCLisQkTJhAZGcn+/ftJS0vzdXNERIocFVgi4pHvv/+eTz/9lClTplC2bFl27drl6yaJiBQ5KrBEJN8yMjJ4/vnnefnllylfvjxXXnml5mGJiJyDCiwRybdJkyZRv3597rzzTgCuvPJKfv31V982SkSkCFKBJSL5snPnTj799FOGDBmSveyqq65SgiUicg4Wl04DEhERETGVEiwRERERk6nAEhERETGZCiwRERERk6nAEhERETGZCiwRERERk6nAEhERETGZCiwRERERk/0/6JX3emMopIEAAAAASUVORK5CYII=\n",
|
||
"text/plain": [
|
||
"<Figure size 720x720 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_61_10.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.neural_network import MLPRegressor\n",
|
||
"from sklearn.metrics import accuracy_score\n",
|
||
"import seaborn as sns\n",
|
||
"\n",
|
||
"X_train = X\n",
|
||
"Y_train = Energies\n",
|
||
"n_hidden_neurons = 100\n",
|
||
"epochs = 100\n",
|
||
"# store models for later use\n",
|
||
"eta_vals = np.logspace(-5, 1, 7)\n",
|
||
"lmbd_vals = np.logspace(-5, 1, 7)\n",
|
||
"# store the models for later use\n",
|
||
"DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n",
|
||
"train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n",
|
||
"sns.set()\n",
|
||
"for i, eta in enumerate(eta_vals):\n",
|
||
" for j, lmbd in enumerate(lmbd_vals):\n",
|
||
" dnn = MLPRegressor(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',\n",
|
||
" alpha=lmbd, learning_rate_init=eta, max_iter=epochs)\n",
|
||
" dnn.fit(X_train, Y_train)\n",
|
||
" DNN_scikit[i][j] = dnn\n",
|
||
" train_accuracy[i][j] = dnn.score(X_train, Y_train)\n",
|
||
"\n",
|
||
"fig, ax = plt.subplots(figsize = (10, 10))\n",
|
||
"sns.heatmap(train_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n",
|
||
"ax.set_title(\"Training Accuracy\")\n",
|
||
"ax.set_ylabel(\"$\\eta$\")\n",
|
||
"ax.set_xlabel(\"$\\lambda$\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Linear Regression, basic elements\n",
|
||
"\n",
|
||
"\n",
|
||
"[Video of Lecture](https://www.uio.no/studier/emner/matnat/fys/FYS-STK4155/h20/forelesningsvideoer/LectureAug27.mp4?vrtx=view-as-webpage).\n",
|
||
"\n",
|
||
"\n",
|
||
"Fitting a continuous function with linear parameterization in terms of the parameters $\\boldsymbol{\\beta}$.\n",
|
||
"* Method of choice for fitting a continuous function!\n",
|
||
"\n",
|
||
"* Gives an excellent introduction to central Machine Learning features with **understandable pedagogical** links to other methods like **Neural Networks**, **Support Vector Machines** etc\n",
|
||
"\n",
|
||
"* Analytical expression for the fitting parameters $\\boldsymbol{\\beta}$\n",
|
||
"\n",
|
||
"* Analytical expressions for statistical propertiers like mean values, variances, confidence intervals and more\n",
|
||
"\n",
|
||
"* Analytical relation with probabilistic interpretations \n",
|
||
"\n",
|
||
"* Easy to introduce basic concepts like bias-variance tradeoff, cross-validation, resampling and regularization techniques and many other ML topics\n",
|
||
"\n",
|
||
"* Easy to code! And links well with classification problems and logistic regression and neural networks\n",
|
||
"\n",
|
||
"* Allows for **easy** hands-on understanding of gradient descent methods\n",
|
||
"\n",
|
||
"* and many more features\n",
|
||
"\n",
|
||
"For more discussions of Ridge and Lasso regression, [Wessel van Wieringen's](https://arxiv.org/abs/1509.09169) article is highly recommended.\n",
|
||
"Similarly, [Mehta et al's article](https://arxiv.org/abs/1803.08823) is also recommended.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Regression modeling deals with the description of the sampling distribution of a given random variable $y$ and how it varies as function of another variable or a set of such variables $\\boldsymbol{x} =[x_0, x_1,\\dots, x_{n-1}]^T$. \n",
|
||
"The first variable is called the **dependent**, the **outcome** or the **response** variable while the set of variables $\\boldsymbol{x}$ is called the independent variable, or the predictor variable or the explanatory variable. \n",
|
||
"\n",
|
||
"A regression model aims at finding a likelihood function $p(\\boldsymbol{y}\\vert \\boldsymbol{x})$, that is the conditional distribution for $\\boldsymbol{y}$ with a given $\\boldsymbol{x}$. The estimation of $p(\\boldsymbol{y}\\vert \\boldsymbol{x})$ is made using a data set with \n",
|
||
"* $n$ cases $i = 0, 1, 2, \\dots, n-1$ \n",
|
||
"\n",
|
||
"* Response (target, dependent or outcome) variable $y_i$ with $i = 0, 1, 2, \\dots, n-1$ \n",
|
||
"\n",
|
||
"* $p$ so-called explanatory (independent or predictor) variables $\\boldsymbol{x}_i=[x_{i0}, x_{i1}, \\dots, x_{ip-1}]$ with $i = 0, 1, 2, \\dots, n-1$ and explanatory variables running from $0$ to $p-1$. See below for more explicit examples. \n",
|
||
"\n",
|
||
" The goal of the regression analysis is to extract/exploit relationship between $\\boldsymbol{y}$ and $\\boldsymbol{x}$ in or to infer causal dependencies, approximations to the likelihood functions, functional relationships and to make predictions, making fits and many other things.\n",
|
||
"\n",
|
||
"\n",
|
||
"Consider an experiment in which $p$ characteristics of $n$ samples are\n",
|
||
"measured. The data from this experiment, for various explanatory variables $p$ are normally represented by a matrix \n",
|
||
"$\\mathbf{X}$.\n",
|
||
"\n",
|
||
"The matrix $\\mathbf{X}$ is called the *design\n",
|
||
"matrix*. Additional information of the samples is available in the\n",
|
||
"form of $\\boldsymbol{y}$ (also as above). The variable $\\boldsymbol{y}$ is\n",
|
||
"generally referred to as the *response variable*. The aim of\n",
|
||
"regression analysis is to explain $\\boldsymbol{y}$ in terms of\n",
|
||
"$\\boldsymbol{X}$ through a functional relationship like $y_i =\n",
|
||
"f(\\mathbf{X}_{i,\\ast})$. When no prior knowledge on the form of\n",
|
||
"$f(\\cdot)$ is available, it is common to assume a linear relationship\n",
|
||
"between $\\boldsymbol{X}$ and $\\boldsymbol{y}$. This assumption gives rise to\n",
|
||
"the *linear regression model* where $\\boldsymbol{\\beta} = [\\beta_0, \\ldots,\n",
|
||
"\\beta_{p-1}]^{T}$ are the *regression parameters*. \n",
|
||
"\n",
|
||
"Linear regression gives us a set of analytical equations for the parameters $\\beta_j$.\n",
|
||
"\n",
|
||
"\n",
|
||
"In order to understand the relation among the predictors $p$, the set of data $n$ and the target (outcome, output etc) $\\boldsymbol{y}$,\n",
|
||
"consider the model we discussed for describing nuclear binding energies. \n",
|
||
"\n",
|
||
"There we assumed that we could parametrize the data using a polynomial approximation based on the liquid drop model.\n",
|
||
"Assuming"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(A) = a_0+a_1A+a_2A^{2/3}+a_3A^{-1/3}+a_4A^{-1},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we have five predictors, that is the intercept, the $A$ dependent term, the $A^{2/3}$ term and the $A^{-1/3}$ and $A^{-1}$ terms.\n",
|
||
"This gives $p=0,1,2,3,4$. Furthermore we have $n$ entries for each predictor. It means that our design matrix is a \n",
|
||
"$p\\times n$ matrix $\\boldsymbol{X}$.\n",
|
||
"\n",
|
||
"Here the predictors are based on a model we have made. A popular data set which is widely encountered in ML applications is the\n",
|
||
"so-called [credit card default data from Taiwan](https://www.sciencedirect.com/science/article/pii/S0957417407006719?via%3Dihub). The data set contains data on $n=30000$ credit card holders with predictors like gender, marital status, age, profession, education, etc. In total there are $24$ such predictors or attributes leading to a design matrix of dimensionality $24 \\times 30000$. This is however a classification problem and we will come back to it when we discuss Logistic Regression. \n",
|
||
"\n",
|
||
"\n",
|
||
"Before we proceed let us study a case from linear algebra where we aim at fitting a set of data $\\boldsymbol{y}=[y_0,y_1,\\dots,y_{n-1}]$. We could think of these data as a result of an experiment or a complicated numerical experiment. These data are functions of a series of variables $\\boldsymbol{x}=[x_0,x_1,\\dots,x_{n-1}]$, that is $y_i = y(x_i)$ with $i=0,1,2,\\dots,n-1$. The variables $x_i$ could represent physical quantities like time, temperature, position etc. We assume that $y(x)$ is a smooth function. \n",
|
||
"\n",
|
||
"Since obtaining these data points may not be trivial, we want to use these data to fit a function which can allow us to make predictions for values of $y$ which are not in the present set. The perhaps simplest approach is to assume we can parametrize our function in terms of a polynomial of degree $n-1$ with $n$ points, that is"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"y=y(x) \\rightarrow y(x_i)=\\tilde{y}_i+\\epsilon_i=\\sum_{j=0}^{n-1} \\beta_j x_i^j+\\epsilon_i,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\epsilon_i$ is the error in our approximation. \n",
|
||
"\n",
|
||
"\n",
|
||
"For every set of values $y_i,x_i$ we have thus the corresponding set of equations"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{align*}\n",
|
||
"y_0&=\\beta_0+\\beta_1x_0^1+\\beta_2x_0^2+\\dots+\\beta_{n-1}x_0^{n-1}+\\epsilon_0\\\\\n",
|
||
"y_1&=\\beta_0+\\beta_1x_1^1+\\beta_2x_1^2+\\dots+\\beta_{n-1}x_1^{n-1}+\\epsilon_1\\\\\n",
|
||
"y_2&=\\beta_0+\\beta_1x_2^1+\\beta_2x_2^2+\\dots+\\beta_{n-1}x_2^{n-1}+\\epsilon_2\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{n-1}&=\\beta_0+\\beta_1x_{n-1}^1+\\beta_2x_{n-1}^2+\\dots+\\beta_{n-1}x_{n-1}^{n-1}+\\epsilon_{n-1}.\\\\\n",
|
||
"\\end{align*}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Defining the vectors"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{y} = [y_0,y_1, y_2,\\dots, y_{n-1}]^T,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\beta} = [\\beta_0,\\beta_1, \\beta_2,\\dots, \\beta_{n-1}]^T,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\epsilon} = [\\epsilon_0,\\epsilon_1, \\epsilon_2,\\dots, \\epsilon_{n-1}]^T,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and the design matrix"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}=\n",
|
||
"\\begin{bmatrix} \n",
|
||
"1& x_{0}^1 &x_{0}^2& \\dots & \\dots &x_{0}^{n-1}\\\\\n",
|
||
"1& x_{1}^1 &x_{1}^2& \\dots & \\dots &x_{1}^{n-1}\\\\\n",
|
||
"1& x_{2}^1 &x_{2}^2& \\dots & \\dots &x_{2}^{n-1}\\\\ \n",
|
||
"\\dots& \\dots &\\dots& \\dots & \\dots &\\dots\\\\\n",
|
||
"1& x_{n-1}^1 &x_{n-1}^2& \\dots & \\dots &x_{n-1}^{n-1}\\\\\n",
|
||
"\\end{bmatrix}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we can rewrite our equations as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{y} = \\boldsymbol{X}\\boldsymbol{\\beta}+\\boldsymbol{\\epsilon}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The above design matrix is called a [Vandermonde matrix](https://en.wikipedia.org/wiki/Vandermonde_matrix).\n",
|
||
"\n",
|
||
"We are obviously not limited to the above polynomial expansions. We\n",
|
||
"could replace the various powers of $x$ with elements of Fourier\n",
|
||
"series or instead of $x_i^j$ we could have $\\cos{(j x_i)}$ or $\\sin{(j\n",
|
||
"x_i)}$, or time series or other orthogonal functions. For every set\n",
|
||
"of values $y_i,x_i$ we can then generalize the equations to"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{align*}\n",
|
||
"y_0&=\\beta_0x_{00}+\\beta_1x_{01}+\\beta_2x_{02}+\\dots+\\beta_{n-1}x_{0n-1}+\\epsilon_0\\\\\n",
|
||
"y_1&=\\beta_0x_{10}+\\beta_1x_{11}+\\beta_2x_{12}+\\dots+\\beta_{n-1}x_{1n-1}+\\epsilon_1\\\\\n",
|
||
"y_2&=\\beta_0x_{20}+\\beta_1x_{21}+\\beta_2x_{22}+\\dots+\\beta_{n-1}x_{2n-1}+\\epsilon_2\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{i}&=\\beta_0x_{i0}+\\beta_1x_{i1}+\\beta_2x_{i2}+\\dots+\\beta_{n-1}x_{in-1}+\\epsilon_i\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{n-1}&=\\beta_0x_{n-1,0}+\\beta_1x_{n-1,2}+\\beta_2x_{n-1,2}+\\dots+\\beta_{n-1}x_{n-1,n-1}+\\epsilon_{n-1}.\\\\\n",
|
||
"\\end{align*}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**Note that we have $p=n$ here. The matrix is symmetric. This is generally not the case!**\n",
|
||
"\n",
|
||
"We redefine in turn the matrix $\\boldsymbol{X}$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}=\n",
|
||
"\\begin{bmatrix} \n",
|
||
"x_{00}& x_{01} &x_{02}& \\dots & \\dots &x_{0,n-1}\\\\\n",
|
||
"x_{10}& x_{11} &x_{12}& \\dots & \\dots &x_{1,n-1}\\\\\n",
|
||
"x_{20}& x_{21} &x_{22}& \\dots & \\dots &x_{2,n-1}\\\\ \n",
|
||
"\\dots& \\dots &\\dots& \\dots & \\dots &\\dots\\\\\n",
|
||
"x_{n-1,0}& x_{n-1,1} &x_{n-1,2}& \\dots & \\dots &x_{n-1,n-1}\\\\\n",
|
||
"\\end{bmatrix}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and without loss of generality we rewrite again our equations as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{y} = \\boldsymbol{X}\\boldsymbol{\\beta}+\\boldsymbol{\\epsilon}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The left-hand side of this equation is kwown. Our error vector $\\boldsymbol{\\epsilon}$ and the parameter vector $\\boldsymbol{\\beta}$ are our unknow quantities. How can we obtain the optimal set of $\\beta_i$ values? \n",
|
||
"\n",
|
||
"We have defined the matrix $\\boldsymbol{X}$ via the equations"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{align*}\n",
|
||
"y_0&=\\beta_0x_{00}+\\beta_1x_{01}+\\beta_2x_{02}+\\dots+\\beta_{n-1}x_{0n-1}+\\epsilon_0\\\\\n",
|
||
"y_1&=\\beta_0x_{10}+\\beta_1x_{11}+\\beta_2x_{12}+\\dots+\\beta_{n-1}x_{1n-1}+\\epsilon_1\\\\\n",
|
||
"y_2&=\\beta_0x_{20}+\\beta_1x_{21}+\\beta_2x_{22}+\\dots+\\beta_{n-1}x_{2n-1}+\\epsilon_1\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{i}&=\\beta_0x_{i0}+\\beta_1x_{i1}+\\beta_2x_{i2}+\\dots+\\beta_{n-1}x_{in-1}+\\epsilon_1\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{n-1}&=\\beta_0x_{n-1,0}+\\beta_1x_{n-1,2}+\\beta_2x_{n-1,2}+\\dots+\\beta_{n-1}x_{n-1,n-1}+\\epsilon_{n-1}.\\\\\n",
|
||
"\\end{align*}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"As we noted above, we stayed with a system with the design matrix \n",
|
||
" $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times n}$, that is we have $p=n$. For reasons to come later (algorithmic arguments) we will hereafter define \n",
|
||
"our matrix as $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times p}$, with the predictors refering to the column numbers and the entries $n$ being the row elements.\n",
|
||
"\n",
|
||
"In our [introductory notes](https://compphysics.github.io/MachineLearning/doc/pub/How2ReadData/html/How2ReadData.html) we looked at the so-called [liquid drop model](https://en.wikipedia.org/wiki/Semi-empirical_mass_formula). Let us remind ourselves about what we did by looking at the code.\n",
|
||
"\n",
|
||
"We restate the parts of the code we are most interested in."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>1</th>\n",
|
||
" <th>A</th>\n",
|
||
" <th>A^(2/3)</th>\n",
|
||
" <th>A^(-1/3)</th>\n",
|
||
" <th>1/A</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>A</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.587401</td>\n",
|
||
" <td>0.793701</td>\n",
|
||
" <td>0.500000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>2.080084</td>\n",
|
||
" <td>0.693361</td>\n",
|
||
" <td>0.333333</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2.519842</td>\n",
|
||
" <td>0.629961</td>\n",
|
||
" <td>0.250000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>2.924018</td>\n",
|
||
" <td>0.584804</td>\n",
|
||
" <td>0.200000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>264</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>264.0</td>\n",
|
||
" <td>41.153106</td>\n",
|
||
" <td>0.155883</td>\n",
|
||
" <td>0.003788</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>265</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>265.0</td>\n",
|
||
" <td>41.256962</td>\n",
|
||
" <td>0.155687</td>\n",
|
||
" <td>0.003774</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>266</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>266.0</td>\n",
|
||
" <td>41.360688</td>\n",
|
||
" <td>0.155491</td>\n",
|
||
" <td>0.003759</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>269</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>269.0</td>\n",
|
||
" <td>41.671089</td>\n",
|
||
" <td>0.154911</td>\n",
|
||
" <td>0.003717</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>270</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>270.0</td>\n",
|
||
" <td>41.774300</td>\n",
|
||
" <td>0.154720</td>\n",
|
||
" <td>0.003704</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>267 rows × 5 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" 1 A A^(2/3) A^(-1/3) 1/A\n",
|
||
"A \n",
|
||
"1 1.0 1.0 1.000000 1.000000 1.000000\n",
|
||
"2 1.0 2.0 1.587401 0.793701 0.500000\n",
|
||
"3 1.0 3.0 2.080084 0.693361 0.333333\n",
|
||
"4 1.0 4.0 2.519842 0.629961 0.250000\n",
|
||
"5 1.0 5.0 2.924018 0.584804 0.200000\n",
|
||
".. ... ... ... ... ...\n",
|
||
"264 1.0 264.0 41.153106 0.155883 0.003788\n",
|
||
"265 1.0 265.0 41.256962 0.155687 0.003774\n",
|
||
"266 1.0 266.0 41.360688 0.155491 0.003759\n",
|
||
"269 1.0 269.0 41.671089 0.154911 0.003717\n",
|
||
"270 1.0 270.0 41.774300 0.154720 0.003704\n",
|
||
"\n",
|
||
"[267 rows x 5 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Common imports\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from IPython.display import display\n",
|
||
"import os\n",
|
||
"\n",
|
||
"# Where to save the figures and data files\n",
|
||
"PROJECT_ROOT_DIR = \"Results\"\n",
|
||
"FIGURE_ID = \"Results/FigureFiles\"\n",
|
||
"DATA_ID = \"DataFiles/\"\n",
|
||
"\n",
|
||
"if not os.path.exists(PROJECT_ROOT_DIR):\n",
|
||
" os.mkdir(PROJECT_ROOT_DIR)\n",
|
||
"\n",
|
||
"if not os.path.exists(FIGURE_ID):\n",
|
||
" os.makedirs(FIGURE_ID)\n",
|
||
"\n",
|
||
"if not os.path.exists(DATA_ID):\n",
|
||
" os.makedirs(DATA_ID)\n",
|
||
"\n",
|
||
"def image_path(fig_id):\n",
|
||
" return os.path.join(FIGURE_ID, fig_id)\n",
|
||
"\n",
|
||
"def data_path(dat_id):\n",
|
||
" return os.path.join(DATA_ID, dat_id)\n",
|
||
"\n",
|
||
"def save_fig(fig_id):\n",
|
||
" plt.savefig(image_path(fig_id) + \".png\", format='png')\n",
|
||
"\n",
|
||
"infile = open(data_path(\"MassEval2016.dat\"),'r')\n",
|
||
"\n",
|
||
"\n",
|
||
"# Read the experimental data with Pandas\n",
|
||
"Masses = pd.read_fwf(infile, usecols=(2,3,4,6,11),\n",
|
||
" names=('N', 'Z', 'A', 'Element', 'Ebinding'),\n",
|
||
" widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1),\n",
|
||
" header=39,\n",
|
||
" index_col=False)\n",
|
||
"\n",
|
||
"# Extrapolated values are indicated by '#' in place of the decimal place, so\n",
|
||
"# the Ebinding column won't be numeric. Coerce to float and drop these entries.\n",
|
||
"Masses['Ebinding'] = pd.to_numeric(Masses['Ebinding'], errors='coerce')\n",
|
||
"Masses = Masses.dropna()\n",
|
||
"# Convert from keV to MeV.\n",
|
||
"Masses['Ebinding'] /= 1000\n",
|
||
"\n",
|
||
"# Group the DataFrame by nucleon number, A.\n",
|
||
"Masses = Masses.groupby('A')\n",
|
||
"# Find the rows of the grouped DataFrame with the maximum binding energy.\n",
|
||
"Masses = Masses.apply(lambda t: t[t.Ebinding==t.Ebinding.max()])\n",
|
||
"A = Masses['A']\n",
|
||
"Z = Masses['Z']\n",
|
||
"N = Masses['N']\n",
|
||
"Element = Masses['Element']\n",
|
||
"Energies = Masses['Ebinding']\n",
|
||
"\n",
|
||
"# Now we set up the design matrix X\n",
|
||
"X = np.zeros((len(A),5))\n",
|
||
"X[:,0] = 1\n",
|
||
"X[:,1] = A\n",
|
||
"X[:,2] = A**(2.0/3.0)\n",
|
||
"X[:,3] = A**(-1.0/3.0)\n",
|
||
"X[:,4] = A**(-1.0)\n",
|
||
"# Then nice printout using pandas\n",
|
||
"DesignMatrix = pd.DataFrame(X)\n",
|
||
"DesignMatrix.index = A\n",
|
||
"DesignMatrix.columns = ['1', 'A', 'A^(2/3)', 'A^(-1/3)', '1/A']\n",
|
||
"display(DesignMatrix)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"With $\\boldsymbol{\\beta}\\in {\\mathbb{R}}^{p\\times 1}$, it means that we will hereafter write our equations for the approximation as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\tilde{y}}= \\boldsymbol{X}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"throughout these lectures. \n",
|
||
"\n",
|
||
"With the above we use the design matrix to define the approximation $\\boldsymbol{\\tilde{y}}$ via the unknown quantity $\\boldsymbol{\\beta}$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\tilde{y}}= \\boldsymbol{X}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and in order to find the optimal parameters $\\beta_i$ instead of solving the above linear algebra problem, we define a function which gives a measure of the spread between the values $y_i$ (which represent hopefully the exact values) and the parameterized values $\\tilde{y}_i$, namely"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\boldsymbol{\\beta})=\\frac{1}{n}\\sum_{i=0}^{n-1}\\left(y_i-\\tilde{y}_i\\right)^2=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}}\\right)\\right\\},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"or using the matrix $\\boldsymbol{X}$ and in a more compact matrix-vector notation as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\boldsymbol{\\beta})=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)\\right\\}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This function is one possible way to define the so-called cost function.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"It is also common to define\n",
|
||
"the function $C$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\boldsymbol{\\beta})=\\frac{1}{2n}\\sum_{i=0}^{n-1}\\left(y_i-\\tilde{y}_i\\right)^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"since when taking the first derivative with respect to the unknown parameters $\\beta$, the factor of $2$ cancels out. \n",
|
||
"\n",
|
||
"The function"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\boldsymbol{\\beta})=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)\\right\\},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"can be linked to the variance of the quantity $y_i$ if we interpret the latter as the mean value. \n",
|
||
"When linking (see the discussion below) with the maximum likelihood approach below, we will indeed interpret $y_i$ as a mean value"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"y_{i}=\\langle y_i \\rangle = \\beta_0x_{i,0}+\\beta_1x_{i,1}+\\beta_2x_{i,2}+\\dots+\\beta_{n-1}x_{i,n-1}+\\epsilon_i,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\langle y_i \\rangle$ is the mean value. Keep in mind also that\n",
|
||
"till now we have treated $y_i$ as the exact value. Normally, the\n",
|
||
"response (dependent or outcome) variable $y_i$ the outcome of a\n",
|
||
"numerical experiment or another type of experiment and is thus only an\n",
|
||
"approximation to the true value. It is then always accompanied by an\n",
|
||
"error estimate, often limited to a statistical error estimate given by\n",
|
||
"the standard deviation discussed earlier. In the discussion here we\n",
|
||
"will treat $y_i$ as our exact value for the response variable.\n",
|
||
"\n",
|
||
"In order to find the parameters $\\beta_i$ we will then minimize the spread of $C(\\boldsymbol{\\beta})$, that is we are going to solve the problem"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in\n",
|
||
"{\\mathbb{R}}^{p}}}\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)\\right\\}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In practical terms it means we will require"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\beta_j} = \\frac{\\partial }{\\partial \\beta_j}\\left[ \\frac{1}{n}\\sum_{i=0}^{n-1}\\left(y_i-\\beta_0x_{i,0}-\\beta_1x_{i,1}-\\beta_2x_{i,2}-\\dots-\\beta_{n-1}x_{i,n-1}\\right)^2\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"which results in"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\beta_j} = -\\frac{2}{n}\\left[ \\sum_{i=0}^{n-1}x_{ij}\\left(y_i-\\beta_0x_{i,0}-\\beta_1x_{i,1}-\\beta_2x_{i,2}-\\dots-\\beta_{n-1}x_{i,n-1}\\right)\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"or in a matrix-vector form as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = 0 = \\boldsymbol{X}^T\\left( \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can rewrite"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = 0 = \\boldsymbol{X}^T\\left( \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}^T\\boldsymbol{y} = \\boldsymbol{X}^T\\boldsymbol{X}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and if the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$ is invertible we have the solution"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\beta} =\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We note also that since our design matrix is defined as $\\boldsymbol{X}\\in\n",
|
||
"{\\mathbb{R}}^{n\\times p}$, the product $\\boldsymbol{X}^T\\boldsymbol{X} \\in\n",
|
||
"{\\mathbb{R}}^{p\\times p}$. In the above case we have that $p \\ll n$,\n",
|
||
"in our case $p=5$ meaning that we end up with inverting a small\n",
|
||
"$5\\times 5$ matrix. This is a rather common situation, in many cases we end up with low-dimensional\n",
|
||
"matrices to invert. The methods discussed here and for many other\n",
|
||
"supervised learning algorithms like classification with logistic\n",
|
||
"regression or support vector machines, exhibit dimensionalities which\n",
|
||
"allow for the usage of direct linear algebra methods such as **LU** decomposition or **Singular Value Decomposition** (SVD) for finding the inverse of the matrix\n",
|
||
"$\\boldsymbol{X}^T\\boldsymbol{X}$. \n",
|
||
"\n",
|
||
"**Small question**: Do you think the example we have at hand here (the nuclear binding energies) can lead to problems in inverting the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$? What kind of problems can we expect? \n",
|
||
"\n",
|
||
"\n",
|
||
"The following matrix and vector relation will be useful here and for the rest of the course. Vectors are always written as boldfaced lower case letters and \n",
|
||
"matrices as upper case boldfaced letters."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"4\n",
|
||
"3\n",
|
||
" \n",
|
||
"<\n",
|
||
"<\n",
|
||
"<\n",
|
||
"!\n",
|
||
"!\n",
|
||
"M\n",
|
||
"A\n",
|
||
"T\n",
|
||
"H\n",
|
||
"_\n",
|
||
"B\n",
|
||
"L\n",
|
||
"O\n",
|
||
"C\n",
|
||
"K"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"4\n",
|
||
"4\n",
|
||
" \n",
|
||
"<\n",
|
||
"<\n",
|
||
"<\n",
|
||
"!\n",
|
||
"!\n",
|
||
"M\n",
|
||
"A\n",
|
||
"T\n",
|
||
"H\n",
|
||
"_\n",
|
||
"B\n",
|
||
"L\n",
|
||
"O\n",
|
||
"C\n",
|
||
"K"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"4\n",
|
||
"5\n",
|
||
" \n",
|
||
"<\n",
|
||
"<\n",
|
||
"<\n",
|
||
"!\n",
|
||
"!\n",
|
||
"M\n",
|
||
"A\n",
|
||
"T\n",
|
||
"H\n",
|
||
"_\n",
|
||
"B\n",
|
||
"L\n",
|
||
"O\n",
|
||
"C\n",
|
||
"K"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial\\log{\\vert\\boldsymbol{A}\\vert}}{\\partial \\boldsymbol{A}}=(\\boldsymbol{A}^{-1})^T.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The residuals $\\boldsymbol{\\epsilon}$ are in turn given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\epsilon} = \\boldsymbol{y}-\\boldsymbol{\\tilde{y}} = \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and with"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}^T\\left( \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)= 0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we have"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}^T\\boldsymbol{\\epsilon}=\\boldsymbol{X}^T\\left( \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)= 0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"meaning that the solution for $\\boldsymbol{\\beta}$ is the one which minimizes the residuals. Later we will link this with the maximum likelihood approach.\n",
|
||
"\n",
|
||
"\n",
|
||
"Let us now return to our nuclear binding energies and simply code the above equations. \n",
|
||
"\n",
|
||
"\n",
|
||
"It is rather straightforward to implement the matrix inversion and obtain the parameters $\\boldsymbol{\\beta}$. After having defined the matrix $\\boldsymbol{X}$ we simply need to \n",
|
||
"write"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# matrix inversion to find beta\n",
|
||
"beta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(Energies)\n",
|
||
"# and then make the prediction\n",
|
||
"ytilde = X @ beta"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Alternatively, you can use the least squares functionality in **Numpy** as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"fit = np.linalg.lstsq(X, Energies, rcond =None)[0]\n",
|
||
"ytildenp = np.dot(fit,X.T)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"And finally we plot our fit with and compare with data"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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0mmMUVluDL7rV+4xD9nqLhERmXqUTmOMqsy90g5qVqh0j3ltQnuZi4jI1KMwH2N4rXfLssA3GAPl9d9obYhPZtNERETGpTAfY3g110jYxvIMvu+T94fDPDZ5DRMREdkBhfkYphzcdYkI0ZCF5xv6yku6ttSrMhcRkalHYT7G8H3mtm3RlIwCUCjvvtJSr8pcRESmHoX5GMPz3ywL6qLlpetDNvU1USLh0OQ1TEREZAcU5mMMz2a3LIu4EwIssC1dLxcRkSlLYT7GcGVuWxZewSMatjEhSzPZRURkyqr6FqhT3ba12Q25XJH6mijh+hgL5jZMZrNERER2SGE+RiXL/dLM9ob6GO8789BJbZOIiMjOaJh9jMp+5l5pBns0pt93RERkalOYj1GZze6VHkSimsEuIiJTm8J8jOFr5qZ8b3k0qspcRESmNoX5GKa8nqspV+bhiMJcRESmtp2Gue/7O/vytFSpzMvXzDXMLiIiU91Ow/zEE0/klltuYeXKldVqz6QzlTAfvmauylxERKa2nYb5jTfeyIYNG7jgggs477zz+P73v09vb2+12jYpyvusjAhzVeYiIjK17bTsPPXUUzn11FMZHBzkwQcf5P777+fWW2/lhBNO4LzzzuPkk08mHA5Xq61VYUYOszshIrpmLiIiU9yEJsDV1dWxbNkyfvzjH/PrX/+aww8/nC9+8YuccMIJ+7p9VTd8a5rvaphdRESCYZdmsxcKBV588UVeeOEFuru7Ofjgg/dVuybNcGXuawKciIgExITKzmeffZb777+fhx56iKamJt7znvdwww03MGfOnH3dvqrzDWAMxh0Oc1XmIiIyte00qb761a/yy1/+kv7+ft71rnfxrW99i2OOOaZabZsUxhiGV3QNR0LYtjW5DRIREXkDOw3z559/nquvvppTTz2VaDRarTZNKmMA32BZWjBGRESCYadp9d3vfrfy+IknnuBXv/oVvb29fOtb3+LFF18klUqxZMmSfd7IajLGYPm6LU1ERIJjQhPg7rrrLm688UYOOOAAnnnmGQBisRhf+cpX9mnjJoNvhv/H0rrsIiISCBMK8+9///t873vf4/LLL8e2S2858MADWbNmzT5t3GQwxmwbZldlLiIiATChME+n08yaNQsAyypNCHNdd9otGAOltdm3DbOrMhcRkalvQmH+tre9je985zujjv3gBz/g2GOP3SeNmkyVCXCg1d9ERCQQJpRW119/PR/96Ee59957SafTnHHGGSSTSb797W/v6/ZV3fAwO44mwImISDBMKMzb2tr42c9+xosvvsjGjRuZNWsWRx55ZOX6+XRSqsxLj8MRhbmIiEx9Ow3zTZs2jXre0tJCS0sLAFu2bAFg9uzZ+6hpk8M3BsuUhtkdZ/r9siIiItPPTsP85JNPrkx4G16zfCTLslixYsW+adkk8Y0pl+eWKnMREQmEnYb5woULyeVynHfeebznPe+hra2tWu2aNMPD7JYFIVXmIiISADsN81/84hesXLmS++67jwsvvJD58+dz7rnncvrppxOLxarVxqoylcocwmFV5iIiMvW9Yel58MEHs3z5ch599FEuueQSfv/733PCCSfw8ssvV6N9Vef7pfvMLcBRmIuISABMeBx57dq1PPPMM/zpT3/i0EMPpa6ubl+2a9IM72NuhSztmCYiIoGw02H2/v5+fvWrX3HfffeRTqc599xzufvuu6fdDPaRPK80xB4K6Xq5iIgEw07D/B3veAdz587l3HPP5aijjgJg3bp1rFu3rvKa6bZrmueWKnNNfhMRkaDYaZi3traSz+f5yU9+wk9+8pPtvm5ZFo888sg+a9xkUJiLiEjQ7DTMH3300Wq1Y8oYvmauMBcRkaDYaZgvXbqUE088kaVLl3L88ccTj8er1a5J47vla+aOZrKLiEgw7LT8vPfeeznyyCO5//77Oemkk7j00ku58847Wb16dbXaV3XDlbmWchURkaDYaWXe1tbG+973Pt73vvfhui7PPPMM//3f/81VV11FsVisVO6LFy8mEolUq837lDc8zB5WmIuISDBMeMNux3FYsmQJS5YsYfny5WzYsIHHHnuMu+++m1WrVvGRj3xkX7azanxXlbmIiATLhMN8rLlz5/LBD36QD37wg7v83n/5l3+hr6+Pm2++eXe//T5j/NI1c0eVuYiIBETVE+upp57ivvvuq/a3nbDhW9O0lKuIiARFVcO8v7+f2267jY9+9KPV/La7ZLgy161pIiISFLs0zP7pT396h1/74he/+Ibv//znP88111zD5s2bd+Xb7lBzc81eOU9ra23lcci2sW2LpqbkqOOyjfpl4tRXu0b9NXHqq4mbCX21S2H+4Q9/GIA777yTI444giOOOIKXXnqJV1999Q3fe++9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rWx3tbbW0lYfwxhDT08a21Z1vjOtrbV0dQ1NdjMCQX21a9RfE6e+mrjp0le2be20gK3qMPtxxx3HU089RW9vL9lslocffpgTTzyxmk3YjjGmMmKgUXYREQmiqlfm11xzDRdffDHFYpELLriAI488sppN2I7xh4Nc18xFRCSYqhrmAOeccw7nnHNOtb/tDvnDVbmG10VEJKBm/JJnfnkvc10rFxGRoJrxYW5UmYuISMDN+DD3fU1+ExGRYJvxYW5Ke6xgK81FRCSgZnyY+34pzTXMLiIiQaUwN5oAJyIiwTbjwzwWC2OHbBI1kcluioiIyG6p+n3mU00k6nDSmYfghGf87zUiIhJQMz7MAaIxdYOIiASXylEREZGAU5iLiIgEnMJcREQk4BTmIiIiAacwFxERCTiFuYiISMApzEVERAJOYS4iIhJwCnMREZGAU5iLiIgEXKDXMd1bO51px7Rdo/6aOPXVrlF/TZz6auKmQ1+90c9gGVPeA1REREQCScPsIiIiAacwFxERCTiFuYiISMApzEVERAJOYS4iIhJwCnMREZGAU5iLiIgEnMJcREQk4BTmIiIiAacwFxERCTiFuYiISMApzEVERAJuRof5Aw88wJlnnslpp53GD3/4w8luzpRz8cUXc9ZZZ3Huuedy7rnn8vzzz6vPxkilUpx99tls2LABgCeffJJzzjmH008/ndtuu63yuhUrVvDe976XM844g89+9rO4rjtZTZ5UY/vr05/+NKeffnrlM/bb3/4W2HE/zhRf+9rXOOusszjrrLO45ZZbAH22dma8/ppxny0zQ23ZssWcdNJJpq+vz6TTaXPOOeeYVatWTXazpgzf983xxx9visVi5Zj6bLQ//elP5uyzzzaLFi0y69evN9ls1ixdutS8/vrrplgsmg9/+MPm97//vTHGmLPOOsv88Y9/NMYY8+lPf9r88Ic/nMSWT46x/WWMMWeffbbp7Owc9bqd9eNM8MQTT5gPfOADJp/Pm0KhYC6++GLzwAMP6LO1A+P118MPPzzjPlsztjJ/8sknWbx4MQ0NDSQSCc444wweeuihyW7WlLF69Wosy+Jv//Zvec973sPdd9+tPhvjJz/5CTfccANtbW0AvPDCC+y///7MmzcPx3E455xzeOihh9i4cSO5XI43v/nNAJx//vkzst/G9lcmk2HTpk187nOf45xzzuH222/H9/0d9uNM0draynXXXUckEiEcDjN//nzWrl2rz9YOjNdfmzZtmnGfLWeyGzBZtm7dSmtra+V5W1sbL7zwwiS2aGoZHBxkyZIl3HjjjeRyOS6++GLe/e53q89G+MIXvjDq+Xifqc7Ozu2Ot7a20tnZWbV2ThVj+6unp4fFixfzj//4jyQSCa644gp++tOfkkgkxu3HmWLBggWVx2vXruXBBx/kQx/6kD5bOzBef/3oRz/i6aefnlGfrRlbmRtjtjtmWdYktGRqOvroo7nllltIJBI0NTVxwQUXcPvtt2/3OvXZNjv6TOmzNr558+bx9a9/nebmZuLxOB/60Id47LHH1F9lq1at4sMf/jDLly9nv/322+7r+myNNrK/DjzwwBn32ZqxYd7e3k53d3fl+datWyvDfwLPPvssTz31VOW5MYY5c+aoz3ZiR5+psce7urrUb8Brr73Gb37zm8pzYwyO4+j/m8Bzzz3HJZdcwic/+UnOO+88fbbewNj+momfrRkb5scddxxPPfUUvb29ZLNZHn74YU488cTJbtaUMTQ0xC233EI+nyeVSnHfffdx6623qs924qijjmLNmjWsW7cOz/P4z//8T0488UTmzJlDNBrlueeeA+AXv/iF+o3SP7A33XQTAwMDFItF/uM//oPTTjtth/04U2zevJkrr7ySL33pS5x11lmAPls7M15/zcTP1oy9Zt7e3s4111zDxRdfTLFY5IILLuDII4+c7GZNGSeddBLPP/88f/VXf4Xv+1x00UUcc8wx6rOdiEaj3HzzzXz84x8nn8+zdOlS3vWudwHwpS99ieuvv550Os1hhx3GxRdfPMmtnXwLFy7k8ssv58ILL8R1XU4//XTOPvtsgB3240xwxx13kM/nufnmmyvHli1bps/WDuyov2baZ8sy411EEBERkcCYscPsIiIi04XCXEREJOAU5iIiIgGnMBcREQk4hbmIiEjAKcxFREQCTmEuIiIScApzkWnEdV3e/e53c/rpp++1cw4MDHDIIYfwgQ98YNTxz3/+89x00017fP6vf/3rHH300aP+HHHEERxyyCH86le/2uPzi8wEM3YFOJHp6J577qG3t5fBwUEymQyJRGKPz7lixQpaW1v585//TFdXV2XXqRUrVnDRRRft8H1f/epXAfj4xz++0/NfeeWVXHnllZXn6XSaSy+9lMbGxr36S4nIdKbKXGSaGBoa4mtf+xqf+9znCIVCrFq1aq+c99VXX+Xwww/n+OOP55FHHgHA8zxWrlzJoYceule+x7BcLsdHP/pR4vE4t99+O+FweK+eX2S6UmUuMk184xvfYN68eZx99tl861vf4rXXXuOoo47a7nVXXHFFZWOOsY455hi+/e1vjzr2yiuvsHDhQt70pjfxwAMPsGzZMlavXo3v+8yfP3+vtb9QKHDVVVdRLBb593//d6LR6F47t8h0pzAXmQbWr1/PXXfdxR133AHAQQcdxGuvvTbua8eG9RtZsWIFp5xyCosXL+bGG28klUqxYsUKFixYsNcqZ9d1+cQnPkFPTw8/+MEP9srlAZGZRGEuMg3ceuutHHfccRx77LFAKcxH7ke/uwqFAqtXr+bQQw+lvr6eI444gv/+7/9mxYoVLFy4cLvXj6z68/k8AN///veB8at+AN/3ue6661izZg133XUXtbW1e9xukZlGYS4ScM8++yy/+c1vqKmp4fjjjwdK155te/wpMZdddtlOh9m/+93vVp6vXLmSWCzGvHnzADj11FN55JFH6O7u5rTTTtvu/SPDeqIT4G644QZeeOEF7r77bpqamnb6WhEZn8JcJMCMMdx8880sW7aMq666qnJ806ZNvP/972fTpk3Mnj171HtGhvUbWbFiBYcccgiWZQFw8sknc/vtt2Pb9huG9ER88Ytf5A9/+AM//OEPaWtr2+PzicxUCnORAPvlL39JT08P1157LclksnK8paWFZDLJa6+9tl2Y74oVK1aMmrE+d+5c5syZw2uvvTbuMPuuWLlyJXfeeSfhcJizzz571Nfi8TiPP/74DkcXRGQ0yxhjJrsRIiIisvv0a6+IiEjAKcxFREQCTmEuIiIScApzERGRgFOYi4iIBJzCXEREJOAU5iIiIgGnMBcREQm4/x8jLm31tc16WQAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<Figure size 576x396 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_132_0.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"Masses['Eapprox'] = ytilde\n",
|
||
"# Generate a plot comparing the experimental with the fitted values values.\n",
|
||
"fig, ax = plt.subplots()\n",
|
||
"ax.set_xlabel(r'$A = N + Z$')\n",
|
||
"ax.set_ylabel(r'$E_\\mathrm{bind}\\,/\\mathrm{MeV}$')\n",
|
||
"ax.plot(Masses['A'], Masses['Ebinding'], alpha=0.7, lw=2,\n",
|
||
" label='Ame2016')\n",
|
||
"ax.plot(Masses['A'], Masses['Eapprox'], alpha=0.7, lw=2, c='m',\n",
|
||
" label='Fit')\n",
|
||
"ax.legend()\n",
|
||
"save_fig(\"Masses2016OLS\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can easily test our fit by computing the $R2$ score that we discussed in connection with the functionality of **Scikit-Learn** in the introductory slides.\n",
|
||
"Since we are not using **Scikit-Learn** here we can define our own $R2$ function as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"def R2(y_data, y_model):\n",
|
||
" return 1 - np.sum((y_data - y_model) ** 2) / np.sum((y_data - np.mean(y_data)) ** 2)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and we would be using it as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 20,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.9547578478889096\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"print(R2(Energies,ytilde))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can easily add our **MSE** score as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 21,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.03787596148305236\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"def MSE(y_data,y_model):\n",
|
||
" n = np.size(y_model)\n",
|
||
" return np.sum((y_data-y_model)**2)/n\n",
|
||
"\n",
|
||
"print(MSE(Energies,ytilde))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and finally the relative error as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"A \n",
|
||
"1 0 inf\n",
|
||
"2 1 1.123190\n",
|
||
"3 2 0.327631\n",
|
||
"4 6 0.344172\n",
|
||
"5 9 0.044402\n",
|
||
" ... \n",
|
||
"264 3304 0.009911\n",
|
||
"265 3310 0.009154\n",
|
||
"266 3317 0.007824\n",
|
||
"269 3338 0.011347\n",
|
||
"270 3344 0.009790\n",
|
||
"Name: Ebinding, Length: 267, dtype: float64\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"def RelativeError(y_data,y_model):\n",
|
||
" return abs((y_data-y_model)/y_data)\n",
|
||
"print(RelativeError(Energies, ytilde))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### The $\\chi^2$ function\n",
|
||
"\n",
|
||
"Normally, the response (dependent or outcome) variable $y_i$ is the\n",
|
||
"outcome of a numerical experiment or another type of experiment and is\n",
|
||
"thus only an approximation to the true value. It is then always\n",
|
||
"accompanied by an error estimate, often limited to a statistical error\n",
|
||
"estimate given by the standard deviation discussed earlier. In the\n",
|
||
"discussion here we will treat $y_i$ as our exact value for the\n",
|
||
"response variable.\n",
|
||
"\n",
|
||
"Introducing the standard deviation $\\sigma_i$ for each measurement\n",
|
||
"$y_i$, we define now the $\\chi^2$ function (omitting the $1/n$ term)\n",
|
||
"as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\chi^2(\\boldsymbol{\\beta})=\\frac{1}{n}\\sum_{i=0}^{n-1}\\frac{\\left(y_i-\\tilde{y}_i\\right)^2}{\\sigma_i^2}=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}}\\right)^T\\frac{1}{\\boldsymbol{\\Sigma^2}}\\left(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}}\\right)\\right\\},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where the matrix $\\boldsymbol{\\Sigma}$ is a diagonal matrix with $\\sigma_i$ as matrix elements. \n",
|
||
"\n",
|
||
"\n",
|
||
"In order to find the parameters $\\beta_i$ we will then minimize the spread of $\\chi^2(\\boldsymbol{\\beta})$ by requiring"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\beta_j} = \\frac{\\partial }{\\partial \\beta_j}\\left[ \\frac{1}{n}\\sum_{i=0}^{n-1}\\left(\\frac{y_i-\\beta_0x_{i,0}-\\beta_1x_{i,1}-\\beta_2x_{i,2}-\\dots-\\beta_{n-1}x_{i,n-1}}{\\sigma_i}\\right)^2\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"which results in"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\beta_j} = -\\frac{2}{n}\\left[ \\sum_{i=0}^{n-1}\\frac{x_{ij}}{\\sigma_i}\\left(\\frac{y_i-\\beta_0x_{i,0}-\\beta_1x_{i,1}-\\beta_2x_{i,2}-\\dots-\\beta_{n-1}x_{i,n-1}}{\\sigma_i}\\right)\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"or in a matrix-vector form as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = 0 = \\boldsymbol{A}^T\\left( \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{\\beta}\\right).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where we have defined the matrix $\\boldsymbol{A} =\\boldsymbol{X}/\\boldsymbol{\\Sigma}$ with matrix elements $a_{ij} = x_{ij}/\\sigma_i$ and the vector $\\boldsymbol{b}$ with elements $b_i = y_i/\\sigma_i$. \n",
|
||
"\n",
|
||
"We can rewrite"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = 0 = \\boldsymbol{A}^T\\left( \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{\\beta}\\right),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{A}^T\\boldsymbol{b} = \\boldsymbol{A}^T\\boldsymbol{A}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and if the matrix $\\boldsymbol{A}^T\\boldsymbol{A}$ is invertible we have the solution"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\beta} =\\left(\\boldsymbol{A}^T\\boldsymbol{A}\\right)^{-1}\\boldsymbol{A}^T\\boldsymbol{b}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"If we then introduce the matrix"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{H} = \\left(\\boldsymbol{A}^T\\boldsymbol{A}\\right)^{-1},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we have then the following expression for the parameters $\\beta_j$ (the matrix elements of $\\boldsymbol{H}$ are $h_{ij}$)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\beta_j = \\sum_{k=0}^{p-1}h_{jk}\\sum_{i=0}^{n-1}\\frac{y_i}{\\sigma_i}\\frac{x_{ik}}{\\sigma_i} = \\sum_{k=0}^{p-1}h_{jk}\\sum_{i=0}^{n-1}b_ia_{ik}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We state without proof the expression for the uncertainty in the parameters $\\beta_j$ as (we leave this as an exercise)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\sigma^2(\\beta_j) = \\sum_{i=0}^{n-1}\\sigma_i^2\\left( \\frac{\\partial \\beta_j}{\\partial y_i}\\right)^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"resulting in"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\sigma^2(\\beta_j) = \\left(\\sum_{k=0}^{p-1}h_{jk}\\sum_{i=0}^{n-1}a_{ik}\\right)\\left(\\sum_{l=0}^{p-1}h_{jl}\\sum_{m=0}^{n-1}a_{ml}\\right) = h_{jj}!\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The first step here is to approximate the function $y$ with a first-order polynomial, that is we write"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"y=y(x) \\rightarrow y(x_i) \\approx \\beta_0+\\beta_1 x_i.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"By computing the derivatives of $\\chi^2$ with respect to $\\beta_0$ and $\\beta_1$ show that these are given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\beta_0} = -2\\left[ \\frac{1}{n}\\sum_{i=0}^{n-1}\\left(\\frac{y_i-\\beta_0-\\beta_1x_{i}}{\\sigma_i^2}\\right)\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\beta_1} = -\\frac{2}{n}\\left[ \\sum_{i=0}^{n-1}x_i\\left(\\frac{y_i-\\beta_0-\\beta_1x_{i}}{\\sigma_i^2}\\right)\\right]=0.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"For a linear fit (a first-order polynomial) we don't need to invert a matrix!! \n",
|
||
"Defining"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma = \\sum_{i=0}^{n-1}\\frac{1}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma_x = \\sum_{i=0}^{n-1}\\frac{x_{i}}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma_y = \\sum_{i=0}^{n-1}\\left(\\frac{y_i}{\\sigma_i^2}\\right),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma_{xx} = \\sum_{i=0}^{n-1}\\frac{x_ix_{i}}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma_{xy} = \\sum_{i=0}^{n-1}\\frac{y_ix_{i}}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we obtain"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\beta_0 = \\frac{\\gamma_{xx}\\gamma_y-\\gamma_x\\gamma_y}{\\gamma\\gamma_{xx}-\\gamma_x^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\beta_1 = \\frac{\\gamma_{xy}\\gamma-\\gamma_x\\gamma_y}{\\gamma\\gamma_{xx}-\\gamma_x^2}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This approach (different linear and non-linear regression) suffers\n",
|
||
"often from both being underdetermined and overdetermined in the\n",
|
||
"unknown coefficients $\\beta_i$. A better approach is to use the\n",
|
||
"Singular Value Decomposition (SVD) method discussed below. Or using\n",
|
||
"Lasso and Ridge regression. See below.\n",
|
||
"\n",
|
||
"\n",
|
||
"### Fitting an Equation of State for Dense Nuclear Matter\n",
|
||
"\n",
|
||
"Before we continue, let us introduce yet another example. We are going to fit the\n",
|
||
"nuclear equation of state using results from many-body calculations.\n",
|
||
"The equation of state we have made available here, as function of\n",
|
||
"density, has been derived using modern nucleon-nucleon potentials with\n",
|
||
"[the addition of three-body\n",
|
||
"forces](https://www.sciencedirect.com/science/article/pii/S0370157399001106). This\n",
|
||
"time the file is presented as a standard **csv** file.\n",
|
||
"\n",
|
||
"The beginning of the Python code here is similar to what you have seen\n",
|
||
"before, with the same initializations and declarations. We use also\n",
|
||
"**pandas** again, rather extensively in order to organize our data.\n",
|
||
"\n",
|
||
"The difference now is that we use **Scikit-Learn's** regression tools\n",
|
||
"instead of our own matrix inversion implementation. Furthermore, we\n",
|
||
"sneak in **Ridge** regression (to be discussed below) which includes a\n",
|
||
"hyperparameter $\\lambda$, also to be explained below."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 23,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Mean squared error: 12.36\n",
|
||
"Variance score: 1.00\n",
|
||
"Mean absolute error: 2.83\n",
|
||
"[ 0. 618.32047562 -861.13519106 1404.91549644] -11.057088709963637\n",
|
||
"Mean squared error: 197.93\n",
|
||
"Variance score: 1.00\n",
|
||
"Mean absolute error: 11.69\n",
|
||
"[ 0. 28.18220995 282.79902342 842.30879705] 12.946893955211749\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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wzC45ZZb3F12h6fff/fTPtA6XnnlFRwOB0899VTjbZZvv/12h9gHTMbpLmCIiIhIh6YzACIiIh5IAUBERMQDKQCIiIh4IAUAERERD6QAICIi4oEUAERERDyQhosSkTbJbrdz9913Y7VaMZvNLFmypN2MsCbSHmgcABFpk5xOJyaTCbPZzIcffkheXh6//OUv3V2WSIehSwAics569erF4MGDefbZZxunHT16lKuuuoohQ4bw5ptvNtu6LBYLZvOJP1FVVVUkJSU1zps7dy4DBgzg+uuvb7b1iXgaXQIQkfPy8ccf07Vr18bX//jHPxgxYgQff/xxs68rNTWVRx55hPLycl599dXG6W+++SYffvgh7733XrOvU8RTKACIyEXJyck57UNSzkVhYSG//vWvT5n+zDPPYLPZ6NOnD++99x4rV67kb3/7G4sWLbrYckXk/ygAiMgpKisr+cMf/sCqVauwWCz84he/4Oabbz7lfXPnzmXbtm3s2LGDJ598kg8//JDbbruNOXPm8PHHH5OZmcn06dP59a9/zYMPPsiOHTsYNGgQf/7znwkJCcFms7F06dLT1lBXV4e3tzcAQUFB+Pn5teSPLOJxFABE5BR33XUXY8aMYePGjezYsYNbb72VmTNnnvK+N998k5tuuokrr7yS6667rnH6559/zmuvvYbT6eTqq68mNTWVJ554gh49enD77bezdOlS7r777rPWkJaWxh/+8AfMZjM+Pj48+eSTzf5zingyBQAROclXX30FwB133AHAqFGjiI6O5tixY+e8jBtvvJHIyEgAhg4dSnh4OH379gVg0qRJbN68ucllDBw4kLfeeut8yxeRc6S7AETkJGvXruWKK65ofO1yuaioqCAiIuKcl/Gfgz+Aj4/PSa99fX2prq5unmJF5IIpAIjISXbv3k1oaGjj6y1bthAeHk737t3dV5SINDsFABFpVF9fT3p6OqtXr8bhcHDo0CEee+wxfvOb37i7NBFpZuoDICKNjhw5QufOnUlKSmL06NFERERw5513MnXqVHeXJiLNTEMBi0ijjz/+mC+//JLnn3/+tPMHDBiAt7c3N910E7/61a9at7gfuOWWW9i1axcDBw7kjTfecFsdIu2ZzgCISKO0tLSzXuv//vvvW7GaM3vttdfcXYJIu6c+ACLS6ODBg+rsJ+IhdAlARETEA+kMgIiIiAdSABAREfFACgAiIiIeSAFARETEAykAiIiIeCAFABEREQ+kACAiIuKBFABEREQ8kAKAiIiIB/r/Af0IcebZmWXeAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<Figure size 576x396 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_179_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",
|
||
"# The Ridge regression with a hyperparameter lambda = 0.1\n",
|
||
"_lambda = 0.1\n",
|
||
"clf_ridge = skl.Ridge(alpha=_lambda).fit(X, Energies)\n",
|
||
"yridge = clf_ridge.predict(X)\n",
|
||
"EoS['Eridge'] = yridge\n",
|
||
"# The mean squared error \n",
|
||
"print(\"Mean squared error: %.2f\" % mean_squared_error(Energies, yridge))\n",
|
||
"# Explained variance score: 1 is perfect prediction \n",
|
||
"print('Variance score: %.2f' % r2_score(Energies, yridge))\n",
|
||
"# Mean absolute error \n",
|
||
"print('Mean absolute error: %.2f' % mean_absolute_error(Energies, yridge))\n",
|
||
"print(clf_ridge.coef_, clf_ridge.intercept_)\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.plot(EoS['Density'], EoS['Eridge'], alpha=0.7, lw=2, c='g',\n",
|
||
" label='Ridge $\\lambda = 0.1$')\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",
|
||
"We note also that there is a small deviation between the\n",
|
||
"standard OLS and the Ridge regression at higher densities. We discuss this in more detail\n",
|
||
"below.\n",
|
||
"\n",
|
||
"\n",
|
||
"## Splitting our Data in Training and Test data\n",
|
||
"\n",
|
||
"It is normal in essentially all Machine Learning studies to split the\n",
|
||
"data in a training set and a test set (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."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 24,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Training R2\n",
|
||
"0.9999868619217517\n",
|
||
"Training MSE\n",
|
||
"5.965885569080809\n",
|
||
"Test R2\n",
|
||
"0.9999794306626945\n",
|
||
"Test MSE\n",
|
||
"8.300162456113691\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": 25,
|
||
"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": 26,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename'])"
|
||
]
|
||
},
|
||
"execution_count": 26,
|
||
"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": 27,
|
||
"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": 28,
|
||
"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": 28,
|
||
"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": 29,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/seaborn/distributions.py:2551: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms).\n",
|
||
" warnings.warn(msg, FutureWarning)\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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BiWn06kf/ehH+sY3viGv16vrr79et9xyi9mxotYzzzwjr9erH/3oR1233XPPPRyDAXb99ddrz549uvPOO2Wz2XTzzTdr0aJFSktL4ziYbPXq1Xr44YfV2tqqsWPHavny5WZHimrz58/v+lkIBoO69957NW3aNN6jB9CkSZP0la98Rffee698Pp+uueYafeELX1BBQUGfXo8sxqUGNgEAAABgGAYAAADQHcoyAAAA0A3KMgAAANANyjIAAADQDcoyAAAA0A2mjgOACFNeXq6bbrpJ06dP19q1ay/Y9q1vfUsvv/yytm3bpjlz5qiwsFBW64XnRZ544glJ0oIFC1RYWChJCgaDcjgcWr58ue68806dOXNGt956q7Zs2aKsrKwL9l+8eLG+8Y1v6Oabbw7h/yUAhAfKMgBEIKfTqZMnT6qiokJ5eXmSpLa2tq5FKD7xi1/8oms1q08rLy9XbGysNmzY0HVbRUWF7r//fsXFxWnhwoW65ppr9PLLL+tv/uZvuu6za9cuNTc366abbgrR/xkAhBeGYQBABLLZbLr11lu1cePGrts2b97cpxKbl5enBx54QM8884wk6d5779XLL7+sT0/Hv27dOn3+85+/YPlYAIhmlGUAiFB33nmnfvvb33Z9vX79en32s5+94D733XeflixZ0vXnb//2by/7mMXFxTp8+LAk6brrrpNhGPr4448lnV/Od8uWLfrc5z7Xz/8nABC+GIYBABFq/Pjxslqt2r9/v9LT09Xa2to1BvkT3Q3D6I7FYlFsbKwkyWq16p577tFvfvMbzZo1S7/97W81b948paen9+v/BwCEM8oyAESwO+64Q7/97W+VlpamJUuW9Pnx9u3bd0HhXrZsmW655Ra1tLRo3bp1+t73vtfn5wCASEJZBoAItmTJEt19991KSUnRL3/5yz491okTJ/Tkk0/qoYce6rotNTVV8+fP109+8hPZbDZNnjy5j4kBILJQlgEggmVlZWnkyJFKTExUSkrKRdvvu+++i6aO++Y3v6mRI0eqo6Oj62y01WqV0+nUN7/5Td1www0X3P/ee+/V5z73Of3whz8M1f8GAIQti/Hpy5wBAAAAdGE2DAAAAKAblGUAAACgG5RlAAAAoBuUZQAAAKAblGUAAACgG5RlAAAAoBuUZQAAAKAb/z9mAdtQEKgqHwAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<Figure size 842.4x595.44 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_191_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": 30,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<AxesSubplot:>"
|
||
]
|
||
},
|
||
"execution_count": 30,
|
||
"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_193_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": 31,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABJEAAAFRCAYAAADEnjyhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAACCYElEQVR4nO3de3xU9Z0//teZmdwkpGAMphR0/UYhkIqi20sKGmBRiUKK1P68dAFLi/ZBV/2y++Wrde3lt9tVLO2vVl36XSlYtIWqXURDAQtFU4359uINNkGsqTcWIzFCwyWZZGbO74/0DGfOnPuc65zX8x8lc/ucc2bOeX/e5/N5fwRRFEUQERERERERERHpiPndACIiIiIiIiIiCj4mkYiIiIiIiIiIyBCTSEREREREREREZIhJJCIiIiIiIiIiMsQkEhERERERERERGWISiYiIiIiIiIiIDCX8bgARRcPBgwexYMECvPLKK3mPrVu3Dtu2bYMoishkMrjkkkuwcuVKDA4OYvHixQCAkydP4oMPPsA555wDAPjc5z6H22+/HcPDw5g9ezYmT56M9evXAwAeeugh/OpXvwIAvPvuuxg7dixGjx4NAHjggQdw1llnebHJRERERKEwefJkTJo0CbFYDIIgYGBgAJWVlfjOd76D888/H1u2bME3vvENrFixArfddlv2daIoYu7cuaioqMC2bdt83AIi8gqTSETkqx07dmD37t147LHHUF5ejmQyiVtvvRUPPvgg/vEf/xFPPfUUAOB3v/sd/vVf/zX7b8muXbswefJkdHZ2oru7G3V1dbjppptw0003AQAWL16ML33pS5g3b57n20ZEREQUFhs3bsTpp5+e/ff69evx3e9+F4899hgAYPz48Whtbc1JIv3xj3/E4OAgKioqPG8vEfmD09mIyFe9vb1Ip9MYHBwEAJSVleGb3/wm5s6da+r1mzdvxty5c3HllVdi48aNbjaViIiIKBJSqRTef/99fOxjH8v+bdKkSTjttNPw8ssvZ//25JNPoqWlxY8mEpFPmEQiIl9dffXVqKqqwsyZM3Httddi9erVeP/99zFt2jTD17755pt49dVX0dzcjIULF+Kpp57CkSNHPGg1ERERUXFZunQpWlpaMHPmTFxxxRUAgHvuuSfnOVK8BQADAwN46aWXcMkll3jeViLyD5NIROSr0aNHY8OG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ZyMiKkDYh4oXQ72hsB8DIiIKLqevMV5es4rhGk9EwcORSEREBQj7UHHprmeYp4KF/RgQEVFwOX2N8fKapbzGc3U2InICk0hERAUohqHiVuorBFExHAMiIgomp68xXl+z5Nd4rbqCRERWcDobEVEBOFTcfzwGRETkFqevMbxmEVHYcSQSEVEBimE6WNjxGBARkVucvsbwmkVEYcckEhFRgcI+HawY8BgQEZFbnL7G8JpFRGHG6WxERERERERERGSISSQiIiIiIiIiIjLEJBIRERERERERERliEomIiIiIiIiIiAwxiURERERERERERIaYRCIiIiIiIiIiIkNMIhERERERERERkaGE3w1wQiwm+N0E30R524Fob3+Utx3g9kd5+6O87UC0tj9K2xo2UT02Ud1uL3Efu4v7113cv+7jPnaXtH/19rMgiqLoVYOIiIiIiIiIiCicOJ2NiIiIiIiIiIgMMYlERERERERERESGmEQiIiIiIiIiIiJDTCIREREREREREZEhJpGIiIiIiIiIiMgQk0hERERERERERGSISSQiIiIiIiIiIjLEJBIRERERERERERliEomIiIiIiIiIiAwxiURERERERERERIaYRCIiIiIiIiIiIkNMIhERERERERERkaHQJpFaW1tx5ZVX4rLLLsPPf/5zv5vjuSVLluCqq67C5z//eXz+85/Ha6+95neTXHf8+HHMnz8fBw8eBAC8+OKLWLBgAS6//HL88Ic/9Ll17lNu/ze+8Q1cfvnl2e/Arl27fG6hOx588EFcddVVuOqqq/C9730PQLSOvdr2R+XYA8CPfvQjXHnllbjqqqvw8MMPA4jO8Vfb9igde6Kguffee3HHHXf43YyiFMW41kt79uzBokWLMG/ePHz3u9/1uzlF54knnsh+dz//+c/j4osvxr/8y7/43ayi8tRTT2Xj4Xvvvdfv5hSdhx56CFdccQUWLFiAH//4x8YvEEOop6dHnD17tnjkyBHxxIkT4oIFC8Q//elPfjfLM5lMRpwxY4Y4PDzsd1M88+qrr4rz588XGxoaxPfee08cGBgQm5qaxHfffVccHh4Wly1bJj733HN+N9M1yu0XRVGcP3+++MEHH/jcMne1t7eL1157rZhMJsWhoSFxyZIlYmtra2SOvdr2//rXv47EsRdFUfzd734nXnfddeLw8LA4MDAgzp49W9y/f38kjr/atnd3d0fm2BMFzYsvvih+5jOfEW+//Xa/m1J0ohjXeundd98VZ86cKb7//vvi0NCQeP311xfldTMo3njjDfGyyy4T+/r6/G5K0Th58qT4qU99Suzr6xOHh4fFa665Rmxvb/e7WUWjvb1dnD9/vnjs2DExlUqJN998s/jMM8/oviaUI5FefPFFfPazn8WYMWNw2mmn4YorrsDOnTv9bpZn/vznP0MQBCxfvhwtLS342c9+5neTXPf444/j29/+NsaNGwcA2Lt3L84++2xMnDgRiUQCCxYsKOrvgHL7T548iUOHDuGb3/wmFixYgPvvvx+ZTMbnVjqvpqYGd9xxB0pLS1FSUoK6ujq8/fbbkTn2att/6NChSBx7APj0pz+NRx55BIlEAn19fUin0+jv74/E8Vfb9rKyssgce6IgOXr0KH74wx/ia1/7mt9NKUpRjGu9tGvXLlx55ZWora1FSUkJfvjDH+KCCy7wu1lF6zvf+Q5WrlyJ008/3e+mFI10Oo1MJoOBgQGkUimkUimUlZX53ayi0dXVhZkzZ6KyshLxeByXXHIJdu/erfuaUCaRDh8+jJqamuy/x40bhw8++MDHFnmrv78fjY2N+Pd//3f89Kc/xS9+8Qu0t7f73SxX/du//Rv+9m//NvvvqH0HlNvf19eHz372s7j77rvx+OOP449//CN++ctf+thCd5x33nm48MILAQBvv/02tm/fDkEQInPs1bb/kksuicSxl5SUlOD+++/HVVddhcbGxkj99pXbnk6nI3XsiYLiW9/6FlauXImqqiq/m1KUohjXeumdd95BOp3GV77yFbS0tGDTpk342Mc+5nezitKLL76IwcFBNDc3+92UolJZWYnbbrsNzc3NuPTSS/GJT3wCF110kd/NKhoNDQ144YUXcPToUSSTSezZswcffvih7mtCmUQSRTHvb4Ig+NASf0yfPh3f+973cNppp+H000/HNddcg7a2Nr+b5amofwcmTpyIf//3f0d1dTUqKiqwePHiov4O/OlPf8KyZctw++2346yzzsp7vNiPvXz7/8f/+B+ROvYAcOutt6KjowPvv/8+3n777bzHi/n4y7e9o6MjcseeyG9PPPEEPv7xj6OxsdHvphQtxrXuSqfT6OjowJo1a/D4449j3759ePLJJ/1uVlH6xS9+gS9/+ct+N6PovP766/jP//xPPPvss3jhhRcQi8Wwfv16v5tVNBobG7Fo0SIsXrwYX/3qV3HxxRejpKRE9zWhTCKdeeaZOdmxw4cPZ6f5RMEf//hHdHR0ZP8tiiISiYSPLfJe1L8DBw4cwDPPPJP9dzF/B1566SXceOON+Kd/+idcffXVkTv2yu2P0rHv7u7G/v37AQAVFRW4/PLL8bvf/S4Sx19t27dv3x6ZY08UFNu3b0d7ezs+//nP4/7778eePXtw9913+92sosK41l1nnHEGGhsbcfrpp6O8vBx/93d/h7179/rdrKIzNDSEP/zhD5gzZ47fTSk6L7zwAhobG1FdXY3S0lIsWrQIv//97/1uVtE4fvw4LrvsMrS2tuLRRx9FRUUFJk6cqPuaUCaRPve5z6GjowMfffQRBgYG8Otf/xqXXnqp383yzLFjx/C9730PyWQSx48fx5NPPonLLrvM72Z56oILLsBbb72VHaK7bdu2SH0HRFHE3Xffjb/85S8YHh7GY489VpTfgffffx9f//rX8f3vfx9XXXUVgGgde7Xtj8qxB4CDBw/irrvuwtDQEIaGhvCb3/wG1113XSSOv9q2f+pTn4rMsScKiocffhjbtm3DU089hVtvvRVz5szBnXfe6XezigrjWnfNnj0bL7zwAvr7+5FOp/H888+joaHB72YVnQMHDuBv/uZvcNppp/ndlKJTX1+PF198ESdPnoQoitizZw/OP/98v5tVNA4ePIivf/3rSKVSOHbsGJ544gnDKZmhTPOfeeaZWLlyJZYsWYLh4WFcc801mDZtmt/N8szs2bPx2muvYeHChchkMrjhhhswffp0v5vlqbKyMqxevRq33HILkskkmpqaMG/ePL+b5Zn6+nrcdNNNuP7665FKpXD55Zdj/vz5fjfLcevXr0cymcTq1auzf7vuuusic+y1tj8Kxx4Ampqasue6eDyOyy+/HFdddRVOP/30oj/+atv+D//wDxg7dmwkjj0RRQfjWnddcMEF+OpXv4obbrgBw8PDmDFjBr7whS/43ayi895776G2ttbvZhSlmTNnoqurC4sWLUJJSQnOP/983HTTTX43q2jU19fj8ssvR0tLC9LpNG688UZcfPHFuq8RRLXiMkRERERERERERDKhnM5GRERERERERETeYhKJiIiIiIiIiIgMMYlERERERERERESGmEQiIiIiIiIiIiJDTCIREREREREREZGhhN8NIKJoOHjwIBYsWIBXXnkl77F169Zh27ZtEEURmUwGl1xyCVauXInBwUEsXrwYAHDy5El88MEHOOeccwAAn/vc53D77bdjeHgYs2fPxuTJk7F+/XoAwEMPPYRf/epXAIB3330XY8eOxejRowEADzzwAM466ywvNpmIiIgoFCZPnoxJkyYhFotBEAQMDAygsrIS3/nOd3D++edjy5Yt+MY3voEVK1bgtttuy75OFEXMnTsXFRUV2LZtm49bQEReYRKJiHy1Y8cO7N69G4899hjKy8uRTCZx66234sEHH8Q//uM/4qmnngIA/O53v8O//uu/Zv8t2bVrFyZPnozOzk50d3ejrq4ON910E2666SYAwOLFi/GlL30J8+bN83zbiIiIiMJi48aNOP3007P/Xr9+Pb773e/iscceAwCMHz8era2tOUmkP/7xjxgcHERFRYXn7SUif3A6GxH5qre3F+l0GoODgwCAsrIyfPOb38TcuXNNvX7z5s2YO3currzySmzcuNHNphIRERFFQiqVwvvvv4+Pfexj2b9NmjQJp512Gl5++eXs35588km0tLT40UQi8gmTSETkq6uvvhpVVVWYOXMmrr32WqxevRrvv/8+pk2bZvjaN998E6+++iqam5uxcOFCPPXUUzhy5IgHrSYiIiIqLkuXLkVLSwtmzpyJK664AgBwzz335DxHircAYGBgAC+99BIuueQSz9tKRP5hEomIfDV69Ghs2LABO3bswDXXXIO+vj7cdNNNWLNmjeFrN2/ejFmzZmHMmDGYNm0aJkyYkB1yTURERETmbdy4EU8//TQeeughDA4OYvr06aiurs55zoIFC7Br1y4MDw9j165dmDNnDuLxuE8tJiI/MIlERL5at24dXn75ZUycOBFf/OIXsWbNGqxbtw6bNm3Sfd3JkyexdetWvPTSS5gzZw7mzJmD3t5e/PznP8fw8LBHrSciIiIqLlOnTsU3vvEN3HXXXTh48GDOYzU1NZg6dSra2tqwdetWXH311T61koj8wiQSEflqcHAQP/jBD3D06NHs39566y1MnTpV93Wtra0YO3Ysnn/+eezZswd79uzB7t27cfLkSezYscPlVhMREREVr/nz5+PCCy/E3XffnffYwoUL8fDDD+PYsWOYNGmSD60jIj9xdTYi8szJkycxffr0nL9t3rwZgiDguuuugyAIyGQy+OQnP4n77rtP9702b96ML3/5yzlDqKuqqrB48WJs3LiRRR6JiIiICvDNb34TLS0teP7553P+PnfuXHz729/GypUrfWoZEflJEEVR9LsRREREREREREQUbJzORkREREREREREhphEIiIiIiIiIiIiQ0wiERERERERERGRISaRiIiIiIiIiIjIEJNIRERERERERERkiEkkIiIiIiIiIiIyxCQSEREREREREREZYhKJiIiIiIiIiIgM/f8DoNXX46X5bAAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<Figure size 1440x360 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_195_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": 32,
|
||
"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": 33,
|
||
"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": 34,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"The model performance for training set\n",
|
||
"--------------------------------------\n",
|
||
"RMSE is 5.637129335071195\n",
|
||
"R2 score is 0.6300745149331701\n",
|
||
"\n",
|
||
"\n",
|
||
"The model performance for testing set\n",
|
||
"--------------------------------------\n",
|
||
"RMSE is 5.137400784702912\n",
|
||
"R2 score is 0.6628996975186952\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"from sklearn.metrics import mean_squared_error, r2_score\n",
|
||
"\n",
|
||
"lin_model = LinearRegression()\n",
|
||
"lin_model.fit(X_train, Y_train)\n",
|
||
"\n",
|
||
"# model evaluation for training set\n",
|
||
"\n",
|
||
"y_train_predict = lin_model.predict(X_train)\n",
|
||
"rmse = (np.sqrt(mean_squared_error(Y_train, y_train_predict)))\n",
|
||
"r2 = r2_score(Y_train, y_train_predict)\n",
|
||
"\n",
|
||
"print(\"The model performance for training set\")\n",
|
||
"print(\"--------------------------------------\")\n",
|
||
"print('RMSE is {}'.format(rmse))\n",
|
||
"print('R2 score is {}'.format(r2))\n",
|
||
"print(\"\\n\")\n",
|
||
"\n",
|
||
"# model evaluation for testing set\n",
|
||
"\n",
|
||
"y_test_predict = lin_model.predict(X_test)\n",
|
||
"# root mean square error of the model\n",
|
||
"rmse = (np.sqrt(mean_squared_error(Y_test, y_test_predict)))\n",
|
||
"\n",
|
||
"# r-squared score of the model\n",
|
||
"r2 = r2_score(Y_test, y_test_predict)\n",
|
||
"\n",
|
||
"print(\"The model performance for testing set\")\n",
|
||
"print(\"--------------------------------------\")\n",
|
||
"print('RMSE is {}'.format(rmse))\n",
|
||
"print('R2 score is {}'.format(r2))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 35,
|
||
"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_202_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",
|
||
"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",
|
||
"**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",
|
||
"### Simple preprocessing examples, Franke function and regression"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 36,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"MSE before scaling: 0.00\n",
|
||
"R2 score before scaling 1.00\n",
|
||
"Feature min values before scaling:\n",
|
||
" [1.00000000e+00 2.54152940e-03 1.38207279e-03 6.45937170e-06\n",
|
||
" 3.51257863e-06 1.91012519e-06 1.64166831e-08 8.92732185e-09\n",
|
||
" 4.85463934e-09 2.63993205e-09 4.17234827e-11 2.26890510e-11\n",
|
||
" 1.23382086e-11 6.70946493e-12 3.64857826e-12 1.06041458e-13\n",
|
||
" 5.76648901e-14 3.13579199e-14 1.70523024e-14 9.27296891e-15\n",
|
||
" 5.04260073e-15]\n",
|
||
"Feature max values before scaling:\n",
|
||
" [1. 0.99817842 0.99945628 0.99636015 0.99763569 0.99891285\n",
|
||
" 0.9945452 0.99581841 0.99709325 0.99836973 0.99273355 0.99400444\n",
|
||
" 0.99527696 0.99655111 0.99782689 0.9909252 0.99219378 0.99346398\n",
|
||
" 0.99473581 0.99600927 0.99728435]\n",
|
||
"Feature min values after scaling:\n",
|
||
" [ 0. -1.63437572 -1.76504618 -1.03871832 -1.08415761 -1.13457922\n",
|
||
" -0.81620806 -0.83935285 -0.86436607 -0.8914984 -0.69347005 -0.70790937\n",
|
||
" -0.72312577 -0.73921714 -0.75629493 -0.61234223 -0.6226921 -0.63339159\n",
|
||
" -0.64447921 -0.65599927 -0.66800261]\n",
|
||
"Feature max values after scaling:\n",
|
||
" [0. 1.86574276 1.72218808 2.41770932 2.31730641 2.21347282\n",
|
||
" 2.88297395 2.79328828 2.70234019 2.60999846 3.291614 3.20772452\n",
|
||
" 3.12283463 3.03697069 2.95014575 3.65766387 3.57871326 3.49865673\n",
|
||
" 3.41754964 3.33544681 3.25240108]\n",
|
||
"MSE after scaling: 0.00\n",
|
||
"R2 score for scaled data: 1.00\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# Common imports\n",
|
||
"import os\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.metrics import mean_squared_error\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.preprocessing import MinMaxScaler, StandardScaler, Normalizer\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",
|
||
"\n",
|
||
"def FrankeFunction(x,y):\n",
|
||
"\tterm1 = 0.75*np.exp(-(0.25*(9*x-2)**2) - 0.25*((9*y-2)**2))\n",
|
||
"\tterm2 = 0.75*np.exp(-((9*x+1)**2)/49.0 - 0.1*(9*y+1))\n",
|
||
"\tterm3 = 0.5*np.exp(-(9*x-7)**2/4.0 - 0.25*((9*y-3)**2))\n",
|
||
"\tterm4 = -0.2*np.exp(-(9*x-4)**2 - (9*y-7)**2)\n",
|
||
"\treturn term1 + term2 + term3 + term4\n",
|
||
"\n",
|
||
"\n",
|
||
"def create_X(x, y, n ):\n",
|
||
"\tif len(x.shape) > 1:\n",
|
||
"\t\tx = np.ravel(x)\n",
|
||
"\t\ty = np.ravel(y)\n",
|
||
"\n",
|
||
"\tN = len(x)\n",
|
||
"\tl = int((n+1)*(n+2)/2)\t\t# Number of elements in beta\n",
|
||
"\tX = np.ones((N,l))\n",
|
||
"\n",
|
||
"\tfor i in range(1,n+1):\n",
|
||
"\t\tq = int((i)*(i+1)/2)\n",
|
||
"\t\tfor k in range(i+1):\n",
|
||
"\t\t\tX[:,q+k] = (x**(i-k))*(y**k)\n",
|
||
"\n",
|
||
"\treturn X\n",
|
||
"\n",
|
||
"\n",
|
||
"# Making meshgrid of datapoints and compute Franke's function\n",
|
||
"n = 5\n",
|
||
"N = 1000\n",
|
||
"x = np.sort(np.random.uniform(0, 1, N))\n",
|
||
"y = np.sort(np.random.uniform(0, 1, N))\n",
|
||
"z = FrankeFunction(x, y)\n",
|
||
"X = create_X(x, y, n=n) \n",
|
||
"# split in training and test data\n",
|
||
"X_train, X_test, y_train, y_test = train_test_split(X,z,test_size=0.2)\n",
|
||
"\n",
|
||
"\n",
|
||
"clf = skl.LinearRegression().fit(X_train, y_train)\n",
|
||
"\n",
|
||
"# The mean squared error and R2 score\n",
|
||
"print(\"MSE before scaling: {:.2f}\".format(mean_squared_error(clf.predict(X_test), y_test)))\n",
|
||
"print(\"R2 score before scaling {:.2f}\".format(clf.score(X_test,y_test)))\n",
|
||
"\n",
|
||
"scaler = StandardScaler()\n",
|
||
"scaler.fit(X_train)\n",
|
||
"X_train_scaled = scaler.transform(X_train)\n",
|
||
"X_test_scaled = scaler.transform(X_test)\n",
|
||
"\n",
|
||
"print(\"Feature min values before scaling:\\n {}\".format(X_train.min(axis=0)))\n",
|
||
"print(\"Feature max values before scaling:\\n {}\".format(X_train.max(axis=0)))\n",
|
||
"\n",
|
||
"print(\"Feature min values after scaling:\\n {}\".format(X_train_scaled.min(axis=0)))\n",
|
||
"print(\"Feature max values after scaling:\\n {}\".format(X_train_scaled.max(axis=0)))\n",
|
||
"\n",
|
||
"clf = skl.LinearRegression().fit(X_train_scaled, y_train)\n",
|
||
"\n",
|
||
"\n",
|
||
"print(\"MSE after scaling: {:.2f}\".format(mean_squared_error(clf.predict(X_test_scaled), y_test)))\n",
|
||
"print(\"R2 score for scaled data: {:.2f}\".format(clf.score(X_test_scaled,y_test)))"
|
||
]
|
||
},
|
||
{
|
||
"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": 37,
|
||
"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": 38,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"ename": "ValueError",
|
||
"evalue": "Found input variables with inconsistent numbers of samples: [1000, 100]",
|
||
"output_type": "error",
|
||
"traceback": [
|
||
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
|
||
"\u001b[0;32m<ipython-input-38-9b9cf4fa1a95>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# split in training and test data\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mX_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX_test\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_test\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtrain_test_split\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mtest_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
|
||
"\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/sklearn/model_selection/_split.py\u001b[0m in \u001b[0;36mtrain_test_split\u001b[0;34m(*arrays, **options)\u001b[0m\n\u001b[1;32m 2125\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Invalid parameters passed: %s\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2126\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2127\u001b[0;31m \u001b[0marrays\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mindexable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0marrays\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2128\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2129\u001b[0m \u001b[0mn_samples\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_num_samples\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marrays\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
||
"\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/sklearn/utils/validation.py\u001b[0m in \u001b[0;36mindexable\u001b[0;34m(*iterables)\u001b[0m\n\u001b[1;32m 290\u001b[0m \"\"\"\n\u001b[1;32m 291\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0m_make_indexable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mX\u001b[0m \u001b[0;32min\u001b[0m \u001b[0miterables\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 292\u001b[0;31m \u001b[0mcheck_consistent_length\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 293\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 294\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
|
||
"\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/sklearn/utils/validation.py\u001b[0m in \u001b[0;36mcheck_consistent_length\u001b[0;34m(*arrays)\u001b[0m\n\u001b[1;32m 253\u001b[0m \u001b[0muniques\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munique\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlengths\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 254\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muniques\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 255\u001b[0;31m raise ValueError(\"Found input variables with inconsistent numbers of\"\n\u001b[0m\u001b[1;32m 256\u001b[0m \" samples: %r\" % [int(l) for l in lengths])\n\u001b[1;32m 257\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
|
||
"\u001b[0;31mValueError\u001b[0m: Found input variables with inconsistent numbers of samples: [1000, 100]"
|
||
]
|
||
}
|
||
],
|
||
"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": null,
|
||
"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": null,
|
||
"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",
|
||
"!bsubex\n",
|
||
"Write a first code which sets up a design matrix $X$ defined by a fifth-order polynomial. Scale your data and split it in training and test data. \n",
|
||
"!esubex\n",
|
||
"\n",
|
||
"!bsubex\n",
|
||
"Perform an ordinary least squares and compute the means squared error and the $R2$ factor for the training data and the test data, with and without scaling.\n",
|
||
"!esubex\n",
|
||
"\n",
|
||
"!bsubex\n",
|
||
"Add now a model which allows you to make polynomials up to degree $15$. Perform a standard OLS fitting of the training data and compute the MSE and $R2$ for the training and test data and plot both test and training data MSE and $R2$ as functions of the polynomial degree. Compare what you see with Figure 2.11 of Hastie et al. Comment your results. For which polynomial degree do you find an optimal MSE (smallest value)?\n",
|
||
"\n",
|
||
"!esubex"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.8.5"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
} |