{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# EART97012 \n", " \n", "# Geophysical Inversion \n", " \n", "## Lecture 6 \n", " \n", "### Homework Exercises - Solutions " ] }, { "cell_type": "markdown", "metadata": { "toc": true }, "source": [ "

Table of Contents

\n", "
" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import scipy.linalg as sl\n", "from pprint import pprint\n", "import scipy.interpolate as si" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Homework\n", "\n", "Recall that I use the notation \n", "$A\\boldsymbol{x} = \\boldsymbol{b}$ and $G\\boldsymbol{m} = \\boldsymbol{d}$ interchangeably" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Homework - Rank of the product of two matrices (and the outer-product of two vectors)\n", "\n", "We stated in the lecture that a matrix product always has a rank that is less than or equal to the smallest rank of any of the constituent matrices. \n", "\n", "For gave the example of the outer product $\\boldsymbol{a}\\boldsymbol{b}^T$ of two column vectors must be rank 1 because vectors are only rank 1. \n", "\n", "Establish the second of these analytically, and test the first with some examples and use of `numpy`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solution\n", "\n", "Consider \n", "\n", "$$\n", "\\boldsymbol{a} = (a_1 \\; a_2 \\; a_3)^T, \\qquad\n", "\\boldsymbol{b} = (b_1 \\; b_2 \\; b_3)^T\n", "$$\n", "\n", "The outer product is then\n", "\n", "\\begin{align}\n", "\\boldsymbol{a}\\boldsymbol{b}^T\n", "& = \n", "\\begin{pmatrix}\n", "a_1\\\\\n", "a_2\\\\\n", "a_3\n", "\\end{pmatrix}\n", "(b_1 \\; b_2 \\; b_3)\\\\\n", "& = \n", "\\begin{pmatrix}\n", "a_1b_1 & a_1b_2 & a_1b_3\\\\\n", "a_2b_1 & a_2b_2 & a_2b_3\\\\\n", "a_3b_1 & a_3b_2 & a_3b_3\\\\\n", "\\end{pmatrix}\n", "\\end{align}\n", "\n", "but this is just the matrix where each row is a scalar multiple of $\\boldsymbol{b}$, we can therefore perform row operations to cancel all but one of these rows (said another way, $\\boldsymbol{b}$ on its won provides a basis for the row-space of the matrix) and so the rank of this resulting matrix is just 1.\n", "\n", "

\n", "\n", "Now let's consider some random matrices, check their ranks, and the ranks of their products" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The rank of A is 10\n", "The rank of B is 12\n", "The rank of AB is 10\n" ] } ], "source": [ "m = 10\n", "n = 15\n", "p = 12\n", "A = np.random.random((m,n))\n", "B = np.random.random((n,p))\n", "\n", "\n", "print('The rank of A is ', np.linalg.matrix_rank(A))\n", "print('The rank of B is ', np.linalg.matrix_rank(B))\n", "print('The rank of AB is ', np.linalg.matrix_rank(A@B))\n", "\n", "\n", "# you could extend this by inventing some matrices that don't have full rank" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Homework - A simple mixed determined problem [solved by hand and using the pseudo-inverse]\n", "\n", "Consider the problem from the lecture\n", "\n", "$$\n", "\\begin{pmatrix}\n", "1 & 0 & 0 \\\\\n", "1 & 0 & 0 \\\\\n", "0 & 2 & 2 \\\\\n", "0 & 3 & 3\n", "\\end{pmatrix}\n", "\\begin{pmatrix}\n", "m_1\\\\\n", "m_2\\\\\n", "m_3\n", "\\end{pmatrix}\n", "=\n", "\\begin{pmatrix}\n", "1\\\\\n", "2\\\\\n", "2\\\\\n", "3\n", "\\end{pmatrix}.\n", "$$\n", "\n", "Can you come up with a sensible looking \"solution\" to this problem by considering the under- and over-determined components separately?\n", "\n", "Hint: consider problems for $m_1$ and both $m_2$ and $m_3$ separately, and think about what the least squares and minimum norm solution would be for each.\n", "\n", "Once you have found the solution \"by-hand\", try using the pseudo-inverse $A^+$ which you can find using the function `np.linalg.pinv(A)`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solution\n", "\n", "Since the two parts of this problem are uncoupled (this won't generally be the case), we can consider solving for $m_1$ separately to $m_2$ and $m_3$ (which are coupled to one another).\n", "\n", "The first two equations tell us that\n", "\n", "$$m_1 = 1 \\qquad \\textrm{and} \\qquad m_1=2$$\n", "\n", "without additional information we could simply take \n", "\n", "$$m_1 = \\frac{3}{2}$$\n", "\n", "Notice that this does correspond to the least squares solution to this problem.\n", "\n", "\n", "
\n", "\n", "The second part of the problem tells us that \n", "\n", "$$2m_2 + 2m_3 = 2 \\qquad \\textrm{and} \\qquad 3m_2 + 3m_3 = 3$$\n", "\n", "but these two just boil down to one equation\n", "\n", "$$m_2 + m_3 = 1$$\n", "\n", "So for any $\\alpha\\in \\mathbb{R}$, $m_2 = \\alpha$ and $m_3 = 1 - \\alpha$ is a solution.\n", "\n", "We have infinuitely many possible solutions, we've seen previously that seeking the minimum norm solution may be a sensible approach (if we know that $\\boldsymbol{m}$ is the perturbation from some a priori model guess for example).\n", "\n", "We say an example of how to find the mimimim norm solution from an infinite family of solution at the end of L3 - we form the norm as a function of $\\alpha$ and find the $\\alpha$ that minimises this - differentiate and set to zero:\n", "\n", "for simplicity form the square of the two norm of our solution:\n", "\n", "$$f(\\alpha) = \\alpha^2 + (1 - \\alpha)^2 =2\\alpha^2 - 2\\alpha + 1$$\n", "\n", "$$\\frac{df}{d\\alpha} = 4\\alpha - 2$$\n", "\n", "and so $\\alpha = 1/2$ and a sensible solution to this problem could be taken to be\n", "\n", "$$\\boldsymbol{m} = \\left(\\frac{3}{2} \\;\\; \\frac{1}{2} \\;\\; \\frac{1}{2} \\right)^T$$\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([1.5, 0.5, 0.5])\n" ] } ], "source": [ "G = np.array([\n", " [1, 0, 0],\n", " [1, 0, 0],\n", " [0, 2, 2],\n", " [0, 3, 3]])\n", "\n", "d = np.array([1, 2, 2, 3])\n", "\n", "m = np.linalg.pinv(G) @ d\n", "\n", "pprint(m)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Homework - A \"least squares\" and minimum norm solution to a simple $2\\times 2$ case\n", "\n", "In the L2 homework we considered the case \n", "\n", "$$\n", "\\left(\n", " \\begin{array}{rr}\n", " 2 & 3 \\\\\n", " 4 & 6 \n", " \\end{array}\n", "\\right)\\left(\n", " \\begin{array}{c}\n", " x \\\\\n", " y\n", " \\end{array}\n", "\\right) = \\left(\n", " \\begin{array}{c}\n", " 4 \\\\\n", " 7\n", " \\end{array}\n", "\\right),\n", "$$\n", "\n", "plotting the two constraints to make the point that this system has no solution:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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rs8rXx4WLoTixeGyy+Djj8P1ScaE1uzZs+nRowcVK1akUqVKTJgwga1bt/J5eg/gnXfeIVeuXPz888/HXjNgwADOOeccNm/eHLI6WrVqRYsWLTj33HM577zzGDFiBPnz52fRokXH2pQuXZonnvjnBeSqVavInTs333wTupmGO3bsoGvXrowbN47ChQuH7H29RFVwRsKZZ2rPs1w5aN0apkyJdEXGBG/Xrl0cOXLkWGB06NCBSpUq8eCDDwLw2GOP8dZbbzFr1ixSUlLCUsPhw4eZNGkSu3fvplatWseer1mzJl999dU/2g4cOJBevXpRoUKFfzw/cuRIkpOTT/r47LPPPD+/T58+dOjQgUaNGoX+N3eCqJ2O5KeUFEhL0+Ds1AnGjoWePSNdlfHbwIH+3++uUgWeeirr7zNgwACqVKlCzZo1AZ2jOHLkSFq1asU555zDiBEjmDdvHuXKlcv6h51g1apV1KxZk3379pGcnMz7779PpUqVjv28Zs2ajBkz5tj3U6dOZdmyZbz99tv/eq8bb7yRq6666qSfV6rUv6d2jx07lvXr1zNhwoQs/E4yzoIzXaFCMHs2tG8P118PO3bArbdGuipjTu22225j4cKFLFy4kPj4/y3uuOyyy6hevTr/+c9/+PDDD6levbrn60eOHMnIkSOPfb9//35EhMcee+zYczNnzqRu3bqery9fvjzLly9n+/btvPvuu1x77bWkpaVRsWJFAC699FJuv/12tm3bRr58+bjjjjsYPnw4p5122r/eq0iRIhQpUiSo3//atWu56667+Oyzz0hKSgrqtZkWaJ5SrDyCmsd54IBzAwe6z99+O2CTffuc69DBOXDu7rudO3Ik428farE6PzJaZcd5nAMHDnQlSpRwa9as+dfPPvnkE5c3b14XFxfnlixZEvA9/vzzT7du3bpjj3bt2rl+/fr947m///47w3U2btzY9ezZ89j3+/btc0lJSW727NnuoYcecuXLl3cHDhzwfL8RI0a4fPnynfSxYMGCf7zm1VdfdYCLj48/9gCciLj4+Hi3b9++kM/jzFk9zrVrYdw4qk6apMPq5577rya5csGkSXDDDfDAA7B9u15KxeX4u8Em2gwYMIBJkyaRlpbG+eef/4+frVixgnbt2vHMM88wffp0hg4dyuzZsz3f58ReXv78+SlSpAjnevz7yIgjR46w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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# consider the following situation\n", "x = np.linspace(-1,5,100)\n", "y1 = -(2./3.)*x + (4./3.)\n", "y2 = -(4./6.)*x + (7./6.)\n", "\n", "fig = plt.figure(figsize=(5, 5))\n", "\n", "ax1 = fig.add_subplot(111)\n", "\n", "ax1.set_xlabel(\"$x$\", fontsize=14)\n", "ax1.set_ylabel(\"$y$\", fontsize=14)\n", "ax1.set_title('Two lines', fontsize=14)\n", "ax1.grid(True)\n", "\n", "ax1.plot(x,y1,'b', label='$2x+3y=4$')\n", "ax1.plot(x,y2,'r', label='$4x+6y=7$')\n", "\n", "ax1.legend(loc='best', fontsize=14);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What do you think the least square and minimum norm solution is in this case?\n", "\n", "Note that solution 1 is (I think) the obvious solution.\n", "\n", "I also present a second solution afterwards which gives a slightly different answer." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solution 1\n", "\n", "If we divide the second equation by 2 we recognise that the LHSs are the same, but the RHSs are inconsistent - taking the values 4 and 3.5.\n", "\n", "Clearly the line of solutions where $2x+3y=3.75$ is equally between the two constraints, and so equally valid [NB. we will return to this point in the alternative solution next, and in next lecture].\n", "\n", "We can parametrise this line by introducing the arbitrary parameter $\\alpha\\in\\mathbb{R}$ and setting $x=\\alpha$, $y = (3.75 - 2\\alpha)/3$.\n", "\n", "To find the solution in this infinite family introduce the function of $\\alpha$\n", "\n", "\\begin{align}\n", "f(\\alpha) &:= \\alpha^2 + \\left((3.75 - 2\\alpha)/3\\right)^2\\\\\n", "&= \\alpha^2 + \\frac{4}{9}\\alpha^2 - \\frac{2\\times 2\\times 3.75}{9}\\alpha + 3.75^2 \\\\\n", "& = \\left(1+\\frac{4}{9}\\right) \\alpha^2 - \\frac{15}{9}\\alpha + 3.75^2\n", "\\end{align}\n", "\n", "differentiate w.r.t. $\\alpha$:\n", "\n", "$$\n", "\\frac{df}{d\\alpha} = 2\\left(1+\\frac{4}{9}\\right) \\alpha - \\frac{15}{9}\n", "$$\n", "\n", "and so $\\alpha = ...$ and our \"solution\" is ... [let's get some help with this:]" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.57692308 0.86538462]\n", "1.0817307692307692\n", "3.75\n" ] }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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WwA899xztGjRgs2bN5d9ZsKECXTv3p1PP/00bnEMHz6cc889lx49evDd736X3NxcDjvsMN55552yNl26dOH3v684H1NhYSGHHnoo779f7/nwy+zcuZNRo0bxxBNPcOSRR8btvLWl5CrSgOzatYuSkpKypDJy5EhOPPFE7rnnHgDuv/9+/vjHP/LKK6/QsWPHQGLYv38/s2fPpqioiFNPPbVsf1ZWFkuXLq3Q9oYbbuDKK68kIyOjwv68vDzS0tIOui1ZsiTm9XNychg5ciSDBw+O/xdXC3r8VSSGG26AgoLEXrNfP3jggfqdY8KECfTr14+srCwgMkYzLy+P8847j+7du5Obm8vChQvp2TPm/PL1UlhYSFZWFt9++y1paWk8//zznHjiiWXHs7KyePjhh8vev/DCC6xYsYI5c+YccK5x48Zx8cUXH/R6nTt3PmDf448/zoYNG3j66afr8ZXEh5KrSANx00038eabb/Lmm29yyCGHlO3/4Q9/yIABA7jjjjt46aWXGDBgQMzP5+XlkZeXV/Z+z549mBn3339/2b758+dzxhlnxPz88ccfT0FBAf/+97+ZO3cuo0ePJj8/nz59+gBwyimn8Mtf/pIdO3bQunVrbr75Zu68806OOuqoA87Vtm1b2rZtW6uvf926ddx+++0sWbKE5s2b1+qzQVByFYmhvhVkot14443Mnj2bRYsWcdxxx1U4tnDhQlauXIm7H7QroHK1+Ktf/YrOnTvzX//1X2X7YlWLpZo3b06PHj0A6N+/P0uXLuV//ud/eOKJJwDIzMykefPmLFu2jBUrVtC0aVOuu+66mOeqnOhjqZzo33nnHT7//POyZA6RLorFixfz6KOP8vXXX9OiRYuDnjOelFxFUtyECROYPXs2+fn5nHDCCRWOrVy5khEjRvDggw8yb948brvtNhYsWBDzPJWrxcMOO4y2bduWJczaKikpYc+ePWXvW7RowUknncRLL73EzJkzeeaZZ2jWrFnMz9alW+DCCy+kf/+KS1mNHTuWnj17cvvttye8mlVyFUlh1113HU8//TQvvPACRx55JNu2bQMgLS2NL774gmHDhnHTTTdx+eWXM3DgQPr27Ut+fj6DBg2Kaxy33nor5513Hscccwy7du3imWeeIT8//4CxrllZWUyePJkhQ4Zw/vnnV3m+unQLHHHEERxxxBEV9rVu3Zq2bdtWqGYTRclVJIWV/oLorLPOqrD/+uuv59VXX+X888/nzjvvBKBPnz5cdNFF3HbbbRWGSMXDtm3buPTSS9m2bRuHH344ffv2Zf78+ZxzzjkV2vXr148mTZocMCSrIVJyFUlhtV0+7tlnn61x2yeffDLubWfNmsXVV19N7969a3zu+sjPz0/IdWJRchWRQJWUlLB9+3YefvhhCgsLa5XgU5mSq4gEavHixQwePJjjjz+euXPnJvWpqURSchWRQA0aNIidO3emxBpa8aTHX0VEAqDkKiISACVXEZEAKLmKiARAyVVEJABKriIiAVByFREJgJKriEgAlFxFRAKg5CoiEgAlV5EGIi8vDzNj/PjxSbn+1q1bGT16NO3bt+fQQw8lIyODN954I6ExpKenY2YHbOedd15C4wDNLSDSILz77rs8/vjj9O3bN27nHDNmDOnp6dx1113Vtv33v//Naaedxumnn868efNo3749GzdupEOHDnGLpyaWLl3K/v37y95v3bqVzMzMalc1CEKoKlczO8bMFpnZWjNbY2YTYrQxM5tiZhvMbJWZnZyMWEXCYufOnYwaNYonnnjigBmnnnvuOVq0aMHmzZvL9k2YMIHu3bvz6aefxi2G3/72txx99NE89dRTDBw4kG7dunHWWWfRq1evsjZdunQ5YJLswsJCDj30UN5///24xNG+fXs6depUtr388su0adOGiy66KC7nr41QJVdgH/BLd+8FnAJcZ2YZldqcC/SMbjnAI4kNUSRccnJyGDlyJIMHDz7g2MiRIznxxBO55557ALj//vv54x//yCuvvHLQxQpr64UXXuD73/8+P/3pT+nQoQP9+vVj6tSpFSbzzsrKYunSpRU+d8MNN3DllVeSkVHxn3leXh5paWkH3ZYsWXLQmNydJ554gksvvZRWrVrF7WutqVB1C7j7VmBr9PUuM1sLdAbK/1gbDjzlkb+1d83sCDM7OvrZuPjgA5g7tzM/+AE0CduPH0mMG26AgoLEXrNfv1ovO/v444+zYcMGnn766ZjHzYy8vDzOO+88unfvTm5uLgsXLqRnz571j7ecjRs38vDDD3PjjTdy6623UlBQwPXXXw9Q1geclZVVtiwNRBLyihUrmDNnzgHnq8sChZW9+uqr/POf/+TKK6+s7ZcTF6FKruWZWTpwEvC3Soc6Ax+Ve78luu+A5GpmOUSqWzp27FjjJR8ef7wbzzzTk8WL/80tt6yjc+dvah1/IhUVFSV1OYuaCmuchx9+OLt27Sp7v3//foqLi2lSru8uEUqKi9lTLo7q/OMf/yhbzXXPnj3s2bOnLPbyX09WVhYnn3wyd9xxB88++ywnnHBCheOl7r//fn73u9+Vvd+zZw9mxv3331+2b+7cuZx66qkHxl5SwkknncTtt98OQI8ePVizZg0PPvggo0ePZv/+/fTt25cPP/yQzZs307p1a2666SZuueUWmjdvfkA8zZo1q7ay3rdvX8yvo9QjjzzCySefTPfu3Q/arrz9+/fHbPvtt9/W/nvX3UO3AWnAcmBEjGPzgNPLvX8dyKzunJmZmV5TJSXuv/rV+3744e4tW7pPnuy+f3+NP55wixYtSnYINRLWON9///0K77/66qskRVI7jzzyiAN+yCGHlG2Am5kfcsgh/u2337q7++uvv+6tWrXyJk2a+PLly6s83xdffOHr168v20aMGOHXX399hX27d++O+dljjz3Wr7jiigr7nnrqKW/VqpW7R+7pt99+682bN/cFCxb4fffd58cff7wXFxfHPF9ubq63bt36oNvixYur/Fo+/fRTb9asmU+bNu2g97Cyqv7uK3+PlAcs8xg5J3SVq5k1A+YCs9z9zzGabAGOKfe+C/BJfGOAoUM/5frre5GTAxMmwJ/+BNOnQx2XcBeJu/POO4/CwsIK+8aOHUvPnj25/fbbad68OStXrmTEiBE8+OCDzJs3r6zSjaXyctaHHXYYbdu2pUcNvulPO+001q1bV2HfBx98QNeuXcvet2jRgpNOOomXXnqJmTNn8swzz9CsWbOY56tvt8CTTz5JixYtuOSSS6qNPSihSq5mZsATwFp3r2rt3ReB8WY2G/g+sNPj2N9aXufO8Ne/wlNPRRJs375w771w/fXqi5XkO+KIIzjmmGMq7GvdujVt27alT58+bN68mWHDhnHTTTdx+eWXM3DgQPr27Ut+fj6DBg2Kayw33ngjp556Krm5ufz0pz9lxYoVTJkyhby8vArtsrKymDx5MkOGDOH888+v8nyVE31tuDv/+7//yyWXXJLUpWXCliJOAy4DBptZQXQbZmbjzGxctM3LwEZgA/A4cG2QAZnB6NGwZg1kZ0d+zzFoEGzYEORVRepnx44dDB06lPPPP58777wTgD59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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "alpha = (15/9)/(2*(1 + 4/9))\n", "\n", "x_lsmn = np.array([alpha, (3.75 - 2*alpha)/3])\n", "print(x_lsmn)\n", "print(x_lsmn[0]**2 + x_lsmn[1]**2)\n", "print(2*x_lsmn[0] + 3*x_lsmn[1])\n", "\n", "\n", "# plot to check this is located somewhere sensible:\n", "\n", "# consider the following situation\n", "x = np.linspace(-1,2,100)\n", "y1 = -(2./3.)*x + (4./3.)\n", "y2 = -(4./6.)*x + (7./6.)\n", "\n", "fig = plt.figure(figsize=(5, 5))\n", "\n", "ax1 = fig.add_subplot(111)\n", "\n", "ax1.set_xlabel(\"$x$\", fontsize=14)\n", "ax1.set_ylabel(\"$y$\", fontsize=14)\n", "ax1.set_title('Two lines', fontsize=14)\n", "ax1.grid(True)\n", "\n", "ax1.plot(x,y1,'b', label='$2x+3y=4$')\n", "ax1.plot(x,y2,'r', label='$4x+6y=7$')\n", "ax1.plot(x_lsmn[0],x_lsmn[1],'ko', label='Our solution')\n", "\n", "ax1.legend(loc='best', fontsize=14);\n", "\n", "# set axis equal so we can get a good idea of a 90 degree angle\n", "ax1.axis('equal')\n", "ax1.plot([0,x_lsmn[0]], [0,x_lsmn[1]], 'k--')\n", "ax1.plot(0,0,'ro', label='The origin')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solution 2\n", "\n", "Now actually simply stating that \"clearly\" the line in between the two is the least squares solution isn't quite right.\n", "\n", "If you start by stating that \n", "\n", "$$2x+3y = \\beta$$\n", "\n", "and so \n", "\n", "$$4x+6y = 2\\beta$$\n", "\n", "then the least squares solution is actually corresponds with the value of $\\beta$ that minimises the least square error \n", "\n", "$$ (4 - \\beta)^2 + (7-2\\beta)^2$$\n", "\n", "if you minimse this you find $\\beta = 3.6$. \n", "\n", "
\n", "\n", "\n", "[The point here is that the minimiser of $ (4 - \\beta)^2 + (7-2\\beta)^2$ is not the same as the minimiser of $ (4 - \\beta)^2 + (3.5-\\beta)^2$! So our initial intuition in solution 1 was technically wrong. The former is effectively weighting the misfit in our satisfaction of the second equation more than the first.]\n", "\n", "\n", "
\n", "\n", "We can then repeat the solution above but starting from $2x+3y=3.6$ ...\n", "\n", "We can parametrise this line by introducing the arbitrary parameter $\\alpha\\in\\mathbb{R}$ and setting $x=\\alpha$, $y = (3.6 - 2\\alpha)/3$.\n", "\n", "To find the solution in this infinite family introduce the function of $\\alpha$\n", "\n", "\\begin{align}\n", "f(\\alpha) &:= \\alpha^2 + \\left((3.6 - 2\\alpha)/3\\right)^2\\\\\n", "&= \\alpha^2 + \\frac{4}{9}\\alpha^2 - \\frac{2\\times 2\\times 3.6}{9}\\alpha + 3.6^2 \\\\\n", "& = \\left(1+\\frac{4}{9}\\right) \\alpha^2 - \\frac{4\\times 3.6}{9}\\alpha + 3.6^2\n", "\\end{align}\n", "\n", "differentiate w.r.t. $\\alpha$:\n", "\n", "$$\n", "\\frac{df}{d\\alpha} = 2\\left(1+\\frac{4}{9}\\right) \\alpha - \\frac{4\\times 3.6}{9}\n", "$$\n", "\n", "and so $\\alpha = ...$ and our \"solution\" is ... [let's get some help with this:]" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.55384615 0.88076923]\n", "1.0825\n", "3.75\n" ] }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "alpha = ((4*3.6)/9)/(2*(1 + 4/9))\n", "\n", "x_lsmn = np.array([alpha, (3.75 - 2*alpha)/3])\n", "print(x_lsmn)\n", "print(x_lsmn[0]**2 + x_lsmn[1]**2)\n", "print(2*x_lsmn[0] + 3*x_lsmn[1])\n", "# plot to check this is located somewhere sensible:\n", "\n", "# consider the following situation\n", "x = np.linspace(-1,2,100)\n", "y1 = -(2./3.)*x + (4./3.)\n", "y2 = -(4./6.)*x + (7./6.)\n", "\n", "fig = plt.figure(figsize=(5, 5))\n", "\n", "ax1 = fig.add_subplot(111)\n", "\n", "ax1.set_xlabel(\"$x$\", fontsize=14)\n", "ax1.set_ylabel(\"$y$\", fontsize=14)\n", "ax1.set_title('Two lines', fontsize=14)\n", "ax1.grid(True)\n", "\n", "ax1.plot(x,y1,'b', label='$2x+3y=4$')\n", "ax1.plot(x,y2,'r', label='$4x+6y=7$')\n", "ax1.plot(x_lsmn[0],x_lsmn[1],'ko', label='Our solution')\n", "\n", "ax1.legend(loc='best', fontsize=14);\n", "\n", "# set axis equal so we can get a good idea of a 90 degree angle\n", "ax1.axis('equal')\n", "ax1.plot([0,x_lsmn[0]], [0,x_lsmn[1]], 'k--')\n", "ax1.plot(0,0,'ro', label='The origin')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Visually there's no difference, but we will see in the homework to L5 that it's the latter solution we obtain with $G$ in its original form, but if we divide the second equation by 2 we arrive at the first solution." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Homework - Lagrange multiplier derivation of minimal-norm solution\n", "\n", "Recall we had the Lagrangian function\n", "$$\n", "\\mathcal{L}(\\boldsymbol{m}, \\boldsymbol{\\lambda}) := \\boldsymbol{m}^T\\boldsymbol{m} - \\boldsymbol{\\lambda}^T (G\\boldsymbol{m} - \\boldsymbol{d})\n", "$$\n", "\n", "where $\\boldsymbol{\\lambda}$ is the Lagrange multiplier that is introduced to enforce the constraint - here the constraint is vector values and so $\\boldsymbol{\\lambda}$ is a vector of Lagrange multipliers. \n", "\n", "We stated that \n", "\n", "$$\\boldsymbol{0}=\\nabla_{\\boldsymbol{m}}\\mathcal{L} = 2\\boldsymbol{m} - G^T\\boldsymbol{\\lambda}$$\n", "\n", "Consider a simple example to convince yourself this is true:\n", "\n", "start with \n", "\n", "$$G =\n", "\\begin{pmatrix}\n", "G_{11} & G_{12}\\\\\n", "G_{21} & G_{22}\n", "\\end{pmatrix},\\quad\n", "\\boldsymbol{m} = \n", "\\begin{pmatrix}\n", "m_1\\\\\n", "m_2\n", "\\end{pmatrix},\\quad\n", "\\boldsymbol{d} = \n", "\\begin{pmatrix}\n", "d_1\\\\\n", "d_2\n", "\\end{pmatrix},\\quad\n", "\\boldsymbol{\\lambda} = \n", "\\begin{pmatrix}\n", "\\lambda_1\\\\\n", "\\lambda_2\n", "\\end{pmatrix}\n", "$$\n", "\n", "write out $\\mathcal{L}$ in full, i.e. perform the relevant matrix/vector arithmetic to compute the resulting scalar quantity, compute the gradient, and demontrate that the result is equal to $2\\boldsymbol{m} - G^T\\boldsymbol{\\lambda}$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solution\n", "\n", "To begin we need to calculate $\\boldsymbol{m}^T\\boldsymbol{m} - \\boldsymbol{\\lambda}^T (G\\boldsymbol{m} - \\boldsymbol{d})$.\n", "\n", "The first term is easy:\n", "\n", "$$\\boldsymbol{m}^T\\boldsymbol{m} = m_1^2 + m_2^2.$$\n", "\n", "For the second term let's first write out $G\\boldsymbol{m} - \\boldsymbol{d}$ before we pre-multiply by $\\boldsymbol{\\lambda}^T$:\n", "\n", "\n", "\\begin{align}\n", "G\\boldsymbol{m} - \\boldsymbol{d} \n", "&= \n", "\\begin{pmatrix}\n", "G_{11} & G_{12}\\\\\n", "G_{21} & G_{22}\n", "\\end{pmatrix} \n", "\\begin{pmatrix}\n", "m_1\\\\\n", "m_2\n", "\\end{pmatrix}- \n", "\\begin{pmatrix}\n", "d_1\\\\\n", "d_2\n", "\\end{pmatrix}\\\\[10pt]\n", "&=\n", "\\begin{pmatrix}\n", "G_{11}m_1 + G_{12}m_2 - d_1\\\\\n", "G_{21}m_1 + G_{22}m_2 - d_2\\\\\n", "\\end{pmatrix}\n", "\\end{align}\n", "\n", "and so\n", "\n", "\\begin{align}\n", "\\boldsymbol{\\lambda}^T (G\\boldsymbol{m} - \\boldsymbol{d})\n", "&= \n", "\\begin{pmatrix}\n", "\\lambda_1 &\\lambda_2\n", "\\end{pmatrix}\n", "\\begin{pmatrix}\n", "G_{11}m_1 + G_{12}m_2 - d_1\\\\\n", "G_{21}m_1 + G_{22}m_2 - d_2\\\\\n", "\\end{pmatrix}\\\\[10pt]\n", "&= \\lambda_1 (G_{11}m_1 + G_{12}m_2 - d_1) + \\lambda_2 (G_{21}m_1 + G_{22}m_2 - d_2)\n", "\\end{align}\n", "\n", "Combining we have the scalar quantity\n", "\n", "\\begin{align}\n", "\\mathcal{L}(\\boldsymbol{m}, \\boldsymbol{\\lambda}) &= \\boldsymbol{m}^T\\boldsymbol{m} - \\boldsymbol{\\lambda}^T (G\\boldsymbol{m} - \\boldsymbol{d})\\\\\n", "&=\n", "m_1^2 + m_2^2\n", "- \\lambda_1 (G_{11}m_1 + G_{12}m_2 - d_1) - \\lambda_2 (G_{21}m_1 + G_{22}m_2 - d_2)\n", "\\end{align}\n", "\n", "\n", "next step is to take the gradient w.r.t. $\\boldsymbol{m}$:\n", "\n", "\\begin{align}\n", "\\nabla_{\\boldsymbol{m}}\\mathcal{L} & = \n", "\\begin{pmatrix}\n", "\\frac{\\partial}{\\partial m_1}\\\\\n", "\\frac{\\partial}{\\partial m_2}\n", "\\end{pmatrix}\n", "\\mathcal{L}\\\\[10pt]\n", "& = \n", "\\begin{pmatrix}\n", "\\frac{\\partial}{\\partial m_1}(m_1^2 + m_2^2\n", "- \\lambda_1 (G_{11}m_1 + G_{12}m_2 - d_1) - \\lambda_2 (G_{21}m_1 + G_{22}m_2 - d_2))\\\\\n", "\\frac{\\partial}{\\partial m_2}(m_1^2 + m_2^2\n", "- \\lambda_1 (G_{11}m_1 + G_{12}m_2 - d_1) - \\lambda_2 (G_{21}m_1 + G_{22}m_2 - d_2))\n", "\\end{pmatrix}\\\\[10pt]\n", "& = \n", "\\begin{pmatrix}\n", "2m_1 \n", "- \\lambda_1 G_{11} - \\lambda_2 G_{21}\\\\\n", "2m_2 \n", "- \\lambda_1 G_{12} - \\lambda_2 G_{22}\n", "\\end{pmatrix}\n", "\\end{align}\n", "\n", "\n", "\n", "Now let's check that this is equal to $2\\boldsymbol{m} - G^T\\boldsymbol{\\lambda}$ as we claimed\n", "\n", "\\begin{align}\n", "2\\boldsymbol{m} - G^T\\boldsymbol{\\lambda}\n", "& = \n", "\\begin{pmatrix}\n", "2m_1 \\\\\n", "2m_2\n", "\\end{pmatrix}\n", "- \n", "\\begin{pmatrix}\n", "G_{11} & G_{21}\\\\\n", "G_{12} & G_{22}\n", "\\end{pmatrix} \n", "\\begin{pmatrix}\n", "\\lambda_1 \\\\\n", "\\lambda_2\n", "\\end{pmatrix}\\\\[10pt]\n", "& = \n", "\\begin{pmatrix}\n", "2m_1 \\\\\n", "2m_2\n", "\\end{pmatrix}\n", "- \n", "\\begin{pmatrix}\n", "G_{11}\\lambda_1 + G_{21}\\lambda_2\\\\\n", "G_{12}\\lambda_1 + G_{22}\\lambda_2\n", "\\end{pmatrix}\n", "\\end{align}\n", "\n", "these are equal, and so we are finished." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Homework - Differentiation of inner products \n", "\n", "Suppose that $\\boldsymbol{a}$ and $\\boldsymbol{b}$ are both functions of $\\boldsymbol{x}$. Suppose $\\boldsymbol{a}$ and $\\boldsymbol{b}$ are vectors of length $m$, and $\\boldsymbol{x}$ are vectors of length $n$.\n", "\n", "What is\n", "\n", "$$\\frac{\\partial}{\\partial \\boldsymbol{x}} \\left(\\boldsymbol{a}^T\\boldsymbol{b}\\right)$$\n", "\n", "?\n", "\n", "First note the object inside the bracket is the inner (or dot) product of the two vectors, and so is itself a scalar.\n", "\n", "The derivative (or gradient) w.r.t. $\\boldsymbol{x}$ is a vector the same length as $\\boldsymbol{x}$.\n", "\n", "
\n", "\n", "The answer (if you work it out component by component) turns out to be equivalent to\n", "\n", "$$\\frac{\\partial}{\\partial \\boldsymbol{x}} \\left(\\boldsymbol{a}^T\\boldsymbol{b}\\right) \n", "=\\left(\\frac{\\partial \\boldsymbol{a}}{\\partial \\boldsymbol{x}}\\right)^T\\boldsymbol{b} +\n", "\\left(\\frac{\\partial \\boldsymbol{b}}{\\partial \\boldsymbol{x}}\\right)^T\\boldsymbol{a}$$\n", "\n", "The differentials $\\partial \\boldsymbol{a}/\\partial \\boldsymbol{x}$ and $\\partial \\boldsymbol{a}/\\partial \\boldsymbol{x}$ are both $m\\times n$ matrices, so that their\n", "transposes are $n\\times m$. \n", "\n", "Thus the products \n", "$(\\partial \\boldsymbol{a}^T/\\partial \\boldsymbol{x}) \\boldsymbol{b}$ and $(\\partial \\boldsymbol{a}^T/\\partial \\boldsymbol{x}) \\boldsymbol{a}$\n", "are both column vectors of length $n$ as \n", "required. Note that it does not matter if we differentiate a vector and then transpose the \n", "result, or if we transpose the vector before differentiation - both generate the same outcome. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solution\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Homework - Curve-fitting - response to outliers [read-through]\n", "\n", "Here we are going to fit a *linear* line to some invented data, and see what happens if we create an outlier - how much is the slope of the best-fit line impacted?\n", "\n", "As numpy's polyfit function only has the option to minimise the 2 norm, we have to do some work ourselves to create an approach that minimses other norms - so just read through the following solution." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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PkzozDPP5Etf+hLnnnsu1113HbfeeiuHH374Tif9fexjH+PjH/8473//+7n66qu59dZb+YM/+AOefPLJne5TklRMW35wTDuq1WpA49r76OgoS5cuZXBwcNv6VlmzZg2bNm3i7//+79lrr70AtpvIttUxxxzD1772NdasWcMxxxzDokWL2G+//fi7v/u7HV5vB1i2bBk33XTTdusmLn/729/m5JNP5i1veQvQuJZ+7733cvDBB28bM3/+fLZs2fK0573xjW/kpJNOAhovJO655x4/YEeSZpBH7tNQq9V44IEHeOqpp3jggQdaHuwABx10EE899RTnn38+999/P1/4whc4//zznzaur6+PL37xixx00EEsWrQIaAT+pZdeutNPNnrve9/Lt771LT784Q/zox/9iM985jNcfvnl2405+OCDufzyy/mP//gPbr/9dt7xjnfwxBNPbDemt7eXG264gQ0bNvDoo49ue97VV1/Nt7/9be666y5OP/107r///l1viCTpaQz3DrN8+XI+8YlPcN5557Fs2TIuuuiiSW8Us3LlSrZs2bJdkE+2bjJHHnkk//iP/8inP/1pli9fzmWXXcY555yz3ZjzzjuPRYsWcfTRR7Nq1SqOPPJIjj766O3GfPCDH+TBBx/k+c9/Pvvvvz8Af/mXf8nhhx/OqlWreNWrXsWCBQtKeZEkSVUWRa6vdoIVK1bk1rd6TXTnnXdyyCGHtLgiP899OnbWq7J+hu2m0z5Tukz2qhj7tGP1er30y7E7EhG35CSfnOo1d0mSJrH15mVb73Gy9eZlQFsF/GQ8LS9J0iTKunnZTDDcJUmaxFT37djZ/TzageEuSdIkyrp52UyYNeFelYmDs5E/O0llKOvmZTNhVoT7vHnzePzxx8suQ7vo8ccfZ968eWWXIWmWqdVqDA0N0dPTQ0TQ09PD0NBQ20+mg1kS7osWLWLDhg2MjY15FNhBMpOxsTE2bNiw7UY8ktRKW29eds0115R287JdMSveCvesZz0LgIceeqil9zB/4okn2HvvvVu2v042Va/mzZtHd3f3tp+hJGnnZkW4QyPgWx0Qw8PDvOxlL2vpPjuVvZKkmTMrTstLkjSbGO6SJFWM4S5JUsUY7pIkVYzhLklSxRjukiRVjOEuSVLFGO6SJFWM4S5JUsUY7pIkVYzhLklSxRjukqRS1Ot1ent7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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Invent some raw data - we will use the notation (xi,yi) for the\n", "# given data, where xi and yi are of length N+1 (N=len(xi)-1)\n", "xi = np.linspace(0,1,10)\n", "yi = xi + 0.2 * np.random.random((10,))\n", "\n", "# We will want to overlay a plot of the raw data a few times below so \n", "# let's do this via a function that we can call repeatedly\n", "# [Note that I've been a bit lazy in later lectures and really should\n", "# do this sort of thing more often to make code easier to read - apologies]\n", "def plot_raw_data(xi, yi, ax):\n", " \"\"\"plot x vs y on axes ax, \n", " add axes labels and turn on grid\n", " \"\"\"\n", " ax.plot(xi, yi, 'ko', label='raw data')\n", " ax.set_xlabel('$x$', fontsize=16)\n", " ax.set_ylabel('$y$', fontsize=16)\n", " ax.grid(True)\n", "\n", "\n", "# set up figure\n", "fig = plt.figure(figsize=(8, 6))\n", "ax1 = fig.add_subplot(111)\n", "\n", "# For clarity we are going to add a small margin to all the plots.\n", "ax1.margins(0.1)\n", "\n", "# plot the raw data\n", "plot_raw_data(xi, yi, ax1)\n", "\n", "# add a figure title\n", "ax1.set_title('Our simple raw data', fontsize=16)\n", "\n", "# Add a legend\n", "ax1.legend(loc='best', fontsize=14);\n", "# loc='best' means we let matplotlib decide the best place for the\n", "# legend to go. For other options see \n", "# https://matplotlib.org/api/_as_gen/matplotlib.pyplot.legend.html" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "poly_coeffs: [1.0246532 0.09189181]\n" ] }, { "data": { "image/png": "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Ktyvc45nnnmGiy66iIyMjA3LzznnHO6//3769OnDwIEDeeihh3j55Zf55JNPaN68eTVfZVnVec3xrLN27VrWrVvHFltsUaZMo0aNmDBhQtzx1dR2RCT11dnknio6duzIk08+ueHx8OHDmTlzJq+++upGZa+88spKu6pbtGhRI3EtW7aMdevWbZQ4mzdvzscff1zuer1796Zt27Z07NgRgIEDBzJ//vwyr7EiI0eO5Ntvv6Vnz7JTIZgZffv25eSTT2a33XYjLy+P0aNH07p16yq+svJV5zXHs07Tpk3p2LEjffr0Yb/99mPHHXfk5ZdfZtKkSey+++5xx1dT2xGR1Fdnk3tVW9DVsWLFH5s8D/ihhx7KjTfeyC+//ELjxo256aabuOOOO9huu+02Krvtttuy7bbbbtL+qip6Ol9XwY1NbrjhBiZMmMCECROoX78+X331Fbfffjvjx4+nYcOGce1v4MCBHHzwwbRt23aj50444QQOPvhg/vWvf/HOO+9w8MEHx9xGdA/Hn3/+iZnx0EMPbVhWUQ9HVV5zvOu88MILXHrppbRs2ZL69etz0EEH0bVrV2bMmFHhdqPV1HZEJLXV2eSeKtq1a0fDhg2ZNm0aM2fOZLPNNuOaa66JWTaR3fLNmjWjfv36/PDDD2WW//jjjzG7wf/xj38wdOhQxowZw6677grApEmTWLZsGfvt99fNAdetW8e4ceMYMGAAK1euZPPNNy+z7bfeeosnnngiZkyjR49m9uzZOOcq7IqP7uG49dZbadGiBdddd92GZbF6OKr6mquyzm677cbYsWNZuXIly5cvZ6edduL8889nl112Kfd1xFJT2xGR1KbknuQ233xzDjzwQN555x2ee+45XnrpJRo0aBCzbCK75Rs2bEi7du0YOXIk55577oblI0eO5Oyzzy5Ttnfv3gwdOpTCwkL22muvDcvPOOMM2rf3tw1YuXIljRs35pJLLqF169bcfvvtG7XmhwwZwuabb84FF1ywUTyzZ8/mrLPO4j//+Q/vvfce//znPxkxYkTM2KN7OJo2bcq2225badd1VV5zdddp3LgxjRs35tdff2XEiBE88MADFcZUnprajoikJiX3FNCxY0ceffRRjj/+eE455ZRyy1W3W764uJj58+cDUFpaysKFC5k1axbbbrvthtuAPv744zz++ON8+eWXG9a74YYb6NatGx06dODwww9nwIABLFmyhCuvvHJDmWuuuYYXXniB4cOHs80222xowTZp0oStt96arbfeGvjrVqaNGzdm2223LdOaB9+NPWjQIC644IKNTnUUFRVx0kknccMNN3DppZfSoUMH2rRpUyu3aIznNUfXVTzrjBgxgtLSUvbaay/mz5/PzTffzJ577skll1yyoUxxcTGfffYZjRs3Lvd9imc7IlIHxBpCn4p/6XopnHPODRkyxNWvX9/NnTu3RrYXbcyYMQ7Y6O/iiy/eUObOO+90/uNS1hNPPOEyMzNdw4YN3UEHHeTGjh1b5vlY2wU2uvRsfV2Vdync6NGjHeCmTJlSZvnPP//s9tprL5eTk1Nm+XnnnecOPfTQuF5/VS6Fc67y1xyrripb55VXXnG77rqra9iwodtxxx3dNddc43777bcyZeJ5n+LZTiy6FK7uUj1V7MUXX3SZmZnOzFxmZqZ78cUXww6pDMq5FM78c6mvffv2btq0aTGf++KLL9h7770THNFfrdFNdcIJJ9C6detyzzWng5qqq3RXW/UU1nekNtVGz006Uj2Vr6CggJycHEpKSjYsy8jIID8/n+zs7BAj+4uZTXcxbouuGeqSVGlpKUuXLuX+++9nzpw59OnTJ+yQRETqlNzc3DKJHaCkpITc3NyQIoqfzrknqXHjxnHMMcew55578sYbb5SZ9EVERGpfedNKVzTddLJQck9SnTp1orS0NOwwRETqrJ12asWSJUUbLV8/gDWZqVteREQkgnMwcCAsW5YHZJR5LiMjg7y8vHACqwIldxERkcDSpXDaaZCTA0cckc2jj+aTmZmJmZGZmZlUg+kqom55ERERYPhwuPxyWLECHnkErrsO6tXL5rrrslPuqgK13EVEpE5bvhwuuQTOPBN23hlmzPB3Dq2XwhkyhUMXERHZNGPHQps28PzzkJsLkydD1N20U5KSu4iI1DmrVsHNN0PnzrDZZjBhAvTpA3HeoDLp6Zy7iIjUKbNnw0UXwdy5cMUV8NBD0KRJ2FHVLLXcRUSkTli3Du6/Hw4+GH76Cd59FwYMSL/EDkruEqfXX38dMws7DBGRavn2W+jUCW67zV/qNncunHxy2FHVHiV3qTVZWVk89NBDYYchInWYc/DMM37Q3Gef+YFzr70GzZqFHVntUnKvgoKCArKysqhXrx5ZWVkUFBQkdP+rV69O6P5ERFLZjz/CGWdAz56+K37OHOjWDepCJ6SSe5zW3/qvqKgI5xxFRUXk5OTUaoLv1KkTV111FTfddBPbb789hx9+OAAPP/wwbdq0oXHjxrRo0YKePXvy22+/bVhvxx135JVXXtnw+PDDD6dp06asXbsWgP/+97+YGYsXLy53388//zyZmZlkZGRwyimnsHTp0jLPf/PNN5x++unsuOOONG7cmIMOOoh33323TOxFRUXcfPPNmNmGLv2ff/6Zrl270rJlSxo1asS+++7Ls88+u8l1JSIS6a23YL/9YMQIePhh+PhjSIEp4WuMknucwrr134svvohzjvHjx/P8888DUK9ePfr378/nn3/OSy+9xKeffsq11167YZ2jjz6aMWPGbIhx2rRpbL755qy/331hYSG77747LVq0iLnPKVOm0KNHD3Jycpg1axannnoqd9xxR5kyxcXFdOnShZEjRzJ79mzOPvtszjrrLL788ksAhg0bRsuWLbnjjjv4/vvv+f777wFYtWrVhh8Cn3/+Ob179+aKK66gsLCwRutNROqm5cvhsst8i71FC5g2Df7xj9SekKZanHNp8deuXTtXnnnz5pX7XLzMzAEb/ZlZuessX758k/Z59NFHu/3337/Sch988IFr2LChW7dunXPOuSeffNLtsccezjnnPvroI7fXXnu57t27u759+zrnnLvwwgtdz549y91e165d3XHHHVdm2WWXXeb8x6V8hxxyiLv33ns3PM7MzHQPPvhgpfGff/75rnv37pWWk03/TJWnJr4jyWbMmDFhh5AS0qmexo1zLivLuXr1nLv9duf+/LPmtp2s9QRMczFyYl37LVNt5d3ir7Zv/deuXbuNlo0ePZrjjz+eli1b0rRpU8466yxWr17NDz/8APgu8a+//polS5ZQWFhI586d6dSp04bW8dixYyucI/mLL76gY8eOZZZFP165ciW33HIL++yzD9tssw1NmjRh2rRpld7neN26deTl5dGmTRu22247mjRpwrBhw/juu+/iqA0RkY39+SfceiscfbRvoY8fD3l56TMhTXUouccpLy+PjIzE3/qvcePGZR4XFRVx8skns/fee/Paa68xffp0Bg8eDPw14G7vvfemefPmFBYWbkjunTt35pNPPmHevHksXry4wuTufwxW7KabbuK1117j3nvvZezYscyaNYsO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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Fit a polynomial of degree 1, i.e. a straight line, to our (xi, yi) data from above\n", "# we'll explain what's going on here later in this lecture\n", "degree = 1\n", "poly_coeffs = np.polyfit(xi, yi, degree)\n", "print('poly_coeffs: ',poly_coeffs)\n", "\n", "# use poly1d to turn the coeffs into a function, p1, we can evaluate\n", "p1 = np.poly1d(poly_coeffs)\n", "\n", "# set up figure\n", "fig = plt.figure(figsize=(8, 6))\n", "ax1 = fig.add_subplot(111)\n", "ax1.margins(0.1)\n", "\n", "# Plot the linear fit - define 100 evenly spaced points (x) covering our\n", "# x extent and plot our linear polynomial evaluated at these points (p1(x))\n", "# of course 100 is overkill for this linear example\n", "x = np.linspace(0., 1, 100)\n", "\n", "ax1.plot(x, p1(x), 'b', label=r'$y = {0:.4f}x+{1:.4f}$'.format(poly_coeffs[0], poly_coeffs[1]))\n", "\n", "# Overlay raw data\n", "plot_raw_data(xi, yi, ax1)\n", "\n", "# Add a legend\n", "ax1.legend(loc='best', fontsize=14)\n", "\n", "# add a figure title\n", "ax1.set_title('Raw data and the corresponding linear best fit line', fontsize=16);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have used NumPy's polynomial fitting function which \"minimises the squared error\" \n", "\n", "i.e. it seeks the polynomial (here we chose just a straight line) which minimises the two-norm of the errors at the locations where we have data.\n", "\n", "We can code this up ourselves using SciPy, and in doing so check out code recreates above when we choose the two-norm, but also see what happens if we select other norms with which to define the best fitting line." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAArYAAAK2CAYAAAC7A9/sAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAACbOElEQVR4nOzdd3gU9drG8e+PAEIAK02DJBYsqFhQFBUBC4KIFQvGeuTkYMcjFoxHLAReu6igJ1iwRMCKgigoEJqioqAIFhAJUgQBFUJAIHneP2aTk4SUTbK7s7u5P9e1F9mZ2ZlnN+TOkym/cWaGiIiIiEisq+N3ASIiIiIioaDGVkRERETighpbEREREYkLamxFREREJC6osRURERGRuKDGVkRERETighpbKZNzzpxzBwaxnHPOveSc+8M594VzrpNz7scabPdq59ysYs9znXP7V3d9oeKc6+KcW+HTtq9zzq0JfBZ7VfUzKf69dM4955z7T/iqFZF4UNPcCaxjtHPuvDCVGJWcczc75/7P7zpqMzW2UlMnA2cArcysg5nNNLODC2c655Y5506v7srNrLGZLQ1FodGoss/HOVcPeBzoFvgs1hf/TJxzo5xzg4Pdnpn1M7MHa165iIRbIB+2BJrKP5xzHzjn9g3ResOaO865dsCRwHuB5yV2WsSxTOBy51xzvwuprdTYSk0lA8vMbLPfhYSKc66u3zUU0wJoACz0uxAR8UUvM2sM7A2sAZ6OwDZDkTv/ArIshu8CVZ3fBWa2FfgQuDL0FUkw1NjGscBf5QOdc4sCf+2/5JxrUGz+P51zS5xzG5xz7zvn9iljHccFDkfVLTbtQufcfOfctcDzQMfAHoX7ix+yd869CrQGxgfm31GN91D8MPoo59zwwF6LTc65z51zBxRb9hDn3MeB9/Ojc+7iYvN6OufmOec2Oud+dc7dV2xeSmA71zrnlgNTK6jnbufcusBnm1ps+i7OuUedc8sDn9dzzrmGgXlNnXMTnHN/Bmqb6ZyrU9nn45w7CCg8reNP59zU4p+Jcy4NSAXuCLx+fBCfZ9GelsLvlXPuNufcWufcaufcNcG8JxGJrEDD9BbQtnBalOdOD2B64LWHAs/xv98Vfzrn9gv8WyewzPPOubXF6njNOdc/8PU+gd9RGwK/s/5Z0WcVyOcBzrlvnXN/OefGBvu7L/A+b3DOLQYWF8vJO4rl5HnOubOccz8F1nF3qRKygZ4V1ShhZGZ6xOkDWAZ8B+wL7AnMBgYH5p0KrAOOAXbB2wswo9hrDTgw8PUioEexee8CtwW+vhqYVWxeF2BFqRpOr0LNpddXvI5RwAagA1AXyALGBOY1An4FrgnMOybw/g4rVtcReH/MtcPb83FeYF5KYDuvBNbTsIy6ugA78A7P7QJ0BjYDBwfmPwm8H/icmwDjgaGBeUPxQr1e4NEJcMF8PsVqq1vBZzK4ks+0zOWLvacHAnWdBeQBe1T2nvTQQ4/wP4rnA5AIvAy8Umx+VOZOIEcNaFZs2tUUy/bAtOVA+8DXPwJLgUOLzTs68PV0YATeXuSjgN+B0yr53L4A9gl8Nt8D/QLzgvnd93HgdQ2L5eS9gc/xn4Htvx74zA8DtgL7F1vHMcAGv///1NaH9tjGv2fM7Fcz2wBkAH0C01OBF83sazP7GxiI99d0ShnreBm4HMA5tydwJt4PtR/eMbMvzGwHXmN7VGD62XinRLxkZjvM7GvgbaA3gJllm9kCMysws2+B0XjNaXH3mdlmM9tSwfb/Y2Z/m9l04APgYuecwwu7W81sg5ltAoYAlwZesx3vMGKymW037zzkaDk8tx14IFDXRCAXODiI9yQikTHOOfcnsBHveoZHwLtwl+jNnd0D/26qZLnpQGfnXMvA87cCz/cDdgW+cd45xScDd5rZVjObj3ek8IpK1v2Uma0K/O4bz/9+VwTzu29o4DMt/F2wHcgws+3AGKApMMzMNpnZQrxTNtoVe/0mYLdK6pMwUWMb/34t9nUO3l+wBP7NKZxhZrnAeiCpjHW8BvRyzjUGLgZmmtnq8JRbqd+KfZ0HNA58nQwcHzi09WfgF0Eq0BLAOXe8c26ac+5359xfQD+8cCruVyr2h5U8l7jw82yGtzflq2Lb/igwHbxfREuAyc65pc65u4J/u2G3PvBHQqHCz7Sy9yQikXGeme2Ot3fxRmB6oBGM5tz5M/Bvk0qWm463R/QUYAbeIfzOgcdMMyvAy9jCxr1QDoHfVc65DwOnN+S6YqeHUf7vimB+95X+XbDezPIDXxc2u2uKzd9SbP3gve+/yn7LEm5qbONf8StoWwOrAl+vwmsGAXDONQL2AlaWXoGZrQQ+A87H+yv51SpsP1J7CH4FppvZ7sUejc3susD81/EO2e1rZrvhHaJzVax1j8DnVKjw81yHF2yHFdv2buZd8EHgr/rbzGx/oBfwb+fcaUFuszLh+nwrfE8iEllmlm9m7wD5eHswozZ3AjsAfgYOquQ10/FOkegS+HoWcBJeYzs9sMwqYE/nXPEmuTWB31Vm1iOQ9Y3NLCuI2oP53VfTz+dQ4JsarkOqSY1t/LvBOdcqcArB3cDYwPTXgWucc0c553bBO4T1uZktK2c9rwB34J2n+m4Vtr8GiMQ4tBOAg5xzVzjn6gUexwUuWgDvL+gNZrbVOdcBuKya27nfOVffOdcJ7/SHNwN7FUYCT7jAEC/OuSTn3JmBr88OXHTh8A4n5gceUPPPJyyfb2XvSUQiy3nOBfYAvo+B3JlIydO91gCtnHP1CyeY2WK85vxyvPNcNwaWu5BAY2tmvwKfAkOdcw2cN4zYtXinolVHVX/3VUdnvJERxAdqbOPf68BkvJPylwKDAcxsCvAfvPNQVwMHUPH5k+/i/ZX7rlVtaK+hwD2BQ2UDql5+cAKHqbrhvYdVeIehHsI7fAdwPfCAc24T3kUAb1RjM78BfwTWn4V3McIPgXl34h32m+Oc2wh8AhSO59sm8DwXb8/3CDPLDsyr6efzAtA28Ppx1Xh9RSp6TyISGeOdc7l4zWkGcFXgvE6I7tzJBFIDjTV4o80sBH5zzq0rttx0vEP9y4s9d8C8Ysv0wbugbRXe76JBZvZxNequzu++KgmMvnAW3rUp4oPCKyQlDjnnlgF9zeyTEK3vZ+BfoVqfiIjEL+fc68AbZjbO71oixTl3E94pb1Ue3lJCI5oGopco5py7EO+8o3LHeBURESlkZtU95StmmVkkbqAhFVBjK5VyzmXjDQp+ReC8LhEREZGoo1MRRERERCQu6OIxEREREYkLamxFREREJC7EzTm2TZs2tZSUlLCtf/PmzTRq1KjyBaOU6vdXLNcfy7VD+Ov/6quv1plZrbwjm3K3YqrfX7FcfyzXDv7mbtw0tikpKcydOzds68/OzqZLly5hW3+4qX5/xXL9sVw7hL9+51xO5UvFJ+VuxVS/v2K5/liuHfzN3YifiuCce9E5t9Y5910581Odc98GHp86546MdI0iIvFEuSsitYUf59iOArpXMP8XoLOZtQMexLt7iYiIVN8olLsiUgtE/FQEM5vhnEupYP6nxZ7OAVqFvSgRkTim3BWR2iLaR0W4FvjQ7yJERGoR5a6IxCxfbtAQ2HMwwcwOr2CZrsAI4GQzW1/OMmlAGkCLFi3ajxkzJgzVenJzc2ncuHHY1h9uqt9fsVx/LNcO4a+/a9euX5nZsWHbQIgodyNP9fsrluuP5drB39yNysbWOdcOeBfoYWY/BbPOY4891iq6Onfjxo2sXbuW7du3V6Ni2Lp1Kw0aNKjWa6OB6vdXtNZfr149mjdvzq677lruMro6t2LOubhobJW7oaf6/RWt9St3a66i3I264b6cc62Bd4Argg3XymzcuJE1a9aQlJREw4YNcc5VeR2bNm2iSZMmoSjHF6rfX9FYv5mxZcsWVq5cCVBhyEp8U+6Gh+r3VzTWr9wNv4g3ts650UAXoKlzbgUwCKgHYGbPAfcCewEjAkG4o6Z7Q9auXUtSUhKJiYk1WY1IXHHOkZiYSFJSEqtWrVLAxjHlrkh0UO6Gnx+jIvSpZH5foG8ot7l9+3YaNmwYylWKxI2GDRtW+1CxxAblrkh0Ue6GT7SPihAy1TkMJlIb6GdDwkX/t0TKpp+N8Kk1ja2IiIiIxDc1tiIiIiISF9TYioiIiEhcUGMrzJgxg3POOYekpCScc4waNSro144YMYL99tuPBg0a0L59e2bOnFli/tChQznuuOPYddddadasGb169eK7774rc11DhgzBOceNN95YYnpKSgq77rorzrkSj549e1b5vYZCZe+5LCNHjqzwNZs2baJ///4kJyfTsGFDTjzxRL788ssSywTzfQpmPSLiP+Vu1Sh3JVhqbIXc3FwOP/xwhg0bVqWrmMeOHcstt9zC3Xffzbx58zjxxBPp0aMHy5cvL1omOzub66+/nk8//ZSpU6dSt25dTj/9dDZs2FBiXXPmzGHkyJG0a9dup+18+eWXLF68mNWrV7N69Wq+/vprnHNcfPHF1X/TxVx99dXcd999QS0bzHsu6zV33nlnha/p27cvkyZN4uWXX2bBggV069aN008/vWisQwju+xTMekTEf8pd5a6EiZnFxaN9+/ZWnkWLFpU7L1gbN26s8TqqIykpyR577LES07799lvbZZddbOHChUGvJ9j6GzVqZC+99FJQy3bo0MH69u1bYtqBBx5od911V7mv2bRpk9WpU8fef//9oml//vmn7b///jZlyhTr3Lmz3XDDDRXWP3jwYNttt91s8+bNRdPeeOMNq1+/vi1btqxo2s0332z777+//fbbbxW+j6uuusoGDRpU4TKFqvOeO3ToYFdddVW5r8nLy7OEhAQbN25ciWWOOeYYS09PL3OdZX2fqrOeQhX9jEybNq3C10a7cNcPzLUoyEA/Hsrdiil3y6fcVe7WREW5G3V3HouU/v1h/vzgl8/Pb0hCQs22edRR8OSTVXtNx44ddzqk0b9/f/r27Uvbtm1LTB8yZAhDhgypcH0ffvghnTp1qloRZdi2bRtfffUVAwYMKDG9W7dufPrpp+W+btOmTRQUFLDHHnsUTUtLS6N3796ceuqpPPDAAxVu18x44YUXuPzyy0sM/N67d28eeughBg8ezMiRI3n00UcZPXo0s2fPpkWLFtV8lyVV5z0XvuaGG24o9zU7duwgPz9/p1s/NmzYkFmzZgVdX6jWIxIuyt2aUe7+j3JXylNrG9tY0bFjR0aMGFH0fNy4ccybN4833nhjp2X79etX7mGi3NxcGjduTFJSUkjqWrduHfn5+TuFV4sWLfjkk0/Kfd0tt9zCUUcdRceOHQHvHKglS5bw6quvBrXdjz/+mF9++YW+fUuOJe+cY8iQIfTs2ZMDDjiAjIwMpk6dSps2bar4zspXnfdc+JrmzZuX+5omTZrQsWNHBg8ezOGHH07Lli0ZPXo0n332GQceeGDQ9YVqPSK1nXK3JOVu+ZS70afWNrZV/Qt+06Ytvtxz+oQTTuC2225jw4YNNGrUiAEDBnDvvfey11577bTsnnvuyZ577lnmesJ1z+zSg0ybWbkDT//73/9m1qxZzJo1i4SEBH788UfuvvtuZs6cSf369YPa3siRIznuuOM46qijdprXrVs3jjvuOO655x7Gjx/PcccdV+Y6Su9h+fvvv3HO8eijjxZNq2gPS1Xec7CvefXVV/nHP/5Bq1atSEhI4JhjjqFPnz58/fXXFa63tFCtJx5kZWWRnp7O8uXLad26NRkZGaSmpvpdVq2m3A0N5a5yN1pFQ+7W2sY2VrRv35769eszd+5c5s2bR926dXc6vFIokofEmjZtSkJCAr/99luJ6WvXri3zENStt97KmDFjmDZtGvvvvz8An332GevWrePwww8vWi4/P58ZM2bw3HPPsXnzZnbZZZcS637vvfcYPnx4mTVNnTqVb775BjOr8DBY6T0sd955J0lJSdx8881F08raw1LV91z8NWvWrKnwNQcccADTp09n8+bNbNy4kb333ptLLrmE/fbbr9z3UZZQrSfWZWVlkZaWRl5eHgA5OTmkpaUBqLmVSil3lbtVodz1RE3ulnfybaw94vUiBjOz448/3m688UZr0qSJjR8/vtzl1q9fb4sXLy7zMW/ePFu8eLHl5eVVuK2qXsTwz3/+s8S0Nm3a7HRC/80332zNmzff6fvwxx9/2IIFC0o8jj32WOvTp48tWLDACgoKipbduHGjPfTQQ9a4ceMyvxfz58+33XbbzV544QW74IILrFu3bkG9B7OqX8QQzHsu/Zqrr766Sq/ZsGGD7bbbbvbf//63zPnBfp8qW0+heLuIITk52YCdHsnJySHfFrp4rEzKXeVuRZS7yt2aqCh3fQ/GUD3iOWD79+9vzrkqhUZpFdW/adMmmzdvns2bN88aNmxo999/v82bN89ycnKKlnn66aft4IMPLvG6MWPGWL169WzkyJG2aNEiu/nmm61Ro0YlrpC9/vrrrUmTJjZlyhRbvXp10WPTpk1l1lLe1bl//fWXtWnTZqcrY83Mli1bZvvss4/df//9Zma2YMECc84FHQxVCdhg3nPpzyqY13z00Uc2ceJEW7p0qU2ePNmOPPJI69Chg23btq1omWC+T8GspyzxFrDOuTID1jkX8m2psS2bcle5WxHlrnK3JtTYxnjAjho1yhISEuy7776r9joqqn/atGll/mcsPlTKoEGDzNvBX9Lw4cMtOTnZ6tevb8ccc4xNnz69xPyy1guUG2jlBeyECRMMsM8//7zE9PXr19shhxxiaWlpJaZffPHFdsIJJ5T7nourSsCaVf6ey/qsHnvssQpfM3bsWNt///2tfv361rJlS7vhhhvszz//LLFMMN+nYNZTlngL2Natk6Niz0G8P5S7FVPulk+5q9ytCTW2MR6wZ5xxhl1//fU1Woef9YeC6g+veArYbdvMTjrpNYPEEuGamJhor732Wsi3p8a2bMrd6P+5r4zqDy/lbvVVlLu681iUKigoYM2aNTz00EMsWLCAwYMH+12SSNTLy4PzzoPZs1O56KJMWrdOxjlHcnIymZmZunBMKqTcFam6aMtdjYoQpWbMmMGpp57KwQcfzNtvv11iYG0R2dkff0CvXvDZZ/Df/0JaWiqQSnZ2Nl26dPG7PIkByl2RqonG3FVjG6W6dOlCQUGB32WIxIRVq+DMM+Gnn2DsWOjd2++KJBYpd0WCVzx333gDLrzQ74o8amxFJKYtXgzdusG6dTBxIpx2mt8ViYjEt2jOXTW2IhKz5s2D7t2hoACmTYNjj/W7IhGR+BbtuauLx0QkJk2fDl26wC67wKxZ0ReuIiLxJjsbOneO7txVYysiMWfcOO/crqQk+PRTOPhgvysSEYlv48Z5e2pbtYru3FVjKyIx5cUXvYsUjjoKZs70QlZERMInlnJXja2IxIyHH4Zrr4XTT4dPPoG99vK7IhGR+BZruavGVkSinhncfjvceSdccgmMHw+NG/tdlYhI/IrV3NWoCCIS1XbsgH/+E0aNghtugKeegjr6k1xEJGx27IC0NHjpJbj+ei93ExL8rio4+vUgQXnrrbdwzvldhtQyW7Z453WNGgWDBsHTT6upldpDuSt+KMzdl17ycveZZ2KnqQU1thJGKSkpPProo36XIVEmKyuLlJQU6tSpQ0pKCllZWWUu99df0KOHd/jrmWfgvvtAv+NFKqbclbJUJXe7d4/t3FVjWwXB/scIl23btkV0eyKhlpWVRVpaGjk5OZgZOTk5pKWl7fSztGaNN0btp5/C6697pyBI7aTcFamZ6uRuVlbs5q4a2yC98cYbQf3HCKUuXbpw3XXXMWDAAJo1a8ZJJ50EwOOPP067du1o1KgRSUlJ9O3blz///LPodS1btmTs2LFFz0866ST22WcfduzYAcDixYtxzrFy5cpyt/3KK6+QnJxMYmIiZ599NmvWrCkx/+eff+bcc8+lZcuWNGrUiGOOOYYJEyaUqD0nJ4fbb78d51zR4bT169fTp08fWrVqRcOGDTnssMN46aWXavxZSWxIT08nLy+vxLS8vDzS09OLnv/yC5x8snf/8fHj4dJLI12lRAvlrnJXai7Y3D3ppP/lbp8+ka4ydNTYBun++++v9D9GOLz22muYGTNnzuSVV14BoE6dOjz55JMsXLiQ119/nS+++IKbbrqp6DWdO3dm2rRpRTXOnTuX+vXrM3fuXACys7M58MADSUpKKnObn3/+OVdffTVpaWnMnz+fXr16ce+995ZYJjc3lx49evDxxx/zzTffcOGFF3LBBRfwww8/APDOO+/QqlUr7r33XlavXs3q1asB2Lp1a1EYL1y4kFtuuYV//etfTJkyJbQfnESl5cuXVzh9wQIvXDdsgClTvJswSO2l3FXuSs0Fm7t//OHlbvfukawuDMwsLh7t27e38ixatKjcecFyzhmw08M5V+N1l6dz5852xBFHVLrchx9+aPXr17f8/HwzMxsxYoQddNBBZmY2efJkO+SQQ6xPnz42ZMgQMzO77LLLrG/fvuWur0+fPnb66aeXmHbttdea99+lfMcff7w9+OCDRc+Tk5PtkUceqbT+Sy65xK699toKl9m4cWOl64lm0V5/RT8j06ZNC9l2kpOTy/w5Sk5OtlmzzHbf3Swpyey770K2yZDWXxZgrkVBBvrxUO4qd6NZtNev3K2+inJXe2yD1Kqc22y0bt06rNtt3779TtOmTp3KGWecQatWrWjSpAkXXHAB27Zt47fffgO8w1E//fQTq1atIjs7m65du9KpUyeys7MBmD59Ol26dCl3m99//z0dO3YsMa30882bN3PHHXfQtm1b9thjDxo3bszcuXPL/cuwUH5+PhkZGbRr14699tqLxo0b884771T6OokPGRkZJCYmlpiWmJjIRRdlcMYZ0Lw5zJ4Nhx3mU4ESVZS7yl2pudqWu2psgzRo0KAy/2NkZGSEdbuNGjUq8TwnJ4eePXty6KGH8uabb/LVV1/x4osvAv+7yOHQQw+lRYsWZGdnlwjY2bNns2jRIlauXFlhwHp/DFVswIABvPnmmzz44INMnz6d+fPn06FDh0ovtHj00Ud57LHHuP3225kyZQrz58/nvPPO0wUatURqaiqZmZkkJyfjnCM5OZkrr8zkiSdSadsWZs2C5GS/q5RoodwtSbkr1VHbcjfiN2hwzr0InA2sNbPDy5jvgGHAWUAecLWZfR3ZKnd28cUX06BBA9LT01m+fDmtW7cmIyOD1NTUiNYxd+5ctm3bxhNPPEFCYGC54hcPFOrcuTMffPABc+fOpXPnzjRs2JCmTZvy8MMPV3ieF0Dbtm2ZM2dOiWmln8+aNYsrr7ySCy+8EPDO4fr555856KCDipapX78++fn5O72uV69eXHHFFYAX5j/99BO777578B+CxLTU1NSin5thw6B/fzj1VBg3Dpo08bW0uKXcrRnlrsS62pS7fuyxHQVUdGpyD6BN4JEGPBuBmoKSmprKsmXLKCgoYNmyZREPV4A2bdpQUFDAk08+yS+//MLo0aN58sknd1quS5cujB07ljZt2tC8eXPAC93XXnutwr0GADfffDOffPIJQ4cOZfHixYwcOZJ33323xDIHHXQQ7777Ll9//TULFizg8ssvZ+vWrSWWSUlJYebMmaxcuZJ169YVvW7KlCnMmjWLH374gRtvvJFffvml+h+IxCQzuOceL1zPPx8++CD+wjXKjEK5W23KXYkHtSV3I97YmtkMYEMFi5wLvBI4P3gOsLtzbu/IVBf92rVrx7Bhw3j88cdp27Ytzz//fJmDcXft2pX8/PwSYVrWtLKccMIJvPDCCzz77LO0a9eOd955h/vuu6/EMo8//jjNmzenU6dO9OjRgxNOOIFOnTqVWOaBBx7g119/5YADDqBZs2YA3HPPPXTo0IEePXpwyimn0KhRI19+UYl/8vPhuusgIwP69oU334QGDfyuKr4pd2tGuSuxrlblbnlXlYXzAaQA35UzbwJwcrHnU4BjK1tnuK/OjfarKyuj+v0V7fVH6urcrVvNevc2A7OBA80KCkK26nJpVATlrl9Uv7+ivX7lbvVVlLsRP8c2CGXdvK3Ms+qdc2l4h82KTtovy2677camTZtqVFR+fn6N1+En1e+vaK9/69at5f785ObmljuvKvLyEvjPfw7n66/34Prrl9Ct2wqmT6/xaisVqvrjnHI3DFS/v6K9fuVueERjY7sC2LfY81bAqrIWNLNMIBPg2GOPtfIO9Xz//fc0qeGJJJs2barxOvyk+v0V7fU3aNCAo48+usx52dnZlR5Grczvv8NZZ8E338DLL8OVVx4IHFijdQYrFPXXAsrdMFD9/or2+pW74RGNw329D1zpPCcAf5nZar+LEpHqWb4cOnWC776Dd9+FK6/0uyIpg3JXJI4sX+7dmrw25q4fw32NBroATZ1zK4BBQD0AM3sOmIg35MwSvGFnrol0jSISGosWQbdukJsLH3/sBa1EnnJXpPao7bkb8cbWzPpUMt+AG8KwXbyhGkWkOAtiYPjq+Pxz7zBY/fowYwa0axeWzUgQlLsi0SXcubvLLrU3d6PxVISQq1evHlu2bPG7DJGotGXLFurVqxfSdU6eDKedBnvs4d2qsTaGa22n3BUpX7hzd9as2pu7taKxbd68OStXriQvLy9sfyWJxBozIy8vj5UrVxYNJh8KY8fC2WfDgQd64br//iFbtcQQ5a7IzpS74ReNoyKE3K677grAqlWr2L59e7XWsXXrVhrE8GjGqt9f0Vp/vXr1aNGiRdHPSE2NGAE33uhdLPb++7DbbiFZrcQg5a7q91u01h/q3H32WbjhBuVuoVrR2IIXsjX5T5SdnV3usByxQPX7K9brr4wZ3H+/9+jVy9t70LCh31WJ35S7qt9PsV5/ZczggQfgvvvgnHNgzBjlLtSixlZEwqOgAG6+GYYPh6uuguefh7pKFhGRsCkogFtugWeeUe6WVivOsRWR8Ni2DVJTvab2ttvgxRcVriIi4bRtG1x+udfUKnd3po9CRKpl82a48EKYNAkeegjuuMPvikRE4lvx3P2//4M77/S7ouijxlZEqmz9eujZE7780jsEdu21flckIhLfNmzwcveLL+CFF+Af//C7ouikxlZEqmTFCjjzTPj5Z3jrLTj/fL8rEhGJb8Vz9+234bzz/K4oeqmxFZGg/fijd6vGP/6Ajz6CLl38rkhEJL799BOccYZyN1hqbEUkKHPnQo8e4BxkZ8Mxx/hdkYhIfPvqK+jeXblbFRoVQUQqNXUqdO0KjRp5t8hVuIqIhNfUqd7eWeVu1aixFZEKzZjRlB49IDnZC9c2bfyuSEQkvk2frtytLjW2IlKu55+H++8/jGOPhRkzICnJ74pEROLbyJHwwAOH0b69crc61NiKyE7MvDES//lPOO64DXz8Mey5p99ViYjELzMYOhTS0rzc/eQT5W516OIxESmhoABuvx0ef9y7q9jVV39HYmJnv8sSEYlbyt3Q0R5bESmyfTtcc40XrjffDK+8AnXrmt9liYjELeVuaGmPrYgAsGULXHwxTJgADz4I6eneEDMiIhIeyt3QU2MrIvz5J/Tq5V19++yz0K+f3xWJiMQ35W546FQEkVpu9Wpo1y6LWbNSgDr83/+lkJWV5XdZIiJxS7kbPtpjK1KL/fwzdOyYxe+/pwF5mEFOTg5paWkApKam+lugiEicUe6Gl/bYitRS8+fDSSfB+vXpQF6JeXl5eaSnp/tSl4hIvPrmG+VuuKmxFamFZs6Ezp2hXj0wW17mMsuXlz1dRESqbsYMOOUU5W64qbEVqWXGj4du3WDvvb2LFlq3bl3mcuVNFxGRqnn/fTjzTNhnH/j0U+VuOKmxFalFRo2C88+HI46AWbOgdWvIyMggMTGxxHKJiYlkZGT4U6SISBwZNQouuMDL3ZkzYd99lbvhpMZWpJZ49FFvEPCuXWHKFGja1JuemppKZmYmycnJOOdITk4mMzNTFzCIiNSQcjfyNCqCSJwzg4ED4aGH4KKL4NVXYZddSi6TmpqqQBURCRHlrn/U2IrEsR07vEG/X3jB+/eZZyAhwe+qRETil3LXXzoVQSRObd3q7Sl44QW45x4YMULhKiISTspd/2mPrUgc2rgRzj0XsrNh2DC4+Wa/KxIRiW/K3eigxlYkzqxdC927w4IF8NproFO4RETCS7kbPdTYisSRZcu8MWpXrPDGTezRw++KRETim3I3uqixFYkT333nheuWLfDJJ3DiiX5XJCIS35S70UcXj4nEgc8+g06dvK9nzlS4ioiEW2HuOqfcjSa+NLbOue7OuR+dc0ucc3eVMX8359x459w3zrmFzrlr/KhTJBZ8+CGcdpo38Pfs2XD44X5XJNFIuSsSOoW526yZcjfaRLyxdc4lAMOBHkBboI9zrm2pxW4AFpnZkUAX4DHnXP2IFioSA15/Hc45Bw45xAvX/fbzuyKJRspdkdApnruzZkFKit8VSXF+7LHtACwxs6Vmtg0YA5xbahkDmjjnHNAY2ADsiGyZItHt6ae9K29PPtkbXqZ5c78rkiim3BUJgaeeUu5GOz8a2yTg12LPVwSmFfcMcCiwClgA3GJmBZEpTyS6mcG993pjJJ5/vndIbNdd/a5KopxyV6QGCnP3lluUu9HOmVlkN+jcRcCZZtY38PwKoIOZ3VRsmd7AScC/gQOAj4EjzWxjqXWlAWkALVq0aD9mzJiw1Z2bm0vjxo3Dtv5wU/3+ClX9+fnw1FNteP/9JM46azX//vdPJCSE92dYn33Funbt+pWZHRu2DYSActcfqt9fyl3/+Jq7ZhbRB9ARmFTs+UBgYKllPgA6FXs+FS+Ey11v+/btLZymTZsW1vWHm+r3Vyjq37rV7KKLzMDsrrvMCgpqXlcw9NlXDJhrEc7Rqj6Uu/5Q/f4Kde7eeadyN1h+5q4fpyJ8CbRxzu0XuDDhUuD9UsssB04DcM61AA4Glka0SpEokpsLZ58Nb74Jjz4KQ4d6Q8yIBEm5K1JFpXP3//5PuRsLIn6DBjPb4Zy7EZgEJAAvmtlC51y/wPzngAeBUc65BYAD7jSzdZGuVSQarFsHPXvCV1/BSy/B1Vf7XZHEGuWuSNUod2OXL3ceM7OJwMRS054r9vUqoFuk6xKJNr/+CmeeCb/8Au+84w0xI1Idyl2R4Ch3Y5tuqSsSpX74wbtV419/waRJcMopflckIhLflLuxT42tSBT68kvo0QPq1oUZM+DII/2uSEQkvil344Mvt9QVkfJ98gl07eqNkTh7tsJVRCTclLvxQ42tSBR580046yw44AAvXA84wO+KRETim3I3vqixFYkSzz0Hl1wCxx8P06fD3nv7XZGISHxT7sYfNbYiPjODBx+E667zhpeZNAl2393vqkRE4pdyN37p4jERHxUUwK23wlNPwRVXwAsvQL16flclIhK/iufulVfC888rd+OJ9tiKVFFWVhYpKSnUqVOHlJQUsrKyqrWe7du9Zvapp7yQHTVK4SoiUpZw5G7//t7NF5S78UV7bEWqICsri7S0NPLy8gDIyckhLS0NgNTU1KDXs3kzXHQRfPghDBkCd92lWzWKiJRFuStVoT22IlWQnp5eFK6F8vLySE9PD3odGzbAGWd453T9978wcKDCVUSkPKHI3T/+8G68MGkSZGYqd+OZ9tiKVMHy5curNL20lSu9WzUuXuwNMXPBBaGsTkQk/oQid7t3h59+Uu7WBtpjK1IFrVu3rtL04hYvhpNOgpwc71CYwlVEpHKhyN1ly5S7tYUaW5EqyMjIIDExscS0xMREMjIyKnzd4sWNOekk7xyv7Gw49dQwFikiEkeqm7s//fS/3J02TblbW6ixFamC1NRUMjMzSU5OxjlHcnIymZmZFV7AkJ0N/fsfRcOGMGsWtG8f/PZCdSWwiEisqm7u3nrr/3L32GOD355yN7bpHFuRKkpNTQ36Stxx4+DSS6Fly7+ZNasurVoFv51QXQksIhLrlLsSLO2xFQmTF16ACy+Eo4+GYcPmVSlcITRXAouI1CbKXVFjKxIGDz8Mfft6w3p98gnsttuOKq+jplcCi4jUFmbw0EPKXVFjKxJSZnD77XDnnd6hsPffh0aNqreumlwJLCJSWxTm7l13KXdFja1IyOzYAddcA48+CjfcAFlZUL9+9ddX3SuBRURqix074B//gMceU+6KR42tSAhs2eKd1/Xyy3DfffD001Cnhj9d1bkSWESkttiyxRuXdtQo5a78j0ZFEKmhP/+Ec87xhpQZPhyuvz50667KlcAiIrXFX395uTtzpnJXSlJjK1IDv/3m3apx0SIYPRouucTvikRE4ptyVyqixlakmpYu9a6+/e03mDABunXzuyIRkfi2dKmXtatX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l37NnXfeWeFr/vzzT0466STMjA8++IDvv/+ep59+mubNmxctE8z3KZjPU0T8V50sAejbty+TJk3i5ZdfZsGCBXTr1o3TTz+9aFzUQhXlbnZ2Ntdffz2ffvopU6dOpW7dupx++uls2LChaJnc3Fzatm1b5d8LwQp37gZTfzCZ+uWXX5b4HL/++mucc1x88cVFywT7PZEIMbO4eLRv397Ks2jRonLnBWvjxo01Xkd1JCUl2WOPPVZi2rfffmu77LKLLVy4MOj1BFt/o0aN7KWXXgpq2Q4dOljfvn1LTDvwwAPtrrvuKno+aNAgO+yww8pdR8+ePe3KK68sMe3KK6+0nj17llimT58+FS7zxhtvWP369W3ZsmVF026++Wbbf//97bfffqvwfVx11VU2aNCgCpcpFMx7Lus1V111VYWvGThwoJ144olB1WBW/vcpmM+zLBX9jEybNi3ouqJRuOsH5loUZKAfD+VuxSqqvzpZkpeXZwkJCTZu3LgS04855hhLT08vel5Z7pa2adMmq1Onjr3//vtl1l9e3kRz7gZTf3HB/u4bPHiw7bbbbrZ582YzC/57UhblbvVVlLtRd+exSOnfH+bPD375/PyGJCTUbJtHHQVPPlm113Ts2HGnQxr9+/enb9++tG3btsT0IUOGMGTIkArX9+GHH9KpU6eqFVGGbdu28dVXXzFgwIAS07t168ann35aYtrSpUtJSkqifv36HH/88QwZMoT9998fgJNPPpkRI0bwww8/cMghh7Bo0SKmTp3KwIEDi15/8sknM3z48AqX6d27Nw899BCDBw9m5MiRPProo4wePZrZs2fTokWLGr/fqr7n0q+54YYbKnzNuHHj6N69O5dccgnTpk1jn332oW/fvtxwww1VGhYmmM9TxC/KXU91sgRgx44d5Ofn73Sb2IYNGzJr1qwS0yrK3dI2bdpEQUEBe+yxR4Xvo7Rozd1wMTNeeOEFLr/88qIbj1TleyKRUWsb21jRsWNHRowYUfR83LhxzJs3jzfeeGOnZfv161fi8Ehxubm5NG7cmKSkpJDUtW7dOvLz83cKrxYtWvDJJ58UPT/++OMZNWoUhxxyCGvXrmXw4MGceOKJLFy4kL322os777yTTZs20bZtWxISEtixYwfp6elcf/31Reu48847Wb9+fYXLOOcYMmQIPXv25IADDiAjI4OpU6fS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59OrVy/uvffeEsvk5ubSo0cPPv74Y7755hsuvPBCLrjgAn744QcA3nnnHVq1asW9997L6tWrWR0Y0G7r1q1FYbxw4UJuueUW/vWvfzFlypTQfnASlZYvX17h9Kws6N0bjj7au1CsefNIVifRRrmr3JWaqyx3g7V6tTeO+LvvwhNPwPDhUDcax9Yys7h4tG/f3sqzaNGicucFyzlnwE4P51yN112ezp072xFHHFHpch9++KHVr1/f8vPzzcxsxIgRdtBBB5mZ2eTJk+2QQw6xPn362JAhQ8zM7LLLLrO+ffuWu74+ffrY6aefXmLatddea95/l/Idf/zx9uCDDxY9T05OtkceeaTS+i+55BK79tprK1xm48aNla4nmkV7/RX9jEybNi1k20lOTi7z5yg5Odmee87MObMuXcxC+XGFsv6yAHMtCjLQj4dyV7kbzaK9/mjI3WB9+63ZvvuaNWpk9t57lS/vZ+5qj22QWrVqVeb01q1bh3W77du332na1KlTOeOMM2jVqhVNmjThggsuYNu2bfz222+Adzjqp59+YtWqVWRnZ9O1a1c6depEdnY2ANOnT6dLly7lbvP777+nY8eOJaaVfr5582buuOMO2rZtyx577EHjxo2ZO3dupX8B5ufnk5GRQbt27dhrr71o3Lgx77zzTpX/cpTYlJGRQWJiYolpiYmJnHhiBv36ebfKnTjRu2BMRLmr3JWaKy93MzIygnr9Rx95wyzm53unh51zTjiqDB01tkEaNGhQjf5jVFejRo1KPM/JyaFnz54ceuihvPnmm3z11Ve8+OKLwP8ucjj00ENp0aIF2dnZJQJ29uzZLFq0iJUrV1YYsN4fQxUbMGAAb775Jg8++CDTp09n/vz5dOjQodILLR599FEee+wxbr/9dqZMmcL8+fM577zzdIFGLZGamkpmZibJyck452jdOpnu3TMZPTqV3r29Q1wNG/pdpUQL5W5Jyl2pjtK5m5ycTGZmJqmpqZW+dvhw6NnTu4D388+908SiXcTPjnDOvQicDaw1s8PLmO+AYcBZQB5wtZl9Hdkqd3bxxRfToEED0tPTWb58Oa1btyYjIyOo/xihNHfuXLZt28YTTzxBQkICQImLBwp17tyZDz74gLlz59K5c2caNmxI06ZNefjhhys8zwugbdu2zJkzp8S00s9nzZrFlVdeyYWBQeu2bt3K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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from scipy.optimize import minimize\n", "\n", "def line_fit(x, line_coeffs):\n", " return line_coeffs[0]*x + line_coeffs[1]\n", "\n", "def cost_fun(line_coeffs, x, y, norm):\n", " if norm=='two':\n", " return sl.norm(y - line_fit(x, line_coeffs), 2)\n", " elif norm=='one':\n", " return sl.norm(y - line_fit(x, line_coeffs), 1)\n", " elif norm=='max':\n", " return sl.norm(y - line_fit(x, line_coeffs), np.inf)\n", " else:\n", " raise ValueError('check your norm string')\n", "\n", "degree = 1\n", "poly_coeffs = np.polyfit(xi, yi, degree)\n", "p1 = np.poly1d(poly_coeffs)\n", "\n", "# set up figure\n", "fig = plt.figure(figsize=(10, 10))\n", "ax = fig.add_subplot(221)\n", "ax.margins(0.1)\n", "x = np.linspace(0., 1, 100)\n", "ax.plot(x, p1(x), 'b', label=r'$y = {0:.4f}x+{1:.4f}$'.format(poly_coeffs[0], poly_coeffs[1]))\n", "plot_raw_data(xi, yi, ax)\n", "ax.legend(loc='best', fontsize=14)\n", "ax.set_title('polyfit linear best fit line', fontsize=12)\n", " \n", "x0 = poly_coeffs\n", "output = minimize(cost_fun, x0, args=(xi,yi,'two'))\n", "# use poly1d to turn the coeffs into a function, p1, we can evaluate\n", "p1 = np.poly1d(output.x)\n", "ax = fig.add_subplot(222)\n", "ax.margins(0.1)\n", "x = np.linspace(0., 1, 100)\n", "ax.plot(x, p1(x), 'b', label=r'$y = {0:.4f}x+{1:.4f}$'.format(output.x[0], output.x[1]))\n", "plot_raw_data(xi, yi, ax)\n", "ax.legend(loc='best', fontsize=14)\n", "ax.set_title('Best fit (two-norm)', fontsize=12)\n", "\n", "x0 = poly_coeffs\n", "output = minimize(cost_fun, x0, args=(xi,yi,'one'))\n", "# use poly1d to turn the coeffs into a function, p1, we can evaluate\n", "p1 = np.poly1d(output.x)\n", "ax = fig.add_subplot(223)\n", "ax.margins(0.1)\n", "x = np.linspace(0., 1, 100)\n", "ax.plot(x, p1(x), 'b', label=r'$y = {0:.4f}x+{1:.4f}$'.format(output.x[0], output.x[1]))\n", "plot_raw_data(xi, yi, ax)\n", "ax.legend(loc='best', fontsize=14)\n", "ax.set_title('Best fit (one-norm)', fontsize=12)\n", "\n", "x0 = poly_coeffs\n", "output = minimize(cost_fun, x0, args=(xi,yi,'max'))\n", "# use poly1d to turn the coeffs into a function, p1, we can evaluate\n", "p1 = np.poly1d(output.x)\n", "ax = fig.add_subplot(224)\n", "ax.margins(0.1)\n", "x = np.linspace(0., 1, 100)\n", "ax.plot(x, p1(x), 'b', label=r'$y = {0:.4f}x+{1:.4f}$'.format(output.x[0], output.x[1]))\n", "plot_raw_data(xi, yi, ax)\n", "ax.legend(loc='best', fontsize=14)\n", "ax.set_title('Best fit (max-norm)', fontsize=12)\n", "\n", "\n", "plt.tight_layout(pad = 2.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that our code recreates the `numpy.polyfit` result when we choose the two-norm. Note also that we get slightly different results when we use the one-norm or the max-norm.\n", "\n", "These results are all equally valid. The fact that `numpy.polyfit` implements the two-norm without giving us the ability to change the norm highlights that so-called \"least squares\" fitting is by far the most common approach, but there may be situations where the other norms are beneficial.\n", "\n", "Let's see what happens when we perturb a single entry - this is motivated by a situation where maybe one of our sensors failed and gave a spurious result." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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XpciPqXcVf1eisT6lbuhFxON7ZYtW/j111+Jj4+nfv36GGMqvI2tW7fSqFGjEFQXHqrfW5FWv7WW7du3s379egCFrFQ75a7q91qk1a/cDY+YmIqwceNG4uPjiYuLq1S4iviNMYa4uDji4+PZuHGj1+WIDyl3RYpS7oZHTDS2u3fvpn79+l6XIRJx6tevX+nDxCJlUe6KlEy5G1ox0dgCGjEQKYF+LiSU9O9LZF/6uQitmGlsRURERMTf1NiKiIiIiC+osRURERERX1BjK8yePZu//e1vxMfHY4xhwoQJQb3v6aefpmPHjjRu3JjGjRvTvXt33nvvvSLrbN26lVtuuYXExETq169Pjx49+Prrrwtef/jhhzn++ONp3LgxzZo147zzzmPZsmX7bGPo0KGlbiOcxo4dy6GHHkq9evXo3Lkzc+bMCep948ePL/d9wW57xIgRGGO44YYbiiwP5rMUkcig3A2eclcqQo2tkJOTw1FHHcWYMWMqdBZzq1atGDlyJN988w3z58+nT58+XHDBBSxZsqRgncGDB/PRRx/x0ksvsXTpUs444wxOO+20guv4ZWZmcv311/P5558zY8YMatWqxWmnncbvv/9eZBvTp08vdRtVNWjQIO67775y15syZQo333wz99xzDwsXLqRHjx707duX7Ozsct83dOjQMt8X7LbnzZvH+PHj6dix4z77CeazFJHIoNxV7kqIWGt98ejcubMtzYoVK0p9LVhbtmyp8jYqIz4+3j722GNFli1ZssTWrVvXLl++POjtBFt/gwYN7IsvvliREoto0qSJHTdunLXW2tzcXFuzZk07bdq0Iut06tTJpqamlvj+rVu32ho1ati33367yDYmT55c5jZee+01W6dOHbt27dqCZTfddJNt3bq1/eWXX8qseeDAgXb48OHlfm9du3a1gwcPLrLs8MMPt3fddVe57xs4cGCZ7wtm23/++adt3bq1nT59uu3Zs6cdMmRImfst/lmWpryfj5kzZ5b5eqQLdf3AfBsBGejFQ7lbNuVu6ZS7yt2qKCt3Y+LOYyW55RZYtCj49fPy6lOzZtX2eeyxMHp0xd7TvXv3fQ7/3HLLLQwePJj27dsXWT5ixAhGjBhR5vY++OADTj755IoVEYS8vDymTp1KTk4OPXr0AGDPnj3k5eVRr169IuvWr1+fuXPnlridrVu3kp+fT5MmTYpso27dumVuo1+/fowcOZKHHnqI8ePHM2rUKCZPnsxnn31GixYtqvz97dq1iwULFnD77bcXWX7GGWfw+eefl/u+IUOGlPq+YLedkpJCv3796NOnDw888EC5NRf/LEW8ptytXsrdst+n3I1NYW9sjTGHABOBlkA+kG6tHVNsHQOMAc4GcoFB1tpvwl1rJOjevTtjx44teD5t2jQWLlzIa6+9ts+61157Lf379y9xOzk5OTRs2JD4+PhqrW/p0qV0796dHTt20LBhQ9566y2OPvpoABo1akT37t156KGHOOqoo2jZsiWTJ0/miy++4PDDDy9xezfffDPHHnss3bt3L7KNRx99lK5du5a6DWMMI0aM4JxzzuGwww4jLS2NGTNm0KZNm2r5Pjdt2kReXt4+Yd2iRQs+/fTTct/XvHnzUt8XzLbHjx/P6tWrefnll4OuufhnKbFLuVsxyl3lLih3o1ZpQ7mhegAHAZ0CXzcCvgfaF1vnbOADwADdgC/L265fD4l99tlnFrCbN2+2O3bssIcddph94oknKrydUB0S27lzp121apX9+uuv7V133WUPPPBAu3Tp0oLXV69ebU855RQL2Jo1a9rjjz/eJicn23bt2u2zrVtvvdUedNBB9ocffiiyfPXq1fbEE08Mahvdu3e3NWvWtO+//36pNaelpdkGDRoUPGrVqmVr165dZNns2bOLvGf9+vUW2Gf5fffdZ4844ohS97X3fR9++GGp7ytv299++61t2rSpXblyZcFr5R0SK+2zLEm4D4m98sorNjEx0RpjbGJion3llVeqdfvFaSqCcreilLvKXeVu1cTUVARr7c/Az4GvtxpjVgLxwIpCq50PTAwUP88Ys78x5qDAe2NK586dqVOnDvPnz2fhwoXUqlVrn8Mre3lxSKxOnToFf8F36dKFr7/+mieeeILnn38egMMOO4xZs2axbds2tmzZwkEHHcTFF1/MoYceWmQ7t956K6+++iozZ86kdevWRV477LDD+OCDD6hRo0aZ25gxYwaLFy/GWlvmYbDiIyxDhw4lPj6em266qWBZ8RGWpk2bUrNmTX755Zciyzdu3Fjmvva+79dffy31feVt+4svvmDTpk0cddRRBa/l5eUxe/Zsxo0bx7Zt24ocMizrs/RaRkYGKSkp5ObmApCVlUVKSgoAycnJXpbma8rdilHu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9XSOrTEmCTgO+LLYS/HAukLPfwosi7mArVu3LscddxzvvPMOL730EpMmTaJ27dolrhvOQ2J16tShc+fOfPLJJ/zjH/8oWP7JJ59w0UUXFTw/8cQT+e6774q89/vvvycxMbHg+c0338yrr75KZmYmRx55ZKXqWbx4MRdeeCFPPvkk7733HnfffTcfffRRiesecMABHHDAAQXPGzVqxAEHHFDuYaNgv+eS3jNz5kyuuOKKoN4DsGPHDr799lt69+5dsCw3N5eaxSYc1qxZk/z8fAAuuOACunTpUuT1K6+8kjZt2nDPPfdQp06dMr+/cEhNTS0I171yc3NJTU31ZcBGIuVu+SI1d0tSPCsqklMNGjSgQYMG/PHHH3z00Uc88sgjRV6/8847efPNN0vN5kjN3arIz89n586dQMUztbzP0yuxlrueNbbGmIbAG8At1totxV8u4S22hG2kACng5ttkZmaWuK/99tuPrVu3VqnevLy8Km+jsjp37szTTz9N79696dmzZ6l11K5du9yRwz179uzz/pycHNasWQO4H+pVq1bx2Wef0aRJEw455BAAnn32WdLT01mwYEHB+6677jpSUlLo2LEj3bp14/nnn2fDhg1cdtllBftISUnh9NNPZ9iwYVx44YUsWbKE//znPwwbNoytW7fyf//3f0yZMqXgF8fq1asBFxANGzYsqG/16tXUqFGjxPqys7Pp27cvQ4YM4R//+AcdOnSge/fuvP/++0GNkuzevZudO3cG9f83mO+5+Ge19z2dO3cu9T2pqan07duXVq1a8dtvv/HII4+wbds2LrroooJ1zjrrLB5++GFatGhBu3btWLJkCY899hgDBgxg69at1KxZs8gfDAD16tWjYcOGJCYmkpOTU+r3tWPHjlJ/fnJyckp9raJKuzxPdnZ2te2juOqsP9opd4MXqbkbTFaUl1Offvop+fn5tG3bljVr1nDvvfdy+OGH069fv4JtlJfNkZS7JX1O5f3eABg+fDhnnnkm8fHx5OTkMHXqVDIzM5k6dWqFMjWYz7Mkyt0QKW2OQigfQG3gI+D/Snn9WWBAoeffAQeVtU2/zvWy1toJEybYmjVr2mXLllV6G2XVP3PmTIv7BVbkUfgSVcOHD7fun0tRTz/9tE1MTLR16tSxnTp1srNmzdpnnXfffdd27NjR1q1b17Zp08aOGTPG5ufnW2ttifsFilwGpqz6Nm/ebI888kibkpJSZJ/9+/e33bp1C+qzqchlZ4L5nkv6rB577LEy33PxxRfbgw46yNauXdsefPDB9sILL9znskJbtmyxN998s01ISLD16tWzhx56qL377rvt9u3bS6010ubYJiYmlvj/MjExsdr2UZzm2Cp3KyNSczeYrLC27JyaMmWKbd26ta1Tp45t2bKlHTJkiP3zzz+LvL+sbI603C3pcwrm8x04cKBNSEiwderUsc2aNbOnnnrqPudDFFdSpgbzeZZEuVt5ZeWuF+FqcGfnji5jnXMoehLDV+Vt188Be/rpp9vrr7++Stvwsv7qoPpDK1wB+8orr9i4uLgi4RoXFxfSExnU2Cp3K0O5q/pDTblbeWXlrhdTEU4ELgeWGmMWBZbdAyQAWGvHAe/jztBdjbvszJXhL9Nb+fn5/Pbbb0yYMIGlS5cyZcoUr0sSqbK987lSU1PJzs4mISGBtLQ0X87zijDK3SAod8WPYi13vbgqwlxKnstVeB0LlHwKaoyYPXs2ffr04YgjjuCNN96o8A0LRCJVcnKybwM1Uil3g6PcFb+KpdyN2TuPRbpevXoVnO0uIiKhp9wViX41vC5ARERERKQ6qLEVEREREV9QYysiIiIivqDGVkRERER8QY2tiIiIiPiCGlsRERER8QU1tiIiIiLiC2psRURERMQX1NhKUF5//XWMKfPGRSIiUo2UuyIVp8ZWQiYpKYlRo0Z5XYaISMxQ7kqsU2NbARkZGSQlJVGjRg2SkpLIyMgI6/537doV1v2JiHhNuSsiFaHGNkivvfYaKSkpZGVlYa0lKyuLlJSUkIZsr169uO6667j99ttp1qwZJ554IgCPP/44HTt2pEGDBsTHxzN48GD+/PPPgve1bNmSKVOmFDw/8cQTOfjgg9mzZw8Aq1atwhjD+vXrS933xIkTSUxMJC4ujnPPPZdff/21yOs//PAD559/Pi1btqRBgwZ06tSJd999t0jtWVlZ3HHHHRhjCg6nbd68mQEDBtCqVSvq169Phw4dePHFF6v8WYmI/yh3lbsiFaXGNkj3338/ubm5RZbl5uaSmpoa0v2+8sorWGuZM2cOEydOBKBGjRqMHj2a5cuXM2nSJL766ituvPHGgvf07NmTmTNnFtQ4f/586tSpw/z58wHIzMzk8MMPJz4+vsR9fvnllwwaNIiUlBQWLVrEeeedx7Bhw4qsk5OTQ9++ffnkk09YvHgxF110ERdeeCHffvstAG+++SatWrVi2LBh/Pzzz/z8888A7NixoyCMly9fzs0338w111zD9OnTq/eDE5Gop9xV7opUmLXWF4/OnTvb0qxYsaLU14JljLHAPg9jTJW3XZqePXvao48+utz1PvjgA1unTh2bl5dnrbV27Nixtm3bttZaaz/++GN75JFH2gEDBtgRI0ZYa6299NJL7eDBg0vd3oABA+xpp51WZNlVV11l3T+X0p1wwgn2wQcfLHiemJhoH3300XLrv/jii+1VV11V5jpbtmwpdzuRLNLrL+tnZObMmeErJARCXT8w30ZABnrxUO4qdyNZpNev3K28snJXI7ZBatWqVYnLExISQrrfzp0777NsxowZnH766bRq1YpGjRpx4YUXsmvXLn755RfAHY76/vvv2bBhA5mZmfTu3ZuTTz6ZzMxMAGbNmkWvXr1K3efKlSvp3r17kWXFn2/bto0777yT9u3b06RJExo2bMj8+fPJzs4u8/vJy8sjLS2Njh07cuCBB9KwYUPefPPNct8nIrFHuavcFakoNbZBGj58OHFxcUWWxcXFkZaWFtL9NmjQoMjzrKwszjnnHNq1a8fUqVNZsGABL7zwAvC/kxzatWtHixYtyMzMLBKwn332GStWrGD9+vVlBqz7Y6hst99+O1OnTuXBBx9k1qxZLFq0iK5du5Z7osWoUaN47LHHuOOOO5g+fTqLFi3iggsu0AkaIrIP5W5Ryl2R8tXyuoBo0b9/f+rVq0dqairZ2dkkJCSQlpZGcnJyWOuYP38+u3bt4oknnqBmzZoARU4e2Ktnz5689957zJ8/n549e1K/fn2aNm3KI488UuY8L4D27dszb968IsuKP587dy5XXHEFF110EeDmcP3www+0bdu2YJ06deqQl5e3z/vOO+88Lr/8csCF+ffff8/+++8f/IcgIjFBuavcFakojdhWQHJyMmvXriU/P5+1a9eGPVwB2rRpQ35+PqNHj+bHH39k8uTJjB49ep/1evXqxZQpU2jTpg3NmzcHXOi+8sorZY4aANx00018+umnPPzww6xatYrx48fz1ltvFVmnbdu2vPXWW3zzzTcsXbqUyy67jB07dhRZJykpiTlz5rB+/Xo2bdpU8L7p06czd+5cvv32W2644QZ+/PHHyn8gIuJryt3/Ue6KlE+NbZTp2LEjY8aM4fHHH6d9+/Y899xzJV6Mu3fv3uTl5RUJ05KWlaRbt248//zzPPPMM3Ts2JE333yT++67r8g6jz/+OM2bN+fkk0+mb9++dOvWjZNPPrnIOg888ADr1q3jsMMOo1mzZgD861//omvXrvTt25dTTjmFBg0aePKLSkQkWMpdkehhgpnXEw26dOli915WpbiVK1fSrl27Km1/69atNGrUqErb8JLq91ak11/Wz0hmZma5v5QjWajrN8YssNZ2CdkOIphyt2yq31uRXr9yt/LKyl2N2IqIiIiIL6ixFRERERFfUGMrIiIiIr6gxlZEREREfCFmGlu/nCQnUt30syGhon9bIiXTz0boxERjW7t2bbZv3+51GSIRafv27dSuXdvrMsRnlLsipVPuhk5MNLbNmzdn/fr15Obm6q8kkQBrLbm5uaxfv77gYvIi1UW5K7Iv5W7oxcQtdRs3bgzAhg0b2L17d6W2sWPHDurVq1edZYWV6vdWpNZfu3ZtWrRoUfAzIlJdlLuq32uRWr9yN7RiorEFF7JV+UeUmZnJcccdV40VhZfq91a01y9SGcpd1e+laK9fKicmpiKIiIiIiP+psRURERERX1BjKyIiIiK+oMZWRERERHxBja2IiIiI+IIaWxERERGpNl5eulqNrYiIiIhUizffhDvu6MjOnd7sX42tiIiIiFTJjh1w441w0UWwbVst/vzTmzpi5gYNIiIiIlL9Vq+G/v1h4UK47TY488yFtGjR05NaNGIrIiIiIpUyZQp06gRr18Lbb8OoUVC7tneTbNXYioiIiEiFbN8O114Ll1wCRx8NixbBeed5XZUaWxERERGpgO++g27d4Nln4c47ITMTEhK8rsrRHFsRERERCcorr7iR2nr14L334Oyzva6oKI3YioiIiEiZcnPhqqvg8svhuOPc1INIa2pBja2IiIiIlGHFCujaFV58Ee65B2bOhFatvK6qZJqKICIiIiIleukluP56aNAAPvoITj/d64rKphFbERERESli2zYYOBAGDXKjtYsXR35TC2psRURERKSQpUuhSxd4+WUYPhw+/RQOOsjrqoKjqQgiIiIigrXw/PPu1rj77QeffAKnnup1VRWjEVsRERGRGLd1K1x2GVx9NZx0kpt6EG1NLXjQ2BpjXjDGbDTGLCvl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ksvLL0Pv3u7qLt9990fY6ygtd0vPYxF/0YithEx8fEKJyxMTE9TUiohvLF0Kxx/vThS77z745BM46CBvaklIKDl3S1su4jdqbKXa5eTAQw/Bpk1pQFyR1+Li4khLS/OmMBGRamQtjB8PXbvCn3/C9OkwfDjUrOldTWlpacTFKXcldqmxlWqzYweMGeNuqnDvvXDmmcn8+9/pJCYmYowhMTGR9PR0ncAgIlFv61a47DJISYGTT3ZXPejd2+uq3Ali6enKXYldmmMrVbZnD7z0Etx/P6xb58J9xAjo1g0gmaFDFagi4h+LFrnLEv7wgzs6dffdkXWJwuTkZDWyErMi6EdRok1+Prz2GnToAIMHuzlln37qbrjgmloREf+wFp55xuXbtm0wcyakpkZWUysS6/TjKBVmLXzwgbukzcUXu1tDvvkmzJvnbrYgIuI3f/3l8u76691RqUWL4JRTvK5KRIpTYysVMmeOC/Ozz3YnS0ycCIsXw9//DsZ4XZ2ISPWbP9/dPezNN2HkSHjvPWjWzOuqRKQkamwlKAsXumb2lFPcvLKxY+Hbb+Hyy709A1hEJFSshSefhB49YPdumD0b7rxTUw9EIpl+PKVM333nDr916uSmGowcCatXu1vg1qnjdXUiIqHxxx9w0UVw001w5pnuj/sePbyuSkTKo6siSImys90tbydMcLe7vfdeuO022G8/rysTEQmtr75yf9D/9BM89pi77bemWolEBzW2UsTGje5SXc88457feKO7lE3z5t7WJSISatbCE0/A0KFw8MEwdy6ccILXVYlIRWgqQgTJyMggKSmJGjVqkJSUREZGRtj2/ddfblS2dWs3p+zyy2HVKhfyampFxK8K526DBkncdlsG557rrnqgplYk+qixjRAZGRmkpKSQlZWFtZasrCxSUlJC0twWDvKEhCQuuSSDQw91Fxo/+2xYsQKeew50a3ER8bPiubt9exa1a6fQr18GTZpU/768GrgQiSVqbCNEamoqubm5RZbl5uaSmpparfspHuTr1mUxZUoKhxySwTffuBsuHHFEte5SRCQi3XPPvrm7e3foczeUAxcisU6NbYTIzs6u0PLKKinIIZe//krluOOqdVciIhFr06bw5W64Bi5ERI1txEgo5bh/acsrylqYNi18QS4iEqnmzIFjjwUIbe7updwVCR81thEiLS2NuLi4Isvi4uJIS0ur8ranT4frr+/E3/8OtWqFJ8hFRCJNfr676kvv3hAXF9rcLSzUAxci8j9qbCNEcnIy6enpJCYmYowhMTGR9PR0kpOTK73NL7+EU0+F006D33+vw/PPwwsvhCfIRUQiycaNcNZZkJoK//iHu03uPfdUf+6WJFwNtIjoOrYRJTk5uVoCddky+Ne/4L//dfczHz0a2rX7ijPOOAVIpkYNN+crOzubhIQE0tLSqj3IRUQiRWYmXHqpu5vYs8/C1Vf/74YL1ZW7Zdm7feWuSOipsfWRH36A4cNh0iRo1AgefBBuvtl9nZmZX7BeOIJcRMRreXnuMoYPPABt2sCHH0LHjt7UotwVCQ81tj6wYYNrYp97DmrXhjvucHfOOeAArysTEfHGL79AcjLMmOFuODN2LDRs6HVVIhJqamyj2ObNMHKku1PYnj3u8Nq998JBB3ldmYiIdz791DW1W7fC88/DlVf+b+qBiPibGtsotHWrmzc7apT7OjkZ7r/f3Q5XRCRW7dnjph089BC0a+dGazt08LoqEQknNbZRZMcOGDfOXa7mt9/gggtcgCu4RSTWrV/vThCbPduN0D75JDRo4HVVIhJuutxXFNizxx1Oa9sWbr0VjjkG5s2Dt95SUysi8uGH7oYL8+fDxInwwgtqakVilRrbCJafD6+95prXwYPh4IPd3LFPPoETTvC6OhERb+3ZA3ffDX37unMLFixwJ4qJSOxSYxuBrIX334fOneHii92VDqZNgy++cDdcEBGJdevWQa9e8O9/uxNnv/wSjjzS66pExGtqbCPMnDlwyilwzjmwZQu8/DIsXgznn6+zekVEAN57z009WLwYJk+G9HSoX9/rqkQkEqixjRDffOMOp51yirvRwjPPwMqVcNllULOm19WJiHhv9253ne5zz4WEBJebl1zidVUiEknU2Hrs22+hf3837eCrr+CRR2D1arj2WqhTx+vqREQiQ1aW+8N/1Ci4/no3NatNG6+rEpFIo8t9eSQ72117dsIEdwjt3nvhtttgv/28rkxEJLL8978waJC7Re6UKW4wQESkJGpsw2zjRncd2meecXNmb7rJndXbvLnXlYmIRJbduw233upuSNO5s2tqDzvM66pEJJKpsQ2TP/90h9BGj3Y3Whg0CIYPh0MO8bgwEZEItGYN3HjjcXz3Hdx4Izz6KNSt63VVIhLp1NiGWG6uuwPOyJHwxx/u8l333w9HHOF1Zf/f3v3HWl3XcRx/vhPN7nChYcZUuJW0tKYbkr9Shzgn0B+o44+MpaPanVtaZlNcbKZzt+n8Q+ZS7I4x53aN5UxHDbK0oTUlw00BKw11EJqa5SrEIvDdH+dYlzvgniuc8znf73k+trOd8z2f3fviXL6vvc933/M9ktS9rrkGtm3r44EH4JJLSqeRVBUOtm2ycycsXw433wyvvQbz5sHgYOMSNZKk/Vu2DNauXc8ll5xROoqkCnGwPch274bhYbjxRnj5ZTjnHLj/fjj77NLJJKk6pkyBKVP+VTqGpIrxcl8HSSY8+CCcfDJcfjlMmgRr1sBjjznUSpIkdYKD7UHwyCNw+umN88B2724coV2/HubM8dvCJEmSOsXB9gCsWwfnnw8XXACvvw4rVsCmTbBgAXzAV1aSJKmjHL/eh40b4aKL4MwzG/eXLoUXXoBFi2CCZy1LkiQV4Rg2Di++2Lj27H33wRFHNK54cPXVMHFi6WSSJElysG3BK6/A7bdPZ/VqOPRQuPZaWLwYjjqqdDJJkiS9x1MRxjA8PMz06f2sWnU8hx/ez223DXPrrQ61ktQuw8PD9Pf3M3v2bPr7+xkeHi4dSVJFeMR2P4aHhxkYGOCdd3YAsH37Fq67boBJk2DhwoVlw0lSDb3Xuzt2NHp3y5YtDAwMAPaupLF5xHY/lixZ8r9yfc+OHTtYsmRJoUSSVG/2rqQD4WC7H1u3bh3XdknSgbF3JR2IIoNtRMyJiOcjYnNEXL+X5yMi7mg+vyEiZpTIOXXq1HFtl6RuZe9K6gUdH2wj4hDgTmAucBJwaUScNGrZXGB68zYALOtoyKbBwUH6+vr22NbX18fg4GCJOJL0vti7knpFiSO2pwGbM/OlzNwJrATmj1ozH7g3G9YBkyJiSqeDLly4kKGhIaZNm0ZEMG3aNIaGhvwAg6SqsXcl9YTIzM7+wogFwJzM/Frz8ZeB0zPzyhFrfgrckpm/bj5+FFicmetH/awBGkcWOOaYY05duXJl23Jv376diRX+Jgbzl1Xl/FXODu3Pf9555z2dmTPb9gsOAnu3DPOXVeX8Vc4OZXu3xOW+Yi/bRk/XrawhM4eAIYCZM2fmrFmzDjjcvqxdu5Z2/vx2M39ZVc5f5exQ/fwHib1bgPnLqnL+KmeHsvlLnIqwDTh+xOPjgFffxxpJUmvsXUk9ocRg+1tgekR8PCIOA74IrBq1ZhVwWfNTumcAf8/MP3c6qCTVhL0rqSd0/FSEzNwVEVcCDwOHACsy87mIuKL5/N3AamAesBnYASzqdE5Jqgt7V1KvKPKVupm5mkaJjtx294j7CXy907kkqa7sXUm9wG8ekyRJUi042EqSJKkWHGwlSZJUCw62kiRJqgUHW0mSJNWCg60kSZJqwcFWkiRJteBgK0mSpFpwsJUkSVItONhKkiSpFhxsJUmSVAsOtpIkSaoFB1tJkiTVQmRm6QwHRUT8BdjSxl8xGXizjT+/3cxfVpXzVzk7tD//tMw8uo0/v2vZu2Myf1lVzl/l7FCwd2sz2LZbRKzPzJmlc7xf5i+ryvmrnB2qn7+XVf1vZ/6yqpy/ytmhbH5PRZAkSVItONhKkiSpFhxsWzdUOsABMn9ZVc5f5exQ/fy9rOp/O/OXVeX8Vc4OBfN7jq0kSZJqwSO2kiRJqgUH21EiYk5EPB8RmyPi+r08HxFxR/P5DRExo0TOfWkh/8Jm7g0R8UREnFIi596MlX3Eus9FxO6IWNDJfGNpJX9EzIqIZyLiuYh4rNMZ96eF/zsfjoifRMSzzfyLSuTcm4hYERFvRMSmfTzf1fttr7N3y7F3y7J32yAzvTVvwCHAi8AngMOAZ4GTRq2ZB6wBAjgD+E3p3OPMfxZwZPP+3G7J30r2Eet+CawGFpTOPc7XfhLwO2Bq8/FHS+ceZ/7vALc27x8N/A04rHT2Zp5zgRnApn0837X7ba/f7N3uzj5inb1bJr+9O86bR2z3dBqwOTNfysydwEpg/qg184F7s2EdMCkipnQ66D6MmT8zn8jMt5oP1wHHdTjjvrTy2gNcBTwAvNHJcC1oJf+XgB9n5laAzOymf0Mr+RM4IiICmEijYHd1NubeZebjNPLsSzfvt73O3i3H3i3L3m0DB9s9HQv8acTjbc1t411TynizfZXGu6luMGb2iDgWuBi4u4O5WtXKa/8p4MiIWBsRT0fEZR1LN7ZW8n8fOBF4FdgIfDMz3+1MvAPWzfttr7N3y7F3y7J322BCu39BxcReto2+bEQra0ppOVtEnEejYM9ua6LWtZJ9KbA4M3c33rx2lVbyTwBOBc4HPgQ8GRHrMvOFdodrQSv5LwSeAWYDnwR+ERG/ysx/tDnbwdDN+22vs3fLsXfLsnfbwMF2T9uA40c8Po7Gu6TxrimlpWwRcTKwHJibmX/tULaxtJJ9JrCyWa6TgXkRsSszH+pIwv1r9f/Om5n5NvB2RDwOnAJ0Q8G2kn8RcEs2Tp7aHBEvA58GnupMxAPSzfttr7N3y7F3y7J326HTJxt3843GoP8S8HH+fyL3Z0at+QJ7ngz9VOnc48w/FdgMnFU673izj1p/D931IYZWXvsTgUeba/uATcBnS2cfR/5lwI3N+8cArwCTS2cfka+ffX+IoWv3216/2bvdnX3Uenu38/nt3XHePGI7QmbuiogrgYdpfFpxRWY+FxFXNJ+/m8anQufRKKkdNN5NdYUW898AfAS4q/kOfFdmziyV+T0tZu9areTPzN9HxM+ADcC7wPLM3OtlUjqtxdf/ZuCeiNhIo6gWZ+abxUKPEBE/BGYBkyNiG/Bd4FDo/v2219m75di7Zdm7bcrVnKolSZKkSvOqCJIkSaoFB1tJkiTVgoOtJEmSasHBVpIkSbXgYCtJkqRacLCVJElSLTjYSpIkqRYcbCVJklQLDrbqSRFxQkT8JyJuGrV9WUT8MyKKfyuQJNWJvatOcLBVT8rMzcBy4FsRMRkgIm4AvgJcnJnrS+aTpLqxd9UJfqWuelZEfAx4EbgL+AMwBFyamT8qGkySasreVbtNKB1AKiUzX4uIpcC3aewL37BcJal97F21m6ciqNf9Efgg8GRm3lk6jCT1AHtXbeNgq54VEbOBHwBPAp+PiFMKR5KkWrN31W4OtupJETEDeIjGBxlmAVuB7xWMJEm1Zu+qExxs1XMi4gRgDfBz4KrM3AncBMyLiHOLhpOkGrJ31SleFUE9pfmJ3CdoHCm4MDP/3dx+CLAJeCszzyoYUZJqxd5VJznYSpIkqRY8FUGSJEm14GArSZKkWnCwlSRJUi042EqSJKkWHGwlSZJUCw62kiRJqgUHW0mSJNWCg60kSZJqwcFWkiRJtfBfPlJzMXwDNyAAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "#perturb one of the entries\n", "\n", "yi[8] = 2.\n", "\n", "degree = 1\n", "poly_coeffs = np.polyfit(xi, yi, degree)\n", "p1 = np.poly1d(poly_coeffs)\n", "\n", "# set up figure\n", "fig = plt.figure(figsize=(10, 10))\n", "ax = fig.add_subplot(221)\n", "ax.margins(0.1)\n", "x = np.linspace(0., 1, 100)\n", "ax.plot(x, p1(x), 'b', label=r'$y = {0:.4f}x+{1:.4f}$'.format(poly_coeffs[0], poly_coeffs[1]))\n", "plot_raw_data(xi, yi, ax)\n", "ax.legend(loc='best', fontsize=14)\n", "ax.set_title('polyfit linear best fit line', fontsize=12)\n", " \n", "x0 = poly_coeffs\n", "output = minimize(cost_fun, x0, args=(xi,yi,'two'))\n", "# use poly1d to turn the coeffs into a function, p1, we can evaluate\n", "p1 = np.poly1d(output.x)\n", "ax = fig.add_subplot(222)\n", "ax.margins(0.1)\n", "x = np.linspace(0., 1, 100)\n", "ax.plot(x, p1(x), 'b', label=r'$y = {0:.4f}x+{1:.4f}$'.format(output.x[0], output.x[1]))\n", "plot_raw_data(xi, yi, ax)\n", "ax.legend(loc='best', fontsize=14)\n", "ax.set_title('Best fit (two-norm)', fontsize=12)\n", "\n", "x0 = poly_coeffs\n", "output = minimize(cost_fun, x0, args=(xi,yi,'one'))\n", "# use poly1d to turn the coeffs into a function, p1, we can evaluate\n", "p1 = np.poly1d(output.x)\n", "ax = fig.add_subplot(223)\n", "ax.margins(0.1)\n", "x = np.linspace(0., 1, 100)\n", "ax.plot(x, p1(x), 'b', label=r'$y = {0:.4f}x+{1:.4f}$'.format(output.x[0], output.x[1]))\n", "plot_raw_data(xi, yi, ax)\n", "ax.legend(loc='best', fontsize=14)\n", "ax.set_title('Best fit (one-norm)', fontsize=12)\n", "\n", "x0 = poly_coeffs\n", "output = minimize(cost_fun, x0, args=(xi,yi,'max'))\n", "# use poly1d to turn the coeffs into a function, p1, we can evaluate\n", "p1 = np.poly1d(output.x)\n", "ax = fig.add_subplot(224)\n", "ax.margins(0.1)\n", "x = np.linspace(0., 1, 100)\n", "ax.plot(x, p1(x), 'b', label=r'$y = {0:.4f}x+{1:.4f}$'.format(output.x[0], output.x[1]))\n", "plot_raw_data(xi, yi, ax)\n", "ax.legend(loc='best', fontsize=14)\n", "ax.set_title('Best fit (max-norm)', fontsize=12)\n", "\n", "\n", "plt.tight_layout(pad = 2.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you compare the resulting slopes of the best fit lines, between this case with the outlier with the previous slopes without the outlier, you should see that the one-norm is by far the least impacted while the max-norm is the most impacted.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Homework - Tomography example - rank and null space\n", "\n", "In the lecture we introduced the following problem as an example of a ***mixed-determined*** problem motivated by stright ray tomography.\n", "\n", "$$\n", "\\begin{pmatrix}\n", "1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\\\\n", "0 & 0 & 0 & 1 & 1 & 1 & 0 & 0 & 0 \\\\\n", "\\vdots & \\vdots & \\vdots & \\vdots & \\vdots & \\vdots & \\vdots & \\vdots & \\vdots \\\\\n", "0 & 0 & 1 & 0 & 0 & 1 & 0 & 0 & 1\n", "\\end{pmatrix}\n", "\\begin{pmatrix}\n", "x_1\\\\\n", "x_2\\\\\n", "\\vdots \\\\\n", "x_9\n", "\\end{pmatrix}\n", "=\n", "\\begin{pmatrix}\n", "T_1\\\\\n", "T_2\\\\\n", "\\vdots \\\\\n", "T_6\n", "\\end{pmatrix}\n", "$$\n", "\n", "\n", "\n", "We saw a $4\\times 4$ version of this problem in an earlier lecture.\n", "\n", "To arrive at this simplified version of the problem, we will assume a body containing nine uniform blocks of \n", "unit size, arranged in a $3 \\times 3$ grid, with values labelled 1 to 9 starting top left, and we will only consider ray paths that are perpendicular to the block boundaries so that refraction can be ignored and all the ray paths are straight. Imagine the slightly smaller version of this problem:\n", "\n", "\n", "\n", "\n", "Now, let the slowness of each block be $x_j$, let's simplify by assuming that the size $h=1$, and the total travel time across the model be $T_i$, then the following equations relate the travel times to the slownesses \n", "\n", "$$\\begin{align*}\n", "T_1 &= x_1 + x_2 + x_3\\\\\n", "T_2 &= x_4 + x_5 + x_6\\\\\n", "& \\vdots \\\\\n", "T_6 &= x_3 + x_6 + x_9\n", "\\end{align*}\n", "$$\n", "\n", "Given the six measurements, the inverse problem is to determine information \n", "about the nine slownesses $x_1, \\ldots x_9$.\n", "\n", "The equation of condition for this system is \n", "\n", "\n", "$$\n", "\\begin{pmatrix}\n", "1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\\\\n", "0 & 0 & 0 & 1 & 1 & 1 & 0 & 0 & 0 \\\\\n", "\\vdots & \\vdots & \\vdots & \\vdots & \\vdots & \\vdots & \\vdots & \\vdots & \\vdots \\\\\n", "0 & 0 & 1 & 0 & 0 & 1 & 0 & 0 & 1\n", "\\end{pmatrix}\n", "\\begin{pmatrix}\n", "x_1\\\\\n", "x_2\\\\\n", "\\vdots \\\\\n", "x_9\n", "\\end{pmatrix}\n", "=\n", "\\begin{pmatrix}\n", "T_1\\\\\n", "T_2\\\\\n", "\\vdots \\\\\n", "T_6\n", "\\end{pmatrix}\n", "$$\n", "\n", "
\n", "\n", "We can see here why the matrix $G$ is sometimes called the *sensitivity matrix*. \n", "\n", "The element in the $i$-th row and $j$-th column gives the sensitivity $\\partial T_i/\\partial x_j$ of the $i$-th measurement to a change in the $j$-th model variable. \n", "\n", "So, for example, the sixth measurement is only sensitive to $x_3$, $x_6$ and $x_9$, and it is equally sensitive to each of these variables. \n", "\n", "Note that when $\\partial T_i/\\partial x_j=0$ a change in the slowness $x_j$ will not affect the value of the travel time $T_i$, thus we can find no information about the value of $x_j$ from the measured value of $T_i$.\n", "\n", "
\n", "\n", "Let's suppose that there are no errors in the observations, and suppose further than the travel time for all six observations, i.e. along every row and every column, is equal to 6 units ($T_i=6\\; \\forall i$). \n", "\n", "Then clearly a homogeneous \"model\" (or solution vector), for which the slowness is each of the nine blocks is 2 will satisfy the data exactly. We can write this as \n", "\n", "$$\n", "\\begin{pmatrix}\n", "2 & 2 & 2 \\\\\n", "2 & 2 & 2 \\\\\n", "2 & 2 & 2\n", "\\end{pmatrix}\n", "$$\n", "\n", "\n", "However, note that the following solutions also satisfy the data exactly \n", "\n", "$$\n", "\\begin{pmatrix}\n", "1 & 2 & 3 \\\\\n", "2 & 2 & 2 \\\\\n", "3 & 2 & 1 \n", "\\end{pmatrix},\\quad\n", "\\begin{pmatrix}\n", "-2 & 0 & 8 \\\\\n", "-2 & 6 & 2 \\\\\n", "10 & 0 & -4 \n", "\\end{pmatrix},\\quad\n", "\\begin{pmatrix}\n", "1 & 2 & 3 \\\\\n", "2 & 2 & 2 \\\\\n", "3 & 2 & 1 \n", "\\end{pmatrix},\n", "$$\n", "\n", "we've reordered the 9 solution values which we write as a column vector when specifying our linear system into $3\\times 3$ matrices here so you can more easily map them onto the 2D physical solution domain.\n", "\n", "The following are also solutions\n", "$$\n", "\\begin{pmatrix}\n", "2+\\alpha & 2-\\alpha & 2 \\\\\n", "2-\\alpha & 2+\\alpha & 2 \\\\\n", "2 & 2 & 2 \n", "\\end{pmatrix}, \\quad\n", "\\begin{pmatrix}\n", "2 & 2 & 2 \\\\\n", "2 & 2+\\beta & 2-\\beta \\\\\n", "2 & 2-\\beta & 2+\\beta\n", "\\end{pmatrix},\\quad\n", "$$\n", "where $\\alpha$ and $\\beta$ are arbitrary constants.\n", "\n", "\n", "In this problem therefore, there are infinitely many model parameters that satisfy the data. \n", "\n", "Some of these may not satisfy other constraints on the model parameters - for example, the slowness cannot be negative. \n", "\n", "But even with external constraints, in a problem such as this there will still be infinitely many models that satisfy the data exactly. \n", "\n", "
\n", "\n", "**Questions**\n", "\n", "Use `numpy` to compute the rank of this matrix. What dimension do we expect the null space to be?\n", "\n", "Starting from the last two of these example solutions, can you figure out an appropriate number of linearly independent vectors that span the the null space of $G$?\n", "\n", "Can you find a basis for the null space?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solution\n", "\n", "Recall that the null space of the sensitivity matrix $G$ is defined as the set of all column vectors $\\boldsymbol{v}$ such that $G\\boldsymbol{v}= \\boldsymbol{0}$. \n", "\n", "Let's start by writing our matrix $G$ as a numpy array and compute its rank." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([[1, 1, 1, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 1, 1, 1, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 1, 1, 1],\n", " [1, 0, 0, 1, 0, 0, 1, 0, 0],\n", " [0, 1, 0, 0, 1, 0, 0, 1, 0],\n", " [0, 0, 1, 0, 0, 1, 0, 0, 1]])\n", "5\n" ] } ], "source": [ "# use numpy to work out the rank of G\n", "G = np.array([\n", " [1,1,1,0,0,0,0,0,0],\n", " [0,0,0,1,1,1,0,0,0],\n", " [0,0,0,0,0,0,1,1,1],\n", " [1,0,0,1,0,0,1,0,0],\n", " [0,1,0,0,1,0,0,1,0],\n", " [0,0,1,0,0,1,0,0,1]])\n", "\n", "pprint(G)\n", "\n", "print(np.linalg.matrix_rank(G))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By the rank-nullity theorem if the rank of $A$ is 5 we expect the dimention of the null space to be 4 (as $n=9$).\n", "\n", "Based on the two possible familes of solution given above (after rearrangement into $3\\times 3$) being\n", "\n", "$$\n", "\\begin{pmatrix}\n", "2+\\alpha & 2-\\alpha & 2 \\\\\n", "2-\\alpha & 2+\\alpha & 2 \\\\\n", "2 & 2 & 2 \n", "\\end{pmatrix}, \\quad\n", "\\begin{pmatrix}\n", "2 & 2 & 2 \\\\\n", "2 & 2+\\beta & 2-\\beta \\\\\n", "2 & 2-\\beta & 2+\\beta\n", "\\end{pmatrix},\\quad\n", "$$\n", "\n", "you can hopefully see that we can spot that two possible vectors in the null space are\n", "\n", "$$\\boldsymbol{n}_1 = (1, \\; -1,\\; 0, \\;-1, \\;1, \\;0, \\;0, \\;0, \\;0)^T$$ \n", "\n", "$$\\boldsymbol{n}_1 = (0, \\;0, \\;0,\\; 0,\\; 1,\\; -1,\\; 0,\\; -1,\\; 1)^T$$ \n", "\n", "which we can check by multiplying by $G$:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([0, 0, 0, 0, 0, 0])\n", "array([0, 0, 0, 0, 0, 0])\n" ] } ], "source": [ "n_1 = np.array([1, -1, 0, -1, 1, 0, 0, 0, 0])\n", "pprint(G@n_1)\n", "\n", "n_2 = np.array([0, 0, 0, 0, 1, -1, 0, -1, 1])\n", "pprint(G@n_2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and with a bit of Sudoko like thinking we can come up with another two:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([0, 0, 0, 0, 0, 0])\n", "array([0, 0, 0, 0, 0, 0])\n" ] } ], "source": [ "n_3 = np.array([0, 1, -1, 0, -1, 1, 0, 0, 0])\n", "pprint(G@n_3)\n", "\n", "n_4 = np.array([0, 0, 0, 1, -1, 0, -1, 1, 0])\n", "pprint(G@n_4)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([[ 1, 0, 0, 0],\n", " [-1, 0, 1, 0],\n", " [ 0, 0, -1, 0],\n", " [-1, 0, 0, 1],\n", " [ 1, 1, -1, -1],\n", " [ 0, -1, 1, 0],\n", " [ 0, 0, 0, -1],\n", " [ 0, -1, 0, 1],\n", " [ 0, 1, 0, 0]])\n", "4\n" ] } ], "source": [ "# form a 9x4 matrix from these null vectors\n", "null_vecs = np.vstack((n_1,n_2,n_3,n_4)).T\n", "pprint(null_vecs)\n", "# and check its rank\n", "pprint(np.linalg.matrix_rank(null_vecs))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The rank is 4 and so these 4 vectors are linearly independent, they are all in the null space of $G$, and hence they form a basis for the null space for this problem.\n", "\n", "i.e. given a particular solution such as \n", "\n", "$$\n", "\\begin{pmatrix}\n", "2 & 2 & 2 \\\\\n", "2 & 2 & 2 \\\\\n", "2 & 2 & 2\n", "\\end{pmatrix}\n", "$$\n", "\n", "we can add on any linear combination of the following matrices\n", "\n", "$$\n", "\\begin{pmatrix}\n", "1 & -1 & 0 \\\\\n", "-1 & 1 & 0 \\\\\n", "0 & 0 & 0 \n", "\\end{pmatrix},\\quad\n", "\\begin{pmatrix}\n", "0 & 1 & -1 \\\\\n", "0 & -1 & 1 \\\\\n", "0 & 0 & 0 \n", "\\end{pmatrix},\\quad\n", "\\begin{pmatrix}\n", "0 & 0 & 0 \\\\\n", "0 & 1 & -1 \\\\\n", "0 & -1 & 1 \n", "\\end{pmatrix},\\quad\n", "\\begin{pmatrix}\n", "0 & 0 & 0 \\\\\n", "1 & -1 & 0 \\\\\n", "-1 & 1 & 0 \n", "\\end{pmatrix}\n", "$$ \n", "\n", "and the result will always satisfy our problem.\n", "\n", "\n", "\n", "\n", "That is, any model in the null space of $G$ can be written as a linear combination of these four models. The significance of the null space is that, if $\\boldsymbol{v}$ is any vector in the null space, $\\alpha$ is any scalar, and $\\boldsymbol{m}$ is any model that satisfies $G\\boldsymbol{m} = \\boldsymbol{d}$, then the model parameters $\\boldsymbol{m} + \\alpha \\boldsymbol{v}$ also satisfies the observed data $\\boldsymbol{d}$.\n", "\n", "In other words, we can add any linear combination of vectors from the null space to a model that satisfies the data, and still satisfy the data. \n", "\n", "For all under-determined and mixed-determined problems with a solution (i.e. representing a consistent problem), the matrix $G$ will have a non-trivial null space, that is there will be solutions to $G\\boldsymbol{v}= 0$ for which $\\boldsymbol{v}\\ne \\boldsymbol{0}$. \n", "\n", "Note that the null space is purely a property of $G$, that is it is a property of the physics and the experimental geometry, and it does not depend upon either the data or the \"model\" (here the solution vector).\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Homework - Tomography example - solution via the pseudo-inverse\n", "\n", "In class we introduced the concept of the data potentially containing errors, i.e. if instead of all data values being 6, consider the case with\n", "\n", "$$ \\boldsymbol{T} = (6.07, 6.07, 5.77, 5.93, 5.93, 6.03)^T $$\n", "\n", "We stated tht now, even though there are fewer data than model parameters, there is no model that fits the data exactly. We can see this because it should be the case from $G$ that\n", "\n", "$$ T_1 + T_2 + T_3 = T_4 + T_5 + T_6$$ \n", "\n", "whereas for this data\n", "\n", "$$ T_1 + T_2 + T_3 = 17.91, \\qquad T_4 + T_5 + T_6 = 17.89 $$\n", "\n", "so that, with these data, there can be no solution. \n", "\n", "

\n", "\n", "Use the pseudo inverse computed using `np.linalg.pinv` to find a solution. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solution" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.0\n", "-7.6438855245442e-14\n" ] } ], "source": [ "G = np.array([\n", " [1,1,1,0,0,0,0,0,0],\n", " [0,0,0,1,1,1,0,0,0],\n", " [0,0,0,0,0,0,1,1,1],\n", " [1,0,0,1,0,0,1,0,0],\n", " [0,1,0,0,1,0,0,1,0],\n", " [0,0,1,0,0,1,0,0,1]])\n", "\n", "print(sl.det(G.T@G))\n", "print(sl.det(G@G.T))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These are both zero so we can't use our least squares or minimum norm solutions.\n", "\n", "Let's use the pseudo inverse" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([2.01111111, 2.01111111, 2.04444444, 2.01111111, 2.01111111,\n", " 2.04444444, 1.91111111, 1.91111111, 1.94444444])\n" ] } ], "source": [ "G = np.array([\n", " [1,1,1,0,0,0,0,0,0],\n", " [0,0,0,1,1,1,0,0,0],\n", " [0,0,0,0,0,0,1,1,1],\n", " [1,0,0,1,0,0,1,0,0],\n", " [0,1,0,0,1,0,0,1,0],\n", " [0,0,1,0,0,1,0,0,1]])\n", "d = np.array([6.07,6.07,5.77,5.93,5.93,6.03])\n", "\n", "\n", "m = np.linalg.pinv(G) @ d\n", "\n", "pprint(m)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Some investigation will show that this solution both provides a least-squares fit to the data – \n", "that is, no other solution can provide a better fit.\n", "\n", "It also provides a minimal-norm solution - that is, no other least-squares solution has a smaller norm than this solution. \n", "\n", "Neither of these properties mean of course that the solution is correct, but in many problems it may be the most appropriate solution that we can discover without additional information. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Homework - Damped least squares applied to the tomography example\n", "\n", "Consider again the tomography example from the previous exercise with noisy data.\n", "\n", "Now try solving this problem using the damped least squares approach and show that as $\\mu$ tends to zero we recover the same solution as found in the previous question using the generalised inverse." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solution" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "array([2.01111111, 2.01111111, 2.04444444, 2.01111111, 2.01111111,\n", " 2.04444444, 1.91111111, 1.91111111, 1.94444444])\n", "\n", "mu= 1.0 \n", "\n", "array([1.72142857, 1.72142857, 1.74642857, 1.72142857, 1.72142857,\n", " 1.74642857, 1.64642857, 1.64642857, 1.67142857])\n", "\n", "mu= 0.1 \n", "\n", "array([1.97778953, 1.97778953, 2.01004759, 1.97778953, 1.97778953,\n", " 2.01004759, 1.88101534, 1.88101534, 1.9132734 ])\n", "\n", "mu= 0.010000000000000002 \n", "\n", "array([2.00772798, 2.00772798, 2.04095058, 2.00772798, 2.00772798,\n", " 2.04095058, 1.90806021, 1.90806021, 1.9412828 ])\n", "\n", "mu= 0.0010000000000000002 \n", "\n", "array([2.01077228, 2.01077228, 2.04409451, 2.01077228, 2.01077228,\n", " 2.04409451, 1.9108056 , 1.9108056 , 1.94412783])\n", "\n", "mu= 0.00010000000000000002 \n", "\n", "array([2.01107722, 2.01107722, 2.04440945, 2.01107722, 2.01107722,\n", " 2.04440945, 1.91108056, 1.91108056, 1.94441278])\n", "\n", "mu= 1.0000000000000003e-05 \n", "\n", "array([2.01110772, 2.01110772, 2.04444094, 2.01110772, 2.01110772,\n", " 2.04444094, 1.91110806, 1.91110806, 1.94444128])\n" ] } ], "source": [ "G = np.array([\n", " [1,1,1,0,0,0,0,0,0],\n", " [0,0,0,1,1,1,0,0,0],\n", " [0,0,0,0,0,0,1,1,1],\n", " [1,0,0,1,0,0,1,0,0],\n", " [0,1,0,0,1,0,0,1,0],\n", " [0,0,1,0,0,1,0,0,1]])\n", "d = np.array([6.07,6.07,5.77,5.93,5.93,6.03])\n", "\n", "# use the pinv to compute the solution\n", "m = np.linalg.pinv(G) @ d\n", "\n", "# print the solution obtained using the generalised inverse\n", "pprint(m)\n", "\n", "# now apply our \"least squqres\" analytical approach with \n", "# successively smaller regularisation parameters\n", "for k in range(6):\n", " mu = 0.1**k\n", " m = sl.inv( G.T@G + mu*np.eye(G.shape[1]) ) @ G.T @ d\n", " print('\\nmu=',mu,'\\n')\n", " pprint(m)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We do indeed find that as $\\mu$ gets smaller the solution to the damped least squares problem converges to that obtained using the generalised inverse." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.13" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": true, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": true }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": true, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 1 }