{ "metadata": { "name": "", "signature": "sha256:d154dbb9c432790ec154335a93bdece6a49edfb6d5edad4d594494c53af60529" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Logistic and linear regression with first order methods" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notebook to play with a few first order optimization methods. Currently covers proximal algorithms for l1 and l2 regularization as well as more recent stochastic methods like SAG and MISO. Optimization is done either on the least squares or logistic loss.\n", "\n", "### Table of content\n", "\n", "[1. Loss function and gradients](#loss)
\n", "[2. Proximal gradient derived from a majorization-minimization method](#mm_method)
\n", "[3. Proximal operators](#prox)
\n", "[4. Full gradient methods (GD, ISTA, FISTA)](#full)
\n", "[5. Stochastic methods (SGD, SAG, MISO, SDCA, SVRG)](#stoc)
\n", "[6. Generate dataset](#data)
\n", "[7. Optimize (full gradient)](#optf)
\n", "[8. Optimize (stochastic)](#opts)
\n", "[Appendix](#appendix)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "from numpy.linalg import norm\n", "\n", "%matplotlib inline\n", "import matplotlib.pylab as plt" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "## Loss functions and gradients" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Least squares:\n", "\n", "$$\n", "\\begin{align*}\n", "\\ell(\\theta; \\mathbf{x}, \\mathbf{y}) = \\frac{1}{2n}\\sum_{i=1}^n(\\theta^Tx_i - y_i)^2 \\\\\n", "\\frac{\\partial \\ell(\\theta; \\mathbf{x}, \\mathbf{y})}{\\partial\\theta} = \\frac{1}{n}\\sum_{i=1}^n(\\theta^Tx_i - y_i)x_i \\\\ \n", "\\end{align*}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We use 2D numpy array for `features` and `labels` to take advantage of array magic." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def least_squares(x, features, labels):\n", " \"\"\"Evaluates the least square function.\"\"\"\n", " n_samples = features.shape[0]\n", " x = x.reshape(1, n_features)\n", " loss_array = (features.dot(x.T) - labels) ** 2\n", " return np.sum(loss_array, axis=0) / (2. * n_samples)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 34 }, { "cell_type": "code", "collapsed": false, "input": [ "def least_squares_grad(x, features, labels):\n", " \"\"\"Evaluates the gradient of the least square function.\"\"\"\n", " n_samples = features.shape[0]\n", " x = x.reshape(1, n_features) # Added for scipy.optimize compatibility\n", " grad_array = (features.dot(x.T) - labels) * features\n", " return np.sum(grad_array, axis=0) / n_samples" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Logistic and loss:\n", "$$\n", "\\begin{align*}\n", "s(x) & = \\frac{1}{1+e^{-x}} \\\\\n", "\\ell(\\theta; \\mathbf{x}, \\mathbf{y}) & = \\frac{1}{n}\\sum_{i=1}^n\\log(1 + e^{(-y_i\\theta^Tx_i)}) \\\\\n", "\\frac{\\partial \\ell(\\theta; \\mathbf{x}, \\mathbf{y})}{\\partial\\theta} & = \\frac{1}{n}\\sum_{i=1}^n\\frac{-y_i x_i}{1+\\exp(y_i\\theta^T x_i)}\n", "\\end{align*}\n", "$$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "logistic = lambda x: 1. / (1. + np.exp(-x))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "def logistic_loss(x, features, labels):\n", " \"\"\"Evaluates the logistic loss function.\"\"\"\n", " n_samples, n_features = features.shape\n", " x = x.reshape(1, n_features)\n", " loss_array = np.log(1 + np.exp(-labels * features.dot(x.T)))\n", " return np.sum(loss_array, axis=0) / n_samples" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "def logistic_loss_grad(x, features, labels):\n", " \"\"\"Evaluates the gradient of the logistic loss.\"\"\"\n", " n_samples = features.shape[0]\n", " x = x.reshape(1, n_features) # Added for scipy.optimize compatibility\n", " grad_array = -labels / (1 + np.exp(labels * features.dot(x.T))) * features\n", " return np.sum(grad_array, axis=0) / n_samples" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "## Proximal gradient derived from a majorization-minimization method\n", "\n", "Let's say we would like to minimize $f + g$, with $f: \\mathbb{R}^n \\rightarrow \\mathbb{R}$ a convex, $\\beta$-smooth function and $g$ a convex function with a simple proximal operator.\n", "\n", "A simple upper bound on $f+g$ is:\n", "\n", "$$\n", "\\begin{align*} \n", "f(y) + g(y) & \\leq \\{f(x) + \\nabla{f(x)^T}(y - x) + \\frac{1}{2\\lambda}\\|x-y\\|_{2}^2 + g(y)\\\\\n", "& = q_\\lambda(x, y),\n", "\\end{align*}\n", "$$\n", "where $\\lambda \\in (0, 1/\\beta]$.\n", "\n", "Iteratively minimizing $q_\\lambda(x^t, \\cdot)$ will converge the minimum of $f+g$ \n", "$$\n", "\\DeclareMathOperator*{\\argmin}{argmin}\n", "\\DeclareMathOperator*{\\prox}{prox}\n", "$$\n", "$$\n", "\\begin{align*} \n", "\\argmin_x q_\\lambda(x^t, x) & = \\argmin_x \\{f(x^t) + \\nabla{f(x^t)^T}(x - x^t) + \\frac{1}{2\\lambda}\\|x-x^t\\|_{2}^2 + g(x)\\} \\\\ \n", "& = \\argmin_x \\{\\frac{1}{2}\\|x - (x^t - \\lambda\\nabla f(x^t))\\|_2^2 + \\lambda g(x)\\} \\\\\n", "& = \\text{prox}_{\\lambda g}\\left(x^t - \\lambda\\nabla f(x^t)\\right) \\\\\n", "\\end{align*}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "## Proximal operators\n", "\n", "The derivation of the proximal operators leads to:\n", "\n", "$$\n", "\\begin{align*}\n", "\\text{prox}_{\\lambda\\|\\cdot\\|_1}(v) & = \\text{sign}(v) \\odot (|v| \u2212 \\lambda)_+ \\\\\n", "\\text{prox}_{\\lambda\\|\\cdot\\|_2^2}(v) & = \\frac{1}{1 + \\lambda} v \\\\\n", "\\text{prox}_{\\lambda_1\\|\\cdot\\|_1 + \\lambda_2 / 2\\|\\cdot\\|_2^2}(v) & = \\frac{1}{1 + \\lambda_2} \\text{sign}(v) \\odot (|v| - \\lambda_1)_+\n", "\\end{align*}\n", "$$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def prox_l1(x, l=1.):\n", " \"\"\" Proximal operator of the l1 norm.\"\"\"\n", " x_abs = np.abs(x)\n", " return np.sign(x) * (x_abs - l) * (x_abs > l)\n", "\n", "def prox_l2(x, l=1.):\n", " \"\"\" Proximal operator of the l2 norm.\"\"\"\n", " return 1. / (1 + l) * x\n", "\n", "def prox_enet(x, l_l1, l_l2, t=1.):\n", " \"\"\"Proximal operator for the elastic net at x\"\"\"\n", " x_abs = np.abs(x)\n", " prox_l1 = np.sign(x) * (x_abs - t * l_l1) * (x_abs > t * l_l1)\n", " return prox_l1 / (1. + t * l_l2)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "## Full gradient methods (GD, ISTA, FISTA)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before implementing the logic of GD, ISTA or FISTA we provide a simple function to be called after each iteration to gather and display a few metrics about current the minimization process." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def inspector(loss_fun, x_real, verbose=False):\n", " \"\"\"A closure called to update metrics after each iteration.\"\"\"\n", " objectives = []\n", " errors = []\n", " it = [0] # This is a hack to be able to modify 'it' inside the closure.\n", " def inspector_cl(xk):\n", " obj = loss_fun(xk)\n", " err = norm(xk - x_real) / norm(x_real)\n", " objectives.append(obj)\n", " errors.append(err)\n", " if verbose == True:\n", " if it[0] == 0:\n", " print ' | '.join([name.center(8) for name in [\"it\", \"obj\", \"err\"]])\n", " if it[0] % (n_iter / 5) == 0:\n", " print ' | '.join([(\"%d\" % it[0]).rjust(8), (\"%.2e\" % obj).rjust(8), (\"%.2e\" % err).rjust(8)])\n", " it[0] += 1\n", " inspector_cl.obj = objectives\n", " inspector_cl.err = errors\n", " return inspector_cl" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "And now we can implement the algorithms." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def gd(x_init, grad, n_iter=100, step=1., callback=None):\n", " \"\"\"Basic gradient descent algorithm.\"\"\"\n", " x = x_init.copy()\n", " \n", " for _ in range(n_iter):\n", " x -= step * grad(x)\n", " \n", " # Update metrics after each iteration.\n", " if callback is not None:\n", " callback(x)\n", " return x" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "def ista(x_init, grad, prox, n_iter=100, step=1., callback=None):\n", " \"\"\"ISTA algorithm.\"\"\"\n", " x = x_init.copy()\n", " \n", " for _ in range(n_iter):\n", " x = prox(x - step * grad(x), step)\n", " \n", " # Update metrics after each iteration.\n", " if callback is not None:\n", " callback(x)\n", " return x" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "def fista(x_init, grad, prox, n_iter=100, step=1., callback=None):\n", " \"\"\"FISTA algorithm.\"\"\"\n", " x = x_init.copy()\n", " y = x_init.copy()\n", " t = 1.\n", " \n", " for _ in range(n_iter):\n", " x_new = prox(y - step * grad(y), step)\n", " t_new = (1. + (1. + 4. * t**2)**.5) / 2\n", " y = x_new + (t - 1) / t_new * (x_new - x)\n", " t = t_new\n", " x = x_new\n", "\n", " # Update metrics after each iteration.\n", " if callback is not None:\n", " callback(x)\n", " return x" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "## Stochastic methods (SGD, SAG, MISO, SVRG)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Same but for (more recent) stochastic algorithms." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def sgd(x_init, features, labels, grad, n_iter=100, step=1., callback=None):\n", " \"\"\"Stochastic gradient descent algorithm.\"\"\"\n", " x = x_init.copy()\n", " \n", " n_samples, n_features = features.shape\n", " \n", " for i in range(n_iter):\n", " idx = np.random.randint(n_samples)\n", " feature = features[idx].reshape(1, n_features)\n", " label = labels[idx]\n", " x -= step * grad(x, feature, label) / (n_samples * np.sqrt(i + 1))\n", " \n", " # Update metrics after each iteration.\n", " if callback is not None:\n", " callback(x)\n", " return x" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "def sag(x_init, features, labels, grad, n_iter=100, step=1., callback=None):\n", " \"\"\"Stochastic average gradient algorithm.\"\"\"\n", " x = x_init.copy()\n", " \n", " n_samples, n_features = features.shape\n", " y_old = np.zeros((n_samples, n_features))\n", " y = np.zeros(n_features)\n", " \n", " for _ in range(n_iter):\n", " idx = np.random.randint(n_samples)\n", " feature = features[idx].reshape(1, n_features)\n", " label = labels[idx]\n", " y_new = grad(x, feature, label)\n", " y += (y_new - y_old[idx]) / n_samples\n", " y_old[idx] = y_new\n", " x -= step * y / n_samples\n", " \n", " # Update metrics after each iteration.\n", " if callback is not None:\n", " callback(x)\n", " return x\n", " " ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "def miso(x_init, features, labels, grad, prox, n_iter=100, step=1., callback=None):\n", " \"\"\"MISO algorithm.\"\"\"\n", " x = x_init.copy()\n", " \n", " n_samples, n_features = features.shape\n", " z_old = np.zeros((n_samples, n_features))\n", " z = np.zeros(n_features)\n", " \n", " for _ in range(n_iter):\n", " idx = np.random.randint(n_samples)\n", " feature = features[idx].reshape(1, n_features)\n", " label = labels[idx]\n", " z_new = grad(x, feature, label) \n", " z += (z_new - z_old[idx]) / n_samples\n", " z_old[idx] = z_new\n", " x = prox(x - step * z, step)\n", " \n", " # Update metrics after each iteration.\n", " if callback is not None:\n", " callback(x)\n", " return x" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "def svrg(x_init, features, labels, grad, n_iter=100, batch_size=10, step=1., callback=None):\n", " \"\"\"Stochastic variance reduction gradient algorithm.\"\"\"\n", " x = x_init.copy()\n", " \n", " n_samples, n_features = features.shape\n", " x_old = sgd(x_init, features, labels, grad, n_iter=batch_size, step=step, callback=None)\n", " mu = grad(x_old, features, labels)\n", " \n", " x = x_old\n", " for i in range(n_iter):\n", " if i % batch_size == 0:\n", " x_old = x\n", " mu = grad(x, features, labels)\n", " idx = np.random.randint(n_samples)\n", " feature = features[idx].reshape(1, n_features)\n", " label = labels[idx]\n", " z_new = grad(x, feature, label)\n", " z_old = grad(x_old, feature, label)\n", " x -= step * (z_new - z_old + mu) / n_samples\n", " \n", " # Update metrics after each iteration.\n", " if callback is not None:\n", " callback(x)\n", " return x" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "def sdca(x_init, features, labels, grad, n_iter=100, step=1., callback=None):\n", " \"\"\"Stochastic dual coordinate ascent.\"\"\"\n", " x = x_init.copy()\n", " \n", " # TODO\n", " \n", " # Update metrics after each iteration.\n", " if callback is not None:\n", " callback(x)\n", " return x" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "IndentationError", "evalue": "unexpected indent (, line 8)", "output_type": "pyerr", "traceback": [ "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m8\u001b[0m\n\u001b[0;31m if callback is not None:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m unexpected indent\n" ] } ], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "## Generate dataset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We test the above algorithms on a generated dataset. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Generate a fake dataset\n", "\n", "n_samples = 2000\n", "n_features = 50\n", "\n", "idx = np.arange(n_features).reshape(1, n_features)\n", "params = 2 * (-1) ** (idx - 1) * .9**idx\n", "params[0, 20:50] = 0\n", "diag = np.random.rand(n_features)\n", "features = np.random.multivariate_normal(np.zeros(n_features), np.diag(diag), n_samples)\n", "\n", "# Show the condition number of the gram matrix\n", "print \"cond = %.2f\" % (diag.max() / diag.min())" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "cond = 83.77\n" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "# Change this to 'False' to estimate the logitic regression model.\n", "linear = True\n", "if linear == True:\n", " residuals = np.random.randn(n_samples, 1)\n", " labels = features.dot(params.T) + residuals\n", "else:\n", " labels = np.array([[float(np.random.rand() < p)] for p in logistic(features.dot(params.T))])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "plt.figure(figsize=(8, 4))\n", "plt.stem(params[0])\n", "plt.title(\"True parameters\", fontsize=16)\n", "plt.show()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nBmxJksbA/wfjS2JuR8dfXwAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 19 }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "## Optimize (full gradient)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Choosing the step size\n", "\n", "All algorithms use a constant step size set to $1/L$, where $L$ is a Lipschitz constant for the gradient of the loss.\n", "\n", "1.Least squares\n", "\n", "$$L = \\frac{ \\|\\mathbf{x}^T \\mathbf{x}\\|_{op}}{n}$$\n", "\n", "2.Logistic loss\n", "$$L = \\frac{\\underset{i}{\\max}(\\|x_i\\|_2^2)}{4n} $$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Initialize stuff\n", "x_init = 1 - 2 * np.random.rand(1, n_features)\n", "n_iter = 30\n", "l_l1 = 0.0\n", "l_l2 = 0.1\n", "\n", "# f and gradient\n", "if linear == True:\n", " f = lambda x: least_squares(x, features, labels)\n", " grad_f = lambda x: least_squares_grad(x, features, labels)\n", " step = norm(features.T.dot(features) / n_samples, 2)\n", "else:\n", " f = lambda x: logistic_loss(x, features, labels)[0]\n", " grad_f = lambda x: logistic_loss_grad(x, features, labels)\n", " step = 1. # np.sum(features**2, axis=1).max() / (4 * n_samples)\n", "\n", "# g, F and prox.\n", "g = lambda x: l_l1 * np.abs(x).sum() + 0.5 * l_l2 * np.sum(x**2)\n", "F = lambda x: f(x) + g(x)\n", "prox_g = lambda x, l: prox_enet(x, l_l1, l_l2, l)\n", "\n", "print \"Type: %s\" % ('linear' if linear else 'logistic')\n", "print \"n_iter: %d\" % n_iter\n", "print \"step size: %.2f\" % step" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Type: linear\n", "n_iter: 30\n", "step size: 1.04\n" ] } ], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "import scipy.optimize" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "ls = lambda x: logistic_loss(x, features, labels)\n", "print scipy.optimize.approx_fprime(x_init.ravel(), ls, 1e-3)\n", "print logistic_loss_grad(x_init, features, labels)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[ 0.30424101 -0.26230376 0.4674678 -0.16728611 0.11170092 -0.08324431\n", " 0.35837712 -0.1988963 0.10854892 -0.10317867 0.10031488 0.00586717\n", " 0.0221764 -0.12311822 0.00355377 -0.11660948 0.02513881 -0.06978285\n", " 0.27948178 -0.20718274 -0.15874555 -0.13193407 0.04810521 0.13370537\n", " -0.00458892 0.05095335 -0.06442196 0.07053449 0.05177863 0.10642691\n", " -0.09323656 -0.21188971 -0.0784917 0.33497437 0.07748511 -0.20380341\n", " 0.0670902 0.02193815 0.15782084 -0.07780451 -0.03801027 -0.12387279\n", " 0.09561104 0.06024432 -0.11468991 0.2260843 0.07523159 -0.23414648\n", " 0.01797566 0.08944417]\n", "[ 0.30413249 -0.26240177 0.46732437 -0.16733445 0.11164676 -0.08330004\n", " 0.3582644 -0.19901026 0.10852345 -0.10325725 0.10021726 0.00585475\n", " 0.02217071 -0.12326196 0.00354838 -0.11665473 0.02512696 -0.06986414\n", " 0.27938023 -0.20736488 -0.15881298 -0.13204417 0.04805784 0.13355314\n", " -0.0045907 0.05082515 -0.06452787 0.07044994 0.05168006 0.10637235\n", " -0.0933726 -0.21198799 -0.07857703 0.33478578 0.07737347 -0.20389057\n", " 0.06703433 0.02192291 0.15774254 -0.07792483 -0.03811912 -0.1239431\n", " 0.09546933 0.0601289 -0.114753 0.22595846 0.07515347 -0.23427506\n", " 0.01789923 0.0893184 ]\n" ] } ], "prompt_number": 36 }, { "cell_type": "raw", "metadata": {}, "source": [] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "plt.figure(figsize=(8, 4))\n", "plt.stem(x_init[0])\n", "plt.title(\"Initial guess\", fontsize=16)\n", "plt.show()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAewAAAEMCAYAAAAGboXiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHW9JREFUeJzt3X2UJFd53/HfjxVaAca8CSQMwjiLsMAhsUIsZINXCyc7\nvWiMwDkYUE5ssGNCErSz8bFjSftibbKDZcixYXY5QTpY2DLO4cVvWGhgtxesYRUfR4RIshXQGhiQ\nIwkhyZHEq7Ww2id/VM2qd9Qz2z1d3XXr1vdzzpyZrq6punW7u56+t557yxEhAACQtsfVXQAAAHBy\nBGwAABqAgA0AQAMQsAEAaAACNgAADUDABgCgAQjYQAVsv8X2Mdv/aA3/u9v2sZ7HTymXndtn3QXb\nN4xQvucN+78A0nBK3QUAoPdL+kTP46dJ+g1J/1fSLcvW/XeTKhSAtBCwgZpFxN2S7u7zlPuse3j8\nJQKQIrrEgTEpu69vtP0vbN9s+zu2b7P9umXrHe8St/18SV8pn3p/2Y19zPYv9Gzzhp7/XW/73eV2\nv2X7HtvX2f7RNZZ5ne3Zcjvfsf1p2+eUZbiiZ73ft/3VFY75hmXLnmn7Ktt32X7Y9u2237psnTNt\nX2v77nKdr9n+uO1nls+fYnuP7UXb/2D7/rJuX76W4wSaiBY2MD4haYOk90j6TUn/T9KvSvoj2+dE\nxOKydSXpa5L+paQ/Lf/nunJ5v3Ulab2kJ5fr3q2iO/3tkv7K9osi4t4hy/yfJV0u6V2SPiXpn/eU\nYfk8xv3mNY7e5bZ/UNL/KMt5haSvStoi6X2210fEe8tVPyjpLEm/JulOSWdKepWkJ5TPXyrpP0ra\nLulWSU+R9NLyeIFWIGAD42NJz5D000vB2fbNku6R9AZJVy5bVxHxPdu3lsu+EhGfXW0HEfFNSb98\nfCP24yQdlPR1SRer+LIwWGHtp6kIiu+LiMvLxZ+2/T1Jv73C8fVb1hvIt0l6nqR/3PMF5S9sP1XS\nFbb/W0Qck3S+pMsj4kM9//vHPX//pKQDEbGvZ9n1gx4bkAO6xIHx+lJvSzoi7pd0n4rWZCVsv8H2\nTbYflHRU0rcl/YCkFw65qZdIeqKkP1q2/I/7rDuoLZL+p6Q7ym7tU2yfIqmr4svMi8v1/pekX7c9\nY/sltpd/GfispOmyu/4Vtk8doUxAIxGwgfF6oM+yI5JOq2Ljtl8j6cOSPq+iRX2epJ+QdP8a9vHs\n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\n", "text": [ "" ] } ], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "# ISTA\n", "ista_inspector = inspector(loss_fun=F, x_real=params, verbose=True)\n", "x_ista = ista(x_init, grad=grad_f, prox=prox_g, n_iter=n_iter, step=step, callback=ista_inspector)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " it | obj | err \n", " 0 | 2.47e+00 | 8.32e-01\n", " 6 | 1.27e+00 | 4.47e-01\n", " 12 | 1.25e+00 | 3.98e-01\n", " 18 | 1.24e+00 | 3.84e-01\n", " 24 | 1.24e+00 | 3.78e-01\n" ] } ], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "# FISTA\n", "fista_inspector = inspector(loss_fun=F, x_real=params, verbose=True)\n", "x_fista = fista(x_init, grad=grad_f, prox=prox_g, n_iter=n_iter, step=step, callback=fista_inspector)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " it | obj | err \n", " 0 | 2.47e+00 | 8.32e-01\n", " 6 | 1.25e+00 | 3.92e-01\n", " 12 | 1.24e+00 | 3.69e-01\n", " 18 | 1.24e+00 | 3.75e-01\n", " 24 | 1.24e+00 | 3.75e-01\n" ] } ], "prompt_number": 23 }, { "cell_type": "code", "collapsed": false, "input": [ "# Gradient descent\n", "grad_gd = lambda x: grad_f(x) + l_l1 * np.abs(x) + l_l2 * x\n", "gd_inspector = inspector(loss_fun=F, x_real=params, verbose=True)\n", "x_gd = gd(x_init, grad=grad_gd, n_iter=n_iter, step=step, callback=gd_inspector)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " it | obj | err \n", " 0 | 2.30e+00 | 7.96e-01\n", " 6 | 1.26e+00 | 4.35e-01\n", " 12 | 1.25e+00 | 3.93e-01\n", " 18 | 1.24e+00 | 3.81e-01\n", " 24 | 1.24e+00 | 3.77e-01\n" ] } ], "prompt_number": 24 }, { "cell_type": "code", "collapsed": false, "input": [ "plt.figure(figsize=(18, 5))\n", "plt.suptitle(\"Final estimates\", fontsize=18)\n", "plt.subplot(1, 4, 1)\n", "plt.title(\"Real params\")\n", "plt.stem(params[0])\n", "plt.subplot(1, 4, 2)\n", "plt.title(\"ISTA\")\n", "plt.stem(x_ista[0], color='red')\n", "plt.subplot(1, 4, 3)\n", "plt.title(\"FISTA\")\n", "plt.stem(x_fista[0])\n", "plt.subplot(1, 4, 4)\n", "plt.title(\"GD\")\n", "plt.stem(x_gd[0])\n", "plt.show()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nfVt8/82S7nf3CxLaEiZAF7i7dXL/5AKQP+QCgBC5ACDUTC6sOaJhLWa2TdJfSdqSFA6xyyU90cyO\nk/RDSS+TdGZSw06HGYDOIxcAhMgFACFyAeh/7czRMCfpoZL2mdkVZvZuSTKzo8ysJEnufkDSuZL2\nSvqWpI+7+3Vt1gwgu8gFACFyAUCIXAD6XFuXTgAAAAAAANRKa9WJlpnZNjO73sy+Y2Zv7HU9ITN7\nn5ndbmZX12x7lJntM7Nvm1nZzA7vZY1VZnasmX3ZzK41s2vMbCLentV6h83sMjO70sy+ZWb/M96e\nyXqrzGxD3Ptencgok/Wa2Y1mdlVc69fjbZmsNUQupIdc6A5yofPIhfSQC92Rl1yQ8psN5EJ6yIXu\nGKRc6GlHg5ltkPROSdskPVnSmWZ2fC9rSvB+RfXVepOkfe7+JElfjO9nwa8k/bm7nyDpFEl/Fr+e\nmaw3vibvNHd/mqSnSjrNzJ6jjNZbY1LREL7qcKCs1uuSRtz9JHc/Od6W1VqXkQupIxe6g1zoIHIh\ndeRCd+QlF6QcZgO5kDpyoTsGJxfcvWc3Sc+StKfm/pskvamXNa1S53GSrq65f72kI+OfN0m6vtc1\nrlL3RZKel4d6JT1Y0jcknZDleiUdI+kLkk6T9Lks/z1I+p6kRwfbMllrUCO50Nm6yYX06yQXOl83\nudDZusmF9OvMTS7E9eQuG8iFjtdNLqRf50DlQq8vnTha0k0192+Ot2Xdke5+e/zz7ZKO7GUxSSya\nofckSZcpw/Wa2QPM7EpFdX3Z3a9VhuuV9HZFsyTfX7Mtq/W6pC+Y2eVm9sfxtqzWWotc6BByoWPI\nhc4jFzqEXOiYPOWClM9sIBc6hFzomIHKhZaXt0xJ7meidHe3jK3da2YPlfQpSZPufo/ZoRV/slav\nu98v6Wlm9ghJe83stODxzNRrZr8r6Q53v8LMRpLaZKleSc9291vN7DGKZnW+vvbBjNVaK4s1NSWL\nry250BnkQtdksaamZPG1JRc6I4e5IOUzG7JWT9Oy+LqSC50xiLnQ6xENt0g6tub+sYp6I7PudjPb\nJElm9jhJd/S4nmVm9kBF4fBhd78o3pzZeqvc/WeSSpKeoezWe6qkM8zse5I+Kum5ZvZhZbRed781\n/u+dkj4j6WRltNYAuZAycqGjyIXuIBdSRi50VK5yQcptNpALKSMXOmrgcqHXHQ2XS3qimR1nZg+S\n9DJJn+1xTY34rKSz4p/PUnQNU89Z1OX4Xknfcvd31DyU1XqPsHimUjM7TNJWSVcoo/W6+3Z3P9bd\n/30YcPAAAAEpSURBVIukl0v6kru/Shms18webGYPi39+iKRRSVcrg7UmIBdSRC50FrnQNeRCisiF\nzspTLki5zgZyIUXkQmcNZC6sNnlDt26Sni/pPyXdIOnNva4nob6PSvqhpF8qug7sbEmPUjSRx7cl\nlSUd3us641qfo+ianysVnWhXKJrpNqv1PkXSf8T1XiXpr+Ltmaw3qH2LpM9mtV5J/yV+Xa+UdE31\n3MpiravUTy6kVyu50L3ayYXO1k8upFcrudC92jOdC3Fduc0GciHVWsmF7tU+ELlg8RMAAAAAAADa\n1utLJwAAAAAAQB+howEAAAAAAKSGjgYAAAAAAJAaOhoAAAAAAEBq6GgAAAAAAACpoaMBAAAAAACk\nho4GAAAAAACQGjoaAAAAAABAav4f2Zq/TuUSBNAAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 25 }, { "cell_type": "code", "collapsed": false, "input": [ "plt.figure(figsize=(17, 5))\n", "plt.subplot(1, 2, 1)\n", "plt.plot(gd_inspector.obj, 'b')\n", "plt.plot(ista_inspector.obj, 'r')\n", "plt.plot(fista_inspector.obj, 'g')\n", "plt.title(\"Loss\", fontsize=18)\n", "plt.xlabel(\"iteration\", fontsize=14)\n", "plt.ylabel(\"value\", fontsize=14)\n", "plt.legend([\"gd\", \"ista\", \"fista\"])\n", "plt.subplot(1, 2, 2)\n", "plt.plot(gd_inspector.err, 'b')\n", "plt.plot(ista_inspector.err, 'r')\n", "plt.plot(fista_inspector.err, 'g')\n", "plt.title(\"Distance to x_real\", fontsize=18)\n", "plt.xlabel(\"iteration\", fontsize=14)\n", "plt.ylabel(\"distance\", fontsize=14)\n", "plt.legend([\"gd\", \"ista\", \"fista\"])\n", "plt.show()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 26 }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "## Optimize (stochastic)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "n_iter = 10 * n_samples\n", "\n", "# Initialize stuff\n", "if linear == True:\n", " f = lambda x: least_squares(x, features, labels)[0]\n", " grad_stoc = least_squares_grad\n", " L = norm(features.T.dot(features), 2) / n_samples\n", "else:\n", " f = lambda x: logistic_loss(x, features, labels)[0]\n", " grad_stoc = logistic_loss_grad\n", " L = 1. #4. * n_samples / np.sum(features**2, axis=1).max()\n", "\n", "print \"Type: %s\" % ('linear' if linear else 'logistic')\n", "print \"n_iter: %d\" % n_iter\n", "print \"step size: %.2f\" % step" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Type: linear\n", "n_iter: 20000\n", "step size: 1.09\n" ] } ], "prompt_number": 38 }, { "cell_type": "code", "collapsed": false, "input": [ "plt.figure(figsize=(8, 4))\n", "plt.stem(x_init[0])\n", "plt.title(\"Initial guess\", fontsize=16)\n", "plt.show()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAewAAAEMCAYAAAAGboXiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHW9JREFUeJzt3X2UJFd53/HfjxVaAca8CSQMwjiLsMAhsUIsZINXCyc7\nvWiMwDkYUE5ssGNCErSz8bFjSftibbKDZcixYXY5QTpY2DLO4cVvWGhgtxesYRUfR4RIshXQGhiQ\nIwkhyZHEq7Ww2id/VM2qd9Qz2z1d3XXr1vdzzpyZrq6punW7u56+t557yxEhAACQtsfVXQAAAHBy\nBGwAABqAgA0AQAMQsAEAaAACNgAADUDABgCgAQjYQAVsv8X2Mdv/aA3/u9v2sZ7HTymXndtn3QXb\nN4xQvucN+78A0nBK3QUAoPdL+kTP46dJ+g1J/1fSLcvW/XeTKhSAtBCwgZpFxN2S7u7zlPuse3j8\nJQKQIrrEgTEpu69vtP0vbN9s+zu2b7P9umXrHe8St/18SV8pn3p/2Y19zPYv9Gzzhp7/XW/73eV2\nv2X7HtvX2f7RNZZ5ne3Zcjvfsf1p2+eUZbiiZ73ft/3VFY75hmXLnmn7Ktt32X7Y9u2237psnTNt\nX2v77nKdr9n+uO1nls+fYnuP7UXb/2D7/rJuX76W4wSaiBY2MD4haYOk90j6TUn/T9KvSvoj2+dE\nxOKydSXpa5L+paQ/Lf/nunJ5v3Ulab2kJ5fr3q2iO/3tkv7K9osi4t4hy/yfJV0u6V2SPiXpn/eU\nYfk8xv3mNY7e5bZ/UNL/KMt5haSvStoi6X2210fEe8tVPyjpLEm/JulOSWdKepWkJ5TPXyrpP0ra\nLulWSU+R9NLyeIFWIGAD42NJz5D000vB2fbNku6R9AZJVy5bVxHxPdu3lsu+EhGfXW0HEfFNSb98\nfCP24yQdlPR1SRer+LIwWGHtp6kIiu+LiMvLxZ+2/T1Jv73C8fVb1hvIt0l6nqR/3PMF5S9sP1XS\nFbb/W0Qck3S+pMsj4kM9//vHPX//pKQDEbGvZ9n1gx4bkAO6xIHx+lJvSzoi7pd0n4rWZCVsv8H2\nTbYflHRU0rcl/YCkFw65qZdIeqKkP1q2/I/7rDuoLZL+p6Q7ym7tU2yfIqmr4svMi8v1/pekX7c9\nY/sltpd/GfispOmyu/4Vtk8doUxAIxGwgfF6oM+yI5JOq2Ljtl8j6cOSPq+iRX2epJ+QdP8a9vHs\n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\n", "text": [ "" ] } ], "prompt_number": 39 }, { "cell_type": "code", "collapsed": false, "input": [ "grad_step = 10. / L\n", "grad_sgd = lambda x, feat, lab: grad_stoc(x, feat, lab) + l_l2 * x[0]\n", "sgd_inspector = inspector(loss_fun=F, x_real=params, verbose=True)\n", "x_sgd = sgd(x_init, features=features, labels=labels, grad=grad_sgd, n_iter=n_iter, step=step, callback=sgd_inspector)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " it | obj | err \n", " 0 | 1.28e+01 | 1.48e+00\n", " 4000 | 1.16e+01 | 1.43e+00" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 8000 | 1.12e+01 | 1.41e+00" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 12000 | 1.08e+01 | 1.39e+00" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 16000 | 1.05e+01 | 1.38e+00" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 40 }, { "cell_type": "code", "collapsed": false, "input": [ "sag_step = 1. / L\n", "grad_sag = lambda x, feat, lab: grad_stoc(x, feat, lab) + l_l2 * x[0]\n", "sag_inspector = inspector(loss_fun=F, x_real=params, verbose=True)\n", "x_sag = sag(x_init, features=features, labels=labels, grad=grad_sag, n_iter=n_iter, step=step, callback=sag_inspector)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " it | obj | err \n", " 0 | 1.28e+01 | 1.49e+00\n", " 4000 | 2.43e+00 | 8.13e-01" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 8000 | 1.53e+00 | 5.41e-01" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 12000 | 1.30e+00 | 4.55e-01" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 16000 | 1.26e+00 | 4.24e-01" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 41 }, { "cell_type": "code", "collapsed": false, "input": [ "miso_step = 1. / L\n", "prox_g = lambda x, l: prox_enet(x, l_l1, l_l2, l)\n", "miso_inspector = inspector(loss_fun=F, x_real=params, verbose=True)\n", "x_miso = miso(x_init, features, labels, grad=grad_stoc, prox=prox_g, n_iter=n_iter, step=step,\n", " callback=miso_inspector)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " it | obj | err \n", " 0 | 1.17e+01 | 1.42e+00\n", " 4000 | 1.26e+00 | 3.76e-01" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 8000 | 1.25e+00 | 3.76e-01" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 12000 | 1.24e+00 | 3.74e-01" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 16000 | 1.24e+00 | 3.74e-01" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 42 }, { "cell_type": "code", "collapsed": false, "input": [ "svrg_step = 1. / L\n", "grad_svrg = lambda x, feat, lab: grad_stoc(x, feat, lab) + l_l2 * x[0]\n", "svrg_inspector = inspector(loss_fun=F, x_real=params, verbose=True)\n", "x_svrg = svrg(x_init, features, labels, grad=grad_svrg, n_iter=n_iter, batch_size=100, step=svrg_step, callback=svrg_inspector)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " it | obj | err \n", " 0 | 1.27e+01 | 1.48e+00\n", " 4000 | 2.22e+00 | 7.60e-01" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 8000 | 1.46e+00 | 5.75e-01" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 12000 | 1.32e+00 | 4.96e-01" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 16000 | 1.28e+00 | 4.54e-01" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 43 }, { "cell_type": "code", "collapsed": false, "input": [ "plt.figure(figsize=(17, 5))\n", "plt.subplot(1, 2, 1)\n", "it = np.linspace(0, float(n_iter) / n_samples, n_iter)\n", "plt.plot(it, sgd_inspector.obj, 'b')\n", "plt.plot(it, sag_inspector.obj, 'r')\n", "plt.plot(it, miso_inspector.obj, 'g')\n", "plt.plot(it, svrg_inspector.obj, 'y')\n", "plt.title(\"Loss\", fontsize=18)\n", "plt.xlabel(\"iteration\", fontsize=14)\n", "plt.ylabel(\"value\", fontsize=14)\n", "plt.legend([\"sgd\", \"sag\", \"miso\", \"svrg\"])\n", "plt.subplot(1, 2, 2)\n", "plt.plot(it, sgd_inspector.err, 'b')\n", "plt.plot(it, sag_inspector.err, 'r')\n", "plt.plot(it, miso_inspector.err, 'g')\n", "plt.plot(it, svrg_inspector.err, 'y')\n", "plt.title(\"Distance to x_real\", fontsize=18)\n", "plt.xlabel(\"iteration\", fontsize=14)\n", "plt.ylabel(\"distance\", fontsize=14)\n", "plt.legend([\"sgd\", \"sag\", \"miso\", \"svrg\"])\n", "plt.show()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 44 }, { "cell_type": "code", "collapsed": false, "input": [ "plt.figure(figsize=(18, 10))\n", "plt.suptitle(\"Final estimates\", fontsize=18)\n", "plt.subplot(2, 4, 1)\n", "plt.title(\"Real params\")\n", "plt.stem(params[0])\n", "plt.subplot(2, 4, 2)\n", "plt.title(\"SGD\")\n", "plt.stem(x_sgd[0], color='red')\n", "plt.subplot(2, 4, 3)\n", "plt.title(\"SAG\")\n", "plt.stem(x_sag[0])\n", "plt.subplot(2, 4, 4)\n", "plt.title(\"MISO\")\n", "plt.stem(x_miso[0])\n", "plt.subplot(2, 4, 5)\n", "plt.title(\"SVRG\")\n", "plt.stem(x_svrg[0])\n", "plt.show()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nrkJggg==\n", "text": [ "" ] } ], "prompt_number": 45 }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "## Appendix" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. scipy.optimize methods" ] }, { "cell_type": "code", "collapsed": false, "input": [ "n_iter = 50" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 46 }, { "cell_type": "code", "collapsed": false, "input": [ "# Conjugate gradient descent\n", "from scipy.optimize import fmin_cg\n", "\n", "cg_inspector = inspector(loss_fun=F, x_real=params, verbose=True)\n", "res_cg = fmin_cg(F, x_init.ravel(), fprime=grad_gd, maxiter=n_iter, callback=cg_inspector)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " it | obj | err \n", " 0 | 6.24e+00 | 8.27e-01\n", "Warning: Desired error not necessarily achieved due to precision loss." ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " Current function value: 6.239769\n", " Iterations: 1\n", " Function evaluations: 27\n", " Gradient evaluations: 15\n" ] } ], "prompt_number": 47 }, { "cell_type": "code", "collapsed": false, "input": [ "# L-BFGS-B\n", "from scipy.optimize import fmin_l_bfgs_b\n", "\n", "lbfgs_inspector = inspector(loss_fun=F, x_real=params, verbose=True)\n", "res_lbfgs = fmin_l_bfgs_b(F, x_init.ravel(), fprime=grad_gd, maxiter=n_iter, callback=lbfgs_inspector)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " it | obj | err \n", " 0 | 6.21e+00 | 1.30e+00\n" ] } ], "prompt_number": 48 }, { "cell_type": "code", "collapsed": false, "input": [ "plt.figure(figsize=(15, 5))\n", "plt.subplot(1, 2, 1)\n", "plt.plot(gd_inspector.obj, 'b')\n", "plt.plot(ista_inspector.obj, 'r')\n", "plt.plot(fista_inspector.obj, 'g')\n", "plt.plot(cg_inspector.obj, 'y')\n", "plt.plot(lbfgs_inspector.obj, 'pink')\n", "plt.title(\"Loss\", fontsize=18)\n", "plt.xlabel(\"iteration\", fontsize=14)\n", "plt.ylabel(\"value\", fontsize=14)\n", "plt.legend([\"gd\", \"ista\", \"fista\", \"cg\", \"l-bfgs-b\"])\n", "plt.subplot(1, 2, 2)\n", "plt.plot(gd_inspector.err, 'b')\n", "plt.plot(ista_inspector.err, 'r')\n", "plt.plot(fista_inspector.err, 'g')\n", "plt.plot(cg_inspector.err, 'y')\n", "plt.plot(lbfgs_inspector.err, 'pink')\n", "plt.title(\"Distance to x_real\", fontsize=18)\n", "plt.xlabel(\"iteration\", fontsize=14)\n", "plt.ylabel(\"distance\", fontsize=14)\n", "plt.legend([\"gd\", \"ista\", \"fista\", \"cg\", \"l-bfgs-b\"])\n", "plt.show()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 49 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Cond. number" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def contours(f, xlim=(-10, 10), ylim=(-10, 10)):\n", " \n", " def apply_to_grid(f, xlim, ylim, s=100j):\n", " X, Y = np.mgrid[xlim[0]:xlim[1]:s, ylim[0]:ylim[1]:s]\n", " z = positions = np.vstack([X.ravel(), Y.ravel()]).T\n", " return X, Y, np.reshape(f(z), (100, 100))\n", " \n", " loss = lambda x: f(x, features, labels)\n", " X, Y, Z = apply_to_grid(loss, xlim, ylim)\n", "\n", " plt.xlabel(r\"$x_1$\", fontsize=18)\n", " plt.ylabel(r\"$x_2$\", fontsize=18)\n", " plt.pcolor(X, Y, Z, cmap=plt.cm.RdBu)\n", " CS = plt.contour(X, Y, Z, colors='k')\n", " plt.clabel(CS, inline=1, fontsize=10)\n", " plt.grid(True)\n", "\n", "plt.figure(figsize=(14, 6))\n", "plt.suptitle(\"Contours of the loss\", fontsize=18)\n", "\n", "n_samples = 2000\n", "n_features = 2\n", "\n", "plt.subplot(1, 2, 1)\n", "plt.title(r\"$\\lambda_{max} / \\lambda_{min} = 1$\", fontsize=16)\n", "params = 1 - 2 * np.random.rand(1, n_features)\n", "diag = np.array([.1, .1])\n", "features = np.random.multivariate_normal(np.zeros(n_features), np.diag(diag), n_samples)\n", "labels = np.array([np.random.rand() < p for p in logistic(features.dot(params.T))])\n", "contours(least_squares)\n", "\n", "plt.subplot(1, 2, 2)\n", "plt.title(r\"$\\lambda_{max} / \\lambda_{min} = 10$\", fontsize=16)\n", "params = 1 - 2 * np.random.rand(1, n_features)\n", "diag = np.array([.01, .1])\n", "features = np.random.multivariate_normal(np.zeros(n_features), np.diag(diag), n_samples)\n", "labels = np.array([np.random.rand() < p for p in logistic(features.dot(params.T))])\n", "contours(least_squares)\n", "plt.show()" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "total size of new array must be unchanged", "output_type": "pyerr", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[0mfeatures\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmultivariate_normal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn_features\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdiag\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdiag\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_samples\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 29\u001b[0m \u001b[0mlabels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrand\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0mp\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mp\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mlogistic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfeatures\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparams\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 30\u001b[0;31m \u001b[0mcontours\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleast_squares\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 31\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36mcontours\u001b[0;34m(f, xlim, ylim)\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeatures\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mY\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mZ\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mapply_to_grid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mloss\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mxlim\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mylim\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxlabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mr\"$x_1$\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfontsize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m18\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36mapply_to_grid\u001b[0;34m(f, xlim, ylim, s)\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mY\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmgrid\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mxlim\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mxlim\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mylim\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mylim\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mz\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpositions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvstack\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mY\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mY\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mz\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m100\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeatures\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mY\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mz\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m100\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeatures\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mY\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mZ\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mapply_to_grid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mloss\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mxlim\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mylim\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36mleast_squares\u001b[0;34m(x, features, labels)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\"\"\"Evaluates the least square function.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mn_samples\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfeatures\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_features\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0mloss_array\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mfeatures\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mlabels\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m**\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mloss_array\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m2.\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mn_samples\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mValueError\u001b[0m: total size of new array must be unchanged" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 37 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }