{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Using optimization routines from `scipy` and `statsmodels`" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import scipy.linalg as la\n", "import numpy as np\n", "import scipy.optimize as opt\n", "import matplotlib.pyplot as plt\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "np.set_printoptions(precision=3, suppress=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using `scipy.optimize`\n", "----\n", "\n", "One of the most convenient libraries to use is `scipy.optimize`, since it is already part of the Anaconda installation and it has a fairly intuitive interface." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from scipy import optimize as opt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Minimizing a univariate function $f: \\mathbb{R} \\rightarrow \\mathbb{R}$" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def f(x):\n", " return x**4 + 3*(x-2)**3 - 15*(x)**2 + 1" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAD8CAYAAAB6paOMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3Xl8VPW9//HXJ5ON7AnZIAthSYAQtgABteJGFaiKyq8q1luXVrrYW+tSq/VWa7WtS69LvViLFiutLaJoqy2o4IooyB7WkBAIIQSSQMhK1vn+/pjBppYlYSY5M3M+z8djHs6cOcn5gGHeOd9VjDEopZSyryCrC1BKKWUtDQKllLI5DQKllLI5DQKllLI5DQKllLI5DQKllLI5DQKllLI5DQKllLI5DQKllLK5YKsL6I7ExESTlZVldRlKKeVX1q9fX2OMSTrdeX4RBFlZWaxbt87qMpRSyq+ISFl3ztOmIaWUsjkNAqWUsjkNAqWUsjkNAqWUsjkNAqWUsjkNAqWUsjkNAqWUsjkNAqWU8lFL1u9n8bryXr+OBoFSSvkgYwzzPizh75sqev1aGgRKKeWDiqsaKa1uYkbegF6/lgaBUkr5oKVbKhGBS0al9vq1NAiUUsoHLdtykIKsBJKiw3r9WhoESinlY0qqGik61MDM0b3fLAQaBEop5XPe3loJ9E2zEGgQKKWUz1m65SATBsWTGhveJ9fTIFBKKR+yt6aJ7ZX1zMjrm7sB0CBQSimfsmzrQQBm9FH/AGgQKKWUT/nnlgOMTY8lLa5fn11Tg0AppXxE8aEGtlbUc/m4tD69rgaBUkr5iNc3VuAIEi4fO7BPr6tBoJRSPsDpNPx9YwVTsxP7ZBJZVxoESinlA1bvOcyBuhauzE/v82trECillA94Y0MFUWHBXJyb0ufX1iBQSimLHWvrZNnWg8zISyU8xNHn19cgUEopiy3fcYjG1g6uzO/b0ULHaRAopZTF3tiwn4Gx4UwZ3N+S62sQKKWUhQ4cPcZHu6q5Mj+NoCCxpAYNAqWUstCiteUY4NpJmZbV4HEQiEiGiHwgIttFZJuI3OY+niAiy0Wk2P3fePdxEZHfikiJiBSKSL6nNSillD/q6HTyytp9nJ+TREZChGV1eOOOoAO40xiTC0wBbhWRXOAe4D1jTDbwnvs1wAwg2/2YC/zOCzUopZTfeW9nFYfqW7lu8iBL6/A4CIwxlcaYDe7nDcAOIA2YBbzkPu0l4Ar381nAQuOyGogTkb5bZk8ppXzEy2v2MSA2nAuGJ1lah1f7CEQkCxgPrAFSjDGV7rcOAsdnSaQB5V2+bL/72Je/11wRWSci66qrq71ZplJKWW7f4WY+3lXNtZMyCXZY213rtauLSBSwBPiRMaa+63vGGAOYnnw/Y8x8Y8xEY8zEpCRr01Ippbztr2v34QgSrpmUYXUp3gkCEQnBFQIvG2Nedx8+dLzJx/3fKvfxCqDrnzzdfUwppWyhpb2TxWvLuXBEcp9tR3kq3hg1JMAfgB3GmCe6vPUmcIP7+Q3A37sc/6Z79NAUoK5LE5JSSgW8NzZWcLipjZvPGWx1KQAEe+F7nAP8F7BFRDa5j/0UeARYLCLfAsqAq93vLQVmAiVAM3CTF2pQSim/4HQanl9Zyui0WKYMSbC6HMALQWCM+QQ42XS4i05wvgFu9fS6Sinlj97fWUVpdRO/nTMeV4OK9XRmsVJK9aH5K0tJi+vHzLxUq0v5ggaBUkr1kU3lR/l8zxFu/spgy4eMduU7lSilVIB7/uNSosODfWLIaFcaBEop1Qd2VzeybGsl35g8iKgwb4zT8Z6ADoKjzW38aukO1pcdsboUpZTNPbWimPAQB7ec6xtDRrsK6CAIdgQx/+NSVpdqECilrFN0sIF/FB7ghrOz6B8VZnU5/yGggyAqLJjUmHB2VzdaXYpSysaeXL6LyNBg5p47xOpSTiiggwBgSFIku6ubrC5DKWVTWyvqeHvbQW7+ymDiI0OtLueEAj4IhiZFUVrdiGsem1JK9a0nl+8iJjyYb33F9/oGjgv4IBiSFElDSwc1jW1Wl6KUspnP9xzhvZ1VzJ06hNh+IVaXc1IBHwRDk6IAtJ9AKdWnOp2Gn7+5jYGx4XzrK77ZN3BcwAfBkKRIAEq1n0Ap1YdeWVvO9sp67p05kn6hDqvLOaWAD4KBsf0IDwnSOwKlVJ+pa27nN+8WUZCVwKVjfH8n3oAPgqAgYXCiq8NYKaX6wtPvFVPb3Mb9l+X6zAqjpxLwQQAwVIeQKqX6yI7KehZ+tpdrJ2WSlxZrdTndYosgGJIUxf7aZlraO60uRSkVwNo7nfz4tc3ERYTw40uGW11Ot9kiCIYmReI0UHa42epSlFIB7Pcf7WZrRT0PX5FHgo9OHjsRmwSBawip9hMopXpL0cEGnn6vmEvHDGB6nu93EHdliyAYnOgaQqojh5RSvaGj08ldr24mJjyEBy8fZXU5PeZbi2L3ksiwYAbEhutcAqVUr/jNu7vYUlHHs9/I98nVRU/HFncE4Goe0jsCpZS3Ld9+iOc+2s11kzOZOdq/moSOs00QDEmKpLS6SRefU0p5TdnhJu5YvInRabHcf2mu1eWcMdsEwdCkKBpaO6huaLW6FKVUAGhp7+R7f95AkAjPfiOf8BDfXkbiVGwTBMfXHNKJZUopT3U6DT9atIntlfU8cfVYMhIirC7JI7YJAl2FVCnlDca4VhV9e9tBfnZpLheNTLG6JI9ZFgQiMl1EikSkRETu6e3rDYgNJyLUQUmVBoFS6sw9++Fu/rS6jO9MHeLTm830hCVBICIOYB4wA8gF5ohIr/a0iAjZyVEUVzX05mWUUgHspU/38vg7RVw5Po2fTB9hdTleY9UdQQFQYowpNca0AYuAWb190eyUaHYd0jsCpVTPGGOY90EJD7y5ja/mpvDo7DEEBfn+qqLdZVUQpAHlXV7vdx/rVTkpUVQ3tHK0WbetVEp1jzGGR97e+cWdwLPfyCc0OLC6V332TyMic0VknYisq66u9sr3zE6JBtC7AqVUtzS3dfCjVzbx+49K+a8pg/jfr48lxOGzH5tnzKolJiqAjC6v093HvmCMmQ/MB5g4caJXZoHlfBEEDRQMTvDGt1TKL7R1ODlU38LB+hYO1bfQ0NJBY0sHTW0dOJ2G4//AwkMcRIQ6iAwNJi4ihP5RYSRFhZESG0ZYsP+Okz8Te2qa+O6f1rOrqoG7Ls7h1guG+cUmM2fCqiBYC2SLyGBcAXAtcF1vX3RgbDiRoQ6KD2mHsQpchxtbWVdWy+byo+w61EhxVQP7jjRzqkn1xz/fTnVOSkwY6fERDOofwbDkKIYmRTE8JZrMhIiAai83xvBWYSX3vb4Fh0N46aYCpuYkWV1Wr7IkCIwxHSLyA+AdwAEsMMZs6+3rigjDUqIp1iGkKoC0tHfy6e4a3t9ZxaqSw+ypcU2aDA4SBidGkpcWyxXj0kiL60dqbDjJMWHE9gshKiyYyNDgLz7EjTG0dTppbu2kqa2D2qZ2appaqW5opfJoC/trm9lfe4xPSw7z+oZ/3cBHhjoYnhpNXloso9NiGZsRx9CkKBx+GA77a5v52d+28kFRNWMz4ph33XjS4/17slh3WLb6qDFmKbC0r6+bkxzFB0Xe6XNQyiqtHZ18WFTNGxsq+HBXFS3tTiJCHZw9tD/XTMpg4qB48tJie7TsgYgQFuwgLNhBfGQo6fEnP7ehpZ3S6iaKDjawvbKe7QfqWbJ+Pws/KwNc4TAmPY7xmXGMz4wnPzPOp1flbGzt4KVP9zLvgxIAfnZpLjeeneWXYXYmbLEMdVc5KdG8un4/tU1txPvRDkJKgWtzpYWflfHGxgrqjrWTGBXGNRMzuGhkCpOHJPRZO350eAhjM+IYmxH3xTGn01Ba00Th/qNsLj/KxvKjzP+4lA6nq71pcGIk+ZnxTBjkemQnR1nepNTY2sHCz/by/Mel1Da3M21kCj+/PNcWdwFd2S4IslNcS03sOtTA5CH9La5GqdMzxrCq5DAvfFLKh0XVhDiEGXkDuCo/ja8MSyTYR0axBAUJw5KjGJYcxVX56YCr2WpLRR3ry2pZX1bLB0VVLNmwH4DosGDGZrjuGsZlxDE6PZbk6PBer9MYw7qyWhavLeefWyppbuvkguFJ3DYth3Fdgs1ObBcEX4wcqmrUIFA+zRjDJyU1PLWimPVltSRFh3H7tBzmTM7okw9MbwgPcTApK4FJWa5ResYYyg43s76slg37atlUfpRnP9xNp/uuISUmjNFpsYxIjWF4ajQjUqPJ7B/h8Z1OdUMra/YcZuWuGlYWV3OgroXIUAeXjRnIdZMz/+3Oxo5sFwQDYsOJDgvWkUPKp20uP8rD/9zO2r21DIwN5+Er8vj6xHS/H8IpImQlRpKVGMnsCa67hua2DrZW1LOloo6tFXVsqajjg6LqL8JBBAbG9iMrMYKUmHCSo8NJjg4jOjyYyLBg+oU6wECH09DR6aS2uZ2aRlcnd2lNI0UHG6hpdE0ijQ4P5pyhidxxcQozR6cSEWq7j8ATst3fgmvkUBS7NAiUDzpY18Jj7+zk9Q0VJEaF8tAVeVwdAAFwKhGhwRQMTvi3uT0t7Z3srm6k+FAje2qaKDvcRNmRZtaUHqGqoYX2ztNPLYrtF0JW/wguHJHM8NQYxmXEMTY91mea0nyJ7YIAICc5mhU7DlldhlJf6HQa/ry6jMfe3kl7p+F75w/l++cPJTo8xOrSLBEe4mDUwFhGDYz9j/ecTkPdsXYaW10T4prbOhEgOCiIYIcQ2y+E/lGhAR2e3mbLIMhOieKVdeUcbmz16SFtyh52HWrgniWFbNh3lKk5STw8K4/M/vYatdITQUFCfGSojvrzIlsGQU6XNYfO0iBQFnE6DQtW7eGxt4uIDHPw5DVjuWJcWsAuY6B8l62DoLiqgbOG6sgh1fcO1bdw16ubWVlcw1dzU3jkqtF6d6osY8sgSIkJIyY8mKKD2mGs+t7K4mp++NeNHGvv5FdXjmZOQYbeBShL2TIIRIQRqTHs1CBQfcjpNPzuo93877tFDEuO4tlvTGBYcpTVZSllzyAAGDkgmtfW78fpNJZPc1eBr7G1gzte2cS72w9x2diBPDp7tI5hVz7Dtj+JIwfE0NTWSXltM4P6R1pdjgpgB44e4+Y/rqW4qpH7L83lpnOytClI+RRbBwHAjsp6DQLVawr3H+VbL62jpa2TF2+cFPDr2iv/ZNspdsNTowkS2F6p/QSqd7y/8xBX//4zQh1BLPn+2RoCymfZ9o4gPMTB4MRIdlTWW12KCkBvbNzPXa8WMnJANC/eWEBStA4NVb7LtncE4Goe0iBQ3vbiqj3c/spmCrIS+OstUzQElM+zfRDsrz1GfUu71aWoADHvgxIefGs7l4xK4cWbJtl2rSDlX2weBK4ZxjqxTHnD0yuKefydIq4cn8a86/J7tE2kUlayeRD8a+SQUmfKGMOTy3fx5IpdzM5P5zdfH6tLHSu/Yuuf1tSYcOIiQjQIlEeeeb+Ep98r5uqJ6Tz+/8bYZsNzFThsHQQiwsjUGB1Cqs7YCytLeWK5607gkavG6Cx15ZdsHQTgah4qOlj/xbZ4SnXXXz/fx8P/3MHM0ak8Onu0hoDyWxoEA6JpaXey93CT1aUoP/KPwgP89I0tnD88iaeuGa99Asqv2f6nVzuMVU99uruGO17ZzMRB8Tx3/QRCg23/z0j5Odv/BGenRBEcJBoEqlu2H6jnOwvXk5UYwQvfnKRDRFVA8CgIRORxEdkpIoUi8oaIxHV5714RKRGRIhG5pMvx6e5jJSJyjyfX94awYAfDkqPYdkCDQJ3a/tpmbnzxcyLDgvnjTQXERuhkMRUYPL0jWA7kGWPGALuAewFEJBe4FhgFTAeeFRGHiDiAecAMIBeY4z7XUnlpsWytqMMY7TBWJ1bf0s7Nf1zLsfZOXrq5gIFx/awuSSmv8SgIjDHvGmM63C9XA+nu57OARcaYVmPMHqAEKHA/SowxpcaYNmCR+1xLjU6LpaaxjYP1LVaXonxQR6eTH/xlI6XVTTx3/QSGp0ZbXZJSXuXNPoKbgWXu52lAeZf39ruPney4pfLSYgEo3F9ncSXK1xhjePCt7Xy8q5qHr8jjnGGJVpeklNedNghEZIWIbD3BY1aXc+4DOoCXvVWYiMwVkXUisq66utpb3/aEcgfE4AgStlZoEKh/99Kne/nT6jK+M3UI1xZkWl2OUr3itPsRGGOmnep9EbkRuBS4yPyrkb0CyOhyWrr7GKc4/uXrzgfmA0ycOLFXG+/7hTrITo5iiwaB6uLTkhoe+ucOpo1M4SfTR1hdjlK9xtNRQ9OBu4HLjTHNXd56E7hWRMJEZDCQDXwOrAWyRWSwiITi6lB+05MavGV0Wixb9muHsXIpP9LM9/+ygSGJkTx5zVidNawCmqd9BP8HRAPLRWSTiDwHYIzZBiwGtgNvA7caYzrdHcs/AN4BdgCL3edabnR6LIeb2qis0w5ju2tu6+CWhetwOg3Pf3Oi7imgAp5HW1UaY4ad4r1fAr88wfGlwFJPrtsbunYY69BA+zLGcPdrhew61MCLNxWQlRhpdUlK9Trbzyw+TjuMFcCCVXv5R2ElP75kBOfpZvPKJjQI3MJDtMPY7tbuPcKvl+7g4twUvnveEKvLUarPaBB0MTotli06w9iWqhpauPXlDaTH9+M3V49FRDuHlX1oEHQxJj2WI01tHNAOY1vpdBp++NeN1Le087vrJxCjncPKZjQIujjeYbxFZxjbytPvFbO69AgPzcr7YllypexEg6CLke4O4y0VR60uRfWRVSU1PPN+MbPz0/n6xIzTf4FSAUiDoIvwEAc5KdG65pBNVDW0cNuiTQxNiuKhK0ZZXY5SltEg+JJxGXFsKj+KU/cwDmhOp+H2VzbR2NrOvOvyiQj1aEqNUn5Ng+BL8jPjaGjpYHd1o9WlqF70+49LWVVymAcuG6XLSivb0yD4kvxB8QBs2FdrcSWqt2wqP8r/vlvEzNGpXDtJ+wWU0iD4ksH9I4ntF8LGfdphHIgaWzu4bdFGUmLC+fWVY3S+gFJ4uNZQIAoKEsZnxukdQYC6/29bKT/SzCvfOUv3HFbKTe8ITmB8RjzFVY3Ut7RbXYryorc2H+D1jRX84MJsJmUlWF2OUj5Dg+AE8gfFYQxsLtfmoUBRWXeM+97YwriMOH544UkXzVXKljQITmBsRhwisKFMgyAQOJ2Gu17dTHun4clrxhHs0B97pbrSfxEnEBMeQnZyFBvLtZ8gECxYtYdVJYe5/7JcBuv+Akr9Bw2Ck8jPjGfjPp1Y5u92HWrgsXeKmDYyWYeKKnUSGgQnkZ8ZT92xdkprmqwuRZ2h9k4ndyzeRFRYMI/M1qGiSp2MBsFJjM+MA2CjDiP1W8+8X8LWinp+dWUeiVFhVpejlM/SIDiJoUlRxIQHs0EnlvmlzeVHmfdBCVeNT2N63gCry1HKp2kQnERQkDAuM571ZUesLkX1UEt7J3cs3kRydBgPXK6riip1OhoEp1CQFc+uQ40caWqzuhTVA08s38Xu6iYenT2G2H46e1ip09EgOIXJQ/oDrk3NlX9YX3aE51eWct3kTKbmJFldjlJ+QYPgFMakxxIWHMSaUg0Cf3CsrZO7Xi1kYGw/fjpzpNXlKOU3dNG5UwgLdpCfGc+aPYetLkV1w2/eLWJPTRMvf3syUWH6o61Ud+kdwWkUDE5ge2W9LkDn49btPcKCVXu4fkom5wxLtLocpfyKV4JARO4UESMiie7XIiK/FZESESkUkfwu594gIsXuxw3euH5vmjwkAWNcHzTKN7W0d3L3a64moXtnaJOQUj3lcRCISAZwMbCvy+EZQLb7MRf4nfvcBOABYDJQADwgIvGe1tCb8jPjCXGI9hP4sCeW76K0xjVKKFKbhJTqMW/cETwJ3A10XZRnFrDQuKwG4kRkAHAJsNwYc8QYUwssB6Z7oYZeEx7iYGx6HGv2aBD4oo37anlhZSlzCjL4SrY2CSl1JjwKAhGZBVQYYzZ/6a00oLzL6/3uYyc77tMmD0lgS0UdTa0dVpeiumjt6OTHrxWSEhPOvTpKSKkzdtogEJEVIrL1BI9ZwE+B+3ujMBGZKyLrRGRddXV1b1yi2yYP7k+n07C+TNcd8iXPvFdCSVUjv7pqNDHhOnFMqTN12iAwxkwzxuR9+QGUAoOBzSKyF0gHNohIKlABdF3zN9197GTHT3Td+caYicaYiUlJ1k4Myh8UjyNIdBipD9l2oI7ffbSbq/LTuGB4stXlKOXXzrhpyBizxRiTbIzJMsZk4WrmyTfGHATeBL7pHj00BagzxlQC7wAXi0i8u5P4YvcxnxYVFkxeWqx2GPuIjk4nd79WSHxEKPdfmmt1OUr5vd6aR7AU1x1DCfA88H0AY8wR4CFgrfvxC/cxn3fWkP5sKj9Ko/YTWG7+ylK2HajnoVmjiIsItbocpfye14LAfWdQ435ujDG3GmOGGmNGG2PWdTlvgTFmmPvxoreu39umZifS4TSs3q3NQ1baXd3IUyuKmZGXyozRury0Ut6gM4u7aUJWPOEhQXxSUmN1KbbldBruWVJIvxAHD87S5aWV8hYNgm4KC3YwZUh/Pi62dgSTnb28poy1e2v52aW5JEeHW12OUgFDg6AHzs1OorS6if21zVaXYjsVR4/xyLKdnJudyOx8n596opRf0SDoganumaufFGvzUF8yxnDfG1swwK+uHK2b0CvlZRoEPTAsOYrUmHBWahD0qb9tquDDomp+fMlwMhIirC5HqYCjQdADIsK52Yl8UlJDp9Oc/guUx2oaW3nwre3kZ8bxzbOyrC5HqYCkQdBD5+YkUXesnS0VdVaXYgsPvrWd5tZOHp09BkeQNgkp1Rs0CHroK8MSEYGVu3T0UG97b8ch3tp8gFsvGEZ2SrTV5SgVsDQIeighMpRRA2O0n6CXNbS0c98bWxmeEs33zh9qdTlKBTQNgjMwNTuJ9ftqqWvW7St7yyPLdlLV0MIjs0cTGqw/pkr1Jv0Xdgam5abQ6TR8uKvK6lIC0prSw7y8Zh83nTOY8Zk+vYGdUgFBg+AMjEuPIzEqjOXbD1ldSsBpae/knte3kJHQjzsvzrG6HKVsQYPgDAQFCdNGJvNRUTVtHU6rywkoT60oZk9NE49cNYaIUN1/WKm+oEFwhqaNTKGhtUM3q/GirRV1PL+ylKsnpnPOMN1/WKm+okFwhs4Zlkh4SBArtHnIK9o7nfz4tUISIkO5b6ZuNqNUX9IgOEP9Qh2cm53E8u2HMEZnGXvquQ93s6OynoevyCM2QvcfVqovaRB44KsjUzhQ18L2ynqrS/FrxYcaeOb9Er42ZgCXjEq1uhylbEeDwAMXjEhGBB095IFOp+HuJYVEhjl48HLdbEYpK2gQeCApOoz8zHhW7NAgOFN//HQvG/cd5YHLRpEYFWZ1OUrZkgaBh76am8LWinrKj+hmNT21t6aJx9/ZyYUjkpk1bqDV5ShlWxoEHvqaewP1twoPWFyJf3G6m4RCHEG62YxSFtMg8FBGQgT5mXG8uUmDoCf+vKaMz/cc4WdfyyU1VvcfVspKGgRecPnYgew82EDxoQarS/EL5UeaeWTZTqbmJPH1ielWl6OU7WkQeMHMMQMIEnhrs94VnI7TafjJkkKCRPj1VdokpJQv0CDwguTocM4a2p83Nx/QyWWn8fKaMj7dfZj/+dpI0uL6WV2OUgoNAq+5fOxA9h5u1i0sT6HscBO/WupqErpmUobV5Sil3DwOAhH5bxHZKSLbROSxLsfvFZESESkSkUu6HJ/uPlYiIvd4en1fMX3UAEIcos1DJ+F0Gn78aiHBDuHR2dokpJQv8SgIROQCYBYw1hgzCviN+3gucC0wCpgOPCsiDhFxAPOAGUAuMMd9rt+LjQjhvJwk3tpcidOpzUNf9uKne/l87xEeuGwUA2K1SUgpX+LpHcH3gEeMMa0AxpjjW3bNAhYZY1qNMXuAEqDA/SgxxpQaY9qARe5zA8KscWkcrG9h1W7dz7irkqoGHnt7JxeNSGZ2fprV5SilvsTTIMgBzhWRNSLykYhMch9PA8q7nLfffexkxwPCxaNSiI8IYdHn5ac/2SbaO53c/spmIsOCeWT2GG0SUsoHnXYLKBFZAZxoScj73F+fAEwBJgGLRWSINwoTkbnAXIDMzExvfMteFxbs4Kr8dBZ+tpeaxlZdOwd45r1itlTU8dz1E0iK1r8PpXzRae8IjDHTjDF5J3j8Hddv9K8bl88BJ5AIVABdh4Wku4+d7PiJrjvfGDPRGDMxKSnpzP50FphTkEF7p2HJ+v1Wl2K5DftqmffhbmbnpzM9T5eXVspXedo09DfgAgARyQFCgRrgTeBaEQkTkcFANvA5sBbIFpHBIhKKq0P5TQ9r8CnDkqOZlBXPorXltp5T0NTawR2vbCI1JpwHLg+I8QBKBSxPg2ABMEREtuLq+L3BfXewDVgMbAfeBm41xnQaYzqAHwDvADuAxe5zA8qcgkz21DSxuvSI1aVY5sG3tlF2pJknrh5LTLjuOKaUL/MoCIwxbcaY691NRfnGmPe7vPdLY8xQY8xwY8yyLseXGmNy3O/90pPr+6qZowcQEx7MorX7rC7FEku3VLJ43X5uPX8Yk4f0t7ocpdRp6MziXhAe4uDK8Wks23KQI01tVpfTpw4cPcY9SwoZmxHHbdOyrS5HKdUNGgS95Popg2jrdPKnz8qsLqXPdDoNt7+yiU6n4elrxhHi0B8vpfyB/kvtJdkp0Vw4IpmFn+2lpb3T6nL6xNPvFbNmzxF+MSuPrMRIq8tRSnWTBkEvmjt1CIeb2njNBkNJV5XU8Mz7xczOT2f2BN1jQCl/okHQiyYPTmBseizPryylM4DXH6puaOW2RZsYmhTFQ1eMsrocpVQPaRD0IhFh7tShlB1u5t1tB60up1cc7xdoaGln3nX5RISedrK6UsrHaBD0sul5qWQmRPD7j0sDcoLZE8uL+KSkhodm5TE8NdrqcpRSZ0CDoJc5goRvnzuYTeVH+Wz3YavL8ap3tx1k3ge7mVOQwdW60YxSfkuDoA9cPTGDAbHhPPr2zoBf7vB2AAAJqUlEQVS5KyitbuTOxZsZkx7LA5dpv4BS/kyDoA+Ehzi4/as5bN5fx7Kt/t9X0NDSznf+tJ6Q4CB+d/0EwkMcVpeklPKABkEfmZ2fTk5KFI+/U0R7p9Pqcs5Yp9Nw26JNlNY08X9zxusG9EoFAA2CPuIIEu6+ZAR7appYvM5/N6759dIdvL+zigcvH8XZwxKtLkcp5QUaBH3oopHJTMqK56kVxTS3dVhdTo8t+nwfL3yyhxvPzuL6KYOsLkcp5SUaBH1IRLhnxgiqG1p5+r1iq8vpkY93VfM/f9vKudmJ/M/XRlpdjlLKizQI+tiEQQlcMzGDF1buYWtFndXldMvm8qN898/ryU6JZt438gnWxeSUCij6L9oCP505koTIUH6ypJAOH+843lPTxE1/XEtCZCgv3TRJN5lRKgBpEFggNiKEh2aNYtuBep5fucfqck6qsu4Y31ywBoCFNxeQHBNucUVKqd6gQWCR6XkDuGRUCk+t2MXu6kary/kPB+tamDN/NbVN7bx44ySGJEVZXZJSqpdoEFjooVl59At18P0/b6Cp1XdGER2sa2HO86upaWxj4bcKGJsRZ3VJSqlepEFgoeSYcJ6ZM57iqgZ+sqTQJ5afOHD0GNc9v5qq+hZeurmA/Mx4q0tSSvUyDQKLnZudxF2XDOcfhZW8YHF/wc6D9Vz17KdUN7Ty0s0FTBikIaCUHWgQ+IDvnTeUGXmp/HrZDj4sqrKkhk931/D1332GwfDq985iYlaCJXUopfqeBoEPEBEe//pYhqfGMPdP6/loV3WfXdsYw18/38eNC9aSGhvO698/hxGpMX12faWU9TQIfERUWDAvf3syQ5OiuGXhuj65MzjW1smdr27m3te3MHlIAq9992xdRE4pG9Ig8CEJkaH85duTGZYUxdyF6/lnYWWvXWtHZT1XzFvFGxsr+NG0bP54UwGxETpZTCk70iDwMfGRofzllsnkDozh1r9s4Gd/20pLe6fXvv+xtk4eWbaTy575hJrGVl66qYAfTcvBESReu4ZSyr94FAQiMk5EVovIJhFZJyIF7uMiIr8VkRIRKRSR/C5fc4OIFLsfN3j6BwhEcRGhLP7OWdxy7mD+tLqMK+atYkdlvUffs9NpeHPzAS5+6iOe+2g3V+WnseKO85iak+SlqpVS/ko8GbsuIu8CTxpjlonITOBuY8z57uf/DcwEJgNPG2Mmi0gCsA6YCBhgPTDBGFN7qutMnDjRrFu37ozr9Gfv7zzEXa8WcqSpjRl5qfzwomxGDuh+Z25LeydvbKzg9x/tZu/hZnJSovjFrDymDOnfi1UrpXyBiKw3xkw83XnBHl7HAMc/lWKBA+7ns4CFxpUyq0UkTkQGAOcDy40xR9xFLgemA3/1sI6AdeGIFN6/8zwWfLKHF1ftZdnWg0wenMDUnCSmZieROzDm35p1Wto72V97jA37alm+/RAri6tpaXcyNj2W566fwMW5KQRpM5BSqgtP7whGAu8AgquZ6WxjTJmI/AN4xBjzifu894Cf4AqCcGPMw+7jPwOOGWN+c4LvPReYC5CZmTmhrKzsjOsMFHXN7fzx0728ve3gF01FIq4RRzHhIbR3OqlqaP3i/AGx4Vycm8KM0QOYPDgBEQ0ApezEa3cEIrICSD3BW/cBFwG3G2OWiMjVwB+AaT0t9kSMMfOB+eBqGvLG9/R3sREh3DYtm9umZVPd0Mqqkhr21DRRd6yd+pZ2HCJkJESQkdCPnJRocgfE6Ie/Uuq0ThsExpiTfrCLyELgNvfLV4EX3M8rgIwup6a7j1XguivoevzDblervpAUHcYV49OsLkMpFQA8HT56ADjP/fxC4Pj+i28C33SPHpoC1BljKnE1I10sIvEiEg9c7D6mlFLKIp52Ft8CPC0iwUAL7jZ9YCmuEUMlQDNwE4Ax5oiIPASsdZ/3i+Mdx0oppazhURC4O4MnnOC4AW49ydcsABZ4cl2llFLeozOLlVLK5jQIlFLK5jQIlFLK5jQIlFLK5jQIlFLK5jxaYqKviEg14MkaE4lAjZfK6Uv+Wjdo7VbR2q3hq7UPMsacdolhvwgCT4nIuu6st+Fr/LVu0NqtorVbw59rB20aUkop29MgUEopm7NLEMy3uoAz5K91g9ZuFa3dGv5cuz36CJRSSp2cXe4IlFJKnYQtgkBExonIahHZJCLrRKTA6pp6QkT+W0R2isg2EXnM6np6SkTuFBEjIolW19JdIvK4+++8UETeEJE4q2s6FRGZLiJFIlIiIvdYXU93iUiGiHwgItvdP9+3nf6rfIuIOERko3tnRr9kiyAAHgMeNMaMA+53v/YLInIBrj2gxxpjRgH/sa2nLxORDFz7TuyzupYeWg7kGWPGALuAey2u56RExAHMA2YAucAcEcm1tqpu6wDuNMbkAlOAW/2o9uNuA3ZYXYQn7BIEBohxP4/FtaGOv/gerv2fWwGMMVUW19NTTwJ34/p/4DeMMe8aYzrcL1fj2k3PVxUAJcaYUmNMG7AI1y8PPs8YU2mM2eB+3oDrA9Vvtt4TkXTga/xrd0a/ZJcg+BHwuIiU4/qN2md/uzuBHOBcEVkjIh+JyCSrC+ouEZkFVBhjNltdi4duBpZZXcQppAHlXV7vx48+TI8TkSxgPLDG2kp65Clcv+g4rS7EE57uUOYzRGQFkHqCt+4DLgJuN8YsEZGrgT8AJ92Lua+dpvZgIAHXbfMkYLGIDDE+MtzrNLX/FFezkE86Ve3GmL+7z7kPV/PFy31Zm92ISBSwBPiRMabe6nq6Q0QuBaqMMetF5Hyr6/GELYaPikgdEGeMMSIiuPZQjjnd1/kCEXkbeNQY84H79W5gijGm2trKTk1ERgPv4dqqFFxNKweAAmPMQcsK6wERuRH4DnCRMab5NKdbRkTOAn5ujLnE/fpeAGPMry0trJtEJAT4B/COMeYJq+vpLhH5NfBfuH5RCMfV/Py6MeZ6Sws7A3ZpGjoAnOd+fiFQbGEtPfU34AIAEckBQvHNxa3+jTFmizEm2RiTZYzJwtVcke9HITAd1y3/5b4cAm5rgWwRGSwiocC1wJsW19Qt7l/M/gDs8KcQADDG3GuMSXf/fF8LvO+PIQAB1DR0GrcAT4tIMNACzLW4np5YACwQka1AG3CDrzQLBbj/A8KA5a7PKlYbY75rbUknZozpEJEfAO8ADmCBMWabxWV11zm4fqveIiKb3Md+aoxZamFNtmOLpiGllFInZ5emIaWUUiehQaCUUjanQaCUUjanQaCUUjanQaCUUjanQaCUUjanQaCUUjanQaCUUjb3/wGdidvyRb9ZNQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.linspace(-8, 5, 100)\n", "plt.plot(x, f(x));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The [`minimize_scalar`](http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html#scipy.optimize.minimize_scalar) function will find the minimum, and can also be told to search within given bounds. By default, it uses the Brent algorithm, which combines a bracketing strategy with a parabolic approximation." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " fun: -803.3955308825884\n", " nfev: 12\n", " nit: 11\n", " success: True\n", " x: -5.528801125219663" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "opt.minimize_scalar(f, method='Brent')" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " fun: -54.21003937712762\n", " message: 'Solution found.'\n", " nfev: 12\n", " status: 0\n", " success: True\n", " x: 2.668865104039653" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "opt.minimize_scalar(f, method='bounded', bounds=[0, 6])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Local and global minima" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def f(x, offset):\n", " return -np.sinc(x-offset)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.linspace(-20, 20, 100)\n", "plt.plot(x, f(x, 5));" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " fun: -0.049029624014074166\n", " nfev: 11\n", " nit: 10\n", " success: True\n", " x: -1.4843871263953001" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# note how additional function arguments are passed in\n", "sol = opt.minimize_scalar(f, args=(5,))\n", "sol" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(x, f(x, 5))\n", "plt.axvline(sol.x, c='red')\n", "pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### We can try multiple random starts to find the global minimum" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "lower = np.random.uniform(-20, 20, 100)\n", "upper = lower + 1\n", "sols = [opt.minimize_scalar(f, args=(5,), bracket=(l, u)) for (l, u) in zip(lower, upper)]" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "idx = np.argmin([sol.fun for sol in sols])\n", "sol = sols[idx]" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(x, f(x, 5))\n", "plt.axvline(sol.x, c='red');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Using a stochastic algorithm\n", "\n", "See documentation for the [`basinhopping`](http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.basinhopping.html) algorithm, which also works with multivariate scalar optimization. Note that this is heuristic and not guaranteed to find a global minimum." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " fun: -1.0\n", " lowest_optimization_result: fun: -1.0\n", " hess_inv: array([[0.304]])\n", " jac: array([0.])\n", " message: 'Optimization terminated successfully.'\n", " nfev: 18\n", " nit: 4\n", " njev: 6\n", " status: 0\n", " success: True\n", " x: array([5.])\n", " message: ['requested number of basinhopping iterations completed successfully']\n", " minimization_failures: 0\n", " nfev: 1797\n", " nit: 100\n", " njev: 599\n", " x: array([5.])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy.optimize import basinhopping\n", "\n", "x0 = 0\n", "sol = basinhopping(f, x0, stepsize=1, minimizer_kwargs={'args': (5,)})\n", "sol" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(x, f(x, 5))\n", "plt.axvline(sol.x, c='red');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Constrained optimization with `scipy.optimize`\n", "\n", "Many real-world optimization problems have constraints - for example, a set of parameters may have to sum to 1.0 (equality constraint), or some parameters may have to be non-negative (inequality constraint). Sometimes, the constraints can be incorporated into the function to be minimized, for example, the non-negativity constraint $p \\gt 0$ can be removed by substituting $p = e^q$ and optimizing for $q$. Using such workarounds, it may be possible to convert a constrained optimization problem into an unconstrained one, and use the methods discussed above to solve the problem.\n", "\n", "Alternatively, we can use optimization methods that allow the specification of constraints directly in the problem statement as shown in this section. Internally, constraint violation penalties, barriers and Lagrange multipliers are some of the methods used used to handle these constraints. We use the example provided in the Scipy [tutorial](http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html) to illustrate how to set constraints.\n", "\n", "We will optimize:\n", "\n", "$$\n", "f(x) = -(2xy + 2x - x^2 -2y^2)\n", "$$\n", "subject to the constraint\n", "$$\n", "x^3 - y = 0 \\\\\n", "y - (x-1)^4 - 2 \\ge 0\n", "$$\n", "and the bounds\n", "$$\n", "0.5 \\le x \\le 1.5 \\\\\n", "1.5 \\le y \\le 2.5\n", "$$" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "def f(x):\n", " return -(2*x[0]*x[1] + 2*x[0] - x[0]**2 - 2*x[1]**2)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0, 3, 0, 3]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.linspace(0, 3, 100)\n", "y = np.linspace(0, 3, 100)\n", "X, Y = np.meshgrid(x, y)\n", "Z = f(np.vstack([X.ravel(), Y.ravel()])).reshape((100,100))\n", "plt.contour(X, Y, Z, np.arange(-1.99,10, 1), cmap='jet');\n", "plt.plot(x, x**3, 'k:', linewidth=1)\n", "plt.plot(x, (x-1)**4+2, 'k:', linewidth=1)\n", "plt.fill([0.5,0.5,1.5,1.5], [2.5,1.5,1.5,2.5], alpha=0.3)\n", "plt.axis([0,3,0,3])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To set constraints, we pass in a dictionary with keys `type`, `fun` and `jac`. Note that the inequality constraint assumes a $C_j x \\ge 0$ form. As usual, the `jac` is optional and will be numerically estimated if not provided." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "cons = ({'type': 'eq',\n", " 'fun' : lambda x: np.array([x[0]**3 - x[1]]),\n", " 'jac' : lambda x: np.array([3.0*(x[0]**2.0), -1.0])},\n", " {'type': 'ineq',\n", " 'fun' : lambda x: np.array([x[1] - (x[0]-1)**4 - 2])})\n", "\n", "bnds = ((0.5, 1.5), (1.5, 2.5))" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "x0 = [0, 2.5]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Unconstrained optimization" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " fun: -1.9999999999996365\n", " hess_inv: array([[0.998, 0.501],\n", " [0.501, 0.499]])\n", " jac: array([ 0., -0.])\n", " message: 'Optimization terminated successfully.'\n", " nfev: 24\n", " nit: 5\n", " njev: 6\n", " status: 0\n", " success: True\n", " x: array([2., 1.])" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ux = opt.minimize(f, x0, constraints=None)\n", "ux" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Constrained optimization" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " fun: 2.049915472024102\n", " jac: array([-3.487, 5.497])\n", " message: 'Optimization terminated successfully.'\n", " nfev: 25\n", " nit: 6\n", " njev: 6\n", " status: 0\n", " success: True\n", " x: array([1.261, 2.005])" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cx = opt.minimize(f, x0, bounds=bnds, constraints=cons)\n", "cx" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.linspace(0, 3, 100)\n", "y = np.linspace(0, 3, 100)\n", "X, Y = np.meshgrid(x, y)\n", "Z = f(np.vstack([X.ravel(), Y.ravel()])).reshape((100,100))\n", "plt.contour(X, Y, Z, np.arange(-1.99,10, 1), cmap='jet');\n", "plt.plot(x, x**3, 'k:', linewidth=1)\n", "plt.plot(x, (x-1)**4+2, 'k:', linewidth=1)\n", "plt.text(ux['x'][0], ux['x'][1], 'x', va='center', ha='center', size=20, color='blue')\n", "plt.text(cx['x'][0], cx['x'][1], 'x', va='center', ha='center', size=20, color='red')\n", "plt.fill([0.5,0.5,1.5,1.5], [2.5,1.5,1.5,2.5], alpha=0.3)\n", "plt.axis([0,3,0,3]);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Some applications of optimization" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Finding paraemeters for ODE models\n", "\n", "This is a specialized application of `curve_fit`, in which the curve to be fitted is defined implicitly by an ordinary differential equation \n", "$$\n", "\\frac{dx}{dt} = -kx\n", "$$\n", "and we want to use observed data to estimate the parameters $k$ and the initial value $x_0$. Of course this can be explicitly solved but the same approach can be used to find multiple parameters for $n$-dimensional systems of ODEs.\n", "\n", "[A more elaborate example for fitting a system of ODEs to model the zombie apocalypse](http://adventuresinpython.blogspot.com/2012/08/fitting-differential-equation-system-to.html)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "from scipy.integrate import odeint\n", "\n", "def f(x, t, k):\n", " \"\"\"Simple exponential decay.\"\"\"\n", " return -k*x\n", "\n", "def x(t, k, x0):\n", " \"\"\"\n", " Solution to the ODE x'(t) = f(t,x,k) with initial condition x(0) = x0\n", " \"\"\"\n", " x = odeint(f, x0, t, args=(k,))\n", " return x.ravel()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "k = 0.314378\n", "x0 = 9.74377\n" ] } ], "source": [ "# True parameter values\n", "x0_ = 10\n", "k_ = 0.1*np.pi\n", "\n", "# Some random data genererated from closed form solution plus Gaussian noise\n", "ts = np.sort(np.random.uniform(0, 10, 200))\n", "xs = x0_*np.exp(-k_*ts) + np.random.normal(0,0.1,200)\n", "\n", "popt, cov = opt.curve_fit(x, ts, xs)\n", "k_opt, x0_opt = popt\n", "\n", "print(\"k = %g\" % k_opt)\n", "print(\"x0 = %g\" % x0_opt)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "t = np.linspace(0, 10, 100)\n", "plt.plot(ts, xs, 'r.', t, x(t, k_opt, x0_opt), '-');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Another example of fitting a system of ODEs using the `lmfit` package\n", "\n", "You may have to install the [`lmfit`](http://cars9.uchicago.edu/software/python/lmfit/index.html) package using `pip` and restart your kernel. The `lmfit` algorithm is another wrapper around `scipy.optimize.leastsq` but allows for richer model specification and more diagnostics." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: lmfit in /usr/local/lib/python3.6/site-packages (0.9.11)\n", "Requirement already satisfied: scipy>=0.17 in /usr/local/lib/python3.6/site-packages (from lmfit) (1.0.1)\n", "Requirement already satisfied: six>1.10 in /usr/local/lib/python3.6/site-packages (from lmfit) (1.11.0)\n", "Requirement already satisfied: numpy>=1.10 in /usr/local/lib/python3.6/site-packages (from lmfit) (1.14.2)\n", "Requirement already satisfied: asteval>=0.9.12 in /usr/local/lib/python3.6/site-packages (from lmfit) (0.9.13)\n", "Requirement already satisfied: uncertainties>=3.0 in /usr/local/lib/python3.6/site-packages (from lmfit) (3.0.2)\n", "\u001b[33mYou are using pip version 18.0, however version 18.1 is available.\n", "You should consider upgrading via the 'pip install --upgrade pip' command.\u001b[0m\n" ] } ], "source": [ "! pip install lmfit" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "from lmfit import minimize, Parameters, Parameter, report_fit\n", "import warnings" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[Fit Statistics]]\n", " # fitting method = leastsq\n", " # function evals = 167\n", " # data points = 200\n", " # variables = 6\n", " chi-square = 212.716019\n", " reduced chi-square = 1.09647432\n", " Akaike info crit = 24.3281329\n", " Bayesian info crit = 44.1180371\n", "[[Variables]]\n", " x0: 1.02052198 +/- 0.18168320 (17.80%) (init = 0)\n", " y0: 1.07046509 +/- 0.11017748 (10.29%) (init = 1.997345)\n", " a: 3.54341849 +/- 0.45416005 (12.82%) (init = 2)\n", " b: 1.21280681 +/- 0.14847542 (12.24%) (init = 2)\n", " c: 0.84529665 +/- 0.07947808 (9.40%) (init = 2)\n", " d: 0.85715536 +/- 0.08562777 (9.99%) (init = 2)\n", "[[Correlations]] (unreported correlations are < 0.100)\n", " C(a, b) = 0.960\n", " C(a, d) = -0.956\n", " C(b, d) = -0.878\n", " C(x0, b) = -0.759\n", " C(x0, a) = -0.745\n", " C(y0, c) = -0.717\n", " C(y0, d) = -0.683\n", " C(c, d) = 0.667\n", " C(x0, d) = 0.578\n", " C(a, c) = -0.532\n", " C(y0, a) = 0.475\n", " C(b, c) = -0.433\n", " C(y0, b) = 0.271\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def f(xs, t, ps):\n", " \"\"\"Lotka-Volterra predator-prey model.\"\"\"\n", " try:\n", " a = ps['a'].value\n", " b = ps['b'].value\n", " c = ps['c'].value\n", " d = ps['d'].value\n", " except:\n", " a, b, c, d = ps\n", " \n", " x, y = xs\n", " return [a*x - b*x*y, c*x*y - d*y]\n", "\n", "def g(t, x0, ps):\n", " \"\"\"\n", " Solution to the ODE x'(t) = f(t,x,k) with initial condition x(0) = x0\n", " \"\"\"\n", " x = odeint(f, x0, t, args=(ps,))\n", " return x\n", "\n", "def residual(ps, ts, data):\n", " x0 = ps['x0'].value, ps['y0'].value\n", " model = g(ts, x0, ps)\n", " return (model - data).ravel()\n", "\n", "t = np.linspace(0, 10, 100)\n", "x0 = np.array([1,1])\n", "\n", "a, b, c, d = 3,1,1,1\n", "true_params = np.array((a, b, c, d))\n", "\n", "np.random.seed(123)\n", "data = g(t, x0, true_params)\n", "data += np.random.normal(size=data.shape)\n", "\n", "# set parameters incluing bounds\n", "params = Parameters()\n", "params.add('x0', value= float(data[0, 0]), min=0, max=10) \n", "params.add('y0', value=float(data[0, 1]), min=0, max=10) \n", "params.add('a', value=2.0, min=0, max=10)\n", "params.add('b', value=2.0, min=0, max=10)\n", "params.add('c', value=2.0, min=0, max=10)\n", "params.add('d', value=2.0, min=0, max=10)\n", "\n", "# fit model and find predicted values\n", "result = minimize(residual, params, args=(t, data), method='leastsq')\n", "final = data + result.residual.reshape(data.shape)\n", "\n", "# plot data and fitted curves\n", "plt.plot(t, data, 'o')\n", "plt.plot(t, final, '-', linewidth=2);\n", "\n", "# display fitted statistics\n", "report_fit(result)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Optimization of graph node placement\n", "\n", "To show the many different applications of optimization, here is an example using optimization to change the layout of nodes of a graph. We use a physical analogy - nodes are connected by springs, and the springs resist deformation from their natural length $l_{ij}$. Some nodes are pinned to their initial locations while others are free to move. Because the initial configuration of nodes does not have springs at their natural length, there is tension resulting in a high potential energy $U$, given by the physics formula shown below. Optimization finds the configuration of lowest potential energy given that some nodes are fixed (set up as boundary constraints on the positions of the nodes).\n", "\n", "$$\n", "U = \\frac{1}{2}\\sum_{i,j=1}^n ka_{ij}\\left(||p_i - p_j||-l_{ij}\\right)^2\n", "$$\n", "\n", "Note that the ordination algorithm Multi-Dimensional Scaling (MDS) works on a very similar idea - take a high dimensional data set in $\\mathbb{R}^n$, and project down to a lower dimension ($\\mathbb{R}^k$) such that the sum of distances $d_n(x_i, x_j) - d_k(x_i, x_j)$, where $d_n$ and $d_k$ are some measure of distance between two points $x_i$ and $x_j$ in $n$ and $d$ dimension respectively, is minimized. MDS is often used in exploratory analysis of high-dimensional data to get some intuitive understanding of its \"structure\"." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "from scipy.spatial.distance import pdist, squareform" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- P0 is the initial location of nodes\n", "- P is the minimal energy location of nodes given constraints\n", "- A is a connectivity matrix - there is a spring between $i$ and $j$ if $A_{ij} = 1$\n", "- $L_{ij}$ is the resting length of the spring connecting $i$ and $j$\n", "- In addition, there are a number of `fixed` nodes whose positions are pinned." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "n = 20\n", "k = 1 # spring stiffness\n", "P0 = np.random.uniform(0, 5, (n,2)) \n", "A = np.ones((n, n))\n", "A[np.tril_indices_from(A)] = 0\n", "L = A.copy()" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n", " [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n", " [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n", " [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n", " [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n", " [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n", " [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n", " [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n", " [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n", " [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n", " [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n", " [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],\n", " [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],\n", " [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],\n", " [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],\n", " [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],\n", " [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],\n", " [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],\n", " [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],\n", " [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L.astype('int')" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "def energy(P):\n", " P = P.reshape((-1, 2))\n", " D = squareform(pdist(P))\n", " return 0.5*(k * A * (D - L)**2).sum()" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "D0 = squareform(pdist(P0))\n", "E0 = 0.5* k * A * (D0 - L)**2" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0. , 5.039, 0.921, 1.758, 1.99 ],\n", " [5.039, 0. , 5.546, 3.414, 4.965],\n", " [0.921, 5.546, 0. , 2.133, 2.888],\n", " [1.758, 3.414, 2.133, 0. , 2.762],\n", " [1.99 , 4.965, 2.888, 2.762, 0. ]])" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "D0[:5, :5]" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0. , 8.159, 0.003, 0.288, 0.49 ],\n", " [ 0. , 0. , 10.333, 2.915, 7.862],\n", " [ 0. , 0. , 0. , 0.642, 1.782],\n", " [ 0. , 0. , 0. , 0. , 1.552],\n", " [ 0. , 0. , 0. , 0. , 0. ]])" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E0[:5, :5]" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "479.13650839857024" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "energy(P0.ravel())" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "# fix the position of the first few nodes just to show constraints\n", "fixed = 4\n", "bounds = (np.repeat(P0[:fixed,:].ravel(), 2).reshape((-1,2)).tolist() + \n", " [[None, None]] * (2*(n-fixed)))" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1.191, 4.039],\n", " [4.475, 0.216],\n", " [1.51 , 4.903],\n", " [2.698, 3.132],\n", " [0.028, 2.425]])" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "P0[:5]" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[[1.191249528562059, 1.191249528562059],\n", " [4.0389554314507805, 4.0389554314507805],\n", " [4.474891439430058, 4.474891439430058],\n", " [0.216114460398234, 0.216114460398234],\n", " [1.5097341813135952, 1.5097341813135952],\n", " [4.902910992971438, 4.902910992971438],\n", " [2.6975241127686767, 2.6975241127686767],\n", " [3.1315468085492815, 3.1315468085492815],\n", " [None, None],\n", " [None, None]]" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bounds[:10]" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "sol = opt.minimize(energy, P0.ravel(), bounds=bounds)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Visualization\n", "\n", "Original placement is BLUE\n", "Optimized arrangement is RED." ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(P0[:, 0], P0[:, 1], s=25)\n", "P = sol.x.reshape((-1,2))\n", "plt.scatter(P[:, 0], P[:, 1], edgecolors='red', facecolors='none', s=30, linewidth=2);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Optimization of standard statistical models\n", "---\n", "\n", "When we solve standard statistical problems, an optimization procedure similar to the ones discussed here is performed. For example, consider multivariate logistic regression - typically, a Newton-like algorithm known as iteratively reweighted least squares (IRLS) is used to find the maximum likelihood estimate for the generalized linear model family. However, using one of the multivariate scalar minimization methods shown above will also work, for example, the BFGS minimization algorithm. \n", "\n", "The take home message is that there is nothing magic going on when Python or R fits a statistical model using a formula - all that is happening is that the objective function is set to be the negative of the log likelihood, and the minimum found using some first or second order optimization algorithm." ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "import statsmodels.api as sm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Logistic regression as optimization\n", "\n", "Suppose we have a binary outcome measure $Y \\in {0,1}$ that is conditinal on some input variable (vector) $x \\in (-\\infty, +\\infty)$. Let the conditioanl probability be $p(x) = P(Y=y | X=x)$. Given some data, one simple probability model is $p(x) = \\beta_0 + x\\cdot\\beta$ - i.e. linear regression. This doesn't really work for the obvious reason that $p(x)$ must be between 0 and 1 as $x$ ranges across the real line. One simple way to fix this is to use the transformation $g(x) = \\frac{p(x)}{1 - p(x)} = \\beta_0 + x.\\beta$. Solving for $p$, we get\n", "$$\n", "p(x) = \\frac{1}{1 + e^{-(\\beta_0 + x\\cdot\\beta)}}\n", "$$\n", "As you all know very well, this is logistic regression.\n", "\n", "Suppose we have $n$ data points $(x_i, y_i)$ where $x_i$ is a vector of features and $y_i$ is an observed class (0 or 1). For each event, we either have \"success\" ($y = 1$) or \"failure\" ($Y = 0$), so the likelihood looks like the product of Bernoulli random variables. According to the logistic model, the probability of success is $p(x_i)$ if $y_i = 1$ and $1-p(x_i)$ if $y_i = 0$. So the likelihood is\n", "$$\n", "L(\\beta_0, \\beta) = \\prod_{i=1}^n p(x_i)^y(1-p(x_i))^{1-y}\n", "$$\n", "and the log-likelihood is \n", "\\begin{align}\n", "l(\\beta_0, \\beta) &= \\sum_{i=1}^{n} y_i \\log{p(x_i)} + (1-y_i)\\log{1-p(x_i)} \\\\\n", "&= \\sum_{i=1}^{n} \\log{1-p(x_i)} + \\sum_{i=1}^{n} y_i \\log{\\frac{p(x_i)}{1-p(x_i)}} \\\\\n", "&= \\sum_{i=1}^{n} -\\log 1 + e^{\\beta_0 + x_i\\cdot\\beta} + \\sum_{i=1}^{n} y_i(\\beta_0 + x_i\\cdot\\beta)\n", "\\end{align}\n", "\n", "Using the standard 'trick', if we augment the matrix $X$ with a column of 1s, we can write $\\beta_0 + x_i\\cdot\\beta$ as just $X\\beta$." ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
admitgregparank
003803.613
116603.673
218004.001
316403.194
405202.934
\n", "
" ], "text/plain": [ " admit gre gpa rank\n", "0 0 380 3.61 3\n", "1 1 660 3.67 3\n", "2 1 800 4.00 1\n", "3 1 640 3.19 4\n", "4 0 520 2.93 4" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ = pd.read_csv(\"https://stats.idre.ucla.edu/stat/data/binary.csv\")\n", "df_.head()" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
admitdummygregpa
0013803.61
1116603.67
2118004.00
3116403.19
4015202.93
\n", "
" ], "text/plain": [ " admit dummy gre gpa\n", "0 0 1 380 3.61\n", "1 1 1 660 3.67\n", "2 1 1 800 4.00\n", "3 1 1 640 3.19\n", "4 0 1 520 2.93" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# We will ignore the rank categorical value\n", "\n", "cols_to_keep = ['admit', 'gre', 'gpa']\n", "df = df_[cols_to_keep]\n", "df.insert(1, 'dummy', 1)\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solving as a GLM with IRLS\n", "\n", "This is very similar to what you would do in R, only using Python's `statsmodels` package. The GLM solver uses a special variant of Newton's method known as iteratively reweighted least squares (IRLS), which will be further desribed in the lecture on multivarite and constrained optimizaiton." ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
Generalized Linear Model Regression Results
Dep. Variable: admit No. Observations: 400
Model: GLM Df Residuals: 397
Model Family: Binomial Df Model: 2
Link Function: logit Scale: 1.0000
Method: IRLS Log-Likelihood: -240.17
Date: Mon, 15 Oct 2018 Deviance: 480.34
Time: 16:04:00 Pearson chi2: 398.
No. Iterations: 4 Covariance Type: nonrobust
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
coef std err z P>|z| [0.025 0.975]
Intercept -4.9494 1.075 -4.604 0.000 -7.057 -2.842
gre 0.0027 0.001 2.544 0.011 0.001 0.005
gpa 0.7547 0.320 2.361 0.018 0.128 1.381
" ], "text/plain": [ "\n", "\"\"\"\n", " Generalized Linear Model Regression Results \n", "==============================================================================\n", "Dep. Variable: admit No. Observations: 400\n", "Model: GLM Df Residuals: 397\n", "Model Family: Binomial Df Model: 2\n", "Link Function: logit Scale: 1.0000\n", "Method: IRLS Log-Likelihood: -240.17\n", "Date: Mon, 15 Oct 2018 Deviance: 480.34\n", "Time: 16:04:00 Pearson chi2: 398.\n", "No. Iterations: 4 Covariance Type: nonrobust\n", "==============================================================================\n", " coef std err z P>|z| [0.025 0.975]\n", "------------------------------------------------------------------------------\n", "Intercept -4.9494 1.075 -4.604 0.000 -7.057 -2.842\n", "gre 0.0027 0.001 2.544 0.011 0.001 0.005\n", "gpa 0.7547 0.320 2.361 0.018 0.128 1.381\n", "==============================================================================\n", "\"\"\"" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = sm.GLM.from_formula('admit ~ gre + gpa', \n", " data=df, family=sm.families.Binomial())\n", "fit = model.fit()\n", "fit.summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Or use R" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "%load_ext rpy2.ipython" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\n", "Call:\n", "glm(formula = admit ~ gre + gpa, family = \"binomial\", data = df)\n", "\n", "Deviance Residuals: \n", " Min 1Q Median 3Q Max \n", "-1.2730 -0.8988 -0.7206 1.3013 2.0620 \n", "\n", "Coefficients:\n", " Estimate Std. Error z value Pr(>|z|) \n", "(Intercept) -4.949378 1.075093 -4.604 4.15e-06 ***\n", "gre 0.002691 0.001057 2.544 0.0109 * \n", "gpa 0.754687 0.319586 2.361 0.0182 * \n", "---\n", "Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1\n", "\n", "(Dispersion parameter for binomial family taken to be 1)\n", "\n", " Null deviance: 499.98 on 399 degrees of freedom\n", "Residual deviance: 480.34 on 397 degrees of freedom\n", "AIC: 486.34\n", "\n", "Number of Fisher Scoring iterations: 4\n", "\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%R -i df\n", "m <- glm(admit ~ gre + gpa, data=df, family=\"binomial\")\n", "summary(m)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Home-brew logistic regression using a generic minimization function\n", "\n", "This is to show that there is no magic going on - you can write the function to minimize directly from the log-likelihood equation and run a minimizer. It will be more accurate if you also provide the derivative (+/- the Hessian for second order methods), but using just the function and numerical approximations to the derivative will also work. As usual, this is for illustration so you understand what is going on - when there is a library function available, you should probably use that instead." ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "def f(beta, y, x):\n", " \"\"\"Minus log likelihood function for logistic regression.\"\"\"\n", " return -((-np.log(1 + np.exp(np.dot(x, beta)))).sum() + (y*(np.dot(x, beta))).sum())" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " fun: 240.17199087225998\n", " hess_inv: array([[ 1.122, -0. , -0.271],\n", " [-0. , 0. , -0. ],\n", " [-0.271, -0. , 0.098]])\n", " jac: array([-0. , -0.002, -0. ])\n", " message: 'Optimization terminated successfully.'\n", " nfev: 65\n", " nit: 8\n", " njev: 13\n", " status: 0\n", " success: True\n", " x: array([-4.949, 0.003, 0.755])" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "beta0 = np.zeros(3)\n", "opt.minimize(f, beta0, args=(df['admit'], df.loc[:, 'dummy':]), \n", " method='BFGS', options={'gtol':1e-2})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Optimization with `sklearn`\n", "\n", "There are also many optimization routines in the `scikit-learn` package, as you already know from the previous lectures. Many machine learning problems essentially boil down to the minimization of some appropriate loss function." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Resources\n", "\n", "- [Scipy Optimize reference](http://docs.scipy.org/doc/scipy/reference/optimize.html)\n", "- [Scipy Optimize tutorial](http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html)\n", "- [LMFit - a modeling interface for nonlinear least squares problems](http://cars9.uchicago.edu/software/python/lmfit/index.html)\n", "- [CVXpy- a modeling interface for convex optimization problems](https://github.com/cvxgrp/cvxpy)\n", "- [Quasi-Newton methods](http://en.wikipedia.org/wiki/Quasi-Newton_method)\n", "- [Convex optimization book by Boyd & Vandenberghe](http://stanford.edu/~boyd/cvxbook/)\n", "- [Nocedal and Wright textbook](http://www.springer.com/us/book/9780387303031)" ] } ], "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.6.5" } }, "nbformat": 4, "nbformat_minor": 1 }