{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from cvxpy import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# LASSO for sparse recovery\n",
    "\n",
    "$$\n",
    "\\begin{array}{ll}\n",
    "\\mbox{minimize} & \\| Ax - b\\|_2^2 + \\rho \\|x\\|_1\n",
    "\\end{array}\n",
    "$$\n",
    "\n",
    "- generate problem data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Container object of 3 artists>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10956eb10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n = 100\n",
    "nonzeros = 5\n",
    "obs = 30\n",
    "\n",
    "x_true = np.zeros(n)\n",
    "x_true[:nonzeros] = np.random.rand(nonzeros)+1\n",
    "np.random.shuffle(x_true)\n",
    "\n",
    "A = np.random.randn(obs,n)\n",
    "b = A.dot(x_true) + np.random.rand(obs)*.1\n",
    "\n",
    "plt.stem(x_true)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- inspect the least squares recovery:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\niATq/wM7lmgoM2t+zQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1066bc990>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = Variable(n)\n",
    "obj = sum_squares(A*x - b)\n",
    "Problem(Minimize(obj)).solve()\n",
    "\n",
    "\n",
    "x = np.array(x.value).flatten()\n",
    "\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111)\n",
    "ax.stem(x)\n",
    "fig.savefig('ls_recovery.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- inspect the LASSO recovery, and note that it accurately recovers the correct signal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n7RexdFOjYQAAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1097db990>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = Variable(n)\n",
    "obj = sum_squares(A*x - b) + 1.5*norm(x,1)\n",
    "\n",
    "Problem(Minimize(obj)).solve()\n",
    "x = np.array(x.value).flatten()\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111)\n",
    "ax.stem(x)\n",
    "fig.savefig('lasso_recovery.pdf')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1066bca90>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111)\n",
    "ax.stem(x_true)\n",
    "fig.savefig('x_true.pdf')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}