4268 lines
550 KiB
Plaintext
4268 lines
550 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Linear Regression\n",
|
||
"\n",
|
||
"[Video of Lecture](https://www.uio.no/studier/emner/matnat/fys/FYS-STK3155/h20/forelesningsvideoer/LectureAug21.mp4?vrtx=view-as-webpage)\n",
|
||
"\n",
|
||
"\n",
|
||
"## Introduction\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Our emphasis throughout this series of lectures (small change) \n",
|
||
"is on understanding the mathematical aspects of\n",
|
||
"different algorithms used in the fields of data analysis and machine learning. \n",
|
||
"\n",
|
||
"However, where possible we will emphasize the\n",
|
||
"importance of using available software. We start thus with a hands-on\n",
|
||
"and top-down approach to machine learning. The aim is thus to start with\n",
|
||
"relevant data or data we have produced \n",
|
||
"and use these to introduce statistical data analysis\n",
|
||
"concepts and machine learning algorithms before we delve into the\n",
|
||
"algorithms themselves. The examples we will use in the beginning, start with simple\n",
|
||
"polynomials with random noise added. We will use the Python\n",
|
||
"software package [Scikit-Learn](http://scikit-learn.org/stable/) and\n",
|
||
"introduce various machine learning algorithms to make fits of\n",
|
||
"the data and predictions. We move thereafter to more interesting\n",
|
||
"cases such as data from say experiments (below we will look at experimental nuclear binding energies as an example).\n",
|
||
"These are examples where we can easily set up the data and\n",
|
||
"then use machine learning algorithms included in for example\n",
|
||
"**Scikit-Learn**. \n",
|
||
"\n",
|
||
"These examples will serve us the purpose of getting\n",
|
||
"started. Furthermore, they allow us to catch more than two birds with\n",
|
||
"a stone. They will allow us to bring in some programming specific\n",
|
||
"topics and tools as well as showing the power of various Python \n",
|
||
"libraries for machine learning and statistical data analysis. \n",
|
||
"\n",
|
||
"Here, we will mainly focus on two\n",
|
||
"specific Python packages for Machine Learning, Scikit-Learn and\n",
|
||
"Tensorflow (see below for links etc). Moreover, the examples we\n",
|
||
"introduce will serve as inputs to many of our discussions later, as\n",
|
||
"well as allowing you to set up models and produce your own data and\n",
|
||
"get started with programming.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"## What is Machine Learning?\n",
|
||
"\n",
|
||
"Statistics, data science and machine learning form important fields of\n",
|
||
"research in modern science. They describe how to learn and make\n",
|
||
"predictions from data, as well as allowing us to extract important\n",
|
||
"correlations about physical process and the underlying laws of motion\n",
|
||
"in large data sets. The latter, big data sets, appear frequently in\n",
|
||
"essentially all disciplines, from the traditional Science, Technology,\n",
|
||
"Mathematics and Engineering fields to Life Science, Law, education\n",
|
||
"research, the Humanities and the Social Sciences. \n",
|
||
"\n",
|
||
"It has become more\n",
|
||
"and more common to see research projects on big data in for example\n",
|
||
"the Social Sciences where extracting patterns from complicated survey\n",
|
||
"data is one of many research directions. Having a solid grasp of data\n",
|
||
"analysis and machine learning is thus becoming central to scientific\n",
|
||
"computing in many fields, and competences and skills within the fields\n",
|
||
"of machine learning and scientific computing are nowadays strongly\n",
|
||
"requested by many potential employers. The latter cannot be\n",
|
||
"overstated, familiarity with machine learning has almost become a\n",
|
||
"prerequisite for many of the most exciting employment opportunities,\n",
|
||
"whether they are in bioinformatics, life science, physics or finance,\n",
|
||
"in the private or the public sector. This author has had several\n",
|
||
"students or met students who have been hired recently based on their\n",
|
||
"skills and competences in scientific computing and data science, often\n",
|
||
"with marginal knowledge of machine learning.\n",
|
||
"\n",
|
||
"Machine learning is a subfield of computer science, and is closely\n",
|
||
"related to computational statistics. It evolved from the study of\n",
|
||
"pattern recognition in artificial intelligence (AI) research, and has\n",
|
||
"made contributions to AI tasks like computer vision, natural language\n",
|
||
"processing and speech recognition. Many of the methods we will study are also \n",
|
||
"strongly rooted in basic mathematics and physics research. \n",
|
||
"\n",
|
||
"Ideally, machine learning represents the science of giving computers\n",
|
||
"the ability to learn without being explicitly programmed. The idea is\n",
|
||
"that there exist generic algorithms which can be used to find patterns\n",
|
||
"in a broad class of data sets without having to write code\n",
|
||
"specifically for each problem. The algorithm will build its own logic\n",
|
||
"based on the data. You should however always keep in mind that\n",
|
||
"machines and algorithms are to a large extent developed by humans. The\n",
|
||
"insights and knowledge we have about a specific system, play a central\n",
|
||
"role when we develop a specific machine learning algorithm. \n",
|
||
"\n",
|
||
"Machine learning is an extremely rich field, in spite of its young\n",
|
||
"age. The increases we have seen during the last three decades in\n",
|
||
"computational capabilities have been followed by developments of\n",
|
||
"methods and techniques for analyzing and handling large date sets,\n",
|
||
"relying heavily on statistics, computer science and mathematics. The\n",
|
||
"field is rather new and developing rapidly. Popular software packages\n",
|
||
"written in Python for machine learning like\n",
|
||
"[Scikit-learn](http://scikit-learn.org/stable/),\n",
|
||
"[Tensorflow](https://www.tensorflow.org/),\n",
|
||
"[PyTorch](http://pytorch.org/) and [Keras](https://keras.io/), all\n",
|
||
"freely available at their respective GitHub sites, encompass\n",
|
||
"communities of developers in the thousands or more. And the number of\n",
|
||
"code developers and contributors keeps increasing. Not all the\n",
|
||
"algorithms and methods can be given a rigorous mathematical\n",
|
||
"justification, opening up thereby large rooms for experimenting and\n",
|
||
"trial and error and thereby exciting new developments. However, a\n",
|
||
"solid command of linear algebra, multivariate theory, probability\n",
|
||
"theory, statistical data analysis, understanding errors and Monte\n",
|
||
"Carlo methods are central elements in a proper understanding of many\n",
|
||
"of algorithms and methods we will discuss.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"The approaches to machine learning are many, but are often split into\n",
|
||
"two main categories. In *supervised learning* we know the answer to a\n",
|
||
"problem, and let the computer deduce the logic behind it. On the other\n",
|
||
"hand, *unsupervised learning* is a method for finding patterns and\n",
|
||
"relationship in data sets without any prior knowledge of the system.\n",
|
||
"Some authours also operate with a third category, namely\n",
|
||
"*reinforcement learning*. This is a paradigm of learning inspired by\n",
|
||
"behavioral psychology, where learning is achieved by trial-and-error,\n",
|
||
"solely from rewards and punishment.\n",
|
||
"\n",
|
||
"Another way to categorize machine learning tasks is to consider the\n",
|
||
"desired output of a system. Some of the most common tasks are:\n",
|
||
"\n",
|
||
" * Classification: Outputs are divided into two or more classes. The goal is to produce a model that assigns inputs into one of these classes. An example is to identify digits based on pictures of hand-written ones. Classification is typically supervised learning.\n",
|
||
"\n",
|
||
" * Regression: Finding a functional relationship between an input data set and a reference data set. The goal is to construct a function that maps input data to continuous output values.\n",
|
||
"\n",
|
||
" * Clustering: Data are divided into groups with certain common traits, without knowing the different groups beforehand. It is thus a form of unsupervised learning.\n",
|
||
"\n",
|
||
"The methods we cover have three main topics in common, irrespective of\n",
|
||
"whether we deal with supervised or unsupervised learning.\n",
|
||
"* The first ingredient is normally our data set (which can be subdivided into training, validation and test data). Many find the most difficult part of using Machine Learning to be the set up of your data in a meaningful way. \n",
|
||
"\n",
|
||
"* The second item is a model which is normally a function of some parameters. The model reflects our knowledge of the system (or lack thereof). As an example, if we know that our data show a behavior similar to what would be predicted by a polynomial, fitting our data to a polynomial of some degree would then determin our model. \n",
|
||
"\n",
|
||
"* The last ingredient is a so-called **cost/loss** function (or error or risk function) which allows us to present an estimate on how good our model is in reproducing the data it is supposed to train. \n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"At the heart of basically all Machine Learning algorithms we will encounter so-called minimization or optimization algorithms. A large family of such methods are so-called **gradient methods**.\n",
|
||
"\n",
|
||
"\n",
|
||
"### A Frequentist approach to data analysis\n",
|
||
"\n",
|
||
"When you hear phrases like **predictions and estimations** and\n",
|
||
"**correlations and causations**, what do you think of? May be you think\n",
|
||
"of the difference between classifying new data points and generating\n",
|
||
"new data points.\n",
|
||
"Or perhaps you consider that correlations represent some kind of symmetric statements like\n",
|
||
"if $A$ is correlated with $B$, then $B$ is correlated with\n",
|
||
"$A$. Causation on the other hand is directional, that is if $A$ causes $B$, $B$ does not\n",
|
||
"necessarily cause $A$.\n",
|
||
"\n",
|
||
"These concepts are in some sense the difference between machine\n",
|
||
"learning and statistics. In machine learning and prediction based\n",
|
||
"tasks, we are often interested in developing algorithms that are\n",
|
||
"capable of learning patterns from given data in an automated fashion,\n",
|
||
"and then using these learned patterns to make predictions or\n",
|
||
"assessments of newly given data. In many cases, our primary concern\n",
|
||
"is the quality of the predictions or assessments, and we are less\n",
|
||
"concerned about the underlying patterns that were learned in order\n",
|
||
"to make these predictions.\n",
|
||
"\n",
|
||
"In machine learning we normally use [a so-called frequentist approach](https://en.wikipedia.org/wiki/Frequentist_inference),\n",
|
||
"where the aim is to make predictions and find correlations. We focus\n",
|
||
"less on for example extracting a probability distribution function (PDF). The PDF can be\n",
|
||
"used in turn to make estimations and find causations such as given $A$\n",
|
||
"what is the likelihood of finding $B$.\n",
|
||
"\n",
|
||
"\n",
|
||
"### What is a good model?\n",
|
||
"\n",
|
||
"In science and engineering we often end up in situations where we want to infer (or learn) a\n",
|
||
"quantitative model $M$ for a given set of sample points $\\boldsymbol{X} \\in [x_1, x_2,\\dots x_N]$.\n",
|
||
"\n",
|
||
"As we will see repeatedely in these lectures, we could try to fit these data points to a model given by a\n",
|
||
"straight line, or if we wish to be more sophisticated to a more complex\n",
|
||
"function.\n",
|
||
"\n",
|
||
"The reason for inferring such a model is that it\n",
|
||
"serves many useful purposes. On the one hand, the model can reveal information\n",
|
||
"encoded in the data or underlying mechanisms from which the data were generated. For instance, we could discover important\n",
|
||
"corelations that relate interesting physics interpretations.\n",
|
||
"\n",
|
||
"In addition, it can simplify the representation of the given data set and help\n",
|
||
"us in making predictions about future data samples.\n",
|
||
"\n",
|
||
"A first important consideration to keep in mind is that inferring the *correct* model\n",
|
||
"for a given data set is an elusive, if not impossible, task. The fundamental difficulty\n",
|
||
"is that if we are not specific about what we mean by a *correct* model, there\n",
|
||
"could easily be many different models that fit the given data set *equally well*.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"The central question is this: what leads us to say that a model is correct or\n",
|
||
"optimal for a given data set? To make the model inference problem well posed, i.e.,\n",
|
||
"to guarantee that there is a unique optimal model for the given data, we need to\n",
|
||
"impose additional assumptions or restrictions on the class of models considered. To\n",
|
||
"this end, we should not be looking for just any model that can describe the data.\n",
|
||
"Instead, we should look for a **model** $M$ that is the best among a restricted class\n",
|
||
"of models. In addition, to make the model inference problem computationally\n",
|
||
"tractable, we need to specify how restricted the class of models needs to be. A\n",
|
||
"common strategy is to start \n",
|
||
"with the simplest possible class of models that is just necessary to describe the data\n",
|
||
"or solve the problem at hand. More precisely, the model class should be rich enough\n",
|
||
"to contain at least one model that can fit the data to a desired accuracy and yet be\n",
|
||
"restricted enough that it is relatively simple to find the best model for the given data.\n",
|
||
"\n",
|
||
"Thus, the most popular strategy is to start from the\n",
|
||
"simplest class of models and increase the complexity of the models only when the\n",
|
||
"simpler models become inadequate. For instance, if we work with a regression problem to fit a set of sample points, one\n",
|
||
"may first try the simplest class of models, namely linear models, followed obviously by more complex models.\n",
|
||
"\n",
|
||
"How to evaluate which model fits best the data is something we will come back to over and over again in these sets of lectures.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"## Simple linear regression model using **scikit-learn**\n",
|
||
"\n",
|
||
"We start with perhaps our simplest possible example, using **Scikit-Learn** to perform linear regression analysis on a data set produced by us. \n",
|
||
"\n",
|
||
"What follows is a simple Python code where we have defined a function\n",
|
||
"$y$ in terms of the variable $x$. Both are defined as vectors with $100$ entries. \n",
|
||
"The numbers in the vector $\\boldsymbol{x}$ are given\n",
|
||
"by random numbers generated with a uniform distribution with entries\n",
|
||
"$x_i \\in [0,1]$ (more about probability distribution functions\n",
|
||
"later). These values are then used to define a function $y(x)$\n",
|
||
"(tabulated again as a vector) with a linear dependence on $x$ plus a\n",
|
||
"random noise added via the normal distribution.\n",
|
||
"\n",
|
||
"\n",
|
||
"The Numpy functions are imported used the **import numpy as np**\n",
|
||
"statement and the random number generator for the uniform distribution\n",
|
||
"is called using the function **np.random.rand()**, where we specificy\n",
|
||
"that we want $100$ random variables. Using Numpy we define\n",
|
||
"automatically an array with the specified number of elements, $100$ in\n",
|
||
"our case. With the Numpy function **randn()** we can compute random\n",
|
||
"numbers with the normal distribution (mean value $\\mu$ equal to zero and\n",
|
||
"variance $\\sigma^2$ set to one) and produce the values of $y$ assuming a linear\n",
|
||
"dependence as function of $x$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"y = 2x+N(0,1),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $N(0,1)$ represents random numbers generated by the normal\n",
|
||
"distribution. From **Scikit-Learn** we import then the\n",
|
||
"**LinearRegression** functionality and make a prediction $\\tilde{y} =\n",
|
||
"\\alpha + \\beta x$ using the function **fit(x,y)**. We call the set of\n",
|
||
"data $(\\boldsymbol{x},\\boldsymbol{y})$ for our training data. The Python package\n",
|
||
"**scikit-learn** has also a functionality which extracts the above\n",
|
||
"fitting parameters $\\alpha$ and $\\beta$ (see below). Later we will\n",
|
||
"distinguish between training data and test data.\n",
|
||
"\n",
|
||
"For plotting we use the Python package\n",
|
||
"[matplotlib](https://matplotlib.org/) which produces publication\n",
|
||
"quality figures. Feel free to explore the extensive\n",
|
||
"[gallery](https://matplotlib.org/gallery/index.html) of examples. In\n",
|
||
"this example we plot our original values of $x$ and $y$ as well as the\n",
|
||
"prediction **ypredict** ($\\tilde{y}$), which attempts at fitting our\n",
|
||
"data with a straight line.\n",
|
||
"\n",
|
||
"The Python code follows here."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_3_0.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"%matplotlib inline\n",
|
||
"\n",
|
||
"# Importing various packages\n",
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"\n",
|
||
"x = np.random.rand(100,1)\n",
|
||
"y = 2*x+np.random.randn(100,1)\n",
|
||
"linreg = LinearRegression()\n",
|
||
"linreg.fit(x,y)\n",
|
||
"xnew = np.array([[0],[1]])\n",
|
||
"ypredict = linreg.predict(xnew)\n",
|
||
"\n",
|
||
"plt.plot(xnew, ypredict, \"r-\")\n",
|
||
"plt.plot(x, y ,'ro')\n",
|
||
"plt.axis([0,1.0,0, 5.0])\n",
|
||
"plt.xlabel(r'$x$')\n",
|
||
"plt.ylabel(r'$y$')\n",
|
||
"plt.title(r'Simple Linear Regression')\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This example serves several aims. It allows us to demonstrate several\n",
|
||
"aspects of data analysis and later machine learning algorithms. The\n",
|
||
"immediate visualization shows that our linear fit is not\n",
|
||
"impressive. It goes through the data points, but there are many\n",
|
||
"outliers which are not reproduced by our linear regression. We could\n",
|
||
"now play around with this small program and change for example the\n",
|
||
"factor in front of $x$ and the normal distribution. Try to change the\n",
|
||
"function $y$ to"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"y = 10x+0.01 \\times N(0,1),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $x$ is defined as before. Does the fit look better? Indeed, by\n",
|
||
"reducing the role of the noise given by the normal distribution we see immediately that\n",
|
||
"our linear prediction seemingly reproduces better the training\n",
|
||
"set. However, this testing 'by the eye' is obviouly not satisfactory in the\n",
|
||
"long run. Here we have only defined the training data and our model, and \n",
|
||
"have not discussed a more rigorous approach to the **cost** function.\n",
|
||
"\n",
|
||
"We need more rigorous criteria in defining whether we have succeeded or\n",
|
||
"not in modeling our training data. You will be surprised to see that\n",
|
||
"many scientists seldomly venture beyond this 'by the eye' approach. A\n",
|
||
"standard approach for the *cost* function is the so-called $\\chi^2$\n",
|
||
"function (a variant of the mean-squared error (MSE))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\chi^2 = \\frac{1}{n}\n",
|
||
"\\sum_{i=0}^{n-1}\\frac{(y_i-\\tilde{y}_i)^2}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\sigma_i^2$ is the variance (to be defined later) of the entry\n",
|
||
"$y_i$. We may not know the explicit value of $\\sigma_i^2$, it serves\n",
|
||
"however the aim of scaling the equations and make the cost function\n",
|
||
"dimensionless. \n",
|
||
"\n",
|
||
"Minimizing the cost function is a central aspect of\n",
|
||
"our discussions to come. Finding its minima as function of the model\n",
|
||
"parameters ($\\alpha$ and $\\beta$ in our case) will be a recurring\n",
|
||
"theme in these series of lectures. Essentially all machine learning\n",
|
||
"algorithms we will discuss center around the minimization of the\n",
|
||
"chosen cost function. This depends in turn on our specific\n",
|
||
"model for describing the data, a typical situation in supervised\n",
|
||
"learning. Automatizing the search for the minima of the cost function is a\n",
|
||
"central ingredient in all algorithms. Typical methods which are\n",
|
||
"employed are various variants of **gradient** methods. These will be\n",
|
||
"discussed in more detail later. Again, you'll be surprised to hear that\n",
|
||
"many practitioners minimize the above function ''by the eye', popularly dubbed as \n",
|
||
"'chi by the eye'. That is, change a parameter and see (visually and numerically) that \n",
|
||
"the $\\chi^2$ function becomes smaller. \n",
|
||
"\n",
|
||
"There are many ways to define the cost function. A simpler approach is to look at the relative difference between the training data and the predicted data, that is we define \n",
|
||
"the relative error (why would we prefer the MSE instead of the relative error?) as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\epsilon_{\\mathrm{relative}}= \\frac{\\vert \\boldsymbol{y} -\\boldsymbol{\\tilde{y}}\\vert}{\\vert \\boldsymbol{y}\\vert}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The squared cost function results in an arithmetic mean-unbiased\n",
|
||
"estimator, and the absolute-value cost function results in a\n",
|
||
"median-unbiased estimator (in the one-dimensional case, and a\n",
|
||
"geometric median-unbiased estimator for the multi-dimensional\n",
|
||
"case). The squared cost function has the disadvantage that it has the tendency\n",
|
||
"to be dominated by outliers.\n",
|
||
"\n",
|
||
"We can modify easily the above Python code and plot the relative error instead"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_11_0.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"\n",
|
||
"x = np.random.rand(100,1)\n",
|
||
"y = 5*x+0.01*np.random.randn(100,1)\n",
|
||
"linreg = LinearRegression()\n",
|
||
"linreg.fit(x,y)\n",
|
||
"ypredict = linreg.predict(x)\n",
|
||
"\n",
|
||
"plt.plot(x, np.abs(ypredict-y)/abs(y), \"ro\")\n",
|
||
"plt.axis([0,1.0,0.0, 0.5])\n",
|
||
"plt.xlabel(r'$x$')\n",
|
||
"plt.ylabel(r'$\\epsilon_{\\mathrm{relative}}$')\n",
|
||
"plt.title(r'Relative error')\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Depending on the parameter in front of the normal distribution, we may\n",
|
||
"have a small or larger relative error. Try to play around with\n",
|
||
"different training data sets and study (graphically) the value of the\n",
|
||
"relative error.\n",
|
||
"\n",
|
||
"As mentioned above, **Scikit-Learn** has an impressive functionality.\n",
|
||
"We can for example extract the values of $\\alpha$ and $\\beta$ and\n",
|
||
"their error estimates, or the variance and standard deviation and many\n",
|
||
"other properties from the statistical data analysis. \n",
|
||
"\n",
|
||
"Here we show an\n",
|
||
"example of the functionality of **Scikit-Learn**."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"The intercept alpha: \n",
|
||
" [1.99723611]\n",
|
||
"Coefficient beta : \n",
|
||
" [[5.1007125]]\n",
|
||
"Mean squared error: 0.22\n",
|
||
"Variance score: 0.90\n",
|
||
"Mean squared log error: 0.01\n",
|
||
"Mean absolute error: 0.36\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_13_1.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import numpy as np \n",
|
||
"import matplotlib.pyplot as plt \n",
|
||
"from sklearn.linear_model import LinearRegression \n",
|
||
"from sklearn.metrics import mean_squared_error, r2_score, mean_squared_log_error, mean_absolute_error\n",
|
||
"\n",
|
||
"x = np.random.rand(100,1)\n",
|
||
"y = 2.0+ 5*x+0.5*np.random.randn(100,1)\n",
|
||
"linreg = LinearRegression()\n",
|
||
"linreg.fit(x,y)\n",
|
||
"ypredict = linreg.predict(x)\n",
|
||
"print('The intercept alpha: \\n', linreg.intercept_)\n",
|
||
"print('Coefficient beta : \\n', linreg.coef_)\n",
|
||
"# The mean squared error \n",
|
||
"print(\"Mean squared error: %.2f\" % mean_squared_error(y, ypredict))\n",
|
||
"# Explained variance score: 1 is perfect prediction \n",
|
||
"print('Variance score: %.2f' % r2_score(y, ypredict))\n",
|
||
"# Mean squared log error \n",
|
||
"print('Mean squared log error: %.2f' % mean_squared_log_error(y, ypredict) )\n",
|
||
"# Mean absolute error \n",
|
||
"print('Mean absolute error: %.2f' % mean_absolute_error(y, ypredict))\n",
|
||
"plt.plot(x, ypredict, \"r-\")\n",
|
||
"plt.plot(x, y ,'ro')\n",
|
||
"plt.axis([0.0,1.0,1.5, 7.0])\n",
|
||
"plt.xlabel(r'$x$')\n",
|
||
"plt.ylabel(r'$y$')\n",
|
||
"plt.title(r'Linear Regression fit ')\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The function **coef** gives us the parameter $\\beta$ of our fit while **intercept** yields \n",
|
||
"$\\alpha$. Depending on the constant in front of the normal distribution, we get values near or far from $alpha =2$ and $\\beta =5$. Try to play around with different parameters in front of the normal distribution. The function **meansquarederror** gives us the mean square error, a risk metric corresponding to the expected value of the squared (quadratic) error or loss defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"MSE(\\boldsymbol{y},\\boldsymbol{\\tilde{y}}) = \\frac{1}{n}\n",
|
||
"\\sum_{i=0}^{n-1}(y_i-\\tilde{y}_i)^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The smaller the value, the better the fit. Ideally we would like to\n",
|
||
"have an MSE equal zero. The attentive reader has probably recognized\n",
|
||
"this function as being similar to the $\\chi^2$ function defined above.\n",
|
||
"\n",
|
||
"The **r2score** function computes $R^2$, the coefficient of\n",
|
||
"determination. It provides a measure of how well future samples are\n",
|
||
"likely to be predicted by the model. Best possible score is 1.0 and it\n",
|
||
"can be negative (because the model can be arbitrarily worse). A\n",
|
||
"constant model that always predicts the expected value of $\\boldsymbol{y}$,\n",
|
||
"disregarding the input features, would get a $R^2$ score of $0.0$.\n",
|
||
"\n",
|
||
"If $\\tilde{\\boldsymbol{y}}_i$ is the predicted value of the $i-th$ sample and $y_i$ is the corresponding true value, then the score $R^2$ is defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"R^2(\\boldsymbol{y}, \\tilde{\\boldsymbol{y}}) = 1 - \\frac{\\sum_{i=0}^{n - 1} (y_i - \\tilde{y}_i)^2}{\\sum_{i=0}^{n - 1} (y_i - \\bar{y})^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where we have defined the mean value of $\\boldsymbol{y}$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\bar{y} = \\frac{1}{n} \\sum_{i=0}^{n - 1} y_i.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Another quantity taht we will meet again in our discussions of regression analysis is \n",
|
||
" the mean absolute error (MAE), a risk metric corresponding to the expected value of the absolute error loss or what we call the $l1$-norm loss. In our discussion above we presented the relative error.\n",
|
||
"The MAE is defined as follows"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\text{MAE}(\\boldsymbol{y}, \\boldsymbol{\\tilde{y}}) = \\frac{1}{n} \\sum_{i=0}^{n-1} \\left| y_i - \\tilde{y}_i \\right|.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We present the \n",
|
||
"squared logarithmic (quadratic) error"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\text{MSLE}(\\boldsymbol{y}, \\boldsymbol{\\tilde{y}}) = \\frac{1}{n} \\sum_{i=0}^{n - 1} (\\log_e (1 + y_i) - \\log_e (1 + \\tilde{y}_i) )^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\log_e (x)$ stands for the natural logarithm of $x$. This error\n",
|
||
"estimate is best to use when targets having exponential growth, such\n",
|
||
"as population counts, average sales of a commodity over a span of\n",
|
||
"years etc. \n",
|
||
"\n",
|
||
"\n",
|
||
"Finally, another cost function is the Huber cost function used in robust regression.\n",
|
||
"\n",
|
||
"The rationale behind this possible cost function is its reduced\n",
|
||
"sensitivity to outliers in the data set. In our discussions on\n",
|
||
"dimensionality reduction and normalization of data we will meet other\n",
|
||
"ways of dealing with outliers.\n",
|
||
"\n",
|
||
"The Huber cost function is defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"H_{\\delta}(\\boldsymbol{a})=\\left\\{\\begin{array}{cc}\\frac{1}{2} \\boldsymbol{a}^{2}& \\text{for }|\\boldsymbol{a}|\\leq \\delta\\\\ \\delta (|\\b\\\n",
|
||
"m{a}|-\\frac{1}{2}\\delta ),&\\text{otherwise}.\\end{array}\\right.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Here $\\boldsymbol{a}=\\boldsymbol{y} - \\boldsymbol{\\tilde{y}}$.\n",
|
||
"\n",
|
||
"\n",
|
||
"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": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD6CAYAAABamQdMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAA2PElEQVR4nO3deXhTVfrA8e9J0g0oa0vZLAUBZS+LbCLjLjI4igoj6LiMGyo/t3FGdMYRlZlh3HAXcdwVZXFXZhQQWURENgEFEUqBYmlLC7TQNcn5/XHTkrZJm33r+3mePElubm7ODfS9J+997zlKa40QQojYYgp3A4QQQgSeBHchhIhBEtyFECIGSXAXQogYJMFdCCFikAR3IYSIQY0Gd6XUq0qpfKXUNqdl85VSmx23bKXUZsfyDKVUmdNrc4LYdiGEEG5YPFjndeA54M3qBVrr31c/Vko9ARx1Wn+31jrTm0akpKTojIwMb94ihBBN3oYNGw5prVNdvdZocNdar1RKZbh6TSmlgEnA2f40MCMjg/Xr1/uzCSGEaHKUUnvdveZvzv0MIE9r/YvTsm5KqU1KqRVKqTP83L4QQggfeJKWachk4F2n57lAuta6UCk1BPhIKdVXa11c941KqZuAmwDS09P9bIYQQghnPvfclVIW4FJgfvUyrXWF1rrQ8XgDsBvo5er9Wuu5WuuhWuuhqakuU0ZCCCF85E/P/Vxgh9Y6p3qBUioVKNJa25RS3YGeQJYvG6+qqiInJ4fy8nI/mihcSUxMpEuXLsTFxYW7KUKIIGk0uCul3gXOBFKUUjnAg1rrV4ArqJ2SARgDPKyUqgLswFStdZEvDcvJySE5OZmMjAyM87YiELTWFBYWkpOTQ7du3cLdHCFEkHhSLTPZzfJrXSx7H3jf/2ZBeXm5BPYgUErRrl07CgoKwt0UIUQQRfQVqhLYg0O+VyGCpCwPloyBBS2N+7K8sDUlooO7EEJEldUT4dC3YC0x7ldPDFtTJLg34ODBg1xxxRWcfPLJDBkyhHHjxrFz584G35ORkcGhQ4fqLZ8zZw5vvvmmi3e4ZjabyczMrLllZ2czatQoALKzs5k3b553OyOECL7Dm0FbjcfaajwPE3/r3GOW1poJEyZwzTXX8N577wHwww8/kJeXR69eLqs7GzR16lSv1k9KSmLz5s21lq1ZswY4EdynTJnidTuEEEHUJtPosWsrKIvxPEyk5+7G8uXLiYuLqxWUBw4cyBlnnMHXX3/N+PHja5ZPmzaN119/veb5o48+Sv/+/Rk2bBi7du0CYMaMGTz++OMA7Nq1i3PPPZeBAwcyePBgdu/e7VGbWrRoAcD06dNZtWoVmZmZzJ49299dFUIEyuiFkDISLMnG/eiFYWtKVPTcH/r0R376td5Frn7p06klD17U1+3r27ZtY8iQIT5tu1WrVmzdupU333yTO++8k88++6zW61deeSXTp09nwoQJlJeXY7fb622jrKyMzMxMALp168aHH35Y89qsWbN4/PHH621XCBFmSWlw3spwtwKIkuAebSZPnlxzf9ddd9V6raSkhAMHDjBhwgTAuKDIFVdpGSGE8FRUBPeGetjB0rdvXxYtWuTyNYvFUqu3XfcqWudSQyk7FEKEg+Tc3Tj77LOpqKhg7ty5Ncu2bNnCqlWr6Nq1Kz/99BMVFRUcOXKEZcuW1Xrv/Pnza+5HjhxZ67Xk5GS6dOnCRx99BEBFRQWlpaVetS05OZmSkhIf9koI0VRIcHdDKcWHH37I0qVLOfnkk+nbty/33XcfHTp04KSTTmLSpEn069ePSZMmMWjQoFrvPXz4MAMGDODpp592ecLzrbfe4plnnmHAgAGMGjWKgwcPetW2AQMGYDabGThwoJxQFUK4pLTW4W4DQ4cO1XUn69i+fTu9e/cOU4tin3y/QkQ/pdQGrfVQV69Jz10IIWKQBHchhIhBEtyFECIGSXAXQogYJMFdCCFikAR3IYSIQRLc3SgsLKwZbrdDhw507ty55nllZWVAPqOqqorp06fTs2dPBg8ezMiRI/nvf//b4HuuvfZal1fOrl+/nttvvz0g7RJCRL+oGH4gHNq1a1cztsuMGTNo0aIF99xzT83rVqsVi8W/r++BBx4gNzeXbdu2kZCQQF5eHitWrPBpW0OHDmXoUJflrkKIJkh67l649tprmTp1KsOHD+cvf/lLrWF8Afr160d2djYAb7/9NsOGDSMzM5Obb74Zm81Wa1ulpaW8/PLLPPvssyQkJACQlpbGpEmTgBPD+wIsWrSIa6+9tub50qVLGTp0KL169aoZGdJ5GOJjx45x3XXX0b9/fwYMGMD77wdkWlshRBRptOuplHoVGA/ka637OZbNAG4EqmdZvl9rvdjx2n3A9YANuF1r/YXfrbzzTgj0CImZmfDUU16/LScnhzVr1mA2m5kxY4bLdbZv3878+fP55ptviIuL49Zbb+Wdd97h6quvrlln165dpKen07JlS6/bkJ2dzbp169i9ezdnnXVWzZjx1R555JGaYYfBGA5BCNG0eJJXeB14Dqg7R9xsrfXjzguUUn2AK4C+QCdgqVKql9baRoyYOHEiZrO5wXWWLVvGhg0bOO200wBjbPb27dsHrA2TJk3CZDLRs2dPunfvzo4dO2q9vnTp0prZowDatGkTsM8WQkSHRoO71nqlUirDw+1dDLynta4A9iildgHDgG99byI+9bCDpXnz5jWP3Q39q7Xmmmuu4V//+pfb7fTo0YN9+/ZRXFzssvfuPFRwQ0MKu3ouhBD+5NynKaW2KKVeVUpVdw07A/ud1slxLItJGRkZbNy4EYCNGzeyZ88eAM455xwWLVpEfn4+AEVFRezdu7fWe5s1a8b111/PHXfcUVN9U1BQwMKFxrRcaWlpbN++HbvdXmsWJoCFCxdit9vZvXs3WVlZnHLKKbVeP++883j++edrnktaRoimx9fg/iJwMpAJ5AJPeLsBpdRNSqn1Sqn1BQUFjb8hAl122WUUFRXRt29fnnvuuZqJs/v06cPMmTM5//zzGTBgAOeddx65ubn13j9z5kxSU1Pp06cP/fr1Y/z48TW9+FmzZjF+/HhGjRpFx44da70vPT2dYcOGceGFFzJnzpx6szn97W9/4/Dhw/Tr14+BAweyfPnyIH0DQohI5dGQv460zGfVJ1TdveY4mYrW+l+O174AZmitG0zLyJC/oSffrxDRL+BD/iqlnLuSE4BtjsefAFcopRKUUt2AnsA6Xz5DCCGE7zwphXwXOBNIUUrlAA8CZyqlMgENZAM3A2itf1RKLQB+AqzAbbFUKSOEENHCk2qZyS4Wv9LA+v8A/uFPo4QQIuaV5cHqiXB4M7TJhNELISktYJuXK1SFEMJbZXmwZAwsaGncl+V5v43VE+HQt2AtMe5XTwxoEyW4CyGEtwIRmA9vBm01Hmur8TyAJLgLIYQzT3rlgQjMbTJBOTLjymI8DyAJ7g0wm81kZmbSt29fBg4cyBNPPFHrilRXsrOzmTdvXohaKIQIOE965YEIzKMXQspIsCQb96MX+tPqemTI3wYkJSXVDPubn5/PlClTKC4u5qGHHnL7nurgPmXKlBC1UggRUJ70ykcvrH8y1FtJaXDeSt/b2QjpuXuoffv2zJ07l+eeew6tNdnZ2ZxxxhkMHjyYwYMHs2bNGgCmT5/OqlWryMzMZPbs2W7XE0JEKE965dWBeVKxcR/AKpdAiZ2ee5DLigC6d++OzWYjPz+f9u3bs2TJEhITE/nll1+YPHky69evZ9asWTz++OM146yXlpa6XE8IEaEC0SuPALET3KvzZNp6Ik8WxJ88VVVVTJs2jc2bN2M2m9m5c6df6wkhIkSQ0yWhEjvBPchlRQBZWVmYzWbat2/PQw89RFpaGj/88AN2u73e4F3VZs+e7dF6QggRSLGTcw9yWVFBQQFTp05l2rRpKKU4evQoHTt2xGQy8dZbb9VMo5ecnExJSUnN+9ytJ4QQwRQ7wT0IZUVlZWU1pZDnnnsu559/Pg8++CAAt956K2+88QYDBw5kx44dNZN4DBgwALPZzMCBA5k9e7bb9YQQIpg8GvI32GTI39CT71eI6BfwIX+FEEJENgnuQggRgyI6uEdCyigWyfcqROyL2OCemJhIYWGhBKIA01pTWFgoJZlCxLiIrXPv0qULOTk5ROvk2ZEsMTGRLl26hLsZQoggitjgHhcXR7du3cLdDCGEiEoRm5YRQgjhOwnuQggRgyS4CyFEDGo0uCulXlVK5Sultjkte0wptUMptUUp9aFSqrVjeYZSqkwptdlxmxPEtgshhHDDk57768DYOsuWAP201gOAncB9Tq/t1lpnOm5TA9NMIYQQ3mg0uGutVwJFdZZ9qXX1+LqsBaSuTgghIkggcu5/BP7r9LybUmqTUmqFUuoMd29SSt2klFqvlFovtexCCBFYfgV3pdRfASvwjmNRLpCutR4E3A3MU0q1dPVerfVcrfVQrfXQ1NRUf5ohhBCiDp+Du1LqWmA8cKV2jBGgta7QWhc6Hm8AdgO9AtBOIYQQXvApuCulxgJ/AX6ntS51Wp6qlDI7HncHegJZgWioEEIIzzU6/IBS6l3gTCBFKZUDPIhRHZMALFFKAax1VMaMAR5WSlUBdmCq1rrI5YaFEEIETaPBXWs92cXiV9ys+z7wvr+NEkKIoCnLg9UT4fBmY67l0QshKS16P8cNuUJVCNG0rJ4Ih74Fa4lxv3pidH+OGxLchRBNy+HNUH2ZjrYaz6P5c9yQ4C6EaFraZIJyZKSVxXgezZ/jhgR3IUTTMnohpIwES7JxP3phdH+OGxE7WYcQQgRFUhqctzJ2PscN6bkLIUQMkuAuhBAxSIK7EELEIAnuQggRgyS4CyFEDJLgLoQQMUiCuxBCxCAJ7kKIpqssD5aMgQUtjfuyvHC3KGAkuAshmq4wD+4VTBLchRCxraHeeZgH9womCe5CiNjWUO88zIN7BZMEdyFEbGuodx7mwb2CSQYOE0LEtjaZRo9dW+v3zsM8uFcwSc9dCBHbYrh33hDpuQshYlsM984b4lHPXSn1qlIqXym1zWlZW6XUEqXUL477No7lSin1jFJql1Jqi1JqcLAaL4QQwjVP0zKvA2PrLJsOLNNa9wSWOZ4DXAj0dNxuAl70v5lCCCG84VFw11qvBIrqLL4YeMPx+A3gEqflb2rDWqC1UqpjANoqhBDCQ/6cUE3TWuc6Hh8E0hyPOwP7ndbLcSyrRSl1k1JqvVJqfUFBgR/NEEIIUVdAqmW01hrQXr5nrtZ6qNZ6aGpqaiCaIYQQwsGf4J5XnW5x3Oc7lh8ATnJar4tjmRBCiBDxJ7h/AlzjeHwN8LHT8qsdVTMjgKNO6RshhBAh4FGdu1LqXeBMIEUplQM8CMwCFiilrgf2ApMcqy8GxgG7gFLgugC3WQghRCM8Cu5a68luXjrHxboauM2fRgkhhPCPDD8ghBDh8uyz8OWXQdm0BHchhAiHuXPh9tvhjTcaX9cHEtyFECLU3n4bpk6FcePgtdeC8hES3IUQ4RPDc5i69f77cM01cNZZsGgRxMcH5WMkuAshwieG5zB1afFimDwZRoyAjz+GpKSgfZQEdyFE+ETTHKb+/spYtgwuvRT69zeCfIsWwWmngwR3IUT4RNMcpv78yvjqK7joIujZE774Alq1Cl47HSS4CyHCJ5pmSfL1V8ZXX8H48dC9u9F7T0kJVgtrkZmYhBDhE02zJDU0F6s7X399IrB/9RW0bx/kRp4gPXchROSJxCoab39lrFgBv/0tdOsW8sAO0nMXQkSi6vy2tp7Ib4e7h+/Nr4wVK4wa9q5dwxLYQXruQohQ86RXHi1VNK72ZeVKI7CnpxuBPS2t8e0EgQR3IUTwOQfBT3s1XnUSLVU0dStoXjz/RGBfvhw6dKj/nhClnCS4CyECy1Xwcg6C1uLGe+XRUkXj/AvjRyvcvwW6dDF67K4CO9T6LqoK1lG+wt2gu/6RnLsQIrBc5cudg6Azd73yaKmiqa6g2WSFp4BOzYwee8eO7t/j+C72VHTizn1/ol/zffxjbOCbJj13IURgucqXO6dZMIOlZeT3yj0xeiFs7wlPAl2bw6rvGw7sgG6dybyicYzb+QzZlZ0Y1eF4UJomPXchRGC5qgcfvfBED776eVJ4TjQG1KIv4R8/w6nJcI+GHVMhxf2+HTpWwfScf7I05yijk7fy+ICVdDg3OKNCKmPipPAaOnSoXr9+fbibIYQIhOoce6wF8rpeegluuQUGtIQ7jkGCzTiYpYx0mVJatj2Pe9/fQnG5lXvHnsp1ozIwmZRfTVBKbdBaD3X1mvTchRCBFS35cn/Mng13321UxkxeCSabsdzFCeLSSiszP9/OvO/2cWqHZN65YQSndEgOehMluAshhKe0hpkz4e9/h8svh3fegRXnuh2WYPP+I9w1fzPZhce5aUx3/nR+LxIs5pA01efgrpQ6BZjvtKg78HegNXAjUOBYfr/WerGvnyOEiALVqZiijaDMgB3aDIqtlIzWcO+98NhjcPXV8MorYLG4PJ9QabXzzLJfeOHrXXRomcg7Nwxn1MmhGTCsWkBy7kopM3AAGA5cBxzTWj/u6fsl5y5ElFsy5kTvtYYZLM0BHf2596oquPFGY77TW26B554Dk+tiw+25xdy94Ae25xZz+ZAu/P2iPrRMjAtKs0KRcz8H2K213quUfycIhBBRyGUdu824YAkiZ3wYXxw/DpMmGRNsPPQQPPAAuIhzVpuduauymL1kJ62S4nn56qGc1yd8B7NABfcrgHednk9TSl0NrAf+pLU+HKDPEUJEIufyR1cieXyYhhQWGkP2rlsHc+bAzTe7XC2r4Bh/WvgDm/YdYVz/Dsy8pD9tmwdnblRP+X0Rk1IqHvgdUH0lwovAyUAmkAs84eZ9Nyml1iul1hcUFLhaRQgRLaqHCzA3d1yg1MK4j4bxYdzZtw9Gj4ZNm4yJrF0Edrtd89o3exj3zCqyCo7zzORBPD9lcNgDOwSm534hsFFrnQdQfQ+glHoZ+MzVm7TWc4G5YOTcA9AOIUS4uCp/dFXvHi22bYOxY+HYMfjySxgzpt4qOYdL+fPCLXybVchZp6Qy67IBpLVMDENjXQtEcJ+MU0pGKdVRa53reDoB2BaAzxBCRJtorXdfvdqY7zQpyRi+d8CAWi9rrVm4PoeHP/sJrTX/vqw/k4aeRKSdb/QruCulmgPnAc6/Vx5VSmUCGsiu85oQQkSuDz+EKVOMIXu/+AIyMmq9fOBIGfd9sJWVOwsY0b0tj10+kJPaNgtPWxvhV3DXWh8H2tVZ9ge/WiSEEKHgnDZqPRA2ngP3PwzDhsGnn0Jqas2qdrtm3rp9/GvxdjTw0O/68ocRXf0ePiCY5ApVIUTTVDOuuhUe/QaWrYaJE41a9qSkmtX2Fh5n+vtb+TarkNE9UvjXpf0jtrfuTIK7ECJ2eDNo2eHNcNwKzwJbNFwcD++9V3Nxks2ueX1NNo99sYM4k8m73Lq7doRwUDUZz10IEbm8nZKu7rR3rqbwq1Z1KjyMUfJxowluG14T2HflH2PinDU88tlPjDo5hS/vHsPvT0v3/KSpu3Z40z4/Sc9dCBG5XM3q1FAFjqcTa2/YAH/aCyVmuC8efjMURi+sucr0qaW/0CzezFO/z+TizE7eV8K4a0cIJ/6W4C6ECC5/UhHeBkNXE4XU9fHHRkVMaios+wH69gWMMWH+smgNWw8c5cJ+HXj44n6kJid41k5P2+FJ+wJE0jJCiODyJxXhPD2fJ8GwoYm1tYZ//hMmTDAC+tq10Lcv5VU2Hv3fDi56djW5R8t44crBvHjVEN8De0PtCOHE3zITkxAiuBa0NAJ7NUsyTCr27L2BOgF5/Dj88Y+wYAFMngz/+Q80a8Y3uw5x/4db2VtYyuVDuvDXcb1pEwFDB3hKZmISQgSWN0HXk1SEu+0F4irX7Gy45BLYsgUefRTuuYei0ipmLtjMBxsPkNGuGfNuGM6oHqEdbz3YJLgLIbznzYlOV5Nj+7M9b3z9tVG7XlUFn3+OHjuWDzYeYObnP1FSbmXaWT2YdnYPEuNCMztSKElwF0K4565H7c2JTk9634GuItEaXngB7rgDevaEjz8mu21n/vrKd3yzq5DB6a3516UDQjKXabjICVUhhHvuToZ6e6KzMc7bwwwoz2vb66qoMGZNmjYNLryQqm/W8PwBExc8tZIt+4/yyCX9WDR1VEwHdpDgLoRoiLsedaCrPpy3Z2kOtlLfqmv274czzzTmN/3LnWz4QzPGP/Mej33xM2f3bMXSP/0m4seECRRJywgh3HN3MjTQw/k6b29BS99SNF98AVdeCZWVlLw1j0cKs1mw8Vw6xhXwcsY/OK+TBVpG4RDEPpKeuxDCvRDWZdfwNuVjs8GMGXDhhehOnfjklY8ZvbsdH+T24ebU91na6xbOa/ltdE7z5wfpuQsh3AvHhBueVNdUKyiAq66CL7/k8OVXcNPI6/l+QynDu7XlkfZz6FX+aUiuBo1EEtyFEP4J9EiHnh5Qvv0WJk1CFxTw8S1/566Wp9GulBPjwZS/CKsPRec0fwEgwV0I4Z9g1ai7ozU8+U/0vQ9wvHUiN181g29b9eeakRncfX4vWibGGetF6zR/ASLBXQjhnxCOdEhhIdxwA3z0EetP6cP1Y/9Oj7Y5fNrvNfr+blHwPjcKSXAXIlb5mi7x9n2hGunw66+xX3kVOj+PWWf9kfdHnM3fOr3C5W2WYrK2CM5nRjGplhEiVq2eCAVrjHrxglXwaS/PLgjydhTHYFfUVFVhv+9+9Nlns69CcclVj1M2IYOvek9jUtslmEzmJney1BN+99yVUtlACWADrFrroUqptsB8IAPIBiZprQ/7+1lCCC8c3ozxZ+lgLfYsH+4uzRLMwb3cycqi5NJJJP+wgfn9z2PxDffy6MTT6N26DFYvabInSz0RqJ77WVrrTKehJ6cDy7TWPYFljudCiFBy1Zv1JB/urs48hFPEARTOfY2yvgPQO3bw9ykP0GreG7z+f2fTu2PLEweUScXGfZDmIY1mwcq5Xwyc6Xj8BvA1cG+QPksI4ay6h120EWOcFkfv3dN8uLs682CfOHW0u3Tfj+x5uTN9v9vKxi592Prv57h/4piYHLkxmAIR3DXwpVJKAy9precCaVrrXMfrBwE5rAoRKs6liZjB0hLQJwJ1YydM3aVZAnHitIHP1qsmsuazEk5+A04t+ZEvzj+HgfM+YnA7OVnqi0AE99Fa6wNKqfbAEqXUDucXtdbaEfhrUUrdBNwEkJ6eHoBmCCGA2j1sbICuPfPRkjG+1aV7c+WoO25q4jdtzyH3ATvj1m0mp10qO+89iQsGrQMJ7D7zO7hrrQ847vOVUh8Cw4A8pVRHrXWuUqojkO/ifXOBuWBMs+dvO4QQDo31sH1NrwTixGmdz87OzWXRg69w+TMPMOhILjvPSqfHVfswJVmgzUj/PquJ8+uEqlKquVIqufoxcD6wDfgEuMax2jXAx/58jhDCC42VJgZ6LHZvOD77sDWZmXuvZ8kL/bn74Rtpk2im/NOF9LqvK6YWIRykLIb5NUG2Uqo78KHjqQWYp7X+h1KqHbAASAf2YpRCFrnbjkyQLUQIBXosGC+Ul+Tyxvwn+GpNOx7+dA6nHNpH2TV/JOnZpyDZzeQZYWxvpAvaBNla6yxgoIvlhcA5/mxbCBEkYRhzxW7XfLrlV575ZDO//yyLd9fPxt6+PSxeTNKFFzb85lCPXdOYKDnYyPADQoig+nZ3If9cvJ1Wq7/m7WUv0LEwF266CdO//w2tWze+gVCOXeOJSDvYuCHBXQgRFNtzi3n8i5/ZsGkX/1z1GuM2LUH36gUfvAdjxni+oVCNXeMpb6/gDRMZW0YIUV9ZnlEy6cMk1XsLj3PHe5sY9/RKUj59nzVvTuPCrcvhb39D/fCDd4EdQjMblDf7GyFX8DZGeu5CiPp8SD3kFZfzzLJfmP/9froW57F03euc/P1KGDYM/vMf6N/ft7aE4hyBN/sbrit4vSTBXQhRnxeB6khpJS+u2M0ba7Ixl5czN2cpZ330KspshqefhttuA3OEDx3gTWAO5hW8ASTBXQhRnweB6niFlde+2cNLK7M4VmHlPtsurlv4FHF7s+GKK+Dxx6Fz51C33BCOMekDcQVvAElwFyLaBeNEXgOBqqzSxttr9/LSyt0cOlbJFe2q+Nual2ix5H/Quzd89RWcdZZ/n+8vb9NKgQjMETatnwR3IaKdP6V5XozRXl5lBPU5K7I4dKyCs9Jb8I9DS+n0wNMQF2f01G+/3Xgcbt7mvyMsMAeCBHchop0/J/I8ODCUV9mY990+Xlyxm4KSCkZ1b8t7rfbS47GZkJ0NkyfDY4+FLwXjSoTlv8NBgrsQ0c6fQNbAgaG8ysb87/fz/PJd5JdUMKJ7W147xUq/J+6GtWth4MDISMG4EmH573CQ4C5EOAUiX+5PIHNxYCivsrFw/X6eX76bg8XlDMtoy4unt2HInMdg/nzo2BFeeQWuuSZyq2BiMM3iLb8GDgsUGThMNFnOY6sri3GRTiiDktPB5XjyabwT/yQvry2goKSC0zLacM/wDgx7dw7q6aeNQP7nPxu3FjLOeiQI2sBhQggvOE9/p8yAHWxloB3T4IXjwpekNI6evozX12Tz2po9HCnN4fQe7XhmQm9GLH0fdf4jcOiQ0UufORO6dAlt+8ItwoYU8IYEdyFCpdb0dy6E+MRfQUkFr6zew9tr93Kswsq5vdtz6xkZDF7xGVz4e9i3D84806iCGTIkZO2KKFEySJgrEtyFCJVa0985M4GlechO/B04UsbcFbt57/v9VNrs/LZ/R277TXd6r1kC4/4AP/8MQ4caQwacey4oFfQ2RawIG1LAGxLchQgV55OX1UKYZ99xsJiXV+7hkx8OoDVMGNSZW37Tne4bVsNFN8CmTdCnD3zwAVxySdMO6tWiuKRSgrsQoVJd1eKcc28zqH5vPYB5Xq01a3YXMndlFit2FpAUZ+bK4V25YXQGXTZ+C5dNg9WroVs3ePNNmDIlcitgwiGKSyoluAsRKp6W5wUgz2u12fl8ay4vr8pi24FiUlokcM/5vbhqeDqtv14Kv73BqFXv1AleeAGuvx7i433csRgWxSWVEtyFiDR+5HmPV1h57/v9vLp6DweOlNE9tTmzLu3PJQM7krj4MxhzBWzcCF27wosvwnXXQUKC522LxOqRSGxTBJDgLkSk8SHPm3O4lLfW7uXd7/ZRXG5lWEZbHvpdX87u2Q7TB+/D9TNh2zbo0QNefRWuusq3MWAisXokEtsUAXwO7kqpk4A3gTRAA3O11k8rpWYANwIFjlXv11ov9rehQkS0QPYePczzaq1Zt6eI177J5sufDqKU4oK+adx4RncGpSYaOfQJT8LOncZojW+/Db//PVj86NNFYvVIJLYpAvjTc7cCf9Jab1RKJQMblFJLHK/N1lo/7n/zhIgSgew9NpLnLa+y8cnmX3ltTTbbc4tp3SyOm39zMleN6ErnqmPwwjPw3HPGxUdDh8LChXDppWAKwKya4awecXcAjeKKlmDyObhrrXOBXMfjEqXUdiCChoUTIoRC0HvMPVrG22v38u66/RQdr+TUDslGPn1QZxL37Ib77obXX4fycrjoIrjnHjjjjMCWNIazesTdATSKK1qCKSA5d6VUBjAI+A44HZimlLoaWI/Ruz8ciM8RImIFqfdot2u+zSrkne/28sWPeWitObd3Gted3o0R3dqgVq6ESXfAxx8b1S5XXw133w2nnhqQz68nnNUj7g6gUVzREkx+B3elVAvgfeBOrXWxUupF4BGMPPwjwBPAH1287ybgJoD09HR/myFEaLhLDQS493j4eCWLNuQwb90+9hw6TutmcVw/uht/GNGVk+Js8NZbRgnjjz9C27bwt78Zc5WmxXCViKRfvOLXqJBKqTjgM+ALrfWTLl7PAD7TWvdraDsyKqSIGt6M4ujlSVatNRv2Huad7/bx+dZcKq12hnZtw5Uj0rmwX0cSd+00Avobb0BJiTHey223GfOVJiUFZXcjipQ81tPQqJA+B3ellALeAIq01nc6Le/oyMejlLoLGK61vqKhbUlwF1FjQUuwltRelnqG60Dj4YGguLyKjzYd4J21+/g5r4TkBAsTBndmyvB0Tm2XBJ9+Cs8/b0yMER9vVLzcdhv07wrfTJJgVy1YwT+CDyrBCu6jgVXAVsDuWHw/MBnIxEjLZAM3Vwd7dyS4i7Dx9g/XOWBXcxe46x4ILMkwqRgwculrswpZuCGH/27LpbzKTv/OrbhqRDoXDexEsz27jQkx3nwT8vIgPR2mTjWuJG3fvn5bwjEWfKQJ1vcRwd9zUMZz11qvBlydhpeadhE9vC1hrM6tF6w6scxddYyLHHHO4VIWbchh0YYccg6XkZxo4bLBXfj9aScxoE0cLFgAd70C33xjjPEyfrwR0C+8sH59utR31xas7yNKv2e5QlU0bd7+4VZXZtTtzbk6uec4EJQX/sgXVZezIOtK1ny1HK3h9B7t+PMFp3BBnzQSN3wPD/8F3nsXSo5BRwXXnwTnpID5K0gsgqphYEmr/UsDZXy2nGA0BOuEa5SeyJXgLpo2T/5wXaVuGqmOsds16w/G8dGx5/l0x6+UlFvp0sbKHef05LLBXTgpfx+8MwcumwdZWdCsGYxOhhFl0MsGaj/o/calggVr4NNeGJlOBbZSxwHJbIwDj268QieC88YBE6x69yito5c5VEXT4SrAQeNBz4uc688HS/jo+518suFnDpS3ItFUxdi+aUwa3pMRSZWYFsw3hgHYuNG4YvTss+HKK40rSP/Xpf7J2sY45fEbFIl546ZwwAkymUNVCHCfX28syDWSuvn1SBmf/PArH206wI6DJZiVndEtdnFP6nLOV9/TfEMneL2rUe1itxsljE8+aZQwdux4YkOuJvNoiDcpgkjMG/syZIOvB4QmeCCR4C6aDl8DnIvUTdHxSv637SAfbz7AuuwitIZB6a156Hd9Gb9xJO02HITvgZ8A/QucbIe//tXopZ9yiuvPcf7536qPsezoT/icimlkH8LOl38PX8fw8eR9zgcA5+8/Sg8GEtxF9PKmN1aWR+3iLrPxfEHLxt/rCLqH8rP4omICi7Mmsnb5Umx2TffU5tx1bi8uTbXTZfn/4N7p8M1BIz3eCbhYwQWZcPOGxsd4cXUZfVkerLwYCr83Zm9qOxTGfOx9oInEvLEvBxxfD9CevM/5AFD43YnlgRhGOAy/HCS4i+jlTS9u9USwHq+9rLo37HzCss4fXn5xOf/7sYzFe/7Nuj1F2DV0S7Ez9YwMLrUdpPvapah7PofNm41t9u8Pf/0zdF0GLX85sT1fB+9aPRGKNmBcSmIBU7zRNm+DRSSOv+LLAcfXXyCevM/dBOaBSGOFYcx5Ce4iennTizu8GbA5LbAZvevqx1bHSclD35Kz5HqWtHuW/249yPd7jZRLj/YtuGtERyYUbqfzqkWoxxZDfr5xUnTUKJg1CyZMgF69QrOPgQ4WvvQs/e2N+nLA8fUXiCfvc3fOIxBprDCc85DgLqJXY72xhmrCzc1qeu52rdhS1pOlxcNYWjycHeXdgJ/o3b45M7taueDAFlL+uxJWroTKSmjVyrioaPx4GDsW2rVrvK11A+HQF2D9rY0HRnf7GOhg4cvBIhwzIPn6C8ST97k75xGINFYYznlIKaSIPtWBsmijkYfGDm0G1Q+QtYYKqH0ismzgc6xe+hTLDrRh2dFBFFjbYMLGebZvmXxgCUMOHCR5ezkUFBrb6tsXLrjAGCf99NO9n6Kubimi08GlwdJEd73juttrO8RI2fjai25gqAS3bWjoPaK2IOXcpRRSxBbnHmNDgbFWDtXG3opUVvZcxtc78lm94gAV1svoVnmUqZW7OevnWXT9aTvmXx3DJLUEBsTBP56GcZdB5wbmofHkD7duT9vqFAQb6nm763HWTTPYK/3rRTfUs3TXQ4/ECpxIFYZzHhLcRfh526tpLCXh2F5JhZ1vjw1n1bFBrCwZwt7KjnRe8xVji3ZyW9FOeu/aTFJ2lvGe5s3hZAVnAv2AkwBTFaQugs63N9x+T9ITdQNh3Z67t4GxbrBY0NK/NE1DOWl333ckVuA0pgnVu0twF+HnTe62bkmjU2C02zXbfj3KysVPsjJvPFuK7+DkghyGHdzGrIKX6H/gAC3yHAOUtmljTEE37VYYMwYGDYLlZ9ceEAw8C5Ke5L/rBkJXOXd/+NuLbqhn6W7bkViB05hwnCcIEwnuIvzqBseCVfCuxXVNt1NJo02b2F7Zm7XmZ/nuje85sGk73ff8SOavPzMjbws9c/cRZ3VUyKSlGUF8zBgY1hcO/x2OLoc2h6HfVcaIi6MXGiWR1SkTT4OkJ4HVVSAMZFAJZi86Gnvo7kTilbpBIidUReA19tO37uv2SqOW21WNceoZNUHQZtdsf3Mga49045cD6ZRlJ9It91f6H/yFIQd/oc3xIwDoeBMqww4nAz1McNoQuOq7E7XmDY2z4unJWm/2N1JFa7v9EYlj7PghKJN1BJIE9yjmKkC4O+FZvW7BN9TM7+Jc6VEnJXLMlsSWY/3ZZ7qf0nUbiPtxKz1/3UXv/D20qjB671qBtecpxI0cAcOHG7ce7eG7Ke6DlidVHjEWBFxqCvtYV4wd0KRaRgSPqxxmYxfe1Ezc5Xj96E/oi/LIeWkcOT8conR/InG5NtLyizitaAOj7JcAUBln4VjnZlhOV9A9AfqfipryAXEp3eu3q6Eg5e3VitpqHJDK8rwPBJEcTKI9ReHLdxuN5wl8JD134X7AJHcXcjj/QR3eBNZjJ7ZlSa4fPKt7hPOT4dAx9EEo+rUlR/e3wH7ARIu8ClKLCjFrI+jbURS0bcPxzm2wDDuXlNQ1NGu3FToAJsfnOKVr/Nrfhob5rXty1ZfP9KR3HK4DQKBr5UOtKf7yqEPSMqJhruYFdUWZwdzccULT5mIFM+hmcMgK+QrybNiPpFJa0htb1j6S9mURX1lVs3alyUJ2204c7NyNyl6n0mxgPzqPHMxJwzMxNW/mlMZZVf+j6qZSAh0gy/Lgo86gnfbT3BzaDm74M+q2w9XBL1JSQA2d+4iGYBktF1EF8eAtaRnhXlkeHFpTO4i5Y7NBUTEcAoqAwhM3XQi2Qo3laO3JJiot+fzaysTeNh3IyfwtlWlJxLcvI6VHIl0zSunFanq1s8Poh+qfdHWuXKmrbirFXYmbr39YSWmQMqp20FXmxsvo6rbD3KzxqfDClR4JdK18qEXLRVRhKr+M6uCee7SMmZ9vp3tKc7o5bt1TWtCqmZeXhkc6TwOUc6VH9RjgSp0oKYT6r2s7lAHFwBHgqNPtSJ3lR6jXYa+IjyOvZVv2JnfgQNc0cpNT+LVlKsdTEonrqEnpkkgfy3r6tTdxVrODWEp+rN9LLFhl9JJTRp3Yt9UTXQf26mFv65bjuSqnXDKm9ud4+4dVtwTw8KbGg1/ddmib0QP2dMCqYAapxv4fRUuwrBYtJZphOngHLS2jlBoLPI0xcPZ/tNaz3K3ra1pma85R/u/djew/XIbNfmI/2jaPrwn2Ge2a0blNEp1bG/cdWiZiNvk4/KovGhowqjqnfWTbibK7Vn2NZc4578LvOXES0gzmpPqB22aDRadCSYkRrI853Y4DxxSUWqDECsf0iddKgMr6zdYKypPjKWnRnMLmrTiY1I6sFp3Z06ILB1qm1gTx5BbH6JmUQ8+E/fRM3E/PxGx6JOwn2VJl9FpdpXCUBdD1fy04pwLq/uQG9zlvd718V5/jz093T9InvqRYvD14+/rzvrG2RfLJ32gWxLRbyHPuSikzsBM4D8jBmJNmstb6J1fr+5xzd0xkUFmwif2VaeyxZrCnLJWsik7sqezCnvKO5Flrj9hnwUqHuEI6x+fTOaGIjpY8Ui2HaR9/jFRzPu0th0lNKKMZRx1vaGb0bjEZARXAnAi2cg8f242hZW2OW6XjVuX0uKFl1bcyoNxx7/y4+r6i4a9Km0G3UFibmSlvFs/xpCSONGtBUWJrfm2Wwv6kNHYndiErsTP5zdtxOCkZu8mMCTudE4/S1bKX9Phcusbn0jUhl67xeaQnHaG5xWrsI6bagdzS0ljunG+uxQTKVD/PXx18l4wxxll33t5FO10Hm7rruvscf/+wPBnZEYIXIP09ORstOepYE6ace7CC+0hghtb6Asfz+wC01v9ytb7Pwf3NYfD69yfG5dZON8dzq91EmS2BUnsiZbYEym0JlNlP3FfZLaCNC9qVNt5s0po4rMSrKuKoIh4rcVhJ0FXE26uIs1cRZ7dhsVsx2+2YbHbMdjvKpjHZNMquwQrKhhH3PEhnN0RbgCSwJyrsiSZsSSaqEixUJMZRnpBAeXwCx+OTOJaQRHF8c47EJZOf2Jbc+BT2x7dnX1xHDphTsav6WbhW5hI6xBUat/hiOljy6GjJp2N8EV07dKTz+I+IM5saDyyuAkebTNcnQ2vVttepea9bE+/JH4SrXn7dzwlXsA0kf+vzpbok5oTjhGpnYL/T8xxgeJ1G3QTcBJCenu7bpxz8ETZVb9Dp5vTcouwkqzKSKTtRRue0jlZgw4QVM1YsVGGmCovxWFuwKrNxj5njpiQqVDxWk5mqeAs2k5kqkxmryYLVZDLuzWaqTBZsJhN2swm7WaFNCrvjeVWcGWuchao4MxWWeMotCZTHxVNujjeex8VTZknkuDmRYnMLis3NKVeJHn8lFqy0NB+nreUobS0ltDUf4QzLZtpZjhrLzEdJjTtCh4QyOphzaGaurJ+TrwmEL4PZ8aU1lt90la+tezk/GOmnlJEngqyrIA7e1SPXmmTBxRyjwUothDqX6kt9vnOboiVHLQIiWD33y4GxWusbHM//AAzXWk9ztb7PPXdXtchBZtMmSmzNOGJLptjW3PhFYE+k1G78Oii1J1FqT6DMnkiltmDVFqzabBw8tIUqbXYsM2FCY1IaE3YUCqXsjscas7KRaKokQVWSoKpINFWRYKoiQZWToCppYS4j2VRKC3MpyebjJJtKSTaXkmCyoVJH1Q6edcdLCUaPzV1POxR53EipEw92T9jT+nzpnTcZsZuWcZ48GLzMhXv42N+cu1LQeiCY4tyfOHWVr617AZG7/G7N5MnK/eTJcqIsOCLxe43ENomgCUdwt2CcUD0HOIBxQnWK1vpHV+vLRUxCCOG9kOfctdZWpdQ04AuMUshX3QV2IYQQgRe0i5i01ouBxcHavhBCCPdMja8ihBAi2khwF0KIGCTBXQghYpAEdyGEiEES3IUQIgZFxGQdSqkCYG8jq6VgjCTeVDXl/Zd9b7qa8v57su9dtdaprl6IiODuCaXUenfF+k1BU95/2femue/QtPff332XtIwQQsQgCe5CCBGDoim4zw13A8KsKe+/7HvT1ZT33699j5qcuxBCCM9FU89dCCGEhyIuuCulxiqlflZK7VJKTXfxeoJSar7j9e+UUhlhaGZQeLDvdyulflJKbVFKLVNKdQ1HO4Olsf13Wu8ypZRWSsVMFYUn+66UmuT49/9RKTUv1G0MJg/+76crpZYrpTY5/v+PC0c7A00p9apSKl8ptc3N60op9Yzje9milBrs8ca11hFzwxgeeDfQHYgHfgD61FnnVmCO4/EVwPxwtzuE+34W0Mzx+JZY2XdP99+xXjKwElgLDA13u0P4b98TY1LJNo7n7cPd7hDv/1zgFsfjPkB2uNsdoH0fAwwGtrl5fRzwX4zJQUcA33m67UjruQ8Ddmmts7TWlcB7wMV11rkYeMPxeBFwjlJKEf0a3Xet9XKttWM6KNYCXULcxmDy5N8e4BHg30B5KBsXZJ7s+43A81rrwwBa6/wQtzGYPNl/DbR0PG4F/BrC9gWN1nolUNTAKhcDb2rDWqC1UqqjJ9uOtODuamLtzu7W0VpbgaNAu5C0Lrg82Xdn12Mc0WNFo/vv+El6ktb681A2LAQ8+bfvBfRSSn2jlFqrlBobstYFnyf7PwO4SimVgzFPxP+Fpmlh521cqBG0yTpE8CilrgKGAr8Jd1tCRSllAp4Erg1zU8LFgpGaORPjF9tKpVR/rfWRcDYqhCYDr2utn3DM0fyWUqqf1toe7oZFqkjruR8ATnJ63sWxzOU6jrlaWwGFIWldcHmy7yilzgX+CvxOa10RoraFQmP7nwz0A75WSmVj5B8/iZGTqp782+cAn2itq7TWezDmKO4ZovYFmyf7fz2wAEBr/S2QiDH2SqzzKC64EmnB/Xugp1Kqm1IqHuOE6Sd11vkEuMbx+HLgK+048xDlGt13pdQg4CWMwB5LOVdoZP+11ke11ila6wytdQbGOYffaa1jYWZ1T/7ff4TRa0cplYKRpskKYRuDyZP93wecA6CU6o0R3AtC2srw+AS42lE1MwI4qrXO9eid4T5b7Obs8E6Ms+d/dSx7GOMPGYx/1IXALmAd0D3cbQ7hvi8F8oDNjtsn4W5zKPe/zrpfEyPVMh7+2yuMtNRPwFbginC3OcT73wf4BqOSZjNwfrjbHKD9fhfIBaowfp1dD0wFpjr9uz/v+F62evN/Xq5QFUKIGBRpaRkhhBABIMFdCCFikAR3IYSIQRLchRAiBklwF0KIGCTBXQghYpAEdyGEiEES3IUQIgb9P3RTPrJ4cV2EAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_27_0.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.005000000000000007\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import numpy as np\n",
|
||
"import random\n",
|
||
"from sklearn.linear_model import Ridge\n",
|
||
"from sklearn.preprocessing import PolynomialFeatures\n",
|
||
"from sklearn.pipeline import make_pipeline\n",
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"\n",
|
||
"x=np.linspace(0.02,0.98,200)\n",
|
||
"noise = np.asarray(random.sample((range(200)),200))\n",
|
||
"y=x**3*noise\n",
|
||
"yn=x**3*100\n",
|
||
"poly3 = PolynomialFeatures(degree=3)\n",
|
||
"X = poly3.fit_transform(x[:,np.newaxis])\n",
|
||
"clf3 = LinearRegression()\n",
|
||
"clf3.fit(X,y)\n",
|
||
"\n",
|
||
"Xplot=poly3.fit_transform(x[:,np.newaxis])\n",
|
||
"poly3_plot=plt.plot(x, clf3.predict(Xplot), label='Cubic Fit')\n",
|
||
"plt.plot(x,yn, color='red', label=\"True Cubic\")\n",
|
||
"plt.scatter(x, y, label='Data', color='orange', s=15)\n",
|
||
"plt.legend()\n",
|
||
"plt.show()\n",
|
||
"\n",
|
||
"def error(a):\n",
|
||
" for i in y:\n",
|
||
" err=(y-yn)/yn\n",
|
||
" return abs(np.sum(err))/len(err)\n",
|
||
"\n",
|
||
"print (error(y))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let us now dive into nuclear physics and remind ourselves briefly about some basic features about binding\n",
|
||
"energies. A basic quantity which can be measured for the ground\n",
|
||
"states of nuclei is the atomic mass $M(N, Z)$ of the neutral atom with\n",
|
||
"atomic mass number $A$ and charge $Z$. The number of neutrons is $N$. There are indeed several sophisticated experiments worldwide which allow us to measure this quantity to high precision (parts per million even). \n",
|
||
"\n",
|
||
"Atomic masses are usually tabulated in terms of the mass excess defined by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\Delta M(N, Z) = M(N, Z) - uA,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $u$ is the Atomic Mass Unit"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"u = M(^{12}\\mathrm{C})/12 = 931.4940954(57) \\hspace{0.1cm} \\mathrm{MeV}/c^2.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The nucleon masses are"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"m_p = 1.00727646693(9)u,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"m_n = 939.56536(8)\\hspace{0.1cm} \\mathrm{MeV}/c^2 = 1.0086649156(6)u.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In the [2016 mass evaluation of by W.J.Huang, G.Audi, M.Wang, F.G.Kondev, S.Naimi and X.Xu](http://nuclearmasses.org/resources_folder/Wang_2017_Chinese_Phys_C_41_030003.pdf)\n",
|
||
"there are data on masses and decays of 3437 nuclei.\n",
|
||
"\n",
|
||
"The nuclear binding energy is defined as the energy required to break\n",
|
||
"up a given nucleus into its constituent parts of $N$ neutrons and $Z$\n",
|
||
"protons. In terms of the atomic masses $M(N, Z)$ the binding energy is\n",
|
||
"defined by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(N, Z) = ZM_H c^2 + Nm_n c^2 - M(N, Z)c^2 ,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $M_H$ is the mass of the hydrogen atom and $m_n$ is the mass of the neutron.\n",
|
||
"In terms of the mass excess the binding energy is given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(N, Z) = Z\\Delta_H c^2 + N\\Delta_n c^2 -\\Delta(N, Z)c^2 ,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\Delta_H c^2 = 7.2890$ MeV and $\\Delta_n c^2 = 8.0713$ MeV.\n",
|
||
"\n",
|
||
"\n",
|
||
"A popular and physically intuitive model which can be used to parametrize \n",
|
||
"the experimental binding energies as function of $A$, is the so-called \n",
|
||
"**liquid drop model**. The ansatz is based on the following expression"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(N,Z) = a_1A-a_2A^{2/3}-a_3\\frac{Z^2}{A^{1/3}}-a_4\\frac{(N-Z)^2}{A},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $A$ stands for the number of nucleons and the $a_i$s are parameters which are determined by a fit \n",
|
||
"to the experimental data. \n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"To arrive at the above expression we have assumed that we can make the following assumptions:\n",
|
||
"\n",
|
||
" * There is a volume term $a_1A$ proportional with the number of nucleons (the energy is also an extensive quantity). When an assembly of nucleons of the same size is packed together into the smallest volume, each interior nucleon has a certain number of other nucleons in contact with it. This contribution is proportional to the volume.\n",
|
||
"\n",
|
||
" * There is a surface energy term $a_2A^{2/3}$. The assumption here is that a nucleon at the surface of a nucleus interacts with fewer other nucleons than one in the interior of the nucleus and hence its binding energy is less. This surface energy term takes that into account and is therefore negative and is proportional to the surface area.\n",
|
||
"\n",
|
||
" * There is a Coulomb energy term $a_3\\frac{Z^2}{A^{1/3}}$. The electric repulsion between each pair of protons in a nucleus yields less binding. \n",
|
||
"\n",
|
||
" * There is an asymmetry term $a_4\\frac{(N-Z)^2}{A}$. This term is associated with the Pauli exclusion principle and reflects the fact that the proton-neutron interaction is more attractive on the average than the neutron-neutron and proton-proton interactions.\n",
|
||
"\n",
|
||
"We could also add a so-called pairing term, which is a correction term that\n",
|
||
"arises from the tendency of proton pairs and neutron pairs to\n",
|
||
"occur. An even number of particles is more stable than an odd number. \n",
|
||
"\n",
|
||
"\n",
|
||
"### Organizing our data\n",
|
||
"\n",
|
||
"Let us start with reading and organizing our data. \n",
|
||
"We start with the compilation of masses and binding energies from 2016.\n",
|
||
"After having downloaded this file to our own computer, we are now ready to read the file and start structuring our data.\n",
|
||
"\n",
|
||
"\n",
|
||
"We start with preparing folders for storing our calculations and the data file over masses and binding energies. We import also various modules that we will find useful in order to present various Machine Learning methods. Here we focus mainly on the functionality of **scikit-learn**."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Common imports\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import sklearn.linear_model as skl\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error\n",
|
||
"import os\n",
|
||
"\n",
|
||
"# Where to save the figures and data files\n",
|
||
"PROJECT_ROOT_DIR = \"Results\"\n",
|
||
"FIGURE_ID = \"Results/FigureFiles\"\n",
|
||
"DATA_ID = \"DataFiles/\"\n",
|
||
"\n",
|
||
"if not os.path.exists(PROJECT_ROOT_DIR):\n",
|
||
" os.mkdir(PROJECT_ROOT_DIR)\n",
|
||
"\n",
|
||
"if not os.path.exists(FIGURE_ID):\n",
|
||
" os.makedirs(FIGURE_ID)\n",
|
||
"\n",
|
||
"if not os.path.exists(DATA_ID):\n",
|
||
" os.makedirs(DATA_ID)\n",
|
||
"\n",
|
||
"def image_path(fig_id):\n",
|
||
" return os.path.join(FIGURE_ID, fig_id)\n",
|
||
"\n",
|
||
"def data_path(dat_id):\n",
|
||
" return os.path.join(DATA_ID, dat_id)\n",
|
||
"\n",
|
||
"def save_fig(fig_id):\n",
|
||
" plt.savefig(image_path(fig_id) + \".png\", format='png')\n",
|
||
"\n",
|
||
"infile = open(data_path(\"MassEval2016.dat\"),'r')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Before we proceed, we define also a function for making our plots. You can obviously avoid this and simply set up various **matplotlib** commands every time you need them. You may however find it convenient to collect all such commands in one function and simply call this function."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from pylab import plt, mpl\n",
|
||
"plt.style.use('seaborn')\n",
|
||
"mpl.rcParams['font.family'] = 'serif'\n",
|
||
"\n",
|
||
"def MakePlot(x,y, styles, labels, axlabels):\n",
|
||
" plt.figure(figsize=(10,6))\n",
|
||
" for i in range(len(x)):\n",
|
||
" plt.plot(x[i], y[i], styles[i], label = labels[i])\n",
|
||
" plt.xlabel(axlabels[0])\n",
|
||
" plt.ylabel(axlabels[1])\n",
|
||
" plt.legend(loc=0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Our next step is to read the data on experimental binding energies and\n",
|
||
"reorganize them as functions of the mass number $A$, the number of\n",
|
||
"protons $Z$ and neutrons $N$ using **pandas**. Before we do this it is\n",
|
||
"always useful (unless you have a binary file or other types of compressed\n",
|
||
"data) to actually open the file and simply take a look at it!\n",
|
||
"\n",
|
||
"\n",
|
||
"In particular, the program that outputs the final nuclear masses is written in Fortran with a specific format. It means that we need to figure out the format and which columns contain the data we are interested in. Pandas comes with a function that reads formatted output. After having admired the file, we are now ready to start massaging it with **pandas**. The file begins with some basic format information."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"' \\nThis is taken from the data file of the mass 2016 evaluation. \\nAll files are 3436 lines long with 124 character per line. \\n Headers are 39 lines long. \\n col 1 : Fortran character control: 1 = page feed 0 = line feed \\n format : a1,i3,i5,i5,i5,1x,a3,a4,1x,f13.5,f11.5,f11.3,f9.3,1x,a2,f11.3,f9.3,1x,i3,1x,f12.5,f11.5 \\n These formats are reflected in the pandas widths variable below, see the statement \\n widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1), \\n Pandas has also a variable header, with length 39 in this case. \\n'"
|
||
]
|
||
},
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"\"\"\" \n",
|
||
"This is taken from the data file of the mass 2016 evaluation. \n",
|
||
"All files are 3436 lines long with 124 character per line. \n",
|
||
" Headers are 39 lines long. \n",
|
||
" col 1 : Fortran character control: 1 = page feed 0 = line feed \n",
|
||
" format : a1,i3,i5,i5,i5,1x,a3,a4,1x,f13.5,f11.5,f11.3,f9.3,1x,a2,f11.3,f9.3,1x,i3,1x,f12.5,f11.5 \n",
|
||
" These formats are reflected in the pandas widths variable below, see the statement \n",
|
||
" widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1), \n",
|
||
" Pandas has also a variable header, with length 39 in this case. \n",
|
||
"\"\"\""
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The data we are interested in are in columns 2, 3, 4 and 11, giving us\n",
|
||
"the number of neutrons, protons, mass numbers and binding energies,\n",
|
||
"respectively. We add also for the sake of completeness the element name. The data are in fixed-width formatted lines and we will\n",
|
||
"covert them into the **pandas** DataFrame structure."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Read the experimental data with Pandas\n",
|
||
"Masses = pd.read_fwf(infile, usecols=(2,3,4,6,11),\n",
|
||
" names=('N', 'Z', 'A', 'Element', 'Ebinding'),\n",
|
||
" widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1),\n",
|
||
" header=39,\n",
|
||
" index_col=False)\n",
|
||
"\n",
|
||
"# Extrapolated values are indicated by '#' in place of the decimal place, so\n",
|
||
"# the Ebinding column won't be numeric. Coerce to float and drop these entries.\n",
|
||
"Masses['Ebinding'] = pd.to_numeric(Masses['Ebinding'], errors='coerce')\n",
|
||
"Masses = Masses.dropna()\n",
|
||
"# Convert from keV to MeV.\n",
|
||
"Masses['Ebinding'] /= 1000\n",
|
||
"\n",
|
||
"# Group the DataFrame by nucleon number, A.\n",
|
||
"Masses = Masses.groupby('A')\n",
|
||
"# Find the rows of the grouped DataFrame with the maximum binding energy.\n",
|
||
"Masses = Masses.apply(lambda t: t[t.Ebinding==t.Ebinding.max()])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We have now read in the data, grouped them according to the variables we are interested in. \n",
|
||
"We see how easy it is to reorganize the data using **pandas**. If we\n",
|
||
"were to do these operations in C/C++ or Fortran, we would have had to\n",
|
||
"write various functions/subroutines which perform the above\n",
|
||
"reorganizations for us. Having reorganized the data, we can now start\n",
|
||
"to make some simple fits using both the functionalities in **numpy** and\n",
|
||
"**Scikit-Learn** afterwards. \n",
|
||
"\n",
|
||
"Now we define five variables which contain\n",
|
||
"the number of nucleons $A$, the number of protons $Z$ and the number of neutrons $N$, the element name and finally the energies themselves."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" N Z A Element Ebinding\n",
|
||
"A \n",
|
||
"1 0 0 1 1 H 0.000000\n",
|
||
"2 1 1 1 2 H 1.112283\n",
|
||
"3 2 2 1 3 H 2.827265\n",
|
||
"4 6 2 2 4 He 7.073915\n",
|
||
"5 9 3 2 5 He 5.512132\n",
|
||
"... ... ... ... ... ...\n",
|
||
"264 3304 156 108 264 Hs 7.298375\n",
|
||
"265 3310 157 108 265 Hs 7.296247\n",
|
||
"266 3317 158 108 266 Hs 7.298273\n",
|
||
"269 3338 159 110 269 Ds 7.250154\n",
|
||
"270 3344 160 110 270 Ds 7.253775\n",
|
||
"\n",
|
||
"[267 rows x 5 columns]\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"A = Masses['A']\n",
|
||
"Z = Masses['Z']\n",
|
||
"N = Masses['N']\n",
|
||
"Element = Masses['Element']\n",
|
||
"Energies = Masses['Ebinding']\n",
|
||
"print(Masses)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The next step, and we will define this mathematically later, is to set up the so-called **design matrix**. We will throughout call this matrix $\\boldsymbol{X}$.\n",
|
||
"It has dimensionality $p\\times n$, where $n$ is the number of data points and $p$ are the so-called predictors. In our case here they are given by the number of polynomials in $A$ we wish to include in the fit."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Now we set up the design matrix X\n",
|
||
"X = np.zeros((len(A),5))\n",
|
||
"X[:,0] = 1\n",
|
||
"X[:,1] = A\n",
|
||
"X[:,2] = A**(2.0/3.0)\n",
|
||
"X[:,3] = A**(-1.0/3.0)\n",
|
||
"X[:,4] = A**(-1.0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"With **scikitlearn** we are now ready to use linear regression and fit our data."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"clf = skl.LinearRegression().fit(X, Energies)\n",
|
||
"fity = clf.predict(X)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Pretty simple! \n",
|
||
"Now we can print measures of how our fit is doing, the coefficients from the fits and plot the final fit together with our data."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Mean squared error: 0.04\n",
|
||
"Variance score: 0.95\n",
|
||
"Mean absolute error: 0.05\n",
|
||
"[ 0.00000000e+00 7.06492086e-03 -1.73091052e-01 -1.66020213e+01\n",
|
||
" 1.17385778e+00] 15.212327334149492\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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Svd4sbbyWIEtIiJTTSST6c0tbNP15sBWl7iIiEwtkQzs4E0tbNNdua6er6k8VgtbRESmmkgm05tb2Oz2wBgKWYNlWTha6UxERKaYiAb2m57oDSqrnNVUwtqyFNgiIjK1RDSwxya21edjgHINWpZURESmpEim05iVSY3B6g8ITGWnLm38ISIiU1EkA9vsM+rMKYIpAwmLIG7haMCZiIhMQZFMp31XOosNVbrIvZpKyzqbjk1WsURERA4okoE9kteWZVUCG8glKx3lzfWpySuYiIjIAUQysEda2PGYTWzQEASGwVhlLrYCW0REpqKqLk06VYy0sBuzSeyCR9kL2EMZgOa65CSWTEREZP8i2cIemdblOBbNJADIJXxs26KhNjGZRRMREdmviAZ25dayLBqpDDIrZyyaapM4diSrREREprhIptPINWzbgtpy5apAuQZm6Pq1iIhMUZEM7JEWtm1Z2AMBMdemlIHmel2/FhGRqSmig84qiW15hmAooL4uQd1MiyVz6ya5ZCIiIvsX0cCu3LqDldv6uSmuunDRpJVHRETkYCLZJT5yDdsZqiyW4tRF8u8WEREJkUgG9ui0rkLlsV3rTGJpREREDi6SgT2y94eTG75VYIuIyBQXycAebWHnKl3idjaS1SAiIiESyaQandaVr9w6WbWwRURkaotoYA8vnJIbvlVgi4jIFHfQwP7tb39bjXJUVfCmwNY1bBERmeoOOp/pL//yL3EchyuuuILLL7+clpaWapRrQo0MOlMLW0REwuKgLexf/vKX/N3f/R1btmzh4osv5rOf/SwPP/wwnudVo3wTYnSls/xwC1uBLSIiU9y4rmG/+93v5uabb+bJJ5/kggsu4K677uKcc87hH/7hHya6fBNidNDZ0HALW13iIiIyxR3SoLNMJsMf//Ef87nPfY7Zs2dz7733TlS5JpQxBrtssDyDFbOwEtZkF0lERORtjXtNzi1btvDTn/6Uhx56iJkzZ3LFFVdw6aWXTmTZJowxe1c5c7IOlqXAFhGRqe2ggX3vvfdy3333sX37di655BL+7d/+jWXLllWjbBMmMAY3DxYacCYiIuFw0MD+5S9/yac+9SnOP/98isUira2t1SjXhDIG3AKApQFnIiISCge9hv1v//ZvXHjhhTzzzDP80R/9Eddddx0AL7/8Mtdcc82EF3AiVFrYBsvSgDMREQmHcQ86u/XWW/nJT35CbW0tAO94xzvYvn37hBVsIhljhlvYWjRFRETC4ZBGiTc3N495HI/Hj2hhqsUYcIfXEdfGHyIiEgbjTqtMJsPu3btHR1Q/99xzZLPZCSvYRBoddGZp0JmIiITDuKd13XDDDVx99dXs3LmTq666im3btvG9731vIss2YYwBp1i579QosEVEZOobd2AvX76c//iP/2D16tUAnHzyyaPXs8PGGINTNJVpXRl1iYuIyNQ37sAGyGaznHvuuRNVlqoxBpwSYFlYKQW2iIhMfQcN7HvuuedtX//4xz9+xApTLYEx2OXhhVPSCmwREZn6DhrYX/va1zjhhBM45phjqlGeqhi9hp0AO61r2CIiMvUdNLBvuukm7r//fjZt2sQHP/hBLrnkEurq6qpRtgkTBAFuGUiCrS5xEREJgYMG9hVXXMEVV1zBjh07eOCBB/joRz/KMcccw7XXXhvaNcVNGSwfLMfCimnjDxERmfrG3bycP38+n/zkJ/nEJz7B888/z8svvzyR5ZpYhaBym1JYi4hIOBy0hW2M4amnnuK+++5j06ZNXHTRRfzoRz9i/vz51SjfxBgObCup7nAREQmHgwb2OeecM7r/9ec//3ksy6JYLPL6668DcPTRR094IY+44XXE1cIWEZGwOGhgx2Ixenp6uOOOO7jzzjsxxoy+ZlkWjz322IQWcEKMtLA14ExERELioIH9q1/9qhrlqK5C5Y8OdYmLiEhYHDSx/vEf/5GXXnqpGmWpGmsksLVoioiIhMRBE2vZsmX8+7//OxdccAE33ngjv/rVrygWi9Uo24QZCWzNwRYRkbA4aJf4ZZddxmWXXUapVOI3v/kNjz32GDfddBPHHnss559/PitWrKCxsbEaZT1yisMtbA06ExGRkBj35h/xeJxzzz2Xc889F2MMa9eu5Ze//CV33nknP/vZzyayjEecusRFRCRsfq/EsiyLk046iRtuuOGQwrpQKHDppZdy8803/z6nPWJGu8STWkdcRETCoapNzFtuuYXjjz++mqfcv+LwtK60usRFRCQcxt0lvnr16gO+dsoppxz0/Q888ACnnHIKGzduJJfLjfe0E8IaHjNnpdTCFhGRcBh3YD/zzDMArF27liAIOOGEE1i3bh3xeJzvfve7b/ve119/nS1btnD99dezcePGcReuoSGN6x6ZUG1u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ra2NUqkEwOrVq1mxYkVVzj0ypcvSmikiIhJSVWthp1Ip/vZv/5a///u/p6GhgWOPPbYqA85gb2BrhLiIiIRVVYdgnXnmmZx55pnVPGWFX7nRCHEREQmrSCycMrLxB+oSFxGRkIpGYI9cw9YqZyIiElLRCmx1iYuISEhFI7BHusQj8WlFRGQ6ikSEqUtcRETCLhqB7Wlal4iIhFskAjvWGMNyLGItsckuioiIyO8lElthxBpjzL11IXZG87pERCScIhHYAE5dZD6qiIhMQ5HoEhcREQk7BbaIiEgIKLBFRERCQIEtIiISAgpsERGREFBgi4iIhIACW0REJAQU2CIiIiGgwBYREQkBBbaIiEgIKLBFRERCwDLGmMkuhIiIiLw9tbBFRERCQIEtIiISAgpsERGREFBgi4iIhIACW0REJAQU2CIiIiHgTnYBJtozzzzDI488QlNTE5ZlsXLlysku0pTykY98hEQiAYBt2/zgBz+gt7eXb33rW8yfP59t27Zx/fXXM2PGjEku6eTo6urilltuYcOGDfz0pz8FoFgscvPNN9PS0sK2bdv47Gc/y1FHHQXAgw8+yPr167FtmwULFvDRj350MotfVfurq/vuu4//+q//Gv0e+9CHPsTll18ORLuutm/fzi233MLxxx9Pe3s79fX1rFy58m1/9m6//XYGBwfp7+/nzDPP5Pzzz5/kT1E9B6qv2267jeeff37066655hrOPPNMYJrWl5nGcrmced/73meKxaIxxpiVK1eaZ555ZpJLNbXceuutb3nur//6r83Pf/5zY4wxjz32mLnhhhuqXawp4xe/+IV57LHHzAc/+MHR5/71X//VrFq1yhhjzIYNG8yVV15pjDFm165d5rLLLjNBEBhjjLniiivM1q1bq17mybK/uvrpT39qduzY8ZavjXpdrV271jz66KOjjy+66CLz8ssvH/Bnb82aNeYzn/mMMcaYcrlsLrjgAtPf31/9gk+SA9XX/n5/GTN962tad4mvWbOGOXPmEI/HATjllFN4/PHHJ7dQU8xrr73GqlWruO2220br5oknnuDkk08GKnX2xBNPTGIJJ9eFF15IJpMZ89zjjz8+Wj/HHnssGzZsYHBwkKeeeooTTjgBy7IAOPnkk3nyySerXubJsr+6Arjnnnu44447+Jd/+Rd6e3sBIl9Xy5cv533ve9/o4yAISKVSB/zZ+/Wvf81JJ50EgOu6LF68eEzLcro7UH0BfO973+OOO+5g1apV5PN5YPrW17TuEu/u7h7zC6Smpobu7u5JLNHUc/XVV7N8+XJ83+fjH/84mUxmTL3V1NTQ19eH53m47rT+dhm3A31f7dmzZ8zzI3UZZaeffjorVqygsbGRJ554gi9+8Yv84Ac/UF3t49FHH+Wss85iyZIlB/zZ27NnD4sXLx59T01NDXv27JmsIk+qfevrwgsvZO7cuaTTae655x6+9rWvcdNNN03b+prWLeympiaGhoZGHw8ODtLU1DSJJZp6li9fDoDjOJx22mk899xzY+ptcHCQuro6hfU+DvR91djYOOb5oaGhyH+/zZ8/n8bGRgDe/e5388ILL+D7vupq2LPPPstzzz3HV77yFYAD/uy9ub4GBwdH6zVK3lxfS5cuJZ1OA5Xvr2effRZg2tbXtA7sk046iba2NkqlEgCrV69mxYoVk1uoKWTz5s38+Mc/Hn3c2trK/PnzOffcc3nppZeASp2de+65k1XEKWnFihWj9bNx40aWLVtGTU0NZ599Nq+++ipmeHn+l156iXPOOWcyizrpvvWtb+F5HgDbtm1j7ty5OI6juqJyaeXpp5/mxhtvpKuri5deeumAP3srVqxgzZo1AJTLZbZs2cLpp58+WUWfFPurr5tvvnn09dbWVhYsWABM3/qa9pt//O///i8PP/wwDQ0NxGIxjRLfR0dHB1/72tc47rjjGBwcxPM8/uqv/or+/n6++c1vMmfOHHbs2MGf//mfR3aU+PPPP88DDzzAU089xZVXXsmnP/1pAG6++Waam5vZvn07n/vc58aMEn/llVdwHIdFixZFauTz/urq3nvvZdOmTcybN4/XXnuNT3ziE6PXFqNcV6+88gpXXXUVJ554IgC5XI6Pf/zjnHfeeQf82bv99tvp7++nr6+Pc845Z3qMeh6nA9XX1q1byefzNDU18dprr/GFL3xh9GdxOtbXtA9sERGR6WBad4mLiIhMFwpsERGREFBgi4iIhIACW0REJAQU2CIiIiGgwBYREQkBBbaIiEgIKLBFQuqFF17g2GOP5f777z/sY/32t7/l2GOP5Tvf+c7ocy+99BIXXXTRYR33n/7pn/jABz4w5t+yZcv4y7/8y8MtskjkKLBFQigIAr7+9a/z7ne/m/Xr1x/28V599VWWL1/Oo48+Oua5448//oDvOe+88w563Ouvv54HH3xw9N973vMelixZwpe//OXDLrNI1CiwRULoRz/6EQsWLOBjH/sYGzZsOOzjrVu3jssuu4x8Ps+OHTuASmCfcMIJh33sEd/61rd4/PHHueuuu6bFRgwi1aYtmERCpr+/n+9///vcc889lMtlNm7cuN+v+8IXvkBra+t+X7v33ntJJpOjj9etW8eHP/xhLrjgAh599FE+/elPs27dOj7wgQ8ckTJ/+9vf5uGHH+buu++mubn5iBxTJGoU2CIhc9ttt3H55Zczd+5cgiCgVCqxa9cuZs+ePebrbr311nEdr1gssnXrVo477jji8Tg33XQTf/Inf8LmzZvf0iV+zTXXsGvXLgA6OztHA91xHO677779Hv873/kODz30ED/84Q9paWk51I8rIsMU2CIhsnnzZn70ox9RX1/PQw89BFS2D1y/fv1bAnu8LewNGzYwb948MpkM73jHO+jo6ODpp59m1qxZ1NbWjnnf97///dH75513Hg8++ODblnfVqlX85Cc/4e67735L+UTk0CiwRULkpptu4qtf/Sof+tCHRp+78cYb2bBhw1sGgY23hb3vtWrLsjjvvPO49dZb33bA2Xjceeed/PCHP+SHP/wh8+bNO6xjiYgCWyQ0HnvsMTo7O/ngBz845vmlS5eyevXq3/u469atGxPOF1xwAT/84Q8Pa0rX1q1bufnmm5k5cybXXXfdmNc+//nP84d/+Ie/97FFokr7YYuIiISApnWJiIiEgAJbREQkBBTYIiIiIaDAFhERCQEFtoiISAgosEVEREJAgS0iIhICCmwREZEQ+P8BYqe1VChmaXYAAAAASUVORK5CYII=\n",
|
||
"text/plain": [
|
||
"<Figure size 576x396 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_57_1.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# The mean squared error \n",
|
||
"print(\"Mean squared error: %.2f\" % mean_squared_error(Energies, fity))\n",
|
||
"# Explained variance score: 1 is perfect prediction \n",
|
||
"print('Variance score: %.2f' % r2_score(Energies, fity))\n",
|
||
"# Mean absolute error \n",
|
||
"print('Mean absolute error: %.2f' % mean_absolute_error(Energies, fity))\n",
|
||
"print(clf.coef_, clf.intercept_)\n",
|
||
"\n",
|
||
"Masses['Eapprox'] = fity\n",
|
||
"# Generate a plot comparing the experimental with the fitted values values.\n",
|
||
"fig, ax = plt.subplots()\n",
|
||
"ax.set_xlabel(r'$A = N + Z$')\n",
|
||
"ax.set_ylabel(r'$E_\\mathrm{bind}\\,/\\mathrm{MeV}$')\n",
|
||
"ax.plot(Masses['A'], Masses['Ebinding'], alpha=0.7, lw=2,\n",
|
||
" label='Ame2016')\n",
|
||
"ax.plot(Masses['A'], Masses['Eapprox'], alpha=0.7, lw=2, c='m',\n",
|
||
" label='Fit')\n",
|
||
"ax.legend()\n",
|
||
"save_fig(\"Masses2016\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"As a teaser, let us now see how we can do this with decision trees using **scikit-learn**. Later we will switch to so-called **random forests**!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAesAAAFpCAYAAAC8iwByAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABLaUlEQVR4nO3deXwU9f3H8deeuUNOCOG+5b4RRAU8EBARtFovPKq1atVWa/Fqtdaq4FUrtCq1rf486lEURK1nRRFFUQEBuQk3hJB7k+w9vz82WQgkZCPJbjb7fj4ePLKZnZ357DcJ7/3OfGe+JsMwDERERKTFMke6ABERETk2hbWIiEgLp7AWERFp4RTWIiIiLZzCWkREpIVTWIuIiLRw1kgXINKcli1bxsMPP8yGDRsYOXIkhmHgdDqZNGkSV155JTab7bi2/8033/C3v/2Nf/7zn8dcb/HixSxfvpwHHnjguPZ3pEmTJpGdnQ3Atm3bMAyDHj16AFBQUMB7773XpPs70sKFC3n66afZvXs3Q4cOxev1cvDgQcaNG8ddd92F2Rwd/YFzzjmHefPm0aVLl0iXIlInk66zltbuq6++4vLLL2fdunVYrVaKi4u57bbbsFgsPP3008cVKIZh4HA4SElJOeZ6Pp8Pp9NJUlLSj95XXWbOnMkLL7wAwB133IHX6+XRRx896rnm9MYbb/DEE0/w2WefAbBr1y6mTJnCfffdx3nnndfs+28KZWVlpKamRroMkXpFx8dekSaUnp7O7Nmz+eqrr3jrrbeOa1smk6nBoAawWCxNHtQAt9566496rjl16tSJXr16sXbt2ojs/8dQUEtLp8PgEpOys7M5+eSTee+995g+fToQOKT78ssvY7fbadeuHffddx/JyclA4HD63Llzsdls+P1+LrvsMk488USuu+46Vq9ezcaNGwF49dVXWbBgAQkJCcTHxzNr1iy8Xi+zZs2ivLyc//3vfwAcPHiQ++67j6KiIjweDxdffDEzZsxg7969/PrXv2b16tXMnj2bRYsWsW/fPh566CGGDRt21PsYOnRove9x6NChvPrqqzzzzDMMHjyYpKQk1qxZQ2pqKi+88AJLly5l3rx52Gw2kpOTue+++2jXrh0Aa9eu5aGHHsJkMmGxWLjnnnuCh9dD4fP5yMnJCX5/rO2tWbOGe++9F7vdTp8+fdi0aRPFxcX89re/ZenSpbz99ttcdtllbNmyhbVr13L++edz00038eyzz/LBBx9gtVrp27cvt99+O3a7na1bt3LfffcB4PV6+clPfsJ5553HwYMHueOOO3C5XHi9XiZMmMC1117L7Nmz+c9//sNdd90VPBJQ87tgs9lIT0/nD3/4A1lZWcybN49///vfnHXWWZSXl7N+/Xr69+/PnDlzQm4bkR/FEGnlli9fbvTu3dvweDy1lj/wwAPG5MmTDcMwjG+++cYYNWqUUVhYaBiGYcyePdu46667DMMwjJ07dxpDhw418vLyDMMwjNWrVxuXXXaZYRiGsWvXLqN3796GYRiGw+EwRo0aZbhcLsMwDOO5554zFixYEKxhwoQJwX1fccUVxpNPPmkYhmEUFhYaY8eONVasWFFrm++8845hGIYxf/5842c/+1mD7/P22283fvOb3xy1/MknnzROOukko7Cw0PD5fMbDDz9s7Ny50xgyZIixdetWwzAM48UXXzSuuOIKwzAMo6yszDjxxBONL774wjAMw/jkk0+MiRMnGj6fr879LliwwDjllFOC3//www/GTTfdZJSXlze4PZfLZZx66qnG4sWLg6/t27dvsN0MwzAuu+wy46qrrjK8Xq+xdetW47XXXjMWLVpkTJo0yaisrDT8fr9x8803G3/9618NwzCMm2++Odh2Bw4cMK6++mrDMAxjzpw5xjPPPGMYhmFUVFQYF110Ua191OxzxYoVxujRo4O/C3/961+Nyy+/vFY7n3vuuYbL5TKcTqcxatQo47vvvmvgpyNyfHQYXGKW3+8PPn7zzTc57bTTyMjIAAIDjhYvXoxhGLz99tsMGDCArl27AjBo0CB+/etfH7U9i8UCBHplVVVVXHrppUydOvWo9fLz8/nyyy85//zzAcjIyGD8+PEsWLCg1nqnnnoqAH369GH37t3H9V6HDBlCRkYGZrOZ3/72t8H31L17dwCmTp3Kl19+yYEDB/jkk09ITExkzJgxAIwfP56DBw+yevXqerdfVFTEzJkzmTZtWvB91xyVONb2Vq1aRWFhIZMnTwagb9++dfbgx40bh8VioXv37lxwwQW8+eabnH322SQkJGAymZg6dSqLFi0CoE2bNrz33nvs3r2b7Oxs5s6dC0BaWhpLly5l8+bNJCYm1jsocOHChYwfPz74u3D++eezfPly9u7dG1znxBNP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+fncf//99O3bF4fDgdfr5c4776SsrIxHH32U3Nxcdu3axW9+85uYHQ3+9ddfs3DhQpYuXcrFF1/Mz372MwDmzJlDdnY2O3fu5Be/+EWt0eBr167FYrHQtWvXmBrhXFdbvfrqq2zevJmOHTuyadMmLr/88uD5xFhuq7Vr1zJz5kwGDBgAQGVlJZdeeimnnXZavX97zz77LGVlZZSWlnLqqae2jhHOIaivrfLy8qiqqiIzM5NNmzZx8803B/8OW2NbteqwFhERaQ1a7WFwERGR1kJhLSIi0sIprEVERFo4hbWIiEgLp7AWERFp4RTWIiIiLZzCWkREpIVTWItILStWrKBPnz68+eabkS5FRKoprEUkyO/388ADDzB69GjWr18f6XJEpJrCWkSCXnvtNTp37swll1zChg0bIl2OiFTTVEoiAkBZWRlPP/00L730Eh6Ph40bN0a6JBGpprAWEQDmzp3L9OnT6dChA36/H7fbzb59+2jfvn2kSxOJeQprEWHr1q289tprpKWl8dZbbwGB6QXXr1+vsBZpATTrlohw9dVXM2XKFM4///zgsrvvvpsOHTpwww03RLAyEQENMBOJeR9//DEHDhxgxowZtZb36tVLg8xEWgj1rEVERFo49axFRERaOIW1iIhIC6ewFhERaeEU1iIiIi2cwlpERKSFU1iLiIi0cAprERGRFk5hLSIi0sL9P9puQA2En1dtAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<Figure size 576x396 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_59_0.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" N Z A Element Ebinding Eapprox\n",
|
||
"A \n",
|
||
"1 0 0 1 1 H 0.000000 0.000000\n",
|
||
"2 1 1 1 2 H 1.112283 1.112283\n",
|
||
"3 2 2 1 3 H 2.827265 2.827265\n",
|
||
"4 6 2 2 4 He 7.073915 7.073915\n",
|
||
"5 9 3 2 5 He 5.512132 5.512132\n",
|
||
"... ... ... ... ... ... ...\n",
|
||
"264 3304 156 108 264 Hs 7.298375 7.298375\n",
|
||
"265 3310 157 108 265 Hs 7.296247 7.297260\n",
|
||
"266 3317 158 108 266 Hs 7.298273 7.297260\n",
|
||
"269 3338 159 110 269 Ds 7.250154 7.250154\n",
|
||
"270 3344 160 110 270 Ds 7.253775 7.253775\n",
|
||
"\n",
|
||
"[267 rows x 6 columns]\n",
|
||
"0.009883615646716182\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"\n",
|
||
"#Decision Tree Regression\n",
|
||
"from sklearn.tree import DecisionTreeRegressor\n",
|
||
"regr_1=DecisionTreeRegressor(max_depth=5)\n",
|
||
"regr_2=DecisionTreeRegressor(max_depth=7)\n",
|
||
"regr_3=DecisionTreeRegressor(max_depth=9)\n",
|
||
"regr_1.fit(X, Energies)\n",
|
||
"regr_2.fit(X, Energies)\n",
|
||
"regr_3.fit(X, Energies)\n",
|
||
"\n",
|
||
"\n",
|
||
"y_1 = regr_1.predict(X)\n",
|
||
"y_2 = regr_2.predict(X)\n",
|
||
"y_3=regr_3.predict(X)\n",
|
||
"Masses['Eapprox'] = y_3\n",
|
||
"# Plot the results\n",
|
||
"plt.figure()\n",
|
||
"plt.plot(A, Energies, color=\"blue\", label=\"Data\", linewidth=2)\n",
|
||
"plt.plot(A, y_1, color=\"red\", label=\"max_depth=5\", linewidth=2)\n",
|
||
"plt.plot(A, y_2, color=\"green\", label=\"max_depth=7\", linewidth=2)\n",
|
||
"plt.plot(A, y_3, color=\"m\", label=\"max_depth=9\", linewidth=2)\n",
|
||
"\n",
|
||
"plt.xlabel(\"$A$\")\n",
|
||
"plt.ylabel(\"$E$[MeV]\")\n",
|
||
"plt.title(\"Decision Tree Regression\")\n",
|
||
"plt.legend()\n",
|
||
"save_fig(\"Masses2016Trees\")\n",
|
||
"plt.show()\n",
|
||
"print(Masses)\n",
|
||
"print(np.mean( (Energies-y_1)**2))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The **seaborn** package allows us to visualize data in an efficient way. Note that we use **scikit-learn**'s multi-layer perceptron (or feed forward neural network) \n",
|
||
"functionality."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/Users/mhjensen/opt/anaconda3/lib/python3.8/site-packages/sklearn/neural_network/_multilayer_perceptron.py:582: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n",
|
||
" warnings.warn(\n",
|
||
"/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"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJjCAYAAADQ22+yAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABi+ElEQVR4nO3deZyN5f/H8ddZZsY6xjJjrRDRIhUtUg0ixj6VSElUWmwRkULK2FL2SiGyU5mhLKEQqVBftCqR3Qyqsc1ylt8fd2bMz7jNMfecM8v76TGPh3OfM+e+Pue+z32u876u+x6b1+v1IiIiIiKWsQe6ASIiIiL5jTpYIiIiIhZTB0tERETEYupgiYiIiFhMHSwRERERi6mDJSIiImIxZ6AbIFKQDR8+nC1btgCwe/duKlasSKFChQBYuHBh2v8v5amnnmLAgAFUq1btoo+ZMGECV111FW3bts12u8/p2bMn3333HevWraNw4cKWPa+ISF5n03WwRHKHRo0aMWHCBGrVqhXopmTJ0aNHadOmDbVr16ZBgwY8/PDDgW6SiEiuoSFCkVxq0qRJPPHEE7Rq1Yp+/fpx7NgxnnvuOdq3b0+jRo3o1KkTx48fB4zO2c6dO/n222/p0KED/fv3p23btjRv3pxvvvkGgIEDBzJ9+nQAatWqxaRJk+jQoQONGjVi5syZALjdbkaOHEmTJk24//77efXVV+nUqVOm7Vu0aBH16tUjOjqaDz/8kPO/q23fvp127drRsmVLoqOj2bx5s+nyGjVqcOLEibTfP3f722+/pXXr1nTo0IHWrVuTkpLC8OHDadeuHc2bNycqKopt27YBcPr0aV566SWaNm1K8+bNeeuttzhz5gy33nore/bsSXvuLl26sGbNGis2kYjIRamDJZKLHTx4kCVLljB27Fg+++wzbrrpJhYuXMjatWspVKgQcXFxF/zOjh076Nq1K7GxsTz44INMnjz5gsekpKRQsmRJFixYwMSJE3nzzTdJTk5m8eLF/PTTT3z66acsWLCA/fv3Z9oul8vFokWLaN26NY0aNeL48eNs2LABgNTUVLp370737t359NNPef311xkxYgQpKSmZLvd4PKavwe+//86bb77J0qVL+emnn4iPj2fhwoUsX76c6Oho3n//fQAmTpxIcnIyy5cvJzY2lu+//56dO3fStm1bFi9eDMC+ffvYs2cPDRs29Gk7iIj4SnOwRHKxm266CafTeJt27tyZrVu38sEHH7B3715+//13ateufcHvVKhQgWuvvRaA6667jiVLlmT63Pfeey8A119/PSkpKZw5c4b169fTpk0bQkJCAGjfvj2zZ8++4HfXrl2Lx+Ph7rvvxul00rx5c2bNmkVkZCS7du3CbrfToEEDAG644QaWLVvGTz/9lOnySylfvjwVK1YE4Oabb6ZEiRJpnb9vv/2WokWLAvD111/z0ksv4XA4cDgczJkzB4CIiAgeffRR+vTpw8KFC3nwwQdxOByXXK+ISHaogyWSixUpUiTt/2+88QY7duzggQce4Pbbb8flcpHZFMrzJ8bbbLZMHwOkdaJsNhsAXq83rTN3jt2eecg9f/58kpKSuO+++wAjEUtISOD333/H4XCkPec5u3btuujyqlWrZliWkpKS4fb5r8G6deuIiYmhS5cu3HvvvVStWpWlS5cC4HQ6Mzz/4cOHKVSoEFWqVKFGjRqsXbuWZcuWpaVZIiI5SUOEInnExo0b6dy5M23btqV06dJ8/fXXuN1uS9cRGRnJ0qVLSUlJweVyZZp+7dmzh++++44lS5bwxRdf8MUXX7Bx40bq1q3LrFmzqFq1KjabjU2bNgHw008/0blz54su93g8lCpVip07dwKwevXqi7Zv06ZNNGzYkI4dO1KrVi3WrFmT9hrUq1ePJUuW4PF4SElJoVevXmlnaHbs2JExY8ZQu3ZtypYta+lrJiKSGSVYInlE9+7dGTNmDG+//TYOh4NbbrmFffv2WbqO+++/nz179tC2bVuKFClCpUqVLrj8wvz582ncuDFXXnllhuU9evTg6aefpm/fvkyaNIkRI0YwZswYgoKCmDRpEsHBwRdd/sorr/Daa68RGhrKnXfeSXh4eKbt69ChA/369aNVq1Y4HA7q1q3L559/jsfjoUePHsTExNCmTRvcbjfNmzdPS9gaNmzIK6+8QocOHSx9vURELkaXaRCRNBs3buT48eO0adMGMK7TFRISQv/+/QPcsuz5/vvvGTx4MJ9++ukFw5QiIjlBHSwRSXP06FEGDhzI8ePHcbvd1KxZk1dffZXixYsHummXbcCAAXz33XeMHj2a2267LdDNEZECQh0sERERyfOWLVvGO++8Q2pqKo8//jiPPPJIQNujOVgiIiKSpx09epRx48bxySefEBwcTIcOHbj99ttN/3xYTlMHS0RERHKNxMREEhMTL1geGhpKaGhopr/z9ddfc8cddxAWFgZA06ZNWblyJT169MjJpprK8x2shEMVA92EgLFTsCfrOgp4/QV9+3vQ7IaCKhXzq/8XBOEVDvp1fZ4j1/htXbMW98z0L1D06NGDnj17Zvo78fHxGc4+joiIYMeOHTnWxqzI8x0sERERyT86d+5MdHT0Bcsvll4BmV5QOdBnDKuDJSIiIrmG2VDgxZQtW5atW7em3Y6PjyciIsLqpvlEV3IXERERUx4//rscd955J5s3b+bEiROcPXuWzz//nHvuucfiV8E3SrBEREQkTytbtix9+vThscceIzU1lQcffJAbb7wxoG3K89fB0iT3gkuT3At2/ZrkXnBpkrv/J7knH6566QdZJKT8n35bV07SEKGIiIiIxTREKCIiIqaUGPtOCZaIiIiIxZRgiYiIiKnLPbuvIFOCJSIiImIxJVgiIiJiyp23LzgQEEqwRERERCymBEtERERM6SxC3ynBEhEREbGYOlgiIiIiFtMQoYiIiJhya4jQZ0qwRERERCymBEtERERMaZK775RgiYiIiFhMCZaIiIiY0oVGfacES0RERMRiSrBERETElP7Us++UYImIiIhYTAmWiIiImNJ1sHynBEtERETEYkqwRERExJRbAZbPlGCJiIiIWEwJloiIiJjSWYS+U4IlIiIiYjElWCIiImLKjS3QTchzlGCJiIiIWEwdLBERERGLaYhQRERETHl0mQafKcESERERsZgSLB999EkQH8cGERLs5aqrPLzQO5nQUOO+T2KdfLo8iORkGzWucTOwfzLBwYFtr9XWf+Vg2sxg7DYvxYvDwH7JVKqY/tXmaLyNp7oX4sNpZwkrEcCGWmz5KgfzFgel3T51GuITbCxbdJbSpaBp28KEl0l/HR5tn0qzJu5ANDXH/PGnjTcmBnHqtA2HHV7qm8K1NYyaO3ULITkFnP8dUaIau+nUwRXA1lrvjz9tvDkxmFOnbdjtXgb+V39KCrw5KYitPzgoUhjuqufmqcdTseejr68Fff+/2HHf7YZJbwfz3RYnbjc83D6Ftq3z135/jia5+04dLB98/4ODufODmPr2WSLCvaz83MmYNwsxfFgS6zc4+HhJMO9MOkOxYjD41UIs/CiITh1TA91syyQnw7ARIXw47SyV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/u5gSe7h7w5WbuTvDtaWfZX9tq5br9zrt3XlpHw6HU9EREQkcPL4VEQRERHJaTqL0HdKsEREREQspgRLRERETOksQt8pwRIRERGxmDpYIiIiIhbTEKGIiIiYcnuVx/hKr5iIiIiIxZRgiYiIiCmP8hif6RUTERERsZgSLBERETGlyzT4TgmWiIiIiMWUYImIiIgpnUXoO71iIiIiIhZTgiUiIiKmPJqD5TMlWCIiIiIWU4IlIiIiptzKY3ymV0xERETEYkqwRERExJTOIvSdXjERERERiynBEhEREVP6W4S+0ysmIiIiYjF1sEREREQspiFCERERMeX26kKjvlKCJSIiImIxJVgiIiJiShca9Z1eMRERERGLKcESERERUx5daNRnesVERERELKYES0RERExpDpbv9IqJiIiIWEwJloiIiJjSdbB8pwRLRERExGJ5PsEqZgsOdBMkQDx4At0ECSAHBfsbtdvrDXQTAqaILc9/dOU5+mPPvtMrJiIiImIxfQ0QERERU25dB8tnesVERERELKYES0REREx5Cvicx8uhBEtERETEYupgiYiIiFhMQ4QiIiJiSpPcfadXTERERMRiSrBERETElP7Ys+/0iomIiIhYTAmWiIiImPLojz37TAmWiIiIiMWUYImIiIgpzcHynV4xEREREYspwRIRERFTnjx6HazY2FjGjh1L6dKlAWjQoAF9+vTh0KFD9O/fn+PHj1OlShXGjh1L0aJFSUxMpF+/fuzfv59SpUoxfvx4wsPDL2vdefMVExEREbmEnTt3MnDgQOLi4oiLi6NPnz4ADBs2jI4dO7Jy5UpuuOEG3n77bQDGjx9P3bp1WbFiBe3atSMmJuay160OloiIiJhyY/PbT2JiIgcOHLjgJzEx0ed279y5k9jYWFq3bk2/fv34999/SU1NZcuWLTRt2hSA+++/n5UrVwKwbt06WrVqBUDLli3ZsGEDqampl/WaqYMlIiIiucasWbO49957L/iZNWuWz88VHh5Oz549iYuLo3z58rz22mv8/fffFCtWDKfTmfaYo0ePAhAfH582JOh0OilWrBgnTpy4rDo0B0tERERM+XMOVufOnYmOjr5geWho6EV/Z8WKFYwcOTLDsqpVqzJz5sy0208++SSNGzfmxRdfvOD3bbaLX+fLbr+82tXBEhERkVwjNDTUtDOVmaioKKKi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rlwZ6Gb5zaJFixg6dCgRERGBborfhYeHM3DgQIKDgwkKCuLqq6/m0KFDgW6W39x22218+OGHOJ1Ojh8/jtvtpkiRIoFult/8888/jBs3jmeeeSbQTfG7P//8E5vNxlNPPUXr1q2ZM2dOoJvkV6tXr6Z58+aUK1eOoKAgxo0bR+3atQPdLMmlCt5XEIvEx8cTHh6edjsiIoIdO3YEsEX+FRMTE+gmBEz16tXT/r93716WL1/OggULAtgi/wsKCmLixInMmDGDZs2aUbZs2UA3yW+GDBlCnz59OHz4cKCb4neJiYnUq1ePV199laSkJB577DGqVKlC/fr1A900v/jrr78ICgriiSeeICEhgYYNG/L8888HulmSSynBukxer/eCZTabLQAtkUD5/fff6dq1KwMGDKBy5cqBbo7f9erVi82bN3P48GEWLVoU6Ob4xeLFiylfvjz16tULdFMC4uabb2bMmDEUKVKEUqVK8eCDD7J+/fpAN8tv3G43mzdv5o033mDRokXs3LmTJUuWBLpZkkupg3WZypYty7Fjx9Jux8fHF8jhsoJq27ZtPP7447zwwgtER0cHujl+tXv3bn755RcAChcuzH333cdvv/0W4Fb5x/Lly9m0aRNt2rRh4sSJfPHFF4wYMSLQzfKbrVu3snnz5rTbXq+3QM3FKlOmDPXq1aNUqVIUKlSIe++9t0CNXIhv1MG6THfeeSebN2/mxIkTnD17ls8//5x77rkn0M0SPzh8+DDdu3dn7NixtGjRItDN8bsDBw7wyiuvkJKSQkpKCmvXrqVOnTqBbpZffPDBB3z66afExcXRq1cvGjVqxKBBgwLdLL85efIkY8aMITk5mVOnTrFkyZICc3IHQMOGDdm4cSOJiYm43W6++uorrr/++kA3S3KpgvPVw2Jly5alT58+PPbYY6SmpvLggw9y4403BrpZ4gfTp08nOTmZUaNGpS3r0KEDDz/8cABb5T+RkZFs376dtm3b4nA4uO+++wpkR7MgatiwYdq293g8dOzYkZtvvjnQzfKb2rVr8+STT9KxY0dSU1OpX78+DzzwQKCbJbmUzZvZZCIRERERuWwaIhQRERGxmDpYIiIiIhZTB0tERETEYupgiYiIiFhMHSwRERERi6mDJSIiImIxdbBERERELKYOloj4LCoqinvuuYfff/890E0REcmV1MESEZ99+umnVK5cmVWrVgW6KSIiuZI6WCLiM4fDQZ06dQrMH3kWEfGV/hahiPgsKSmJzz77DP2lLRGRzCnBEhGfjRs3jrJly7J//35Onz4d6OaIiOQ66mCJiE9++OEHVq5cyaRJkyhevDi7du0KdJNERHIddbBEJMuSk5N56aWXGDZsGGFhYdSsWVPzsEREMqEOlohk2YQJE7j55ptp0KABADVr1uTXX38NbKNERHIhdbBEJEt27NjBypUrGTRoUNqya6+9VgmWiEgmbF6dBiQiIiJiKSVYIiIiIhZTB0tERETEYupgiYiIiFhMHSwRERERi6mDJSIiImIxdbBERERELKYOloiIiIjF/g+IQKgMNEb4VAAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<Figure size 720x720 with 2 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_61_10.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.neural_network import MLPRegressor\n",
|
||
"from sklearn.metrics import accuracy_score\n",
|
||
"import seaborn as sns\n",
|
||
"\n",
|
||
"X_train = X\n",
|
||
"Y_train = Energies\n",
|
||
"n_hidden_neurons = 100\n",
|
||
"epochs = 100\n",
|
||
"# store models for later use\n",
|
||
"eta_vals = np.logspace(-5, 1, 7)\n",
|
||
"lmbd_vals = np.logspace(-5, 1, 7)\n",
|
||
"# store the models for later use\n",
|
||
"DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n",
|
||
"train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n",
|
||
"sns.set()\n",
|
||
"for i, eta in enumerate(eta_vals):\n",
|
||
" for j, lmbd in enumerate(lmbd_vals):\n",
|
||
" dnn = MLPRegressor(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',\n",
|
||
" alpha=lmbd, learning_rate_init=eta, max_iter=epochs)\n",
|
||
" dnn.fit(X_train, Y_train)\n",
|
||
" DNN_scikit[i][j] = dnn\n",
|
||
" train_accuracy[i][j] = dnn.score(X_train, Y_train)\n",
|
||
"\n",
|
||
"fig, ax = plt.subplots(figsize = (10, 10))\n",
|
||
"sns.heatmap(train_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n",
|
||
"ax.set_title(\"Training Accuracy\")\n",
|
||
"ax.set_ylabel(\"$\\eta$\")\n",
|
||
"ax.set_xlabel(\"$\\lambda$\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Linear Regression, basic elements\n",
|
||
"\n",
|
||
"\n",
|
||
"[Video of Lecture](https://www.uio.no/studier/emner/matnat/fys/FYS-STK4155/h20/forelesningsvideoer/LectureAug27.mp4?vrtx=view-as-webpage).\n",
|
||
"\n",
|
||
"\n",
|
||
"Fitting a continuous function with linear parameterization in terms of the parameters $\\boldsymbol{\\beta}$.\n",
|
||
"* Method of choice for fitting a continuous function!\n",
|
||
"\n",
|
||
"* Gives an excellent introduction to central Machine Learning features with **understandable pedagogical** links to other methods like **Neural Networks**, **Support Vector Machines** etc\n",
|
||
"\n",
|
||
"* Analytical expression for the fitting parameters $\\boldsymbol{\\beta}$\n",
|
||
"\n",
|
||
"* Analytical expressions for statistical propertiers like mean values, variances, confidence intervals and more\n",
|
||
"\n",
|
||
"* Analytical relation with probabilistic interpretations \n",
|
||
"\n",
|
||
"* Easy to introduce basic concepts like bias-variance tradeoff, cross-validation, resampling and regularization techniques and many other ML topics\n",
|
||
"\n",
|
||
"* Easy to code! And links well with classification problems and logistic regression and neural networks\n",
|
||
"\n",
|
||
"* Allows for **easy** hands-on understanding of gradient descent methods\n",
|
||
"\n",
|
||
"* and many more features\n",
|
||
"\n",
|
||
"For more discussions of Ridge and Lasso regression, [Wessel van Wieringen's](https://arxiv.org/abs/1509.09169) article is highly recommended.\n",
|
||
"Similarly, [Mehta et al's article](https://arxiv.org/abs/1803.08823) is also recommended.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Regression modeling deals with the description of the sampling distribution of a given random variable $y$ and how it varies as function of another variable or a set of such variables $\\boldsymbol{x} =[x_0, x_1,\\dots, x_{n-1}]^T$. \n",
|
||
"The first variable is called the **dependent**, the **outcome** or the **response** variable while the set of variables $\\boldsymbol{x}$ is called the independent variable, or the predictor variable or the explanatory variable. \n",
|
||
"\n",
|
||
"A regression model aims at finding a likelihood function $p(\\boldsymbol{y}\\vert \\boldsymbol{x})$, that is the conditional distribution for $\\boldsymbol{y}$ with a given $\\boldsymbol{x}$. The estimation of $p(\\boldsymbol{y}\\vert \\boldsymbol{x})$ is made using a data set with \n",
|
||
"* $n$ cases $i = 0, 1, 2, \\dots, n-1$ \n",
|
||
"\n",
|
||
"* Response (target, dependent or outcome) variable $y_i$ with $i = 0, 1, 2, \\dots, n-1$ \n",
|
||
"\n",
|
||
"* $p$ so-called explanatory (independent or predictor) variables $\\boldsymbol{x}_i=[x_{i0}, x_{i1}, \\dots, x_{ip-1}]$ with $i = 0, 1, 2, \\dots, n-1$ and explanatory variables running from $0$ to $p-1$. See below for more explicit examples. \n",
|
||
"\n",
|
||
" The goal of the regression analysis is to extract/exploit relationship between $\\boldsymbol{y}$ and $\\boldsymbol{x}$ in or to infer causal dependencies, approximations to the likelihood functions, functional relationships and to make predictions, making fits and many other things.\n",
|
||
"\n",
|
||
"\n",
|
||
"Consider an experiment in which $p$ characteristics of $n$ samples are\n",
|
||
"measured. The data from this experiment, for various explanatory variables $p$ are normally represented by a matrix \n",
|
||
"$\\mathbf{X}$.\n",
|
||
"\n",
|
||
"The matrix $\\mathbf{X}$ is called the *design\n",
|
||
"matrix*. Additional information of the samples is available in the\n",
|
||
"form of $\\boldsymbol{y}$ (also as above). The variable $\\boldsymbol{y}$ is\n",
|
||
"generally referred to as the *response variable*. The aim of\n",
|
||
"regression analysis is to explain $\\boldsymbol{y}$ in terms of\n",
|
||
"$\\boldsymbol{X}$ through a functional relationship like $y_i =\n",
|
||
"f(\\mathbf{X}_{i,\\ast})$. When no prior knowledge on the form of\n",
|
||
"$f(\\cdot)$ is available, it is common to assume a linear relationship\n",
|
||
"between $\\boldsymbol{X}$ and $\\boldsymbol{y}$. This assumption gives rise to\n",
|
||
"the *linear regression model* where $\\boldsymbol{\\beta} = [\\beta_0, \\ldots,\n",
|
||
"\\beta_{p-1}]^{T}$ are the *regression parameters*. \n",
|
||
"\n",
|
||
"Linear regression gives us a set of analytical equations for the parameters $\\beta_j$.\n",
|
||
"\n",
|
||
"\n",
|
||
"In order to understand the relation among the predictors $p$, the set of data $n$ and the target (outcome, output etc) $\\boldsymbol{y}$,\n",
|
||
"consider the model we discussed for describing nuclear binding energies. \n",
|
||
"\n",
|
||
"There we assumed that we could parametrize the data using a polynomial approximation based on the liquid drop model.\n",
|
||
"Assuming"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"BE(A) = a_0+a_1A+a_2A^{2/3}+a_3A^{-1/3}+a_4A^{-1},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we have five predictors, that is the intercept, the $A$ dependent term, the $A^{2/3}$ term and the $A^{-1/3}$ and $A^{-1}$ terms.\n",
|
||
"This gives $p=0,1,2,3,4$. Furthermore we have $n$ entries for each predictor. It means that our design matrix is a \n",
|
||
"$p\\times n$ matrix $\\boldsymbol{X}$.\n",
|
||
"\n",
|
||
"Here the predictors are based on a model we have made. A popular data set which is widely encountered in ML applications is the\n",
|
||
"so-called [credit card default data from Taiwan](https://www.sciencedirect.com/science/article/pii/S0957417407006719?via%3Dihub). The data set contains data on $n=30000$ credit card holders with predictors like gender, marital status, age, profession, education, etc. In total there are $24$ such predictors or attributes leading to a design matrix of dimensionality $24 \\times 30000$. This is however a classification problem and we will come back to it when we discuss Logistic Regression. \n",
|
||
"\n",
|
||
"\n",
|
||
"Before we proceed let us study a case from linear algebra where we aim at fitting a set of data $\\boldsymbol{y}=[y_0,y_1,\\dots,y_{n-1}]$. We could think of these data as a result of an experiment or a complicated numerical experiment. These data are functions of a series of variables $\\boldsymbol{x}=[x_0,x_1,\\dots,x_{n-1}]$, that is $y_i = y(x_i)$ with $i=0,1,2,\\dots,n-1$. The variables $x_i$ could represent physical quantities like time, temperature, position etc. We assume that $y(x)$ is a smooth function. \n",
|
||
"\n",
|
||
"Since obtaining these data points may not be trivial, we want to use these data to fit a function which can allow us to make predictions for values of $y$ which are not in the present set. The perhaps simplest approach is to assume we can parametrize our function in terms of a polynomial of degree $n-1$ with $n$ points, that is"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"y=y(x) \\rightarrow y(x_i)=\\tilde{y}_i+\\epsilon_i=\\sum_{j=0}^{n-1} \\beta_j x_i^j+\\epsilon_i,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\epsilon_i$ is the error in our approximation. \n",
|
||
"\n",
|
||
"\n",
|
||
"For every set of values $y_i,x_i$ we have thus the corresponding set of equations"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{align*}\n",
|
||
"y_0&=\\beta_0+\\beta_1x_0^1+\\beta_2x_0^2+\\dots+\\beta_{n-1}x_0^{n-1}+\\epsilon_0\\\\\n",
|
||
"y_1&=\\beta_0+\\beta_1x_1^1+\\beta_2x_1^2+\\dots+\\beta_{n-1}x_1^{n-1}+\\epsilon_1\\\\\n",
|
||
"y_2&=\\beta_0+\\beta_1x_2^1+\\beta_2x_2^2+\\dots+\\beta_{n-1}x_2^{n-1}+\\epsilon_2\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{n-1}&=\\beta_0+\\beta_1x_{n-1}^1+\\beta_2x_{n-1}^2+\\dots+\\beta_{n-1}x_{n-1}^{n-1}+\\epsilon_{n-1}.\\\\\n",
|
||
"\\end{align*}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Defining the vectors"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{y} = [y_0,y_1, y_2,\\dots, y_{n-1}]^T,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\beta} = [\\beta_0,\\beta_1, \\beta_2,\\dots, \\beta_{n-1}]^T,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\epsilon} = [\\epsilon_0,\\epsilon_1, \\epsilon_2,\\dots, \\epsilon_{n-1}]^T,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and the design matrix"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}=\n",
|
||
"\\begin{bmatrix} \n",
|
||
"1& x_{0}^1 &x_{0}^2& \\dots & \\dots &x_{0}^{n-1}\\\\\n",
|
||
"1& x_{1}^1 &x_{1}^2& \\dots & \\dots &x_{1}^{n-1}\\\\\n",
|
||
"1& x_{2}^1 &x_{2}^2& \\dots & \\dots &x_{2}^{n-1}\\\\ \n",
|
||
"\\dots& \\dots &\\dots& \\dots & \\dots &\\dots\\\\\n",
|
||
"1& x_{n-1}^1 &x_{n-1}^2& \\dots & \\dots &x_{n-1}^{n-1}\\\\\n",
|
||
"\\end{bmatrix}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we can rewrite our equations as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{y} = \\boldsymbol{X}\\boldsymbol{\\beta}+\\boldsymbol{\\epsilon}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The above design matrix is called a [Vandermonde matrix](https://en.wikipedia.org/wiki/Vandermonde_matrix).\n",
|
||
"\n",
|
||
"We are obviously not limited to the above polynomial expansions. We\n",
|
||
"could replace the various powers of $x$ with elements of Fourier\n",
|
||
"series or instead of $x_i^j$ we could have $\\cos{(j x_i)}$ or $\\sin{(j\n",
|
||
"x_i)}$, or time series or other orthogonal functions. For every set\n",
|
||
"of values $y_i,x_i$ we can then generalize the equations to"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{align*}\n",
|
||
"y_0&=\\beta_0x_{00}+\\beta_1x_{01}+\\beta_2x_{02}+\\dots+\\beta_{n-1}x_{0n-1}+\\epsilon_0\\\\\n",
|
||
"y_1&=\\beta_0x_{10}+\\beta_1x_{11}+\\beta_2x_{12}+\\dots+\\beta_{n-1}x_{1n-1}+\\epsilon_1\\\\\n",
|
||
"y_2&=\\beta_0x_{20}+\\beta_1x_{21}+\\beta_2x_{22}+\\dots+\\beta_{n-1}x_{2n-1}+\\epsilon_2\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{i}&=\\beta_0x_{i0}+\\beta_1x_{i1}+\\beta_2x_{i2}+\\dots+\\beta_{n-1}x_{in-1}+\\epsilon_i\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{n-1}&=\\beta_0x_{n-1,0}+\\beta_1x_{n-1,2}+\\beta_2x_{n-1,2}+\\dots+\\beta_{n-1}x_{n-1,n-1}+\\epsilon_{n-1}.\\\\\n",
|
||
"\\end{align*}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**Note that we have $p=n$ here. The matrix is symmetric. This is generally not the case!**\n",
|
||
"\n",
|
||
"We redefine in turn the matrix $\\boldsymbol{X}$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}=\n",
|
||
"\\begin{bmatrix} \n",
|
||
"x_{00}& x_{01} &x_{02}& \\dots & \\dots &x_{0,n-1}\\\\\n",
|
||
"x_{10}& x_{11} &x_{12}& \\dots & \\dots &x_{1,n-1}\\\\\n",
|
||
"x_{20}& x_{21} &x_{22}& \\dots & \\dots &x_{2,n-1}\\\\ \n",
|
||
"\\dots& \\dots &\\dots& \\dots & \\dots &\\dots\\\\\n",
|
||
"x_{n-1,0}& x_{n-1,1} &x_{n-1,2}& \\dots & \\dots &x_{n-1,n-1}\\\\\n",
|
||
"\\end{bmatrix}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and without loss of generality we rewrite again our equations as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{y} = \\boldsymbol{X}\\boldsymbol{\\beta}+\\boldsymbol{\\epsilon}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The left-hand side of this equation is kwown. Our error vector $\\boldsymbol{\\epsilon}$ and the parameter vector $\\boldsymbol{\\beta}$ are our unknow quantities. How can we obtain the optimal set of $\\beta_i$ values? \n",
|
||
"\n",
|
||
"We have defined the matrix $\\boldsymbol{X}$ via the equations"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{align*}\n",
|
||
"y_0&=\\beta_0x_{00}+\\beta_1x_{01}+\\beta_2x_{02}+\\dots+\\beta_{n-1}x_{0n-1}+\\epsilon_0\\\\\n",
|
||
"y_1&=\\beta_0x_{10}+\\beta_1x_{11}+\\beta_2x_{12}+\\dots+\\beta_{n-1}x_{1n-1}+\\epsilon_1\\\\\n",
|
||
"y_2&=\\beta_0x_{20}+\\beta_1x_{21}+\\beta_2x_{22}+\\dots+\\beta_{n-1}x_{2n-1}+\\epsilon_1\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{i}&=\\beta_0x_{i0}+\\beta_1x_{i1}+\\beta_2x_{i2}+\\dots+\\beta_{n-1}x_{in-1}+\\epsilon_1\\\\\n",
|
||
"\\dots & \\dots \\\\\n",
|
||
"y_{n-1}&=\\beta_0x_{n-1,0}+\\beta_1x_{n-1,2}+\\beta_2x_{n-1,2}+\\dots+\\beta_{n-1}x_{n-1,n-1}+\\epsilon_{n-1}.\\\\\n",
|
||
"\\end{align*}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"As we noted above, we stayed with a system with the design matrix \n",
|
||
" $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times n}$, that is we have $p=n$. For reasons to come later (algorithmic arguments) we will hereafter define \n",
|
||
"our matrix as $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times p}$, with the predictors refering to the column numbers and the entries $n$ being the row elements.\n",
|
||
"\n",
|
||
"In our [introductory notes](https://compphysics.github.io/MachineLearning/doc/pub/How2ReadData/html/How2ReadData.html) we looked at the so-called [liquid drop model](https://en.wikipedia.org/wiki/Semi-empirical_mass_formula). Let us remind ourselves about what we did by looking at the code.\n",
|
||
"\n",
|
||
"We restate the parts of the code we are most interested in."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>1</th>\n",
|
||
" <th>A</th>\n",
|
||
" <th>A^(2/3)</th>\n",
|
||
" <th>A^(-1/3)</th>\n",
|
||
" <th>1/A</th>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>A</th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" <th></th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>1.587401</td>\n",
|
||
" <td>0.793701</td>\n",
|
||
" <td>0.500000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>2.080084</td>\n",
|
||
" <td>0.693361</td>\n",
|
||
" <td>0.333333</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2.519842</td>\n",
|
||
" <td>0.629961</td>\n",
|
||
" <td>0.250000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>2.924018</td>\n",
|
||
" <td>0.584804</td>\n",
|
||
" <td>0.200000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>264</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>264.0</td>\n",
|
||
" <td>41.153106</td>\n",
|
||
" <td>0.155883</td>\n",
|
||
" <td>0.003788</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>265</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>265.0</td>\n",
|
||
" <td>41.256962</td>\n",
|
||
" <td>0.155687</td>\n",
|
||
" <td>0.003774</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>266</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>266.0</td>\n",
|
||
" <td>41.360688</td>\n",
|
||
" <td>0.155491</td>\n",
|
||
" <td>0.003759</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>269</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>269.0</td>\n",
|
||
" <td>41.671089</td>\n",
|
||
" <td>0.154911</td>\n",
|
||
" <td>0.003717</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>270</th>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>270.0</td>\n",
|
||
" <td>41.774300</td>\n",
|
||
" <td>0.154720</td>\n",
|
||
" <td>0.003704</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>267 rows × 5 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" 1 A A^(2/3) A^(-1/3) 1/A\n",
|
||
"A \n",
|
||
"1 1.0 1.0 1.000000 1.000000 1.000000\n",
|
||
"2 1.0 2.0 1.587401 0.793701 0.500000\n",
|
||
"3 1.0 3.0 2.080084 0.693361 0.333333\n",
|
||
"4 1.0 4.0 2.519842 0.629961 0.250000\n",
|
||
"5 1.0 5.0 2.924018 0.584804 0.200000\n",
|
||
".. ... ... ... ... ...\n",
|
||
"264 1.0 264.0 41.153106 0.155883 0.003788\n",
|
||
"265 1.0 265.0 41.256962 0.155687 0.003774\n",
|
||
"266 1.0 266.0 41.360688 0.155491 0.003759\n",
|
||
"269 1.0 269.0 41.671089 0.154911 0.003717\n",
|
||
"270 1.0 270.0 41.774300 0.154720 0.003704\n",
|
||
"\n",
|
||
"[267 rows x 5 columns]"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Common imports\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from IPython.display import display\n",
|
||
"import os\n",
|
||
"\n",
|
||
"# Where to save the figures and data files\n",
|
||
"PROJECT_ROOT_DIR = \"Results\"\n",
|
||
"FIGURE_ID = \"Results/FigureFiles\"\n",
|
||
"DATA_ID = \"DataFiles/\"\n",
|
||
"\n",
|
||
"if not os.path.exists(PROJECT_ROOT_DIR):\n",
|
||
" os.mkdir(PROJECT_ROOT_DIR)\n",
|
||
"\n",
|
||
"if not os.path.exists(FIGURE_ID):\n",
|
||
" os.makedirs(FIGURE_ID)\n",
|
||
"\n",
|
||
"if not os.path.exists(DATA_ID):\n",
|
||
" os.makedirs(DATA_ID)\n",
|
||
"\n",
|
||
"def image_path(fig_id):\n",
|
||
" return os.path.join(FIGURE_ID, fig_id)\n",
|
||
"\n",
|
||
"def data_path(dat_id):\n",
|
||
" return os.path.join(DATA_ID, dat_id)\n",
|
||
"\n",
|
||
"def save_fig(fig_id):\n",
|
||
" plt.savefig(image_path(fig_id) + \".png\", format='png')\n",
|
||
"\n",
|
||
"infile = open(data_path(\"MassEval2016.dat\"),'r')\n",
|
||
"\n",
|
||
"\n",
|
||
"# Read the experimental data with Pandas\n",
|
||
"Masses = pd.read_fwf(infile, usecols=(2,3,4,6,11),\n",
|
||
" names=('N', 'Z', 'A', 'Element', 'Ebinding'),\n",
|
||
" widths=(1,3,5,5,5,1,3,4,1,13,11,11,9,1,2,11,9,1,3,1,12,11,1),\n",
|
||
" header=39,\n",
|
||
" index_col=False)\n",
|
||
"\n",
|
||
"# Extrapolated values are indicated by '#' in place of the decimal place, so\n",
|
||
"# the Ebinding column won't be numeric. Coerce to float and drop these entries.\n",
|
||
"Masses['Ebinding'] = pd.to_numeric(Masses['Ebinding'], errors='coerce')\n",
|
||
"Masses = Masses.dropna()\n",
|
||
"# Convert from keV to MeV.\n",
|
||
"Masses['Ebinding'] /= 1000\n",
|
||
"\n",
|
||
"# Group the DataFrame by nucleon number, A.\n",
|
||
"Masses = Masses.groupby('A')\n",
|
||
"# Find the rows of the grouped DataFrame with the maximum binding energy.\n",
|
||
"Masses = Masses.apply(lambda t: t[t.Ebinding==t.Ebinding.max()])\n",
|
||
"A = Masses['A']\n",
|
||
"Z = Masses['Z']\n",
|
||
"N = Masses['N']\n",
|
||
"Element = Masses['Element']\n",
|
||
"Energies = Masses['Ebinding']\n",
|
||
"\n",
|
||
"# Now we set up the design matrix X\n",
|
||
"X = np.zeros((len(A),5))\n",
|
||
"X[:,0] = 1\n",
|
||
"X[:,1] = A\n",
|
||
"X[:,2] = A**(2.0/3.0)\n",
|
||
"X[:,3] = A**(-1.0/3.0)\n",
|
||
"X[:,4] = A**(-1.0)\n",
|
||
"# Then nice printout using pandas\n",
|
||
"DesignMatrix = pd.DataFrame(X)\n",
|
||
"DesignMatrix.index = A\n",
|
||
"DesignMatrix.columns = ['1', 'A', 'A^(2/3)', 'A^(-1/3)', '1/A']\n",
|
||
"display(DesignMatrix)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"With $\\boldsymbol{\\beta}\\in {\\mathbb{R}}^{p\\times 1}$, it means that we will hereafter write our equations for the approximation as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\tilde{y}}= \\boldsymbol{X}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"throughout these lectures. \n",
|
||
"\n",
|
||
"With the above we use the design matrix to define the approximation $\\boldsymbol{\\tilde{y}}$ via the unknown quantity $\\boldsymbol{\\beta}$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\tilde{y}}= \\boldsymbol{X}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and in order to find the optimal parameters $\\beta_i$ instead of solving the above linear algebra problem, we define a function which gives a measure of the spread between the values $y_i$ (which represent hopefully the exact values) and the parameterized values $\\tilde{y}_i$, namely"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\boldsymbol{\\beta})=\\frac{1}{n}\\sum_{i=0}^{n-1}\\left(y_i-\\tilde{y}_i\\right)^2=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}}\\right)\\right\\},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"or using the matrix $\\boldsymbol{X}$ and in a more compact matrix-vector notation as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\boldsymbol{\\beta})=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)\\right\\}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This function is one possible way to define the so-called cost function.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"It is also common to define\n",
|
||
"the function $C$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\boldsymbol{\\beta})=\\frac{1}{2n}\\sum_{i=0}^{n-1}\\left(y_i-\\tilde{y}_i\\right)^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"since when taking the first derivative with respect to the unknown parameters $\\beta$, the factor of $2$ cancels out. \n",
|
||
"\n",
|
||
"The function"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\boldsymbol{\\beta})=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)\\right\\},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"can be linked to the variance of the quantity $y_i$ if we interpret the latter as the mean value. \n",
|
||
"When linking (see the discussion below) with the maximum likelihood approach below, we will indeed interpret $y_i$ as a mean value"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"y_{i}=\\langle y_i \\rangle = \\beta_0x_{i,0}+\\beta_1x_{i,1}+\\beta_2x_{i,2}+\\dots+\\beta_{n-1}x_{i,n-1}+\\epsilon_i,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\langle y_i \\rangle$ is the mean value. Keep in mind also that\n",
|
||
"till now we have treated $y_i$ as the exact value. Normally, the\n",
|
||
"response (dependent or outcome) variable $y_i$ the outcome of a\n",
|
||
"numerical experiment or another type of experiment and is thus only an\n",
|
||
"approximation to the true value. It is then always accompanied by an\n",
|
||
"error estimate, often limited to a statistical error estimate given by\n",
|
||
"the standard deviation discussed earlier. In the discussion here we\n",
|
||
"will treat $y_i$ as our exact value for the response variable.\n",
|
||
"\n",
|
||
"In order to find the parameters $\\beta_i$ we will then minimize the spread of $C(\\boldsymbol{\\beta})$, that is we are going to solve the problem"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in\n",
|
||
"{\\mathbb{R}}^{p}}}\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)\\right\\}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In practical terms it means we will require"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\beta_j} = \\frac{\\partial }{\\partial \\beta_j}\\left[ \\frac{1}{n}\\sum_{i=0}^{n-1}\\left(y_i-\\beta_0x_{i,0}-\\beta_1x_{i,1}-\\beta_2x_{i,2}-\\dots-\\beta_{n-1}x_{i,n-1}\\right)^2\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"which results in"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\beta_j} = -\\frac{2}{n}\\left[ \\sum_{i=0}^{n-1}x_{ij}\\left(y_i-\\beta_0x_{i,0}-\\beta_1x_{i,1}-\\beta_2x_{i,2}-\\dots-\\beta_{n-1}x_{i,n-1}\\right)\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"or in a matrix-vector form as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = 0 = \\boldsymbol{X}^T\\left( \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can rewrite"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = 0 = \\boldsymbol{X}^T\\left( \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}^T\\boldsymbol{y} = \\boldsymbol{X}^T\\boldsymbol{X}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and if the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$ is invertible we have the solution"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\beta} =\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We note also that since our design matrix is defined as $\\boldsymbol{X}\\in\n",
|
||
"{\\mathbb{R}}^{n\\times p}$, the product $\\boldsymbol{X}^T\\boldsymbol{X} \\in\n",
|
||
"{\\mathbb{R}}^{p\\times p}$. In the above case we have that $p \\ll n$,\n",
|
||
"in our case $p=5$ meaning that we end up with inverting a small\n",
|
||
"$5\\times 5$ matrix. This is a rather common situation, in many cases we end up with low-dimensional\n",
|
||
"matrices to invert. The methods discussed here and for many other\n",
|
||
"supervised learning algorithms like classification with logistic\n",
|
||
"regression or support vector machines, exhibit dimensionalities which\n",
|
||
"allow for the usage of direct linear algebra methods such as **LU** decomposition or **Singular Value Decomposition** (SVD) for finding the inverse of the matrix\n",
|
||
"$\\boldsymbol{X}^T\\boldsymbol{X}$. \n",
|
||
"\n",
|
||
"**Small question**: Do you think the example we have at hand here (the nuclear binding energies) can lead to problems in inverting the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$? What kind of problems can we expect? \n",
|
||
"\n",
|
||
"\n",
|
||
"The following matrix and vector relation will be useful here and for the rest of the course. Vectors are always written as boldfaced lower case letters and \n",
|
||
"matrices as upper case boldfaced letters."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"4\n",
|
||
"3\n",
|
||
" \n",
|
||
"<\n",
|
||
"<\n",
|
||
"<\n",
|
||
"!\n",
|
||
"!\n",
|
||
"M\n",
|
||
"A\n",
|
||
"T\n",
|
||
"H\n",
|
||
"_\n",
|
||
"B\n",
|
||
"L\n",
|
||
"O\n",
|
||
"C\n",
|
||
"K"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"4\n",
|
||
"4\n",
|
||
" \n",
|
||
"<\n",
|
||
"<\n",
|
||
"<\n",
|
||
"!\n",
|
||
"!\n",
|
||
"M\n",
|
||
"A\n",
|
||
"T\n",
|
||
"H\n",
|
||
"_\n",
|
||
"B\n",
|
||
"L\n",
|
||
"O\n",
|
||
"C\n",
|
||
"K"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"4\n",
|
||
"5\n",
|
||
" \n",
|
||
"<\n",
|
||
"<\n",
|
||
"<\n",
|
||
"!\n",
|
||
"!\n",
|
||
"M\n",
|
||
"A\n",
|
||
"T\n",
|
||
"H\n",
|
||
"_\n",
|
||
"B\n",
|
||
"L\n",
|
||
"O\n",
|
||
"C\n",
|
||
"K"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial\\log{\\vert\\boldsymbol{A}\\vert}}{\\partial \\boldsymbol{A}}=(\\boldsymbol{A}^{-1})^T.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The residuals $\\boldsymbol{\\epsilon}$ are in turn given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\epsilon} = \\boldsymbol{y}-\\boldsymbol{\\tilde{y}} = \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and with"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}^T\\left( \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)= 0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we have"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{X}^T\\boldsymbol{\\epsilon}=\\boldsymbol{X}^T\\left( \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)= 0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"meaning that the solution for $\\boldsymbol{\\beta}$ is the one which minimizes the residuals. Later we will link this with the maximum likelihood approach.\n",
|
||
"\n",
|
||
"\n",
|
||
"Let us now return to our nuclear binding energies and simply code the above equations. \n",
|
||
"\n",
|
||
"\n",
|
||
"It is rather straightforward to implement the matrix inversion and obtain the parameters $\\boldsymbol{\\beta}$. After having defined the matrix $\\boldsymbol{X}$ we simply need to \n",
|
||
"write"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# matrix inversion to find beta\n",
|
||
"beta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(Energies)\n",
|
||
"# and then make the prediction\n",
|
||
"ytilde = X @ beta"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Alternatively, you can use the least squares functionality in **Numpy** as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"fit = np.linalg.lstsq(X, Energies, rcond =None)[0]\n",
|
||
"ytildenp = np.dot(fit,X.T)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"And finally we plot our fit with and compare with data"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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0mmMUVluDL7rV+4xD9nqLhERmXqUTmOMqsy90g5qVqh0j3ltQnuZi4jI1KMwH2N4rXfLssA3GAPl9d9obYhPZtNERETGpTAfY3g110jYxvIMvu+T94fDPDZ5DRMREdkBhfkYphzcdYkI0ZCF5xv6yku6ttSrMhcRkalHYT7G8H3mtm3RlIwCUCjvvtJSr8pcRESmHoX5GMPz3ywL6qLlpetDNvU1USLh0OQ1TEREZAcU5mMMz2a3LIu4EwIssC1dLxcRkSlLYT7GcGVuWxZewSMatjEhSzPZRURkyqr6FqhT3ba12Q25XJH6mijh+hgL5jZMZrNERER2SGE+RiXL/dLM9ob6GO8789BJbZOIiMjOaJh9jMp+5l5pBns0pt93RERkalOYj1GZze6VHkSimsEuIiJTm8J8jOFr5qZ8b3k0qspcRESmNoX5GKa8nqspV+bhiMJcRESmtp2Gue/7O/vytFSpzMvXzDXMLiIiU91Ow/zEE0/klltuYeXKldVqz6QzlTAfvmauylxERKa2nYb5jTfeyIYNG7jgggs477zz+P73v09vb2+12jYpyvusjAhzVeYiIjK17bTsPPXUUzn11FMZHBzkwQcf5P777+fWW2/lhBNO4LzzzuPkk08mHA5Xq61VYUYOszshIrpmLiIiU9yEJsDV1dWxbNkyfvzjH/PrX/+aww8/nC9+8YuccMIJ+7p9VTd8a5rvaphdRESCYZdmsxcKBV588UVeeOEFuru7Ofjgg/dVuybNcGXuawKciIgExITKzmeffZb777+fhx56iKamJt7znvdwww03MGfOnH3dvqrzDWAMxh0Oc1XmIiIyte00qb761a/yy1/+kv7+ft71rnfxrW99i2OOOaZabZsUxhiGV3QNR0LYtjW5DRIREXkDOw3z559/nquvvppTTz2VaDRarTZNKmMA32BZWjBGRESCYadp9d3vfrfy+IknnuBXv/oVvb29fOtb3+LFF18klUqxZMmSfd7IajLGYPm6LU1ERIJjQhPg7rrrLm688UYOOOAAnnnmGQBisRhf+cpX9mnjJoNvhv/H0rrsIiISCBMK8+9///t873vf4/LLL8e2S2858MADWbNmzT5t3GQwxmwbZldlLiIiATChME+n08yaNQsAyypNCHNdd9otGAOltdm3DbOrMhcRkalvQmH+tre9je985zujjv3gBz/g2GOP3SeNmkyVCXCg1d9ERCQQJpRW119/PR/96Ee59957SafTnHHGGSSTSb797W/v6/ZV3fAwO44mwImISDBMKMzb2tr42c9+xosvvsjGjRuZNWsWRx55ZOX6+XRSqsxLj8MRhbmIiEx9Ow3zTZs2jXre0tJCS0sLAFu2bAFg9uzZ+6hpk8M3BsuUhtkdZ/r9siIiItPPTsP85JNPrkx4G16zfCTLslixYsW+adkk8Y0pl+eWKnMREQmEnYb5woULyeVynHfeebznPe+hra2tWu2aNMPD7JYFIVXmIiISADsN81/84hesXLmS++67jwsvvJD58+dz7rnncvrppxOLxarVxqoylcocwmFV5iIiMvW9Yel58MEHs3z5ch599FEuueQSfv/733PCCSfw8ssvV6N9Vef7pfvMLcBRmIuISABMeBx57dq1PPPMM/zpT3/i0EMPpa6ubl+2a9IM72NuhSztmCYiIoGw02H2/v5+fvWrX3HfffeRTqc599xzufvuu6fdDPaRPK80xB4K6Xq5iIgEw07D/B3veAdz587l3HPP5aijjgJg3bp1rFu3rvKa6bZrmueWKnNNfhMRkaDYaZi3traSz+f5yU9+wk9+8pPtvm5ZFo888sg+a9xkUJiLiEjQ7DTMH3300Wq1Y8oYvmauMBcRkaDYaZgvXbqUE088kaVLl3L88ccTj8er1a5J47vla+aOZrKLiEgw7LT8vPfeeznyyCO5//77Oemkk7j00ku58847Wb16dbXaV3XDlbmWchURkaDYaWXe1tbG+973Pt73vvfhui7PPPMM//3f/81VV11FsVisVO6LFy8mEolUq837lDc8zB5WmIuISDBMeMNux3FYsmQJS5YsYfny5WzYsIHHHnuMu+++m1WrVvGRj3xkX7azanxXlbmIiATLhMN8rLlz5/LBD36QD37wg7v83n/5l3+hr6+Pm2++eXe//T5j/NI1c0eVuYiIBETVE+upp57ivvvuq/a3nbDhW9O0lKuIiARFVcO8v7+f2267jY9+9KPV/La7ZLgy161pIiISFLs0zP7pT396h1/74he/+Ibv//znP88111zD5s2bd+Xb7lBzc81eOU9ra23lcci2sW2LpqbkqOOyjfpl4tRXu0b9NXHqq4mbCX21S2H+4Q9/GIA777yTI444giOOOIKXXnqJV1999Q3fe++9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rWx3tbbW0lYfwxhDT08a21Z1vjOtrbV0dQ1NdjMCQX21a9RfE6e+mrjp0le2be20gK3qMPtxxx3HU089RW9vL9lslocffpgTTzyxmk3YjjGmMmKgUXYREQmiqlfm11xzDRdffDHFYpELLriAI488sppN2I7xh4Nc18xFRCSYqhrmAOeccw7nnHNOtb/tDvnDVbmG10VEJKBm/JJnfnkvc10rFxGRoJrxYW5UmYuISMDN+DD3fU1+ExGRYJvxYW5Ke6xgK81FRCSgZnyY+34pzTXMLiIiQaUwN5oAJyIiwTbjwzwWC2OHbBI1kcluioiIyG6p+n3mU00k6nDSmYfghGf87zUiIhJQMz7MAaIxdYOIiASXylEREZGAU5iLiIgEnMJcREQk4BTmIiIiAacwFxERCTiFuYiISMApzEVERAJOYS4iIhJwCnMREZGAU5iLiIgEXKDXMd1bO51px7Rdo/6aOPXVrlF/TZz6auKmQ1+90c9gGVPeA1REREQCScPsIiIiAacwFxERCTiFuYiISMApzEVERAJOYS4iIhJwCnMREZGAU5iLiIgEnMJcREQk4BTmIiIiAacwFxERCTiFuYiISMApzEVERAJuRof5Aw88wJlnnslpp53GD3/4w8luzpRz8cUXc9ZZZ3Huuedy7rnn8vzzz6vPxkilUpx99tls2LABgCeffJJzzjmH008/ndtuu63yuhUrVvDe976XM844g89+9rO4rjtZTZ5UY/vr05/+NKeffnrlM/bb3/4W2HE/zhRf+9rXOOusszjrrLO45ZZbAH22dma8/ppxny0zQ23ZssWcdNJJpq+vz6TTaXPOOeeYVatWTXazpgzf983xxx9visVi5Zj6bLQ//elP5uyzzzaLFi0y69evN9ls1ixdutS8/vrrplgsmg9/+MPm97//vTHGmLPOOsv88Y9/NMYY8+lPf9r88Ic/nMSWT46x/WWMMWeffbbp7Owc9bqd9eNM8MQTT5gPfOADJp/Pm0KhYC6++GLzwAMP6LO1A+P118MPPzzjPlsztjJ/8sknWbx4MQ0NDSQSCc444wweeuihyW7WlLF69Wosy+Jv//Zvec973sPdd9+tPhvjJz/5CTfccANtbW0AvPDCC+y///7MmzcPx3E455xzeOihh9i4cSO5XI43v/nNAJx//vkzst/G9lcmk2HTpk187nOf45xzzuH222/H9/0d9uNM0draynXXXUckEiEcDjN//nzWrl2rz9YOjNdfmzZtmnGfLWeyGzBZtm7dSmtra+V5W1sbL7zwwiS2aGoZHBxkyZIl3HjjjeRyOS6++GLe/e53q89G+MIXvjDq+Xifqc7Ozu2Ot7a20tnZWbV2ThVj+6unp4fFixfzj//4jyQSCa644gp++tOfkkgkxu3HmWLBggWVx2vXruXBBx/kQx/6kD5bOzBef/3oRz/i6aefnlGfrRlbmRtjtjtmWdYktGRqOvroo7nllltIJBI0NTVxwQUXcPvtt2/3OvXZNjv6TOmzNr558+bx9a9/nebmZuLxOB/60Id47LHH1F9lq1at4sMf/jDLly9nv/322+7r+myNNrK/DjzwwBn32ZqxYd7e3k53d3fl+datWyvDfwLPPvssTz31VOW5MYY5c+aoz3ZiR5+psce7urrUb8Brr73Gb37zm8pzYwyO4+j/m8Bzzz3HJZdcwic/+UnOO+88fbbewNj+momfrRkb5scddxxPPfUUvb29ZLNZHn74YU488cTJbtaUMTQ0xC233EI+nyeVSnHfffdx6623qs924qijjmLNmjWsW7cOz/P4z//8T0488UTmzJlDNBrlueeeA+AXv/iF+o3SP7A33XQTAwMDFItF/uM//oPTTjtth/04U2zevJkrr7ySL33pS5x11lmAPls7M15/zcTP1oy9Zt7e3s4111zDxRdfTLFY5IILLuDII4+c7GZNGSeddBLPP/88f/VXf4Xv+1x00UUcc8wx6rOdiEaj3HzzzXz84x8nn8+zdOlS3vWudwHwpS99ieuvv550Os1hhx3GxRdfPMmtnXwLFy7k8ssv58ILL8R1XU4//XTOPvtsgB3240xwxx13kM/nufnmmyvHli1bps/WDuyov2baZ8sy411EEBERkcCYscPsIiIi04XCXEREJOAU5iIiIgGnMBcREQk4hbmIiEjAKcxFREQCTmEuIiIScApzkWnEdV3e/e53c/rpp++1cw4MDHDIIYfwgQ98YNTxz3/+89x00017fP6vf/3rHH300aP+HHHEERxyyCH86le/2uPzi8wEM3YFOJHp6J577qG3t5fBwUEymQyJRGKPz7lixQpaW1v585//TFdXV2XXqRUrVnDRRRft8H1f/epXAfj4xz++0/NfeeWVXHnllZXn6XSaSy+9lMbGxr36S4nIdKbKXGSaGBoa4mtf+xqf+9znCIVCrFq1aq+c99VXX+Xwww/n+OOP55FHHgHA8zxWrlzJoYceule+x7BcLsdHP/pR4vE4t99+O+FweK+eX2S6UmUuMk184xvfYN68eZx99tl861vf4rXXXuOoo47a7nVXXHFFZWOOsY455hi+/e1vjzr2yiuvsHDhQt70pjfxwAMPsGzZMlavXo3v+8yfP3+vtb9QKHDVVVdRLBb593//d6LR6F47t8h0pzAXmQbWr1/PXXfdxR133AHAQQcdxGuvvTbua8eG9RtZsWIFp5xyCosXL+bGG28klUqxYsUKFixYsNcqZ9d1+cQnPkFPTw8/+MEP9srlAZGZRGEuMg3ceuutHHfccRx77LFAKcxH7ke/uwqFAqtXr+bQQw+lvr6eI444gv/+7/9mxYoVLFy4cLvXj6z68/k8AN///veB8at+AN/3ue6661izZg133XUXtbW1e9xukZlGYS4ScM8++yy/+c1vqKmp4fjjjwdK155te/wpMZdddtlOh9m/+93vVp6vXLmSWCzGvHnzADj11FN55JFH6O7u5rTTTtvu/SPDeqIT4G644QZeeOEF7r77bpqamnb6WhEZn8JcJMCMMdx8880sW7aMq666qnJ806ZNvP/972fTpk3Mnj171HtGhvUbWbFiBYcccgiWZQFw8sknc/vtt2Pb9huG9ER88Ytf5A9/+AM//OEPaWtr2+PzicxUCnORAPvlL39JT08P1157LclksnK8paWFZDLJa6+9tl2Y74oVK1aMmrE+d+5c5syZw2uvvTbuMPuuWLlyJXfeeSfhcJizzz571Nfi8TiPP/74DkcXRGQ0yxhjJrsRIiIisvv0a6+IiEjAKcxFREQCTmEuIiIScApzERGRgFOYi4iIBJzCXEREJOAU5iIiIgGnMBcREQm4/x8jLm31tc16WQAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<Figure size 576x396 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter1_132_0.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"Masses['Eapprox'] = ytilde\n",
|
||
"# Generate a plot comparing the experimental with the fitted values values.\n",
|
||
"fig, ax = plt.subplots()\n",
|
||
"ax.set_xlabel(r'$A = N + Z$')\n",
|
||
"ax.set_ylabel(r'$E_\\mathrm{bind}\\,/\\mathrm{MeV}$')\n",
|
||
"ax.plot(Masses['A'], Masses['Ebinding'], alpha=0.7, lw=2,\n",
|
||
" label='Ame2016')\n",
|
||
"ax.plot(Masses['A'], Masses['Eapprox'], alpha=0.7, lw=2, c='m',\n",
|
||
" label='Fit')\n",
|
||
"ax.legend()\n",
|
||
"save_fig(\"Masses2016OLS\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can easily test our fit by computing the $R2$ score that we discussed in connection with the functionality of **Scikit-Learn** in the introductory slides.\n",
|
||
"Since we are not using **Scikit-Learn** here we can define our own $R2$ function as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"def R2(y_data, y_model):\n",
|
||
" return 1 - np.sum((y_data - y_model) ** 2) / np.sum((y_data - np.mean(y_data)) ** 2)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and we would be using it as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 20,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.9547578478889096\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"print(R2(Energies,ytilde))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can easily add our **MSE** score as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 21,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.03787596148305236\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"def MSE(y_data,y_model):\n",
|
||
" n = np.size(y_model)\n",
|
||
" return np.sum((y_data-y_model)**2)/n\n",
|
||
"\n",
|
||
"print(MSE(Energies,ytilde))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and finally the relative error as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"A \n",
|
||
"1 0 inf\n",
|
||
"2 1 1.123190\n",
|
||
"3 2 0.327631\n",
|
||
"4 6 0.344172\n",
|
||
"5 9 0.044402\n",
|
||
" ... \n",
|
||
"264 3304 0.009911\n",
|
||
"265 3310 0.009154\n",
|
||
"266 3317 0.007824\n",
|
||
"269 3338 0.011347\n",
|
||
"270 3344 0.009790\n",
|
||
"Name: Ebinding, Length: 267, dtype: float64\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"def RelativeError(y_data,y_model):\n",
|
||
" return abs((y_data-y_model)/y_data)\n",
|
||
"print(RelativeError(Energies, ytilde))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### The $\\chi^2$ function\n",
|
||
"\n",
|
||
"Normally, the response (dependent or outcome) variable $y_i$ is the\n",
|
||
"outcome of a numerical experiment or another type of experiment and is\n",
|
||
"thus only an approximation to the true value. It is then always\n",
|
||
"accompanied by an error estimate, often limited to a statistical error\n",
|
||
"estimate given by the standard deviation discussed earlier. In the\n",
|
||
"discussion here we will treat $y_i$ as our exact value for the\n",
|
||
"response variable.\n",
|
||
"\n",
|
||
"Introducing the standard deviation $\\sigma_i$ for each measurement\n",
|
||
"$y_i$, we define now the $\\chi^2$ function (omitting the $1/n$ term)\n",
|
||
"as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\chi^2(\\boldsymbol{\\beta})=\\frac{1}{n}\\sum_{i=0}^{n-1}\\frac{\\left(y_i-\\tilde{y}_i\\right)^2}{\\sigma_i^2}=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}}\\right)^T\\frac{1}{\\boldsymbol{\\Sigma^2}}\\left(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}}\\right)\\right\\},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where the matrix $\\boldsymbol{\\Sigma}$ is a diagonal matrix with $\\sigma_i$ as matrix elements. \n",
|
||
"\n",
|
||
"\n",
|
||
"In order to find the parameters $\\beta_i$ we will then minimize the spread of $\\chi^2(\\boldsymbol{\\beta})$ by requiring"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\beta_j} = \\frac{\\partial }{\\partial \\beta_j}\\left[ \\frac{1}{n}\\sum_{i=0}^{n-1}\\left(\\frac{y_i-\\beta_0x_{i,0}-\\beta_1x_{i,1}-\\beta_2x_{i,2}-\\dots-\\beta_{n-1}x_{i,n-1}}{\\sigma_i}\\right)^2\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"which results in"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\beta_j} = -\\frac{2}{n}\\left[ \\sum_{i=0}^{n-1}\\frac{x_{ij}}{\\sigma_i}\\left(\\frac{y_i-\\beta_0x_{i,0}-\\beta_1x_{i,1}-\\beta_2x_{i,2}-\\dots-\\beta_{n-1}x_{i,n-1}}{\\sigma_i}\\right)\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"or in a matrix-vector form as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = 0 = \\boldsymbol{A}^T\\left( \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{\\beta}\\right).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where we have defined the matrix $\\boldsymbol{A} =\\boldsymbol{X}/\\boldsymbol{\\Sigma}$ with matrix elements $a_{ij} = x_{ij}/\\sigma_i$ and the vector $\\boldsymbol{b}$ with elements $b_i = y_i/\\sigma_i$. \n",
|
||
"\n",
|
||
"We can rewrite"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = 0 = \\boldsymbol{A}^T\\left( \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{\\beta}\\right),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{A}^T\\boldsymbol{b} = \\boldsymbol{A}^T\\boldsymbol{A}\\boldsymbol{\\beta},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and if the matrix $\\boldsymbol{A}^T\\boldsymbol{A}$ is invertible we have the solution"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\beta} =\\left(\\boldsymbol{A}^T\\boldsymbol{A}\\right)^{-1}\\boldsymbol{A}^T\\boldsymbol{b}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"If we then introduce the matrix"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{H} = \\left(\\boldsymbol{A}^T\\boldsymbol{A}\\right)^{-1},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we have then the following expression for the parameters $\\beta_j$ (the matrix elements of $\\boldsymbol{H}$ are $h_{ij}$)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\beta_j = \\sum_{k=0}^{p-1}h_{jk}\\sum_{i=0}^{n-1}\\frac{y_i}{\\sigma_i}\\frac{x_{ik}}{\\sigma_i} = \\sum_{k=0}^{p-1}h_{jk}\\sum_{i=0}^{n-1}b_ia_{ik}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We state without proof the expression for the uncertainty in the parameters $\\beta_j$ as (we leave this as an exercise)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\sigma^2(\\beta_j) = \\sum_{i=0}^{n-1}\\sigma_i^2\\left( \\frac{\\partial \\beta_j}{\\partial y_i}\\right)^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"resulting in"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\sigma^2(\\beta_j) = \\left(\\sum_{k=0}^{p-1}h_{jk}\\sum_{i=0}^{n-1}a_{ik}\\right)\\left(\\sum_{l=0}^{p-1}h_{jl}\\sum_{m=0}^{n-1}a_{ml}\\right) = h_{jj}!\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The first step here is to approximate the function $y$ with a first-order polynomial, that is we write"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"y=y(x) \\rightarrow y(x_i) \\approx \\beta_0+\\beta_1 x_i.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"By computing the derivatives of $\\chi^2$ with respect to $\\beta_0$ and $\\beta_1$ show that these are given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\beta_0} = -2\\left[ \\frac{1}{n}\\sum_{i=0}^{n-1}\\left(\\frac{y_i-\\beta_0-\\beta_1x_{i}}{\\sigma_i^2}\\right)\\right]=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\chi^2(\\boldsymbol{\\beta})}{\\partial \\beta_1} = -\\frac{2}{n}\\left[ \\sum_{i=0}^{n-1}x_i\\left(\\frac{y_i-\\beta_0-\\beta_1x_{i}}{\\sigma_i^2}\\right)\\right]=0.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"For a linear fit (a first-order polynomial) we don't need to invert a matrix!! \n",
|
||
"Defining"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma = \\sum_{i=0}^{n-1}\\frac{1}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma_x = \\sum_{i=0}^{n-1}\\frac{x_{i}}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma_y = \\sum_{i=0}^{n-1}\\left(\\frac{y_i}{\\sigma_i^2}\\right),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma_{xx} = \\sum_{i=0}^{n-1}\\frac{x_ix_{i}}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma_{xy} = \\sum_{i=0}^{n-1}\\frac{y_ix_{i}}{\\sigma_i^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we obtain"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\beta_0 = \\frac{\\gamma_{xx}\\gamma_y-\\gamma_x\\gamma_y}{\\gamma\\gamma_{xx}-\\gamma_x^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\beta_1 = \\frac{\\gamma_{xy}\\gamma-\\gamma_x\\gamma_y}{\\gamma\\gamma_{xx}-\\gamma_x^2}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This approach (different linear and non-linear regression) suffers\n",
|
||
"often from both being underdetermined and overdetermined in the\n",
|
||
"unknown coefficients $\\beta_i$. A better approach is to use the\n",
|
||
"Singular Value Decomposition (SVD) method discussed below. Or using\n",
|
||
"Lasso and Ridge regression. See below.\n",
|
||
"\n",
|
||
"\n",
|
||
"### Fitting an Equation of State for Dense Nuclear Matter\n",
|
||
"\n",
|
||
"Before we continue, let us introduce yet another example. We are going to fit the\n",
|
||
"nuclear equation of state using results from many-body calculations.\n",
|
||
"The equation of state we have made available here, as function of\n",
|
||
"density, has been derived using modern nucleon-nucleon potentials with\n",
|
||
"[the addition of three-body\n",
|
||
"forces](https://www.sciencedirect.com/science/article/pii/S0370157399001106). This\n",
|
||
"time the file is presented as a standard **csv** file.\n",
|
||
"\n",
|
||
"The beginning of the Python code here is similar to what you have seen\n",
|
||
"before, with the same initializations and declarations. We use also\n",
|
||
"**pandas** again, rather extensively in order to organize our data.\n",
|
||
"\n",
|
||
"The difference now is that we use **Scikit-Learn's** regression tools\n",
|
||
"instead of our own matrix inversion implementation. Furthermore, we\n",
|
||
"sneak in **Ridge** regression (to be discussed below) which includes a\n",
|
||
"hyperparameter $\\lambda$, also to be explained below."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 23,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Mean squared error: 12.36\n",
|
||
"Variance score: 1.00\n",
|
||
"Mean absolute error: 2.83\n",
|
||
"[ 0. 618.32047562 -861.13519106 1404.91549644] -11.057088709963637\n",
|
||
"Mean squared error: 197.93\n",
|
||
"Variance score: 1.00\n",
|
||
"Mean absolute error: 11.69\n",
|
||
"[ 0. 28.18220995 282.79902342 842.30879705] 12.946893955211749\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgAAAAFnCAYAAADQYfGFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABUG0lEQVR4nO3deXgV9d3//+dZsu/LyUIIBEjYV2UHiSA7RC1qi6jU5VZqXX6l1aoUtXKrWEv1W7Xa1rpSq3VFRAQVBGWTRRaBhD0he3KyryfJOfP7g7upyBKWJCfJeT2ui+vizJwz885nMpnXmfnMZ0yGYRiIiIiIRzG7uwARERFpfQoAIiIiHkgBQERExAMpAIiIiHggBQAREREPpAAgIiLigazuLqC1lZRU4XI1z52PERGBFBVVNsuy5Pyp/d1P28C91P7u15a3gdlsIiws4IzzPS4AuFxGswWA/yxP3Eft737aBu6l9ne/9roNdAlARETEAykAiIiIeCAFABEREQ+kACAiIuKBFABEREQ8kAKAiIiIB2rRAPDnP/+Z6dOnM2PGDF577TUANm3aREpKCpMnT+bZZ59tfG9qairXXHMNU6ZM4Xe/+x0NDQ0A5OTkcMMNNzB16lTuvPNOqqqqWrJkERERj9BiAWDr1q1s2bKF5cuX88EHH7B06VLS0tJYsGABL774IitXrmTv3r2sX78egPvvv5+HH36Y1atXYxgG7777LgCPPfYYc+bMYdWqVfTv358XX3yxpUoWERHxGC0WAIYPH86bb76J1WqlqKgIp9NJeXk5Xbt2JT4+HqvVSkpKCqtWrSI7O5va2loGDx4MwKxZs1i1ahX19fVs27aNKVOmnDS9o/rTn/7AzTfP4cYbr+Pyy0dy881zuPnmOXz66XJeeeVvvPLK31qtlsrKSh566DcA2O2F3HffvRe0nLFjhzb5nmuvTSE3N+ecahERkebRoiMBenl58dxzz/Hqq68ydepUCgoKsNlsjfOjoqLIz88/ZbrNZiM/P5+SkhICAwOxWq0nTb8YERGBF/X5H7PZgpptWU899TgAWVlZzJ07l08//aRx3vPPP9/s6zsbh6OMo0cPY7MFYbMF8cYbr13wspqq2WIxEx4ecMb3/bCW8122tDxtA/dS+7tfc22DOkcDVqsZs6V1uue1+FDA9957L7fffju/+MUvSE9PP2W+yWTCME4dRvFs0y9GUVHlWYdt/HjDMdJzy89pWd4+VuocDee87oTYYK4a263J9xUXV+F0uigsrGicVlXlIDV1H9dccx2FhQVMn57CbbfNw+l08uKLf2bnzh04nS6mT5/Jz352AwBvvvkqn3/+GWazmWHDRvLLX95LQUE+v/nNPYSEhOLt7cMzzzx/2s8/8sjvyc/P53/+Zx733vtr7rlnHu+//wl5ebk8+eRjlJQU4+vrywMPPExiYhJ/+9tf2LFjG+Xl5YSGhvLEE08TEREJcNLPAVBeXsaiRQ9TUJBPQkJ3ampqKS6uoqEhl8WL/5fCwgLs9kIGDx7CwoWLTqpl8eIljeuqrq4kMDD4pHVJ67LZgk7ZvtJ61P7u11zbIC2tgA3rjhEeFcCsWf2bobITzwI425feFosZR44cITU1FQA/Pz8mT57Mt99+i91ub3xPQUEBUVFRREdHnzS9sLCQqKgowsPDqaysxOl0njTdUxUXF/Pcc3/llVf+ydtvL6W6uopPPvkIgFdffYuXX36Db75Zz+7dO9m8eQMbNnzNK68s5dVX3yI7O5Nlyz4A4PjxDB555H/5859fPOPnf/Wr+4mMtLF48ZKTavjTn54iOXkCS5e+y6233sEbb7xCVlYmx4+n89e/vso773xIXFxnPv/8zJdq/vGPv9KzZ2/efPPfzJp1HcXFRQBs2rSBpKSe/O1vr/HOOx+xd+/3HDiQdlItP1zX6tWrm1yXiEhbZhgGW7Yc56svDuOoa8Blbb2b81rsDEBWVhbPPfccb7/9NgBr1qxh9uzZPP3002RkZNC5c2dWrFjBNddcQ1xcHD4+PuzYsYNLL72UZcuWMW7cOLy8vBg6dCgrV64kJSWlcXpLOpdv6P/R2ul75MjReHt74+3tTUhIKOXl5WzfvpVDhw6yY8d2AGpqqjly5DA5OdlMnDgFHx9fAGbMuJLPPvuU0aPHEhYWTmxsJ4Azfj4qKvq0Neza9R2///0TAIwaNZZRo8YCcPfd8/nkk2UcP57Bvn3fExfX+Yw/x86dO/j9758EYPDgS+jUKQ6ASZOmsn//Xt5991+kpx+jrKyMmppqQkJCGj/buXN847rs9twm1yUi0la5XAaff36IIwftgEF093Cumtqz1dbfYgEgOTmZ3bt3c/XVV2OxWJg8eTIzZswgPDyce+65B4fDQXJyMlOnTgVgyZIlLFy4kKqqKvr27cvcuXMBePTRR3nwwQd56aWXiI2N5Zlnnmmpkts8i8XS+P//XCJxOl388pf3kpw8AYDS0lL8/Hz5+99PvlvCMMDpPHG5wsfHp3H6mT5fXFx8hhr++ytjGAbp6cdwOBz8/ve/Y/bsOYwffwUWi/m0l29+WLvL5Trl53r//XdYt24tV175E669djjHjh05ZTlpaamN65oyZQoOR8NZ1yUi0hY5HA0sX55KQW45mEz0HBzLxLHdLvoy9/lo0T4A9957L/fee3Lv8VGjRrF8+fJT3tu7d2/ef//9U6bHxcWxdOnSFquxvbv00qEsX76MMWPGUVdXxy9/eRv33fcQl1wyjDfeeIWrrvoJFouVlSuXc8klp/bIP9PnO3eOb7z08kODBw/hyy8/56qrZrF9+7e8+urLJCePZ8iQS7n66muprKxkyZKnGDPmsjPWPHTocD7//DOSknqSmrqP7OwsALZt+5Yrr5zF5MlTOXr0CIcOHcTlcmGxWBpr2bVrR+O6fH1h69Zvz7ouEZG2pqK8lo8+2kdFWS1YzIy4LIGhA2NxOOuwmixYzJamF9IMWrwToLSsq6++lqysTG65ZQ5Op5Pp01MaD/SHDh3gttvm4nQ2MGLEKK655mcUFhac0+cbGhqIjo7hnnvmsWDBo43vnz//t/zhD4/z0Ufv/18nwIUEBgayYMH9/Pzns7FYrPTokXjW2/puu20eTzzxGDfe+FO6du3aeAngpz+dw5Ili3nnnaX4+wfQv/9AcnNzGDz4ksZaHnnkfxvX5evr0+S6RETakpycclauSMNRW4/Z28Kkab1I7BpGWvEhvs7eTOfAWKZ3m9QqtZgMDzt/2tRdAOdDPXDdS+3vftoG7qX2d7/z2QapBwpYv+YIzgYX3oHeXHVVPyLCfNicu43v7Sc6zQ+PuYRLowc1S21N3QWgMwAiIiItbMvWTL77NhPDMAiyBXDNVX2xeLv49NgXZFfmYjGZuSxuFH0iOkAnQBEREU/ncrn4/IvDHDlwoqd/TLcwrprei7K6MlYdWkN5XSV+Vj+mJownJuD0d1+1FAUAERGRFlBX38CyZfspzD1xiaDPkE6MH5vA0bIM1mZ+Q4OrgSj/SKZ0nUCgd0Cr16cAICIi0szKK2r58MN9VJXVYrKYGTkugSH9Y9iWv5Md+bsB6BnWg+TOo7Ga3XMoVgAQERFpRjl5FXy6PJW62nos3hYmT+9F57gAVqWvJb38OCYTjIodxsDIfq163/+PKQCIiIg0k9SDdtZ9eQhXgwvfQB+uvLovXgH1fHj4U0pqS/GxeDOp63jigzq5u1QFABERkeaweVsm323JBMMgONKfWT/pT1FDPp8cWo/DWUeYbyjTEq4gxCfY3aUCCgBtUnV1NS+99Dxbt27G19ePgIAAbr31DoYOHc7dd9/BrbfeccqofhUVFTzzzB84cuQQAJGRUcyffz/x8V3c8SOIiHgMl8vFqi8PcyytEIBO3cJImdaLvcX72ZK3HcOAbiFdmBA/Dm+Ll5ur/S8FgDbGMAweeGA+SUk9+ec/38PLy4uDB9O4//5f8eijj5/xc3/72wt0796j8T1ffLGKRx99iFdffau1ShcR8TgORwPvfbQPe3Y5YKLP4BjGje3CuqwNHCo5CsDQ6MEMjR7s1uv9p6MA8CPbNqQ33rLRFG8fK3WOhnNeti02iGFjE876np07d5CXl8dzz/218ZelZ8/e/Pznt/HGG6+c8XNFRUWEhYXjcrkwm81cccVk/Pz8z7k2ERE5P2UVDv759m7KCisxmc2MGpdAUu9glh1eSWFNEV5mKxO6jKN7SFd3l3parffgYTknaWn76d27zylJcfDgIaSm7j/j537+89v49NPlXHnlZB555CE+/XQ5w4aNaOlyRUQ8UnZeBe+8s5uKoiqs3hamzexNTA8z7x9aTmFNEcHeQfwkcUabPfiDzgCcoqlv6D/UMuNwm077FL76+rOfaejduw/vvvsx33+/m+3bt/LOO//k448/5K9/fRWrVZtZRKS57D9YyPovD+NqcBEU6sf0Gb3IJ4svjmzBabjoHNSJSV2S8bX6urvUs9IZgDamX7/+pKXtp6Hh5AP+3r176NOn72k/YxgGS5Ysxul0MmTIpdx++5288cY7lJaWcOjQgdYoW0TEI2zclslXq0/c5hcaGcDtdwxnf81uvs7ahNNwMdDWlxndJrX5gz8oALQ5gwYNoVu3Hvz5z39qDAFpaam8+eYr/Pznt532MyaTifT0Y7z99lJcLhcAdnshTqeTuLjOrVa7iEhH5TIMPv3iELs2HwfDoHNCGFdd05NPjq5iX9EBLGYLE+IvY0ynEZhN7ePQqscBX4SWehSnw1HL3//+Ips2bcBisRAUFMxtt81rvA1w//59WCz//QVbuvQ9rFYrzz//J/bu/R4/Pz8CAgK58857GDz4kmavr63Qo1DdT9vAvdT+raOuvoEPlqdSnF0OJhP9BsbQd1gwq9PXUmd24OXyZkrCBKL9be4u9SRNPQ5YAeAiaOdzL7W/+2kbuJfav+WVltfy4bL91JTWYLaYGTW2KwFdalmXtYEGl5NukXFcFjWWAK+2d9dVUwFAvcNERERO43hOOSs/TcNZU4+Xt4WJk5PI9zvG5uPfA9A7PIlZAydTUlTt5kovjAKAiIjIj+zen8/GdUcxGlz4B3ozeUYiu6q2cbwgG5PJxJhOw+kf0Qer2eLuUi+YAoCIiMj/MQyDtZvSSfsuFwyDCFsgydNi+SpvLWWOcnytPkzuOp64wFh3l3rRFABERESA+gYnH392gPxjJYCJbj0i6DnKh0+zPqfeWU+EXxjTEiYS5H3m6+rtiQKAiIh4vPKqOj78eD9V9ipMJhODLumEV49ivsjcDECP0ATGdx6LVxt6mM/FUgAQERGPllNYySfLU2moqsNqtTD68s5k+qWSkZ+FyQQjYoYy2Na/zT3M52IpAIiIiMfaf8jOui8PY9Q78fXzYszkWHbWfEtpeTk+Fm8mdb2c+KA4d5fZIhQARETE4xiGwTfbMvl+axa4DELD/Rk0IYANReuodzUQ4RfGlK5XEOIT5O5SW4wCQBuTm5vD9dfPIiGhOwCG4aKqqopp02YyZsxlLFv2AQ8++PApn3viid8zZMilTJ+eclHrr62t5aabfkZERAQvvvgPzOaLG9Ly+PEMnnji95SVlRESEsLChY8RH9/ltO994YX/x/r1a8nNzeHNN9+he/fEi1q3iMjpNDhdrPjiENmHisAwiOsSQtTQGr4p3AhAYmg3Lu88pkNd7z8dBYA2KDLSxuuv/6vxtd1eyOzZP+GKKyaf9uDfnHx9fXn77Q+46qopZGSk061b94ta3pIli5k16zqmTJnO6tUr+eMfn+S55/562vdedtnlXHfdbO666/aLWqeIyJlU1dTz4SeplOdVYDKZ6DkgktquGewuysZkgpGxwxgU2a/DXe8/HQWAH/n02BccL886p/d6+1ipc5z9Mb0/1CW4MzO6TTrvmux2O4ZhcOBAKkuWLOaFF/6OYRi88MKzbNy4gcjISFwuF0OGXArAX//6AuvWrSEkJJSIiEjGjh3H9OkpLF36Ol999QVOp4sRI0Zy5533nvaX3GKxEBISyuHDBy8qAJSUFHPwYBrPPvsXACZOnMKzzz5NSUkJYWFhp7x/0KDBF7wuEZGm5BdX8fHyVOrLHVgsZgaMDifD73vKKirwtfowqcvldA7q5O4yW40CQBtktxdy881zqKtzUFZWSu/e/XjyySV4ef33dNS6dWs4ePAA//znu1RUVHDzzbMB2LDha/bs2cXSpe9SU1PDbbfdyNix49iyZRMHDqTy8stvYjKZ+N//fYTPP/+MKVOmn7L+9957h7y8XA4dOsikSVNPmb9w4W/Jyjp9SPrb317Fx+fEYzDz8/OJjIzCYjkxUpbFYiEy0kZBQf5pA4CISEs5kF7MmtWHMBwN+PhY6Zvsx/76rdQ7Goj0C2dqwhUd5v7+c6UA8CPn8w29pR7E8Z9LAC6XixdeeJYjRw5z6aXD2LNnV+N7du7cQXLyeKxWK2FhYYwcOQaA7du/ZcKEiXh5eeHl5cVllyX/3/St7N+/l9tuuwk48cTB6OiYU9Z9/HgG77//DnfeeS+bN284bX2PP/50M//EIiItwzAMtuzK4btNx8HpIijYh85j69ldtQOApLDuJHceg5fZ8w6HnvcTtyNms5lf/vL/45Zb5vD220vp129A4zyTyXTSUw3/8y3bbDaf9mmHLpeTn/70embPvhGAioqKxs/8h9Pp5MknH2P+/PuJjY1j6dLXTlvXuZ4BiI6Oxm4vwOl0YrFYcDqd2O2FREVFn0criIhcGKfLxWfrjpKxrwAMg8hYX3wGFXCgKg+TycTo2GEMiOzrEdf7T+fiunhLi7Nardx11694883XKC4uapw+dOhwvvrqS+rq6igvL+fbb0+MVjVs2AjWr19LfX09VVWVbNq0AZPJxCWXDGP16pVUV1fT0NDAQw/9hnXr1py0rn/9ayk9eiQyatRYunTpSk1NNUVF9lNqevzxp3n99X+d9t9/Dv4AYWHhJCb25MsvVwPw5ZerSUrqpdP/ItLiqmvr+ffH+8nYm48JiOvlS12/I+TW5OFr9SGl+xQG2jyjs9+Z6AxAOzBy5Gj69evPyy+/hM0WBZzoMZ+aup+5c39GeHhE422Do0aN5fvv93DLLTcQHBxMZKQNb28fxo4dx+HDB7njjptxuZyMGDGaadNmNq7j6NHDrF69kpdffgM4cSYhMTGJQ4cOEhERecG133//Ah5//FFee+0fBAUF8fDDjzXOu+++e/mf//kFvXv3BeD//b8/sn79VxQXF/GrX91FcHAI//znuxe8bhHxTEVltXy0fD+OkhosZjNxl5rIDdyHs96JzT+CKV0neNz1/tMxGYZx6vniDqyoqPK0p8gvREv1AbgYe/fuITPzONOmzaShoYF5827hoYceITExyd2lNbu22P6eRtvAvdT+pzqaVcrqzw7iqqnHy9tC9MhqckwZAPQKT2Rc3CiszXi9vy1vA7PZRETEmYOOzgB0MF26dOXVV1/mnXfewjBcTJ06s0Me/EVEfmz73jy2fH0MU4MLvyAz/kMLyHEVYTaZGdNpOP0ienv0Kf8fUwDoYIKDQ3jmmefdXYaISKtxuQw+33CMw3vyMLkMAmMMjN4ZlLhq8LP6MrnreDoFnnrXk6dr0QDwwgsv8NlnnwGQnJzMb3/7Wx566CF27NiBn58fAHfffTeTJk1i06ZNLF68GIfDwbRp05g/fz4AqampLFy4kMrKSoYOHcpjjz2G1arcIiIiUONoYNmqAxRnlGIymQhKdFATl4nLcBHlH8mUrhMI9A5wd5ltUosdSTdt2sSGDRv46KOPMJlM/M///A9ffPEFe/fu5Z///CdRUVGN762trWXBggUsXbqU2NhY5s2bx/r160lOTub+++/n8ccfZ/DgwSxYsIB3332XOXPmtFTZIiLSTthLa1i2IhVHcQ0ms0HQwHIqQ/IA6B2exGVxI5v1en9H02K3AdpsNh588EG8vb3x8vKiR48e5OTkkJOTw8MPP0xKSgrPPfccLpeLPXv20LVrV+Lj47FaraSkpLBq1Sqys7Opra1l8ODBAMyaNYtVq1a1VMkiItJOHM4s4b33vsdRXIPZ14nf8HwqQ/KwmMyM6zyKyzuP0cG/CS3WOklJ/+14lp6ezsqVK/nXv/7F1q1bWbRoEf7+/sybN4/3338ff39/bDZb4/ujoqLIz8+noKDgpOk2m438/PyLqutsPSIvhM3WcR8V2R6o/d1P28C9PK39DcNg/dbjfP3FIah34h1Zh9fAfJzWesK9g7m6zxQ6B8e2ak3tdRu0eDw6dOgQ8+bN44EHHqB79+785S9/aZx30003sWzZMqZOPXW8eZPJxOnuULzYHpwd/TZAT6L2dz9tA/fytPZvcLpY9fVR0vcVgMuFNb6c+oR8GpwQ6xvN5PjL8XH4t2qbtOVt4NbbAHfs2MG9997LggULmDFjBgcOHCA9PZ0pU6YAJ5Kc1Wr9vyFj/zviXEFBAVFRUadMLywsPKnvgIiIeIaqmno++iyNsqxyMLsw987HFVWOyWRioK0vI2OGYjFbml6QNGqxPgC5ubncddddLFmyhBkzZgAnDvhPPvkkZWVl1NfX8+9//5tJkyYxaNAgjh07RkZGBk6nkxUrVjBu3Dji4uLw8fFhx44TD21YtmwZ48aNa6mSRUSkDSooruZf7+2hLKscl3cdDMzAFF2Bl8WLiV2SGdNphA7+F6DFzgC88sorOBwOnnrqqcZps2fP5o477uD666+noaGByZMnM3PmieFon3rqKe655x4cDgfJycmNlwWWLFnCwoULqaqqom/fvsydO7elShYRkTbmwLFi1nxxCKO2AWdwBfTOwepnIsQniCldJxDhF+7uEtstDQV8EdrytR9PoPZ3P20D9+rI7W8YBhu/y2bXlkxwOqmPKcTSrQgvbwsJwfFM6DIOH4u3u8ts09tAQwGLiEi70uB0sWLtYbLS7Bg04OieiW+nWqxWC8Oih3BJ1CAN6dsMFABERKTNqKiu46NP06jIraDBu5r6xEwCIsHX6svELsl0Ce7s7hI7DAUAERFpE3LtlSxfkUZDuYPaoCJcPXIJDPEm0i+cKQkTCPZun/fbt1UKACIi4nZ7D9v5es0RXI46qqKy8epaRqC/d4s8wldOUIuKiIjbGIbBuq3H2bc9Bxe1VHQ9RlCcC19vX8bEjaBveC9d728hCgAiIuIWdfVOln95iPzDxdR5V1Dd5RhhMV4E+QQxpet4ogM08FtLUgAQEZFWV1JRy0efplFdUElVcD4N8XmER/gRFxTLpC6X4+/l5+4SOzwFABERaVXHsstYveog9dU1lEVl4BVXSXiwP4Ns/RgZOxSzqcUGqZUfUAAQEZFWYRgG2/bmsXVDBg1GJWWdjxDcyUSQfyCXx48lMbSbu0v0KAoAIiLS4n74JL8anyIqO2UQGeNLZEAYUxImEO4b5u4SPY4CgIiItKjKmjqWrTxAaXYZZWGZOGPsREcGkBjWjcvjx+Jt8XJ3iR5JAUBERFpMrr2ST1akUVtVQXHMEXyi64gMC2Jk7DAGRvbVLX5upAAgIiIt4vuDhXzz1VFqKKY07gih0V7YQiKY1PVyYgOi3V2ex1MAEBGRZuUyDNZuziD1u2wqA3KoisohKjqArmFxTOqSjL+Xv7tLFBQARESkGTnqnCxbfYCCDDvFEUcxwsuJjQrkkphBjIi5RLf4tSEKACIi0iyKympZtiKV8nI7RTGH8As3iLaFM6HLZXQP6eru8uRHFABEROSiHTpewperD1FhyqW00zHCIn3paothctfxhPqEuLs8OQ0FABERuWCGYbBpZw47t6RTGpROTVgB0VGB9I/pxbjOo/HSU/zaLG0ZERG5IA1OFyvWHCbjcDb2yIOYgmuJiw4lucsoPcWvHVAAEBGR81ZW5WDZpwewl2ZRFHMYv2AzXWNjmNJtAtH+NneXJ+dAAUBERM5Lem45n32WRok5nfLoLMLC/Ogb152JXZPxs/q6uzw5RwoAIiJyTgzDYOv3eXy76RBFoYeoDygnyhbI2IShDI0erFv82hkFABERaVKD08VnXx3h4JGjFNkOYvF3khAbydTu4+kS3Nnd5ckFUAAQEZGzqqiu48MV+8mtOkJp9HH8A6307dKDqQkTCPQOcHd5coEUAERE5IyO55bz6Wf7KPA9QE14MaFhfoztMYRRscOwmC3uLk8uggKAiIic1va9uXyzeR/2sAMYPnXERYcyred4EkO7ubs0aQYKACIicpIGp4tV646yL2MfJZFH8fI10Su+CzOTJmpUvw5EAUBERBpVVNfx4af7yHB8T1VEIQH+3ozuOYjkeI3q19Foa4qICACZeeV8vHoX+f77qA+qITIskBn9LqdvRC93lyYtQAFARETYsS+PtVu3Uxx6GJPVoEdsDD/pN5VIv3B3lyYtRAFARMSDOV0uVq47zO7s7VSE5eLtbWFYj35MSbwcH4u3u8uTFqQAICLioSpr6nj3012kO3fhCK4gwN+HlIGXMziqnx7k4wEUAEREPNDx3HI++HILBQGpGF5OYsPD+dmQ6cQGRru7NGklCgAiIh7EMAy+3ZPNmu83Uh6UhcViZkB8Ij/pP1kP8vEwCgAiIh6iweli2Zd72VP6LY7Acrx9rEztO4bRXS7VKX8PpAAgIuIBSitq+ddnm8myfo/Tt56wgGBuGD6D+OBO7i5N3KRFn934wgsvMGPGDGbMmMHTTz8NwKZNm0hJSWHy5Mk8++yzje9NTU3lmmuuYcqUKfzud7+joaEBgJycHG644QamTp3KnXfeSVVVVUuWLCLS4RzOKOGlTz4hw3snLmsDPaMTuDf5Rh38Pdw5BYDa2loOHDiAYRjU1tae04I3bdrEhg0b+Oijj1i2bBn79u1jxYoVLFiwgBdffJGVK1eyd+9e1q9fD8D999/Pww8/zOrVqzEMg3fffReAxx57jDlz5rBq1Sr69+/Piy++eIE/qoiIZzEMgzXfHmLplg8o9T+O1WpmUq9R3DLiJ/h7+bm7PHGzJgPArl27mDhxIvPmzSM/P5/k5GS+++67Jhdss9l48MEH8fb2xsvLix49epCenk7Xrl2Jj4/HarWSkpLCqlWryM7Opra2lsGDBwMwa9YsVq1aRX19Pdu2bWPKlCknTRcRkbOrq2/gjU83sib7M2p9ygjw8ee2UbO4otcozKYWPfkr7USTfQCefvppXn/9de677z5iYmJ4+umneeKJJ/jggw/O+rmkpKTG/6enp7Ny5UpuuukmbDZb4/SoqCjy8/MpKCg4abrNZiM/P5+SkhICAwOxWq0nTb8YERGBF/X5H7PZgpp1eXJ+1P7up23gXqdr/zx7BX/5ZAX5lqNghe4R8fx/U39GkG/z/v2TE9rrPtBkAKitrSUxMbHxdXJy8knX7pty6NAh5s2bxwMPPIDVauXYsWMnzTeZTBiGccrnzjb9YhQVVeJynbrcC2GzBVFYWNEsy5Lzp/Z3P20D9zpd++86mM2y3auo8SrFbDIzqsslzBx0GbUVBrUV2lbNrS3vA2az6axfepsMAFarlbKyssYD79GjR8955Tt27ODee+9lwYIFzJgxg61bt2K32xvnFxQUEBUVRXR09EnTCwsLiYqKIjw8nMrKSpxOJxaLpXG6iIiczDAMPvpmB9vtm3F61eFj8eGnQ6bRv3MPd5cmbVSTF4J+8YtfcOONN5KXl8evf/1rrr/+eu68884mF5ybm8tdd93FkiVLmDFjBgCDBg3i2LFjZGRk4HQ6WbFiBePGjSMuLg4fHx927NgBwLJlyxg3bhxeXl4MHTqUlStXnjRdRET+q6qmjuc/WcG3xV/jNNdh87Xx6yvm6uAvZ2UyTnee/UcyMjLYuHEjLpeLkSNHnnRJ4Ewef/xxPvjgA7p06dI4bfbs2SQkJLB48WIcDgfJyck89NBDmEwm0tLSWLhwIVVVVfTt25fFixfj7e1NdnY2Dz74IEVFRcTGxvLMM88QEhJywT+wLgF0HGp/99M2cC+bLYjNu4/yry0rqDIXYzLBwMgB/GzUFVjMFneX5xHa8j7Q1CWAMwaAffv2nXXB/fr1u7jK3EQBoONQ+7uftoF7bUhLY2XqFzhNdXiZvEnpM5ERPfu4uyyP0pb3gQvuA3DPPfec8UMmk4k1a9ZcXGUiInJBHPX1vPbVF6TXpGGYDEItEdw69iqiw8LcXZq0I2cMAGvXrm38f2VlJYGBgTgcDiorK4mIiGiV4kRE5GTZRcW8tmE5FUYRJpOJXkF9mXv5ZKwWnfKX89NkJ8CVK1cya9Ys4MSwvDNnzjwpHIiISOv4JnUfL37zFhVGEVa8ua7/TG69YpoO/nJBmgwAf/3rX3nzzTcB6NatGx9++CHPP/98ixcmIiInOF1OXlu/ihUHVtNAHUGE84tR1zN15KXuLk3asSbHAXC5XMTExDS+jo2NxeVytWhRIiJygr28jJe/WUZpvR0w0c27F7dMnIKPt5e7S5N2rskzAOHh4bzzzjs0NDTgdDp5//33iYyMbI3aREQ82rajB3j2q6WU1tuxuryZEDuBedNm6OAvzaLJMwCPPfYYv/nNb1i0aBEmk4l+/fqxZMmS1qhNRMQjOV1O/r11LbvzvwfDILAhnNnDppHUNabpD4ucoyYDwH+u+5eVlWGxWAgM1MMkRERaSnF1Gf/45mOKagoBE52NJG6dPoUAfx93lyYdzBkDwMsvv8ztt9/O//7v/572ATwLFy5s0cJERDzNd5lpfLj7C+ob6rA4vRkePoorky/BbNbje6X5nTEABAWdeLxhmAaWEBFpUQ2uBt7/bg27cvZhuAwC6sL5ycDJDOgd5+7SpAM7YwCYPXs2cKIT4Jw5c06a9/e//71lqxIR8RD26hJe2/Qx9qoiTIaJTvU9mTv5CsJC/d1dmnRwZwwAb7/9NrW1tbz++us4HI7G6fX19SxdupQ77rijVQoUEemIDMPgu+z9fLR7LfX1dVgbfBkSNJyfpFyKxaJT/tLyzhgArFYrBw8epLa2loMHDzZOt1gsPPzww61SnIhIR1TnrOfDPV+yKzMVw2UQWGtjRr/xXDIg3t2liQc5YwC47rrruO666/jyyy+ZOHFia9YkItJh5VcV8ubWFdjLizG5zHSq7cX1k5KJitQdVtK6mrwN8Nlnn1UAEBG5SIZhsD3ne5bvWUedox6ven/6+w3jmpQheFk1lr+0viYDQM+ePXnppZcYOnQo/v7/7ZTSr1+/Fi1MRKSjqG2o5aO9X7In8xAup4ugqhgm9r6MkZd2cXdp4sGaDAC7d+9m9+7dvPfee43TTCYTa9asadHCREQ6guyKXN757jMKSkswO610qu7NdRPH0ikmyN2liYdrMgDo0b8iIufPZbjYkv0dq/ZuwlFbj3ddIL29LuGa64bg69Pkn16RFtfkb2FxcTHLly+nqqoKwzBwuVxkZGTwpz/9qTXqExFpdyrqKlm2/wv2Z6bjchqEVMQxNnEk40YluLs0kUZNBoBf/epX+Pr6cvjwYUaPHs2mTZu49FI9g1pE5HSOlB7jg91fUlRajqXBm7iqXlw9YThdOoe6uzSRkzQ52kROTg5///vfGTduHDfeeCNvv/02x48fb43aRETajQZXA2uOfcMbW5ZTVFKOX3UY/RjN7deN18Ff2qQmzwBERkYCkJCQwMGDB7nyyitpaGho8cJERNqLopoSlqV+zuHsHAynQVhpAqN7Xsplo7qe9mFqIm1BkwEgIiKCf/zjHwwePJjnn3+ewMBAKisrW6M2EZE2zTAM9hWlsWLfekpKq/Gq9yW6ojdXTrqUrp1D3F2eyFk1GQAWLVrEp59+ytChQ+nfvz/PPfcc9913X2vUJiLSZtU21PLlsW/YeiQVR209AZU2En0HcvXsfvj7ebm7PJEmmQzDMJp6k9Pp5MCBA5jNZnr16tWuT2kVFVXicjX5I58Tmy2IwsKKZlmWnD+1v/t56jbIqcxjedqXZOQVQr2JsJLujOw9iMtGdWnVv4+e2v5tSVveBmaziYiIMw8x3eQZgO3btzN//nwsFgsulwsvLy9efPFFevXq1ayFioi0dS7Dxfa8XXx5cAvlpTV4OQKJqezDjEkDSYgPdXd5IuelyQDw+OOP88QTTzBu3DjgxMBAjz76KO+8806LFyci0laU11Ww6shX7M04hqPWSXB5HN38enPV9X0J8PN2d3ki5+2cHjr9n4M/wIQJE6ipqWmxgkRE2ppDJUd4fdf77Dx8hIYqM1GFfRmbOIrrrx2kg7+0W02eAejduzcrV65k+vTpAGzYsIGePXu2eGEiIu5W56zj66zNfHt0L+XltfhXhRNV05Pp0/qrl7+0e012ApwwYQI5OTmEhIRgtVopKirCx8cHs9mMyWTiu+++a61am4U6AXYcan/368jbIL+qgM+OfMWR7Dzqa12ElSTQNSyRq6b1wc+3bYzl35Hbv71oy9vgojsBLl26tFkLEhFpy1yGi50F37Pu6LfYCyux1voTU9KT4Zf2ZNSlce36LiiRH2oyAMTFxbVGHSIibldZV8UXGevZm3mUygoHQWWxRDsTmX5VH+L0+F7pYNrGeSwRETc7WpbOF0e/JjO3GFetGZu9N906dSdlShLeXvpTKR2PfqtFxKPVO+vZkPMt24/vpbioGp+qUCLKEhk5KpGhA2N1yl86rCZvA/ztb3/bGnWIiLS6/OpC/n1gGd8c2ElRYQ0hRV3pXD+Qn153KcMGddLBXzq0Js8ApKWlYRiGdgQR6TD+09Fv4/Ft5BdUYqr2IaaoD90S4pl2RSLeXhZ3lyjS4poMADabjRkzZjBo0CACAgIapy9cuPCcVlBZWcns2bP561//SufOnXnooYfYsWMHfn5+ANx9991MmjSJTZs2sXjxYhwOB9OmTWP+/PkApKamsnDhQiorKxk6dCiPPfYYVquuXIjIhamoq2TN8a9Jy0mntLSWwLIYwqoTGJucyKA+Ue4uT6TVNHkkHTJkCEOGDLmghe/evZuFCxeSnp7eOG3v3r3885//JCrqvztabW0tCxYsYOnSpcTGxjJv3jzWr19PcnIy999/P48//jiDBw9mwYIFvPvuu8yZM+eC6hERz3ao5Cjrjm8kK6+E+koTkUW9iAqKI+X63oQF+7q7PJFW1WQAuPvuu6mtrSUjI4OkpCTq6urw9T23HeXdd9/l0UcfbexHUF1dTU5ODg8//DA5OTlMmjSJu+++mz179tC1a1fi4+MBSElJYdWqVSQmJlJbW8vgwYMBmDVrFs8995wCgIicF4ezjg3ZW9idk4a9sArvyhBiSnrQZ0A8E8YkYDGf06joIh1KkwFg9+7d3HXXXVitVt555x2uuuoqXnrpJS655JImF/7EE0+c9LqoqIiRI0eyaNEi/P39mTdvHu+//z7+/v7YbLbG90VFRZGfn09BQcFJ0202G/n5+efz853ibKMiXQibTfcGu5Pa3/3a+jbIKstledoXHMnKpby4jtCSBMJN8Vx9wwD6JEa6u7yL1tbb3xO0123QZAD4wx/+wOuvv859991HTEwMTz/9NE888QQffPDBea8sPj6ev/zlL42vb7rpJpYtW8bUqVNPea/JZOJ0oxRfbGdEDQXccaj93a8tbwOny8mOgt1szd5JfkEFVPgSZe9PTGwMKVN7EeDn1WZrP1dtuf09RVveBk0NBdzkea/a2loSExMbXycnJ+N0Oi+omAMHDrB69erG14ZhYLVaiY6Oxm63N04vKCggKirqlOmFhYUn9R0QETmdUkcZHx3+lPVHtpKdXY5vYTTR9gEMH9Gbn13djwA/L3eXKOJ2TQYAq9VKWVlZ4zfvo0ePXvDKDMPgySefpKysjPr6ev79738zadIkBg0axLFjx8jIyMDpdLJixQrGjRtHXFwcPj4+7NixA4Bly5ad9GhiEZEfMgyDfUUH+HfaMvZlZFCa10Bkbm+ijZ7MunYgoy/trFuaRf5Pk5cA7rzzTm688UYKCwv59a9/zcaNG1m0aNEFrax3797ccccdXH/99TQ0NDB58mRmzpwJwFNPPcU999yDw+EgOTm58bLAkiVLWLhwIVVVVfTt25e5c+de0LpFpGOrrq9hXdYGDhQcw15YhU9ZODEl3YhPimba+B74eOv2YZEfavJxwAAZGRls3LgRl8vFyJEjT7ok0N6oD0DHofZ3v7ayDdLLj/PV8Y3k2oupLGkgtCiBIFcMYy/vzoCetqYX0E61lfb3ZG15G1z044AB6urqqKurw2w2axAeEWkz6p31bMrdxp78/RQUVGEu8ye6qA/hUZGkTO1FaJCPu0sUabOa7APw9ttvM3fuXFJTU9mzZw9z5sxh5cqVrVGbiMgZ5VcX8t6hj9masYfc7Er88+KwFfVj8NBEbrh2gA7+Ik1o8uv866+/zrJly4iOjgYgJyeHO+64g+nTp7d4cSIiP+YyXHxXsIetOd9RaK+iodSKzd6PQL8wpl7Tk/iYYHeXKNIuNBkAAgMDGw/+AJ06dcLb27tFixIROZ1SRxlrj39DRnEO9sIq/EqiCS/rQnySjanje+Crjn4i56zJvWXo0KE8+uij3HDDDVgsFj7++GMSEhLYt28fAP369WvxIkXEs524vS+NTTnbKCyqoKbEINzeC38iGDupGwN6aXwQkfPVZAD44osvAPjmm29Omn7PPfdgMplYs2ZNy1QmIgJU1VezLnMDR4qPU1hYiVdxGNHFCYTGhDFzai/CdK1f5II0GQDWrl3bGnWIiJziSGk667M2UVhSRnlRPaH27vjX2eg/Io7LhsZjNmtQH5ELpQtmItLm/Ofpfan2Q9gLq6AkgKii3gQEhzDtyp7ERTXvQ71EPJECgIi0KdmVuaw9/g0FpSUU22sJsncmoDqGbn2jmTKuG15Wi7tLFOkQFABEpE1ocDWwNe87duXvpaiomvoSL2yF/fD1CeHymd3pnRDh7hJFOpQmA8A999zD9ddfz+jRo1ujHhHxQAXVhazN3EBemR17YRX+9ljCyuOI7BrGzElJBPrp1mOR5tbkSICTJ0/mxRdfZMqUKbzyyiuUlpa2Qlki4gmcLifb83bywaEVHM3NoSiznvDMPoTWdGXE+B78LKWvDv4iLaTJMwApKSmkpKRw5MgRPvjgA6677joGDx7MTTfdxMCBA1ujRhHpgEpqS1mb+Q3ZZfkUFlbiY48iujSeQFswM6f2JDLUz90linRo59QHwOVykZGRQXp6Og0NDURERPD73/+eUaNGcf/997d0jSLSgRiGwR77fr7N20FxSRVVRS5CC3ri4wyj77BOJA+Px2Ju8uSkiFykJgPAs88+y4cffkh8fDxz5szhz3/+M15eXlRXVzN+/HgFABE5ZxV1lazN/IbjpdnYC6uwFIUTVdwFv9Agpk5OonN0kLtLFPEYTQaA4uJiXn75ZXr37n3SdH9/f/70pz+1WGEi0nEYhkFaySE2Zn9LSXkVZfZ6Qgq64+eIoPuAaCaNTdDtfSKt7Jz6AFRUVLBt2zYATCYTvr6+JCQkMHbs2BYvUETat6r6atZnbeRoyXGK7NVQFERUUW98AgKZMKUHSV3C3F2iiEdqMgA89dRTpKWlkZiYiMVi4eDBg9hsNmpqanjiiSeYOHFia9QpIu2MYRgcLj3GhpwtFJdXUFpYR1BhPH41Njr1iGD6hET8fDQUiYi7NLn3derUiQceeIARI0YAsGfPHl5//XV++9vfcueddyoAiMgpahpq+CZrC4dKjlFUVIWryJ9IexLePoGMmdyNAUmRmEwax1/EnZoMAJmZmY0Hf4CBAweSnp5OTExMixYmIu3TsbIM1mdtoriigpLCWgIL4wmoiiKiSyjTJyYSEqCn94m0BU0GAKvVyoYNGxqv92/YsAEvLy+Ki4tpaGho8QJFpH2obXCwMedbDhQdpri4moYiXyIL++PlFcDwCV24tG+MvvWLtCFNBoBHH32Ue++9F5PJhGEYeHt789xzz/GPf/yD2bNnt0aNItLGHS/PYl3WRooqyigurCWgMI7QyhhCOwUzY3ISYUG+7i5RRH6kyQBQUFDAmjVrOHjwIBaLhR49emCxWE65LVBEPI+joY51WRvZbz9ASXENdUVeRBT2xcsSxCWXxTNiUCxmfesXaZPOaSCgiRMn0qdPn9aoR0TaicyKHLYc+5acQjv2whr8C2OxVXQiOCaI6ZOSNJSvSBvXZADo2bMnL730EkOHDsXf379xer9+/Vq0MBFpm+qc9WzJ3cZeexoVFQ6q881EFPbBiyAGjIxjzKVxGspXpB1oMgDs3r2b3bt389577zVOM5lMrFmzpkULE5G2J7syl68yN1BUUUqRvQZ/eyy20lgCbIFMm9KTmHD/phciIm1CkwFg7dq1rVGHiLRh9c56NuduZ689ldLSWhx2C2GFffA1B9N7eAyXDYvHatG3fpH2pMk9tqqqikWLFvHzn/+c0tJSHnnkEaqqqlqjNhFpA7Irc3n34DJ25u4lL6cSMiKx5fQlJMTGLf8znPEju+rgL9IONbnXPv744wQFBVFUVISPjw+VlZU88sgjrVGbiLhRvbOer7M28/Hhz8jIL6Q4w0VYRm+Cq+LpM6wLc382kPiYYHeXKSIXqMlLAKmpqSxevJj169fj5+fHkiVLmDlzZmvUJiJucvK1/mp8C2OxlcXibwtk2sQkYm2B7i5RRC5SkwHA/KPevE6n85RpItIx/LCHf2lJDbVFVsIK++BlBNFnWCeSh+tav0hH0WQAGDZsGH/84x+pra3lm2++4a233jrp2QAi0jFkVuSwLmsDRRVlFBXW4GePJqqsEwG2IKZOSiQ2Ut/6RTqSJgPAfffdx9///neCgoJ49tlnueyyy/jlL3/ZGrWJSCtwOOvYnLON/UX/Gc3PSri9D94E0W9EJy4b1ln39Yt0QCbDMAx3F9Gaiooqcbma50e22YIoLKxolmXJ+VP7X7yM8kzWZ206MYa/vQa/wliCyzsRGH3iWn90RMBZP69t4F5qf/dry9vAbDYREXHmM3dNngHYunUrzz//PGVlZfwwK3zyySfNU6GItLrahlo25mxtfHJffbE3EfZ+eJkCGTSmM6OHxGE2awx/kY6syQCwaNEirrnmGvr27atHeYp0AEfL0vk6awvFFeUUF9YQYI8jtDKWkNggpk3UGP4inqLJAODl5cUtt9zSGrWISAuqaajhm+wtHCo+SlFRNc5iXyLt/fC2BHHpuC4MGxijJ/eJeJAme/YkJSVx4MCBC1p4ZWUlM2fOJCsrC4BNmzaRkpLC5MmTefbZZxvfl5qayjXXXMOUKVP43e9+R0NDAwA5OTnccMMNTJ06lTvvvFMjEIpcAMMwOFhymLfTPmJP9kFyM6vwPh6HLb8vUbEx3HDDYD22V8QDNRkAMjMzueaaa5g8eTIpKSmN/5qye/durr/+etLT0wGora1lwYIFvPjii6xcuZK9e/eyfv16AO6//34efvhhVq9ejWEYvPvuuwA89thjzJkzh1WrVtG/f39efPHFi/hRRTxPZV0VK499wefH1nM8x05FpgVbZn9CnJ0ZMzGR66/uR0igj7vLFBE3aPISwPz58y9owe+++y6PPvoov/3tbwHYs2cPXbt2JT4+HoCUlBRWrVpFYmIitbW1DB48GIBZs2bx3HPPcd1117Ft2zb+8pe/NE6/8cYbuf/++y+oHhFPYhgG+4rS2JK7neKySsqL6gmyd8G/2kan7uFMmdCDQD9vd5cpIm50xgCQk5NDp06dGD58+Cnzvv766yYX/MQTT5z0uqCgAJvN1vg6KiqK/Pz8U6bbbDby8/MpKSkhMDAQq9V60vSLdbZbIi6EzRbUrMuT86P2P1VxdSmfHfqKo/Ys8vIqMBUHEV3cB//AYKbP6c3A3tHNuj5tA/dS+7tfe90GZwwAd911Fx999BEA99xzD88//3zjvGeffZZx48ad14pON9yAyWQ67+kXS+MAdBxq/5M5XU522/exLW8nxSVVVBU7CbEn4OeIoFsfG1eM7Yavj7VZ20zbwL3U/u7XlrfBBY8D8MMDcGZm5hnnnavo6Gjsdnvj64KCAqKiok6ZXlhYSFRUFOHh4VRWVuJ0OrFYLI3TReRUhdVFrMvaQHZpAXZ7Fd4l4USVdCEgJJiJMxLp2klP7RORk52xE+APv23/+Jv3hXwTHzRoEMeOHSMjIwOn08mKFSsYN24ccXFx+Pj4sGPHDgCWLVvGuHHj8PLyYujQoaxcufKk6SLyXw2uBjbnbuf9g8s5kJWJPauOsKyeRJQl0f+SBH4+Z7AO/iJyWud0BqA5+Pj48NRTT3HPPffgcDhITk5m6tSpACxZsoSFCxdSVVVF3759mTt3LgCPPvooDz74IC+99BKxsbE888wzzVqTSHuWXZnL+qyN5JYUUVxUg19JFNGlnQmJDmHapCRsYf7uLlFE2rAzBgCXy9U4/K/T6TxpKGCn03nOK1i7dm3j/0eNGsXy5ctPeU/v3r15//33T5keFxfH0qVLz3ldIp6gtsHB5txt7Cs8gN1ejbPMSkRRb/xMYQxN7sLQATEatVNEmnTGAHDw4EFGjhzZeND/4SOA9cdFpPUZhsGRsnQ2ZG8hv7iUshIHgcWdCK7oRExCOFOuSCTIX7f2ici5OWMASEtLa806ROQsKuuq+CZ7MweL0rEXVmEq9yeqOAl/nxCSZ3anV7cId5coIu1MkwMBiYj7uAzXiQF9craTb6+guryBkOJ4AmpiSOoXzfgxCXh7Wdxdpoi0QwoAIm1UUU0x67M2cawomyJ7Nd4VocQUJxASHsaUlERibM07qJWIeBYFAJE2psHVwI783ezI20NBYSX1FRBWnEig08Ylo+MZPriT+uGIyEVTABBpQzIrcvg6axOZhYWUldbgXx5FRGkX4rpGMvmKJAL9vdxdooh0EAoAIm1ATUMNm3K28X3eAez2KqjywVbUl2CfSC6f2YPEhDB3lygiHYwCgIgbGYbBgZLDbMzeSnZBCTUV9QSVxhFSFUefQXGMGxWP1aJOfiLS/BQARNykpLaUr7M3cyAvg5LiGryrTjy1L8pmY8rVSUSE+rm7RBHpwBQARFpZg6uB7wr2sDV7F/mFFTirTYSVdCfEiGHUhG4M7K2HXolIy1MAEGlF/+nkdzQ3j6qKOgIqbISUdyGpVyeuGNdd9/SLSKtRABBpBdX1NWzK3crOrDSKi6ux1PgQVdwHW3Ask65LIsYW4O4SRcTDKACItCDDMNhffJBvjn9Ldn4J9TUuQsriCKuLZ/joBIb014N7RMQ9FABEWoi9poh1mZtIzTpOVYUDn5oQYku6kdijMxOTu+Hjo3v6RcR9FABEmlmds55t+d+xKX0XxUXVmOqsRJQkEu0fz6RZScRGawhfEXE/BQCRZvKfx/WuPbaJzHw7dbVOgiqiiahNYMSI7gwZoNP9ItJ2KACINIMyRznrMjexO+MwVZUOvB2BxJZ0p1f3rkxI7o6Pt3Y1EWlb9FdJ5CL8557+dUe2U1JcBfVmwku70dm/OxNnJRKtJ/aJSBulACBygY6XZ7H68Ddk5OdT73ASUGUjqrYHY0YmMqBftLvLExE5KwUAkfNUUVfJuoxN7Eg/QE11HV51/sSUdmdAYiLJY7vi5aXdSkTaPv2lEjlHTpeTnQXf8+WBbyktqwKnmdDSrnQPSmLStT0JD9PY/SLSfigAiJyDzIpsVqSuJ7MwH2e9C//qCDrVJ3F5cm+Suke4uzwRkfOmACByFhV1lXxxZCM7M9Koq23Aq8GPqPLuDO/blxHDOmOxmN1doojIBVEAEDkNp8vJttzdfJH2LZWV1ZhcFsLKutA3qh8TZyTi7+ft7hJFRC6KAoDIj6SXZ7Jsz1fkldgxnAb+1RF0M/dm0tS+xMYEu7s8EZFmoQAg8n/KHBV8sn89+3MO46x34lXvR3RNEuOHDqRfnyiN4iciHYoCgHi8elcDXx/dzvrD23A46jC5LIRXJDAiYTBjRydgtVrcXaKISLNTABCPZRgG+woOs/z7dZRVVYBhEFBto1/wQKbM6kNgoI+7SxQRaTEKAOKR8qvsvP/dWjJLsjBcBt51ASTQh2mXD6FTJ13nF5GOTwFAPEpNfS0f7/mG3bn7cDU4MbusxDi6M3nQcProOr+IeBAFAPEILsPF+sM7+erQFhx1tYCJ0JpOjOk6lNHDu+s6v4h4HAUA6fD256WzbNdayhwlYIBvXQiDQ4YwdcpA/Py83F2eiIhbKABIh1VQXsK/t68hq/I4uAysTh+6W/pw1YQRREbqMb0i4tkUAKTDqal38N6360kt3o/L5cRkmIl1didl6Fi6J0S6uzwRkTZBAUA6DJfLxWe7d7A5cyv1rloAQuujuaLnGIYNTFAHPxGRH1AAkHbPMAy2Hj7M6tSvqXKVAuDnDGJk9HAmjhyI1aoH9oiI/JhbAsDcuXMpKirCaj2x+kWLFnH8+HFeeukl6uvrufnmm7nhhhsA2LRpE4sXL8bhcDBt2jTmz5/vjpKljTqYk8ey79ZR5MwGA6wub/oFDeDqMaPw99dAPiIiZ9LqAcAwDI4ePcq6desaA0B+fj7z58/nww8/xNvbm9mzZzNixAg6d+7MggULWLp0KbGxscybN4/169eTnJzc2mVLG5NXUsHfvlzJscoDGLgwYybBO5FrRiYTGa6BfEREmtLqAeDo0aOYTCZuv/12ioqK+OlPf0pAQAAjR44kNDQUgClTprBq1SqGDx9O165diY+PByAlJYVVq1YpAHiwsqpaPty8iUMV+3CZ6zBMEGWO4+rByfSIj3V3eSIi7UarB4Dy8nJGjRrF73//e2pra5k7dy7Tpk3DZrM1vicqKoo9e/ZQUFBwyvT8/PyLWn9ERPPe/mWzBTXr8uT0qmvr+feazXybvZV6cyWYTYSYw5k15ArGDO6rDn5upH3AvdT+7tdet0GrB4AhQ4YwZMgQAPz9/bn22mtZvHgxv/jFL056n8lkwjCMUz5/sX/oi4oqcblOXe6FsNmCKCysaJZlyenVN7hYsyOVLZlbqbEWgwn8TP6MjR/OT68YR3FxFXZ7pbvL9FjaB9xL7e9+bXkbmM2ms37pbfUAsH37durr6xk1ahRwok9AXFwcdru98T0FBQVERUURHR192unS8TldLjZ/n876g1so98oDq4GX2YvBtoGkDB2Nj5c3Fot694uIXKhW/wtaUVHB008/jcPhoLKyko8++og//vGPbN68meLiYmpqavj8888ZN24cgwYN4tixY2RkZOB0OlmxYgXjxo1r7ZKlFbkMg+2pOSz5YBkrji6n3CsXi9lE3/De/PaKW7l21OX4eHm7u0wRkXav1c8AjB8/nt27d3P11VfjcrmYM2cOl156KfPnz2fu3LnU19dz7bXXMnDgQACeeuop7rnnHhwOB8nJyUydOrW1S5ZWYBgG+44U8sXO7RRajuD0qsNsNtElsAuzLhlPTKhG8BMRaU4m43QX2jsw9QFoWwzD4NDxEj7f9h15HKLeWo3JZCLKP4IrB40nMarLGT+r9nc/bQP3Uvu7X1veBm2uD4AInDjwH8su44tvvye7IQ2HTzkmk4kwvxCm9hnDoM691bNfRKQFKQBIq8vILWfN5lSOO1Kp8SvCZIVAX38mJI5gZLdBWMwWd5coItLhKQBIq8nMr2Dt5oNkVKVSFVCAyd/Az8eHMQmDGZc0HB+LOveJiLQWBQBpcTmFlXy18TDpFWlUBOZCoAtfHyuXxPVjQq+RBHk37+BMIiLSNAUAaTG5hZWs23SUY6UHqQjKxhXcgI+3lb6xSUzuNYZwvzB3lygi4rEUAKTZ5RZWsn5zOulFhygPzsIZWoe3t5We0d2Z2HM0sYHR7i5RRMTjKQBIs8kprOTrTekcLzpKeXAW9eE1eHtbSbTFc0XPUXQJ6qye/SIibYQCgFy0rIIKvtmUQZY9g/KQ49RFVOPtbaV7RAwTkkaSGNpdB34RkTZGAUAuWGZeBd9sziDHnkl5cCYOWwXe3lYSIqIY130YvcOTdEufiEgbpQAg58UwDDJyytm45Th5RTmUBx+nNqocH28rXSIiGJswlH6RvbGa9aslItKW6a+0nBPDMDiSWcbmb49TWJJHWXAmjuhSvH2sxIeHM6rrEAZE9sPb4uXuUkVE5BwoAMhZGYbBgWMlfLv1OMWlhZSFZFIbXYKPjxedw8MZFj+QQbb++Fp93F2qiIicBwUAOS2XYbDvkJ3t27IorbBTHpxFTWwxPr5edA4P49K4AQyOGoCf1dfdpYqIyAVQAJCTOF0udu0vYOd32VRUFVMekkVNbAm+fl7Eh4czuFNfhtgG4u/l5+5SRUTkIigACAD1DU627c5l7+5cqhylJw78cSX4+3sRHxbGoJg+DIkaSICXv7tLFRGRZqAA4OFq6xrYsj2btH351DSUUhaahSOyFP8Ab7qGhzEgqg+DowYQ6BXg7lJFRKQZKQB4qIqqOjZtPc7RA3ZqKKU8JAdHYCmBgT7EhEUwwNabwVED9I1fRKSDUgDwMEWlNWzcnEHm0WJqrWWUh2ZTH1hBUJAPnUIj6W/rzWBbf/x14BcR6dAUADxEdm4Fm7dkkJddRq13KeWR2TgDqwkO8SU8JJIBkX0YZOuHn1Wd+0REPIECQAd34HAR27dnUVJQQY1/MeVRORhBDkJDfAkPtjEgsi8DIvvgq9v5REQ8igJAB+Ryudj1fR57duVSWVZNVaCdik65mIMaCA/1JSwwmkG2fvSL6K2R+0REPJQCQAficNSzdXs2B/YXUFNbQ2VQAZXxeXgFQlSYHxEBNgbZ+tM7PElj9YuIeDgdBTqA0pIatmzNJONoMQ5XDRVBeVRFFeIXZCE2zJ+ogAiG2AbSIzQBs8ns7nJFRKQNUABopwzDIDu7jG3bssjLLqfWUklFcB61ISUEBnnROSSQuKBYhtgGEB8Uh8lkcnfJIiLShigAtDNOp4sDaYXs2plDcUk1tT4lVNjyaAiqJCTUD1tAMD1CEhgU1Z9of5u7yxURkTZKAaCdqK6qY/fuXA6kFlBRXUN1QBEVnfIwBdYTFupLsH8EfcJ7MsDWl2DvIHeXKyIibZwCQBtmGAZFhVXs/C6HjPQSqpxVVAblUxlfiE+QGVuIL2H+4QyI7EvfiF74WLzdXbKIiLQTCgBtkLPBxfFjJezenUNeQQXVlnIqgvOoCS4lMMibuOAAYgOjGBDZhx4h3bCYLe4uWURE2hkFgDakurKOQwcK2b8vn+KKKir9CqmwFeAMqCU42JeooBASQ7sxILIv0f42dewTEZELpgDgZoZhYM+vJG1fPseOlVBSX05FYB5VcUWY/SA0xJfIoCj6hveiX0RvAr31VD4REbl4CgBuUl/nJCu9hP378skrKKfIUkBlUCEO/wp8/a1EBfvTNTSG/pF96BGSoNP8IiLSrBQAWllleS3HDtk5kGYnv7qYEt88qqLsuLxdBAR4ExMSTt/IRPpH9ibSL8Ld5YqISAelANAKDMOgMK+Cw2l2jh4vJNfIpdw/n7roKkxeZoKDfOgWEcPAqD4khXbHW735RUSkhSkAtKCGBhfZGSUcSM3jaEkOBZYcqkOKcVnA6mMhOjiUIZ160TeyJ1F+kerUJyIirUYBoAU4ahtIP2xn54EjZNZnUuJdgDO4AcNiwtffix4RnRkR348eod3w0kN5RETEDXT0aUa1NXXs2H+InRkHKDDl4bDUgJcJw2omIiCcYfF9GNa5H0Hege4uVUREPJwCwEVyupxkleey9cB+UguOUG3UYJgNDLMJL6sfSZE9SO4xgITwWJ3iFxGRNqNdBIBPPvmEl156ifr6em6++WZuuOEGd5dEZkUOXxccYefRg9iLKqhvcGIYYMaHUK9YhiX0YUxSEr7eXu4uVURE5BRtPgDk5+fz7LPP8uGHH+Lt7c3s2bMZMWIEiYmJbq3r86PrOV5gp7a6Dq86PwLrIogN78K4/n3o0TkEs77ti4hIG9bmA8CmTZsYOXIkoaGhAEyZMoVVq1Zx9913u7UuR1onAqv8Ca8NJq5LDKPHx9MpUtf2RUSkfWjzAaCgoACb7b/PtY+KimLPnj0XvLyIiOY5SHfxiqTKGsyU6/uS1DOyWZYp589m06OP3U3bwL3U/u7XXrdBmw8AhmGcMu1iOtMVFVXicp26zPN16bDOBAX7EhjiQ2FhxUUvT86fzRaktnczbQP3Uvu7X1veBmaz6axfes2tWMsFiY6Oxm63N74uKCggKirKjRWdEBsfQrdEffMXEZH2qc0HgNGjR7N582aKi4upqanh888/Z9y4ce4uS0REpF1r85cAoqOjmT9/PnPnzqW+vp5rr72WgQMHurssERGRdq3NBwCAlJQUUlJS3F2GiIhIh9HmLwGIiIhI81MAEBER8UAKACIiIh5IAUBERMQDKQCIiIh4IAUAERERD6QAICIi4oHaxTgAzclsbt7H9Db38uT8qP3dT9vAvdT+7tdWt0FTdZmM0z1tR0RERDo0XQIQERHxQAoAIiIiHkgBQERExAMpAIiIiHggBQAREREPpAAgIiLigRQAREREPJACgIiIiAdSABAREfFACgAiIiIeSAFARETEAykAiIiIeCAFABEREQ+kAHAOPvnkE6ZPn86kSZN46623TpmfmprKNddcw5QpU/jd735HQ0ODG6rsuJpq/xdeeIHx48dz1VVXcdVVV532PXJxKisrmTlzJllZWafM0+9/6zjbNtA+0LJeeOEFZsyYwYwZM3j66adPmd9u9wFDziovL88YP368UVJSYlRVVRkpKSnGoUOHTnrPjBkzjJ07dxqGYRgPPfSQ8dZbb7mh0o7pXNp/3rx5xnfffeemCju+Xbt2GTNnzjT69etnZGZmnjJfv/8tr6ltoH2g5WzcuNH42c9+ZjgcDqOurs6YO3eu8fnnn5/0nva6D+gMQBM2bdrEyJEjCQ0Nxd/fnylTprBq1arG+dnZ2dTW1jJ48GAAZs2addJ8uThNtT/A3r17efnll0lJSWHRokU4HA43Vdsxvfvuuzz66KNERUWdMk+//63jbNsAtA+0JJvNxoMPPoi3tzdeXl706NGDnJycxvnteR9QAGhCQUEBNput8XVUVBT5+flnnG+z2U6aLxenqfavqqqiT58+PPDAA3z00UeUl5fz4osvuqPUDuuJJ55g6NChp52n3//WcbZtoH2gZSUlJTUe3NPT01m5ciXJycmN89vzPqAA0ATDME6ZZjKZznm+XJym2jcgIICXX36Zrl27YrVaufXWW1m/fn1rlujR9PvvftoHWsehQ4e49dZbeeCBB0hISGic3p73AQWAJkRHR2O32xtfFxQUnHQa7sfzCwsLz3iaTs5fU+2fk5PD+++/3/jaMAysVmur1ujJ9PvvftoHWt6OHTu4+eab+c1vfsNPfvKTk+a1531AAaAJo0ePZvPmzRQXF1NTU8Pnn3/OuHHjGufHxcXh4+PDjh07AFi2bNlJ8+XiNNX+vr6+/PGPfyQzMxPDMHjrrbeYNGmSGyv2LPr9dz/tAy0rNzeXu+66iyVLljBjxoxT5rfnfUABoAnR0dHMnz+fuXPncvXVVzNz5kwGDhzI7bffzvfffw/AkiVLWLx4MdOmTaOmpoa5c+e6ueqOo6n2Dw8PZ9GiRdx5551MnToVwzC45ZZb3F12h6fff/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.9999878260589065\n",
|
||
"Training MSE\n",
|
||
"5.415634483874318\n",
|
||
"Test R2\n",
|
||
"0.999974281880048\n",
|
||
"Test MSE\n",
|
||
"11.653095390463358\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 2.31109204e-04 5.13266452e-03 5.34114641e-08\n",
|
||
" 1.18620601e-06 2.63442451e-05 1.23438810e-11 2.74143127e-10\n",
|
||
" 6.08839750e-09 1.35216172e-07 2.85278450e-15 6.33569998e-14\n",
|
||
" 1.40708470e-12 3.12497018e-11 6.94019247e-10 6.59304755e-19\n",
|
||
" 1.46423858e-17 3.25190225e-16 7.22209371e-15 1.60394236e-13\n",
|
||
" 3.56216797e-12]\n",
|
||
"Feature max values before scaling:\n",
|
||
" [1. 0.99997737 0.9950799 0.99995475 0.99505739 0.99018401\n",
|
||
" 0.99993212 0.99503487 0.99016161 0.98531221 0.9999095 0.99501236\n",
|
||
" 0.99013921 0.98528992 0.98046438 0.99988687 0.99498985 0.9901168\n",
|
||
" 0.98526763 0.9804422 0.9756404 ]\n",
|
||
"Feature min values after scaling:\n",
|
||
" [ 0. -1.7621419 -1.74382593 -1.13803928 -1.14662074 -1.15475232\n",
|
||
" -0.89942598 -0.90825063 -0.9171356 -0.92605247 -0.76570177 -0.77317984\n",
|
||
" -0.78080633 -0.78857629 -0.79648291 -0.67708423 -0.68316185 -0.68937695\n",
|
||
" -0.69573183 -0.7022283 -0.70886748]\n",
|
||
"Feature max values after scaling:\n",
|
||
" [0. 1.71669651 1.63315151 2.21623344 2.15324631 2.088871\n",
|
||
" 2.62856593 2.5755035 2.52158335 2.46675058 2.987902 2.94034531\n",
|
||
" 2.8923 2.84372853 2.79459035 3.30968181 3.2653678 3.22076362\n",
|
||
" 3.1758506 3.13060772 3.08501147]\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(\\boldsymbol{y},\\boldsymbol{\\tilde{y}}) = \\frac{1}{n}\n",
|
||
"\\sum_{i=0}^{n-1}(y_i-\\tilde{y}_i)^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and the $R^2$ score function.\n",
|
||
"If $\\tilde{\\boldsymbol{y}}_i$ is the predicted value of the $i-th$ sample and $y_i$ is the corresponding true value, then the score $R^2$ is defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"R^2(\\boldsymbol{y}, \\tilde{\\boldsymbol{y}}) = 1 - \\frac{\\sum_{i=0}^{n - 1} (y_i - \\tilde{y}_i)^2}{\\sum_{i=0}^{n - 1} (y_i - \\bar{y})^2},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where we have defined the mean value of $\\boldsymbol{y}$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\bar{y} = \\frac{1}{n} \\sum_{i=0}^{n - 1} y_i.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"You can use the functionality included in scikit-learn. If you feel for it, you can use your own program and define functions which compute the above two functions. \n",
|
||
"Discuss the meaning of these results. Try also to vary the coefficient in front of the added stochastic noise term and discuss the quality of the fits.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"### Exercise: Normalizing our data\n",
|
||
"\n",
|
||
"A much used approach before starting to train the data is to preprocess our\n",
|
||
"data. Normally the data may need a rescaling and/or may be sensitive\n",
|
||
"to extreme values. Scaling the data renders our inputs much more\n",
|
||
"suitable for the algorithms we want to employ.\n",
|
||
"\n",
|
||
"**Scikit-Learn** has several functions which allow us to rescale the\n",
|
||
"data, normally resulting in much better results in terms of various\n",
|
||
"accuracy scores. The **StandardScaler** function in **Scikit-Learn**\n",
|
||
"ensures that for each feature/predictor we study the mean value is\n",
|
||
"zero and the variance is one (every column in the design/feature\n",
|
||
"matrix). This scaling has the drawback that it does not ensure that\n",
|
||
"we have a particular maximum or minimum in our data set. Another\n",
|
||
"function included in **Scikit-Learn** is the **MinMaxScaler** which\n",
|
||
"ensures that all features are exactly between $0$ and $1$. The\n",
|
||
"\n",
|
||
"\n",
|
||
"The **Normalizer** scales each data\n",
|
||
"point such that the feature vector has a euclidean length of one. In other words, it\n",
|
||
"projects a data point on the circle (or sphere in the case of higher dimensions) with a\n",
|
||
"radius of 1. This means every data point is scaled by a different number (by the\n",
|
||
"inverse of it’s length).\n",
|
||
"This normalization is often used when only the direction (or angle) of the data matters,\n",
|
||
"not the length of the feature vector.\n",
|
||
"\n",
|
||
"The **RobustScaler** works similarly to the StandardScaler in that it\n",
|
||
"ensures statistical properties for each feature that guarantee that\n",
|
||
"they are on the same scale. However, the RobustScaler uses the median\n",
|
||
"and quartiles, instead of mean and variance. This makes the\n",
|
||
"RobustScaler ignore data points that are very different from the rest\n",
|
||
"(like measurement errors). These odd data points are also called\n",
|
||
"outliers, and might often lead to trouble for other scaling\n",
|
||
"techniques.\n",
|
||
"\n",
|
||
"\n",
|
||
"It also common to split the data in a **training** set and a **testing** set. A typical split is to use $80\\%$ of the data for training and the rest\n",
|
||
"for testing. This can be done as follows with our design matrix $\\boldsymbol{X}$ and data $\\boldsymbol{y}$ (remember to import **scikit-learn**)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 38,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"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": 39,
|
||
"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": 40,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"np.random.seed()\n",
|
||
"n = 100\n",
|
||
"maxdegree = 14\n",
|
||
"# Make data set.\n",
|
||
"x = np.linspace(-3, 3, n).reshape(-1, 1)\n",
|
||
"y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $y$ is the function we want to fit with a given polynomial.\n",
|
||
"\n",
|
||
"\n",
|
||
"Write a first code which sets up a design matrix $X$ defined by a\n",
|
||
"fifth-order polynomial. Scale your data and split it in training and\n",
|
||
"test data.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Perform an ordinary least squares and compute the means squared error\n",
|
||
"and the $R2$ factor for the training data and the test data, with and\n",
|
||
"without scaling.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Add now a model which allows you to make polynomials up to degree\n",
|
||
"$15$. Perform a standard OLS fitting of the training data and compute\n",
|
||
"the MSE and $R2$ for the training and test data and plot both test and\n",
|
||
"training data MSE and $R2$ as functions of the polynomial\n",
|
||
"degree. Compare what you see with Figure 2.11 of Hastie et al. Comment\n",
|
||
"your results. For which polynomial degree do you find an optimal MSE\n",
|
||
"(smallest value)?"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.8.5"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
} |