{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Import libraries\n", "import numpy as np\n", "from numpy import linalg as LA\n", "\n", "import random\n", "import time\n", "from IPython import display\n", "import matplotlib.animation as animation\n", "import matplotlib.pyplot as plt\n", "plt.rcParams['text.usetex'] = True\n", "\n", "import seaborn as sns" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## MA934\n", "\n", "## Convex optimisation and linear programming\n", "\n", "\"The subject of linear programming is surrounded by notational and terminological thickets.\n", " Both of these defenses are lovingly cultivated by a coterie of stern acolytes who have devoted themselves to the field...\"\n", " \n", " Numerical Recipes, Press et. al." ] }, { "cell_type": "markdown", "metadata": { "cell_style": "split", "slideshow": { "slide_type": "slide" } }, "source": [ "### Reminder: gradient and Hessian\n", "\n", "Given a continuous, differentiable $f: \\mathbb{R}^n \\to \\mathbb{R}$, the *gradient* of $f$ at $\\mathbf{x}$ is the vector\n", "$$\n", "\\nabla\\,f(\\mathbf{x}) = \\left( \n", "\\begin{array}{c}\n", "\\frac{\\partial f(\\mathbf{x}) }{\\partial x_1}\\\\\n", "\\frac{\\partial f(\\mathbf{x}) }{\\partial x_2}\\\\\n", "\\vdots\\\\\n", "\\frac{\\partial f(\\mathbf{x}) }{\\partial x_n}\\\\\n", "\\end{array}\n", "\\right).\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "cell_style": "split" }, "source": [ "Given a continuous, twice-differentiable $f: \\mathbb{R}^n \\to \\mathbb{R}$, the *Hessian* of $f$ at $\\mathbf{x}$ is the matrix\n", "$$\n", "H\\,f(\\mathbf{x}) = \\left( \n", "\\begin{array}{ccc}\n", "\\frac{\\partial^2 f(\\mathbf{x}) }{\\partial x_1^2}& \\ldots & \\frac{\\partial^2 f(\\mathbf{x}) }{\\partial x_1 \\partial x_n}\\\\\n", "\\ldots & \\ldots & \\ldots\\\\\n", "\\frac{\\partial^2 f(\\mathbf{x}) }{\\partial x_n \\partial x_1} & \\ldots & \\frac{\\partial^2 f(\\mathbf{x}) }{\\partial x_n^2}\n", "\\end{array}\n", "\\right),\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "cell_style": "split", "slideshow": { "slide_type": "slide" } }, "source": [ "### Convex sets\n", "\n", "$S \\subseteq \\mathbb{R}^n$ is a *convex set* if for any $x$, $y\\in S$, the line segment connecting $x$ and $y$ is contained in $S$. \n", "\n", "That is, for every point $z$,\n", "$$\n", "z = \\lambda\\, x + (1-\\lambda)\\,y\n", "$$\n", "with $x$, $y\\in S$ and $\\lambda \\in [0,1]$, we have $z \\in S$. \n", "\n", "The intersection of convex sets is convex." ] }, { "cell_type": "markdown", "metadata": { "cell_style": "split", "slideshow": { "slide_type": "-" } }, "source": [ "\"convex Convex set." ] }, { "cell_type": "markdown", "metadata": { "cell_style": "split", "slideshow": { "slide_type": "-" } }, "source": [ "\"nonconvex Nonconvex set." ] }, { "cell_type": "markdown", "metadata": { "cell_style": "split", "slideshow": { "slide_type": "slide" } }, "source": [ "### Convex functions\n", "\n", "Let $S \\subseteq \\mathbb{R}^n$ be a convex set and let $f: S \\to \\mathbb{R}$ be a real-valued function on $S$.\n", "\n", "$f$ is a *convex function* over $S$ if for\n", "any $x$, $y \\in S$ and $\\lambda \\in [0,1]$,\n", "$$\n", "f( \\lambda\\, x + (1-\\lambda)\\,y) \\leq \\lambda\\, f(x) + (1-\\lambda)\\,f(y).\n", "$$" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "cell_style": "split" }, "outputs": [ { "data": { "image/png": "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5F5EU8D95oznFXR/0e/h2ntbFpQvbyhXzr7l/7t8eUP58pzy3yf/LFfOez2hBw8epIbWtHWZ2ss9ai/3qL3co/Zyj9rLPWov9zjZXp06dVptjClw+K1XLucxxiQACQDt27c3HTt29MZmihQeDsuXL6djx8vKfNv+ym6vjk7H8BtqL/eovdyj9nKP2ss9ai/3qL3c46vtVdwX0wWN5T2Frw1tEBERERE5XZFFb15BmwmEFvBwaN5jIiIiIiI+zZVLkNIo+IK2lkCqZ+OIiIiIiHieK0VvIlDQcsPhwFzPxhERERER8bxii968i9JC82ZyAMCyrDBgj5YgFhERERF/4OrsDV2AoZZlbcz775bGmIJ6f0VEREREfI5LRW/eBW2x3o0iIiIiIuIdWktLRERERAKeil4RERERCXgqekVEREQk4KnoFREREZGAp6JXRERERAKeil4RERERCXgqekVEREQk4KnoFREREZGAp6JXRERERAKeil4RERERCXiWMca7G7CsncBmr26kcPWBXQ5t2x+pvdyj9nKP2ss9ai/3qL3co/Zyj9rLPU62VzNjTIOCHvB60esky7LSjDHtnc7hL9Re7lF7uUft5R61l3vUXu5Re7lH7eUeX20vDW8QERERkYCnoldEREREAl6gF70JTgfwM2ov96i93KP2co/ayz1qL/eovdyj9nKPT7ZXQI/pFRERERGBwO/pFRERERFR0Ssi3mdZVqjTGURE3KVzV2Cp4HSAoliWFQIMBTbm3dXSGBPr6deXdju+wgPtFQaEA/WAMCADiDXGZJ72vI1AHDAv765wIKKg5/oyD7SXS+2g4wuA6LzjawaQCew5/QnGmPS87QTE8QVgWVYk0MsY08PN14UQROeufKVor6A6d+UrRXsF1bkrXwnbK1jPXS79ThXx+hB88RxmjPHZG5AChJ7036FAiqdfX9rt+MqtNPuBfVBHnXbfYMCc/J5595vTbhtPf44/3DxwfLnUDjq+DEBiAe118m1GIB1f2P+DnJHXZqu91dYBdGyVuL2C9NxV2uMr2M5dpTm+gurclbcfLv9OFfEePnkO89nhDXl/kWUYYzLy78v/d95jHnl9abfjKzywH+HGmFOutjTGxAPp2CeLk8UC7bD/gm1njGl58nb9gYc+92LbQcfXCRnGGKugG3bvQfRJz/X748sYE523T4nuvjbYzl1QuvYiyM5dUOr2giA6d0Gp2yuozl153PmdOoMvn8N8tugFegGrC7g/BYgu4P6Svr602/EVpd2PaMuywgu4PxX7K45TGGPSjTGpJu9rHT/kkc/dhXbQ8WXbWNCdecfcGW0XAMdXaQTbuau0gu3c5RFBdO4qrWA8d7n1O1UAnz2H+XLRG449huR0GYArS9u5+vrSbsdXeGI/gmnAfll97jq+gNN7DU4SZoxJLU2wABRs5y5PCKZzV1nR8UVQn7tK8zvls+cwn7yQLW9gcwgFDBjHHkge4onXl3Y7vsIT+2GMaVnIQ6EU8Nds3nbDgLr+9ovv6c+9sHbQ8VXs+w7O+8qssMf98vgqjWA7d3lCMJ27PC3Qz13eEujnrpL8TuXz9XOYr/b01i3uCXkNVtrXl3Y7vsIr+5H3mkhgwmkPdcgbb5NpjEm1LCvOsqwod9/fQZ5qr+LaQcdX4c/Pvxq4IP5+fJVGsJ27vCKAz12eEiznLo8L1nNXEb9Tp/Ppc5hP9vSKz4gDkowxSafdP+Pkv2CNMbGWZW20LCvDX/+yLSG1Q8kNNYVPG6R2ldLSuatoaoeSC9ZzV2G/U37FV3t6xWF5g9jbF/TLXcgvbxL2L0XQUDuUTHGTvatdpTR07iqe2qFkgvXcVdTvlL/x1aK3oDEepzBFT5Ds6utLux1f4dH9yPtKIRbo4kaGjdhz+/kDb37uJ7eDjq+CRQOr3MzgT8dXaQTbucujguDc5U2BeO7ytKA7d5Xgd8qnz2E+WfTm7WgmBV89GJr3WKlfX9rt+Aov7MdMoEdBB1zeVzV+NUfj6TzRXq60g46vQkVSyJi4QDi+SiPYzl1eENDnLk8IpnOXFwTjuavQ36mC+Po5zCeL3jxpFDzQuSX2XHGeen1pt+MrPLIflmXFceZSlCf/lZpJwVdvtizkfl9V2vbKxLV20PF1krxeg6JOaJkExvFVGsF27vKIIDp3lVYmwXXu8ohgPHe58DtVGJ89h/ly0ZuIvarJ6cKBuR58fWm34ytKvR95V5nOLWAFmZPnyyvocbD/Ai52pRYfUtr2crUddHydKv+v+sK+2gqU46s0gu3cVWpBdu4qrWA7d3lKUJ27XPydKozPnsN8tujNmxA69OSB43l/Yew5/erBvK8VVpfk9e5sx5eVtr3yBqq3zH9d3i087/52Jz019fQpWCzLGoy9lGBhk3j7nNK2Fy62g46vM+S/PrOQxwPi+DpJCEXMN6lz1xlCcLO9gu3cdZoQ3GwvguzcdZoQ3G+vfEFz7nLjd8rvzmG+PmVZF2CoZVn5ywC2NMYU9FdBJgX/9eXq6119nq8rTXul5P0cXMDzTz4RpluWlf+1B9gnkI3B1l5utoOOr79l5N0KfDxQjq+8/CFATyDEsqxE7H2eYU5dnjQTnbtK215Bd+4qTXsF47nLA7+PECTnrjwu/U7lycSPzmGWMcZb7y0iIiIi4hN8dniDiIiIiIinqOgVERERkYCnoldEREREAp6KXhEREREJeCp6RURERCTgqegVERERkYCnoldEREREAp6KXhEREREJeCp6RURERCTgqegVERERkYD3/+Z1pu/ldSsuAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x = np.arange(0.0, 2.01, 0.01)\n", "X = 0.25\n", "Y = 1.75\n", "\n", "def cubeit(inputlist):\n", " return [pow(i, 3) for i in inputlist]\n", "\n", "lambda_array = np.arange(0.0, 1.01, 0.01)\n", "\n", "x2 = [l*X + (1-l)*Y for l in lambda_array]\n", "y2 = [l*pow(X, 3) + (1-l)*pow(Y,3) for l in lambda_array]\n", "\n", "y = cubeit(x)\n", "\n", "# Plot results\n", "plt.rcParams.update({'font.size': 22})\n", "plt.figure(figsize=(12, 8))\n", "\n", "plt.plot(x, y, \"b-\", label = \"$f(\\lambda\\,x + (1-\\lambda)\\,y)$\")\n", "plt.plot(x2, y2, \"g-\", label = r\"$\\lambda\\, f(x) + (1-\\lambda)\\,f(y)$\")\n", "\n", "plt.legend(loc=\"upper left\")\n", "\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Convex functions: alternative characterisation\n", "\n", "One can show that if $C \\subseteq \\mathbb{R}^n$ is a convex set and $f$ is a continuous, differentiable function on $C$, then $f$ is convex on $C$ if and only if\n", "for all $\\mathbf{x}$, $\\mathbf{y} \\in C$ we have\n", "$$\n", "f(\\mathbf{y}) - f(\\mathbf{x}) \\geq \\nabla\\,f (\\mathbf{x}) \\cdot (\\mathbf{y} -\\mathbf{x}).\n", "$$\n", "\n", "Generalises the one-dimensional observation:\n", "$$\n", "\\frac{\\Delta f}{\\Delta x}(x,y) =\\frac{f(y)-f(x)}{y-x} \\geq \\frac{df}{dx}(x)\n", "$$\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Optimisation\n", "\n", "Optimisation is the process of finding maxima and minima of a real-valued function, $f: \\mathbb{R}^n \\to \\mathbb{R}$, referred to as the objective function (cost function, optimand, loss function...) Various flavours:\n", "* local and global\n", "* constrained ($f: C \\subseteq \\mathbb{R}^n \\to \\mathbb{R}$) and unconstrained\n", "* convex and non-convex\n", "\n", "We will consider all problems to be minimisation problems. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Local and global minima\n", "\n", " Consider constrained optimisation problem over a set, $C \\subseteq \\mathbb{R}^n$:\n", " $$\\min_{\\substack{x \\in C} }f(x).$$\n", " \n", "A point $x^* \\in C$ is a *global minimum* of $f$ over $C$ if\n", "$$\n", "f(x^*) \\leq f(x) \\ \\ \\ \\text{for all $x \\in C$.}\n", "$$\n", "\n", "A point $x^* \\in C$ is a *local minimum* of $f$ over $C$ if there exists an $\\epsilon$-ball, $B(x^*, \\epsilon)$, centred at $x^*$ such that\n", "$$\n", "f(x^*) \\leq f(x) \\ \\ \\ \\text{for all $x \\in C \\cap B(x^*, \\epsilon)$,}\n", "$$\n", "with $\\epsilon > 0$.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Convex optimisation \n", "\n", "A convex optimisation problem is a problem of the form\n", "$$\n", "\\min_{\\substack{x \\in C} }f(x)\n", "$$\n", "where $C$ is a convex set and $f$ is a convex function on $C$. \n", "\n", "Key result:\n", "> If $C$ is a convex set and $f$ is a convex function on $C$, then every local minimum of $f$ over $C$ is also a global minimum of $f$ over $C$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Optimality conditions for convex problems\n", "\n", "If $\\mathbf{x}^*$ is a local minimum of $f$, then \n", "$$\\nabla\\,f(\\mathbf{x}^*) = 0.$$\n", "Called *first order optimality conditions*. Necessary but not sufficient: eigenvectors of the Hessian to distinguish minima, maxima and saddles.\n", "\n", "However, for a convex function on a convex set $C$, for any $\\mathbf{y} \\in C$\n", "$$\n", "f(\\mathbf{y}) - f(\\mathbf{x}^*) \\geq \\nabla\\,f (\\mathbf{x}^*) \\cdot (\\mathbf{y} -\\mathbf{x}^*) = 0.\n", "$$\n", "So $f(\\mathbf{y}) \\geq f(\\mathbf{x}^*)$ for all $\\mathbf{y} \\in C$ and $\\mathbf{x}^*$ is a minimum.\n", "\n", "For convex optimisation problems, first order optimality conditions are necessary *and* sufficient.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### arg min notation\n", "\n", "Given an optimisation problem,\n", "$$\n", "\\min_{\\substack{x \\in C} }f(x)\n", "$$\n", "we will sometimes write the solution as\n", "$$\n", "x^* = \\arg \\min_{x \\in C} f(x). \n", "$$\n", "\n", "This is shorthand way of saying that $x^*$ is the value (or set of values) of $x$ that minimises $f(x)$ over the set $C$." ] }, { "cell_type": "markdown", "metadata": { "cell_style": "split", "slideshow": { "slide_type": "slide" } }, "source": [ "### Linear optimisation in $\\mathbb{R}$\n", "Consider minimising $f(x) = 2 x + 1$ with $x \\in \\mathbb{R}$. Clearly no minimum without constraints.\n", "\n", "Some possible constraints:\n", "1. $x \\leq 1$ and $x\\geq-1$,\n", "2. $x \\geq 1$ and $x\\leq -1$,\n", "3. $x\\leq -1$ and $x \\leq -2$.\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "cell_style": "split", "slideshow": { "slide_type": "fragment" } }, "source": [ "Outcomes:\n", "\n", "1. Solution exists at $x=-1$. \n", "2. No solution because the constraints are inconsistent.\n", "3. No solution because the constraints do not prevent $x$ from becoming arbitrarily negative so $f(x)$ is unbounded below." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Optimisation of linear functions in $\\mathbb{R^n}$\n", "\n", "Linear programming means optimisation of linear functions on $\\mathbb{R}^n$ subject to constraints.\n", "\n", " * $\\mathbf{x} = (x_1, x_2,\\ldots x_n) \\in \\mathbb{R}^n$ are called *structural variables*.\n", " * $\\mathbf{c} = (c_1, c_2,\\ldots c_n) \\in \\mathbb{R}^n$ is called the *costs vector*.\n", " \n", " Objective function is\n", " $$\n", "\\begin{align}\n", "f:\\ \\mathbb{R}^n \\to \\mathbb{R} : \\ \\mathbf{x} &\\mapsto c_1 x_1 + c_2 x_2 + \\ldots + c_nx_n\\\\\n", "&= \\mathbf{c} \\cdot \\mathbf{x}.\n", "\\end{align}\n", "$$\n", " \n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Optimisation of linear functions in $\\mathbb{R^n}$: constraints\n", "The task is to minimise or maximise $f(\\mathbf{x})$ subject to the $m$ constraints\n", "$$\n", "\\begin{align}\n", " a_{1 1}x_1 + a_{1 2}x_2 + \\ldots a_{1 n} x_n &\\sim b_1\\\\\n", "a_{2 1}x_1 + a_{2 2}x_2 + \\ldots a_{2 n} x_n &\\sim b_2\\\\\n", "\\vdots \\hspace{3.0cm} &\\vdots\\\\\n", "a_{m 1}x_1 + a_{m 2}x_2 + \\ldots a_{m n} x_n &\\sim b_m,\n", "\\end{align}\n", "$$\n", "(where $\\sim$ can mean $\\geq$, $\\leq$ or $=$)\n", "*and* $n$ *non-negativity conditions* on the structural variables, \n", "$$\n", "x_1 \\geq 0,\\ x_2 \\geq 0, \\ldots x_n\\geq 0, \n", "$$\n", "There are $m+n$ constraints in total." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Feasible set\n", "\n", "$\\mathbf{x}$ is a *feasible* vector if it satisfies the constraints.\n", "\n", "The set of all feasible vectors is called the *feasible set*.\n", "A feasible vector, $\\mathbf{x}^*$, is said to be *optimal* if it minimises the objective function.\n", "\n", "There are 3 possibiliities:\n", "* an optimal feasible vector exists and the problem is said to be solvable,\n", "* there are no feasible vectors and the problem is said to be infeasible,\n", "* feasible vectors exist but there is no minimum and the problem is said to be unbounded.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Constraints in $\\mathbb{R}^2$\n", "\n", "Sometimes easier to visualise the complement of the feasible set." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "cell_style": "split" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x = np.arange(0.0, 40.01, 0.1)\n", "\n", "def f1(inputlist):\n", " return [50.0 - 2.0*i for i in inputlist]\n", "\n", "def f2(inputlist):\n", " return [30.0 - i/3.0 for i in inputlist]\n", "\n", "def f3(inputlist):\n", " return [45.0 - 3.0*i for i in inputlist]\n", "\n", "def f4(inputlist):\n", " return [13.0 - i/3.0 for i in inputlist]\n", "\n", "# Plot inequalities\n", "plt.rcParams.update({'font.size': 22})\n", "plt.figure(figsize=(12, 8))\n", "\n", "plt.plot(x, f1(x), \"b-\", label = \"$50-2x>0$\")\n", "plt.fill_between(x, f1(x), 40.0, color='blue', alpha=.2)\n", "\n", "plt.plot(x, f2(x), \"r-\", label = \"$30-x/3>0$\")\n", "plt.fill_between(x, f2(x), 40.0, color='red', alpha=.2)\n", "\n", "plt.plot(x, f3(x), \"g-\", label = \"$45-3x<0$\")\n", "plt.fill_between(x, 0.0, f3(x), color='green', alpha=.2)\n", "\n", "plt.plot(x, f4(x), \"m-\", label = \"$13-x/3<0$\")\n", "plt.fill_between(x, 0.0, f4(x), color='magenta', alpha=.2)\n", "\n", "plt.legend(loc=\"upper right\")\n", "\n", "plt.xlim([0.0, 40.0])\n", "plt.ylim([0.0, 40.0])\n", "\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Linear programming is a convex optimisation problem\n", "\n", "* Each equality constraint restricts the feasible set to a hyperplane of dimension n − 1 in $\\mathbb{R}^n$.\n", "* Each inequality constraint defines a hyperplane dividing $\\mathbb{R}^n$ into an allowed and non-allowed half-space. \n", "* The feasible set is an intersection of convex sets and is thus convex (a polyhedron in $\\mathbb{R}^n$). \n", "* f (x) is a convex function on $\\mathbb{R}^n$. \n", "* All linear programming problems are therefore convex optimisation problems." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Slack variables\n", "\n", "An inequality constraint can be converted into an equality constraint by introducing an additional variable called a *slack variable*.\n", "\n", "$$\n", " a_{1}x_1 + a_{2}x_2 + \\ldots a_{n} x_n \\leq b.\n", "$$\n", "is equivalent to writing an equality involving a new, non-negative slack variable, $s$:\n", "$$\n", " a_{1}x_1 + a_{2}x_2 + \\ldots a_{n} x_n + s = b,\n", "$$\n", "with $s \\geq 0$. \n", "\n", "The non-negativity constraint on the slack variable measures the extent to which the original inequality is satisfied." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Writing a linear program in standard form\n", "\n", "Any linear programme can be written in *standard form* in which the only inequality constraints are the non-negativity conditions and all remaining constraints are equality constraints. A linear programme is in standard form if it in the form: minimise\n", "$$\n", "f(\\mathbf{x}) = \\mathbf{c}\\cdot\\,\\mathbf{x} = c_1 x_1 + c_2 x_2 + \\dots +c_{n}x_{n},\n", "$$\n", "subject to $m$ $equality$ constraints\n", "$$\n", "A\\,\\mathbf{x} = \\mathbf{b}\n", "$$\n", "and $n$ non-negativity conditions\n", "$$\n", "\\mathbf{x} \\geq 0\n", "$$\n", "where $A$ is an $m \\times n$ matrix, $\\mathbf{b} \\in \\mathbb{R}^m$ and $\\mathbf{c} \\in \\mathbb{R}^{n}$ is a cost vector.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Converting a general linear programme to standard form\n", "\n", "1. Convert any $\\geq$ constraints to $\\leq$ constraints by multiplying by $-1$.\n", "2. For each $\\leq$ constraint introduce a new slack variable to convert it into an equality. Equality constraints do not need slack variables. \n", "3. Equality constraints with a negative right-hand side should be multiplied by -1 so that the right-hand side is positive.\n", "4. Build a new cost vector by padding the initial cost vector with zeros to accommodate the slack variables.\n", "\n", "Slack variables are now treated equivalently to the structural variables. \n", "However since they have zero cost, we can forget about them at the end.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### The solution, $\\mathbf{x}^*$, of a solvable LP is at a vertex of the feasible set\n", "\n", "The gradient of the objective function, $f(\\mathbf{x})$, is nowhere zero in $\\mathbb{R}^n$:\n", "$$\n", "\\nabla f(\\mathbf{x}) = \\mathbf{c} \\neq 0.\n", "$$\n", "Thus $\\mathbf{x}^*$ cannot be in the interior of the feasible set, $S$, and must therefore be on the boundary. \n", "\n", "The boundary of a polyhedron of dimension $d$ is a set of faces which are polyhedra of dimension $d-1$.\n", "\n", "Let's refer to the face containing $\\mathbf{x}^*$ as $P$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### The solution, $\\mathbf{x}^*$, of a solvable LP is at a vertex of the feasible set\n", "\n", "In general, the projection of the gradient of the objective function, $f(\\mathbf{x})$, onto the hyperplane containing $P$ is also nowhere zero in that hyperplane.\n", "\n", "Thus $\\mathbf{x}^*$ cannot be in the interior of $P$, and must be on the boundary. \n", "\n", "Iterating, we conclude that $\\mathbf{x}^*$ must be at a *vertex* of the feasible set.\n", "\n", "Since vertices are points in $\\mathbb{R}^n$, their coordinates must satisfy $n$ of the $n+m$ constraints as **equalities**.\n", "\n", "An $\\mathbf{x}$ satisfying $n$ constraints as equalities is called a *feasible basic vector*. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Fundamental theorem of Linear Programming\n", "\n", "> For any LP, if an optimal feasible vector exists then there is a feasible basic vector that is optimal. \n", "\n", "This reduces the original optimisation problem to a finite combinatorial task: \n", "\n", "> Enumerate all $\\binom{n+m}{n} $ feasible basic vectors, evaluate the objective function on each and choose a best one.\n", "\n", "This is then guaranteed to be optimal.\n", "\n", "Problem: in practice, the number of combinations can be prohibitively large.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Dantzig Simplex Algorithm\n", "\n", "* Dantzig simplex algorithm aims to determine *efficiently* which $n$ constraints from the $n+m$ available constraints are satisfied as equalities by the optimal feasible basic vector.\n", "\n", "* Idea: start from any vertex and iteratively move to new vertices so that the objective function always decreases.\n", "\n", "* Optimal vertex found when impossible to decrease any further." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Basic and non-basic variables\n", "\n", "For a LP in standard form:\n", "\n", "* $m$ components of a basic feasible vector, $\\mathbf{x}$, are general non-zero since $\\mathbf{x}$ satisfies the $m$ equality constraints. These are called *basic variables*.\n", "* The remaining $n-m$ components of $\\mathbf{x}$ must be zero since $\\mathbf{x}$ must satisfy a subset of of the inequality constraints as equalities. These are called *non-basic variables*.\n", "* Different basic feasible vectors will have different basic and non-basic variables." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Simplex algorithm: schematic\n", "\n", "1. Start with any basic feasible vector, $\\mathbf{x}$. \n", "2. Identify the current non-basic variable, $x_k$, that would produce the largest decrease in the objective, $f(\\mathbf{x})$, if it became positive. \n", "3. Identify the current basic variable, $x_i$, that hits zero first as $x_k$ increases. \n", "4. Swap $x_i$ for $x_k$ to produce a new basic feasible vector, $\\mathbf{x}$ and return to step 2.\n", "\n", "To know how to select $x_k$ at step 2 and $x_i$ at step 3 some calculations are needed. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Simplex algorithm: termination conditions\n", "\n", "How do we know when to stop? \n", "\n", "The algorithm can terminate in two ways:\n", "\n", "* At step 2: if none of the current non-basic variables can decrease $f(\\mathbf{x})$ by becoming positive, then the current basic feasible vector is optimal.\n", "\n", "* At step 3: if there is no basic variable that becomes zero as $x_k$ is increased, the problem is unbounded." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Simplex algorithm: some notation\n", "\n", "\n", "Let us denote column $k$ of the matrix $A$ by $\\mathbf{a}_k$. Thus we have\n", "$$\n", "A = \\left(\\mathbf{a}_1 | \\mathbf{a}_2 | \\ldots | \\mathbf{a}_{n+m}\\right).\n", "$$\n", "Rearrange the columns of $\\mathbf{x}^T$ so that the basic variables come first:\n", "$$\n", "\\mathbf{x}^T = (\\mathbf{x}_B\\, |\\, \\mathbf{x}_N).\n", "$$\n", "We must similarly rearrange the columns of $A$ and $\\mathbf{c}$:\n", "$$\n", "\\begin{align*}\n", "A & = \\left( A_B\\, |\\, A_N\\right)\\\\\n", "\\mathbf{c}^T & = \\left(\\mathbf{c}_B\\, | \\, \\mathbf{c}_N\\right).\n", "\\end{align*}\n", "$$\n", "Since the non-basic variables are all zero, $\\mathbf{x}_B$ satisfies\n", "$$\n", "\\begin{align}\n", " & A_B\\,\\mathbf{x}_B = \\mathbf{b}\\\\\n", "\\Rightarrow &\\mathbf{x}_B = A_B^{-1}\\,\\mathbf{b}.\n", "\\end{align}\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Simplex algorithm: selecting the non-basic variable to make basic \n", "\n", "Take a non-basic variable, $x_k$ and increase it away from zero. \n", "Then $\\mathbf{x}_B$ changes to some other value, $\\mathbf{x}_B^\\prime$. \n", "Since only $x_k$ among the non-basic variables is not zero, the satisfaction of the constraints requires that\n", "$$\n", "A_B\\, \\mathbf{x}_B^\\prime + x_k\\,\\mathbf{a}_k = \\mathbf{b}.\n", "$$\n", "Solving for $\\mathbf{x}_B^\\prime$:\n", "$$\n", "\\mathbf{x}_B^\\prime = A_B^{-1}\\,\\mathbf{b} - x_k A_B^{-1}\\,\\mathbf{a}_k.\n", "$$\n", "Using the fact that $\\mathbf{x}_B = A_B^{-1}\\,\\mathbf{b}$ we get\n", "$$\n", "\\mathbf{x}_B^\\prime = \\mathbf{x}_B - x_k A_B^{-1}\\,\\mathbf{a}_k.\n", "$$\n", "We can now calculate the change in the objective function upon going from $\\mathbf{x}_B$ to $\\mathbf{x}_B^\\prime$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Simplex algorithm: selecting the non-basic variable to make basic \n", "\n", "Let $\\mathbf{e}_k$ be the unit vector in the $k^\\text{th}$ coordinate direction in $\\mathbb{R}^n$. \n", "\n", "**Before** increasing $x_k$, the objective function is:\n", "$$\n", "f[ \\left(\\mathbf{x}_B\\, | \\, \\mathbf{x}_N\\right)^T] = \\mathbf{c}_B^T\\,\\mathbf{x}_B.\n", "$$\n", "**After** increasing $x_k$ we have\n", "$$\n", "\\begin{align}\n", "f[ \\left(\\mathbf{x}_B^\\prime\\, | \\, \\mathbf{x}_N\\right) + x_k\\mathbf{e}_k] &= \\mathbf{c}_B^T\\,\\mathbf{x}_B^\\prime + c_k x_k\\\\\n", " & = \\mathbf{c}_B^T \\left( \\mathbf{x}_B - x_k A_B^{-1}\\,\\mathbf{a}_k \\right) + c_k x_k\\\\\n", " &= \\mathbf{c}_B^T\\,\\mathbf{x}_B - x_k\\left( \\mathbf{c}_B^T A_B^{-1}\\mathbf{a}_k -c_k\\right).\n", "\\end{align}\n", "$$ \n", "The **difference** is\n", "$$\n", "(\\Delta\\,f)_k = x_k\\left( c_k - \\mathbf{c}_B^T A_B^{-1}\\mathbf{a}_k\\right).\n", "$$\n", "We choose the non-basic variable, $x_k$, with the **most negative** value of $(\\Delta \\, f)_k$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Simplex algorithm: selecting the basic variable to make non-basic \n", "We have found above\n", "$$\n", "\\mathbf{x}_B^\\prime = \\mathbf{x}_B - x_k A_B^{-1}\\,\\mathbf{a}_k.\n", "$$\n", "\n", "To simplify notation, write $\\mathbf{w} = A_B^{-1}\\,\\mathbf{a}_k$. The $i^\\text{th}$ component of $\\mathbf{x}_B^\\prime$ is\n", "$$\n", "(x_B^\\prime)_i = (x_B)_i - x_k\\,w_i.\n", "$$\n", "We see that for each $w_i > 0$, the $i^\\text{th}$ component of $\\mathbf{x}_B^\\prime$ decreases as $x_k$ increases.\n", "Setting $(x_B^\\prime)_i =0$ and solving for $x_k$ we get\n", "$$\n", "x_k = \\frac{(x_B)_i }{w_i}.\n", "$$\n", "We choose the basic variable with the smallest value of this ratio (among those with $w_i > 0$) since it reaches zero first as $x_k$ increases. \n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Finding an initial basic feasible vector: simple case\n", "\n", "We have not yet shown how to find a basic feasible vector to start the simplex algorithm. Sometimes this is easy. Consider this example in $\\mathbb{R}^2$:\n", "$$\n", "\\begin{align*}\n", "2\\,x_1 + x_2 &\\leq 70\\\\\n", "x_1 + 3\\,x_2 &\\leq 90, \n", "\\end{align*}\n", "$$\n", "with $x_1 \\geq 0$ and $x_2 \\geq 0$. \n", "\n", "Introducing slack variables, $s_1$ and $s_2$, gives a LP in standard form in $\\mathbb{R}^4$: \n", "$$\n", "\\begin{align*}\n", "2\\,x_1 + x_2 + s_1 &= 70\\\\\n", "x_1 + 3\\,x_2 + s_2 & = 90, \n", "\\end{align*}\n", "$$\n", "with $x_1 \\geq 0$, $x_2 \\geq 0$, $s_1 \\geq 0$ and $s_2 \\geq 0$. \n", "Setting $x_1 = x_2 = 0$, immediately gives a basic feasible vector: $(x_1, x_2, s_1, s_2 ) = (0,0, 70, 90)$.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Finding an initial basic feasible vector: general case\n", "\n", "This simple approach can fail for two reasons. \n", "\n", "1. if an inequality has a negative right-hand side after we put the problem in standard form. Setting the original variables to zero would give a negative slack variable and violate the non-negativity constraint. \n", "2. if there are equality constraints, they don't have a slack variable in standard form and would generally not be satisfied if the original variables are set to zero. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Finding an initial basic feasible vector: general case\n", "\n", "Here is an example in $\\mathbb{R}^3$:\n", "$$\n", "\\begin{align*}\n", "-3\\,x_1 + x_2 + x_3 &\\geq 1\\\\\n", "x_1 + 2\\,x_2 - x_3 &\\leq -2\\\\\n", "2\\,x_1 + x_2 &\\leq 2\\\\\n", "-x_1 - x_2 &= -1,\n", "\\end{align*}\n", "$$\n", "with $x_1 \\geq 0$, $x_2 \\geq 0$ and $x_3 \\geq 0$. In standard form in $\\mathbb{R}^6$ we have\n", "$$\n", "\\begin{align*}\n", "3\\,x_1 - x_2 - x_3 +s_1 &= -1\\\\\n", "x_1 + 2\\,x_2 - x_3 + s_2 &= -2\\\\\n", "2\\,x_1 + x_2 + s_3 & = 2\\\\\n", "x_1 + x_2 &= 1,\n", "\\end{align*}\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Finding an initial basic feasible vector: artificial variables\n", "\n", "The general approach is to introduce a *second* set of new variables called *artificial variables*.\n", "\n", "Artificial variables make it easy to find a feasible basic vector, albeit for a *modified* linear programme to the one we started with, called the *auxiliary problem*. \n", "\n", "The objective function of the auxiliary problem is constructed so that the artificial variables are zero at the optimum.\n", "\n", "Using the simplex method to solve the auxiliary problem finds a basic feasible vector of the original problem since the artificial variables are set to zero." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Finding an initial basic feasible vector: artificial variables\n", "\n", "* Any constraint with negative right hand side that came from an inequality will already contain a slack variable, $s$, in standard form:\n", "$$\n", " a_{k 1}x_1 + a_{k 2}x_2 + \\ldots a_{k n} x_n + s = - b_k .\n", "$$\n", "We subtract an artificial variable, $a$, from the left-hand side to give\n", "$$\n", " a_{k 1}x_1 + a_{k 2}x_2 + \\ldots a_{k n} x_n +s - a = - b_k,\n", "$$\n", "with $a \\geq 0$.\n", "\n", "* For any equality constraint in standard form,\n", "$$\n", " a_{k 1}x_1 + a_{k 2}x_2 + \\ldots a_{k n} x_n = b_k,\n", "$$\n", "we add an artificial variable, $a$, to the left-hand side:\n", "$$\n", " a_{k 1}x_1 + a_{k 2}x_2 + \\ldots a_{k n} x_n + a = b_k,\n", "$$\n", "with $a \\geq 0$.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Finding an initial basic feasible vector: artificial variables\n", "\n", "In both cases, we have removed the obstruction to finding a basic feasible vector since we can now write $x_1 = x_2 = \\ldots = x_n = 0$, $s=0$ (if necessary) and $a= b_k > 0$.\n", "\n", "The objective function of the auxiliary problem should be the sum of all of the artificial variables introduced.\n", "\n", "Minimising this objective function via the simplex algorithm will find an optimum at which the artificial variables are zero which gives a basic feasible vector for the original LP.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### PuLP\n", "\n", "* [PuLP](https://coin-or.github.io/pulp/) is a framework for mathematical optimisation in Python. \n", "* Provides unified access to lots of optimisation algorithms.\n", "* Preferred option for research use.\n", "\n", "We can use SciPy to import this functionality - you can read more (including installation tips) [here](https://realpython.com/linear-programming-python/#installing-scipy-and-pulp)." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from scipy.optimize import linprog" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Solving a simple linear programme\n", "\n", "$$\\min_{\\substack{(x_1, x_2) \\in \\mathbb{R}^2} } -40\\, x_1 - 60\\, x_2$$\n", "\n", "subject to the constraints\n", "\n", "$$2\\, x_1 + x_2 \\leq 70 $$\n", "$$x_1 + 3\\, x_2 \\leq 90 $$\n", "$$ 3\\, x_1 + x_2 \\geq 46 $$\n", "$$ x_1 + 4\\, x_2 \\geq 52 $$\n", "\n", "with $x_1 \\geq 0$ and $x_2 \\geq 0$.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "We need to create a \"model\", then specify the variables, objective function and constraints." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "obj = [-40, -60]\n", "\n", "lhs_ineq = [[ 2, 1],[ 1, 3],[-3, -1],[-1, -4]]\n", "\n", "rhs_ineq = [70, 90, -46, -52]\n", "\n", "# bounds of x and y\n", "bnd = [(0, float(\"inf\")), (0, float(\"inf\"))] " ] }, { "cell_type": "markdown", "metadata": { "cell_style": "split", "slideshow": { "slide_type": "slide" } }, "source": [ "Now we call the optimiser to solve the problem:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "cell_style": "split" }, "outputs": [ { "data": { "text/plain": [ " con: array([], dtype=float64)\n", " fun: -2280.0\n", " message: 'Optimization terminated successfully.'\n", " nit: 4\n", " slack: array([ 0.00000000e+00, -1.42108547e-14, 4.80000000e+01, 6.00000000e+01])\n", " status: 0\n", " success: True\n", " x: array([24., 22.])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "opt = linprog(c=obj, A_ub=lhs_ineq, b_ub=rhs_ineq, bounds=bnd, method=\"revised simplex\")\n", "\n", "opt" ] }, { "cell_type": "markdown", "metadata": { "cell_style": "split" }, "source": [ "Some bespoke functions are provided to access the solution." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Status = True\n", "Optimal objective function value: -2280.0\n", "Optimal Solutions:\n", "x = 24.0\n", "y = 22.000000000000004\n" ] } ], "source": [ "print(\"Status = \", opt.success)\n", "print(\"Optimal objective function value: \", opt.fun)\n", "print(\"Optimal Solutions:\")\n", "print(\"x = \", opt.x[0])\n", "print(\"y = \", opt.x[1])" ] }, { "cell_type": "markdown", "metadata": { "cell_style": "split", "slideshow": { "slide_type": "slide" } }, "source": [ "### Application: quantile regression\n", "\n", "Observations, $\\left\\{(x_i, y_i), i=1 \\ldots n \\right\\}$ \n", "\n", "Linear regression models the conditional expectation of $y$ given $x$ as a linear function:\n", "$$\n", "\\mathbb{E}(y\\, |\\, x) = \\beta_0 + \\beta_1\\, x.\n", "$$\n", "\n", "Get $\\mathbf{\\beta} = (\\beta_0, \\beta_1)$,by minimising the sum of squared errors:\n", "\n", "$$ \\sum_{i=1}^n \\left(y_i - \\beta_0 - \\beta_1\\,x_i \\right)^2\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "cell_style": "split", "slideshow": { "slide_type": "-" } }, "source": [ "Quantile regression models the $\\tau$-quantile of $y$ given $x$ as a linear function:\n", "$$\n", "\\mathbb{Q}_\\tau(y\\, |\\, x) = \\beta_0(\\tau) + \\beta_1(\\tau)\\, x.\n", "$$\n", "\n", "$\\mathbf{\\beta} = (\\beta_0, \\beta_1)$, estimated by minimising the sum of *tilted losses*:\n", "\n", "$$\n", "\\sum_{i=1}^n \\rho_\\tau \\left(y_i - \\beta_0 - \\beta_1\\,x_i \\right).\n", "$$\n", "where\n", "$$\n", "\\rho_\\tau(z) = \\left|z \\right| \\left(\\tau \\mathbb{1}_{(z\\geq 0)} + (1-\\tau)\\mathbb{1}_{(z<0)}\\right).\n", "$$\n", "$\\mathbb{1}_{S}$ is the [indicator function](https://en.wikipedia.org/wiki/Indicator_function)." ] }, { "cell_type": "markdown", "metadata": { "cell_style": "split", "slideshow": { "slide_type": "slide" } }, "source": [ "### Loss function for quantile regression\n", "\n", "Why this strange optimand of reweighted absolute errors?\n", "\n", "Consider, for example, the 25% quantile, $\\tau=0.25$.\n", "\n", "The $\\beta$'s should be such that 25% of the residuals are negative and 75% are positive." ] }, { "cell_type": "markdown", "metadata": { "cell_style": "split" }, "source": [ "* -ve residuals upweighted by $1-\\tau = 0.75$.\n", "* +ve residuals downweighted by $\\tau = 0.25$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Quantile regression as a linear programme\n", "\n", "An equivalent way to write the tilted loss function (check) is\n", "$$\n", "\\rho_\\tau(z) = \\tau\\, \\max(z, 0) + (1-\\tau)\\,\\max(-z,0).\n", "$$\n", "\n", "Write the residuals as\n", "$$ y_i - \\beta_0 - \\beta_1\\,x_i = u_i^+ - u_i^-$$\n", "where \n", "$$\n", "\\begin{align*}\n", "u^+_i &= \\max(y_i - \\beta_0 - \\beta_1\\,x_i,\\,0) \\geq 0\\\\\n", "u^-_i & = \\max(\\beta_0 + \\beta_1\\,x_i-y_i,\\,0) \\geq 0.\n", "\\end{align*}\n", "$$\n", "We then have\n", "\n", "$$\n", "\\rho_\\tau(y_i - \\beta_0 - \\beta_1\\,x_i) = \\tau u_i^+ + (1-\\tau)\\,u_i^-\n", "$$\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Quantile regression as a linear programme\n", "\n", "The quantile regression optimisation problem is then equivalent to the LP:\n", "$$\n", "\\min_{\\beta_0, \\beta_1, u^\\pm_1\\ldots u^\\pm_n} \\sum_{i=1}^n \\tau u_i^+ + (1-\\tau)\\,u_i^-\n", "$$\n", "subject to the $n$ constraints\n", "$$\n", "u_i^+ - u_i^- = y_i - \\beta_0 - \\beta_1\\,x_i \\ \\ \\ \\ \\ \\ \\ \\text{for } i=1\\ldots n,\n", "$$\n", "and the non-negativity conditions \n", "$$\n", "u_i^+\\geq 0,\\ \\ u_i^- \\geq 0 \\ \\ \\ \\ \\ \\ \\ \\text{for } i=1\\ldots n.\n", "$$\n", "\n", "To put in standard form, also need to write\n", "$$ \n", "\\beta_0 = \\beta_0^+ + \\beta_0^- \\ \\ \\ \\text{and}\\ \\ \\ \n", "\\beta_1 = \\beta_1^+ + \\beta_1^-\n", "$$\n", "with $\\beta_0^+ \\geq 0$, $\\beta_0^- \\geq 0$, $\\beta_1^+ \\geq 0$, $\\beta_1^- \\geq 0$." ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 2 }