{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Phase transition diagrams for the Basis Pursuit via the cvxopt package for linear programming (python 3)\n",
"\n",
"$\\newcommand{\\eps}{\\varepsilon}$\n",
"$\\newcommand{\\R}{\\mathbb{R}}$\n",
"$\\newcommand{\\bR}{\\mathbb{R}}$\n",
"$\\newcommand{\\cC}{\\mathbb{C}}$\n",
"$\\newcommand{\\1}{{\\rm 1}\\kern-0.24em{\\rm I}}$\n",
"$\\newcommand{\\inr}[1]{\\bigl< #1 \\bigr>}$\n",
"$\\newcommand{\\norm}[1]{\\|#1\\|}$\n",
"$\\newcommand{\\abs}[1]{\\left|#1\\right|}$\n",
"$\\DeclareMathOperator*{\\argmin}{argmin}$\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this notebook, **phase transition diagrams** of the $\\ell_1$ minimization procedure Basis Pursuit (BP) are drawn for various type of random measurements matrices and also for matrices constructed from the *cover by $3$-sets problem* used to show that $\\ell_0$-minimization is NP-hard.\n",
"\n",
"An example of a phase transition diagram is as follows\n",
"\n",
"In this example, we are interested in the reconstruction of sparse signals of size $N=100$. For every pixel indexed by a couple $(m,s)$ ($m$: number of measurements, $s$: sparsity parameter), we construct $15$ signals in $\\R^N$ with sparsity $s$ and we observed $m$ linear measurements for each one of those signals. In the example, the measurement vectors were constructed from $N$ i.i.d. *exponential symmetric* random variables. Every time the Basis Pursuit procedure (implemented here via cvx LP solver) reconstructs all of the $15$ signals, a red pixel is drawn. When none of the $15$ signals are recovered a blue pixel is drawn. And for every results in between, an other color is drawn. \n",
"\n",
"Phase transition diagrams are used for at least two reasons:\n",
"> 1) compare procedures (like BP, IHT, OMP, etc) and algorithms used to implement those procedures\n",
"\n",
">2) compare measurement matrices (constructed from various random variables or structured measurements or determinsitic matrices)\n",
"\n",
"The idea is that procedures / algorithms / measurement matrices are better when their phase transition curves (obtained when the number of failures becomes larger than the number of successes) are lower. For instance, below are plotted phase transition curves for various measurements matrices.\n",
"\n",
"One can see that measurements matrices with *exponential power $2$* are better."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this notebook, we consider the Basis Pursuit procedure -- (BP). It can be recast to a linear program. We use the optimization library *cvxopt* to solve this linear program. An introduction to this library is provided for pedagogical purpose."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pylab as plt\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##Compressed sensing -- presentation of the problem\n",
"In Compressed sensing, one is given a measurement matrice $A\\in\\R^{m\\times N}$ and a measures vector $y=Ax$ of some unknown signal $x\\in\\R^N$. We want to reconstruct exactly $x$ given $y$ and $A$. \n",
"\n",
"One way to look at this problem is as a highly underdetermined linear system: one has $m$ equations but $N>>m$ unknown variables. So what is going to save the day is that the signal to recover has a short support of size $s$ where $s<"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nYII=\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.stem(x)\n",
"titre = 'Représentation du vecteur x'\n",
"plt.title(titre)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"##Construction of measurements matrices\n",
"We construct various random measurement matrices: \n",
"\n",
"1) The first one is constructed using power of Gaussian random variables: that is the measurement matrix $A$ is populated with i.i.d. random variables like $${\\rm sign}(g) |g|^p$$ where $g$ is a standard Gaussian variable and $p\\geq1$ is some power.\n",
"\n",
"2) The second one are Student variable with degree $p$. That is a random variable absolutly continuous with a density of the order of $(1+t)^{-(p+1)}$."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def measurement_matrix(m, N, rand_type = \"gauss\", power = 2):\n",
" if rand_type == \"student\":\n",
" A = np.random.standard_t(power, size=(m, N))\n",
" else:\n",
" A = np.random.randn(m, N)\n",
" A = np.multiply(np.power(np.absolute(A),power), np.sign(A)) \n",
" return A "
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"A = measurement_matrix(2, 10, rand_type = \"gauss\")#, power = 4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##Basis Pursuit as a linear program\n",
"One can recast the Basis Pursuit procedure as a linear program. \n",
"\n",
"Let $A\\in\\R^{m\\times N}$ be a measurements matrix and $y\\in\\R^m$ be a measurements vector. We consider the following linear programming problem (LP):\n",
"\n",
"\n",
"> $$\\min_{z^+,z^-\\in\\bR^n} \\sum_{j=1}^n z_i^+ + z_i^-$$\n",
"\n",
"> subject to $$ [A|-A]\\left[\\begin{array}{c} z^+\\\\ z^-\\end{array}\\right] = y \\mbox{ and } \\left[\\begin{array}{c} z^+\\\\ z^-\\end{array}\\right]\\geq 0 $$\n",
"\n",
"\n",
"\n",
"For any $x\\in\\R^N$, we denote by $x^+\\in\\R^N$ and $x^-\\in\\R^N$ vectors with coordinates given for any $j=1,\\ldots,N$ by \n",
"\\begin{equation*}\n",
"(x^+)_j = \\max(0,x_j) \\mbox{ et } (x^-)_j = \\max(0,-x_j).\n",
"\\end{equation*} \n",
"There is equivalence between the Basis Pursuit procedure and (LP) in the following way: \n",
"\n",
">\tIf $\\hat x$ is a solution to (BP) then $(\\hat x^+, \\hat x^-)$ is solution to (LP)\n",
"\n",
">\tIf $(\\hat z^+, \\hat z^-)$ is a solution to (LP) then $\\hat z^+-\\hat z^-$ is solution to (BP).\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Import cvxopt library for solving linear programming problems\n",
"\n",
"**CVXOPT** is a very powerfull library for solving various type of convex optimization problems. We refer to examples from Non-linear convex optimization and Xavier's TD9 .\n",
"\n",
"*solvers.cp* solves non-linear convex optimization problems with twices differentiable objective and constraint functions with closed form solutions for the gradient and the Hessian.\n",
"\n",
"Here we are concerned about Linear Programming -- that is for convex optimization problems where both the objective and the constraints are linear."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from cvxopt import matrix, solvers, sparse, sparse, spmatrix, spdiag\n",
"solvers.options['show_progress'] = False # No logs printed"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### matrix objects in cvxopt\n",
"cvxopt has its own *matrix* object which is different from the numpy's one"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"A = matrix([[1,2,3],[4,5,6]])\n",
"#print(A, '-'*10, '\\n', A[1,:], '-'*10, '\\n', A[::-1,::-1], '-'*10, '\\n', A[0:4])\n",
"#print('-'*10, '\\n', A.size)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"A = matrix([1, 2, 3, 4, 5, 6], (2,3))\n",
"B = matrix([ [1, 2], [3, 4] ])\n",
"C = matrix([ [A] ,[B], [-A]])\n",
"D = matrix(range(16),(4,4))\n",
"E = matrix(np.ones(5))\n",
"F = matrix(np.random.randn(2,3))\n",
"G = matrix(np.zeros(2))\n",
"#print(A,'-'*10, '\\n', B, '-'*10, '\\n', C, '-'*10, '\\n', D, '-'*10, '\\n', E, '-'*10, '\\n', F, '-'*10, '\\n', G)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"A = matrix([[1,2,3],[4,5,6]])\n",
"B = np.array(A)\n",
"#print(A, '-'*10, '\\n', B)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"### sparse matrix objects\n",
"cvxopti has its own *sparse matrix* object which is different from the scipy's one"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"E = spmatrix([1, 2], [0, 1], [0, 1], (4,2)) #(value, row, column)\n",
"B = matrix([ [1, 2], [3, 4] ])\n",
"F = sparse([ [B, B], [E] ])\n",
"G = spdiag([B, -B, 1, 2])\n",
"H = spdiag([1]*2)\n",
"K = matrix([B, -B])\n",
"K2 = matrix([[B], [-B]])\n",
"J = matrix([[B,-B, -H],[-B, B, -H]])\n",
"#print(E, '-'*30, '\\n', F, '-'*30, '\\n', G, '-'*30, '\\n', H)\n",
"#print(K, '-'*30, '\\n', K2, '-'*30, '\\n', J)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#Linear programming in cvxopt (cf. cvxopt conelp solver and cvxopt lp solver )\n",
"Linear Programming problems in *cvxopt* have the following form\n",
"$$\\min \\inr{c,x} \\mbox{ subject to } Gx + s =h, Ax=b, s\\geq 0$$\n",
"\n",
"CVXOPT command to solve this problem is \n",
"\n",
"> sol = cvxopt.solvers.lp(c, G, h[, A, b[, solver[, primalstart[, dualstart]]]])\n",
"\n",
"> sol = sol['x']\n",
"\n",
"The **solver** argument is used to choose among three solvers. When it is omitted or None, the CVXOPT function **conelp** is used. The external solvers **GLPK** and **MOSEK** (if installed) can be selected by setting solver to 'glpk' or 'mosek'.\n",
"\n",
"Using option 'glpk' speeds up cvxopt by a factor of $2$ or $10$ (cf. Stéphane Caron's webpage )\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"# Solving (BP) via cvxopt\n",
"\n",
"Let $A\\in\\bR^{m\\times N}$ and $y\\in\\R^m$. (LP) is defined by:\n",
"\n",
"> $$(\\hat z^+, \\hat z^-)\\in\\argmin_{(z^+,z^-)\\in\\bR^{2N}} \\sum_{j=1}^n z_i^+ + z_i^- \\mbox{ subject to } [A|-A]\\left[\\begin{array}{c} z^+\\\\ z^-\\end{array}\\right] = y \\mbox{ and } \\left[\\begin{array}{c} z^+\\\\ z^-\\end{array}\\right]\\geq 0 $$\n",
"\n",
"Solution to (BP) is recovered via $t= \\hat z^+- \\hat z^-$.\n",
"\n",
"Linear Programming problem considered in cvxopt have the following form: \n",
"\n",
"\n",
"$$\\min \\inr{c,x} \\mbox{ subject to } Gx + s =h, Ax=b, s\\geq 0.$$\n",
"\n",
"In the case of (LP) :\n",
"\n",
"$$c = \\left[\\begin{array}{c} \\1 \\\\ \\1 \\end{array}\\right]\\in\\R^{2N};\\hspace{1cm} G=-I_{2N}; \\hspace{1cm} h = 0\\in\\R^{2N}; \\hspace{1cm} A = [A|-A]\\in\\R^{m\\times 2N};\\hspace{1cm} b = y\\in\\R^m$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"### construction of cvxopt matrices $c, G, h, A, b$"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def cvx_mat(A, y):\n",
" '''A, y: numpy array or cvx matrices\n",
" return parameters c, G, h, A, b for CVXOPT solvers.lp method'''\n",
" A = matrix(A)\n",
" y = matrix(y)\n",
" m, N = matrix(A).size\n",
" # matrix c, G, h, A, b\n",
" c = matrix(np.ones(2*N))\n",
" G = -spdiag([1]*2*N)\n",
" h = matrix(np.zeros(2*N))\n",
" A = matrix([[A],[-A]])\n",
" b = y\n",
" return c, G, h, A, b"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"N, m, s = 1000, 50, 3\n",
"A, x = measurement_matrix(m, N), signal(N, s) \n",
"y = np.dot(A,x)\n",
"c, G, h, A, b = cvx_mat(A, y)\n",
"#print(c, '-'*10, '\\n', G,'-'*10, '\\n', h,'-'*10, '\\n', A,'-'*10, '\\n', b)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### cvxopt linear solver cvx lp "
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"sol = solvers.lp(c, G, h, A, b, solver = 'glpk')\n",
"sol = sol['x']\n",
"x_recover = sol[0:N] - sol[N:2*N]"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"8.3278185096902772e-16"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.linalg.norm(matrix(x) - x_recover,2)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def dist(x, sol):\n",
" N = len(x)\n",
" x_recover = sol[0:N] - sol[N:2*N]\n",
" return np.linalg.norm(matrix(x) - x_recover,2)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"erreur ell_2 = 1.4767102442127161e-08\n"
]
}
],
"source": [
"N, m, s = 500, 80, 10\n",
"A, x = measurement_matrix(m, N), signal(N, s) \n",
"y = np.dot(A,x)\n",
"c, G, h, A, b = cvx_mat(A, y)\n",
"sol = solvers.lp(c, G, h, A, b)\n",
"sol = sol['x']\n",
"x_recover = sol[0:N] - sol[N:2*N]\n",
"print('erreur ell_2 = {}'.format(dist(x, sol)))"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA64AAAGxCAYAAABiGesVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X2UZOddH/jvTzPSjN+C0ZLItiwQGdsJXhLwwrENBnmW\nRNPCA4JseDEb3rwcw7LLzGw2WRNLVjywVoCcwHpmzIKTGI5iODJeWBxB22gE8TAmLAbHr9gSWB0L\nbGMLjF/wCzPWzDz7R1ePWu3unp6u6r5PVX8+5/SZqvtS96mnbtVvvnWfurdaawEAAIBeXTF0AwAA\nAGA9gisAAABdE1wBAADomuAKAABA1wRXAAAAuia4AgAA0DXBFTpQVS+uqn+3Ddv53qp601ZvBwCY\nnKr6J1V199DtgCGV67jCzlFV35vk+1prXzt0WwBgWlXVhSRPaa391y147OuT/Ncku1trFyb9+DCt\nHHEFAKBrVbV76DasotacMZn2rvn4sBMJrrDNquqHq+oDVfVXVXVfVX1dVR2tqlcvW+a7q+pPquoj\nVfWSqnqgqr5uNO9oVb22qu4YPcYfVtVXLFv3X1TV/aN5766qbx7ieQLAOEa170VV9c4kn6yq51TV\n71bVx6rq7VX13GXLXl1VP19VH6yqj1bVry6b98Kqem9V/WVV/ceqeuKyeReq6geq6o9Hj/uKZfOe\nUlW/XVUfr6q/qKo7R9NPjxZ5R1V9sqq+tar2j2r7i6rqQ0l+rqq+Z+XPc0bb+9uj24+qqp8cPc+P\nV9XpqtqbZOnxPz6q5c9e+VOfqvrqqvqD0Xq/X1VftWzeqar60ar6ndH6d1fVfzOBlwQGJbjCNqqq\nv5Pkf03yla21v5HkQJIHkrRlyzw9yU8n+Y4kT0zyeUmetOKhvjHJnaN5dyV5xbJ59yf5mtHj/0iS\nX6iqa7bi+QDAFnt+kq9Psi/Jf0zyo621z0/yz5P8yrJA9uoke5M8PcnfSvJTSTL60vdfJfnWLNbU\nP0nymhXbOJjkK5P8/STfVlUHRtP/zyS/0Vp7fJJrk5xIktbaDaP5f7+19rjW2v8zun9Nks9P8oVJ\nvj+XPmL6b5I8I8lXJbk6yYuSXEiy9HOez2ut/Y3W2u8tX6mqrk4yn+Tlo/V+Ksl8VX3+ssW+I8n3\njvriqlF/wVQTXGF7nU+yJ8l/W1VXttb+dPT7mOXF7VuS3NVa+93W2kNJ/mWWBduRN7XWfqMt/kj9\nF5J82dKM1tovt9Y+PLr92iTvTfKsrXtKALAlWpLjrbUPJvmuJK9vrf1GkrTWfjPJW5IcHB1BvSnJ\n/9xa+0Rr7Vxrbeno5D9J8qrW2ttba59N8uIkX1VVX7hsOz/eWvur1tr7k7wxyZePpn82yfVVdW1r\n7bOttd+9RHsvJHlpa+2h1tqZ9RasqiuSvCDJkdbah1prF1prvzdq46UC78Ekf9Ra+8XReq9Jcl+S\nm0fzW5Kfb63dP2rHa5c9J5hagitso9ba/Un+tyRHkzxYVXcuH7I08qQkH1i2zl8n+csVyzy47PZn\nkuwdFcGlYcZvGw15+liSL01iiBAA0+j9o3+/KMm3LtW2UX17TpInJLkuyUdba59YZf2lo6xJktba\np7NYU69dtsyHl93+TJLHjW6/KIsh8vdHP8t5wSXa+hej4LkRX5DFI8QLG1x+uScl+dMV0/4kjxyd\ntfw5/XWSx25iO9AVwRW2WWvtztFZfb8oi9+K/kQeeUT1z5I8eelOVT0qGwyeVfVFSf5tFocjXz0a\nTvWHcYIHAKbTUn380ySvbq19/rK/x7XW/nUWw+3VVfV5q6z/Z0muX7pTVY/JYk394CU33NqDrbXv\nb61dm+QHkvzfS79PvURbl3w6yaOXbfsJy+Z9JMmZJE/ZwOOs9MEs/h9iuS/KBp4TTDPBFbZRVT1t\ndDKmPUnOZrFonV+x2K8k+caq+qqquiqLR2c3Gjwfk8WC95EkV4y+Hf7SiTQeAIbzC1msjQeqaldV\n7R2dEOna1tqHkrwhi8Hy8VV1ZVUt/Q71ziQvqKovG9Xef5Xk91prK49YLrlYb0cnXVr6IvnjWayv\nS5eneTCLv7tdzzuy+NOgLxuddOno0ozRZW5+LslPVdUTR89pqe7/xWg7az3+G5I8raq+o6p2V9W3\nJ/m7SX59tecBs0Jwhe21J8mPZbEofSiLQ4VePJrXkqS19u4kh7J48og/S/LJJH+exaC7tNzKb2OX\n1n1Pkp9M8v9lcZjQlyb5nRXLuXgzAFOltfaBJN+U5JYs1sQ/TfLP8vD/Zb8ryUNZ/K3ng0kOj9b7\nrSS3ZfFL4T9L8sVZPOHTxYdeuall074yye9V1SezeGKow621B0bzjia5YzRs+VuySn1trf1xkh9N\n8ptJ/ijJm1Ys88+TvCvJH2Rx+PKPJanW2meS3J7kP4/OkPys5Y/fWvvLJN8wev4fGT3ON7TWPrrG\n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\nzS0BABK1GWBWCa5jOHz4QPbtu/UR0/btuyWHDt04UIsAYGdTmwFmk+A6hoMHb8ixY3OZm7stSTI3\nd1uOHbvJyR8AYCBqM8Bsqtba0G1IklRV66Utm1GVDN38HtrQsx77p8c2MTmX8/raFyavqtJaq6Hb\nMc3U5tloQ8967J8e28TkqM3DGqc2O+IKAABA1wRXAAAAuia4AgAA0DXBFQAAgK4JrgAAAHRNcAUA\nAKBrgisAAABdE1wBAADomuAKAABA1wRXAAAAuia4AgAA0DXBFQAAgK4JrgAAAHRNcAUAAKBrgisA\nAABdE1wBAADo2tjBtapuqqr7quq9VfXDayxzfDT/HVX1jHG3CQCsTW0GYNbsHmflqtqV5BVJ/mGS\nDyb5g6q6q7V277JlnpfkKa21p1bVs5L8TJJnr/54Xze6dTbJVUlqjfsbWWYrHmOtaUnyn0bt36rt\nrHf/0dm9+0KS1y/rw63Y7qNzxRWfTmuV1ipJ26bnt946n5ekpepsrrjioZw/v3uVx3hMknNJfiNX\nXfXcPPTQFQO1db39ZjPbGWJf2851pqmtK6c9/J581KNuymc/ey4XLvz1Guss7sPJG7J799eusQ/3\n9vy2ap3L+cxde/4VVzwmj3rU49ZYfvYNV5t72teWTLI2b65mJm9M1T/I1tXMIWvzWo8xK7W5p31a\nnR33+VU9Jldd1ZL8+jq1uef9s5ftrjUt686fRG0eK7gmeWaS+1trDyRJVb0myTcluXfZMjcnuSNJ\nWmtvrqrHV9U1rbUHP/fhvjjJx0bNWnpiK++vNu1y709qnZUev0XbWe/+E5LM5dy5l4/mffEWbfcJ\nSa7NhQuntvn5rbfO30ryPya5I619bFQYVz7GU5PMZbQL5qGHrhmorevtNxvZ74dq61DrTFNbV05b\nek8u7nNnzlw7mn/1Kus8vA8nyfnzT5yC57dV62zmM3e1+U/IhQu359OfTpI711hv5g1Qm3va11aa\nRG0ep2YmyfXbsJ1e3rOzUpuH+D/ddq4zTW2dxPN7Qlqby9mz69XmnvfPXra71rRcYv5kavPuTa+5\n6Nok7192/wNJnrWBZZ6cZJXi+MQkn8riDrNk5f3Vpl3u/Umts9KVW7Sd9e6/LMlLRttOFvtwK7b7\nsiTfnuRpY7R10uv8bBaf+3r7zcuWLZMV7d/Otq6332xkvx+qrUOtM01tXTlt5T632uu7tM7Ppr/9\ns+fXfKXV5r9sneV3jAFqc0/72kqTqM3j1sxZrM0b+Vyb5to8xP/ptnOdaWrrZtZZeX8jtbnn/bOX\n7a417VLzJ1Obq7V26aXWWrnqHye5qbX2wtH970zyrNbaoWXL/FqSH2+t/efR/d9M8qLW2ltXPFZ7\n6bL7+0d/ALARp0Z/S34kSVscO7mjqM0A9OJUJlebxz3i+sEk1y27f10Wv7Vdb5knj6Z9jh/JrUne\nm+Sp+ZGLUxfvP9LKaZd7f1LrrLRV21nv/tK3QlvdJ0vf6i7/JmortnM56/zSsnYsb9Py5Xtp63r7\nzWa2M8S+tp3rTFNbV05buS8uf++sXGf5Pjwtz2+r1rncz9y1+nX5t7o7LrMuGaA297SvrTTEZ9J6\n7/tZqc1rPcas1Oae9ml1dvznt5Ha3PP+2ct215q2ZGtr87hHXHcn+aMk/yDJnyX5/STfscoJIH6o\ntfa8qnp2kpe31j7nBBBV1ZL/KdM1DnylIcabL/6eLnn5ZW5nc7+jWfzO5LVJvm+bnt966yz/feCr\nknzbKo/x1Dz8O4Vefi+wml726V7Wmaa2rpy29J68YzTvVUn+hzXWWb4PT8vz26p1Lvczd61+fUKS\n20e3a6cecR2gNve0r600xGfS8pq5lX0yZG1e6zFmpTb3tE+rs+M/v43U5p73z162u9a0JVtbm3dv\nZqUlrbVzVfVDSe5OsivJq1pr91bVD4zmv7K19vqqel5V3Z/k00lesPYjvm/079kke5ZNX3k/ST6b\nxbNVrbXMVjzGauskq59la9LbWWud9yV5R6688kKqPp3PfvYjl7Gdy9nu+5I8Ort2fTrnzyfJA3n4\nzIVb+fzWW+fBJD+R5EKSZNeuD+X8+ZXP/yNJ3pnkoVx11bm09lAeeuhy+mirnl/yud84rdx3htqn\ne1lnmtq6fJ2H35O7d5/PX/91csUVf5ULF87kcz8b/jxL+/DDZ9/sYf/s+TVPHn7vfCKf+755X664\n4uY86lGPHZ0EYucZrjb3tK8lk6/Nm6uZFy58ZMXZfifZJ0PX5tUe4+HPtWTaa/N2/59uu9eZprZu\nZp3l99+XqnfmqqtarrjioXVqc8/7Zy/bXW2dZDtq81hHXCepqlovbWF9VUlvL1WPbYLEvrlVNtKv\nVTvziOskqc3To8fPmh7bBIl9c6tsdW2+YjMrAQAAwHYRXAEAAOia4AoAAEDXBFem2vz86czNLZ6y\n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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, (subfig1,subfig2) = plt.subplots(1,2,figsize=(16,7)) # one figure with two horizontal subfigures\n",
"subfig1.stem(x)\n",
"subfig1.set_title('signal')\n",
"subfig2.stem(x_recover)\n",
"subfig2.set_title('reconstruction')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"###Performance comparison between solver with and without solver = 'glpk' option"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"N, m, s = 1000, 200, 30\n",
"A, x = measurement_matrix(m, N), signal(N, s) \n",
"y = np.dot(A,x)\n",
"c, G, h, A, b = cvx_mat(A, y)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 loops, best of 3: 299 ms per loop\n"
]
}
],
"source": [
"%timeit solvers.lp(c, G, h, A, b)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 loops, best of 3: 1.97 s per loop\n"
]
}
],
"source": [
"%timeit solvers.lp(c, G, h, A, b, solver = 'glpk')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Phase transition diagrams for (BP)\n",
"\n",
"We say that the reconstruction is a success when $||x-x_{recover}||_2\\leq 0.001$"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def phase_transition_mat(N, nbtest, rand_type = \"gauss\", power = 2):\n",
" \"\"\"return a n.n/2 matrix with the number of reconstruction success for every 1\\leq m \\leq n measurements \n",
" and sparsity 1\\leq sparsity \\leq n/2\n",
" N : ambiant dimension of the signals\n",
" nbtest : number of tests for each pixel\"\"\"\n",
" PTM = np.zeros((N,int(N/2)))\n",
" set_ind_failure = []\n",
" for m in range(1,N+1):#construct one line of the Phase transition matrix for a given number of measurements m\n",
" if (m % 20) == 0:\n",
" print(\"line number {} done\".format(m))\n",
" M = measurement_matrix(m, N, rand_type, power)\n",
" ind_failure = 0\n",
" for sparsity in range(1,min(m+1, int(N/2))+1):\n",
" nb_success = 0 \n",
" for i in range(nbtest):\n",
" x = signal(N, sparsity)\n",
" y = np.dot(M,x)\n",
" c, G, h, A, b = cvx_mat(M, y)\n",
" sol = solvers.lp(c, G, h, A, b)\n",
" sol = sol['x']\n",
" if dist(x, sol) <= 0.001:\n",
" nb_success = nb_success + 1\n",
" PTM[m-1, sparsity-1] = nb_success\n",
" return PTM"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def frontier(mat, nbtest):\n",
" \"\"\"construction of the phase transition frontier, i.e. first time the number of success goes below nbtest/2\"\"\"\n",
" L = []\n",
" N = len(mat)\n",
" for s in range(int(N/2)):\n",
" P = 0\n",
" while mat[P,s]"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nAUfyGQZginIYAAAAAElFTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"P_min, P_max, S_min, S_max = 0, N, 0, int(N/2)\n",
"fig = plt.imshow(mat[P_min:P_max, S_min:S_max], interpolation=\"gaussian\", \n",
" aspect='auto', origin = 'lower', extent=[S_min, S_max, P_min, P_max])\n",
"plt.xlabel('sparsity')\n",
"plt.ylabel('number of measurements')\n",
"\n",
"#empirical phase transition\n",
"X = range(int(N/2))\n",
"L = frontier(mat, nbtest)\n",
"plt.plot(X,L, linewidth=4, color = 'black', label='phase transition')\n",
"plt.legend(loc=4)\n",
"\n",
"#filename = 'noisy_gaussian_{}_eps_{}.png'.format(n, eps)\n",
"#plt.savefig(filename,bbox_inches='tight')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Repeat the construction of the frontier *nb_curves* times to \"smooth it\"\n",
"\n",
"> nb_curves: number of phase transition curves constructed. Those curves are then averaged to \"smooth\" the effect of randomness in phase transition and get a \"stable\" phase transition"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"step 0 done\n",
"line number 20 done\n",
"line number 40 done\n",
"line number 20 done\n",
"line number 40 done\n",
"line number 20 done\n",
"line number 40 done\n",
"line number 20 done\n",
"line number 40 done"
]
}
],
"source": [
"#n, eps, nbtest = 100, 0.1, 16\n",
"nb_curves = 5\n",
"L = np.zeros(int(N/2))\n",
"for i in range(nb_curves):\n",
" if (i % 10) == 0:\n",
" print('step {} done'.format(i))\n",
" mat = phase_transition_mat(N, nbtest)\n",
" F = frontier(mat, nbtest)\n",
" L = [sum(a) for a in zip(L,F)] \n",
"L_gauss = [i/nb_curves for i in L]"
]
},
{
"cell_type": "code",
"execution_count": 403,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"#For next use, save the Gaussian phase transition frontier in a txt file \n",
"#import pickle\n",
"#filename = 'phase_transition_diagram_N_{}_nbtest_{}_nbcurves.p'.format(N, nbtest, nb_curves)\n",
"#with open(filename, \"wb\") as f:\n",
"# pickle.dump(L_gauss, f)\n",
"\n",
"#import the phase transition diagram\n",
"#filename = 'phase_transition_diagram_N_{}_nbtest_{}_nbcurves.p'\n",
"#with open(filename, \"rb\") as inputfile:\n",
"# L_gauss = pickle.load(inputfile)\n",
"#L_gauss = [int(float(ele[0])) for ele in L_gauss]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Draw the phase transition frontier of the Basis Pursuit procedure (via cvx.lp) for Gaussian measurements"
]
},
{
"cell_type": "code",
"execution_count": 407,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"X = range(len(L_gauss))\n",
"plot(X,L_gauss, linewidth=4, color = 'blue', label=\"Gaussian phase transition\")\n",
"\n",
"plt.xlabel('sparsity')\n",
"plt.ylabel('number of measurements')\n",
"plt.legend(loc=4)\n",
"#filename = 'gaussian_phase_transition_quantized_cs_{}_eps_{}.png'.format(n, eps)\n",
"#plt.savefig(filename,bbox_inches='tight')"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"#Measurement matrices used in the proof of the NP-hardness of the $\\ell_0$-minimization procedure\n",
"\n",
"NP-hardness of the $\\ell_0$-minimization procedure is based on a reduction principle. One can tranform the $\\ell_0$-minimization problem in polynomial time into a \"classical\" NP-complete problem: the **cover by $3$-sets problem**.\n",
"\n",
"*Cover by $3$-sets problem*: given a collection $\\cC=\\{C_1, \\ldots, C_N\\}$ of subsets of $\\{1,\\ldots,m\\}$ all of cardinality $3$, is it possible to answer the question about the existence of a partition of $\\{1,\\ldots,m\\}$ within this collection?\n",
"\n",
"To prove that $\\ell_0$-minimization problem can be reduced to the cover by $3$-sets problem, one can consider the following measurement vector\n",
"$$\n",
"y = \\left(\n",
"\\begin{array}{c}\n",
"1\\\\\n",
"1\\\\\n",
"\\vdots\\\\\n",
"1\\\\\n",
"\\end{array}\n",
"\\right)\n",
"$$\n",
"and a measurement matrix:\n",
"$$\n",
"A=[1_{C_1}| \\cdots | 1_{C_N}]\n",
"$$\n",
"where $1_{C_1}$ is a vector in $\\R^m$ such that $(1_{C_1})_i = 1$ if $i\\in C_1$ and $0$ if $i\\notin C_1$. \n",
"\n",
"One can see that a solution to the $\\ell_0$-minimization procedure $\\hat x_0$ obtained from $y$ and $A$ can be used to answer the *cover by $3$-sets problem*: if $\\norm{\\hat x_0}=m/3$ then there is a partition of $\\{1,\\ldots,m\\}$ in the collection $\\cC$; if $\\norm{\\hat x_0}>m/3$ then there is no such a partition (and one can show that necessarily $\\norm{\\hat x_0}\\geq m/3$).\n",
"\n",
"Hence solving the $\\ell_0$-minimization procedure for this $y$ and $A$ can be reduced in polynomial time to a solution of an NP-complete problem (and so by definition $\\ell_0$-minimization is an NP-Hard problem)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Phase transition of (BP) for the $0-1$ matrix $A$\n",
"We construct matrices $A$ introduced in the last paragraph in the two cases: either there is a partition and so the solution of the $\\ell_0$-minimization problem should have a support of size $m/3$ either there is no partition and so $\\hat x_0$ should have a strictly larger support. \n",
"\n",
"We want to check the performances of (BP) in this setup. We expect it to fail otherwise this would give a polynomial time algorithm to solve an NP-hard problem."
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def measurement_mat_partition(N, m, partition = 'yes', shuffling = 'yes'):\n",
" A = np.zeros((m,N))\n",
" if partition == 'yes':\n",
" perm = np.random.permutation(m)\n",
" perm_bis = np.random.permutation(N)\n",
" for k in range(int(m/3)):\n",
" ind = perm[3*k:3*k+3]\n",
" if shuffling == 'yes':\n",
" A[ind, perm_bis[k]] = [1, 1, 1]\n",
" else:\n",
" A[ind, k] = [1, 1, 1]\n",
" for k in list(perm_bis[int(m/3):]):\n",
" perm = np.random.permutation(m)\n",
" ind = perm[0:3]\n",
" A[ind, k] = [1, 1, 1]\n",
" else:\n",
" for k in range(N):\n",
" perm = np.random.permutation(m-1)#we insure that there is no partition by removing the last element\n",
" ind = perm[0:3]\n",
" A[ind, k] = [1, 1, 1]\n",
" return A"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def measures_vectors(m):\n",
" return np.ones(m)"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"N, m = 500, 3*20\n",
"A = measurement_mat_partition(N, m, partition = 'yes', shuffling ='no') \n",
"y = measures_vectors(m)\n",
"c, G, h, A, b = cvx_mat(A, y)\n",
"sol = solvers.lp(c, G, h, A, b)\n",
"sol = sol['x']\n",
"x_recover = sol[0:N] - sol[N:2*N]\n",
"plt.stem(x_recover)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Basis Pursuit does not work for this type of $0-1$ valued measurement matrices."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.4.3"
}
},
"nbformat": 4,
"nbformat_minor": 0
}