{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Class 4: Regression\n", "\n", "In this class we will explore how to model an outcome variable in terms of input variable(s) using linear regression, principal component analysis and Gaussian processes. After these activities you should be able to:\n", "\n", "- generate a least-squares regression line to a dataset\n", "- handle cases with errors in both co-ordinates\n", "- perform a principal component analysis on a set of variables\n", "- construct Gaussian Process models for interpolation\n", "\n", "**Regression** describes any statistical method which determines a relationship between a **dependent** (outcome) variable $y$ and **independent** (predictor) variable(s) $x$.\n", "\n", "## Least-squares linear regression\n", "\n", "In **linear regression** we suppose the relationship is a straight line. A standard method of determining that line is to **minimize the residuals** between it and the points.\n", "\n", "Specifically, the **least-squares linear regression line** is the linear fit to a dataset $(x_i, y_i)$ that minimizes the sum of the squares of the $y$-residuals.\n", "\n", "**With an intercept**, i.e. fitting the line $y = ax + b$:\n", "\n", "$a = \\frac{\\sum_i x_i y_i - N \\overline{x} \\overline{y}}{(N-1) \\sigma_x^2} = r \\frac{\\sigma_y}{\\sigma_x}$\n", "\n", "$b = \\mu_y - a \\, \\mu_x$\n", "\n", "**Without an intercept**, i.e. fitting the line $y = ax$:\n", "\n", "$a = \\frac{\\sum_i x_i y_i}{\\sum_i x_i^2}$\n", "\n", "As well as the best-fitting line, we also need to quantify the **accuracy of the model**. If we consider the **sum of the squared residuals** $SS_{res} = \\sum_i (y_i - y_{mod,i})^2$ and the **total sum of squares** $SS_{tot} = \\sum_i (y_i - \\overline{y})^2$, we define the **coefficient of determination**\n", "\n", "$R^2 = 1 - \\frac{SS_{res}}{SS_{tot}}$\n", "\n", "$R$ is exactly the same as the correlation coefficient $r$ we met in Class 2.\n", "\n", "Let's determine the linear regression line for the test correlation dataset from Class 2. Here's a code to perform this task:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Linear regression slope = 0.603505170178294\n", "Linear regression intercept = 0.2080488830210434\n" ] }, { "data": { "text/plain": [ "(0.0, 1.0)" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEKCAYAAAAB0GKPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3de5xVdb3/8dcXmMtGLpqMR1IuWmpQmsKQmh21hJ9YKpZoDOV1iCz1kZeTmZmWZnrUtAueg8CQl4TUysIjNYlppmYwgKmMiYiMgCRj4gQ6MAPz+f3xnZHNsGdm7dtaa+95Px+P9XjM3rP2Wt+1YNZnf7+f78WZGSIiIj3pE3UBRESkMChgiIhIIAoYIiISiAKGiIgEooAhIiKBKGCIiEggeQ8Yzrm5zrmNzrkXu/i9c8791Dm3yjn3vHNuTL7LJCIi6QujhnEXMLGb358EHNS+TQf+N4QyiYhImvIeMMzsSeDtbnaZBNxj3rPAns65ofkul4iIpKdf1AUA9gPWJr1e1/7ehs47Ouem42sh7LHHHmM/8pGPhFJAEZFisXTp0rfMrCKTz8YhYARmZrOAWQCVlZVWV1cXcYlERAqLc64h08/GoZfUemBY0uv9298TEZEYiUPAWACc3d5b6iigycx2a44SEZFo5b1Jyjk3HzgeGOKcWwdcC5QAmNlMYCHwWWAV8B5wXr7LJCIi6ct7wDCzqh5+b8CF+S6HiIhkJw5NUiIiUgAUMEREJBAFDBERCUQBQ0REAlHAEBGRQBQwREQkEAUMEREJRAFDREQCUcAQEZFAFDBERCQQBQwREQlEAUNERAJRwBARkUAUMEQkNI2NjSxZsoTGxsaoiyIZUMAQkVDMnz+fESNGMGHCBEaMGMH8+fOjLpKkyfnlKAqP1vQWKRyNjY2MGDGC5ubm999LJBI0NDRQUVERYcl6H+fcUjOrzOSzqmGISN6tWbOG0tLSXd4rKSlhzZo10RRIMqKAISJ5N3LkSFpaWnZ5r7W1lZEjR0ZTIMmIAoaI5F1FRQU1NTUkEgkGDRpEIpGgpqZGzVEFJu9reouIAFRVVTF+/HjWrFnDyJEjFSwKkAKGiISmoqJCgaKAqUlKREQCUcAQEZFAFDBERCQQBQwREQlEAUNERAJRwBARkUAUMEREJBAFDBERCUQBQ0REAlHAEBGRQBQwRCRUWnWvcClgiEhotOpeYVPAEJFQNDY2Ul1dTXNzM01NTTQ3N1NdXV3UNY1iq00pYIhIKHrbqnuxq021tMCvf53VIUIJGM65ic65l51zq5xzV6b4/XDn3OPOueXOueedc58No1wiEp7etOperGpT//gHfPObsP/+MHlyVofKe8BwzvUF7gBOAkYDVc650Z12uxp4wMyOAKYA/5PvconETbE1X3TWm1bdi7w29d57cM89cOyxMGoU/PjH8KlPwSOPZHXYMBZQ+gSwysxWAzjnfglMAuqT9jFgUPvPg4E3QiiXSGzMnz+f6upqSktLaWlpoaamhqqqqqiLlXO9ZdW9yGpTy5fDnDlw333Q1AQf/jDcdBOccw7su2/Wh3dmloNSdnMC5yYDE81sWvvrs4AjzeyipH2GAn8E9gL2AMab2dIUx5oOTAcYPnz42IaGhryWXSSfGhsbWbNmDQMGDGDs2LE0Nze//7tEIkFDQ0PRPlB7g44vASUlJbS2tubvS0BTE8yfD7Nnw7JlUFbmm56+8hVfw3Bul92dc0vNrDKTU8VlidYq4C4z+5Fz7mjgXufcx8ysLXknM5sFzAKorKzMb6QTyaPkGsXWrVvp02fX1uGO5gsFjMKV19qUGTzzjA8SDzwAzc1w2GHws5/Bl74Ee+2Vu3MlCSNgrAeGJb3ev/29ZNXARAAz+6tzrhwYAmwMoXwioUpOiCbXKpIVazK4t8n5GuaNjT43MWeOT2YPGABnnQXTpkFl5W61iVwLI2AsAQ5yzh2ADxRTgKmd9nkdOAG4yzk3CigHijPzJ71eR0I0OViUl5djZpSVlb3ffKHahQDQ1gaLFvkg8dvfQmsrHH001NTAmWf6oBGSvAcMM9vunLsIqAX6AnPNbIVz7jqgzswWAJcDs51zl+IT4OdavpMrIhFJlRB1zrFs2TK2bNlS1MlgScO6dfDzn/vA0NAAH/gAXHghVFfDxz4WSZFCyWGY2UJgYaf3rkn6uR44JoyyiESto3tp54ToqFGjoi6aRK211Xd9nTMHfv97X7s44QTf0+m006C8PNLi5b2XVL5UVlZaXV1d1MUQyVhHLynVKIRVq3xN4q674J//hKFD4bzzfG3iwANzeqpi6CUl0uvkPCEqhWXrVvjNb3xt4vHHoU8f+NznfHfYk06CfvF7PMevRCIixeyFF3yQuPde2LQJDjgAbrjBD67bb7+oS9ctBQwRyZqa13qweTPcf78fN7F4MZSWwhe+4LvDfvrTvnZRAAqjlCISW7GblTUuzODZZ31QGDrUNzVt2QK33w7r1/vR2SecUDDBApT0FpEsNDY2MmLECE1rkuztt31z05w58OKL0L8/TJniA8dRR+V9cF1Pskl6F05oEylyUc9Wm8n5I5+VNS7a2uBPf4KpU+GDH4RLLoFEAu68EzZs8D2gjj468mCRLQUMkRiIulkn0/P3pjUuUtqwAW68EQ4+2Dcv/f73vunpued8rmL6dBg0qOfjFAozK8ht7NixJhKljRs32uLFi23jxo1ZHyeRSBh+lgMDLJFIZH3csM4/b948SyQSNmjQIEskEjZv3rw8lzhira1mDz9sNmmSWd++ZmB23HFm995r9t57UZeuR/gZNjJ67qqXlEgGcrl+Raq5pcKcrTbb8/eWNS547TWYO9dP17F+PeyzD1x+uR9cd/DBUZcuFEp6i6Qp14neXBwvm26tSlx3Y9s2+N3vfHfYRYt8DmLiRN/sdPLJUFISdQnTpqS3SIhynejNdunSbPMfvWnp1MDq6+Gyy/xAui9+EVauhO9/308CuHAhfP7zBRkssqUahvQ62Q4yy9c38kzKlcuy9PrBd+++6xcjmjPHL07Ur5+f8G/aNBg/Hvr2jbqEOaEahkhAueiNlK9v5BUVFYwbNy6t4+SytpN8/qi7+IbGDOrq4IIL/OC688+Hf/0LbrnF5ykefBBOPLFogkXWMs2WR72pl1ThyFVvolyUI5e9keJwXfnoYdXR62nw4MHF2+tp0yazGTPMDj/c93IqLzc7+2yzJ580a2uLunR5RRa9pCJ/8Ge6KWAUhjg9fBYvXmyDBw/e5eE6aNAgW7x4cWRlyoVcdmuNuotvXrW1mf35z2ZnneUDBPiAcccdPoD0EtkEDHWrlbxJtXZ1dXU148ePj6SNvFgHmeWyW2vUXXzz4s03d66DvXKlH0h37rm+p9OYMVGXrqAohyF5E7dpI4q5N1Am+Y9Uiiao7tgBf/gDTJ4M++8PV1wBFRV+gaI33oD//V8FiwyohiF5E8eHT68ZZJahrpaPLZj79PrrfnDd3Lmwdi0MGQLf+IYfXKclcLOmbrWSVx0jopMfPpmOiO6s13cD7UYuug4XzL1taYGHH/ZNTrW1vufThAm+yenUU6GsLOoSxko23WojT15nuinpXTjy0ZsoTsn0uOk19+Yf/zD75jfN9tnHJ7D328/su981W7066pLFGlkkvVXDkIKjqSy6Vuz3pvH119n885+zf20tpX/9qx8fccopfnDdiSfGch3suMmmhqG7KwUn3z15Cqo5ppOi7OUE8NxzrLziCvZ59FEOBF51js1TpnD4bbf5AXcSCvWSkoKTz2R61OtSZCuOHQ0y9u9/+wWIxo2DI45g+KOP8ghwPHCQGZ/83e9oVI0iVAoYUnDy1T02edxIU1MTzc3NVFdXF9T0GAXfddjMz+N0/vm+5nDBBbBtGw2XX85HBg7ky8Cf8SMKe+XKfhFTeJaClI/usXfeeecuTTlQmM05Bdl1+K234N572X7nnfR7+WWsf3/c1Km+p9O4cfR/6y02/s//7PKRgq05FTAFDClYFRUVOXsYNjY2csMNN+z2fqE+lHJ5b/KmrQ0ee8x3h33oIWhtZZlz3JtIcH9bGz/5zGeo+sQngCIYH1IkFDBE8MnisrIytm7dusv7V111lR5KubZ+vV+1rqYG1qyBvfbivfPO47i776Zu2zboYhqZgqw5FRnlMCS2wpxiO1WyuLy8nK9+9at5P3eHOE0pnvOybN/uV6475RRs+HD47ndpGTYM5s2DN95gxbRpvFJevstHUuUocjUFimRGAUNiKezeSqmSxXPnzg3twRSn3lk5Lcurr8JVV8Hw4XDaaTQ/9RS39unDEQMGsGddHfMBysuLq3dXMct0xF/Um0Z6F68op9juPCo9jDUvwr7e7q4pJ2VpbjabN8/sM5/xI7D79DE7+WR75+67bWB5eZfHzuU07dI1shjprRqGxE6Us9wmN3l09007l002YV5vT7WHrMry4otwySV+HeypU2H1arj+ej8h4MMPs3LUKPp0mtcp+dhVVVU0NDSwaNEiGhoacjbnmORQppEm6k01jOIVh0V8uitDrudqCut6uzpPfX39+zWOtMuyebPZnDlmRx3laxMlJWZnnmn26KNmO3ZEcp3SPbTinhSbqJsnulqdr7a2Ni8PvTCuN9U1JRIJKysr2yX49ViWtjazv/3NbNo0swED/GNk1Ciz224za2yM/Dqle7EPGMBE4GVgFXBlF/ucCdQDK4B5PR1TAaP4pWprD2sd7a6+DdfW1uZtmdd8X1uqa+q8dQS/lGX517/MfvITs0MP9Y+O/v3NzjvP7Omn01oHOw5rofdmsQ4YQF/gVeBAoBT4OzC60z4HAcuBvdpf79PTcRUwep+wp+1O9W24u2aVQngQJl9TWVnZbteyW/BrazP705/Mpk41Kyvzj4yxY81mzjR7553oLkQyFveAcTRQm/T628C3O+1zMzAtneMqYPQuUbV/pwoCqQJJIa1B0XFN9fX1Xd/TDRvMbrzR7MMf9o+JwYPNLrzQbNmyqIsvWcomYOR9PQzn3GRgoplNa399FnCkmV2UtM9vgZXAMfgayffM7A8pjjUdmA4wfPjwsQ0NDXktu8THkiVLmDBhAk1NTe+/N2jQIBYtWsS4ceNCL0/yFOhArNeg6CjrgAED2LJly/ujpBsbG7nzzjv54Q9/SElJCTtaWnjk4os57pVX/Ap2O3bAscf6tSZOPx3694/6UiQHimE9jH74Zqnjgf2BJ51zh5rZO8k7mdksYBb4BZTCLqREJ4qBXd2ti5E8V9OSJUtiuwZFxxK5AM3NzSQSCcBPu1FTU0NpaSnDduxgzpFH8smXX6bvLbdARQVcdplfB/uQQ6IsvsRMGOMw1gPDkl7v3/5esnXAAjNrNbPX8LWNg0Iom8RAkDENuZ62u6dzpjPaOa6jlJOna+8IZh0/z5oxg881N3N/UxMvtbRwzBNPsGPUKPj1r2HdOrj5ZgUL2V2mbVlBN3ztYTVwADuT3h/ttM9E4O72n4cAa4G9uzuuchjFId22/1wklns6Zyb5kjh2F03VjfYjYLeCbfQrT1gD2DVgowcMyElPL4k/4pz09uXjs/haw6vAd9rfuw44tf1nB9yG71b7AjClp2MqYBS+KBLZQc7Z1RiMjgdqV0ErV72kcnmcRCJh/cHOAftLe5BoAfsV2IlgfTSArtfJJmCEMjWImS00s4PN7ENmdkP7e9eY2YL2n83MLjOz0WZ2qJn9MoxySbSimAIkyDm7a2LqrqkqFzOp5nLiv4q1a/n7Jz/JG8BdQAVwVb9+HFRezhMXXcSTiQQD0mzei9OMuhKBTCNN1JtqGIUv1bf98vLyyGsYZumPwQizbN3atMnsjjvMjjjCDKytvNzWn3CCLb71VqtfsWKXKUBqa2uttrY28PELqeuwdI24N0nlY1PAKA7z5s2zkpKS9x+QpaWlkQzIS6Vz01BPTVXZyvj4bW1mTz5pdvbZZomE/7P++Mdtybnn2tDy8t0e8Jk8+DUPVPFQwJCCFacBeUE+E6saxptvmt1yi9khh/g/5YEDzb76VbO6OqtfscLKysp2O1a3g/W6ke9gKeHJJmBoenOJVFRTmWeSb+iua28u2vYDdR3esQNqa+GMM2D//eGb34S994a5c2HDBpg5k/krV3LEmDFs27Ztl+OXlJSwePHijO53XLsOS8gyjTRRb6phFIdCaepIrpF0rp3kY7rz3Wo/r79u9r3vmQ0f7msTe+9tdumlZitW7PbZriYYzKaGkXydceo6LOlDTVJSyHL9IMr1JIDdBYS8BryWFrPf/MbspJPMnPN/ruPHm91/v9nWrSk/kqrpCLCysrLdchiZ3O9CmGBRuqeAIQUvVw+isBc3Ctq2n9b1rVxpdsUVZvvs4/9EP/hBs6uvNlu9OqPylpWVWX19feblkaKigCFi+fm2H2QQX0/nDBTE3nvP7N57zY47zv9Z9u1rNmmS2cMPm7W2plVmNR1JdxQwRCw/PXnSCQipHtA9fv6558wuushszz39n+OBB5r98If21vPPZ1UDUA1CupJNwFAvKSka+ejJE6TnUlVVFQ0NDSxatIiGhgaqqqre/12qXmB79evHu7ffDp/4BBx+OMyaBSedBI89Bq+8wvyRIxl25JFZjfbOxahzkc7yvh5GvlRWVlpdXV3UxZCY6ZjOu6SkhNbWVmpqanZ5gGequ6nOe/pcx1oZRwHTgC8CAwA++lH4ylfgy1/2XWM77d8hTmtrSOErhvUwRHKiqqqK8ePHZ/Rw707y+hdpfc45npo8mbJf/IKPmrEFePP44xlw002+huEcsDMgbdq0abe1Nfr16xeLtTVEFDCk6GT6cM+ZtjZ4/HGYPRseeogxLS20jhnDaxMnMnDaND50wAG77N5RKyotLWXbtm20tbXt8vvNmzezbNmySFYWFEmmJinJWKbNNEXrjTfg5z+Hmhp47TXYc0846yy/xOlhh6X8SKomqI7mtGRqlpJcyaZJSklvyUgup+EuaNu3w4IFcOqpMGwYXH01jBgB993nA8hPf9plsIDUSfHS0lL6d1o/u0+fPixfvjwvlyASVI8Bwzn3qHPu42EURgpD8tKfTU1NNDc3U11d3bvWSFi9Gr7zHRg+HCZNgsWL4YorYOVK3xw1dSq0r5/dnVQ9u9ra2nZrlnr33XeZNGlSrwvMWn8jXoLUML4F/Ng593Pn3NB8F0jiL6oJAyO3bRv88pcwfjx86ENw000wZgw89BCsXQs33ggHpbcUfVfddufOnUuiU8DZunVrQQXmbB/2qsXGUNABG8Dp+PW4rwUSmQ78yNWmgXvRKZQJA3PmxRfNLrnE7AMf8IPrRowwu+46s7Vrc3aKVAPtamtrbY899ijIKcWznaKl1/0fCxH5HumNX3P7Y8AFwFvAOuCsTE+ai00BI1pFP/3E5s1mNTVmRx/t/0xKSszOOMPsj38027EjlCIU6kMzF+XW+hv5k03ACJLDeBpYD9wO7AecCxwPfMI5Nyub2o0Uru5GN0cpq2YQM1iyBKZPh6FDoboaNm2CW2+F9evhgQdgwgToE05fkUDrY8RQLpostf5GTPUUUYCP0t79NsXvXso0UmW7qYYhnWXaDNK4cqWt+a//stbRo31tIpEwO+ccs6ee8sufZiEXczoV2rxQuaoZFX0tNiJENfkgcGA2n89mU8CQZGk/pNrazJ54wl475hhr9nULW+acLT7/fLN33sno/J0f6rmear2Q5OphX2jBshBEFjCi3BQwJNnixYtt4MCBPbd5//OfZjfdZHbQQWZg74DNADsiB9+EkwNDoeYfckkP+3jKJmBo4J4UhWXLlrF58+Zd3nu/zXvHDli4EL7wBb8O9pVXwr77svraa/nIoEFcBHQMiUu3rb2rMSnLly/vsR2/2McYaMbc4qOAUcSK/YHUobGxkUsvvXS392dffTUVM2bAyJHwuc/BU0/BJZfASy/Bk08y8MILaeo0BUfnxGpP97CrBC/QbdJWYwykIGVaNYl6621NUulW74uh/TzoNSd3wSwBOx3sj337Wptzfi3sE080e/BBs23bdvtsd23tQe5hd01PXR07SHOVmnMkX1AOo7il+/AvhvbzdK5548aN9vGyMrsZ7M32BPZa52zL5ZebrVnT47lSPZzTuYc9rbjX+dg9jTEohmAv8aWAUcQyefgX+qCnwNf87rtmd99t9qlPmYG1gC3o188mlZba/F/8IqsypHsP06kRdHd9xRDsJd6yCRjKYcRcJoOgCn3QU4/XvHw5fP3rfnDdOefAm2/Cf/83TS+8wL7PPMPsdeuY8qUvZVWGdO9hOgne7gbk9dp5uqQgaAGlmMvk4d/xQOq8VGmh9FZJdc2JlhY+8vjjcMEFsGwZlJXB5Ml+idNjjwXnGAIMyVEZcnUPu1ozJNXKgI2NjWzatIlt27btcoxCCvZS5DKtmkS99ZYmKbPMB0GFkTjN1znmzZtnifJym9C/v93Tt6+1lpb6FtTDDjP72c/M3n47q/Lker8uryFgLiJ539LSUispKbFBgwZZeXm5XX/99WqSkpxBOYziF8deM3lLzm7caHbrrdbaPrhuxx57mE2fbrZ4cbdTdQQtTxhJ5XRyEV3te+WVVyr5LTmngCGhy3lydscOs9paPyNsSYn/r3n00X7G2M2bc1aesJLK6STNU+07cOBAKysrU/Jbci6bgKGkt2QkZ8nZdevg+uvhwAPhxBPhscfgwgvhxRfhmWfg/PNhwICUH00eVBe0PGElldPJPaXat6WlRclviR0FDMlIVj2xWlvht7/1o69HjIBrroEPf9ivZvfGG3D77fDRj3Z7iM4jpZctWxaoPGH1IEtnavLkfQcOHEhZWRk/+MEP2L59e97LKZKWTKsm6WzAROBlYBVwZTf7nY6vflf2dEw1SUUv7WT8K6+YfetbZv/xH77JaehQs6uuMnv11bTO21Wz0syZM98vT3fJ4jCnzU4n9zRz5kwrKyuzgQMHWiKRsIsuumiXcir5LblAnHMYQF/gVeBAoBS/zOvoFPsNBJ4EnlXAKBw9PhCbm83uu8/s+OP9f7c+fcxOOcVswQKz1taMztldfmDjxo12/fXXB5rSI06dCLoKgvX19Xb99ddbeXm5kt+SE3EPGEcDtUmvvw18O8V+PwY+BzyhgFEEnn/e7OKLzfbay/83O+AAsxtuMFu3LutD53OkdFSBpKsgWFtbq5HfklPZBIwwchj7AWuTXq9rf+99zrkxwDAze6S7Aznnpjvn6pxzdcU+A2tB2rwZZs+GI4+Eww6DO+/0iexFi2DVKrjqKthvv56P04N8jZSOcgbZrnIrgJLfEh+ZRpqgGzAZmJP0+ixgRtLrPvhaxcj210+gGkbs1dfX21133WX1K1aY/fWvZtXVZnvs4WsTo0eb3X672Vtv5bUM2U4a2PlYUXyTT76GVLkVzS0luUYWNYwwpgZZDwxLer1/+3sdBgIfA55wzgHsCyxwzp1qZnUhlE/SdPHFFzNvxgy+DIzpeLN/f5gyBaZNg6OOAv9vmVcVFRW79TrKdEqPjppJc3Pz++91fJPP15Qq8+fPp7q6mtLSUlpaWqipqaGhoWG3qUQKeZoXKS7OB5w8nsC5fsBK4AR8oFgCTDWzFV3s/wTwXz0Fi8rKSqurUzwJVVsbDXffzTPnn88XgDJgMTAHuHzxYg4ZNy4np+lq/qV8HqOxsZERI0bsEjASiQQNDQ0AWZcnnfOlOkcu7okIgHNuqZlVZvLZvOcwzGw7cBFQC7wEPGBmK5xz1znnTs33+SUHNmyAG2+Egw9mxPnnMxGYBXwcOBKYDTxbX5/yo+mu+perPEK6y4N2lRdZtGhRt+XJdFXDdHMtWu5UYiHTtqyoN+Uw8qy11ezhh81OPdWsb1+fmzjuOHv5mmusPKk9vWN76qmndjtEIS78lJxT6Kk82cxJFYdrld6JmPeSkkLy2mtw9dV+BPYpp8Czz8Lll8PLL8MTT9B08snsaF+zukNJSclu35YbGxuprq6mubmZpqYmmpubqa6u7vabeBzWgkj+Jt9deTK5vs7nCToSXCQutB6GwLZtfqqOOXN8F9g+fWDiRJgxA04+GZICxMiRI+nXr9/7XT4B+vXrt9uUFZkkkeO28FN35clFkjzVmhgicaYaRm9WXw+XXebHRkyZAitXwve/D2vWwCOPwOc/v0uwgODfjLNZ+Cku37q7K0+ugptyE1JQMm3LinpTDiNDW7aYzZ1r9slP+rxESYnZ5Mlmf/iD2fbtgQ8TZER0nBd+SkdX5QlzTiqRXCGLHEbeu9Xmi7rVpsEMli71TU7z5vkR2Ycc4sdMnH027LNP3k5d7N1Bi/36pPhk061WOYxitmmTDxCzZ8Pf/w6JBJxxhl8H+5hjIhtcV0yK/fpEkilgFBsz+MtffJD41a9g61Y4/HC44w6YOhX23DPqEkqEVCOSbChgFIs334S774aaGp+8HjQIzj3X1ybGjOnx41L8Uk1FUlVVFXWxpIAoh1HIduyARx/1tYkFC2D7dvjUp3xuYvJk2GOPqEsoMZHuVCRSvJTD6G1efx3mzvXb2rUwZAh84xtQXQ2jRkVdOomhKCZXlOKjgFEoWlrg4Yd9T6faWv/ehAnwox/BpEnQaUSy7CqTyQiLqa0/boMipTBp4F7cvfwyXHEFDBvmm5leeMFP3bF6tQ8cZ5yhYNGDdCc0jHIhpXyJ26BIKUzKYcTRe+/Br3/tcxN/+Qv07evndZo2zU/Z0bdv1CUsGEHb7jtqFAMGDGDs2LFF29ZfbDUnSZ9yGMXiued8k9MvfgFNTfChD/lpxc89F/bdN+rSFaQgbffJvYe2bt1Knz67VryLqa1f40YkGwoYUfv3v2H+fF+bWLoUysrg9NN9d9hjj/UTAUrGemq7T551NjmodLW/SG+mp1EUzOCZZ+C882DoULjgAp/U/ulP4Y034L774PjjiyZYZLrIUC701Hafagrz8vJyysrK1NYv0olqGGF66y245x7f7PTSSzBgAHzpSz43MW5cKFN1hC0Og8W6m0Y8VQ3EOceyZcvYsmWL2vpFkijpnaHAycO2NnjsMR8kHnoIWlvhqKN8kPjiF33QKFKFMlisI6iVlJTQ2gkM4XUAAAseSURBVNqqEdBS1JT0Dlmgb83r1sFdd/mpOtasgQ98AL7+dT+47tBDoyh26AplsJgWMhIJRjWMNHX7rXnPPWHhQl+bWLjQ1y4+8xlfm/j856G8PPTyRqlQahgivUk2NYziyKqGKFWS9OC+fWm94goYPhxOOw3q6uBb34JVq3xzVFVVrwsWEM5gsSgT6pI+/XsVuExXXop6i2rFvY0bN1oikbAysClgj/k+T9bWp4/ZySeb/e53Zq2tkZQtrvK1gl7HineDBw8OZcW7uK0EWGjC/veS1Mhixb3IH/yZbpEt0frCC/aPE0+0f7UHitecs7+fcYbZunXRlKeX6gjcwPtbIpHI28NcD7vshP3vJV3LJmCoSSqILVt88vqoo+DQQznk8cfpf9ppvDxjBnts2MBhDzwA++0XdSl7lVRNgx0J9VxLHtzX1NREc3Mz1dXValZJQ5j/XpI/6iXVFTNYssSPwP7lL33QGDUKbrsNzjqL8iFDOCTqMsZMmPMUdTWCe9OmTTQ2Nub0/IXS2yvONFtucVANo7O33/Yjrj/+cTjySL8m9hlnwNNPw4oVcOmlfv2JXiRIojLsGV47J9RLS0vZvn07Z555Zs7Pr4dd9jRbbpHItC0r6i2nOYwdO8z+9CezqVPNysp8aqey0mzmTLOmptydpwAFabuPsn1648aNVltba+Xl5Xk9f8d9GDRokHIYWVDHgeiRRQ6jdzdJbdjg18GeMwdefRUGD/ZjJqZNg8MPj7p0kUs1MV91dTXjx4/f5ZthlE02FRUV7LXXXpSVlbF169a8nV+D+3JDs+UWtt4XMLZv9wsPzZ4N//d/fl3sY4+Fa6/1CxQlElGXMDZ6CgTJa0hE2WQTVpORHnbS2/WeHMaaNXDNNTByJJx8sp8t9rLL4B//gD//Gc46S8Gik+4exMk5i7Fjx1JdXR1Z+7Tax0XCUdxTg2zbBgsW+NrEokX+vYkTfZPTySdradMAUk3MN378+JRTfixdujTSGV61mpxIzzT5YGcvveTzEvfc46cUHzbMNzmdd56fvkMCS9V2v2TJkpRNVVu2bGHcuHGRlVVNRiL5VTwB49134cEHfaB4+mno1w8mTfK1iQkTinId7LC+UXd+EKubqUjvVPg5jKVL4Wtfgw9+0NcgGhvh5pv99OK/+pVvgirCYBH2uIdkyhmI9E6h5DCccxOBnwB9gTlmdlOn318GTAO2A43A+WbW0N0xK0eMsLq994bly/1MsGec4WsT//mfRblyXbK4TBuebg2nmHMMxXxtUlxiPb25c64vcAdwEjAaqHLOje6023Kg0swOA34F3NzjgV9/3a83MWOGH09xzz2+e2yRBwuIz7w8FRUVjBs3LtADMsoaUb4V87WJJMt7DcM5dzTwPTM7sf31twHM7MYu9j8CmGFmx3R33MrRo61uxYpeESA6i0sNI6hCK286ivnapDjFuoYB7AesTXq9rv29rlQDv0/1C+fcdOdcnXOurvHdd3tlsIDCyyHEpUaUD8V8bSKdxaqXlHPuy0AlcFyq35vZLGAW+HEYIRYtdgppqopi7lVVzNcm0lkYNYz1wLCk1/u3v7cL59x44DvAqWa2LYRyFbx0cghRKrQaUTqK+dpEOgsjh9EPWAmcgA8US4CpZrYiaZ8j8MnuiWb2SpDjBhrpLbFSzD2JivnapLjEeqS3mW13zl0E1OK71c41sxXOuevw0+wuAG4BBgAPOp+XeN3MTs132SRcxTwSu5ivTaRDKDkMM1sILOz03jVJP48PoxwiIpK5wh/p3UsEWfVORCSfFDAKgAaGiUgcFPf05kVAA8NEJJfiPnBPsqCBYSISFwoYMaeBYSISFwoYMaeBYSISF7GaGkRSK6RpQESkeClgFAgNDBORqKlJSkREAlHAEBGRQBQwREQkEAUMEREJRAFDREQCUcAQEZFAFDBERCQQBQwREQlEAUNERAJRwBARkUAUMEREJBAFDBERCUQBQ0REAlHAEBGRQBQwREQkEAUMEREJRAFDREQCUcAQEZFAFDBERCQQBQwREQlEAUNERAJRwBARkUAUMEREJBAFDBERCUQBQ0REAlHAEBGRQBQwREQkkFAChnNuonPuZefcKufclSl+X+acu7/9939zzo0Mo1wiIhJc3gOGc64vcAdwEjAaqHLOje60WzWwycw+DNwO/He+yyUiIukJo4bxCWCVma02sxbgl8CkTvtMAu5u//lXwAnOORdC2UREJKB+IZxjP2Bt0ut1wJFd7WNm251zTcDewFvJOznnpgPT219uc869mJcSF54hdLpXvZjuxU66FzvpXux0SKYfDCNg5IyZzQJmATjn6sysMuIixYLuxU66FzvpXuyke7GTc64u08+G0SS1HhiW9Hr/9vdS7uOc6wcMBv4VQtlERCSgMALGEuAg59wBzrlSYAqwoNM+C4Bz2n+eDPzJzCyEsomISEB5b5Jqz0lcBNQCfYG5ZrbCOXcdUGdmC4Aa4F7n3CrgbXxQ6cmsvBW68Ohe7KR7sZPuxU66FztlfC+cvsiLiEgQGuktIiKBKGCIiEggsQ8YmlZkpwD34jLnXL1z7nnn3GPOuRFRlDMMPd2LpP1Od86Zc65ou1QGuRfOuTPb/2+scM7NC7uMYQnwNzLcOfe4c255+9/JZ6MoZ7455+Y65zZ2NVbNeT9tv0/PO+fGBDqwmcV2wyfJXwUOBEqBvwOjO+3zdWBm+89TgPujLneE9+LTQP/2n7/Wm+9F+34DgSeBZ4HKqMsd4f+Lg4DlwF7tr/eJutwR3otZwNfafx4NrIm63Hm6F8cCY4AXu/j9Z4HfAw44CvhbkOPGvYahaUV26vFemNnjZvZe+8tn8WNeilGQ/xcA1+PnJdsaZuFCFuRefAW4w8w2AZjZxpDLGJYg98KAQe0/DwbeCLF8oTGzJ/E9TrsyCbjHvGeBPZ1zQ3s6btwDRqppRfbrah8z2w50TCtSbILci2TV+G8QxajHe9FexR5mZo+EWbAIBPl/cTBwsHPuaefcs865iaGVLlxB7sX3gC8759YBC4GLwyla7KT7PAEKbGoQCcY592WgEjgu6rJEwTnXB7gNODfiosRFP3yz1PH4WueTzrlDzeydSEsVjSrgLjP7kXPuaPz4r4+ZWVvUBSsEca9haFqRnYLcC5xz44HvAKea2baQyha2nu7FQOBjwBPOuTX4NtoFRZr4DvL/Yh2wwMxazew1YCU+gBSbIPeiGngAwMz+CpTjJybsbQI9TzqLe8DQtCI79XgvnHNHAHfig0WxtlNDD/fCzJrMbIiZjTSzkfh8zqlmlvGkazEW5G/kt/jaBc65IfgmqtVhFjIkQe7F68AJAM65UfiA0RhqKeNhAXB2e2+po4AmM9vQ04di3SRl+ZtWpOAEvBe3AAOAB9vz/q+b2amRFTpPAt6LXiHgvagF/p9zrh7YAXzTzIquFh7wXlwOzHbOXYpPgJ9bjF8wnXPz8V8ShrTna64FSgDMbCY+f/NZYBXwHnBeoOMW4b0SEZE8iHuTlIiIxIQChoiIBKKAISIigShgiIhIIAoYIiISiAKGiIgEooAhIiKBKGCI5Ej7OgsT2n/+gXPuZ1GXSSSXYj3SW6TAXAtc55zbBzgCKLpR9tK7aaS3SA455/6Mn57leDPbHHV5RHJJTVIiOeKcOxQYCrQoWEgxUsAQyYH21cruw69ktqWIFymSXkwBQyRLzrn+wG+Ay83sJfzSsNdGWyqR3FMOQ0REAlENQ0REAlHAEBGRQBQwREQkEAUMEREJRAFDREQCUcAQEZFAFDBERCSQ/w+RJSC64/qMcwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy import stats\n", "%matplotlib inline\n", "\n", "# Read in the example correlation dataset\n", "# You will need to change the file path to the location where you've saved the data\n", "data = np.loadtxt('../datasets/correlation_example.dat')\n", "x,y = data[:,0],data[:,1]\n", "# Perform linear regression on the dataset to determine the slope and intercept\n", "result = stats.linregress(x,y)\n", "a,b = result.slope,result.intercept\n", "print('Linear regression slope =',a)\n", "print('Linear regression intercept =',b)\n", "# Plot the result\n", "xmin,xmax,ymin,ymax = 0.,1.,0.,1.\n", "plt.scatter(x,y,marker='o',s=20,color='black')\n", "plt.plot([xmin,xmax],[a*xmin+b,a*xmax+b],color='red')\n", "plt.xlabel(r'$x$')\n", "plt.ylabel(r'$y$')\n", "plt.xlim(xmin,xmax)\n", "plt.ylim(ymin,ymax)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's compute the $R^2$ value and show it's the same as the correlation coefficient:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "R^2 = 0.30067842432276637\n", "r^2 = 0.30067842432276654\n" ] } ], "source": [ "# Evaluate Pearson correlation coefficient r\n", "r,p = stats.pearsonr(x,y)\n", "# Evaluate the coefficient of determination R^2\n", "xmu,ymu = np.mean(x),np.mean(y)\n", "r2 = 1 - np.sum((y-(a*x+b))**2)/np.sum((y-ymu)**2)\n", "# These should be equal\n", "print('R^2 =',r2)\n", "print('r^2 =',r**2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Activity\n", "\n", "Returning to Hubble and Lemaitre's distance velocity datasets, find the **linear least-squares regression lines** with and without an intercept, and the value of $R^2$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The case of errors in both co-ordinates\n", "\n", "Note that linear regression with weights $w_i = 1/\\sigma_i^2$ is equivalent to minimizing the $\\chi^2$ statistic in a model fit. A more general case is with **errors in both co-ordinates**.\n", "\n", "One solution for cases with errors in both co-ordinates is to modify the function we are minimizing:\n", "\n", "$\\chi^2(a,b) = \\sum_i \\frac{(y_i - a x_i - b)^2}{\\sigma_{y,i}^2 + a^2 \\sigma_{x,i}^2}$\n", "\n", "## Activity\n", "\n", "Consider the example dataset containing the stellar masses and rotation velocities of galaxies. Find the **best-fitting linear regression** by minimizing the above function, using the errors in both co-ordinates." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Principal component analysis\n", "\n", "Let's say we have a dataset which contains many variables for each object. **Principal component analysis** (PCA) is a procedure which uses the correlations between the variables to identify _which combinations of variables capture most information about the dataset_.\n", "\n", "Geometrically, it identifies the directions in which the cloud of variables is most elongated.\n", "\n", "Mathematically, it determines the **eigenvectors** of the covariance matrix and sorts them in importance according to their corresponding **eigenvalues**.\n", "\n", "In the following example we apply the procedure to the test correlation dataset." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Eigenvalue 1 = 0.036600176954389524 eigenvector 1 = [0.64325113 0.76565526]\n", "Eigenvalue 2 = 0.010500224305114374 eigenvector 2 = [ 0.76565526 -0.64325113]\n" ] } ], "source": [ "from sklearn.decomposition import PCA\n", "\n", "# Determine the eigenvalues and eigenvectors of the example correlation dataset\n", "pca = PCA(n_components=2)\n", "data = np.transpose(np.array([x,y]))\n", "pca.fit(data)\n", "eigval = pca.explained_variance_\n", "eigvec = pca.components_\n", "l1,l2 = eigval[0],eigval[1]\n", "v1,v2 = eigvec[:,0],eigvec[:,1]\n", "print('Eigenvalue 1 =',l1,'eigenvector 1 =',v1)\n", "print('Eigenvalue 2 =',l2,'eigenvector 2 =',v2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's a plot of the data and eigenvector directions:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Overplot the data and the eigenvector directions\n", "plt.scatter(x,y,marker='o',s=20,color='black')\n", "# Plot the 1st eigenvector with a length proportional to the 1st eigenvalue\n", "l = 3.*np.sqrt(l1) # this scaling by \"3\" is arbitrary for visualisation purposes\n", "dx,dy = l*v1[0],l*v1[1]\n", "plt.plot([xmu,xmu+dx],[ymu,ymu+dy],color='red')\n", "# Plot the 2nd eigenvector with a length proportional to the 2nd eigenvalue\n", "l = 3.*np.sqrt(l2) # this scaling by \"3\" is arbitrary for visualisation purposes\n", "dx,dy = l*v2[0],l*v2[1]\n", "plt.plot([xmu,xmu+dx],[ymu,ymu+dy],color='red')\n", "# Complete the plot\n", "plt.xlabel(r'$x$')\n", "plt.ylabel(r'$y$')\n", "plt.xlim(xmin,xmax)\n", "plt.ylim(ymin,ymax)\n", "plt.gca().set_aspect('equal', adjustable='box')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here are the principal component values of each data point:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, '$PC_2$')" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Determine the values of PC1 and PC2 corresponding to each data point\n", "datapca = pca.transform(data)\n", "pc1,pc2 = datapca[:,0],datapca[:,1]\n", "# Make a scatter plot of PC1 and PC2\n", "plt.scatter(pc1,pc2,marker='o',s=20,color='black')\n", "plt.xlabel(r'$PC_1$')\n", "plt.ylabel(r'$PC_2$')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we predict the $y$ values using only 1 principal component:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAARYAAAEKCAYAAADXWXqvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO2de5Bcd3XnP2fUT2s0ihY1tZSszBiwQcLEjD3yQlGs2ViyhbOxTUFRmvCyNV4bgmRQbBUGp2LKdqo2FljIYCIpjC2ZRWNwIIWyMZlCPNaRK2Y89vByz5oV3hkkk820N8YrGzEPdPaP2y314/br9r3dt7vPp+qWpu+9/ZvTrelvn98553d+oqoYhmH4SU+rDTAMo/MwYTEMw3dMWAzD8B0TFsMwfMeExTAM3zFhMQzDdwIXFhF5QETmRORnZa6LiNwnIsdE5CcicnHQNhmGESzN8FgOAJsrXH8XcH72uBH46ybYZBhGgAQuLKr6GPBvFW65BnhIHZ4Afk9EXhO0XYZhBEek1QYAa4DjeY9PZM/9S/GNInIjjlfD8uXLL3njG9/YFAMNo1t56qmnXlDVVL3PC4Ow1Iyq7gf2AwwNDenk5GSLLTKMzkZEZr08LwxZoeeBtXmPz82eMwyjTQmDsBwGPpTNDr0VeElVS6ZBhmG0D4FPhURkDHgnsFpETgB3AFEAVd0LPApcBRwDfgNcH7RNhmEES+DCoqrDVa4r8LGg7TAMo3mEYSpkGEaHYcJiGIbvmLAYhuE7JiyGYfiOCYthGL5jwmIYhu+YsBiG4TsmLIZh+I4Ji2EYvmPCYhiG75iwGIbhOyYshmH4jgmLYRi+Y8JiGBXIZDI8+eSTZDKZVpvSVpiwGEYZxsbG6O/vZ9OmTfT39zM2NtZqk9oGcdqhtB/W89YIkkwmQ39/P6dOnTpzLplMMjs7SypVd2/ptkVEnlLVoXqfZx6LYbgwMzNDLBYrOBeNRpmZmWmNQW2GCYthuDAwMMDCwkLBucXFRQYGBhoaN5OBJ590/u1kTFgMw4VUKsXo6CjJZJK+vj6SySSjo6MNTYPGxqC/HzZtcv7t5JCNxVgMowKZTIaZmRkGBgYaEpVMxhGTvJANySTMzkKYQzZeYyxttWGZYTSbVCrlS7B2ZgZisUJhiUad82EWFq/YVMgwmsDAABSFbFhcdM53IiYshtEEUikYHXWmP319zr+jo53prYBNhQyjaQwPw8aNzvRnYKBzRQVMWAyjqaRSnS0oOWwqZBgB0C31KuUwYTEMn+mmepVymLAYho9kMjAy4qSVX3rJ+XdkpPs8FxMWw/CRXL1KPrl6lW7ChMUwfKTb6lXKYcJiGD7SbfUq5bB0s2FUod71Qt1Ur1IO81gMowJeu8ilUrBhQ3eKCpiwGEZZMpkMIyMjnDp1ipdeeolTp04xMjISmv63Ye7Ha8JiGGUIcxe5sPfjbYqwiMhmEXlWRI6JyG0u139fRL4vIlMi8hMRuaoZdhlGJcp1kevtPa+lVbVh96SgCcIiIsuA+4F3AeuBYRFZX3TbnwNfV9VBYAvwpaDtMsJH2Fx7ty5yIyPf4ZJLVre0qjbMnlSOZngslwLHVPU5VV0AHgauKbpHgb7szyuBXzXBLiNEhNW1Hx4eZnZ2liNHjvDUU79kdPTtLa+qDaofr580Q1jWAMfzHp/InsvnM8AHROQE8Ciw3W0gEblRRCZFZDIs32pG40xPT3P99deH1rVPpVJs2LCBl19eHYqq2iD68fpNWIK3w8ABVT0XuAr4ioiU2Kaq+1V1SFWHwvQmGt4ZGxtjcHCQ+fn5gvNhc+0hXFW1+Z7U7Owsw8PDzTeiAs0QlueBtXmPz82ey2cE+DqAqv4zkABWN8E2o4XkgpDFogLhc+0hfFW1OU8qjF+yzRCWJ4HzReQ8EYnhBGcPF93zS+ByABFZhyMs4fCDjcBwC0ICxOPx0Ln2OYaHnc76R444/4bMUQgNgZf0q+qSiGwDxoFlwAOq+oyI3AlMquph4Bbgb0RkB04g9zpt131JjJpxC0LG43GmpqZYt25di6yqTrd0gWuEpqwVUtVHcYKy+ef+Iu/nNPD2ZthihIdcEHJkZIRoNMri4iKjo6OhFhWjNmwRotFShoeH2bhxoy+bghnhwYTFaDl+bQpmhIewpJsNw+ggzGMxDJzU99TUCWCAwcFVFpxtEPNYjK5nbGyMNWtu5cor38CVV/Zw7rlLXdlZ309MWIyuJpPJsHXrJ1lc/GvgHGAlCwsRRka06zrr+4kJixEagljdXG1MZ/pzFbBYcL6n53dd11nfT0xYjFAQxOrmamOOjcG1176F3/72Hs4urnc4fXpZ13XW9xNp1wLXoaEhnZycbLUZRhnqaUCdyWTo7+/n1KlTZ84lk0lmZ2c9p6GrjZnJOP1U8i7jFH2fJBY7hwMHIlauD4jIU6o6VO/zzGMxfKde7yOIxkXVxnTbWOycc05z331w4oSJSqOYsBi+4qVtYr2Ni2qJxVQaM5OBF18sbYGguowtW/os1ewDJiyGr3jxPuppXFSrN1RuzG9+M8XatfDe98LSkuO1hKEFQqdhMRajJmqNmTQSL6n2O7yMnT/mwYMpdu4svJ5IwLe+BYODJipuWIzFCIx6YiaNtE2s1rjIqze0YcMG7r8/wc6dpV+ikQisWmWi4jfmsXQQ9W4FWuuYXjyQMNlyww0/ZHT0UkBKrsXjcPy4CUs5zGPpcoLqcu81YxNE20Qv3tD09AuMjl6Em6gA7NljohIIqtqWxyWXXKKGw9zcnCaTScUpxFBAk8mkzs3NhXrsRmyamJioyYY//MMXFE4raNFxWnftaoKxbQ5Ol8e6P5/msXQAQW5gFcatJmr1hqan4Xvf+3eUeivKHXe8zK23BmZi12NtEzqAoDewascub5kMPPwwuInKO97xHJ/5zOtaYFX3YB5LB+CHV1Gt6CyMW02Us3lszCnX/9zn3J+3b5+JSuB4mT+F4bAYSyn1xB7yOXTokCaTSV25cqUmk0k9dOhQQBb6Rzmb02nVeLw4nnL22LatxYa3GXiMsVi6ucsJYgFg0JSzeffu/8PHP95H8f5ny5fDLbfAli0Q5AYAQaTYW42lmw1PNBL4DaJ/Si242bxs2b/n5pt7S0QF4PRp2LYtWFEJ66b2rcKEpcvxGvht5QfJzeZXXrmHhQX3Arig1wB5WXjZ6ZiwdDleAr+t/iAV2xyPX4TqeyjOAMViMDUV/DaoQab72xVLNxt1p5PLfWBmZmaaFlvIt/mJJ97AzTeXeitbtwYz/SmOpQSd7m9HzGMxgPrSyb29vQWBU4BTp07R29sblHmupFIpens3cPJkn+v1m2/2/3e6TQHDWETYcrykksJwWLq5dUxMTJSU+ScSCZ2YmGiqHdu2NTetXG15g9d0f5jBY7rZpkJdSKNpUTcXX0Qadv3rseurX4UvfrH0/F/+Jbz73aVToEZec+65L774IrFYrMBby8VSctvEdrWXko8XNQrDYR6LN/wqhsuN09fX50tRXT12XXZZeU/lwIHGxq723Gg0GqoFmUGDR4+l5QLh9TBhqR+/Vyrnu/6NTAPqseuOO8qLCqgePfpCgR2NvGa358ZiMU0kEr4JatjxKiw2FeoicmnRcq58veRc/7GxMUZGRojFYiwsLDA6Olp3lqkWuzIZuPvu8uNcccWzbNo0WGDH61//es+v2c2uRCLBI488wqpVqzqqwtZ3vKhRGA7zWOoniN4qlb7Va5161GrXbbeV91S+9KUXXcf42te+polEwjePpdOnPsVgUyGjFvyOjUxMTOjKlSsLPnzFRy0fxkp2pdOqH/pQeVG57LLydixfvlxjsZhGo1FPr9nv96vdCLWwAJuBZ4FjwG1l7nkfkAaeAQ5VG9OExTt+xUZyYxV/qxcffX19NaWi3WzZurW8oIDqDTfUZkcymdTx8XHPMaBOSyPXSmiFBVgG/AJ4LRADfgysL7rnfGAKWJV9/Opq45qwNE5QGaLizEkikfD0od61q7KoxGKq+UPm7Fi+fLlncTMKCbOwvA0Yz3v8KeBTRffcA9xQz7gmLI0RZIYoX2ii0ajGYrG6xWtuTlWksrDs3etux/j4uOe4ilGIV2FpRkn/GuB43uMT2XP5XABcICKPi8gTIrLZbSARuVFEJkVksptXjvqB3wvn8pcEDA8PMzs7yyOPPEIkEmFhYaHuxYp33+3IhxuxGOzdCzfd5DzOtW+Ynp5mZmaGtWvXcvvtt1uJfQsJS7o5gjMdeidwLvCYiLxZVX+df5Oq7gf2g9PoqdlGdhJ+Lpxzq2pNpVKsWrXKU6p33z647z73a+94B3zjG2fbIORS3eCsV4pGoywuLpJMJlFVdu7cyU033WSi0my8uDn1HNQ2FdoLXJ/3+LvAhkrj2lSoNioFHuvNeLiNVSlO42W6lU6rRqPuU5+ensKYSi2BY5sCNQYhjrFEgOeA8zgbvH1T0T2bgYPZn1fjTJ1eVWlcE5bq1BKcrTXj4TZWLcJRj3gdOlS5X21xTKWWVLcFbRsjtMLi2MZVwM9xskO3Z8/dCVyd/VmAe3HSzT8FtlQb04SlMn4GZ8uNNT4+XvLB7uvr0/Hx8ZKy+mriNTdX3lMBdd1czDyW4Am1sARxmLBUxu3b3Ou3d7mxxsfHSz7Y0WjUUwr7iivcBOW09vQsumZ/cuQ8opwdkUjkjKBU+v3dXJtSDyYsRgFu3+aJRML3RYL5U51EIqGxWKxuj6H8wsLTGo3+SdXnp9NpPXDggB49elQnJib06NGjeuDAAU2n0673t+N2J63ChMUo4dChQwXFarFYLJA2Cblv/3JTo0peUuUiuAXt7T2v4vOLRWLbtm0VRcPW/9SHCYtRQpBFcH78vr17K4nKaYVPVHx+Op3WeDxeV4zFzyliN+BVWKznbQcTZBFcuevFvV93797NzMxMSVFcJlOpJ63S0/MwyeS+soVtY2NjDA4OMu+2kVAexa/XGl83CS9qFIbDPJbqNNvtz3k06XRaJyYmdO/evWWnJZ/8ZHlv5dZbT9btGZU73F5vt69YrgdsKmS44eVD5CVjUhzryImK24f81lvLi4pbWrmYcvUr8Xj8TIyl2uu1rFBtmLAYZannQ+QlY+LmQcTjcV2xYkVJLOP88/9fNn5SKiq33Vb763H7fbkskImGf5iwGA3jderk5kGsWLHCJbD6RFlRiccLy/WrYdOZ5uBVWCx4a5zBa7DXLSC6tLTEnj17zgRyo9FrgEsp3gbVQdmz5+zCwlo2m8+toD5y5Aizs7MMB72PqlEfXtQoDId5LP7TSLC3nAcxNzen27fPaE/P6TLeymm98sp/LRnHitfCATYVMvygkSmGl9aSsKTpdObM8614LVx4FZaw9GMxQkK9G8TnU7wT4PQ0PPCA252a/fd3bNv2Q9atezuZTIZHH32USKTwTzISiTR1s3nDH0xYjBL82ip0zx738z09sH37LDfd1Mu6dW8/06wpEolw8uTJgntPnjzJ008/zYYNGxq2x2ge4ng77cfQ0JBOTk622oyW0Ojey80gk4G1a8GtMHbXLrj11tx9Gfr7+wu6zBWTTCaZnZ0N7WvtZETkKVUdqvd5lhVqM8bGxujv72fTpk309/czNjbWapNKyGRg5053Ubn66rOiAu6ZqGJy0yGjfagqLCLyHRG5qBnGGJXJZDKMjIxw6tSpuptTN4uxMVizBg4eLL0Wj8OXv1x4zi1VXUxuOhRGakmNdyO1eCyfBD4vIg+KyGuCNsgoj9+LCv0mk4EPfQgWF92v//mfn61VyeG2cHHr1q0lz92xY0fTPry1ikU7eI8to9b0EfAenH61dwBJLykoP49uTDeHPR37/veXTysXby5WTH6qemJiwnU5QDNaG9RaRxP2/wu/IMg6FpxyyQuBjwAv4OwN9EEvv9CvoxuFRTW8pewXXVS5XqVSe8liWvWhref3dktfF6/CUkuM5XHgeWA3zkZj1+Hs/3OpiOxvxFsy6qcZpez1xg0GB+HHPy5/fdeus5uL1YLb9KgZG47VM9W0vi5VqKY8wJvIpqVdrk17UTM/jm71WIKm3i1DKrVAcGuDUM/K42avUq7XUwqr9+gntKKkH3htI89v5DBh8Z969glauXKlRiIfK7ta2WnY5L6nc5jXAfmxiVsn0RJhaeVhwuI/1YKmhcLzBoX5sqJy0UWFIuS1g38r6HSxqAevwmIl/cYZnn766ZKS+vy4QS4GcerUNcBXgGWu41xwAXznOxn6+52am3JVtfnxizBVEvu1pKGbscrbFhDGoqpMJsOOHTtKzu/evfvMh2xgYID5+T7gAZxlZqW9VZYtg6NHa6uoXVxc5Omnn7ZakA7EhCUAKglHq4uqytnmJgS9vb1cfPHFZx6nUik+8YmDlGvWBEt89KOPk0q5Z02i0WhJB/8dO3aUVBJPT0+HTniNOvEyfwrDEdYYS6UAZauLqhq17dAh1URCyzZsgrcWPMctEFpcCFdcC5JMJjUej4c6wNtNYMHb1lPtw9nKoqp6Mj5uGZF02ulLWyomuePzrq+nUiDUNnUPP16FxaZCPlKtwKqVRVW1FH+VK74bG3OK4IpXKycSSk/P54F1wCeA0tdTaZOz4kK4eDxOMpmsaKPRJnhRozAc7eixqLauqMrrNGxuLjf9KT2SSdW9e7/RcN1H7tzRo0dLOvubx9JasKlQOKhFOBqtk/D6/FpFLX989x0LT2s87sRc6rGnUowndy0nfolEQhOJhN51110mLC3EhCVEBFlg1Wj1ajXb8sfv6bmzTKD2lO7a9fd1/95yHpPbtWg0qolEwoK4LcaEpQsIOqtUOP7+CtmfT9X9eysFrsttmWpTotbjVVis8raNOFv5eraSNRfcbKRSNNdD98UXX8yOfxFwA+71KvPA39T9e6sFrqt1kfPjdRrNw7JCbUQQWaX8gr1rr72Wkyf/M/BYmbsV2A68UPfvrdQKIf/aihUriMfjJduAWEuCNsOLm1PvAWwGngWOAbdVuO89OH+9Q9XG7MapkKq/WaXSqdXqCgsLT6vI/oZ/b6UYz969e89sJh+LxTQajZ7ZA3pvPZ2iDN8grDEWnJVqvwBeC8Rw2luud7lvBc5X5RMmLJXxKzhcGtu4u0xcRVVENZ3OBBaULhfAjcViumLFCgvgtgivwtKMGMulwDFVfQ5ARB4GrgHSRffdBfwVsLMJNrU1fq2+LZxarQZuodw6oHvuOcm6dauz9zn4ub+RW/xoMduVO2fjyMgIGzdutDhLG9CMGMsa4Hje4xPZc2cQkYuBtar6D5UGEpEbRWRSRCZtgVrj5Mc2li+/EHALoCqx2O1cdtmzBWf9XkxZyzYgVoXbPrQ8eCsiPcC9OF+XFVHV/ao6pKpD3fqtNT09zcGDB5menvZlvFwZ/ze/eS/J5IqiqwrcwrJlny8InAa1v9GnP/1pEonEmeBuNBotuG4B3PahGcLyPLA27/G52XM5VuDsAPADEZkB3gocFpG6t3XsdLZv38769eu57rrrWL9+Pdu3b29ovEwGnnwSIMUVVwwyOiokk5BILAC/JR7/OMnk3pJG1n7vb5Tzfj772c8iIuzcuZPZ2VkOHjzY9Ibahk94CczUc+B0BHoOOI+zwds3Vbj/B1jwtoR0Ou1aOJZOp2seo7D/rLPWZ+VK59+z5fmqExOVA7XlCvXS6XTdwd1qRX/WJrK1ENaskGMbVwE/x8kO3Z49dydwtcu9JiwuHDhwwFVYDhw4oKr1leonEms1Gl0sWVBYz2e3OO29bdu2kqUGtYhCt+zP066EWliCOLpNWI4ePeoqLEePHq26fqjUK7i3JK3c1+d4KvWQE450Ou2aKrYdBdsfr8LS8uCtURuxWKwkmBmNRnnllVeqBlILYyIP4fROKUwrLy5CvXHRXK+Vl19+uSTmsri4WFNwt1WbkxnBYmuF2oSBgQEikciZ2g7gTNl7tfVDZ1O5O4AP4Far8ulPl27YXo9tjaz1GR4eZuPGjaHq1G80hnksbUK5b/bBwcGq64dSqRS7d/83nPrDUlGJROrbArWabYlEwtWDqZQqrtRpzmhDvMyfwnB0W4wlh1tAtNr6oXRa9ZZbtGy5fvE2qH7Y1g3bj3YDeIyxiPPc9mNoaEgnJydbbUZoKFdev307fPGL5Z935ZXwj//YXJuM9kFEnlLVumvKTFg6mOlpWL++/PVIBH71K++xFaPz8SosFmPpYMrFTeJxSCbhoYc6T1TCuMtkN2LC0qF89rPwT//kfu2hh2B2FrK7e3QMrd5l0jiLTYU6kOlpuPBCOH269Nrll8ORI823KWgymQz9/f0FafdkMsns7KzFdxrApkIG4GwudtFF7qIC8IUvNNeeZuH3wkijMUxYOojpafjgB50qWjeuvhrWratvzGoxi7DENFq5y6RRiglLhzA2Bm95C/zud+7XIxH48pfrHbNyzCJMMQ1bGhAuLMbSAWQy0N8PeeGFAmIxOHCgvmBttZjF9PQ0g4ODzOdt6ByGmIbVzviL1xiLrRXqAKamoKeM7xmJwI9+VP8UqNIeRkeOHOH6668vEJX86638QPvVD9hoDJsKtTljY3DttfDKK6XXEgkntVyvqED5mEVvby8jIyMlopK7bjENA0xY2ppMBkZGiqdASjyu3HUX/PKX3mtVysUs3FokAMTjcYtpGGewqVAbMzPjxE8KheUVVLfwute9n1SqsQo4t3YGmUymxJOJx+NMTU2xzotrZHQk5rHkEZbUaa0MDEBpG5QeFhZ+6EvXfChtZ+DmyTz44IMmKkYBJixZwpQ6rZVUCkZHIR7/HfAS8BtgK/BCoMVhuS1Djhw5wuzsLMOdtjbAaBhLN9P+5eDT0y8wOPhu5uf/J/AC0F72G+HFSvoboF3KwXP7ABXPcNatW82DD/4pyeQrnovD2m0a2CzsffGIl+5QYTj87CDXDp3iy+0DlI/XPXiqdfmvh07aB8jP96Vdwbb/aIwwt1Kcm3PEpJF9gMqP7Z+odtIHsR2+bJqBV2GxqVCWMAck3Spro1En3dwofk0Dg9rPuVW0y/Q4rJiw5BHGTvH79sEf/3FpZW1uH6BGYwBuFbbz8/P09vbWNU6nfRBttXRjmLCEmH374CMfKa1VSSadNPORI42nyPPrUpLJJAA9PT1ccskldY3XaR9EWy3dIF7mT2E4On37j7k51UhES7bqiMUWdXzc/xhAOp3WeDze0HhhjlN5pZOC0V7AY4zFSvpDytQULC0pxRuMLSwssXbtryuuPvbyrfryyy+TSCQKFhfWO14n7mhoq6W9YcLSVijR6Bc5fvwPAHydevg1lbEPogEmLKFlcNDJ/BS2mVxA9V6uvfbXxGIxlpaWiMViJBIJFhcXG4oB5GIKIyMjRKPRhsczuhsr6Q8xY2Pw4Q8vsbj4W6CHSOQmenq+XuBZJBIJvvWtbzE4OOiLCFgHNiMf6yDXgQwPw8aNEaamFoEZ4IO8731/XyAssViMVatW+SYCNpUx/MCEJWAa9QBSKbjiilXAKtdeKO2c0jU6F6tjCRC/WzFYbYXRLjQlxiIim4E9wDLgy6r6X4uu/xlwA7AEZICtqjpbacywx1iCbMVQzQsKU5wkTLYY9RPatgkisgy4H3gXsB4YFpH1RbdNAUOq+gfA3wL3BG1X0ARZ4l5p6UGYGlaFyRajyXipqqvnAN4GjOc9/hTwqQr3DwKPVxs37JW3rVgdG6YVuWGyxfAOIV7dvAY4nvf4RPZcOUaAb7tdEJEbRWRSRCbDvmq2UjykXMOmRgnTQsAw2WI0n1AFb0XkA8AQsMvtuqruV9UhVR1qh/m6WyuGfftg7Vq4/HJn90I/ZwdhWggYJluM5tMMYXkeWJv3+NzsuQJEZCNwO3C1qpbuhtWm5MdDcquV5+fh5Eln246REf88lzBljcJki9F8As8KiUgE+DlwOY6gPAn8iao+k3fPIE7QdrOq/q9axg17VqiYTMbxVIo3EOzthe99DzZs8PN3hScTEyZbjPoJbeWtqi6JyDZgHCfd/ICqPiMid+IEhg7jTH16gUdEBOCXqnp10LY1k9zmYsXCkmvY5Cdhqp4Nky1G82hK5a2qPgo8WnTuL/J+3tgMO1rJwAAsLZWe37PHqa41jE4iVMHbTsGtXWRuc7FkElasgHgc9u6Fm25qoaGGERAmLD5TqShseBhmZ+G734Xjx01UjM7F2ib4SGkZ/2ri8TcyNfV3rFu3uqW2GYYXQlvS300UFoVtAWaZn//vDA6u8rVexTDCjgmLj5wtClsNjALnACuZn1/ma72KYYQdExYfyRWFxeNvBAp6Svq2wZhhtAMmLD4zPDzM1NTfEY8XbvgVRL2KYYQVE5YAWLduNQ8+uIxkEvr6zm4wZvUqRrdgrSkDwulX60x/BgZMVIzuwoQlQFIpExSjO7GpkGEYvmPCYhiG75iwGIbhOyYshmH4jgmLYRi+Y8JiGIbvmLAYhuE7JiyGYfiOCYthGL5jwmIYhu+YsBiG4TsmLIZh+I4Ji2EYvmPCYhiG75iwGIbhOyYshmH4jgmLYRi+Y8JiGIbvmLAYhuE7JiyGYfiOCYthGL5jwmIYhu+YsBiG4TsmLIZh+I4Ji2EYvtMUYRGRzSLyrIgcE5HbXK7HReRr2es/FJGBZthlGEYwBC4sIrIMuB94F7AeGBaR9UW3jQAvqurrgd3AXwVtl2EYwdEMj+VS4JiqPqeqC8DDwDVF91wDHMz+/LfA5SIiTbDNMIwAaMam8GuA43mPTwD/odw9qrokIi8BrwJeyL9JRG4Ebsw+nBeRnwVicTCspuj1hJh2shXay952shXgDV6e1Axh8Q1V3Q/sBxCRSVUdarFJNdNO9raTrdBe9raTreDY6+V5zZgKPQ+szXt8bvac6z0iEgFWAv+3CbYZhhEAzRCWJ4HzReQ8EYkBW4DDRfccBj6c/fm9wPdUVZtgm2EYARD4VCgbM9kGjAPLgAdU9RkRuROYVNXDwCjwFRE5BvwbjvhUY39gRgdDO9nbTrZCe9nbTraCR3vFHAPDMPzGKm8Nw/AdExbDMHwn9MLSTssBarD1z0QkLSI/EZHvikh/K+zMs6eivXn3vUdEVERaliatxVYReV/2/bK4xfQAAANUSURBVH1GRA4128YiW6r9Lfy+iHxfRKayfw9XtcLOrC0PiMhcubowcbgv+1p+IiIXVx1UVUN74AR7fwG8FogBPwbWF93zp8De7M9bgK+F2Nb/BJyT/fmjrbK1Vnuz960AHgOeAIbCaitwPjAFrMo+fnWY31ucoOhHsz+vB2ZaaO9/BC4Gflbm+lXAtwEB3gr8sNqYYfdY2mk5QFVbVfX7qvqb7MMncGp6WkUt7y3AXThrt37bTOOKqMXW/wLcr6ovAqjqXJNtzKcWexXoy/68EvhVE+0rNET1MZxsbDmuAR5ShyeA3xOR11QaM+zC4rYcYE25e1R1CcgtB2g2tdiazwjOt0CrqGpv1uVdq6r/0EzDXKjlvb0AuEBEHheRJ0Rkc9OsK6UWez8DfEBETgCPAtubY5on6v3bbq+S/k5BRD4ADAGXtdqWcohID3AvcF2LTamVCM506J04nuBjIvJmVf11S60qzzBwQFU/JyJvw6njulBVT7faMD8Iu8fSTssBarEVEdkI3A5crarzTbLNjWr2rgAuBH4gIjM4c+vDLQrg1vLengAOq+qiqv5v4Oc4QtMKarF3BPg6gKr+M5DAWaAYRmr62y6gVQGjGoNKEeA54DzOBsHeVHTPxygM3n49xLYO4gT1zm+H97bo/h/QuuBtLe/tZuBg9ufVOK77q0Js77eB67I/r8OJsUgL/x4GKB+8/SMKg7cTVcdr1Qup4wVfhfPt8wvg9uy5O3G+8cFR+keAY8AE8NoQ23oE+FfgR9njcJjf26J7WyYsNb63gjN1SwM/BbaE+b3FyQQ9nhWdHwFXtNDWMeBfgEUcz28E+Ajwkbz39v7sa/lpLX8HVtJvGIbvhD3GYhhGG2LCYhiG75iwGIbhOyYshmH4jgmLYRi+Y8JiGIbvmLAYhuE7JixG4GT7jmzK/ny3iHyh1TYZwWKLEI1mcAdwp4i8GmdZw9UttscIGKu8NZqCiPwPoBd4p6qebLU9RrDYVMgIHBF5M/AaYMFEpTswYTECJdtp7Ks4XchebnEDJqNJmLAYgSEi5wDfBG5R1WmcNpd3tNYqoxlYjMUwDN8xj8UwDN8xYTEMw3dMWAzD8B0TFsMwfMeExTAM3zFhMQzDd0xYDMPwnf8PjhOb3f4z2pkAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot original dataset\n", "plt.scatter(x,y,marker='o',s=20,color='black')\n", "# Make a prediction of the dataset using just 1 of the 2 principal components\n", "x1 = xmu + pc1[:]*v1[0]\n", "y1 = ymu + pc1[:]*v1[1]\n", "# Plot the prediction, which roughly models the original dataset along the principal eigenvector\n", "# This is just a simple 2D example -- this technique is more powerful in higher dimensions\n", "plt.scatter(x1,y1,marker='o',s=20,color='blue')\n", "# Complete the plot\n", "plt.xlabel(r'$x$')\n", "plt.ylabel(r'$y$')\n", "plt.xlim(xmin,xmax)\n", "plt.ylim(ymin,ymax)\n", "plt.gca().set_aspect('equal', adjustable='box')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Activity\n", "\n", "Perform a Principal Component Analysis on the provided dataset of SDSS quasar magnitudes. How many principal components are needed to explain 90% of the variance?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Interpolation\n", "\n", "We may wish to use our model to predict outcome values in between the positions of our data points (\"**interpolation**\"). There are various possible approaches to this, depending on what assumptions we want to make about the properties of the interpolating function.\n", "\n", "Let's consider the following example:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-10.0, 15.0)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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a9YMgPHjx/P+++9Hp8r+7LPPWL58eXRStmnTpvH444/H7WeVxLNo0SKeeuopfeGIsXA4zMknn8x9993nd5Q66QzzgIhEIqSkpLBlyxaysrJ48MEHueGGG9i9ezf3338/11xzDVlZWTFZt3MuOvRw6aWXkpKSEj3O/I033qBPnz40bdo0JuuWxLRz587oFxSJnSeffJIzzzyT0047LabrOZJDdVUePotEIgwcOJCePXsybdo0nHPcfffdXHLJJZxxxhm+ZNqzZw9NmzZl27ZtdOjQgQkTJgT224/Ez+7du/n222/p0KGD31GknmlK9gTx7LPPcscddwCQkpJCz549yc7OBmqOspgyZYpvxQFEtzKOP/54Xn75ZW644QYAPv74Y2666Sa2b9/uWzbxzx//+Ee6dOmi//5xtnHjRqZMmRK46V80q249CofD5OXlUVBQQFZWFrm5uWRkZLBr1y4WL15Mbm4uAP/3f//H22+/TXV1NampqUybNs3n5HUzMwYOHBi9//bbbzN37lzuueceH1OJX/77v/+bjh07JtTMr8lgxYoV3HvvvVxyySUxH77yQsNW9WT58uXk5OQQiUQoLS2lefPmpKSk8PLLL/PBBx8wduxY1q5dS9euXamqqvL1qmFHo6SkhPT0dACuueYazjzzTMaMGeNzKpHkVVFRwc6dO2nbNnZTC2rYyifhcJicnBzC4XD0KKmysjJKSkrIycnhoosu4t1336VLly4ACVscQLQ4ysvL2bZtW0Jd+UyOzIsvvsjVV1/N7t27/Y7SIO27TkrQqDzqwdy5c9mzZ0+dz0UiEV555RV69+6dVCdTNWvWjJdffplJkyYB8Prrr3P99dcTDoeBmkKdOXMmt99+OzNnzow+Lonniy++YN26dTRv3tzvKA1WdXU1ubm5TJ482e8oUYn7FdhnhYWFfPrpp+Tk5LBhw4boSXwHKi0tpbCwMM7p4sPMooW4Zs0a3nzzTVJTU38whBcKhZgwYQL5+fn069fP59Ti1bhx4xg7diypqal+R2mwUlNTad68efT8rCBQeXiwadOm6Ml4d999N6+88gpbt24lKyuL5s2bU1ZW9oP3hEIhOnXqFOek8Td+/HhuvPFG9u7dy5AhQ6LTowDRobycnByKioqiQ18SbJs2bWL79u307t1bxREAzzzzjN8RvkfDVj+isrIyenjcww8/zCmnnMK2bdsAuOeee3j//fdJTU0lNzf3oL9cKSkp0aOskl3Tpk3Jy8s76FZYJBIhLy8vzqnkSE2ePJlBgwZpX0fArFu3zu8IgMrjeyKRSHTaj7feeotWrVrx9ttvA3D++efzyCOPRM+ByMrKip4slZGRQX5+PhkZGYRCIaBmi2Pf4w3pm3ZBQcFBJ11M5iG8ZPTwww/zr3/9i2OOOcbvKFJrzpw5nHrqqfznP//xO0rwh63M7AJgOpAKzHTO1cupzs45ioqKMDPatWtHUVERXbt2ZerUqYwaNYrs7Gx+9atf0bJlSwA6d+5M586dD7q8fv36UVRURF5eHoWFhXTq1Inc3NwGVRxQU6qhUCg6VLW/hjKEl+gqKytp1KgRxxxzDAMGDPA7juznwgsvZPr06dHhcz8F+jwPM0sFPgUGA18C7wFXOOc+ruv1B57nUVxcTHV1dfQwtwceeICTTz6ZESNGUFVVRXp6Orfccgv3338/zjnGjRvHiBEj6N+/f8x/tmQVDodp3759nUdXZWRkaJ9HArjrrrtYsWIFS5YsCdQOWomdZDzPow9Q6Jzb6JyrBJ4Dhh3sxevXr+eXv/xl9H7//v259dZbo/dnzpzJ4sWLgZpzLZ555hmuvPJKoObIoYcffljFcZQONYQ3depU3nzzTZ9Tyo/p3LkzPXv2VHEElHOOefPmkZ+f72uOoG95jAAucM5dV3v/KuD/OefG7vea0dRc7ZBjjz32jAceeIBRo0YBNSc3HXfccZxzzjlAzTWXGzVqFN8fooEqKSn5wRBeJBKhd+/eDB06NLBTsogEnXOOM844g9atW0e/DB+tpJtV93DKY3+JOKtuQ7Nr1y7S09NJS0ujuLiYVq1aRS9UJf564YUXcM4xfPjwpDqhNRlt3ryZdu3a1dtsFck4bLUF2H/+5xNqH5ME1bJlS9LS0igvL2fAgAGMHj3a70hS68knn+TBBx8kyF8opcaJJ57o+zRHQS+P94AsMzvZzBoDI4H5PmeSetCsWTOuu+46fv3rX/sdRWrl5+fzz3/+U1uCCWLZsmX06tWLr7/+2pf1B/r/EudcFTAWWAx8AvzdOfeRv6mkvowfPz56KOiLL77IZ5995nOihunTTz+lvLyctLQ0MjMz/Y4jh2nflRyLiop8WX+g93l4pX0eiamkpIROnToxYMAA5s6d63ecBqWqqoouXbpwyimnsGjRIr/jiE+OZJ9H4E8SlOSXnp7O66+/Trt27fyO0uCkpaXxxBNP6CjEBFZRUcGuXbvivtUY6GEraTiys7M55phjqKqq4oorrmDBggV+R0p6++ZtGzhwoM5vSlDOOU4//XTGjRsX93WrPCRQwuEwGzZsYPPmzX5HSWqVlZWceeaZPP30035HkaNgZtx5551cf/31cV+3hq0kUI499lhWrFgRHUbZuXNndMeg1J+SkhJat27N8ccf73cUOUrXXnutL+vVlocEzr7i2LRpE9nZ2Tz++OM+J0p8B17ZsVGjRsyfP5+hQ4f6HU3qQXFxMY899lh0KDIetOUhgdW+fXtGjhzJoEGD/I6S0A68smOjRo249dZbWbRoka7smCSWLFnC2LFj6dOnD717947LOnWoriSMxYsXM3jwYJ3E5oFmOW4Y9uzZE91SPxLJOD2JCABvvPEGF1xwAbNnz/Y7SkLJy8s76FCGruyYPJo2bXrExXGkVB6SEM4++2yee+45rrrqKr+jJJSCgoI6L8wFurJjsqmqquKmm27isccei8v6VB6SEMyM3Nxc0tLS+Pbbb7n99tvZs2eP37ECb9+VHeuiKzsml7S0NDZs2MCWLfGZO1b7PCThvPDCC/zqV7/itdde46yzzvI7TqBpn0fD4pw7oun0tc9DGoThw4dTWFgYLY5k+gJU30pKSpg/f/5Br+yo4kgu+4rjm2++ifm6VB6SkDp0qLnMy76tj+3bt/ucKHgqKys577zzePTRRykqKmL69OnccccdTJ8+naKiIh2mm6Seeuop2rVrR3FxcUzXo/M8JKFVVFRQVVWlw3fr0LhxY2677TYyMzNJT0+PXp5Zklv//v2ZOHFizH8ntM9DEl4kEiElJYVIJMLWrVs1Oy9QXl5Os2bN/I4hCUL7PKRB2vcN66677qJnz54x31wPunfeeYdTTjmFlStX+h1FfOKcY+XKlXz44YcxW4eGrSRpXHvttbRs2bLBT/aXmZlJ3759ycrK8juK+KSyspILL7yQIUOGMGfOnJisQ8NWkpQ2bdrE2rVrG9TEf9XV1aSmpvodQwJi5cqVdO3alYyMjEO+VsNWIrV+97vf8Zvf/KbO8xuSUSQS4aqrrmLs2LE6dFkA6Nu372EVx5FSeUhSmjFjBkuXLo3+8jSEf1DbtWvHCSeccEQniUly+ve//82VV14Zk6natc9DklIoFKJbt24AzJo1i9dee42nn36aJk2a+Jys/lVUVNCkSROmTp3aIEpSDt+2bdtYsWIFX3zxBSeddFK9LltbHpL0du7cyY4dO5Jyf8Ds2bPp1q0bRUVFANrqkO8ZMWIEGzZsqPfiAJWHNACTJk0iPz+ftLQ0du/eHdPDF+OtU6dOnH766fzkJz/xO4oEUFpaWvQcqIqKinpdtspDGoR9Wx0TJkzg7LPPjsvcP7G0adMmAM466yz+/ve/J+VwnNSP0tJSTj31VKZOnVqvy1V5SIMyZcoUZs2axbHHHgsk5o70l156iaysLJYuXep3FEkAoVCIiy66iNNOO61el6vykAalbdu2DB8+HIAVK1Zw7rnnsnXrVp9TeTNgwABuu+02TUcvh23q1KlcfPHF9bpMlYc0WDt27GDXrl0JMQfU3r17mTp1KhUVFTRv3pw//elPCZFbgqOsrIzFixfX2/JUHtJgDRs2jNWrV9OiRQuqq6v53//9X7799lu/Y9Vp2bJlTJo0iYULF/odRRLUAw88wJAhQ9i8eXO9LE/lIQ3avkkVV65cyf/8z/+Qn5/vc6Lv+/rrrwEYNGgQH3zwQXTITcSr0aNH8/rrr0evhXO0VB4i1By1tHbtWkaOHAnUXGTq888/9zXTX/7yF04++WQKCgoAOP30033NI4mtbdu29O/fv97OBVJ5iNTKzs7GzKiurua6667z7eJJVVVVAJx77rlcffXVZGZm+pJDks+ePXu455576mX4U+UhcoDU1FRef/11HnvsMQC+/fZb7rvvvrhMsnj99ddz5ZVXAtC+fXseffRRjjnmmJivVxqGxo0b89e//pU333zzqJelua1E6nDiiSdGby9cuJA777yT888/nx49elBVVUVa2uH/6oTDYfLy8igoKCArK4vc3NzvzXa6bt06OnfujJnRsWNHysrKcM5pqhGpdykpKaxZs4ZQKHTUy9L1PEQOQ2FhIZ06dQJg3LhxfPrpp7z88suHfN/y5cvJyckhEolQWlpKKBQiJSWFl156ibPPPpvnn3+eyy+/nHfeeYc+ffrE+scQiaqsrKRx48ZAkl3Pw8wmm9kWM/tP7Z8cvzNJw7WvOABOPfVUsrOzo/evueaa7039sHHjRnbs2EE4HGbIkCGEw2FKS0uBmqkiwuEw5513HiUlJZx33nlMmzZNV/2TuJo9ezYdOnQ4qkPTgz5s9ZBzrn4nZBE5SjfccEP0tnOOsrKy7/0S9unThyuuuIJu3bod9DoKzjny8vIYNWoUEyZMiHlmkf2ddtppXHzxxZSXl9OiRYsjWkbQy0Mk0MyMf/zjH9H7kUiERx99lI4dO/L8889TVlZW5/sqKiooLCyMV0yR7+nZsydPPfXUUS0j6OUx1syuBlYBE51zP5gK1cxGA6Ph+zs5RfyQkpISPVfkgw8+IBQKRYes9hcKhb43FCbih8LCQiorK4/ovb7uMDezpUCbOp76HbAS2AE4YArQ1jn32x9bnnaYS5CEw2Hat29f5yG+GRkZFBUVkZ6e7kMyEaiuruaEE06gT58+zJ8/3/MOc1+3PJxzgw7ndWb2FKBJfSShZGRkkJ+fX+fRVvn5+SoO8VVqaip/+9vfyM7OZv78+Z7fH9hhKzNr65z7qvbupcBaP/OIHIl+/fpRVFREXl5e9HDf3NxcFYcEwoABA474vYEtD+B+M+tOzbDVJmCMv3FEjkx6erpvU52IxEpgy8M5d5XfGUREpG6BPUlQRESCS+UhIiKeqTxERMQzlYeIiHim8hAREc9UHiIi4pnKQ0REPFN5iIiIZyoPERHxTOUhIiKeqTxERMQzlYeIiHim8hAREc9UHiIi4pnKQ0REPFN5iIiIZyoPERHxTOUhIiKeqTxERMQzlYeIiHim8hAREc9UHiIi4pnKQ0REPFN5iIiIZyoPERHxTOUhIiKeqTxERMQzlYeIiHim8hAREc9UHiIi4pnKQ0REPFN5iIiIZyoPERHxTOUhIiKeqTxERMQzX8vDzC43s4/MLGJmvQ547k4zKzSz9WZ2vl8ZRUTkh9J8Xv9a4DLgyf0fNLMuwEigK9AOWGpmP3POVcc/ooiIHMjXLQ/n3CfOufV1PDUMeM45V+Gc+wwoBPrEN52IiByM31seB9MeWLnf/S9rH/sBMxsNjK69W2Fma2OcLVG0Anb4HSIg9Fl8R5/Fd/RZfKez1zfEvDzMbCnQpo6nfuecm3e0y3fOzQBm1K5rlXOu1yHe0iDos/iOPovv6LP4jj6L75jZKq/viXl5OOcGHcHbtgAd9rt/Qu1jIiISAEE9VHc+MNLMmpjZyUAW8K7PmUREpJbfh+peamZfAr8AXjKzxQDOuY+AvwMfA4uAmw7zSKsZMQubePRZfEefxXf0WXxHn8V3PH8W5pyLRRAREUliQR22EhGRAFN5iIiIZ0lTHmZ2Qe1UJoVmdoffefxiZh3M7N9m9nHt1C/j/M7kJzNLNbM1ZrbQ7yx+M7OWZva8ma0zs0/M7Bd+Z/KLmY2v/f1Ya2Zzzayp35nixcyeNrPi/c+JM7PjzOwVMyuo/fvYQy0nKcrDzFKBx4AhQBfgitopThqiKmCic64L0Be4qQF/FgDjgE/8DhEQ04FFzrlsoBsN9HMxs/bALUAv59zPgVRqpkNqKJ4FLjjgsTuAV51zWcCrtfd/VFKUBzVTlxQ65zY65yqB56iZ4qTBcc595Y9zoswAAALESURBVJx7v/Z2mJp/IOo8Oz/ZmdkJwIXATL+z+M3MWgD9gVkAzrlK59wuf1P5Kg1oZmZpQHOgyOc8ceOcewPYecDDw4DZtbdnA5ccajnJUh7tgS/2u3/Q6UwaEjP7KdADeMffJL75M3AbEPE7SACcDGwHnqkdxptpZiG/Q/nBObcFmApsBr4CvnXOLfE3le8ynXNf1d7eCmQe6g3JUh5yADNLB14AbnXO7fY7T7yZ2VCg2Dm32u8sAZEG9ASecM71AEo5jKGJZFQ7nj+MmkJtB4TM7Ep/UwWHqzl/45DncCRLeWg6k/2YWSNqiuOvzrkX/c7jk7OAi81sEzXDmOea2Rx/I/nqS+BL59y+rdDnqSmThmgQ8Jlzbrtzbi/wInCmz5n8ts3M2gLU/l18qDckS3m8B2SZ2clm1pianV/zfc7kCzMzasa1P3HOPeh3Hr845+50zp3gnPspNf8/vOaca7DfLp1zW4EvzGzf7KkDqZnBoSHaDPQ1s+a1vy8DaaAHD+xnPnBN7e1rgENOWhvUKdk9cc5VmdlYYDE1R048XTvFSUN0FnAV8KGZ/af2sbucc/k+ZpJguBn4a+0XrI3Ab3zO4wvn3Dtm9jzwPjVHJ66hAU1VYmZzgXOAVrXTQ/0BuA/4u5mNAj4HfnnI5Wh6EhER8SpZhq1ERCSOVB4iIuKZykNERDxTeYiIiGcqDxER8UzlISIinqk8RETEM5WHSAzVXltlcO3tP5rZI35nEqkPSXGGuUiA/QG418yOp2aG44t9ziNSL3SGuUiMmdkyIB04p/YaKyIJT8NWIjFkZqcBbYFKFYckE5WHSIzUTm39V2quHVFiZgde+lMkYak8RGLAzJpTc52Iic65T4Ap1Oz/EEkK2uchIiKeactDREQ8U3mIiIhnKg8REfFM5SEiIp6pPERExDOVh4iIeKbyEBERz/4/ZJx92ZBYN84AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Set range of plot\n", "xmin,xmax = 0.,10.\n", "ymin,ymax = -10.,15.\n", "# Fine grid of x-values for the underlying model\n", "xmod = np.linspace(xmin,xmax,100)\n", "# The underlying model is y = x * sin x\n", "ymod = xmod*np.sin(xmod)\n", "# Sample a dataset from the underlying model\n", "xp = np.array([1.,3.,5.,6.,7.,8.])\n", "yp = xp*np.sin(xp)\n", "# Plot the underlying model and the dataset\n", "plt.plot(xmod,ymod,color='black',linestyle='dotted')\n", "plt.scatter(xp,yp,marker='o',s=50,color='black')\n", "plt.xlabel(r'$x$')\n", "plt.ylabel(r'$y$')\n", "plt.xlim(xmin,xmax)\n", "plt.ylim(ymin,ymax)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Linear interpolation and cubic spline interpolation:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-10.0, 15.0)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from scipy import interpolate\n", "# Reconstruct the function between the data points using linear interpolation\n", "flin = interpolate.interp1d(xp,yp,kind='linear',bounds_error=False,fill_value='extrapolate')\n", "ylin = flin(xmod)\n", "# Reconstruct the function between the data points using cubic spline interpolation\n", "tck = interpolate.splrep(xp,yp)\n", "ycube = interpolate.splev(xmod,tck)\n", "# Compare these reconstructions to the underlying model\n", "plt.plot(xmod,ymod,color='black',linestyle='dotted',label='Original function')\n", "plt.scatter(xp,yp,marker='o',s=50,color='black',label='Dataset')\n", "plt.plot(xmod,ylin,color='red',label='Linear interpolation')\n", "plt.plot(xmod,ycube,color='blue',label='Cubic spline')\n", "plt.legend()\n", "plt.xlabel(r'$x$')\n", "plt.ylabel(r'$y$')\n", "plt.xlim(xmin,xmax)\n", "plt.ylim(ymin,ymax)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These approaches don't provide an error in the interpolation.\n", "\n", "Another approach is to model the function using a **Gaussian process** (which is also known as **kriging** in some fields). In so doing, we're imposing a statistical model for the correlations in the function (a \"smoothness prior\").\n", "\n", "Here is an implementation of a Gaussian process for the above dataset:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-10.0, 15.0)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from sklearn.gaussian_process import GaussianProcessRegressor\n", "from sklearn.gaussian_process.kernels import RBF,WhiteKernel,ConstantKernel\n", "# Set up the kernel for the Gaussian process\n", "kernel = ConstantKernel(1.)*RBF(1.)\n", "# Create the Gaussian process\n", "gp = GaussianProcessRegressor(kernel=kernel,n_restarts_optimizer=10)\n", "xp2 = xp.reshape(-1,1)\n", "gp.fit(xp2,yp)\n", "# Sample the Gaussian process and confidence interval at each value of x\n", "xmod2 = xmod.reshape(-1,1)\n", "ygp,ygperr = gp.predict(xmod2,return_std=True)\n", "# Plot the result\n", "plt.plot(xmod,ymod,color='black',linestyle='dotted')\n", "plt.scatter(xp,yp,marker='o',s=50,color='black')\n", "plt.fill_between(xmod,ygp-ygperr,ygp+ygperr,color='red',alpha=0.5)\n", "plt.plot(xmod,ygp,color='red')\n", "plt.xlabel(r'$x$')\n", "plt.ylabel(r'$y$')\n", "plt.xlim(xmin,xmax)\n", "plt.ylim(ymin,ymax)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A Gaussian process can also propagate **noise** in the data into an **error in the prediction**:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-10.0, 15.0)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Create a noisy dataset sampled from the model y = x * sin x\n", "sig = 1. # value of standard deviation\n", "nx = 20 # number of data points to sample\n", "dx = (xmax-xmin)/nx\n", "xn = np.linspace(xmin+0.5*dx,xmax-0.5*dx,nx) # x-values of the data points\n", "yn = xn*np.sin(xn) + sig*np.random.normal(size=nx) # y-values are the model plus noise\n", "# Kernel for the Gaussian process including noise (which is defined as a variance)\n", "kernel = ConstantKernel(1.)*RBF(1.) + WhiteKernel(sig**2)\n", "# Create the Gaussian process\n", "gp = GaussianProcessRegressor(kernel=kernel,n_restarts_optimizer=10)\n", "xn2 = xn.reshape(-1,1)\n", "gp.fit(xn2,yn)\n", "# Sample the Gaussian process and confidence interval at each value of x\n", "xmod2 = xmod.reshape(-1,1)\n", "ygp,ygperr = gp.predict(xmod2,return_std=True)\n", "# Plot the result\n", "plt.plot(xn,yn,marker='o',markersize=5,color='black',linestyle='None')\n", "plt.errorbar(xn,yn,yerr=np.repeat(sig,nx),color='black',capsize=2.,linestyle='None')\n", "plt.fill_between(xmod,ygp-ygperr,ygp+ygperr,color='red',alpha=0.5)\n", "plt.plot(xmod,ygp,color='red')\n", "plt.xlabel(r'$x$')\n", "plt.ylabel(r'$y$')\n", "plt.xlim(xmin,xmax)\n", "plt.ylim(ymin,ymax)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Activity\n", "\n", "Let's return to the supernova distance-redshift dataset from Class 3. _Fit a Gaussian process model to this dataset to predict the distance modulus and its error at any redshift_" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "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.6" } }, "nbformat": 4, "nbformat_minor": 2 }