4260 lines
553 KiB
Plaintext
4260 lines
553 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 $\\hat{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 $(\\hat{x},\\hat{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 \\hat{y} -\\hat{\\tilde{y}}\\vert}{\\vert \\hat{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": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEWCAYAAACXGLsWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAAYG0lEQVR4nO3df7BcZ33f8fdHsmWQ7UCQBAX/kBwiIAokgBWDpy1xiSk2mdieAq3Nj0KBKpi4ZYAQTKAmdYAESAhtxx0jWoqDZGxI04woJppAIKQNZizHBDAegzD+IRNAdrADNSAcffvH7kXr69377K7u7t179X7NnLl7zp49+91nzz2ffc7ZczZVhSRJC1m11AVIkmafYSFJajIsJElNhoUkqcmwkCQ1GRaSpCbDQkeUJJ9O8ooxH3tyku8lWb3YdUmzzrDQspPk1iTf7264v5nkA0mOm9DznDk3XlW3V9VxVfUPi/1c0qwzLLRc/UpVHQc8GXgK8MalLWc6khw1zLRRlyG1GBZa1qrqm8BuOqEBQJKnJ/mrJPck+ZskZ/R7bJLHJvnzJHcnuSvJziQP7973QeBk4KPdHsxvJNmUpJIcleRfJdkzb3mvSbKre/uYJL+X5PYk30pyeZKHDnodSV6W5KYk30myO8nGnvsqya8l+Srw1SRnJNmX5A1Jvgn8j+7zvSfJN7rDe5Ic0338g+Yfo6l1hDMstKwlORE4G9jbHT8B+BjwVuARwK8D/zPJhn4PB34HeAzwM8BJwG8BVNWLgdvp9mCq6p3zHvtR4PFJNvdMewFwZff27wKPoxNiPw2cAFwy4DWcC/wm8C+ADcBfAh+aN9t5wNOALd3xf9R9fRuBbcCbgKd3n+/ngdOAN/c8fv780miqysFhWQ3ArcD3gO8CBXwSeHj3vjcAH5w3/27gJd3bnwZeMWC55wE3zHueM3vGN3Wf76ju+A7gku7tzd161tIJof8HPLbnsacDXx/wvB8HXt4zvgq4D9jYHS/gmT33nwEcAB7SM+1rwHN6xp8N3DpofgeHUQd7Flquzquq4+lsCJ8ArO9O3wg8v7sL6p4k9wD/BHj0/AUkeVSSq5LcmeTv6Wz818+fbwFXAhd0b78A+JOquo9O72AtcH1PDX/and7PRuA/9cz7d3QC54Seee6Y95j9VfWDnvHHALf1jN/WnTZofmkkhoWWtar6C+ADwO91J91Bp2fx8J7h2Kr63T4PfzudT+1PqqqfAF5EZyP948U3nv7PgA1JnkwnNOZ2Qd0FfB/42Z4aHladA/L93AH86ryaH1pVf7VALfPHv0EndOac3J027GuRFmRYaCV4D/CsJD9Pp3fwK0menWR1kod0D/Ce2Odxx9PZnXVv91jH6+fd/y3gpwY9aVX9CPgI8C46xwP+rDv9IPA+4A+SPBI6x1KSPHvAoi4H3pjkZ7vzPizJ84d54T0+BLw5yYYk6+kcH9kx4jKkgQwLLXtVtR/4QzrHD+4A5g4Y76fzqf319F/X/yPwVOBeOgfF/3je/b9DZwN8T5JfH/D0VwJnAh+pqvt7pr+BzkH3a7u7uD4BPH5A/f8LeAdwVXfeL9E5aD+KtwJ7gC8AXwT+ujtNWhSpsncqSVqYPQtJUtNUwiLJWUluTrI3ycV97n9pkv1JPt8dxrp2jyRpMiZ+2n/3omuXAc8C9gHXJdlVVV+eN+vVVXXRpOuRJI1uGj2L04C9VXVLVR0ArqJzAFKStExM44JiJ/DAE4r20blswXzPTfIM4CvAa7rfanmAJNvoXqrg2GOPPfUJT3jCBMqVpJXr+uuvv6uqBp0gOtCsXH3yo8CHquqHSX4VuAJ45vyZqmo7sB1g69attWfPnvmzSJIWkOS29lwPNo3dUHfSuUDbnBO7036squ6uqh92R/8bcOoU6pIkDWkaYXEdsDnJKUnWAOcDu3pnSNJ73Z5zgJumUJckaUgT3w1VVfcnuYjOlT9XA++vqhuTXArsqapdwL9Pcg5wP52LqL100nVJkoa3bM/g9piFJI0uyfVVtXXUx3kGtySpybCQJDUZFpKkJsNCktRkWEiSmgwLSVKTYSFJajIsJElNhoUkqcmwkCQ1GRaSpCbDQpLUZFhIkpoMC0lSk2EhSWoyLCRJTYaFJKnJsJAkNRkWkqQmw0KS1GRYSJKaDAtJUpNhIUlqMiwkSU2GhSSpybCQJDUZFpKkJsNCktRkWEiSmgwLSVKTYSFJajIsJElNhoUkqcmwkCQ1GRaSpKaphEWSs5LcnGRvkosXmO+5SSrJ1mnUJUkazsTDIslq4DLgbGALcEGSLX3mOx54NfC5SdckSRrNNHoWpwF7q+qWqjoAXAWc22e+3wbeAfxgCjVJkkYwjbA4AbijZ3xfd9qPJXkqcFJVfWyhBSXZlmRPkj379+9f/EolSX0t+QHuJKuAdwOva81bVduramtVbd2wYcPki5MkAdMJizuBk3rGT+xOm3M88ETg00luBZ4O7PIgtyTNjmmExXXA5iSnJFkDnA/smruzqu6tqvVVtamqNgHXAudU1Z4p1CZJGsLEw6Kq7gcuAnYDNwEfrqobk1ya5JxJP78k6fAdNY0nqaprgGvmTbtkwLxnTKMmSdLwlvwAtyRp9hkWkqQmw0KS1GRYSJKaDAtJUpNhIUlqMiwkSU2GhSSpybCQJDUZFpKkJsNCktRkWEiSmgwLSVKTYSFJajIsJElNhoUkqcmwkCQ1GRaSpCbDQpLUZFhIkpoMC0lSk2EhSWoyLCRJTYaFJKnJsJAkNRkWkqQmw0KS1GRYSJKaDAtJUpNhIUlqMiwkSU2GhSSpybCQJDUZFpKkpqmERZKzktycZG+Si/vc/8okX0zy+ST/J8mWadQlSRrOxMMiyWrgMuBsYAtwQZ8wuLKqnlRVTwbeCbx70nVJkoY3jZ7FacDeqrqlqg4AVwHn9s5QVX/fM3osUFOoS5I0pKOm8BwnAHf0jO8DnjZ/piS/BrwWWAM8s9+CkmwDtgGcfPLJi16oJKm/mTnAXVWXVdVjgTcAbx4wz/aq2lpVWzds2DDdAiXpCDaNsLgTOKln/MTutEGuAs6bZEGSpNFMIyyuAzYnOSXJGuB8YFfvDEk294z+MvDVKdQlSRrSxI9ZVNX9SS4CdgOrgfdX1Y1JLgX2VNUu4KIkZwI/Ar4DvGTSdUmShjeNA9xU1TXANfOmXdJz+9XTqEOSNJ6ZOcAtSZpdhoUkqcmwkCQ1jRQWSV6d5H3d2/9hMiVJkmbNqD2Lx3LobOzjF7kWSdKMGjUsCnhokicCj5lAPZKkGTRqWPw+EODFwG8ufjmSpFk06nkW7wA+CXykqu6dQD2SpBk0as/iBcDXgbcnuWIC9UiSZtCoYfFwYDPwCOBvF70aSdJMGnU31NuBq4H3VpU/UCRJR4ihexZJ/jHwv4G1wNlJnjOxqiRJM2WUnsUjgJ+k820o8KdPJemIMXTPoqo+CtxVVVdU1RXAPROrSpI0U4buWST5ZeCCJNDpXbyAeT9iJElamUbZDbUe+H7370HgbROpSJI0c4YOi6q6IsnNdM7eXgs8E3jZpAqTJM2OUc+zeAWdnz19C52T8yRJR4BRw+JbwEPo7IZ61OKXI0maRaOelLcTOAD8BvCJxS9HkjSLRvk2VO9JeLvxPAtJOmKM0rPYwKGACIaFJB0xRjkp7wo6Z3D/0+7tjROrSpI0U/xZVUlSkz+rKklq8mdVJUlNo3wbKsB5VXXxBOuRJM2gUS73UUl+IckFwL3daddMrDJJ0swY9aS8TwBreODXaCVJK1wzLJJ8tqpOhx9fTPB44Ker6oaJVydJmgnDHOA+BiDJuwGq6rvAf51kUZKk2TJMWCTJo4AXdQ9yAzx0gjVJkmbMMMcs3gj8JXAl8AdJvsLoX7mVJC1jzbCoqj8FHgeQ5HTg+cDLJ1yXJGmGjPRtqKr6LPDZCdUiSZpRU9mdlOSsJDcn2ZvkQSf1JXltki8n+UKSTybxIoWSNEMmHhZJVgOXAWcDW4ALkmyZN9sNwNaq+jngj4B3TrouSdLwptGzOA3YW1W3VNUB4Crg3N4ZqupTVXVfd/Ra4MQp1CVJGtI0wuIEDl3WHGBfd9ogLwc+3u+OJNuS7EmyZ//+/YtYoiRpITP1FdgkLwK2Au/qd39Vba+qrVW1dcOGDdMtTpKOYKNeG2ocdwIn9Yyf2J32AEnOBN4E/GJV/XAKdUmShjSNnsV1wOYkpyRZA5wP7OqdIclTgPcC51TVt6dQkyRpBBMPi6q6H7gI2A3cBHy4qm5McmmSc7qzvQs4DvhIks8n2TVgcZKkJTCN3VBzv3txzbxpl/TcPnMadUiSxjNTB7glSbPJsJAkNRkWkqQmw0KS1GRYSJKaDAtJUpNhIUlqMiwkSU2GhSSpybCQJDUZFpKkJsNCktRkWEiSmgwLSVKTYSFJajIsJElNhoUkqcmwkCQ1GRaSpCbDQpLUZFhIkpoMC0lSk2EhSWoyLCRJTYaFJKnJsJAkNRkWkqQmw0KS1GRYSJKaDAtJUpNhIUlqMiwkSU2GhSSpybCQJDVNJSySnJXk5iR7k1zc5/5nJPnrJPcned40apIkDW/iYZFkNXAZcDawBbggyZZ5s90OvBS4ctL1SJJGd9QUnuM0YG9V3QKQ5CrgXODLczNU1a3d+w5OoR5J0oimsRvqBOCOnvF93WkjS7ItyZ4ke/bv378oxUmS2pbVAe6q2l5VW6tq64YNG5a6HEk6YkwjLO4ETuoZP7E7TZK0TEwjLK4DNic5Jcka4Hxg1xSeV5K0SCYeFlV1P3ARsBu4CfhwVd2Y5NIk5wAk+YUk+4DnA+9NcuOk65IkDW8a34aiqq4Brpk37ZKe29fR2T0lSZpBy+oAtyRpaRgWkqQmw0KS1GRYSJKaDAtJUpNhIUlqMiwkSU2GhSSpybCQJDUZFpKkJsNCktS0MsNi507YtAlWrer83blzqSuSpGVtKhcSnKqdO2HbNrjvvs74bbd1xgFe+MKlq0uSlrGV17N405sOBcWc++7rTJckjWXlhcXtt482XZLUtPLC4uSTR5suSWpaeWHxtrfB2rUPnLZ2bWe6JGksKy8sXvhC2L4dNm6EpPN3+3YPbkvSYVh534aCTjAYDpK0aFZez0KStOgMC0lSk2EhSWoyLOZ4iRBJGsiwAHjVq+DFL+5cGqTq0CVCDjcwDCBJK8SRFxbzN+CvehVcfnknJHod7iVC5q5RtVAAGSaSlonU/I3kMrF169bas2fPaA+af5FB6JyLMagNEjh4cLwCN23qBMR8GzfCrbf2r2XtWs8JkTRRSa6vqq0jP+6ICotBG/BB5jbs41i1qn8IzQVQK0wkaQLGDYsjazfUqBcT/N73xt811LpGlRc8lLSMHFlhMWgDnvSffvfd8LKXwfr1ox9XaF2jygseSlpGjqywGLQBf+UrO7t/+jlwoBMao3xLaufOQ7+rsXp1Z9r8a1R5wcPh+CUAaTZU1bIcTj311BrLjh1VGzdWJZ2/O3Ycui+p6sTCwsPGjYOXtWNH1dq1D5w/qbrwwtFqGaf+laZfW65du7JfszRhwJ4aY5u75Bv9cYexw2IhGzcOFxYweEO2bl3/+ZPxNnK94bBuXdWaNYu38RwleA43pMZ5/KD3Yy6sl8pyDuxZrX1W61qBDIvF0C8A+g2rV48WLONu5IatZ5yN5yif2gfVsWpV/x7T4TxXr0E9veTByx9lQ3M4G6bl3NvZsePBHzbWrDm82hdjI7/Ubbqcg2qM2g2LRWrIBzxmoQ30sLusFtrItQwbSKMud6Flr1v34DYb1FuaG1qB0eohDHqfhulZDAqydetGC765DwGDXstcjYPaoF+7LbYdO6qOPfbQcy4U1vPft3Xrqo47bnDtCz1n7+u68MLF7+lOswfZ7/UsRlAtZuAMu6wxQ9awWKSGfICFVuKFNratIBl2ZRr1GMqwduwYbrlQdfTRw80393r6regL9RAWep+GOf6z0Aa8dzmj9AQvvLC9+681LNRL67chGHT8a27aoA39XL29y2+Fe79h0HoyTM920Pq90AZvmA9lcx+C+gVf7/JG2bgO+z72+6A097zzpx933IP/T8Y9TrlQjfPnb314GdAOMx0WwFnAzcBe4OI+9x8DXN29/3PAptYym2GxGJ9WRt2Qzd134YXtDf0wwTXMBm7UABx3AzBMHYM+pQ3aeC0UunPvU7+27H0PWnWtWzf66121anHaaP66Nmid6dduRx89/IZt9erDf2/HXf8WWh8GvWfDhtncxnGhdhildzNOiA5q72Hn7d1oD/MBtrfn2G+Y+18Y5r05+ui+7TCzYQGsBr4G/BSwBvgbYMu8eV4FXN69fT5wdWu5zbAYdn93y0KfBFr3tVaqVnC1/vlXr168Lv8k/4n6bbDn/kla79NCPbhJhN5iDvPXtUGvZZSNz6DhcN7bQbuhxtnVOup6MGiYWz/GfU39/reWaj1ovZbe3bGjrl9jtMMsh8XpwO6e8TcCb5w3z27g9O7to4C76F6KZNAwlZ7F4RrmuEfLQivQOMcqxt0AHM4wt7tpnOMSS1HvYg3z17VJvZa5nsU4yx/w6XPB96b1Xi/G65mradzl9fvfWOp1YdwPRofT3n3aYdywmPi1oZI8Dzirql7RHX8x8LSquqhnni9159nXHf9ad5675i1rG7CtO/pE4EuDnnc9POJk2JieEw8LDt4Ot90Ff7dIL29BPwdPOrrTm+rrR3DgC/DFcZfT8/j1dAL2sGvqp6ACA05zb1vodbbep3Hq7V3OQTi4esTfmj8IB1cd5gmr/da1w3ktC7kb9t8Kt4+6/B/BgW/AnYP+H/q9N8Mu93Bf5/VwPYzfZn3WufVPhhNGXRcW06B2mav1VDh1Es/Z53/v8VV1/KjLWrKGG0dVbQe2AyTZU2NcDGslsi0OsS0OsS0OSbLnhqpNS13HLEgy4hVYO6ZxuY87gZN6xk/sTus7T5KjgIcBd0+hNknSEKYRFtcBm5OckmQNnQPYu+bNswt4Sff284A/r0nvH5MkDW3iu6Gq6v4kF9E5iL0aeH9V3ZjkUjoHWnYB/x34YJK9dPafnj/EordPrOjlx7Y4xLY4xLY4xLY4ZKy2WLY/fiRJmp4j6xLlkqSxGBaSpKaZD4skZyW5OcneJBf3uf+YJFd37/9ckk1LUOZUDNEWr03y5SRfSPLJJBuXos5paLVFz3zPTVJJVuRXSIdphyT/srte3JjkymnXOC1D/H+cnORTSW7o/o88ZynqnIYk70/y7e45bP3uT5L/3G2rLyR5anOh45zJN62BCV0qZDkOQ7bFPwPWdm9feCS3RXe+44HPANcCW5e67iVaJzYDNwA/2R1/5FLXvYRtsR24sHt7C3DrUtc9wfZ4BvBU4EsD7n8O8HE6J9s+Hfhca5mz3rM4DdhbVbdU1QHgKuDcefOcC1zRvf1HwC8lg35Ue1lrtkVVfaqq7uuOXkvnnJaVaJj1AuC3gXcAP5hmcVM0TDv8W+CyqvoOQFV9e8o1TsswbVHAT3RvPwz4xhTrm6qq+gwLX6niXOAPq+Na4OFJHr3QMmc9LE4A7ugZ39ed1neeqrofuBdYN5XqpmuYtuj1cjqfHFaiZlt0u9UnVdXHplnYlA2zTjwOeFyS/5vk2iRnTa266RqmLX4LeFGSfcA1wL+bTmkzadTtyfK63IeGk+RFwFbgF5e6lqWQZBXwbuClS1zKLDiKzq6oM+j0ND+T5ElVdc9SFrVELgA+UFW/n+R0Oud2PbGqDi51YcvBrPcsvFTIIcO0BUnOBN4EnFNVP5xSbdPWaovj6Vxo8tNJbqWzT3bXCjzIPcw6sQ/YVVU/qqqvA1+hEx4rzTBt8XLgwwBV9VngIXQuwnkkGmp70mvWw8JLhRzSbIskTwHeSycoVuq+aWi0RVXdW1Xrq2pTdS4edy2dNhnrAmozbJj/jz+h06sgyXo6u6VumWKN0zJMW9wO/BJAkp+hExb7p1rl7NgF/Ovut6KeDtxbVX+70ANmejdUTe5SIcvOkG3xLuA44CPdY/y3V9U5S1b0hAzZFivekO2wG/jnSb4M/APw+qpacT3vIdvidcD7kryGzsHul67QD5Yk+RCdDwnru8do3gIcDVBVl9M5ZvMcOr9Oeh/wb5rLXKFtJUlaRLO+G0qSNAMMC0lSk2EhSWoyLCRJTYaFJKnJsJAkNRkWkqQmw0JaJN3fSnhW9/Zbk/yXpa5JWiwzfQa3tMy8Bbg0ySOBpwAr7ux5Hbk8g1taREn+gs4lV86oqu8udT3SYnE3lLRIkjwJeDRwwKDQSmNYSIug+ytjO+n8Atn3VvCPDOkIZVhIhynJWuCPgddV1U10fs71LUtblbS4PGYhSWqyZyFJajIsJElNhoUkqcmwkCQ1GRaSpCbDQpLUZFhIkpr+PyepaBhj32g5AAAAAElFTkSuQmCC\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",
|
||
" [1.98452685]\n",
|
||
"Coefficient beta : \n",
|
||
" [[5.00109273]]\n",
|
||
"Mean squared error: 0.19\n",
|
||
"Variance score: 0.92\n",
|
||
"Mean squared log error: 0.01\n",
|
||
"Mean absolute error: 0.35\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_13_1.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import numpy as np \n",
|
||
"import matplotlib.pyplot as plt \n",
|
||
"from sklearn.linear_model import LinearRegression \n",
|
||
"from sklearn.metrics import mean_squared_error, r2_score, mean_squared_log_error, mean_absolute_error\n",
|
||
"\n",
|
||
"x = np.random.rand(100,1)\n",
|
||
"y = 2.0+ 5*x+0.5*np.random.randn(100,1)\n",
|
||
"linreg = LinearRegression()\n",
|
||
"linreg.fit(x,y)\n",
|
||
"ypredict = linreg.predict(x)\n",
|
||
"print('The intercept alpha: \\n', linreg.intercept_)\n",
|
||
"print('Coefficient beta : \\n', linreg.coef_)\n",
|
||
"# The mean squared error \n",
|
||
"print(\"Mean squared error: %.2f\" % mean_squared_error(y, ypredict))\n",
|
||
"# Explained variance score: 1 is perfect prediction \n",
|
||
"print('Variance score: %.2f' % r2_score(y, ypredict))\n",
|
||
"# Mean squared log error \n",
|
||
"print('Mean squared log error: %.2f' % mean_squared_log_error(y, ypredict) )\n",
|
||
"# Mean absolute error \n",
|
||
"print('Mean absolute error: %.2f' % mean_absolute_error(y, ypredict))\n",
|
||
"plt.plot(x, ypredict, \"r-\")\n",
|
||
"plt.plot(x, y ,'ro')\n",
|
||
"plt.axis([0.0,1.0,1.5, 7.0])\n",
|
||
"plt.xlabel(r'$x$')\n",
|
||
"plt.ylabel(r'$y$')\n",
|
||
"plt.title(r'Linear Regression fit ')\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The function **coef** gives us the parameter $\\beta$ of our fit while **intercept** yields \n",
|
||
"$\\alpha$. Depending on the constant in front of the normal distribution, we get values near or far from $alpha =2$ and $\\beta =5$. Try to play around with different parameters in front of the normal distribution. The function **meansquarederror** gives us the mean square error, a risk metric corresponding to the expected value of the squared (quadratic) error or loss defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"MSE(\\hat{y},\\hat{\\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 $\\hat{y}$,\n",
|
||
"disregarding the input features, would get a $R^2$ score of $0.0$.\n",
|
||
"\n",
|
||
"If $\\tilde{\\hat{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(\\hat{y}, \\tilde{\\hat{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 $\\hat{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}(\\hat{y}, \\hat{\\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}(\\hat{y}, \\hat{\\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.004999999999999996\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.009883615646716184\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",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"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"
|
||
]
|
||
},
|
||
{
|
||
"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": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 720x720 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_61_9.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.neural_network import MLPRegressor\n",
|
||
"from sklearn.metrics import accuracy_score\n",
|
||
"import seaborn as sns\n",
|
||
"\n",
|
||
"X_train = X\n",
|
||
"Y_train = Energies\n",
|
||
"n_hidden_neurons = 100\n",
|
||
"epochs = 100\n",
|
||
"# store models for later use\n",
|
||
"eta_vals = np.logspace(-5, 1, 7)\n",
|
||
"lmbd_vals = np.logspace(-5, 1, 7)\n",
|
||
"# store the models for later use\n",
|
||
"DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n",
|
||
"train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n",
|
||
"sns.set()\n",
|
||
"for i, eta in enumerate(eta_vals):\n",
|
||
" for j, lmbd in enumerate(lmbd_vals):\n",
|
||
" dnn = MLPRegressor(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',\n",
|
||
" alpha=lmbd, learning_rate_init=eta, max_iter=epochs)\n",
|
||
" dnn.fit(X_train, Y_train)\n",
|
||
" DNN_scikit[i][j] = dnn\n",
|
||
" train_accuracy[i][j] = dnn.score(X_train, Y_train)\n",
|
||
"\n",
|
||
"fig, ax = plt.subplots(figsize = (10, 10))\n",
|
||
"sns.heatmap(train_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n",
|
||
"ax.set_title(\"Training Accuracy\")\n",
|
||
"ax.set_ylabel(\"$\\eta$\")\n",
|
||
"ax.set_xlabel(\"$\\lambda$\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Linear Regression, basic elements\n",
|
||
"\n",
|
||
"\n",
|
||
"[Video of Lecture](https://www.uio.no/studier/emner/matnat/fys/FYS-STK4155/h20/forelesningsvideoer/LectureAug27.mp4?vrtx=view-as-webpage).\n",
|
||
"\n",
|
||
"\n",
|
||
"Fitting a continuous function with linear parameterization in terms of the parameters $\\boldsymbol{\\beta}$.\n",
|
||
"* Method of choice for fitting a continuous function!\n",
|
||
"\n",
|
||
"* Gives an excellent introduction to central Machine Learning features with **understandable pedagogical** links to other methods like **Neural Networks**, **Support Vector Machines** etc\n",
|
||
"\n",
|
||
"* Analytical expression for the fitting parameters $\\boldsymbol{\\beta}$\n",
|
||
"\n",
|
||
"* Analytical expressions for statistical propertiers like mean values, variances, confidence intervals and more\n",
|
||
"\n",
|
||
"* Analytical relation with probabilistic interpretations \n",
|
||
"\n",
|
||
"* Easy to introduce basic concepts like bias-variance tradeoff, cross-validation, resampling and regularization techniques and many other ML topics\n",
|
||
"\n",
|
||
"* Easy to code! And links well with classification problems and logistic regression and neural networks\n",
|
||
"\n",
|
||
"* Allows for **easy** hands-on understanding of gradient descent methods\n",
|
||
"\n",
|
||
"* and many more features\n",
|
||
"\n",
|
||
"For more discussions of Ridge and Lasso regression, [Wessel van Wieringen's](https://arxiv.org/abs/1509.09169) article is highly recommended.\n",
|
||
"Similarly, [Mehta et al's article](https://arxiv.org/abs/1803.08823) is also recommended.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Regression modeling deals with the description of the sampling distribution of a given random variable $y$ and how it varies as function of another variable or a set of such variables $\\boldsymbol{x} =[x_0, x_1,\\dots, x_{n-1}]^T$. \n",
|
||
"The first variable is called the **dependent**, the **outcome** or the **response** variable while the set of variables $\\boldsymbol{x}$ is called the independent variable, or the predictor variable or the explanatory variable. \n",
|
||
"\n",
|
||
"A regression model aims at finding a likelihood function $p(\\boldsymbol{y}\\vert \\boldsymbol{x})$, that is the conditional distribution for $\\boldsymbol{y}$ with a given $\\boldsymbol{x}$. The estimation of $p(\\boldsymbol{y}\\vert \\boldsymbol{x})$ is made using a data set with \n",
|
||
"* $n$ cases $i = 0, 1, 2, \\dots, n-1$ \n",
|
||
"\n",
|
||
"* Response (target, dependent or outcome) variable $y_i$ with $i = 0, 1, 2, \\dots, n-1$ \n",
|
||
"\n",
|
||
"* $p$ so-called explanatory (independent or predictor) variables $\\boldsymbol{x}_i=[x_{i0}, x_{i1}, \\dots, x_{ip-1}]$ with $i = 0, 1, 2, \\dots, n-1$ and explanatory variables running from $0$ to $p-1$. See below for more explicit examples. \n",
|
||
"\n",
|
||
" The goal of the regression analysis is to extract/exploit relationship between $\\boldsymbol{y}$ and $\\boldsymbol{x}$ in or to infer causal dependencies, approximations to the likelihood functions, functional relationships and to make predictions, making fits and many other things.\n",
|
||
"\n",
|
||
"\n",
|
||
"Consider an experiment in which $p$ characteristics of $n$ samples are\n",
|
||
"measured. The data from this experiment, for various explanatory variables $p$ are normally represented by a matrix \n",
|
||
"$\\mathbf{X}$.\n",
|
||
"\n",
|
||
"The matrix $\\mathbf{X}$ is called the *design\n",
|
||
"matrix*. Additional information of the samples is available in the\n",
|
||
"form of $\\boldsymbol{y}$ (also as above). The variable $\\boldsymbol{y}$ is\n",
|
||
"generally referred to as the *response variable*. The aim of\n",
|
||
"regression analysis is to explain $\\boldsymbol{y}$ in terms of\n",
|
||
"$\\boldsymbol{X}$ through a functional relationship like $y_i =\n",
|
||
"f(\\mathbf{X}_{i,\\ast})$. When no prior knowledge on the form of\n",
|
||
"$f(\\cdot)$ is available, it is common to assume a linear relationship\n",
|
||
"between $\\boldsymbol{X}$ and $\\boldsymbol{y}$. This assumption gives rise to\n",
|
||
"the *linear regression model* where $\\boldsymbol{\\beta} = [\\beta_0, \\ldots,\n",
|
||
"\\beta_{p-1}]^{T}$ are the *regression parameters*. \n",
|
||
"\n",
|
||
"Linear regression gives us a set of analytical equations for the parameters $\\beta_j$.\n",
|
||
"\n",
|
||
"\n",
|
||
"In order to understand the relation among the predictors $p$, the set of data $n$ and the target (outcome, output etc) $\\boldsymbol{y}$,\n",
|
||
"consider the model we discussed for describing nuclear binding energies. \n",
|
||
"\n",
|
||
"There we assumed that we could parametrize the data using a polynomial approximation based on the liquid drop model.\n",
|
||
"Assuming"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(A) = a_0+a_1A+a_2A^{2/3}+a_3A^{-1/3}+a_4A^{-1},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we have five predictors, that is the intercept, the $A$ dependent term, the $A^{2/3}$ term and the $A^{-1/3}$ and $A^{-1}$ terms.\n",
|
||
"This gives $p=0,1,2,3,4$. Furthermore we have $n$ entries for each predictor. It means that our design matrix is a \n",
|
||
"$p\\times n$ matrix $\\boldsymbol{X}$.\n",
|
||
"\n",
|
||
"Here the predictors are based on a model we have made. A popular data set which is widely encountered in ML applications is the\n",
|
||
"so-called [credit card default data from Taiwan](https://www.sciencedirect.com/science/article/pii/S0957417407006719?via%3Dihub). The data set contains data on $n=30000$ credit card holders with predictors like gender, marital status, age, profession, education, etc. In total there are $24$ such predictors or attributes leading to a design matrix of dimensionality $24 \\times 30000$. This is however a classification problem and we will come back to it when we discuss Logistic Regression. \n",
|
||
"\n",
|
||
"\n",
|
||
"Before we proceed let us study a case from linear algebra where we aim at fitting a set of data $\\boldsymbol{y}=[y_0,y_1,\\dots,y_{n-1}]$. We could think of these data as a result of an experiment or a complicated numerical experiment. These data are functions of a series of variables $\\boldsymbol{x}=[x_0,x_1,\\dots,x_{n-1}]$, that is $y_i = y(x_i)$ with $i=0,1,2,\\dots,n-1$. The variables $x_i$ could represent physical quantities like time, temperature, position etc. We assume that $y(x)$ is a smooth function. \n",
|
||
"\n",
|
||
"Since obtaining these data points may not be trivial, we want to use these data to fit a function which can allow us to make predictions for values of $y$ which are not in the present set. The perhaps simplest approach is to assume we can parametrize our function in terms of a polynomial of degree $n-1$ with $n$ points, that is"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"y=y(x) \\rightarrow y(x_i)=\\tilde{y}_i+\\epsilon_i=\\sum_{j=0}^{n-1} \\beta_j x_i^j+\\epsilon_i,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\epsilon_i$ is the error in our approximation. \n",
|
||
"\n",
|
||
"\n",
|
||
"For every set of values $y_i,x_i$ we have thus the corresponding set of equations"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{align*}\n",
|
||
"y_0&=\\beta_0+\\beta_1x_0^1+\\beta_2x_0^2+\\dots+\\beta_{n-1}x_0^{n-1}+\\epsilon_0\\\\\n",
|
||
"y_1&=\\beta_0+\\beta_1x_1^1+\\beta_2x_1^2+\\dots+\\beta_{n-1}x_1^{n-1}+\\epsilon_1\\\\\n",
|
||
"y_2&=\\beta_0+\\beta_1x_2^1+\\beta_2x_2^2+\\dots+\\beta_{n-1}x_2^{n-1}+\\epsilon_2\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{n-1}&=\\beta_0+\\beta_1x_{n-1}^1+\\beta_2x_{n-1}^2+\\dots+\\beta_{n-1}x_{n-1}^{n-1}+\\epsilon_{n-1}.\\\\\n",
|
||
"\\end{align*}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Defining the vectors"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{y} = [y_0,y_1, y_2,\\dots, y_{n-1}]^T,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\beta} = [\\beta_0,\\beta_1, \\beta_2,\\dots, \\beta_{n-1}]^T,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\epsilon} = [\\epsilon_0,\\epsilon_1, \\epsilon_2,\\dots, \\epsilon_{n-1}]^T,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and the design matrix"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}=\n",
|
||
"\\begin{bmatrix} \n",
|
||
"1& x_{0}^1 &x_{0}^2& \\dots & \\dots &x_{0}^{n-1}\\\\\n",
|
||
"1& x_{1}^1 &x_{1}^2& \\dots & \\dots &x_{1}^{n-1}\\\\\n",
|
||
"1& x_{2}^1 &x_{2}^2& \\dots & \\dots &x_{2}^{n-1}\\\\ \n",
|
||
"\\dots& \\dots &\\dots& \\dots & \\dots &\\dots\\\\\n",
|
||
"1& x_{n-1}^1 &x_{n-1}^2& \\dots & \\dots &x_{n-1}^{n-1}\\\\\n",
|
||
"\\end{bmatrix}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we can rewrite our equations as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{y} = \\boldsymbol{X}\\boldsymbol{\\beta}+\\boldsymbol{\\epsilon}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The above design matrix is called a [Vandermonde matrix](https://en.wikipedia.org/wiki/Vandermonde_matrix).\n",
|
||
"\n",
|
||
"We are obviously not limited to the above polynomial expansions. We\n",
|
||
"could replace the various powers of $x$ with elements of Fourier\n",
|
||
"series or instead of $x_i^j$ we could have $\\cos{(j x_i)}$ or $\\sin{(j\n",
|
||
"x_i)}$, or time series or other orthogonal functions. For every set\n",
|
||
"of values $y_i,x_i$ we can then generalize the equations to"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{align*}\n",
|
||
"y_0&=\\beta_0x_{00}+\\beta_1x_{01}+\\beta_2x_{02}+\\dots+\\beta_{n-1}x_{0n-1}+\\epsilon_0\\\\\n",
|
||
"y_1&=\\beta_0x_{10}+\\beta_1x_{11}+\\beta_2x_{12}+\\dots+\\beta_{n-1}x_{1n-1}+\\epsilon_1\\\\\n",
|
||
"y_2&=\\beta_0x_{20}+\\beta_1x_{21}+\\beta_2x_{22}+\\dots+\\beta_{n-1}x_{2n-1}+\\epsilon_2\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{i}&=\\beta_0x_{i0}+\\beta_1x_{i1}+\\beta_2x_{i2}+\\dots+\\beta_{n-1}x_{in-1}+\\epsilon_i\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{n-1}&=\\beta_0x_{n-1,0}+\\beta_1x_{n-1,2}+\\beta_2x_{n-1,2}+\\dots+\\beta_{n-1}x_{n-1,n-1}+\\epsilon_{n-1}.\\\\\n",
|
||
"\\end{align*}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**Note that we have $p=n$ here. The matrix is symmetric. This is generally not the case!**\n",
|
||
"\n",
|
||
"We redefine in turn the matrix $\\boldsymbol{X}$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}=\n",
|
||
"\\begin{bmatrix} \n",
|
||
"x_{00}& x_{01} &x_{02}& \\dots & \\dots &x_{0,n-1}\\\\\n",
|
||
"x_{10}& x_{11} &x_{12}& \\dots & \\dots &x_{1,n-1}\\\\\n",
|
||
"x_{20}& x_{21} &x_{22}& \\dots & \\dots &x_{2,n-1}\\\\ \n",
|
||
"\\dots& \\dots &\\dots& \\dots & \\dots &\\dots\\\\\n",
|
||
"x_{n-1,0}& x_{n-1,1} &x_{n-1,2}& \\dots & \\dots &x_{n-1,n-1}\\\\\n",
|
||
"\\end{bmatrix}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and without loss of generality we rewrite again our equations as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{y} = \\boldsymbol{X}\\boldsymbol{\\beta}+\\boldsymbol{\\epsilon}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The left-hand side of this equation is kwown. Our error vector $\\boldsymbol{\\epsilon}$ and the parameter vector $\\boldsymbol{\\beta}$ are our unknow quantities. How can we obtain the optimal set of $\\beta_i$ values? \n",
|
||
"\n",
|
||
"We have defined the matrix $\\boldsymbol{X}$ via the equations"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{align*}\n",
|
||
"y_0&=\\beta_0x_{00}+\\beta_1x_{01}+\\beta_2x_{02}+\\dots+\\beta_{n-1}x_{0n-1}+\\epsilon_0\\\\\n",
|
||
"y_1&=\\beta_0x_{10}+\\beta_1x_{11}+\\beta_2x_{12}+\\dots+\\beta_{n-1}x_{1n-1}+\\epsilon_1\\\\\n",
|
||
"y_2&=\\beta_0x_{20}+\\beta_1x_{21}+\\beta_2x_{22}+\\dots+\\beta_{n-1}x_{2n-1}+\\epsilon_1\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{i}&=\\beta_0x_{i0}+\\beta_1x_{i1}+\\beta_2x_{i2}+\\dots+\\beta_{n-1}x_{in-1}+\\epsilon_1\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{n-1}&=\\beta_0x_{n-1,0}+\\beta_1x_{n-1,2}+\\beta_2x_{n-1,2}+\\dots+\\beta_{n-1}x_{n-1,n-1}+\\epsilon_{n-1}.\\\\\n",
|
||
"\\end{align*}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"As we noted above, we stayed with a system with the design matrix \n",
|
||
" $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times n}$, that is we have $p=n$. For reasons to come later (algorithmic arguments) we will hereafter define \n",
|
||
"our matrix as $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times p}$, with the predictors refering to the column numbers and the entries $n$ being the row elements.\n",
|
||
"\n",
|
||
"In our [introductory notes](https://compphysics.github.io/MachineLearning/doc/pub/How2ReadData/html/How2ReadData.html) we looked at the so-called [liquid drop model](https://en.wikipedia.org/wiki/Semi-empirical_mass_formula). Let us remind ourselves about what we did by looking at the code.\n",
|
||
"\n",
|
||
"We restate the parts of the code we are most interested in."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>1</th>\n",
|
||
" <th>A</th>\n",
|
||
" <th>A^(2/3)</th>\n",
|
||
" <th>A^(-1/3)</th>\n",
|
||
" <th>1/A</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>A</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>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": "iVBORw0KGgoAAAANSUhEUgAAAfMAAAFhCAYAAABkoUMDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAA+C0lEQVR4nO3deZxcVZ3//9e9dWvvfc8GSAgEwiKikgAS2ZVFBkQNODKgDDiC8wV1CCoKv5kRGdAvI+6OjCiojKiIjIg4oIwsMyxfZQ0kmoWsnd67a6977/n9UdWV7k4ndLbqvt3v5+MRU3W76vbpQ5l3f8499xzLGGMQERGRwLInuwEiIiKyZxTmIiIiAacwFxERCTiFuYiISMApzEVERAJOYS4iIhJwCnMREZGAcya7AXuiry+N7+/ZbfLNzTX09KT2UoumP/XXxKmvdo36a+LUVxM3XfrKti0aG5M7/Hqgw9z3zR6H+fB5ZOLUXxOnvto16q+JU19N3EzoKw2zi4iIBJzCXEREJOAU5iIiIgGnMBcREQk4hbmIiEjAKcxFREQCTmEuIiIScApzERGZVlav/jMnnPBWfv/7R/bK+TKZDJ/73HX8zd8s4+KLP8B//ddvKl/78Y/v5qKL3suyZefz2GOPjnpfOp3iQx96P5s3b6oce+mlF7j88kv4679+Pzfc8BmKxeJeaaPCXEREppVf/eoB3vnOU/jFL362V85399130t7ewfe/fw9f+co3+epXb6O3t4cVK17m4Ycf5Hvf+xHf/OZ3+frXv8Lg4AAAL7/8Eh/72GWsX/965TzpdIrPfvYfuPbaz3L33T8B4D//8/690sZArwAnU4Pr+di2he8bVm8aJBYJ0VIf5y+bBkjGwrxpVi2pbJFoOIQBXvxLDzXxMIfs14BvDLZlYVnWZP8YIjINuK7Lww//mq9//d/4u7/7MK+//jrxeCMXXHAOJ598Gk8++TihUIgrrriSe+65mw0b1nPllVdzyimn0dvbw6233kRnZye2bXPFFVfytrcdy9FHv4V58w4AoLGxibq6Onp6enjqqSdYuvRkotEo0WiUo48+hiee+APvfvfZPPDAfXziE8v5p3/6fKVtzzzzvyxadCQHHbQAgGuuuRbPc/fKz60wlwkxxrBqwwADOY/1m/p58qUtOEBt3GFLVwbHKg3z5PMeGINlAFNaQjFkWXiewbIgFLJwXR+AP0Qc8kWPsGPT1hDHtm2SCYfWxgQD6QLxqENjXZRQyMYJ29v+dkI4jk3IsUt/l4/rFwKRyXP/42tYu3lwn5z7gFl1nHvCmyb02qeeepyOjg72229/3vGOd3LPPfdw6aV/B0BLSyt33/0Tbrrp/+Puu+/k9tu/xYsvPs/tt3+ZU045ja985UucddZ7OOGEpXR3d/Oxj32EO+/8EW972+LK+R955GGKxSJvetOB3HffvRx66KLK15qbW+jq2grAddd9bru2bdiwnng8zqc//Sk2bdrAkUcezVVXXb0HPbONwly2Y4whmymSTuVZuaYPv+izsXOI7p40ISz8Qimwi0AWsLHwMfhA3AnhG4Pr+cSiDkXXx/N8HNvC98HHEA+HKHo+hayLBbjApsF85fu/NqItiZiDbVnYtkXYsckXfUK2RW08TK7gYVmQjIcBCEdCRKMOnjE4kRD1tVFCjl06HgsTcizCEYdEIkzO87Fsi5aGOEXXJ5N3yRc8VqzrI1/0OGhOPc31MWriYZyQrkaJBMWDDz7AqaeeAcApp5zGP/3T5/nrv74MgMWLjwOgvb2DlpZWHMeho2MWQ0NDADz77NOsW7eO737320Cpyt+4cQMLFhwCwKOP/he33/5lvvSlr+I4znC9Mopl7fjfC8/zePrp/+Hb3/4e7e0d3HzzP3H33XfykY9cscc/t8J8hisWPAb6sgz0ZUkN5kgN5kkN5fFcn57BHIPpQuW1IcsiGnVwQxaNtXFiMQdjQUN9HCdsYyxKARqywbKIREJYNhRcn0TMoegasgWXhpoIrmvozxSoT0YYTBXo7MtgAZu7M/QP5WioiTKULpDyTanC9w3kXTBguYb+fBEM4BvsoTzG88GyCIdsiq4HQNgJ4Xo+Bog6NgW39DgSsimUX+NEQrgGjA3GtsC2MLbFa69uBdsiFA4xd1YttckItckoh+7fSE35lwcR2WailfO+1NfXy1NPPcGrr67g3nvvwRjD4OBgZSJcOLzt/7uhUGi793uez+23f5O6unoAuru7aGxsAuCnP72HH/3oLv7v//068+cfBEBrays9Pd2V9/f0dPPmN79lh+1rbm5m0aLDmT17DgAnn3wqP/vZT/bwpy5RmM8wmXSB7s4Ufd1p+nuzpIfyGGAwXSASDmFZ0DuYx1iQNwYSYRoaYoTCId56WDuLDu0gncnvs2FtYwyeb3BCNoPpAn/ZNEDECZHKFukbytPWGGdjV4p1nSlmtyTJ5Ir0DOSwLTAeuL5PxLbAN+QKXin8jSHrGQhZWAbyno8dsrGMwS14gEU4ZIFliEccHGwyGRfP83E9nw2dabAsTMjif0M2kZhDMhlh7qxaYjGHaDzMgv0bSCQiGuoXmUS/+c2DHHPM2/nyl2+vHLvnnju5//6fT+j9xxzzVn7+83u55JLLWLNmNVdd9bfce+8vefbZZ/iP//gx3/zmHbS3d1Rev3jxcdx6600sW/bXZLNZnnvuGS677KM7PP/b3raYO+74Dp2dW2hv7+CJJx7nkEMO3f0feASF+TRXLHqsXdNHdjBPb1eKTGpbpZ0reITDNgMFlz7Xw1gGwiFMYxTs0qS0M94+j0P2a6y8p74xTsHdOxM2xmNZFk6oFIh1yQhHL2jd7jVvOXjbMWMMQ5kiybhDvuDTPZBlVnMCY2BzT4bm+hi2ZdHVnx31uL0pTsi26OzOEA3Z4Pnkc27pT770dyHnkkrl6e3P4rk+uYJHOudSzLv0D+To37Tt+uCTlkUoZOFEHFqbE8QTYZqakzTVR6mpjRJLhEkkI6VRCxHZJx588AEuv/zKUccuuugi/u3f/o1ksuYN33/NNddyyy1f4G/+ZhnGGK6//h9JJJLccce3KRRyLF/+icprr7vueg477HBOP/1MLrvsYjzP5bLLPkpra9sOz9/e3sE//MNnWL78ExQKeRYsOHivXTO3jBlv1D8YenpSe7xPbWtrLV1dQ3upRZPHGMOW3gwt9TFsLDZtHKBz4yCvvtrFQCpPNOLQXBclU/Coa05QsGFDfxbCpSHxcDiEBRSKHkcf3MrC/RuJR0LUJiKjvs906a9dVSx65LNFhoYK9A9k2dKVprMrjXF9ctki6XQBa8xn0batUdfUahNh4vEwkZhDS0uSWDxMNObQ2pIgkYwQT0QIOTM37GfqZ2t3qK8mbrr0lW1bNDfv+BcSVebTxP+8soWn/7SZGh/inqFvKF+ZTW7CIbJRm9eND4kQ3blSde4kwliUXnbOcQfQ2hAjk3NpqotN4k8yNYXDIcLhEDV1MWbNqWPswFgmVySbd9m4eYhV6/rwXR/fNWzdOoTlGfAMg+lCZQ7C+g0D287thLBtCzDU1kRJ1kSIxMJ0tCWJJyKE4w5tzQniSQ3ji8j4FOYB43o+q9b3M7ethtpEBM/zef75zTz3v+txih45IEcpwE3cId4Q44Sj5/DES5tJZYos3L+RQtEjV/A45Zi51CUjpZnnkdJHYfhv2TWJWJhELExzfZwjF5aG2Vpba3l9Qx9OyKI/VeClNT0U8x7pVJ7OrjS2b/ALPoW8C56P5RvyvRm6ezMArFrZVTl/2AnhOBaWE6KhIUY0HsYK28xqrymFfNhm//Y6opHtJ/WIyPSnf7kD5tH/t5EVa3uJhkMcUBNly7p+0ukiFoaG+hhWMkI2bHHa4v2Z21aDRek69Jtm1ZHOFcetunXr1b4Tj5b+L9baEOeko+du93XP99nUXZrJnyu4vLa2j2LOJZct0tOTwfYNeD6FvEcxZwCXTGrbbXyrX9m67WQhGzsSwoQs2lqSNDXGCccc9p9bR1tTklDIIuwo7EWmI4V5ABhjeL0zxdb+LCvW9GBlXNxUmr8MX6MNh9hvQTPveueBhJ0QxpjthmOjkZCqtikoZNvMa9t2HeyguQ2Vx8PTWXxj2NSdoVj0yKQLrN80iJd38QoevX1ZjOvjF33yeQ8/W1rnuTNVoHNtHwAvAMaywLFKk/GSEUzIYs6sOtrbkoRCIdqb4pVb7jSULxI8CvMAeP7PPTz2p41YOZfQYIGWZARqoxBx2P/gZo48rL2ycAroH+PpYvi/Y8iyRgX+4QdvP8PfGENff5ZMqsDQUJ616wfIZgoUsi4DA7nKNfx0b5Z0bxaA3rX9vEj5/vqQDY6NcWyaGuPU1kUxjsWctlqa60ujOa0Ncd1jLzJFKcynON8YnlvRid2XI2kgnowwq6OWhUd20DarVsEtQCn4mxoTNDUmADj0sPbK14wxpcWB+nO8vmmAzFCBfLbI1q40+WwR4xvyBQ+/6GEB/UN5+svvXW93lkI+ZIEzPIxv09SUoK4mgjGGWc1JOpoTRMKh0t0U+kyKVJ3CfAozxvDMcxvJvj5AxC4Nix5yeDv7zW8uz34WeWOWZRGJOrS219DaPvrWFmMMhbxLajBPOlVgaDDH5q0pMkMFCtki6Vxp8RzjQz5VxJgCFtC3NU2vXQr4tSEb45QeJ2ujHHxAE62Ncea115CMqZIXqQaF+RS1fssQDz70Gt5QAcsYZu/XwImnLiCe0D+OsvdYlkU0FiYaC9NcXutieNsIYwy5bGnCXTpVIDWUJzWYI50q0N+XKy2VawzZgkcx7+NlXHJ9OV54fQDjlIbtEzURYskIczpqmX9AI031MRIKeNlHNm/exIUXns8BBxxYOeY4NgceuIATT3wnJ5ywlI9//Aq++tVvT2Ir9w2F+RQ02J/jvx58DTeVLy3o0pbk9HcdTFS3jUkVWZZFPBEmntgW9MMqm/EM5cmkCqRTeVKDpVvuBgdz5Ase2bxHNpch252hb10/L/3veoxtkUhGaGtNUlcfY86sWlpbakjWRsZvhMguamlp5c47f1R5PnbRmD/+8bnJaNY+p3SYQgbTBR55ci25TSkyqTx2NMR73nMY7W01un1MphTLKoVyIrl9CHueT3qowEB/lq7uNH19WbaUh+6LRY/sUJ51Q6Xb6178Y6lysi2LxsY4tXUxEskI7W1JmpoSJGujxOKO5oYEwDOPr6Vr875Zaa11Vi1vO+GA3X7/F75wI0cffQwrV74KwN/+7d/wb//2/b3UuqlBYT6F/O7xNWx6rbQDjx93OPJtc5kzq26SWyWya0Ihm7qGGHUNMeYdsG1df2MM6XSRV//SQ+fWIQYH8vT2ZSkWPayiR1d3ms6tqfKrS1ve2jZEwqFSqCfCNDUlaG+roa4+RkNjHGcGL38r4+vu7uKSSy6qPD/vvHMrj6+++h/46U//Y9oFOSjMp4zXXt7CplU9AJjaCKH6KEcfsuMF+0WCxrIsamoivPWoWcAsoLSi4WC6QCpbZOPWDOvX91LMefT1ZSgUfXB98gWPofIyuGtX91bO5zg2iUSEeDJCfUOMpqY4NbVR2ttqqK+PqZqvsj2pnPem8YbZr776k5PYoupQmE8Bf16xlRf/uBnfNyRn1fLesxbi+0b39Mq054RsmupiNNXFOObw2ZVrm0XXoz9VoFD06OxJ09ebI5vO09ObJZsu4OU9XNdncDDH4GCOzs2DI85qEQ7bhKMOybooTU0JGhpjtLcm6WirIay5JzIN6VM9ydas7GblS52ksy5eQ4zDDm/fbqcykZkm7IRobYgDMKd1+52ifGPY2pthc2eK/v4cvb0ZUkN53JxLLlOkWPRKK+al8nSN2KrWsixsxyaejNDYFKeuPkZLS5LZHTU01MewbQ3bT3ehUAjXdXGc6RV/Vf9p7r//fr7zne8AcOKJJ7J8+fJqN2HKWL+ml5f/tJnewRwDEQsTdzh4XsNkN0tkyrMti47mJB3Nye2+5no+3X0Z+vtzbO5M0duTqcy49/IeXtEj1Z8l1Z8d/UbLIpoIU1MbJV4Tobk5wX6z62hvr9GdJNPICSecyCWXXMQdd9xFNBqd7ObsNVXdzzybzbJ06VIeeugh6urquPDCC7nmmms47rjjdut8Qd7PvKtziGf+sI6egRx9IbBqIyxZ1MFbF07t6+TTZW/galBf7Zp93V/GGPJFj8GBHBs3D9HZlWJoME9qIE82U8C4/g7eaRGJlSbhJWqiNDTEaG+vobkpQVNjDCdU/T0P9NmauOnSV1NqP3PP8/B9n2w2SyKRwHXdafWb0UStXNPLo79eSX0izFAITDLMBUvnM7tl+ypDRPYOy7KIRRxirTW0jTN0n8kU2LhliK6uNEODeXp7MwwOlobuC+U/fV1pNgIvD5/TtojXlCfhlYfs6xtitLfWUF878/5tk8lT1TCvqanh//yf/8O73/1uYrEYb3/723nLW95SzSZUlef7bO7JMKclWZlZ67k+zz6xDs/16M5b+I1R9u+oVZCLTLJEIsKCA5tZcGDzqOOFosemziG2dKYYGsjR25clVQ55t+iRGcyTGczTs3mI1Wzbg96JOpVh++amBA2NcVpbk8xqTRLSuhGyl1V1mP3VV1/luuuu44477qC2tpZPfepTHHnkkVx22WXVakJVPfHCJh555nXOPO5NvPXQdowx/M9jq3ns8TUUjIGOGrAt/ubMw9hf95OLBE7/QJa1r/fT1Z2ma2uKvt4suUyBTKqA8ccftrdsGysSIp6M0NySpKYuSlNTnP3mNVCTiFCbiIzaBVFkIqpamT/++OMsWbKE5ubSb77nn38+P/rRj3Y7zKf6NfMVf+mmkHd54bVO9m9JsHFdH6++3Emu4OG1JDjqgEZs2yIeIjDXdKbL9adqUF/tmqD215yOGuZ01ADbdqpzXZ8tW1P09g6vgpchmy6QTRUpFlxwPYYyBYa6UqPOZUI2OBZOPIwTCRFNhmlrSZJIREjEHOqSEcKOzeyOekzRJezYWGjb450J6udqrCl1zXzhwoXceuutZDIZ4vE4jz76KEcccUQ1m1BV3eXZspt7M2RSeV7+42YKRQ+vrjRTdumb50xyC0VkX3Acm7mz65g7e/sRt0ymwNBAns6uFFu70mRSBVKDeTLpAsY3FAs+Xj6HB+SBwTX9lT3nh3enc+Lh0uheyCIadWiuixGLhIhGHBpqIiSiDrGIQzQSIh4JUZuIEI1Uf6KeVE9Vw/yEE07glVde4fzzzyccDnPEEUdw+eWXV7MJVZPNu6SyxdLjbJHn/nc9btEjUhfFZKGtMT7JLRSRyZBIREgkIrTPqh113PcNmfKGNT29GdJDBfr6sgz0Z3GLPp7vl3aqK/iYQh5T8DAG3JDFFicNjlXZrc6EbLCBcsVu2xYHdNTyptl1zG2toT4ZUTU/zVT95snLL7982gb4SN0DucpjK+exeeMgjfUx3KYYbCrQ3qQwF5FtbNuipi5GTV2Mjrn1leOlPec9UkN50uU/xoetW4bIpPO4nqHoevg+eL7Bzft4voexAMfGsy0yns+aTC+rX++HkEVNMsLc1hrmtdXwpll1xKO6jz7o9F9wHxkeYrcBazBPLham48AmntvQB1BZ3UpEZGdKe847RGMOza2lu16GrwN7nl9aEGcoPyLsS3vPu0Wvcg7PN6RzRbJDRXIFj6ydZeXGIVaGLAiHqKuP0d5Ww4L9G5jbUqMh+QBSmO8jXeXKvCPssNU3DLoej67YApZFKGQrzEVkj4VCNrX1MWrrY6OOl6p5l9RgOeRTBdLlx9lMgULRJ5t3S38yeVL9OVLr+vnzcxvBsYklIrS2JmhpSdDanOSAeQ1Ewgr4qUxhvo9092fB9QkVXWzbplAXoSYRYW5bDQv3a9T+5CKyz5Sq+TDRWJjmttEzoIf3m08P5Umn8gz0Z+ntydLTmyFVDvp8f5YN/Vk2lHdytGyLaDxMsjZKW2uS9tYkbW1JGhoShFXFTwkK870glS3y6ro+jjqohbBj43o+PYM57KECkYY4b3nzLN60qI3WhrgmnYjIpBq53/xIxhjyOZehgRwbtwyxacsQQwM5hgbz5LNFcukCuXSBni1DrADAIuLYRGMOiZoIzS0JWpqTtDQnqGuIkdAku6pSmO8FDz+znvWdQ2zpzXD2cQewqTuNn3dJuAbHCXHkW+YQT2gRCBGZuizLIhYPE4uHae2o5c0jvjaUyrNla5rNnUNs3jLE0FCBfLmKL6TyDKXydG4ZvpfbIhK2iYRDxJNhGhsTNDTFaWiI09Icp6Y2pmp+H1CY7wUbyws//GXjAABrtwxhp4rEYw77HdioIBeRQKutiVJbE2XBgU2VY67ns7UvQ09vlq1dKTq70qSHCuQzRfKuTyFTIJUp0NWVrrwnFLIJOzaRqENdXZS6hhgNDXE62mqob4wTT4RVze8mhfle0Fwfo6uvNHvd833WrOvDzrkk22LMX9g6ya0TEdn7nJDN7JYaZrfUwMHb/p0ruh6dfVn6B3Ns7UrT1Z0mmyqSTRdwCy5ewSOXdxkczMGGgfK7LEIhCydkk6yNUFcfo74hTnNTgtbWJA0NMRxNwNsphfleELK3/Sb5l42DDHamcCyLBQe3EI2pKheRmSPshJjbWsPc1hqY31I5boyhP1VgMJ2nuzfLls4UqcEcmVRpLXu36OEVXPI9Lr09mVHnDIVsYjGHRG2UmtooLS0JOtpqaGlOENe1eUBhvlfkC9vu53zq+U3YWZd4PMyBh6gqFxGB0jX5xtoojbVR9u+og8NGrGXv+WRyLr2DOTZtHqS3N8vgQCno85kinuuTThdIpwt0bRlizapt53Qcm2giTLImQkNjnJaWJE1NCTraa2bU7XQK870gN2JxhsHOFDYwZ78GEsnI5DVKRCQgnJBNXTJCXTLCAWN2kPSNYTCVZ2Nnit6eDP39Wfp6s6VqPu9SLHoUBzxSAzk6Nw7yWvl9lmURjTvUNyaIxhwaGkr7zc/pqKW2LjrtqnmF+R4yxmyrzI3Byro01EZ56zHaREVEZE/ZlkVDbYyG2hgcNPprhaJH70CWrq4M3T0ZenvSpFOF0vX5vEcuU6SQG8T3Da9X3mXhhG2i8TB19TFamhOVYfv6hjghJ5hrgCjM91DR9fF9g+PYHN5Wx5acz+xZtTQ0Jya7aSIi01okHKKjpYaOlu23Bk1lCmzpSpPLuax/vY/BwTzpwTzZTBG36OEWPdKDOTav76+8xwnZJGoi1NfHmN1RS2trkpraKMnaKNGYM6WreYX5HhoeYo+FQ0QKLrXxMPvPb57S/9FFRKa7mkSEg/aPbLefuev59Pbn2NqVYvOWIXp7s6SG8uQyBdyiz+BAjsGBHBvWD9DRVCrKfGOoTUaoqYuSrImW/q4tPU7WRghNgRU9FeZ7aHiIPYJFX3cGJxxi9n4Nk9soEREZlxOyaWtO0Nac4PCFbZXjvm/o7s/y+qZBVr/ex5bOFJtyBSj64Pr0pwo0ZYrEItnRJ7Qs4olwqYKvK822T9ZEqKmLEY1VL2IV5nsoVw5zK1sELDrm1uEE9JqLiMhMZdsWbU0J2poSvGVRO796ah2rNw4QdmyckE06WyTt+tRbNnMa4oR8yGUK5DJFfN8nW55pP9Kio2ez/0HNVWm/wnwP5QseGIOXLkJNlDmqykVEAs22LN597H6s2TzI7JYkjm3z/1Z18dLqHgZyLgN9I+6Dd8D2fVpro7QmI9RFHIo5l1y2iBOuXmGnMN9D+aKHVfDBM8QTEZrK+w2LiEhwOSGbBXMbKs+XLOrg7Ye28ecNA6xc30+u4GEMGAydvVk6MwU6MwUAauJhPGOYBVTrviaF+R7KFVysnItt2czar14T30REpqmQbXPIfo0csl/jqOPZvMvazYP8edMgr28ZIpUtYlkWhRFrkOxrCvM9lM2XwjyUjDB7Xv1kN0dERKosHnU49IAmDj2giaLrk8m7xCIholVcgU5hvoeG+nNYviEaD1NbH3vjN4iIyLQVdmzqneqv/qlp13toqLwhQFNbUkPsIiIyKRTm4+gdzPHkS5u3u97h+T5b+7MYY4DSUq6ZvhwALbNqq95OERERUJiP67mVXTyzYitrNg+OOv7Miq38+LcrWV0+nh7KU8y7GNuipW375QRFRESqQWE+DtfzASi4/qjjg+nSbQe9g3kAurak8I3BREPEIpp+ICIik0NhPo7yKDrumDB3/dIXsnkXgO7OFL4/HOYzZ99cERGZWhTm4xi+Ju6Vw3vYcLhnci6e59PTlcb3wVT5FgQREZGRFObj8MshPjzcPsz1y2Ged+nrzlAsepiwRSQWxrY1k11ERCaHwnwclWF2b0xlXn6ey7t0d6bwfIOJhKiJh6vdRBERkQqF+Tj8cpoPV+LDKsPseZfe7jSu52OiIWoTCnMREZk8moI9juHK3BtbmQ9PgMsWGcj7uJ7BxELUJqq/2o+IiMgwVebjMOzgmnn5ucl7eJ6PHQ2BbakyFxGRSaUwH0elMh87m70c5lbBK30tWprBrspcREQmk8J8HJVr5ttV5qXjVtHD8wzFUGkGuypzERGZTArzcexoNrvn+WAMVsHH8w3Z8nB8nSpzERGZRArzcVQWjRlRmfu+Kd1/7pYC3Y7YZAo+lmWRjGseoYiITB6F+TjGu2ZeuV5eLP3thWyMMSRjDiFb3SgiIpNHKTSO4RXgiiMq823Xy8v3mpe/pslvIiIy2RTm4xjvPvOxlflgea/z2qQmv4mIyORSmI/DH+c+c3d48lt5FTgTLnVdbVyVuYiITC6F+TiMv/2uae7w5DfAhGwob6zSVBetfgNFRERGUJiPw6/cmjaiMnd9rKJPOGRBee/yww9s5pD9GiahhSIiItvonqpxbLs1zWCMwbIsXK8U5qGQzTFHdDBvfhNzW2smuaUiIiKqzMc1PAHOGFNZDc7zS9fLLeCgAxoV5CIiMmUozMcxXJnDtlvSCkUP3NIiMTV1sclqmoiIyHYU5uMYub/K8CpwhZyL5RtCjk1MK76JiMgUojAfx/AWqLCtMk+nCgCEYw6WZU1Ku0RERMajMB+HGVmZl8v0zFAegKh2SBMRkSlGYT6OkdfMh5d0zaZLlXlUy7eKiMgUozAfhz/iovnwNfNcpghAXMu3iojIFKMwH8eoYfbyveb5cmUer1FlLiIiU4vCfBz+yFvTfJ9C3sNzfYxlEYurMhcRkaml6mH+6KOPcv755/Oud72Lf/7nf672t5+QkZW56xkyqXzpdjXHJuzo9x8REZlaqppM69ev54YbbuAb3/gGDzzwAK+88gqPPfZYNZvwhowxoybAeZ5PJl0oHQ9ZhEIKcxERmVqquvrJb3/7W84880w6OjoAuO2224hGp9auY2bMc9czpDPFUrXu2IQV5iIiMsVUNczXrVtHOBzmIx/5CF1dXZx00klcffXVu32+5ua9sz56a2tt5bHn+USi27qlpjZGMeth2xZOzKGlJTnq9TPRTP/5d4X6ateovyZOfTVxM6Gvqhrmnufx7LPPctddd5FIJPjYxz7Gfffdx/nnn79b5+vpSY26jWx3tLbW0tU1VHnuej6FvLvte/SmyW0ZxHV9ir5haDA36vUzzdj+kh1TX+0a9dfEqa8mbrr0lW1bOy1gqzpm3NLSwpIlS2hqaiIWi3HKKafwwgsvVLMJb2jk9XIohXt2+Jq5Y+GEtJSriIhMLVUN85NOOonHH3+cwcFBPM/jD3/4A4sWLapmE96Q749+Xix45HNu6Vq6beHomrmIiEwxVR1mP+qoo7jsssu46KKLKBaLHH/88bz3ve+tZhPekD+mMh9e+c04NlgKcxERmXqqvpfnBRdcwAUXXFDtbzthY7KcfK4U5pSH1zXMLiIiU43KzDHMmJvT8tnSZDi/XJGrMhcRkalGyTTG2Mq8mCuFuVcuyFWZi4jIVKMwH2PsNXM3PzbM1WUiIjK1KJnGGFuZuwUPAxjbwrYtLEuVuYiITC0K8zG2u8+86JeOhSxtsiIiIlOS0mmMUVluDL7rV+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.9999864543345858\n",
|
||
"Training MSE\n",
|
||
"6.180092462880674\n",
|
||
"Test R2\n",
|
||
"0.9999822527140678\n",
|
||
"Test MSE\n",
|
||
"7.205466494327873\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 0.99\n",
|
||
"Feature min values before scaling:\n",
|
||
" [1.00000000e+00 1.10094646e-03 9.51523276e-04 1.21208310e-06\n",
|
||
" 1.04757618e-06 9.05396545e-07 1.33443859e-09 1.15332528e-09\n",
|
||
" 9.96793117e-10 8.61505887e-10 1.46914544e-12 1.26974938e-12\n",
|
||
" 1.09741585e-12 9.48471852e-13 8.19742904e-13 1.61745046e-15\n",
|
||
" 1.39792608e-15 1.20819609e-15 1.04421672e-15 9.02493044e-16\n",
|
||
" 7.80004454e-16]\n",
|
||
"Feature max values before scaling:\n",
|
||
" [1. 0.99825997 0.99883879 0.99652296 0.99710078 0.99767893\n",
|
||
" 0.99478898 0.9953658 0.99594294 0.99652042 0.99305802 0.99363383\n",
|
||
" 0.99420997 0.99478645 0.99536326 0.99133007 0.99190487 0.99248001\n",
|
||
" 0.99305549 0.99363129 0.99420743]\n",
|
||
"Feature min values after scaling:\n",
|
||
" [ 0. -1.61869821 -1.66880047 -1.06209126 -1.08170444 -1.10131725\n",
|
||
" -0.84087101 -0.85396354 -0.86692943 -0.87972591 -0.71351486 -0.7240496\n",
|
||
" -0.73453972 -0.74495014 -0.75524378 -0.62783293 -0.63680118 -0.64580686\n",
|
||
" -0.65482578 -0.66383151 -0.67279536]\n",
|
||
"Feature max values after scaling:\n",
|
||
" [0. 1.78944806 1.68342382 2.34172919 2.25457052 2.16553696\n",
|
||
" 2.7899453 2.71281409 2.63374631 2.55280484 3.17117385 3.10307631\n",
|
||
" 3.03303359 2.96104648 2.88712946 3.50394742 3.44395541 3.38216436\n",
|
||
" 3.31853484 3.25303483 3.1856411 ]\n",
|
||
"MSE after scaling: 0.00\n",
|
||
"R2 score for scaled data: 0.99\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(\\hat{y},\\hat{\\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{\\hat{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(\\hat{y}, \\tilde{\\hat{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 $\\hat{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
|
||
} |