{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Nonlinear Least Squares\n", "====\n", "\n", "## Unit 12, Lecture 2\n", "\n", "*Numerical Methods and Statistics*\n", "\n", "----\n", "\n", "#### Prof. Andrew White, April 17 2018" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Goals:\n", "---\n", "\n", "1. Be able to apply the same analysis from 1D/ND OLS to NLS\n", "2. Compute the F-matrix and understand its use in error analysis\n", "3. Distinguish between when linearized OLS is possible and NLS is required" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "%matplotlib inline\n", "import random\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import scipy.stats\n", "import scipy.linalg as linalg\n", "import matplotlib" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Linearizing An Exponential\n", "---\n", "\n", "We previously learned how to linearize polynomials into OLS-ND. What about a more complex equation, like:\n", "\n", "$$y = \\beta_0 e^{-\\beta_1 x^2} + \\epsilon $$\n", "\n", "Well, you could of course just do this:\n", "\n", "$$\\ln y = \\ln\\beta_0 - \\beta_1 x^2 + \\epsilon $$\n", "\n", "and then choose our $x$ matrix to be $[1,-x^2]$\n", "\n", "What is wrong with this?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**We changed our assumption of noise!** To do the math I just above, it should have been that our original equation was:\n", "$$y = \\beta_0 e^{-\\beta_1 x^2}\\times e^{\\epsilon} $$ so that after taking the log, we ended up with that above. But that equation doesn't our assumption that we have normally distributed 0-centered noise." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Can we neglect our assumption of linear normal noise?\n", "===" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "#NOT PART OF REGRESSION!\n", "#Make up an equation and create data from it\n", "x = np.linspace(0, 10, 20)\n", "y = 2 * np.exp(-x**2 * 0.1) + scipy.stats.norm.rvs(size=len(x), loc=0, scale=0.2)\n", "#END\n", "\n", "plt.plot(x,y, 'o', label='data')\n", "plt.plot(x, 2 * np.exp(-x**2 * 0.1), '-', label='exact solution')\n", "plt.legend(loc='upper right')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-0.39211931 0.07860197]\n", "0.6756235005402879 2\n", "0.07860197052427415 0.1\n" ] } ], "source": [ "#Now we compute the least squares solution\n", "\n", "x_mat = np.column_stack( (np.ones(len(x)), -x**2) )\n", "\n", "#Any negative y-values will not work, since log of a negative number is undefined\n", "y_clean = []\n", "for yi in y:\n", " if yi < 0:\n", " y_clean.append(0.0000001)\n", " else:\n", " y_clean.append(yi)\n", "\n", "lin_y = np.log(y_clean)\n", "\n", "#recall that the *_ means put all the other\n", "#return values into the _ variable, which we \n", "#don't need\n", "lin_beta, *_ = linalg.lstsq(x_mat, lin_y)\n", "print(lin_beta)\n", "beta_0 = np.exp(lin_beta[0])\n", "beta_1 = lin_beta[1]\n", "\n", "print(beta_0, 2)\n", "print(beta_1, 0.1)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(x,y, 'o', label='data')\n", "plt.plot(x, 2 * np.exp(-x**2 * 0.1), '-', label='exact solution')\n", "plt.plot(x, beta_0 * np.exp(-x**2 * beta_1), '-', label='linearized least squares')\n", "plt.legend(loc='upper right')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**NO, we cannot linearize and ignore the impact on noise**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Checking if Linearization is Valid\n", "====\n", "\n", "The way to check if the linearization is valid is to see if the residuals are normally distributed. Since you are assuming the noise is normal after linearization, you can check that assumption:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "(0.8977533578872681, 0.03743453323841095)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "resids = y - beta_0 * np.exp(-x**2 * beta_1)\n", "scipy.stats.shapiro(resids)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The Shapiro-Wilk test says absolutely not are they normal, as we can imagine from looking at the graph." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Nonlinear Multidimensional Least-Squares\n", "====" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "To treat things like the exponential distribution from above, we need to use an objective function and minimization. We'll minimize the SSR directly:\n", "\n", "$$SSR = \\sum_i (\\hat{y}_i - y_i)^2 $$\n", "\n", "$$SSR = \\sum_i (\\beta_0 e^{-\\beta_1 x^2} - y_i)^2 $$\n", "\n", "So our SSR is a function which takes in $(\\beta_0, \\beta_1)$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We're going to use a new technique this time. Instead of relying on the data being defined, we'll have our SSR take that as extra arguments and we'll tell the minimizer about these extra args." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " fun: 0.6387351593324605\n", " hess_inv: array([[0.16566385, 0.01037387],\n", " [0.01037387, 0.00203523]])\n", " jac: array([ 5.21540642e-08, -4.61935997e-07])\n", " message: 'Optimization terminated successfully.'\n", " nfev: 80\n", " nit: 12\n", " njev: 20\n", " status: 0\n", " success: True\n", " x: array([2.06618151, 0.08906969])\n" ] } ], "source": [ "#Create an objective function, that takes in 1 D-dimensional argument and outputs a measure of the goodness of fit (SSR)\n", "def obj(beta, x, y):\n", " beta_0 = beta[0] #<- extract the elements of the beta vector\n", " beta_1 = beta[1]\n", " yhat = beta_0 * np.exp(-beta_1 * x**2) # <- This is our model equation\n", " resids = yhat - y #<- compute residuals\n", " SSR = np.sum(resids**2) #<- square and sum them\n", " return SSR\n", "\n", "#Use the minimize (BGFS) function, with starting points\n", "result = scipy.optimize.minimize(obj, x0=[1,1], args=(x, y))\n", "beta_opt = result.x #<- remember, we get out a whole bunch of extra stuff from optimization\n", "print(result)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(x,y, 'o', label='data')\n", "plt.plot(x, 2 * np.exp(-x**2 * 0.1), '-', label='exact solution')\n", "plt.plot(x, beta_0 * np.exp(-x**2 * beta_1), '-', label='linearized least squares')\n", "plt.plot(x, beta_opt[0] * np.exp(-x**2 * beta_opt[1]), '-', label='Nonlinear least squares')\n", "plt.legend(loc='upper right')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Error Analysis in Nonlinear Least Squares\n", "====\n", "\n", "Just like for the one-dimensional and multidimensional case, there exists an expression to go from standard error in the residuals to standard error for the fit. That expression is:\n", "\n", "$$y = f(\\beta, x) + \\epsilon$$\n", "\n", "$$ F_{ij} = \\frac{\\partial f(\\hat{\\beta}, x_i)}{\\partial \\hat{\\beta_j}}$$\n", "\n", "$$S^2_{\\beta_{ij}} = S^2_{\\epsilon}\\left(\\mathbf{F}^T\\mathbf{F}\\right)^{-1}$$\n", "\n", "where again, the standard error for the $i$th given fit parameter is $S^2_{\\beta{ii}}$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Take a close look at the partial derivatives. $x_i$ can be a vector here and remember that you're taking the partial with respect to the fit parameters, not $x$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Sketch of Derivation of Error Terms\n", "====\n", "\n", "Let's try to understand this equation. It is a generalization of the OLS in N-D, so our derivation will apply to all cases we learned in lecture 1 too." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Consider the $\\mathbf{F}^T\\mathbf{F}$ term. You can see by expanding the terms that it is\n", "\n", "$$\n", "\\mathbf{F}^T\\mathbf{F} = \\sum_k^N \\frac{\\partial f(\\hat{\\beta}, x_k)}{\\partial \\hat{\\beta_i}} \\frac{\\partial f(\\hat{\\beta}, x_k)}{\\partial \\hat{\\beta_j}}\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "where $i$ is the row and $j$ is the index. This expression is approximately:\n", "\n", "$$\n", "\\mathbf{F}^T\\mathbf{F} \\approx \\frac{\\sum_k^N \n", "\\left(\\Delta f(\\hat{\\beta}, x_k)\\right)^2}{\\Delta\\hat{\\beta_i} \\Delta \\hat{\\beta_j}}\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "So the *diagonal* of $\\mathbf{F}^T\\mathbf{F}$ is the total change in the value of the squared function per change in the square of the value of a fit coefficient.\n", "\n", "$$\n", "\\mathrm{diag}\\left[\\mathbf{F}^T\\mathbf{F}\\right] \\approx \\frac{\\sum_k^N \n", "\\left(\\Delta f(\\hat{\\beta}, x_k)\\right)^2}{\\Delta\\hat{\\beta_i}^2}\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "We can loosely think of $\\mathbf{F}^T\\mathbf{F}$ as a function, or operator, that goes from a change in the fit coefficients squared to a change in the squared value of the function. \n", "\n", "We also know that our residual, $f(\\hat{\\beta}, x) - y$, has the same derivative wrt the fit coefficients as the function itself. Thus $\\mathbf{F}^T\\mathbf{F}$ allows us to compute a change in the residual given a change in the fit coefficients (*this is a simplification*)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Therefore the inverse, $\\left(\\mathbf{F}^T\\mathbf{F}\\right)^{-1}$, goes from a change in the residual squared to a change in the fit coefficients squared." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Now we can see that:\n", " \n", "$$ S^2_{\\epsilon}\\left(\\mathbf{F}^T\\mathbf{F}\\right)^{-1} $$\n", "\n", "is the product of a change in the residual squared with our operator that translate that into a squared change in the fit coefficient squared. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Example: Error Analysis for Exponential Fit in Nonlinear Least Squares\n", "----\n", "\n", "To do the analysis from our example above, we must first compute the partial derivatives. Recall the model is:\n", "\n", "$$y = \\beta_0 e^{-\\beta_1 x^2} + \\epsilon $$\n", "\n", "So that \n", "\n", "$$f(\\beta, x) = \\beta_0 e^{-\\beta_1 x^2}$$\n", "\n", "$$\\frac{\\partial f}{\\partial \\beta_0} = e^{-\\beta_1 x^2}$$\n", "$$\\frac{\\partial f}{\\partial \\beta_1} = -\\beta_0 x^2 e^{-\\beta_1 x^2}$$\n", "\n", "To compute $\\mathbf{F}$, we'll need to compute these functions at various points, so it's best to create a python function" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1.00000000e+00 -0.00000000e+00]\n", " [ 9.75628846e-01 -5.58400633e-01]\n", " [ 9.06021555e-01 -2.07424375e+00]\n", " [ 8.00869385e-01 -4.12539436e+00]\n", " [ 6.73835860e-01 -6.17071333e+00]\n", " [ 5.39654511e-01 -7.72177405e+00]\n", " [ 4.11383405e-01 -8.47638235e+00]\n", " [ 2.98501825e-01 -8.37152039e+00]\n", " [ 2.06165730e-01 -7.55192591e+00]\n", " [ 1.35536176e-01 -6.28349852e+00]\n", " [ 8.48131602e-02 -4.85427655e+00]\n", " [ 5.05173461e-02 -3.49854260e+00]\n", " [ 2.86409272e-02 -2.36053712e+00]\n", " [ 1.54562056e-02 -1.49503327e+00]\n", " [ 7.93940509e-03 -8.90646369e-01]\n", " [ 3.88188176e-03 -4.99903399e-01]\n", " [ 1.80661623e-03 -2.64708047e-01]\n", " [ 8.00310988e-04 -1.32378633e-01]\n", " [ 3.37458923e-04 -6.25787948e-02]\n", " [ 1.35441675e-04 -2.79847085e-02]]\n" ] } ], "source": [ "def build_F(beta, x):\n", " #Compute the individual partials for each data point\n", " beta_0_vec = np.exp(-beta[1] * x**2)\n", " beta_1_vec = -beta[0] * x**2 * np.exp(-beta[1] * x**2)\n", " #Now stack them together\n", " return np.column_stack( (beta_0_vec, beta_1_vec) )\n", "\n", "print(build_F(beta_opt, x))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Now to actually compute the standard error:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.03548528662958114\n" ] } ], "source": [ "#The code below is our normal way of computing the standard error in the noise\n", "resids = y - beta_opt[0] * np.exp(-x**2 * beta_opt[1])\n", "SSR = np.sum(resids**2)\n", "s2_epsilon = SSR / (len(x) - len(beta_opt))\n", "print(s2_epsilon)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0.01123071 0.00064552]\n", " [0.00064552 0.00012526]]\n" ] } ], "source": [ "#Using our F, compute the standard error in beta\n", "F = build_F(beta_opt, x)\n", "\n", "s2_beta = s2_epsilon * linalg.inv(F.transpose() @ F)\n", "print(s2_beta)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "95% confidence interval for beta_0 is 2.07 +/ 0.22\n", "95% confidence interval for beta_1 is 0.0891 +/ 0.024\n" ] } ], "source": [ "#We have standard error and can now compute a confidence interval\n", "T = scipy.stats.t.ppf(0.975, len(x) - len(beta_opt))\n", "c0_width = T * np.sqrt(s2_beta[0,0])\n", "print('95% confidence interval for beta_0 is {:.3} +/ {:.2f}'.format(beta_opt[0], c0_width))\n", "\n", "c1_width = T * np.sqrt(s2_beta[1,1])\n", "print('95% confidence interval for beta_1 is {:.3} +/ {:.2}'.format(beta_opt[1], c1_width))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Of course, we could continue on and do hypothesis tests" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Multidimesional Non-Linear Regression\n", "====\n", "\n", "**These notes are not on HW or tests. Just stating how to do multidimensional y regression**\n", "\n", "When we have multiple dimensions in $y$, the dependent variable, a few things need to change. Our model equation becomes:\n", "\n", "$$\n", "\\vec{y} = f(x, \\beta) + \\vec{\\epsilon}\n", "$$\n", "\n", "where the noise is now a multivariate normal distribution. Multivariate normals are like multiple normal distributions, except that they have both different parameters for each dimension and they also may have correlation between dimensions. We will assume here that there is no correlation between the noise. \n", "\n", "Here we derive the $F$-matrix from above using its actual derivation.\n", "\n", "$$\n", "\\mathcal{F} = \\sum_k -(y_k - \\hat{y})_k^2) / 2\\sigma_k^2 - \\log \\sqrt{2\\pi\\sigma_k^2}\n", "$$\n", "\n", "The best estimaet for $\\sigma_k^2$ is\n", "\n", "$$\n", "\\sigma_k^2 = \\frac{1}{N - D}\\sum_k (y_k - \\hat{y})_k^2\n", "$$\n", "\n", "First, we need to redefine the SSR to be:\n", "\n", "$$\n", "\\textrm{SSR} = \\sum_i (y_i - \\hat{y}_i)\\cdot (y_i- \\hat{y}_i)\n", "$$\n", "\n", "This quantity should be minimized to find the regression parameters [ref](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=4285368)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The error analysis becomes:\n", "$$\n", "S^2_e = \\frac{SSR}{N - D}\n", "$$\n", "\n", "$$\n", "\\mathcal{F} = E\\left[\\frac{\\partial^2}{\\partial \\beta_i \\partial \\beta_j} SSR \\right]\n", "$$\n", "\n", "where $E$ means taking the average over the observed data" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "A Complete & Complex Example - Deconvolution of Spectrum\n", "===" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "In spectroscopy and chromatography, often we have a spectrum that is a mixture of peaks and we'd like to spearate them out. For example, here's a plot of a spectrum" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "data = np.genfromtxt('spectrum.txt')\n", "\n", "plt.plot(data[:,0], data[:,1])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "You can see that there are probably 3 peaks in here. What we'd like to find out is what percentage each peak contributes. For example, this would tell us the amount of absorbance contributed by each of these three bonds or perhaps the amount of each compound in chromatography. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "The equation for each peak is:\n", "\n", "$$ f(x, a, b, c) = \\frac{a}{\\sqrt{2 c \\pi}}\\,e^{-(x - b)^2 / c} $$\n", "\n", "and the total spectrum is \n", "\n", "$$ f(x_i, \\vec{a}, \\vec{b}, \\vec{c}) = \\sum_j^M \\frac{a_j}{\\sqrt{2 \\pi c_j}} e^{-(x_i - b_j)^2 / c_j} $$\n", "\n", "where $j$ is the index of peak and runs from $1$ to $M$ where $M$ is the number of peaks." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Let's start by writing an equation that can predict a spectrum given some parameters" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "def peak(x, a, b, c):\n", " '''computes the peak equation for given parameters'''\n", " return a / np.sqrt(2 * np.pi * c) * np.exp(-(x - b)**2 / c)\n", "def spectrum(x, a_array, b_array, c_array):\n", " '''Takes in the x data and parameters for a set of peaks. Computes spectrum'''\n", " yhat = np.zeros(np.shape(x))\n", " for i in range(len(a_array)):\n", " yhat += peak(x, a_array[i], b_array[i], c_array[i])\n", " return yhat\n", " " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "It's always good to test your functions, so let's do that" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x = np.linspace(0, 10, 100)\n", "y = peak(x, 1, 5, 1)\n", "plt.plot(x,y)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "y = spectrum(x, [1, 2], [3, 5], [1,1])\n", "plt.plot(x,y)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Ok! Now let's do the regression" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Justifying a regression\n", "---\n", "\n", "Let's first test if there is a correlation" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "SpearmanrResult(correlation=0.34909264909264914, pvalue=4.933615809540912e-30)" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spec_x = data[:,0]\n", "spec_y = data[:,1]\n", "\n", "scipy.stats.spearmanr(spec_x, spec_y)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Looks like there is a correlation, as indicated by the $p$-value. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Computing the SSR\n", "---\n", "\n", "Let's write our SSR function" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "def spec_ssr(params, data, M):\n", " '''Compute SSR given the parameters, data, and number of desired peaks.'''\n", " x = data[:,0]\n", " y = data[:,1]\n", " a_array = params[:M]\n", " b_array = params[M:2*M]\n", " c_array = params[2*M:3 * M]\n", " yhat = spectrum(x, a_array, b_array, c_array)\n", " return np.sum((yhat - y)**2)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "def obj(params):\n", " return spec_ssr(params, data=data, M=3)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Optimizing\n", "---" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Now we need to think aobut if this is non-convex! It is in fact non-convex, because there are many local minimums. This means we'll have to be smart about our starting parameters and/or run for many interations" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 515.00754662 2001.23149241 179.38225677 644.33899405 651.35194728\n", " 216.63135325 58.43055086 961.08476142 126.84613021]\n" ] } ], "source": [ "import scipy.optimize as opt\n", "\n", "result = opt.basinhopping(obj, x0=[100, 100, 100, 600, 650, 700, 100, 100, 100], niter=100)\n", "print(result.x)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Let's see if 100 iterations gave us good data!" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "def spec_yhat(params, data, M):\n", " '''compute the yhats for the spectrum problem'''\n", " x = data[:,0]\n", " a_array = params[:M]\n", " b_array = params[M:2*M]\n", " c_array = params[2*M:3 * M]\n", " return spectrum(x, a_array, b_array, c_array)\n" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xd8W+W9+PHPI8mWPCTvGSdx9iILTCCkjBJSIOxVoNDCLbd0t/ferrSlt9Bxyy2l7b39dbFzIUBpKWEWSEMYJQUyyHKWSeLEjveekizp+f1xZMeOtyNbR9L3/XrlJenoOUffk2N//eg5z1Baa4QQQkQ+S7gDEEIIERqS0IUQIkpIQhdCiCghCV0IIaKEJHQhhIgSktCFECJKSEIXQogoIQldCCGihCR0IYSIEraJ/LDMzExdWFg4kR8phBARb9u2bXVa66zhyk1oQi8sLGTr1q0T+ZFCCBHxlFJHR1JOmlyEECJKSEIXQogoIQldCCGixIS2oQshxFh0dXVRXl6O2+0OdyjjyuFwUFBQQFxc3Jj2l4QuhDC98vJynE4nhYWFKKXCHc640FpTX19PeXk506ZNG9MxpMlFCGF6brebjIyMqE3mAEopMjIyTulbiCR0IUREiOZk3u1Uz1ESuhCRyOeBDx6E6r3hjkSYiCR0ISLRmz+DV74Ja68Ab0e4o4lJd999N7/4xS8GfX/9+vXs3Tuxf3AloQsRabSGXc9AvBM66qDk9XBHJAZg2oSulCpVSu1WSu1QSm0NbktXSm1QSpUEH9PGN1QhBAC1B6DlOKy620jqR94Kd0Qx46c//Slz5szhoosu4sCBAwA8+OCDnHnmmSxevJjrrruOjo4ONm/ezAsvvMC3vvUtlixZwqFDhwYsF2qj6bb4ca11Xa/Xa4CNWut7lVJrgq+/E9LohBD9HX0XAE/hhdgLN8CRt8Mc0MS658Vi9la0hPSY8/Nd/PCKBUOW2bZtG08//TQffvghPp+P008/nTPOOINrr72Wz33ucwDcddddPPzww3z1q1/lyiuv5PLLL+f6668HIDU1dcByoXQqTS5XAWuDz9cCV596OEKIYVUX47EmM+f+vTxRloGuPwTe9nBHFfXeeecdrrnmGhITE3G5XFx55ZUA7Nmzh3PPPZeFCxeybt06iouLB9x/pOVOxUhr6Bp4XSmlgT9qrR8AcrTWlQBa60qlVHbIoxNC9Fezl91d+YDi7eZsbo3XBKr3YZlcFO7IJsRwNenxNFC3wttvv53169ezePFiHnvsMd58880B9x1puVMx0hr6Cq316cClwJeVUueN9AOUUncqpbYqpbbW1taOKUghRJDWULOXo9ZCAPbrKQCU798SxqBiw3nnncdzzz1HZ2cnra2tvPjiiwC0traSl5dHV1cX69at6ynvdDppbW3teT1YuVAaUULXWlcEH2uA54BlQLVSKg8g+FgzyL4PaK2LtNZFWVnDzs8uhBhKZyO4m9nXlcNXL5zJDz99KR4dh7f6YLgji3qnn346N954I0uWLOG6667j3HPPBeDHP/4xZ511FqtWrWLu3Lk95W+66Sbuu+8+li5dyqFDhwYtF0pKaz10AaWSAIvWujX4fAPwI2AlUN/rpmi61vrbQx2rqKhIywIXQpyCih3wwPl83vvv3PSZL3HW9HQqf3Ia/sy5zP7a+nBHN2727dvHvHnzwh3GhBjoXJVS27TWw7apjaQNPQd4Lth2ZAOe1Fq/qpTaAjyjlLoDOAbcMOrIhRCj03QMgCqVxbJp6STG26iPzyex7ggdXh+J8TLfXiwb9uprrQ8DiwfYXo9RSxdCTJTmMgDSC2aRZDd+feMypzOlci8VjR3MzHGFMzoRZjJSVIgI4msopVUnsHD6lJ5taZNm4VKdNNQPeBtLxBBJ6EJEEE9tKcd1JoVZyT3b7FnTAeioORyusIRJSEIXIoJ0NRylXGcyNSOxZ1vqpFkAdFZ9FK6whElIQhcigsS3VdBgy2ZxQWrPtoTMqQB46o+FKyxhEpLQhYgUPg+JgVa6ErKxWXv96jpS8Sg7lvbq8MUWI/73f/+XefPmkZaWxr333guEZ1bFwUgfJyEiRZuRsH2JJ82yoRQttkwS3XJTdLz97ne/429/+1ufNT/Xr1/P5Zdfzvz588MYmUFq6EJEiM6GCgCsrtx+77kd2bh8dfgDQw8UFGP3hS98gcOHD3PllVfyq1/9iq985SsDTpMbTlJDFyJClJeVMguYPXNmv/d8ybnkNG+jrs1Djssx8cFNpL+tgardoT1m7kK49N4hi/zhD3/g1VdfZdOmTbz00ksAnHPOOf2myQ0nqaELESG8TUYNPSVrUr/3LK48clQjFY2yHF0skxq6EBHC31JFQCtSB0joiZmTcaguDpSWsXRqehiim0DD1KRjmdTQhYgQqq2aelykJSf2ey8zrxCAI0ekL/pEO3ma3HCShC5EhNBtNTRZ0oi39f+1Vc48o0xLxUSHFfNOniY3nKTJRYgIYXfX4nFkDvymy0joNumLPq5KS0sBY/Wh22+/HYAVK1aYph+61NCFiBDJ/ma8gyX0ZKMro0P6osc0SehCRIBAQJOiWwg4BrnhGeeg05ZKur+Odo9vYoMTpiEJXYgI0NTaSrJyQ1LGoGW8CVlkqyZqWj0TGNnEGW51tWhwqucoCV2ICFBZadzsdLgGX5c3kJRDtmqiusU9UWFNGIfDQX19fVQnda019fX1OBxjHxgmN0WFiABVleUsADKy8wYtY3Xlklm5n+1RWEMvKCigvLyc2tracIcyrhwOBwUFBWPeXxK6EBGgrdG42ZmelT9omfi0fLJooqa5c6LCmjBxcXF9JsQSA5MmFyEiQFdrHQD2IZpc7Km52JWP5gbp6RKrJKELEQk6jIROwuDD+pXT6LrobpTBRbFKEroQEcDS2WA8SUgbvFCwL7q/uXICIhJmJAldiAhg8zTSZnGCdYjbXsEaOu3S5BKrJKELEQEcXU102lKGLpScA4C9s4aALHQRkyShC2FyWmuSfM144odobgGwJ9NlTSCTJurao6/rohieJHQhTK7N4yOVFvyOYRI64E3IJls1UtMiCT0WSUIXwuTq27ykqVYCCYMP++8WSMohSzVTG4WDi8TwJKELYXL1bR7SacU6xDwu3ayuXLJokoQeoyShC2FyTS3NOFQXcc7BBxV1i0/NDU7QFX3zuYjhjTihK6WsSqkPlVIvBV+nK6U2KKVKgo/DN/AJIUato9FYtMKeMnxCt7nycKpOmpqaxjssYUKjqaF/HdjX6/UaYKPWehawMfhaCBFinc3GhFRJqTnDFw72Re+SwUUxaUQJXSlVAFwGPNRr81XA2uDztcDVoQ1NCAHQ1Wok9KHmcekR7Ivub6kaz5CESY20hv5r4NtAoNe2HK11JUDwMTvEsQkhgEB7vfEkcfibot01dGuHjBaNRcMmdKXU5UCN1nrbWD5AKXWnUmqrUmprtM9lLMR4UB3dCX3wibl6BGvo8Z21Ub0YhBjYSGroK4ArlVKlwNPAhUqpJ4BqpVQeQPBxwCqB1voBrXWR1rooK2sEXxmFEH1Y3Q0EsIAjdfjCCen4lY20QAPtXv/4BydMZdiErrX+rta6QGtdCNwEvKG1vhV4AbgtWOw24Plxi1KIGGb3NtFhdYFlBPUviwWPPZNsJX3RY9Gp9EO/F1illCoBVgVfCyFCSGuNw9eMO24EtfMgf1K2sXJRFK4tKoY2qiXotNZvAm8Gn9cDK0MfkhCiW7vXT6puocs+imEezlyya/dzqE1q6LFGRooKYWL1bR7SVCv+IVYqOlm8K5cs1SQTdMUgSehCmFh9u5d01YolMXPE+8Sn5pGpWqhvaR/HyIQZSUIXwsQaWj2k0YrVOfKErlxGX/TORhktGmskoQthYs3NDcQrP/GjSOjda4v6ZLRozJGELoSJdTYbwzsS00YxEDs4uEi1VY9HSMLEJKELYWLe4MRcducoErrTSOi2DknosUYSuhAm5m8fxbD/bklG8k/uqpfFomOMJHQhTCwwloRui6czLpVsmmjz+sYnMGFKktCFMDGrexQzLfbicWSRpZpodUtCjyWS0IUwsThPI36sYHeNar+uhCyyVRMtnV3jFJkwI0noQpiU1hp7VzOdcamg1Kj2DSTlkKWaaJaEHlMkoQthUu1ePym6BU/86JfrjUvNkwm6YpAkdCFMqqHNGPbvt498psVuSRkFxCs/dTUV4xCZMCtJ6EKYVH27Mex/tDdEAeypeQC01UtCjyWS0IUwqYZ2L2mqDUvyKIb9dwuOFqVVhv/HEknoQphUfXBirrjRzOPSrXux6HZZLDqWSEIXwqRamxuwqQAJKWNYizdYQ7e7ZWH2WCIJXQiT8rQYc7HEO8eQ0O3JeCwJJHrrQhyVMDNJ6EKYVFdrMBmP4aYoQEd8Jk6fzOcSSyShC2FS/vYG48lo5nHpxeMwRos2yeCimCEJXQiTUh1jm8elmz8pm2waqZfFomOGJHQhTMrmaTSejGKB6N5UymTyVQNVzR0hjEqYmSR0IUxIa028txG/soHdOaZjJGRPx666aKguC3F0wqwkoQthQh1eP65AC+4xTMzVzZk3AwBP7ZFQhiZMTBK6ECbUPUq0yz76ibm62dILjcfmYyGKSpidJHQhTKi+3UuaakWPsf0cgNQpAMS3l4coKmF2ktCFMKH6Ng/pY5yYq0dcAg2WNJydx0MXmDA1SehCmFB3DX1M87j00hCXR6qnMkRRCbOThC6ECTW0uUmjdWzD/ntpceST5ZMZF2PFsAldKeVQSn2glNqplCpWSt0T3J6ulNqglCoJPo797o0Qoo+OlnqsShPnPIUmF6AzqYBsXQd+WSw6Foykhu4BLtRaLwaWAJcopc4G1gAbtdazgI3B10KIEPA2GxNzqaTsUzuOcwo2FcBdVxqCqITZDZvQtaEt+DIu+E8DVwFrg9vXAlePS4RCxKBAW3Da2+RTa3KxZM8GoKF096mGJCLAiNrQlVJWpdQOoAbYoLV+H8jRWlcCBB9PrSohhOhh7Qgm9KRTS+jZ0xcB0FS251RDEhFgRAlda+3XWi8BCoBlSqnTRvoBSqk7lVJblVJba2tlsn0hRsLWGZyY6xSbXPJy8qjVKdjqS0IQlTC7UfVy0Vo3AW8ClwDVSqk8gODjgGtdaa0f0FoXaa2LsrJOrbYhRCzQWuPw1hPAMuapc7sl2218FJiEs+1wiKITZjaSXi5ZSqnU4PME4CJgP/ACcFuw2G3A8+MVpBCxpLrFQ2qgGU98Klisp3Qsm9XCEUsBaR2HQctCF9HONoIyecBapZQV4w/AM1rrl5RS/wSeUUrdARwDbhjHOIWIGQeqW8lQLejEUxtU1K3CNgWH/3VorQJXXkiOKcxp2ISutd4FLB1gez2wcjyCEiKWNXV4maSaT/mGaLca+1ToAGr3S0KPcjJSVAiTafP4yKAZlRyajmPNLqPrIlW7QnI8YV6S0IUwmXaPj0zVgtUZmoSekplHBVlwfHtIjifMSxK6ECbj7mjHqTqxuXJCcryCtEQ+9E8jUPFhSI4nzEsSuhAmo4OjRC2nOEq0W0FaArsCM7A0HYX2+pAcU5iTJHQhzKZnlGhomlwK0hLZpacbL6SWHtUkoQthNm2hGfbfLS/Fwe7ANDQKjm8LyTGFOUlCF8JkbB3GTIs4c0NyvGyXnTYSqUuaBaXvhOSYwpwkoQthMgnuagIoCFG3RbvNSnpSPPsSi6DsffC2h+S4wnwkoQthIlprkr11dMSlgzUuZMfNcTnYalkEfi8c++eI93utuIq71svUu5FCEroQJtLh9ZOpG+i0h3YiuxyXnXe7ZoI1Hg6/OaJ9fvryXj7/+DaeeO8Y7R5Z8SgSSEIXwkTq27zkqka6kkLTB71brsvB0RYFU86Gg68PW76soYMH3znS83p/VUtI4xHjQxK6ECZS2dxJtmoEZ35Ij5ueFE9jhxc970qoOwA1+4Ysf8+Le/u8Xrv5KF3+QEhjEqEnCV0IE9l/vI5M1YIra3JIj5ueFI8/oGmddimgoPi5IcvbLAqAZz6/HJfDxgs7K1j33tGQxiRCTxK6ECbSWnccgKTMgpAeNzUxHoBGSxpMXWEk9EHmR99S2sAb+2u4YnE+y6al8/WLjMm97n5xL1rmVDc1SehCmIi1rQoA5Qp1k4vRY6auzQMLr4e6g1C+dcCyD71zmIDW/Ofl8wG442PTet471tAR0rhEaElCF8JE4jtDO6io27w8FwA7ypqNhB6fDNseHbDs4dp2LpybTZbT3u+9Q7VtIY1LhJYkdCFMxNEZXJo3xDdF81ISSE2M43BtG9idRlLf81fobOpTzh/QHK3vYFpWUp/tG79xPgAHqyWhm5kkdCFMJNlbQxdxp7w49EByXQ6qWzzGizP+BXydsPPpPmXeP1KP1x9gRmZyn+0zspLJdto5WN0a8rhE6EhCF8JE0rxVNMRlg1IhP3aOy0FVS6fxIn8JFCyD938PAX9PmdeLjSafFbP6r2c6O8fJRzVSQzczSehCmEimv4qm+PFZ93NqRiKldR0neqqc8xVoLIX9L/WUOVTbxtxcJ5NSE/rtPzvHycHqVgIB6eliVpLQhTCR3EANLY5J43Ls2TlO2jw+SuuDPVXmXg5phbD5/wHG6NB3SuqYlpk04P5zcpNxdwUoa5SeLmYlCV0Ik9CeNtJpoSMxtDdEu10wx5gf5sWdFcYGixXO/jKUfwDH3ufP28oB+OqFswbcf1aOE4ADVdKOblaS0IUwCW+9MRLTkxzaQUXdCtISOWNqGm/srzmxcekt4EhFb/4Nz24r59xZmczPdw24/6xs40ZpibSjm5YkdCFMwlNXCoDPFdph/73NzXVSWt9rPvT4JDjzDtj/EtbmUj61bMqg+zodceS6HByulfnUzUoSuhAm4a4zZje0pE0dt8+YlplEU0cXje3eExuX3UlA2bjD+grnzOjfu6W33BQH1S3ucYtPnBpJ6EKYhKe2FI+OIyNnfJpcgJ4bnu8drj+x0ZlLccYnuMH6Ni41dHNKrstBlSR005KELoRJBBqPUq4zmZQ2cC+TUJgdvLH50D+O9Nn+atLVJCoP6sN1Q+6fm+KgulkSullJQhfCJBwtRyknmxyXY9w+Y3J6Iosnp1LWa5KtmhY3Dx9ycjhxEXzwxz4DjU6W43LQ6vHJCkYmJQldCDMIBEjtPEpV/BSsltCPEu1t1bxsalo9uLv8eHx+lv3XRjy+AM7zvwpNx+Dgq4Pum5tiTNhV3tg5rjGKsRk2oSulJiulNiml9imlipVSXw9uT1dKbVBKlQQf08Y/XCGiVMtx7NpNS1LhuH9UfnAU6Ec1bbx3uKFne1bRteAqgPd+P+i+RVONOWY27K0a3yDFmIykhu4DvqG1ngecDXxZKTUfWANs1FrPAjYGXwshxqLuIADe1IEH9YTS1IxEAC7/zT/4w5uHAPjLF5aD1QbL/hVK34Hq4gH3nZyeSI7LztF6GS1qRsMmdK11pdZ6e/B5K7APmARcBawNFlsLXD1eQQoR7fy1JQBYs2eP+2ctnZxGaqKx4MU/D9czJT2RosLg7I6n3wa2BPjggUH3z0tJoFJujJrSqNrQlVKFwFLgfSBHa10JRtIHskMdnBCxoqt6P806kcS00C5sMRCLRfHxOSd+XefkOk+8mZgOp10Lu/8CnoGH+M/OSWZHWROd3sFvnorwGHFCV0olA88C/6a1bhnFfncqpbYqpbbW1taOJUYhop6uK+GQzseVED8hn/fFC2b0PL/+jJP6vZ9xO3jbYM+zA+57/uzs4CRfMmLUbEaU0JVScRjJfJ3W+q/BzdVKqbzg+3lAzUD7aq0f0FoXaa2LsrKyQhGzEFHH1lDCYZ2PK8E2IZ83O8fJgZ9cQvE9F3PxgpO+FRScCdnzYdtjA+6bl2p0q6ySZhfTGUkvFwU8DOzTWv+y11svALcFn98GPB/68ISIAe31xHVUcyBQgMsRN2Efa7dZSbIP8AdEKaOWXvEhVOzo93ZeipHQpR3dfEZSQ18BfBq4UCm1I/hvNXAvsEopVQKsCr4WQoxW1U4AinUhzglM6ENa9EmwOWD72n5vZSXbsSioapa+6GYz7Pc7rfU/gMFGOqwMbThCxKDKXQAUBwrJSJ6YNvRhJaTBgmtg159h1Y/BfmKNUZvVQrbTITV0E5KRokKEW+VOmu15tFmcpCeaJKFD8OZoKxT/td9bOSkySZcZSUIXItyqdlEWP5PM5Hgs4zzsf1QmnwVZc2H74/3eynNJDd2MJKELEU6eVqg/xF4Ke4bkm4ZSsOQWY4m62oN93spNcUgvFxOShC5EOFXsADTvdU4edHHmsFp0Iygr7Hyyz+Yp6Ym0eXyy2IXJSEIXIpyOvQfAG+2F5KeYrIYO4MyBWatg59N9ptVdOiUVgA+PNYUrMjEASehChNOxf+LPnEeTTiYtyUQ3RHtb8ilorYRDb/RsKkgzJviSGrq5SEIXIlwCfij7gPacIgDSEk3SB/1ksy+FhHTYcWI1o/SkeCwK6to8YQxMnEwSuhDhUl0M3lbqM84AMG8N3RZvDDTa/zJ0GPOnWy2K9CQ7ta2S0M1EEroQ4VL6DwBKHKcBmLMNvduST4Hf22fCrszkeKmhm4wkdCHC5dBGyJjFjhYnNosyZy+XbnmLIWdhn2aXLKed2jZvGIMSJ5OELkQ4dHUaNfSZF3GwupXpWUnE20z+67j0FmPCruq9gDGnS500uZiKyX+ChIhSR98FnxtmXsSh2nZmZTuH3yfcFt4AFltPLX1SWgJVLW7aPb4wBya6SUIXIhw+2mjMZli4gtpWD9kue7gjGl5SJsy+BHb9CfxdnDE1DX9As6u8OdyRiSBJ6EKEQ8kGmLoCj4qnzeMjw6w9XE625BZor4WSDUzPNGZgPNYgKxeZhSR0ISZazX6oL4HZl9DY3gWYuMviyWatgqQs2LGOvFQHFgXljTIvullIQhdiou19HlAw74qekZaZyRHQ5AJgjTPmdzn4KnHuBvJSEihr6Ah3VCJIEroQE23v8zDlbHDl9Sy0bOouiydbeisEfLDzaSanJ0gN3UQkoQsxkepKoKYY5l8NwJbSBuJtFqZmJIY5sFHIngeTiuDDxylITaCsUWroZiEJXYiJtDe4lvq8KwD44EgD587MxG6zhjGoMTj901C7nzNsh6hp9eD1BcIdkUASuhATR2vY81coWAYpkwCobvEwKc3EQ/4Hs+BaiEvkrMaX0RoqZcFoU5CELsREqdplNLcsvhEAd5ef5s4uclyOMAc2Bg4XLLiGqZWvkoib49KObgqS0IWYKDueAmu8UbvlxFzi2c4I6eFysqWfxupr5zLre5Q3SUI3A0noQkwEfxfs/jPMuRQS0wGjuQWM9Tkj0pSz0Rmz+KT1Tamhm4QkdCEmQskG6KiDxZ/q2bR+x3GAyGxyAVAKtfRWzrQcxFu9P9zRCCShCzExdj5pjLCcubJn0+HaNoDI6rJ4ssU348fC/MoXwh2JQBK6EOOvowEOvAoLP2mMtAyqafFw2cK8yOuy2Jszh+Lk5axof91oVhJhJQldiPG240kIdBnzifdSEymzLA7j4KRrSKcZ/4FXwx1KzJOELsR40hq2PgKTz4KcBT2b2z0+2jy+yG0/78Uz9UKqdSpdWx4NdygxTxK6EOPpyNvQcAiKPttnc01wpZ+I7bLYS36Gk6f9F2I/8gY0HAl3ODFt2ISulHpEKVWjlNrTa1u6UmqDUqok+Jg2vmEKEaG2PgIJaTD/qj6buyflioYa+uS0BJ70XYhWFtj6cLjDiWkjqaE/Blxy0rY1wEat9SxgY/C1EFGrzePj6t++y/ee2832Y40j26m1Gva/ZCwKEdd3eP+GvdVYLYo5uRGw9NwwpqQn0WTLZH/qefDhE8Z6qSIshk3oWuu3gYaTNl8FrA0+XwtcHeK4hDAFf0DT7vHx4NuH2VHWxJPvH+NfHt0ysp13PGFMM3vG7f3eqmjqZEG+K3LmQR9CvM3C3Fwnz9lWQ2cj7Hk23CHFLNsY98vRWlcCaK0rlVLZIYxJCNO477UD/OGtQ322NXd2UbjmZc4sTOOsaRl84xOzUUr13dHvg62PwbTzIHNWn7cqmzt580At+ZE6QnQAeSkJbKqZzfez5sEHDxjfSk7+PxHjbtxviiql7lRKbVVKba2trR3vjxMiZNxd/n7J/NxZmT15aktpI/9v00e8uqeq/877X4LmY7Dszn5v/X1fDQAVze6QxxwueakOqlo8cOYdULkTyreGO6SYNNaEXq2UygMIPtYMVlBr/YDWukhrXZSVlTXGjxNi4v3w+eI+rw/912oev+MsDv7kUnJ73cz84rrtNHecNKjmvd9BWiHMWd3vuOXBJds2fuP8kMccLnkpDto8PlrnXAfxTqOWLibcWBP6C8Btwee3Ac+HJhwhzGHTgRr+tLWs53XxPRdjtRhV8zirhTe/dUGf8lf99h+0uoNJvWwLlL0PZ38JLP1Hge6ramVBvosZWcnjFv9Ey00xbvpWueOMJeqK/wrN5WGOKvaMpNviU8A/gTlKqXKl1B3AvcAqpVQJsCr4Woio0fvG5/YfrCLJ3vd2kyPOyvLpGcwN9lIpre/g3r8FJ6h677dgTzHakU/i7vKztbSBxZNTxy/4MOi+H3C4rh2Wf8kYUPXe78McVewZ9qao1vrmQd5aOch2ISJaU4e35/n+H1+CI27guVaeuvNsADbuq+aOtVv5+75qvrksgbS9z8Pyr4C9fw18R1kTHV4/K+dGVz+ChQUpOO023j5Yy8ULFsJp18K2x+C8b0FCdP3xMjMZKSpEL3e/UMySH20A4JHbiwZN5r2tnJfDdacXUN3i4W8P341GwVmfH7Ds7vJmgKirodttVgrSE3sW7eCcr4G3zRhYJSaMJHQhenlsc2nP8+XTM0e837+sKGRGYidX+1/nWP4lNMfl9CtzrL6D9w7XMyk1ISr6n58sy2mnNjilAXmLYPrH4f0/gM8T3sBiiCR0IYKqgt0IbzlrCkd+tpqE+JFPa3vapBQ2LN+DQ3n57OELuOR/3u7z/n2v7ee8+zaxcX8N580e+R+KSJKVbKeyd1fMFV+HtmrY+VT4goqvsfldAAAVIUlEQVQxktCFCOrucz4/39V/oNBwOhqwbHmI+imXckhPorLZzaHgAhY1rW5+u8k4ts2i+NbFc0Mat1ksyHdR0+rhePf6otMvgPzT4e37wecdalcRIpLQhQB+s7Gkp7nl+jMKRn+A9/8I3layLruLP9x6BgAr73+LO/9vK8t+urGn2JbvX0R6UnwoQjads6dnAPD+4Xpjg1Lw8e8bA6x2PBHGyGKHJHQR89xdfu7fcBCA+65fNPoVhDqb4P3fw9zLIWcB0zKTet56fW91z/MbziggLUqTOcDcXCeOOAt7K1pObJy5EgqWwdu/kLb0CSAJXcS84mAC+vl1i7ihaPLoD/Dur8HdDOd/B4A5uU5+d8vpXLUkv0+xn16z8JRjNTOLRZGfktC3HV0p+Pj3oOU4bP+/8AUXI8Y6OZcQUWNXeRMA580ew9QULRXGAJqFnzR6dgStXpjH6oV5/PrGJdy1fg8FaYnE26K//pSX6qC8saPvxukXwJRz4O37YPHNA/bPF6ER/T9hQgyhxd3FI+8eYXpWErljmf1w03+BDsCFdw34tlKKn16zkC9eMOMUI40MZ0xNZ9fxZmpaT6qlr/qR0ePl3V+HL7gYIAldxLQfrN9DWUMnP7xiwfCFT1a9F3asgzM/B2lTQx9cBFo5Nxut4YMjJy2hMPlMWHgDbP4NNB0LT3AxQBK6iFk7ypp4fkcFN505mfNH29yiNbzyTXCkwHnfHJ8AI9DcPGNum0M17f3fvOhuQMHf757AiGKLJHQRkwIBzdW/fReA766eN/oD7P4zHH3XSFKJ6SGNLZLZbVYyk+1UNg+wDF1KAaz4mrGi0dF/TnxwMUASuohJ7x2p73mekhA3up3dzfD6XTDpDFj6mRBHFvnyUhx9e7r0tuLrkDIFXvy6dGMcB5LQRUxa977Rjvvy1z42+p1f/wG018Jl94NFfoVOZiT0QRaKjk+CK34FdQeMvukipOSnUcScD4408PKuSu742DQW5KeMbueSDbB9rTGbYP7S8QkwwuWnJlDRNMTyejMvgkU3wT9+CdXFg5cToyYJXcSc37xRQnpSPN/4xOzR7djRAM9/BbLmGYNlxIBmZifT5vHx6p7KwQtd8jNISINn/xW6BqnNi1GThC5iyhv7q3mnpI4bigpIjB/FuDqt4cWvQUcdXPN7sEXf9LehctOZk8lPcbD+w4rBCyWmwzV/hJq98Nr3Jy64KCcJXcQMj8/PXc/tAYx5VUZl829g34tw0T3S1DIMm9XCvDwXpfUDdF3sbeZKo+lq68NQvH5igotyktBFzHhldyUVzW7WfnYZM7OdI9+x9B9G3+l5V8LyL49bfNFkZnYyh2rb+k8DcLILfwCTimD9l6By18QEF8UkoYuY8Kctx/j3P+1kcnoC580axQITtQfg6VsgfTpc9VtjGLsY1i1nGSNnH3z78NAFbfFw0zpj3dGnbobW6qHLiyFJQhcx4TvP7gZgWWHGyBevaKmEJ64Dazzc8mdwuMYxwugyJSORxQWp7K1sGb6wMxdufgo6G+DJG4zpiMWYSEIXUe+94IILc3KcfOeSOSPbqbUKHr8aOhuNZJ4+bRwjjE5Lp6Syo6yJhvYRrFaUtxg++X/G/DhPXAfuEfwhEP1IQhdRrayhg5seeI/0pHjWf3kF2a4RzKjYXA6ProamMrj5achfMv6BRqGPzcqiy685HFyKb1izVsEn10LlDiOpdzQMv4/oQxK6iFoX3LeJc3++CYCfXH3ayBZ9rtwJD19sjAT99HMw7dxxjjJ65biMrp3VLaMY4j/3MrjhseB1WAUNw7TBiz4koYuo5PUFKK03elh8b/VcVi/MG36n3X8xkjkabn8Jppw1vkFGuRyn8W1ozbO78PoCI99x3hXwmeehox4eughK/j5OEUYfSegiKh2sbu15/pnlhUMX7myC574Az95hNK/c+abRpitOSWpiHDkuO60eH1f99l38AT3ynacuhzv+Dsm5sO46YzK0riGmExCAJHQRZV7eVckzW8v47GNberY54gZpatHaqJX//hzY9Qyc9234zAuQnD1B0UY3pRR/+cI5AOyrbOHRd4+M7gCZM+FzG6HoDmNg1+/Oho+ktj4UWVNURI2aVjdffnJ7z+tbz57CT64eYGFmreGjjfDWvVC+BXIXwo2PG9PhipCanJ7Y8/wnL+/j08unYreN4F5Gt7gEuPyXMP9KePkbxs3S6RfA+WuMWrzoQ2roIuJofeKre4u7ixv+sJm/bi/nh8/3nbnvonk5fXfsbIJta+H3K4yv8c3HjcFCd74lyXwcvbvmwp7n5wVvUo/a9Avgi5vhEz81Zmh89BLjfseOp8A7zGjUGKJ6/3KMemelLgH+B7ACD2mt7x2qfFFRkd66deuYP0+YQ1lDBy3urtFPPTsKmw/VMSvbSZbTjtcXwGpRWC2KQEAz/XuvcO3SSSyZksp/Pt9/+tVvXTyHL54/A4tFGV0QD22Cktfg4Ovg90D2fDjnq3Da9cZIRTHunnjvKHetN+bRefrOszl7esaQ5T0+P1oP0lzm7YBtj8GWh6DhEMQ7YdZFMGe1MTVvFK4gpZTaprUuGrbcWBO6UsoKHARWAeXAFuBmrfXewfYZa0L3+Pz8aUsZNy+bQpy175cKf0Dj9QVo6DAGL8RZFY3tXczJ7TtXh9aa14qrWDU/F6tl6JGCH9W0MSMriRa3j8v+9x1+feMSigpP/JBorSmpacPTFWBOrpN4W/8vOv6AptXdxS9eP8Cq+bk9a1ZqrXlmaxmfmJ9LWlI8Wus+Ixermt0UVzRT1eLmU8um9HmvuaMLZQGXI67nWL6A7vk/OflYvb13uJ7FBalsOlBDnNVCUryVc2YOPgTe5w9QXNFCboqDbKe9z3EL17wMwL4fXYLVonrO3+cP4PUH+sxieLS+nQ6vn3l5Lo43dTIpNWHQz+y+afbe4Xpueeh95uQ4+d2tp7Py/re4dukkfnbdQt79qI7PPtb/Z8iKn1wamGqpZt1qB6pqJ1TsMH7hwbi5tuBqWHSjMbmWDOGfcK8VV/H5x7f1vP71jUu4fFEe5Y2duBLieGxzKdcsncS0zCQu+fXbHK5tZ889F9Pp9ZOSGIfWmuoWD7kpwbEEWhvz7Ox6Gv/+V7F21hmbM2Zy2D6f/AUrSMibCxmzwJVPu9fPux/V8YkFuQA892E5y6dnkhBvJSHOSrzNwuHaNnJTHLi7AqQnGX/sN39UR2WzmzibhSnpiSyZnNpzDnsrWshPdWCzWoizqgGbk/wBzevFVXx8bvbg93OGMREJfTlwt9b64uDr7wJorX822D5jTehr3znIz17ew79fNItbzp5Kgs2CP6D5tz99yKYDtUY8J+3zly8sZ3pmIr/+ewmrFuRQ1eTmO8/uBODuKxZw9vQM/rS1jDcPVHNafgo/u3YhpfUd/OjFPWwtbcTliGP1wlye3lJGRlIc9163iDk5TjTwn+t383ZJXc9nffXCmTS2e/n6yll8cd02alvdeH0BqltO3JXfvGYl75TUsCY4BL3bvLxkzpmRweZD9ZQ1dNLh8fW8t7gghTWr5/LMljI+NjOTb/7ZiP/z50/n1rOmcN59m9AaLjktl/KGDoorWvhk0SSO1Hfg8wf40VUL+PPWcqwKHtt8FEXfa/3z6xdx/+sHWFSQSnlDB7Oyk8ly2SmpbqG0roPyRmOe6mSHlXa3EdfqhXn8rdc817kuB4/cXkRNi5unPijjtb1VXL04n9uWT2V3RQs/fGFPT9nua7Rokotbz56K1xfgnheKmT8phcsX5vLo5lKSbIrj9c048GKnC7sKPtJFgvLgop1U1U4araSqNjJoZU5CEy5vNTb8J04uZQrkLYIpZ8OMlZA9T5K4Cbx9sJbPPPJBz+uEOCudXf4+Za47vYBnt5f32Zbjsvf0Z//hFfNJTYwj2+ngL9vKea24ik5vF4vVYX5+RiOZTbvQZR+QoU70dPJZEzjWlUItqaRkFrC9IY4aXwJtOoF2HLTrBOYV5vNWaQdd2ooPK7ecM4PHP6ig3afowopP2/Bh4aZlUympaSMj2c7f9lSjgakZSRyp7+TfV83mlxtKKCrMIC0pnoL0RNIS7fz3awf45afO4tJFo5zlM2giEvr1wCVa638Nvv40cJbW+iuD7TPWhF784OdYcPyZMcUpoo9PW2gimSadTE5OHs7c6ZA6BVKnQloh5JwGSUN/pRfhobXmB8/vYcPe6tENOBohu82CxxcANLk0MN1SyXRVyTRVRY5qJEs1kUUT2aqJZDWx3SC9Nz9D/JyLx7TvSBP6qfRyGai60++vg1LqTuBOgClTpozpg/a6zuWF0r5fVQb6M6QHCOnkbQP/+TpRxh5nIc5qpdXt61Oi934LJ6Ww63j/uSZG8lm9y+S5HNjjLByp779iyx0fm8bD/zgy4H7dr2dmJdHu9fcsyHvy5/XeJ9tpp6bV07MtKd5Ku9ffb5+Pzcykvr1rwEmVPjYzi9pWNweqWwf+v9aKOblODlS1DhjPyTFNzUjEbrNyoLqt1/uQnZ7K8jmTOFDfRWWbZvnsSfxi01Fs9gRe+fbl2BwpWDt9zEiMG/lEW8IUlFL85OqFfG/1PG575AMWTkolzqa4/ZxCvv/cHt7YX9Nvn5uXTebjc7K5M9hc43LYSE2M51hD/5uhnp4BTIoqMqgKZLCZ0wC458oF/Ob9YxwIjlGw4icRD0l0kqTcJNNJovJgw48NP3H4OHd6KllJVjbsLsem/CzKS2JfZXPwEzTXLc3nuQ+Po9DBfwS/CZ94brcqPr18KjnZI5xH6BRERJPL3S8U89KuCi6cm019m5dsl52nPigj3mrB6zcu4H+sms1li/JYef9b3H/DYh7dfIQ9x1sovudizr9vE+lJ8dx2TiH/+XwxFgV77rkYjy+Au8vPN57ZydLJqSyblsGiySlsP9rI7Y9u4bkvnUN6Ujx2m5Vsp52Smjae33Gc/1g1m84uP0frO8hMtpOeFM+6949yrKGDuy6bzz8+qiMlIQ6LMtrY9lW24EqI4z9WzWbNs7upajHm5AY4VNvGJ371Nv6A5mfXLuTmZSf+6L11sJa3D9ay5tK5fGnddmbnJHO4tp2/7ali4aQUXvzqx9hZ1sRVv32XSxbk8otPLsYf0LgcNlrcPt7YX01WsoMj9e3cdOZk4qwWHnz7MBfOy2ZGVjIdXh/FFS24u/yclp9Cq9vHlAyjm9kruyuZk+ukqtnNhr3V3HnedPKD7d+/2nCQc2dlsnRKGhVNnXzhiW0UV7Tw8G1FrJyXg9aaTQdqKMxIYnpWMgBLfvQ6c3OdXDg3m/96ZT8bv3E+M4LvlTd2oJQi3mohyznwSkBbShuYneMkJSFu1D8/IjK4u/x8eKyJ06emcrCqja88tZ1FBancd/0i7DYLf91+nHNmZpCXYvwcrvrlW5TUtPGzaxeycV8NSyan8IvXDwLw8G1F5Kcm8OaBWs6fnYXTYWNyeiIenx+rUtisFrr8Ae5//SA+f4A9Fc08fedyzr9vE0frO/jg+yvR2qgItXv9nPbD1/j59Yv4ZNFkjjd14vUFmJaZBMAf3zpEaX07t5w1lfLGTlbOy8brC2CzKmwWy7D37EZiIppcbBg3RVcCxzFuin5Kaz3oqq+n0svF5w9g63VDtMPrI6Bhd3kzOS57T+LoFghoWt0+UhLjcAfb6BxxVtxdfgJaD7v8WLvHR5LdnN303V1+4q0WoxeHCXh9AQJaD3nDp8sfMGosSlHX5iFnJJNkCTGE3r/XAI3tXr729Id88YIZnDNjFHPe91LT4uZIXTtnDdMLZ6KNe0IPfshq4NcY3RYf0Vr/dKjy0m1RCCFGbyLa0NFavwK8cirHEEIIERoyUlQIIaKEJHQhhIgSktCFECJKSEIXQogoIQldCCGihCR0IYSIEpLQhRAiSpzSwKJRf5hStcDRMe6eCdQNWyoyyLmYT7ScB8i5mNWpnMtUrXXWcIUmNKGfCqXU1pGMlIoEci7mEy3nAXIuZjUR5yJNLkIIESUkoQshRJSIpIT+QLgDCCE5F/OJlvMAORezGvdziZg2dCGEEEOLpBq6EEKIIZgqoSulrEqpD5VSLwVf362UOq6U2hH8t7pX2e8qpT5SSh1QSo1tob5xopQqVUrtDsa8NbgtXSm1QSlVEnxM61U+0s4lUq9LqlLqL0qp/UqpfUqp5ZF4XQY5j4i7JkqpOb3i3aGUalFK/VuEXpPBzmVir4vW2jT/gP8AngReCr6+G/jmAOXmAzsBOzANOARYwx1/r/hKgcyTtv0cWBN8vgb47wg+l0i9LmuBfw0+jwdSI/G6DHIeEXlNesVpBaqAqZF4TYY4lwm9LqapoSulCoDLgIdGUPwq4GmttUdrfQT4CFg2nvGFwFUYv4gEH6/utT3SzmUwpj0XpZQLOA94GEBr7dVaNxFh12WI8xiMKc9jACuBQ1rro0TYNRlA73MZzLici2kSOsZSdt8GAidt/4pSapdS6pFeX70mAWW9ypQHt5mFBl5XSm1TSt0Z3Jajta4ECD5mB7dH4rlA5F2X6UAt8GiwWe8hpVQSkXddBjsPiLxr0ttNwFPB55F2TU7W+1xgAq+LKRK6UupyoEZrve2kt34PzACWAJXA/d27DHAYM3XXWaG1Ph24FPiyUuq8IcpG4rlE4nWxAacDv9daLwXaMb7OD8as5zLYeUTiNQFAKRUPXAn8ebiiA2wz+7lM6HUxRUIHVgBXKqVKgaeBC5VST2itq7XWfq11AHiQE19JyoHJvfYvAComMuChaK0rgo81wHMYcVcrpfIAgo81weIRdy4Rel3KgXKt9fvB13/BSIyRdl0GPI8IvSbdLgW2a62rg68j7Zr01udcJvq6mCKha62/q7Uu0FoXYnxdeUNrfWv3RQ26BtgTfP4CcJNSyq6UmgbMAj6Y0KAHoZRKUko5u58Dn8CI+wXgtmCx24Dng88j7lwi8bporauAMqXUnOCmlcBeIuy6DHYekXhNermZvk0UEXVNTtLnXCb8uoT7jvAAd38v4EQvl8eB3cCu4H9AXq9y38e4M3wAuDTccfeKazrG3eudQDHw/eD2DGAjUBJ8TI/gc4m46xKMbQmwNRj3eiAtQq/LQOcRqdckEagHUnpti7hrMsS5TOh1kZGiQggRJUzR5CKEEOLUSUIXQogoIQldCCGihCR0IYSIEpLQhRAiSkhCF0KIKCEJXQghooQkdCGEiBL/H7D/YsCFwf3TAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(spec_x, spec_y, label='data')\n", "plt.plot(spec_x, spec_yhat(result.x, data, 3), label='fit')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "What a bad fit! Let's try plotting the individual peaks" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "for i in range(3):\n", " plt.plot(spec_x, peak(spec_x, result.x[i], result.x[i + 3], result.x[i + 6]))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Wow, that is really wrong! We can hit on particular peaks, but they usually have no meaning. Let's try to add more info. What info do we have? The peak centers. Let's try adding some constraints describing this info:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Adding constraints describing what we know:\n", "\n", "$$ 600 < b_1 < 630 $$\n", "\n", "$$ 630 < b_2 < 650 $$\n", "\n", "$$ 650 < b_3 < 690 $$\n" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "#constraints follow the order above:\n", "\n", "constraints = [{'type': 'ineq', 'fun': lambda params: params[3] - 600},\n", " {'type': 'ineq', 'fun': lambda params: 630 - params[3]},\n", " {'type': 'ineq', 'fun': lambda params: params[4] - 630},\n", " {'type': 'ineq', 'fun': lambda params: 650 - params[4]},\n", " {'type': 'ineq', 'fun': lambda params: params[5] - 650},\n", " {'type': 'ineq', 'fun': lambda params: 690 - params[5]}]\n", "minimizer_kwargs = {'constraints': constraints}\n" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:3: RuntimeWarning: invalid value encountered in sqrt\n", " This is separate from the ipykernel package so we can avoid doing imports until\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[ 396.93605846 1535.87314691 623.85280321 610.00914022 645.00925339\n", " 670.00493358 249.15706481 150.1695907 99.16549081]\n" ] } ], "source": [ "result = opt.basinhopping(obj, x0=[100, 100, 100, 600, 650, 700, 100, 100, 100], niter=350, minimizer_kwargs=minimizer_kwargs)\n", "print(result.x)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xd8HNW5+P/Pmdmm3pstuXcbWwbTQ0kcg0mI6emJ+ZILwTeQ5KZCIDe5vzTSE3KTcOkOISSEgGkJiWNwgFBtqgvusi1ZXVpppe2z5/fHroRtde1qtSs9b168tsyZM2c08qOzZ895RmmtEUIIkf6M8W6AEEKIxJCALoQQE4QEdCGEmCAkoAshxAQhAV0IISYICehCCDFBSEAXQogJQgK6EEJMEBLQhRBigrAl82DFxcV6xowZyTykEEKkva1bt7ZorUuGKpfUgD5jxgy2bNmSzEMKIUTaU0odHE45GXIRQogJQgK6EEJMEBLQhRBigkjqGLoQQvQIhULU1tbi9/vHuykpw+VyUVlZid1uH9X+EtCFEOOitraWnJwcZsyYgVJqvJsz7rTWtLa2Ultby8yZM0dVhwy5CCHGhd/vp6ioSIJ5jFKKoqKiuD6xDKuHrpSqATyABYS11iuUUoXAn4AZQA3wYa11+6hbIoSYdCSYHyven8dIeujv1VpXa61XxF7fAGzSWs8FNsVeCyGSoNkT4K7nD9DpD413U0QKiWfI5SJgfez5euDi+JsjhBiOr9/3NCfffRGHr11Oc13NeDdnwvj2t7/NT37ykwG3b9iwgR07diSxRSMz3ICugX8opbYqpa6JvVemta4HiD2W9rejUuoapdQWpdSW5ubm+FsshOADW/8X+wshjJcsXr3xM3T4pKeeDBMloJ+ptT4RuAD4nFLq7OEeQGt9u9Z6hdZ6RUnJkKkIhBBDCQep3rWHUKZJINvOvH2H2Hmocbxblba+973vMX/+fN7//veza9cuAO644w5OPvlkli1bxmWXXYbX6+WFF17gscce46tf/SrV1dXs27ev33LjaVhfimqtj8Qem5RSjwCnAI1KqQqtdb1SqgJoGsN2CiFiWrf8nVCLgXflqVSUFuB94ElCrzwO89eNd9NG7X8e386OI50JrXPRlFy+9aHFg5bZunUrf/zjH3n99dcJh8OceOKJnHTSSVx66aVcffXVANx8883cddddXH/99axZs4YLL7yQyy+/HID8/Px+y42XIXvoSqkspVROz3PgPGAb8BiwNlZsLfDoWDVSCPGupkf/DCgyP/RRii/7JAD6338f30alqeeee45LLrmEzMxMcnNzWbNmDQDbtm3jrLPO4oQTTuD+++9n+/bt/e4/3HLJMpweehnwSGw6jQ34g9b6KaXUq8CDSqnPAIeAK8aumUKIXu/sBDssXPlebDYTnJB3cD/t3UEKshzj3bpRGaonPZb6myp45ZVXsmHDBpYtW8a9997L5s2b+913uOWSZcgeutZ6v9Z6Wez/xVrr78Xeb9Var9Raz409to19c4UQZmMnoZJM7HYbSilUZSGZrX7q3eM7fpuOzj77bB555BF8Ph8ej4fHH38cAI/HQ0VFBaFQiPvvv7+3fE5ODh6Pp/f1QOXGi6wUFSKNeFoasNwKa1pl73vmrJmEPQZdte+MY8vS04knnshHPvIRqqurueyyyzjrrLMA+M53vsOpp57KqlWrWLBgQW/5j370o/z4xz9m+fLl7Nu3b8By40VyuQiRRlpe2ggRhZ69qPc9xwknEt64Ff3Gv+DU08axdenppptu4qabburz/rp1fb9kPvPMM4+Ztrhu3bp+y40X6aELkUbatr4IQMay03vfKzrjfQCo3W+NS5tE6pCALkQa0fv3ADD37HeXgmTOWwRobPV149QqkSokoAuRRjJaW8GlsOXn975nOByQZeJql9x4k50EdCHSiL3Di5Xv6vN+OD8Te6fcKGKyk4AuRJro9PrRnZpQcUGfbeGiInSXJuxL7GpLkV4koAuRJvbv2E4kYJBRVdlnmzWlCitg0rb7zXFomUgVEtCFSBOhva8DYJ82u882Y1Z0DnTn268ktU3p7tZbb2XhwoUUFBRwyy23AKmfUXEwMg9diHRxMLpwKGPuoj6b8pYsJwh07t6V5Ealt9/85jf87W9/O+Yenhs2bODCCy9k0aK+P+dUJz10IdKEUX8IgLyFy/tsm15dDUCoTqYuDte1117L/v37WbNmDT//+c+57rrr+k2Rm06khy5EmlDNTYAmo6qqzzazoAAMcHakaUqlv90ADW8nts7yE+CCWwbcfNttt/HUU0/xzDPP8MQTTwBwxhln9EmRm06khy5EmrC7OyDDiM47P45SCrJMHJ6ucWiZSBXSQxciTdi7/ESynQNuj+Rk4OhO02mLg/SkxfBJD12INBCJaEyvRSQva8AyVn4u+CL4/IEktmziOT5FbjqRgC5EGujodGN5FVZh4YBldHEJYZ9Jy5H9SWzZxHN8itx0IkMuQqSBll3b0ZaBUV4xYBlzShVE3qRrz3aYtTCJrUtfNTU1QPTOQ1deeSXQN0VuOpEeuhBpoHXXNgAyq6YPWMY5I7rgyL9fbnQxWUlAFyINhOoOAJA/e96AZXLnRBfC6IaDSWmTSD0S0IVIA7bmIwBkzx74Nmf5sR660dqYlDaJ1CMBXYg0YHM3Rx+nzBiwjL20BADDLXnRJysJ6EKkAUdnB5hgZGcPWMZwONAOhU0WF01aEtCFSAP2bi/aZURXhA5CZ9iweeVGF5OVBHQh0oDpC6Kz+i75P14kOwPTF0ZrnYRWiR5XXnklDz300KBl2traWLVqFXPnzmXVqlW0j8EtAyWgC5EGDJ9FJCtjyHI6LxftB09Xeq50nMhuueUWVq5cyZ49e1i5cmVv/vVEkoAuRIoLBANoP0Ryc4YsqwoLsfwGrQ21SWhZequpqWHBggWsXbuWpUuXcvnll+P1egHYunUr55xzDieddBLnn38+9fX1ANxxxx2cfPLJLFu2jMsuu6y3/NG++c1vcuWVVxKJRI55/9FHH2Xt2rUArF27lg0bNiT8nGSlqBAprr3pCFbAgIK+9xI9nllSRiRs4DmyH/q5EUaq+uErP+SdtsQuiFpQuICvn/L1Qcvs2rWLu+66izPPPJOrrrqK3/zmN3zhC1/g+uuv59FHH6WkpIQ//elP3HTTTdx9991ceumlXH311QDcfPPN3HXXXVx//fW99X3ta1+jo6ODe+65p8/3HY2NjVRURFf6VlRU0NTUlNDzBQnoQqS8zv17AIUqKh6yrHNKFUEgcCi9cpCMl6qqKs4880wAPvnJT3LrrbeyevVqtm3bxqpVqwCwLKs3EG/bto2bb74Zt9tNV1cX559/fm9d3/nOdzj11FO5/fbbk38iMRLQhUhx/toD2AF7+dQhy+bMmE0rEInd3ShdDNWTHivH96KVUmitWbx4MS+++GKf8ldeeSUbNmxg2bJl3HvvvWzevLl328knn8zWrVtpa2ujsJ8kamVlZdTX11NRUUF9fT2lpaUJP59hj6ErpUyl1OtKqSdirwuVUhuVUntij0N/HhRCjFi4/jAArqnThiybM3MOAKqlfkzbNFEcOnSoN3A/8MADvOc972H+/Pk0Nzf3vh8Khdi+fTsAHo+HiooKQqEQ999//zF1rV69mhtuuIEPfvCD/abfXbNmDevXrwdg/fr1XHTRRQk/n5F8KfoFYOdRr28ANmmt5wKbYq+FEAkWaY4u5c+ZMWfIsrbScgDMtpYxbdNEsXDhQtavX8/SpUtpa2tj3bp1OBwOHnroIb7+9a+zbNkyqqureeGFF4B3h1VWrVrFggV90zBcccUVXH311axZswafz3fMthtuuIGNGzcyd+5cNm7cyA03JD5kquHMV1VKVQLrge8BX9JaX6iU2gWcq7WuV0pVAJu11vMHq2fFihV6y5YtiWi3EJPG1msuIfPZd5j78ovY8vIHLatDId45YSmh6jyW/vGlJLVwdHbu3MnCheOX5rempoYLL7yQbdu2jVsb+tPfz0UptVVrvWKofYfbQ/8F8DXg6Hk4ZVrreoDYY+IHhIQQGB0dKJseMpgDKLsd7VDYvd1JaJlINUMGdKXUhUCT1nrraA6glLpGKbVFKbWlubl5NFUIMamZXV3gGnzJ/9F0hh273IZuSDNmzEi53nm8htNDPxNYo5SqAf4IvE8p9XugMTbUQuyx30mVWuvbtdYrtNYrSkpKEtRsISYP0xtAu8xhl9eZGdj8YSwrMnRhMaEMGdC11jdqrSu11jOAjwJPa60/CTwGrI0VWws8OmatFGISM/0hIhlD53HpoXNziAQN2lsTv3BFpLZ4lv7fAqxSSu0BVsVeCyESTAUsrMzM4ZfPy8PyG7ib68awVSIVjWhhkdZ6M7A59rwVWJn4JgkhelhWBB1Q6EHyoB/PVlxKOGgQaK0DThq7xomUI8m5hEhh7vpatKXQw5jh0sNZVgERhT/NVoums+Gkz/3zn//M4sWLMQyDsZq+LQFdiBTWUbMHAFVYNOx9MmMrSiONh8ekTWJ0lixZwsMPP8zZZ589ZseQgC5ECvMeOQiAraR82PtkTZ0OgGqV5f+DSXb63IULFzJ//qBrL+MmybmESGHB+joyAOcwEnP1MIuiiaFs7vRZ/t/w/e8T2JnY9LnOhQso/8Y3Bi2TzPS5ySABXYgUFmlpACCrauaw9zFjmf7sHveYtGkikfS5QojkaW8FIH/G3GHvYuZHE586vV1j0qSxMFRPeqwkM31uMsgYuhApzOh0AxpXWcXw98nKRJsKp983dOFJLpnpc5NBAroQKczs8qAcoMzhL/1XSqEzHNj9IcJhawxbl/6SmT73kUceobKykhdffJEPfvCDxwzXJMqw0ucmiqTPFWJktq0+EbPNz8JXdoxsv3NOJ89sIPehV8grTM0cSpI+t3/JSJ8rhBgHpi+AdtlHvF8kN4dwwMDbLlMXJxMJ6EKkMCNgYWW6Rr5jXgFWwMDvbkh8oyaIiZg+V2a5CJGitNaogCaSNfzEXD1UYQlWwMDqkIA+mUgPXYgU1enpJBJQ6NzcEe/rKptCJGTgb64dg5aJVCUBXYgU1XH4ADqiIH/kc5rzpkXzuYQaJKBPJhLQhUhR3Yf3A2ArGvntel2xu4OpVhlymUwkoAuRogJHoulv7SNYVNTDLIyuFrV72hLaJtG/4aTP/epXv8qCBQtYunQpl1xyCW534lMzSEAXIkWFm6JTDnvS4Y6ErSC2/L+rM6FtEqO3atUqtm3bxltvvcW8efP4wQ9+kPBjSEAXIkXptug9QXOnzx7xvmZPQPelTz6XZEt2+tzzzjsPmy06sfC0006jtjbx32/ItEUhUpTqiA6X9OQ3HwkzLw8Ap98PWsM4pHIdiece3E3L4cT+8SmuyuasD88btMx4pc+9++67+chHPpKYEz2KBHQhUpTp6QSle4PzSCi7nYjTHp3H7vdgZIx86uNkMB7pc7/3ve9hs9n4xCc+kfDzkYAuRIqydXeBU436Rgk6KwMr0EFX2xFyp6Z2QB+qJz1Wkp0+d/369TzxxBNs2rRpTG6AIWPoQqSoaB6X4WdZPJ7OycEKGHS2SD6XgSQzfe5TTz3FD3/4Qx577DEyM0e++nc4JKALkaJMf4hIhmPU+6uCQsJBg67WIwls1cSSzPS51113HR6Ph1WrVlFdXc21116b8PORIRchUpTht4iUZIx6f2dJKdZuybg4GMMwuO222/q8X11dzbPPPtvn/XXr1rFu3bo+79977729z6+66iquuuqqPmX27t0bX2OHQXroQqQgv9+PDkaHTUYrs2IqVsAgLAm6Jg0J6EKkoPaWBqyAAaOY4dLDWVSEtgyMjsYEtmzimIjpcyWgC5GCPLUHQCuMgqJR12EW5APg6GxOVLMSLpl3TEsH8f48JKALkYJ8dQcAsJeUj7qOntWiLk9rQtqUaC6Xi9bWVgnqMVprWltbcblGcUOTGPlSVIgUFGqoxQE4y6eOuo6efC6u7vG5A/1QKisrqa2tpbk5dT9BJJvL5aKysnLU+0tAFyIFRVqi497ZlSNf9t+jp4ee4e9OSJsSzW63M3PmzPFuxoQy5JCLUsqllHpFKfWmUmq7Uup/Yu8XKqU2KqX2xB4Lxr65QkwOyh0dJsmZNvLEXD16AroZCEOwbxIpMfEMZww9ALxPa70MqAZWK6VOA24ANmmt5wKbYq+FEAlgdkZzZduLi0dfR+zWdVbAJNQpM10mgyEDuo7qSYNmj/2vgYuA9bH31wMXj0kLhZiEzC4PKDCys0ddh7LZiGS4sIIG7ia5Fd1kMKxZLkopUyn1BtAEbNRavwyUaa3rAWKPI79PlhCiXzavN67EXD1Ubi5WwKCp/nCCWiZS2bACutba0lpXA5XAKUqpJcM9gFLqGqXUFqXUFvk2W4jhsfkDRFzxz1mwFxUSDhh4JJ/LpDCieehaazewGVgNNCqlKgBij00D7HO71nqF1npFSezGtUKIwRn+MDrTGXc9jpJSrICB4e33n6eYYIYzy6VEKZUfe54BvB94B3gMWBsrthZ4dKwaKcRk4guEMYIRdFb8KVbtRUWEAiY2X0sCWiZS3XA+01UA65VSJtE/AA9qrZ9QSr0IPKiU+gxwCLhiDNspxKSx73AdzoCBLX/0eVx6mPkFRIIGDgnok8KQAV1r/RawvJ/3W4GVY9EoISaz1sZaSoMGjqLR53HpYRbkgwUub2ou/xeJJblchEgxkdY6iChshaOfg96jZ/l/Rldb3HWJ1CcBXYgUo5qjc8btpRVx19WzWjTTm5r5XERiSUAXIsWY7dFVna6K0Sfm6q0rFtDtgSA65BuitEh3EtCFSDE2d3SKoWvK6BNz9TDzowHdChi4m+rirk+kNgnoQqQYe2c7AGZxWdx19dzkwgoatDTK8v+JTgK6ECnG1tURfSyIP4GpmZsLSmEFDDqbpYc+0UlAFyLF2Lq6oom5YtkS46FME5WTQzhgEGyXfC4TnQR0IVKMzedHOwyUkZh/ntF8LiZ0Sg99opOALkSKsfkD6Ax7wuozCwrxBxw4uutHvK8V0fhDVsLaIsaWBHQhUkjEimAGLXRG/Im5epgFBYRCdjJ9DSParzsQ5ro/vMaCbz4lN3JOE3JPUSFSSKfHjQ4oIqWjv7HF8cz8PHRAURAaWcbFT//iUc73/AXTmEVr9/spzk7cHxkxNiSgC5FC3C0NWAEDlYAvRHvYCgpQfouiSAtEIjCMsflX99bz/e7/Zr4tOtXxrRfnUbzq0wlrkxgbMuQiRAppbazFCipsRfHncelhFhSgIhozHMHqGl4v/e1Hf8F8o5afFX6LXXoaOf++hRaPrDRNdRLQhUghTQcPoC2DvCnx53HpcfRq0a6mg0PvoDUf8D3OK5H5XHT5f/Bg5FPM0EfY+NSGhLVJjA0J6EKkEN0SnVqYUR5/HpcePflcrKCBr2XogP6vzU9RHq6jYcYVvHzHTgqbV/CPji/gffNRrIh8OZrKJKALkUKcscRctrLKhNXZu/w/MLyAHnj9QQLYKSu6kPb6bqoWFrDXfw7LrA72N3clrF0i8SSgC5FCHJ7onYUSkcelh5kfDehev4POhv1Dlp/veYU9GcvZ/Wo7U+fns/qzJ6BViE5/NYfqJB9MKpOALkQKcXW5gXeHSRKhJydMezAPe8fgPfRQ+2Gm61oOZ62is8XPvFPKcbhszJ5vZ7//NLx7XkxYu0TiSUAXIoU4Yzei6OlVJ4KRmwuGQXcom3z/4Plc9rz4BAAe20kAVC0sBGDOaXMI6Byo2ZuwdonEk4AuRApx+qNTA828+G8Q3UMZBmZ+PmErk5LQEYgMvJQ/tOdpmnUu9mAhuSUZ5BS6AJiyMDoEZLRJGoBUJgFdiBTi8PnRDhNlS+yaP7OgACIO7ISJuAcYB9ea6R2v8rZjOa01HirnvfspISvPicvRQchfLDNdUpgEdCFShdbYgiEiGY6EV20W5OMImwA01Ozot0zdrq3kR9o5lHkOAW+YslnHfkrILgjREZpGbe0w5rKLcSEBXYgUof0d6IDCysxIeN1mfj4ZVgSAd7a/0W+ZPS89BsC8+SsBKKnKOWZ7QVUeXZESjmx/LeHtE4khAV2IFBHsbMIKGFjZiUvM1cNWUIDq6sarMvDVbeuz3YponIee5YitEiOYg2EoCioyjykzY9lsANx7DiW8fSIxJKALkSL87gbCAYNIbuJmuPQw8wuw3G4aXbOp8PedqbJ5ey3V1naC086hpbaLgopMbHbzmDJVC6cBEGyWnC6pSgK6ECmiu70RK2CiC0sSXrdZUADhMN6suczRB3F3B47ZHjjwIhkqSPGy1bTUdlFU2fdTQka2A4fZQbhb0uimKgnoQqSIrvrDaEvhLJ+S8Lp7FyplzyZX+di9a/sx2wsaniekTezT30O3O0BhRVa/9TgcXYRCOf1uE+NPAroQKSJwJDo2nVM1PeF19+RzycmL1v2vZzcds31q20tsN+bR0RGdLplfduz4eW89WRE84XK0ryPhbRTxk4AuRIoIN0dvEVdQlbhMiz1ssZWnhbkVBHBQ5Xmzd1tn0yEq/bs5VHga7iYvAPml/Qd0W4GLoM7CfWB3wtso4icBXYgUYbS3AuAsTtzNLXr0DLmEPd005S1lSehtguEIkYhm/Z2/xECzaOWncTd4QUFeSf9TJ50V0fH9I7sOJLyNIn5DBnSlVJVS6hml1E6l1Hal1Bdi7xcqpTYqpfbEHhOXTUiIScjWGR3GsBUm/p9Sb070djfu8jNYYtTQUrePV2vaOMP/L3ZGqpiz6ETcTT5yCl3YHGa/9cw8YS4Ah/Y2JryNIn7D6aGHgS9rrRcCpwGfU0otAm4ANmmt5wKbYq+FEKPk8EZzjZuFhQmv28jJAdPEam8nuOBiAH5/+4/Y8uImTjL2ED7howC4G70Djp8DLF1ciUEIf3so4W0U8RsyoGut67XWr8Wee4CdwFTgImB9rNh64OKxaqQQE10konH6/Gi7gZGR+JWiSinMguhc9CUnVPMvaynX2p7g/F3fwk0OSz50PVrrIQO6YShc9jZCXpm6mIpGNIaulJoBLAdeBsq01vUQDfpAaaIbJ8Rk0enpxAxY6CzXmB3DVpCP1d6O02bywtyv4cfBVNXCPaU3olx5eDuDhALWgF+I9tbj9OIP5ROOpRIQqWPYAV0plQ38Bfii1rpzBPtdo5TaopTa0tzcPJo2CjHhdbfWYwUMdE7il/33MPOiAR1g+YkrODNwKycGbiNryWoAOmMrQAf6QrRHbr6J1yqipl7+PaeaYQV0pZSdaDC/X2v9cOztRqVURWx7BdDU375a69u11iu01itKShK/Ak6IicDvriMcMCAv8cv+e5gFBYTd0YC+ekkFGz5/Lj/4yGlcecZMADpb/QDkFA3+KSG7JAsLBy379o1ZW8XoDGeWiwLuAnZqrX921KbHgLWx52uBRxPfPCEmh7C7Hstvwhgs++9hFhRgtbt7Xy+eksfFy6fisEXDgGeYAb1ganRaZcehujFqqRit4fTQzwQ+BbxPKfVG7P8PALcAq5RSe4BVsddCiFGIdNYTDhiYJeVjdoyeL0W17v8GFZ5WHxk5duwDTFnsUTEnutrU19ye8DaK+Ax5WxSt9fOAGmDzysQ2R4jJSTfXoiIKx5SqMTuGWZAPlkXE48HMze2zvbPVT07R0DNsSmZWATWEO/xj0EoRD1kpKkQK0M1HAMitGLvJYraexUVtbf1u97T6yS0eepaNzWnHaXRgeQfq54nxIgFdiBRgc0dnjGSM4cQBsyg69h1ube2zTUc0njY/uUOMn/dw2juxAmM3xVKMjgR0IVKAvTM6Hm0rSvwq0R62klhAb27ps627I0jE0sMacgGwOYMEwnlDFxRJJQFdiBTg6PYAY7Psv4ctlvQr3NI3oHtao3PQh5rh0sOeo/BFCvB2uocuLJJGAroQ480K4/QHgbEN6GZ+PhgG4da+Ab1nDvpwh1xyS3LQmGx/bUdC2yjiIwFdiHHm72jACigiTjuGwzFmx1GmiVlUiNVvDz02B71weAG9YmZ0emVzjcxFTyUS0IUYZ56WWiy/gc7u/7ZviWQrLul3DN3T6iMj1zFg2tzjlcXmogdbZMgllUhAF2Kc+VpqCftNIgVjN9zSw1ZU1O8Yemfr8Ge4ABRPr0IRJtwZGLqwSBoJ6EKMs0DbIcI+AzWGq0R72IqL+5226Gn1D/sLUQDDZpJhurF8Mhc9lUhAF2Kc+VsOEvKbZE+bNubHspUUE25pOWb5/0jnoPfWZesiHEh87nYxehLQhRhnVvMhdMggZ2rFmB/LVlwMoRCRjo7e90Y6B72HIXPRU44EdCHGmbM1OlPEVjL294jpb7XoSOeg91CZ0bnoVmwOvRh/EtCFGGfZnmhuFVsS7hfQu7joqJkuI52D3iOzMDorZ//2XQlqnYiXBHQhxpG2wmT7ojeHTkpAL+m7WnSkc9B7lMfmotfuPZSg1ol4SUAXYhx1t9ah/dF/hrbSJAT0oiIArNajA/rI5qD3mDI3eqejrgbJi54qJKALMY66mmoI+wy0aUSX5o8xIy8P7PZjeugjnYPeY+rs6SjCBNwyFz1VSEAXYhx5GmsI+0x0Xj7Ruz2OLaVUdC5607s3eB7pHPQept1GhukmLHnRU4YEdCHGUXdzDWG/ga107Ge49LCVlhBujgb00c5B7+GwewgHJS96qpCALsQ46jyyh4DPTsaUKUk7pr2snFBjIzD6Oeg9bK4QgXDf29mJ8SEBXYhxlNl9iLDfhj0JX4j2sJWVEW5oAKBzlHPQezhyDPyRAjrdHUMXFmNOAroQ46gscAQCGltx8gK6vbyMSHc3VlcXnpZoQB/tkEtGbC764Xf2JKx9YvQkoAsxTrq6uykJJG9RUQ9bWXT+eLixsXdR0Wh76HlTou1uOVCbmMaJuEhAF2KctNXtQfuSNwe9h728DIBQQwOdrX4y8xzY7CObg96jJy+6p1HmoqcCCehCjJPu+j2EvNFAak/il6K28lgPvaERT4uP3FF+IQpQOWdmdC56u8xFTwUS0IUYJ+/sePPdgF4+9rnQe/RMkQw1Rnvoox1uAXBZtXRuAAAeMklEQVQ4HWSY7YS8iWqdiIcEdCHGictzEK/XicrIwMhN3tQ/w+HALCoiWN9IV3uA3OL45pE7bB7CAZmLngokoAsxTooCh/H5s7BXVCRllejRbGWleJo60REd15ALgM0VlLnoKUICuhDjZFr4ICG/A3vF2N/Y4nj2snI8bSEAcuLsoduyDPyRfAJdXYlomoiDBHQhxkFXRyvlqg26NbaK5I2f97CVl9HVHX0ebw/dWZgJQO2uffE2S8RJAroQ46Dj4FtELDC6/djLx6eH7o24UAqyC51x1ZVTEU3J27j/cCKaJuIwZEBXSt2tlGpSSm076r1CpdRGpdSe2GPB2DZTiIml+/DbhH2xGS7j1EP3uYrJyrFhmvH160pmReeid9S3JaJpIg7DuZL3AquPe+8GYJPWei6wKfZaiAnLF7S48p5X+NFT77D9SPx5S9oOvE5nd3Sow5bEKYs97BVT8GcUkZVhxV3XrIVzMQjR1SpzF8fbkAFda/0scPyf3ouA9bHn64GLE9wuIVKG1po/vXqIF3bV8uhzm7nmrn/FXWdJ5w4aAtGhlvH4UtRRVYnfVUim8sVdl8vlJMNsJyjfiY472yj3K9Na1wNoreuVUslL5ixEEt3+7D5+89S/qC67m+J57XSaBjlWhHW//C5zyr9C6bRT+NTpM0ZUZ0uHh8rAXl7oXk453UldJdqrsISAI4+MYGNCqnPYu7AkL/q4G/MvRZVS1yiltiiltjQ3Nw+9gxApwopo/rDpQYpn/ZTX89xM786lun0RFd2FvJjn5e+eb7Hx77/khb0tQ1d2lK0vP4dThWlrt2ErK8NwJT8QdrYFQBlkdDUkpD6bK0zQkrno4220Ab1RKVUBEHtsGqig1vp2rfUKrfWKkiRmlBMiXr9+8jHUtN8TVFB68BLuufZ57vvin/jdNc9g1nyabmWjtuopHt/wE4LhyLDrNetfA2BhVgb2qsqxav6gOpqiQy3Opv0Jqc+Wa8MfycfdmJgevxid0Qb0x4C1sedrgUcT0xwhUsPO2no21t+MzwDb4Y/xhy/djCuWkTDLaWPT175I26F1dCsbu3M38Mv7fkfIGl5Qz2t6hWZVhL21DUfVtLE8jQG5m6JfYDoO70hIfRmleQDU7tiVkPrE6Axn2uIDwIvAfKVUrVLqM8AtwCql1B5gVey1EBPGD/78SWqcMOXIWdz+n1+kJOfYudr5mQ58gen4j1zBbqedLs/3ufepF4asNxwKMa97K/szTyLc1IRjWtVYncKgOhq9OG0WRmsDVgJWeOZOmwpAy/66uOsSozecWS4f01pXaK3tWutKrfVdWutWrfVKrfXc2KNMQBUTxpY37+eNgkaqO3K450u/Yk5pdr/ldn/3ArbeeDOnZL6HR3IdVGz/EjocHLTuA9teII8u7AXLAbBXjk9Adzf5yM2N5o8J1cZ/c4pFKxYB0FzrjrsuMXqyUlSIozz55mG+89IPKbQ0l59+G3kZ9gHLOmwGNtPglxf9mEydyX35bv72y88OWr9v25NEtKIwb060jvHqoTd5ySuNLtlPREAvKMwn02zF6tJx1yVGTwK6EEf53d++wX6Xpry5mtMXzBvWPtmObC6e/UV2OJ349N+pee4P/RfUmqmHH+cVtYSc7uiXkvZpyR9DD/rDdHcEKZxeGH198GBC6nXYOwj5sxJSlxgdCehCxHR2tdBU8hqzAorfXn8npTnDn0749bM+xqLCxdxaUET2pi/xg/ueOGb7C3tbuOIbP6MoeITtxR8gdPgwRlYWZn5+ok9jSB3N0T8mBdMKMYuKCBw4kJB6TVcAX7gQHRn+jB+RWBLQhYj5xcNfpMVmcG7hpyjIGlkGQqUUX17xJdps8OfcLC7ecwMBnweIpg34+J0v85+2R2nT2Zz2wSsJHtiPY+bMpOdBh3enLOaVZuCcNYvgvsRMXbTn2QnpLJprjySkPjFyEtCFAPY1HGFT6HXme00+tur6UdVxSsUpnDHlDNYXFzHVqGPLTy6hsbWVn/9zNxcZz/Ne802s07/A4plTCOzdh3P27ASfxfD0TFnMK8nAMWsWgf370Tr+se+yGdEF49u3bI+7LjE6EtDFpBeJaL5133W02QwWZV5Ged7oV25+fvnn6dY+/iP7HE4Pb8G6dQXLX7yen9j/j1cj8yhe9V9YnZ3RKYtzxiegt9d3k13gxOGy4Zw1k0hHB1Zb/BPV5i1fCEDr/vi/ZBWjIwFdTHq76uqpLdzFfL/BNz9+Y1x1LS5ezOkVZ7K7uJGPhL7O/kgFi1UND1rnsuDLf0eZdgL7ojeCcM6ek4jmj1hrXTdFU6NTMR2zon9UgvvjH3YpnjMHkyBWW/wJv8ToSEAXk96T//4WrTaDT837f9jto81X96511Z/FUl2s+WQl1Tc/y0rrVh6r+io5ebFZJT0BfRx66JYVob2xm8Ip0dkozlkzAQgkYBzdsJlk2puxvI646xKjE/9vrxBpLBTo5m/dLzInbPCB91yXkDqXly7n5PKTuXfbvXx4/od57ZurjvnyM7B3H8rpxD51akKONxIdTT4iYU1RLKDbKipQLheB/Ym5fZwjo5vurlKC4QgOm/QXk01+4mJS+99Hv0yTTbEi+5KE9M57XLP0Gpp8TTy691FyXHayne/WHdi3D8esWSjTTNjxhqu1LrrMvzA25KIMA+ecOQR270lI/QXlLvyRfF5/a3dC6hMjIwFdTFqtHZ082fkcswOKL11+c0LrPrX8VJaWLOWut+8iFAkdsy2waxfOueMzft52pBtlKArKM3vfcy1ahH/HjoTMdJm+MHqzjsNv7Iy7LjFyEtDFpPWrDV+h0W5wedWHyXAOvMR/NJRSfHbpZznSfYS/7v9r7/uhxibCTU1kLFmS0OMNV2tdF/mlGdjs7346cC1eTKSzk1Bd/Im1qpZFZ7pY9SPLES8SQwK6mJQa3R38O/RvZgTg4+fFN7NlIGdNPYuFhQu54+07CEfCAPi3R+dou8YpoDcf9lBUeWyyMdeiaGIt//b4U+lmVVThMjrQ7sGTlImxIQFdTEr3/vUmGuwG8/X7McZoLFspxWeXfZaDnQf564FoL92/bRsYBq4FC8bkmIPp7gjQ1RagbMaxdxZyzpsLNhv+HQnIja4UTkcrIZ/cvWg8SEAXk05Ht5envZuZGYQfX/3TMT3W+6rex8LChdz25m2EI2F827fhnD0bIzNz6J0TrOlgNBVB6XEB3XA6cc6Zk5iADqjcEJ5wOUF3e0LqE8MnAV1MOv/36I0csSsuqbgYZYztPwGlFOuWreOw5zCP730M/7btuE44YUyPOZCmmk6UoSipyumzzbVkMb633kpIYi1dlo/GpOaV1+OuS4yMBHQxqfj83TzdvYnpQVh7wbeScsxzq85lUdEiHtr8a6zWVjJOGJ/x88aaTgqnZGF39h1iyjr5ZCIdHQR2xz/dcMk5KwB485W9cdclRkYCuphUvvuH/6TOoVhVcBGGmZx1dUopPlf9OYreaQAg85RTknLco+mIpqmmk7LpfXvnAJknnwyA95VX4z5W9ZK55NgaCLbGXZUYIQnoYtLYf+Qwz+ktLPCbXLvm20k99llTz+I9Dfl0ZBuEqsqSemyAlrouAt4wU+b2n3/dPmUK9spKvK/GH9AB7Jkd+Pxl6HA4IfWJ4ZGALiaFrkCY/33ic7TbDD63/Ms4HcnPerHkkGZblebubXcn/dh1u6JfUE6dXzBgmcyTT8b76qsJGUfPrMoloHPY/OQzcdclhk8CupgUbrzvAZ6z7+dEXwbnnvKppB8/8M47qJZ21CnVrN++nlpPclPM1u5qJ78sk+yCgVMDZ51xOpbbHZ1aGaezLjobgLrXZBw9mSSgiwkvHLZoCv4chWZF5U3j0gbPpqdBKS745DcxDZMfvfqjhCy1H45w0KJut5vKBQP3zgGyzzkHbDY8//hH3McsnFZFnr2WSLsz7rrE8ElAFxPet373ZXZkhbjEcSLXfXDNuLTB8/QmMqqrmVK1kHXL1vHM4Wd4quappBz78DvthAMWM5cVD1rOzM0l67TT6Ny4MSF/bHKKu+kKVrL/gNzwIlkkoIsJq7UrwN+3vMhzeiMzg/CVD98+LvfwDOzZQ2DHTnLOPw+ATy/6NEuLl/L9l79Pi2/sc57sf6MZR4aNqfMG76ED5KxaRejgIQK7dsV93KLqeWhsHN70bNx1ieGRgC4mrBXffYq7Xv1PvIbiG6d+H7t9ZDd+ThT3hg1gs5H3oQ8BYBom3znzO3hDXm56/iasiDVmxw4HLfa/3syMpUWYw8hPnnPeKpTdjvuhv8R97PJTTybTaKF5lz/uusTwSEAXE5I3GOas0l+zMzPM2pz3cNrSD41LOyJeLx1/eZic956Lraio9/1Z+bO48dQbeeHIC/z6jV+P2fH3vd5M0Bdm0RlThlXeVlBAzvnn07FhA5Hu7riOXV6QSbezjiZPFY0JyrcuBicBXUxI9/31K7xeVM+yjhzWXTx2AXMo7of+guV2U/j/ruqz7bK5l3Hp3Eu54+07eHjPwwk/ttaatzfXkluSwZR5/c8/70/hJz9BpKuL9gceiOv42U4bdXPmA/DQb/9Kd0DmpI81CehiQvnFP3dz893r+I37n8z3muTk/QibLfl3BgKwOjtpue02MlesIPPE5X22K6W4+dSbOXPqmfzPi//Dk/ufTOjxD+9so/FAJ8tXTRvRdwcZ1dVknXUWrXfcidXREVcbvrJ2JZnO3dj9s7jz8cQsWhIDk4AuJoyDzV1seeMrPGY8x1yfjZOm/pbfrn3PuLWn6Wc/w2pvp/TGGwYsYzft/Oycn3Fi6Ync8NwN3LPtnoTMMLGsCC/8ZR/ZBU4Wnl4x4v1Lv/RfWF1dNP7wR3G1oyjbyTtVpYS1C9fzr9DpDw29kxg1Cegi7XR4Q4Ss6GrGpk4/s7/xV3762F/55kPv482SAyzudnGg8WZWVyc/53hvGx9/HPcf/0Th2rVkLF48aNlMeya3rbqN86afx8+2/ozPP/N5Wn3xJULZ8mQNrXVdnPWReZj2kf8zdy1cSNF//AcdDz+M+y/xDQd947qLMV07CPsX8/Vv3hlXXWJwKp7egFJqNfBLwATu1FrfMlj5FStW6C1btoz6eCI1vNPQSWtXkDPnDD6vOR6PvXmE6sp8phVl0toVIMtpw2U3sSKa2d/4KzOKMjl3fil/eek1qgv/yN7CGgKGYnHLDC5feRsXLa8cs7YNxf2Xh6n/7/8mc/lypt19F8rhGNZ+ER3h/p338/OtP8dhOrhqyVV8bMHHyHH0n1BrINufq2Pz/btYcHo5K9cuGs0pAKDDYQ5fcw3dL71M+X//NwUf/cio6/r7ln3U3/MSoUgu5e+1c/6l5+EYZNZNhzdEOBKhKFsWJgEopbZqrVcMVW7UPXSllAn8GrgAWAR8TCk1+t+eQXQHwvxs4278ob7Tu/whi6ZOP3ubPOxp9HC4zcuWmrY+5ayI5g8vHyIQHnqK2NaDbVgRTbMnwIwbnmTjjsY+db28v5Xn9jTjC/ZfXyBsUdvu5dr7tvLEW0d63/cFLX6zeS91bh8hK9LnnHY3enjw1cPc8rd3iESO/WPb0OGnyfPuFLCwFaG1K9D7eqAvnbTW/O3tetq7g9z30kH+vOUwT21rGPRnEAhbbN7VxO5GD1ZEHzMMsPoXz/GJO1+mrTt4zDH9IYtmT+CYenbWd/JqTRtaa7bVdeALWn3Oq4c3GMYXtHjirSN8/oHX+fD/vcjWg+2c9N1/cvXvtuDxh/jLa7XkGK0UBh9k78HPkDn3Ft4oOcQ0v4PsA5/muZZ1rKmeOui5jRX/rt3UXv956m+6icwVK6i87bZhB3MAQxl8atGneGjNQ5xSfgq/ev1XrPzzSm5+/mY2HdyEJ+gZdP/ujgBP37eTzffvYtriQs79eHyfUJTNRuWvfkXWWe+h4dvf5vC6/xz1TTDOXzGbRZ9YjKl81D0Nt37tl/zumZ10BcJsq+ugzu3jpkfeZseRTgDe99PNnPTdf9IdCFPn9qG1JmxFeKehs98hqW11Hb2/e2Erwq2b9tDSdezvotsb5I+vHELr6O/znc/tp6alm4YOf+/v8euH2mnrDnK4zdu739+3N/DrZ/Zyx7P7eX7PsesGXtrfSn2Hj2ZPAE9sOElrfczveDAc4f6XD+L2jv1t+UbdQ1dKnQ58W2t9fuz1jQBa6x8MtM9oe+i3P/w0Dz+/g/MXl7FqUSkOm4lC88uNu9nfHJtapY49jy+vmsfUAicPvlLLyTMKcfuC/P6lgwCsWVbBooocnt3Tysv7Wphdms3n3juHereP3724n8bOIAo4eWYBrx5ox2U3+PjJVVQWZhDRsP7fNRxp9/Ue67TZBQTCFpcun8ovN+3F7Q1haY3S7yY5+voFC3jjUDt/3x7946CItrc4x8H0giy2HXETCGvU0duyHXxo2VRePtDC3NIcHns9ehPfU2YWcu78Yn78VDR3dWWhiw5vkK6AxZySLNzeEBrNFSdV8u+9LdgMxRu17mN+PkrDBUvKeWpbPZUFGbh9IcpyXGS7TBo7/LR2BwlZEY7/Km1GYQYH23y9bbQZik+dPp0uX5hXDrRyqN3LnNJszphVzKG2bjbvbj6mDoUmx2XjjFnFBMIW/9rVRF6GncVTctlysB2baeANhHCYXuzKj2n4MY0gyuzGsnnptoVoM0ErhSsSodyfybKK89nhns6aZRUEw5q5Zdn0oWP/97vh+Gc9bwzwb0NrIt3dWJ0erPZ2ggcP4t+xg9DhwyhXBvmXX0reZZehDHOggw55CIB97fv458GN/PvIv/FZfgwMyrPKqcqppDyrglwKyA7lYXoy8NcpOvdHOwczz8pj0eoSDJvCUAaq5z/17qOhon051ecK99PGcBjv/Q/i/b970D4f5szp2E+sxjZjGubUClRONiozE5WZCaaJMg1QCgwDlAFG9JgoxVvbaqh5fA/+8HzsqgtlO0i74aVVadqVDR8G08py2N7kJawNdKx9OvZz1MAFJ5SR5XSQ4zJ56UAbO2N/BAA+fcYMcl0OfvX0u9Mkz55XwoyiTNa/eLD39bO7m/ucZ1Vh5jGBfOXCUjbtbOpT7vTZxexv7iLbabIvFn8yHCa+oMUHl5bz5FsNFGY5KMt1UZTtJNtp8tS2Bv7rY+9n9cmj+yM73B56PAH9cmC11vo/Yq8/BZyqtb5uoH1GG9Dv+X/fxes8Y1TtFGIyaMuo51D+TnaWvUBHRt9glQhZPs1Z2zXL92nm1WmyAkPv0x8NdOTN5kjFmbQVzCfoHP6UynQ2e84rrP7KwF+QD2a4AT2eHKL9/Wnv89dBKXUNcA3AtGnTRnWg4HRN6PBfB2jFu80Y+E/T0VvUcVv0Me/ZzejzkHVsl0719kkhx2XD4w/3bj+61HD09DYyHCYK8Abf7cn33BFtav6xvYXj9wXIctqxIjo6bDPAoXtKZ9hNglYEK/ZR0G4avV8sHr1zUbaDsBXB7QsfV4uiONtBKKJxeweYqaAgP8OO2ze8mQxZThumYeD2HftRNMdppzQ3iw6/jWDEzpTCQp7d5yXH5eDyk6aCMohEIhiG6r+HOeBlUAw5e2+w7UdtM1wZGNnZGFlZmLm5KGPwigftCY8qG4EmZAYJuroJZviwzGz8VhUB6xwCVoCIjkQ/+sc+JWqiwwwRIr1DFhE9ijS550Yf9mqN6fHhaHJjegMYvgCGP4iKaIholNbRjx89z48bZrO0ZkfNLgozD2CzFKUZORxp9eMNgIEdheodD8522XHZTFq6or8npmFgGopgeGTtL8xy0BUIj2i/bJeJzTB6f+czHcYx/16Lsh20dg0+lGIaUJztZPYpZ42ovaMRT0CvBaqOel0JHDm+kNb6duB2iPbQR3OghpMu5Ul7PecvLqfNG6Qk28m9L9TgsBm9F+cbH1jAqkXlvO+nm/nlR5ez/oUath5sZ8f/dz7v/clmSnKcfOY9M7nx4bfRGrb/z/mELE0gbPGlB99kWWU+Z8wpYlFFLlsPtvPpu19hw+fOpCTHidNmUJTlYF9zN4+/eYSrVs4lGI5Q2+4lL9NOrsvOn149TH2Hn6+dP5+XD7RRmOUgHInwTr2H3U0eXDaT/1o1j5seeZvGTj93ro3eIaampZsLf/U8XYEwP758KVesePdH+sLeFp7d08JXzpvH9Q+8zvzyHA61eXn4tTpWTC/goXVnsK2ugwt/9TyXnVjJdy9eglLgspt4g2Ge2tZAWa6LunYfl544FZtpcO+/D3Du/FJmFGfhD1nsaewiaEWYW5ZNlz/MlPzo8viNOxqZX5ZDa3eAf+5s5MozZlKSE/2C6tfP7OX02UUsr8qnodPPtb9/jTcPu7nvM6dw1twSAJ7f08Ls0iwq8qL1nfSdjSyoyOG980v57pM7efrL5zCrJDo00tjpRylwmAb5mf2POc867GZOaTbZzuTnMRdjY/VxrwNhi3fqPSyeksve5i4+/8DrVFfl852Ll+AwDZ54q55TZxZSmhtNAbz6F8/yToOHn1yxjE07G1k8JZef/CM6DPmHq0+lLNfF5l3NnDOvmEyHjSn5GYStCGZsCMiKaH719B5CVoRtdZ2sv+oUzvnxMxxs9fLmt87DimgKMu10By2WfOvv/PSKZVx2UiWNnX5CVoTKguiNvu98bj8HW7184rRpHHH7eO/8UgLhCDZD9R4rWeIZcrEBu4GVQB3wKvBxrfX2gfaJZ5ZLJKIxjuoF+YIWEa15u66DslwXM4uz+pTvCobJddl7vwh12kwCYYtIJNo7HowvaA1ZZrwEY78sxhC9wmQJxXr+LvvAP6+wFen9xW7tDlCaM3BebiGGIxC20Jre37v27iBf+NMbrDtnNqfPLhpi7/41efzUtHg5ZWZhIpsatzEfQ48d5APAL4hOW7xba/29wcrLtEUhhBi5ZIyho7X+KzDA4LYQQohkkpWiQggxQUhAF0KICUICuhBCTBAS0IUQYoKQgC6EEBOEBHQhhJggJKALIcQEEdfCohEfTKlm4OAody8GWoYslR7kXFLPRDkPkHNJVfGcy3StdclQhZIa0OOhlNoynJVS6UDOJfVMlPMAOZdUlYxzkSEXIYSYICSgCyHEBJFOAf328W5AAsm5pJ6Jch4g55Kqxvxc0mYMXQghxODSqYcuhBBiECkV0JVSplLqdaXUE7HX31ZK1Sml3oj9/4Gjyt6olNqrlNqllDp//Frdl1KqRin1dqzNW2LvFSqlNiql9sQeC44qn27nkq7XJV8p9ZBS6h2l1E6l1OnpeF0GOI+0uyZKqflHtfcNpVSnUuqLaXpNBjqX5F4XrXXK/A98CfgD8ETs9beBr/RTbhHwJuAEZgL7AHO8239U+2qA4uPe+xFwQ+z5DcAP0/hc0vW6rAf+I/bcAeSn43UZ4DzS8poc1U4TaACmp+M1GeRcknpdUqaHrpSqBD4I3DmM4hcBf9RaB7TWB4C9wClj2b4EuIjoP0Rijxcf9X66nctAUvZclFK5wNnAXQBa66DW2k2aXZdBzmMgKXke/VgJ7NNaHyTNrkk/jj6XgYzJuaRMQCd6K7uvAcffkvs6pdRbSqm7j/roNRU4fFSZ2th7qUID/1BKbVVKXRN7r0xrXQ8QeyyNvZ+O5wLpd11mAc3APbFhvTuVUlmk33UZ6Dwg/a7J0T4KPBB7nm7X5HhHnwsk8bqkREBXSl0INGmttx636bfAbKAaqAd+2rNLP9Wk0nSdM7XWJwIXAJ9TSp09SNl0PJd0vC424ETgt1rr5UA30Y/zA0nVcxnoPNLxmgCglHIAa4A/D1W0n/dS/VySel1SIqADZwJrlFI1wB+B9ymlfq+1btRaW1rrCHAH734kqQWqjtq/EjiSzAYPRmt9JPbYBDxCtN2NSqkKgNhjU6x42p1Lml6XWqBWa/1y7PVDRANjul2Xfs8jTa9JjwuA17TWjbHX6XZNjnbMuST7uqREQNda36i1rtRazyD6ceVprfUney5qzCXAttjzx4CPKqWcSqmZwFzglaQ2egBKqSylVE7Pc+A8ou1+DFgbK7YWeDT2PO3OJR2vi9a6ATislJofe2slsIM0uy4DnUc6XpOjfIxjhyjS6poc55hzSfp1Ge9vhPv59vdc3p3lch/wNvBW7AdQcVS5m4h+M7wLuGC8231Uu2YR/fb6TWA7cFPs/SJgE7An9liYxueSdtcl1rZqYEus3RuAgjS9Lv2dR7pek0ygFcg76r20uyaDnEtSr4usFBVCiAkiJYZchBBCxE8CuhBCTBAS0IUQYoKQgC6EEBOEBHQhhJggJKALIcQEIQFdCCEmCAnoQggxQfz/JBEwJFazqmYAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(spec_x, spec_y, label='data')\n", "plt.plot(spec_x, spec_yhat(result.x, data, 3), label='fit')\n", "for i in range(3):\n", " plt.plot(spec_x, peak(spec_x, result.x[i], result.x[i + 3], result.x[i + 6]), label='peak {}'.format(i))\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Checking residuals\n", "---" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "(0.9985383152961731, 0.5798115134239197)" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "resids = spec_y - spec_yhat(result.x, data, 3)\n", "plt.hist(resids)\n", "plt.show()\n", "scipy.stats.shapiro(resids)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Looks like they are normal" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Computing Standard Error\n", "---\n", "\n", "We need the partials:\n", "\n", "$$\\frac{\\partial f}{\\partial a} = \\frac{1}{\\sqrt{2 \\pi c}}e^{-(x - b)^2 / c}$$\n", "\n", "$$\\frac{\\partial f}{\\partial b} = \\frac{2a(x - b)}{c\\sqrt{2 \\pi c}} e^{-(x - b)^2 / c}$$\n", "\n", "$$\\frac{\\partial f}{\\partial c} = \\frac{a}{\\sqrt{2 \\pi}}e^{-(x - b)^2 / c}\\left[\\frac{(x - b)^2}{c^{5/2}} - \\frac{1}{2c^{3/2}}\\right]$$" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "def peak_partials(x, a, b, c):\n", " '''Returns partial derivatives of peak functions with respect to parameters as a tuple'''\n", " return (1 / (np.sqrt(2 * np.pi * c)) * np.exp(-(x - b)**2 / c), \\\n", " 2 * a * (x - b) / c / np.sqrt(2 * np.pi * c) * np.exp(-(x - b)**2 / c),\\\n", " a / np.sqrt( 2 * np.pi) * np.exp(-(x - b)**2 / c) * ((x - b)**2 / c**(5 / 2) - 1 / 2 / c**(3/2)))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "We have to decide how we want to build the ${\\mathbf F}$ matrix. I want to build it as \n", "\n", "$$\\left[\\frac{\\partial f}{\\partial a_1}, \\frac{\\partial f}{\\partial a_2}, \\frac{\\partial f}{\\partial a_3}, \\frac{\\partial f}{\\partial b_1}, \\ldots\\right]$$" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "def spectrum_partials(x, a_array, b_array, c_array):\n", " '''Takes in the x data and parameters for a set of peaks. Computes partial derivatives and returns as matrix'''\n", " result = np.empty( (len(x), len(a_array) * 3 ) )\n", " for i in range(len(a_array)):\n", " a_p, b_p, c_p = peak_partials(x, a_array[i], b_array[i], c_array[i])\n", " result[:, i] = a_p\n", " result[:, i + 3] = b_p\n", " result[:, i + 6] = c_p\n", " return result" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[5.96163850e-047 3.41085036e-112 4.22479807e-214 ... 9.71205239e-045\n", " 8.81670130e-109 1.29594533e-210]\n", " [8.76433165e-047 7.43573285e-112 1.59991023e-213 ... 1.42240908e-044\n", " 1.91613450e-108 4.89427889e-210]\n", " [1.28753069e-046 1.61906126e-111 6.04777170e-213 ... 2.08171140e-044\n", " 4.15931841e-108 1.84501215e-209]\n", " ...\n", " [3.43347278e-036 9.93866089e-034 9.92393158e-030 ... 4.23817648e-034\n", " 7.32547002e-031 3.93727352e-027]\n", " [2.45274025e-036 6.54253851e-034 6.12993012e-030 ... 3.04073297e-034\n", " 4.85027389e-031 2.45059976e-027]\n", " [1.75087494e-036 4.30172947e-034 3.77952653e-030 ... 2.18001288e-034\n", " 3.20751081e-031 1.52246274e-027]]\n" ] } ], "source": [ "M = 3\n", "F = spectrum_partials(spec_x, result.x[:M], result.x[M:2*M], result.x[2*M:3*M])\n", "print(F)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Now we compute all the confidence intervals" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "396.9360584626854 +/- 2.9053462007965516\n", "1535.8731469097745 +/- 3.726908748831584\n", "623.8528032145897 +/- 2.9100118852776227\n", "610.0091402212576 +/- 0.09042323859505816\n", "645.0092533938304 +/- 0.018911758759361075\n", "670.0049335827936 +/- 0.03502566911286785\n", "249.1570648134466 +/- 4.418077471259899\n", "150.16959069781274 +/- 0.845817735826172\n", "99.16549080652315 +/- 0.9623322371153976\n" ] } ], "source": [ "SSR = np.sum(resids**2)\n", "s2_epsilon = SSR / (len(spec_x) - len(result.x))\n", "s2_beta = np.diag(s2_epsilon * linalg.inv(F.transpose() @ F))\n", "ci = np.sqrt(s2_beta) * scipy.stats.norm.ppf(0.975)\n", "\n", "for pi, c in zip(result.x, ci):\n", " print('{} +/- {}'.format(pi, c))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "The relative populations, the integrated peaks, are just the $a$ values. I'll normalize them into percent:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "15.525559% +/- 0.113638%\n", "60.073375% +/- 0.145772%\n", "24.401067% +/- 0.113821%\n" ] } ], "source": [ "for pi, c in zip(result.x[:3], ci[:3]):\n", " print('{:%} +/- {:%}'.format(pi / np.sum(result.x[:3]), c / np.sum(result.x[:3])))" ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "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.7.3" } }, "nbformat": 4, "nbformat_minor": 1 }