{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# TP: Image Reconstruction in X-Ray Tomography " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# I Introduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "X-ray tomography reconstructs dense volumes of objects from a set of projections measured at different angles. The measurements\n", "$y\\in\\mathbb{R}^M$ and the sought absorption image $\\overline{x}\\in\\mathbb{R}^N$ obey the linear relation\n", "\\begin{equation}\n", "y = H \\overline{x} + w,\n", "\\label{eq:tomo_problem}\n", "\\end{equation}\n", "where $w \\in \\mathbb{R}^M$ is the measurement noise, that we assume i.i.d. Gaussian with variance $\\sigma^2$. The tomography matrix $H \\in \\mathbb{R}^{M \\times N}$ is sparse and encodes the geometry of the measurements. Here, we will focus on the case when $H$ models parallel projections of a 2-D\n", "object $\\overline{x}$. Tomography measures are acquired at fixed and regularly\n", "sampled rotational positions between the sample and the detector so that\n", "$H_{mn}$ models the intersection length between the $m$th light-ray and the\n", "$n$th pixel. If $N_\\theta$ is the number of different angular positions of the detector and $L$ the linear size of the detector, the number of measurements $M=L\\times\n", "N_\\theta$. In practice, the angular positions are regularly distributed on\n", "$[0,\\pi)$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Traditional reconstruction methods such as the Filtered Back-Projection require the linear system\n", "to be sufficiently determined for good results, i.e., $N_\\theta \\sim L$. However, several applications could benefit from a smaller number of projections, either in order to reduce the total dose for medical applications, or to reduce the total acquisition time for in-situ experiments where the sample is evolving. Therefore, regularized reconstruction approaches must be developed in order to overcome the under-determinacy of the problem and to make it robust to the presence of noise in the measurements." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## I-1 Data generation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We do some imports and load the data:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import scipy\n", "from scipy.io import loadmat\n", "from scipy.sparse.linalg import LinearOperator, bicg\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import time\n", "from scipy.sparse import csr_matrix\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "H = loadmat(\"H.mat\")['H']\n", "x = loadmat(\"x.mat\")['x']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We simulate a sinogram y degraded by some noise. H is the projection matrix." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "z = H * x\n", "y = z + np.random.normal(scale=1.,size=z.shape)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "nx = 90;\n", "nt = 180;\n", "x_2D = x.reshape((nx,nx),order='F')\n", "y_2D = y.reshape((nx,nt),order='F')\n", "N = x.shape[0]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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Bw6IiCcPw0tfxiBvu1AorHJsscVvrT00jNE+n4E77++GIaeFZcQ42i09Zdttu9u83Xbbzfnr211/0XbR8x/9qAvB12c/t+aWP/jBD0ZtP/zhDwF46KGH5uzjn7P+15Rg6bGotNzW2nkMEjAKhcIaQuXjrwH0raJb5kc+8pEAPPrRjx61PeYxjwFgp512AuCxj33saNuOO+4IwPbbd2UAs2Pou7K+999//2ibLLkzCVnwBx54YNT2r//6rwB85zuDrN5vfetbo23f/e535/z1z9///vfnHNP7UZgOKmS3UJhB1INfKMwgiuqvAmQC1yMe0b2TH/WoRwGwyy6DEv0//uM/Ptq2xx57APC4x3WFevRZ+/n+OobTaAl5ovDQUXvR9K997Wujbd/73qBU4MEHHzxq23fffTe5Fn33hhsGmu+tt9462qZzPfjgg6O2++67D4BvfOMbm5xTx9I0AOYKjkJNCSZDWfxCYQaxrIU4IqLNeshuNt4utEmY23333Udte+89KMO3116D2pQHHHDAaNuhhx4KzHXPSSST9XPB7Ytf/CIAX/pSV/tSots3v9nVyZSFlXsus67OJGTxxUCgYx5iLzvvvPNom4REt/jqtyy+93HDhg0A3H333aO2r3/963O+Bx2TmVXL//DDD08Uq18Wv1CYQdSDXyjMIIrqLxM0zjvssMOobbfdBnUgRZMBDjposBCNKDzAk540tzK1IuGgo7bXXnvtqE2fv/zlQfLkt7/97dE2UWuPsFPf/N7IR68phG8T7XehTdTa9xPF1zX/2I/92GjbPvsM0jye+tSnjtr233+weO+ee+4553sAV199NQDXXXfdqE1ioa4TOvqv65y1WICi+oVCYbMoi78E8DGVxXz84weLwrh1l1U//vjjR22HH344MNe1ds011wBw+eWXA7B+/frRtnvvvReYK3DJ0qofbumyOHtt93PK2u66665AHpHnxxALcSuta5fV9eOrTVGD0DEgsZ6f+ImfGG0TC1B/oBP8vvCFL4zabr55sJ7Hxo2DRFF3CfoYba0oi18oFDaLsviLRGY55ZKDzhUnS+5WTO45d6Ndf/31AFx66aWbtGneqoAe6GLqPeBHn2WFvY9yHXqcfTb3FUORe87daFkwjRhBNqfOmIf66G5IbZf+4GxATMnH72lPe9om5xQb0vxf7kvoGIKPt8Zoa5n/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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.title(\"Sinogram\")\n", "plt.imshow(y_2D, cmap=\"gray\")\n", "\n", "plt.figure()\n", "plt.title(\"Original 2D object\")\n", "plt.imshow(x_2D, cmap=\"gray\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## I-2 Optimization Problem " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We define the reconstructed image as the solution to the following optimization problem:\n", "\n", "$(\\forall x \\in \\mathbb{R}^N) \\quad f(x)=\\frac{1}{2}||Hx - y||^2 + \\lambda r(x)$\n", "\n", "where $r$ is a regularization function incorporating a priori assumptions to\n", "guarantee the robustness of the solution with respect to noise. In order to promote images formed by smooth regions separated by sharp edges, we set:\n", "\n", "$r(x) = \\sum^{2N}_{n=1} \\psi ([Gx]^{(n)})$ and $(\\forall u \\in \\mathbb{R}) \\quad \\psi(u) = \\sqrt{1 + u^2/\\delta^2}$\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "$G\\in \\mathbb{R}^{2N \\times N}$ is a sparse matrix computing discrete horizontal and vertical gradients of an image. \n", "$\\psi$ is a differentiable convex potential, applied elementwise, which can be viewed as a smoothed version of the absolute value." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "G = loadmat(\"data/G.mat\")['G']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Parameters $(\\lambda,\\delta)$ have been finetuned to ensure an optimal image quality (i.e., minimizing quadratic reconstruction error)." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "delta = 0.05\n", "lbd = 0.3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$f$ is differentiable on $\\mathbb{R}^N$. Its gradients reads:\n", "\n", "$\\nabla f(x) = H^THx - H^Ty + \\lambda G^T\\psi'(Gx)$\n", "with $\\forall u \\in \\mathbb{R} \\quad \\psi'(u) = \\frac{1}{\\delta^2}\\frac{u}{\\sqrt{1 + \\frac{u^2}{\\delta^2}}}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us define useful functions for function/gradient evaluation:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def psi(x, delta=delta): \n", " return np.sqrt(1 + np.square(x)/np.square(delta))\n", "\n", "def psi_prime(x, delta=delta):\n", " return x / (np.square(delta) * psi(x))\n", "\n", "def r(x):\n", " return psi(G.dot(x)).sum()\n", "\n", "def grad_r(x):\n", " return G.T.dot(psi_prime(G.dot(x)))\n", "\n", "def f(x):\n", " q = H.dot(x) - y\n", " return 0.5 * q.T.dot(q) + lbd * r(x)\n", "\n", "def grad_f(x):\n", " return H.T.dot(H.dot(x) - y) + lbd * grad_r(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$f$ is Lipschitz differentiable on $\\mathbb{R}^N$. The Lipschitz constant of $\\nabla f$ is\n", "\n", "$L = ||H||^2 + (\\lambda / \\delta^2)||G||^2$\n", "\n", "It can be computed as:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Lipschitz constant = 18092.77\n" ] } ], "source": [ "# there is no norm 2 of matrix implemented with sparse matrix so we use a little trick to calculate it...\n", "lipschitz_cst = scipy.sparse.linalg.svds(H)[1].max()**2 + (lbd / delta**2) * scipy.sparse.linalg.svds(G)[1].max()**2\n", "print('Lipschitz constant = %.2f'%(lipschitz_cst))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# II Comparison of optimization algorithms" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Initialization of all algorithms:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "x_0 = np.zeros_like(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## II-1 Gradient Descent Algorithm " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us start with the gradient descent method. We will use a constant stepsize, defined as follows:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "nu = 1.999 / lipschitz_cst" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "def gradient_descent(f, grad_f, x_0, nu):\n", " \n", " x_n = x_0\n", " grad_fx = grad_f(x_n)\n", " sqr_norm_grad = grad_fx.T.dot(grad_fx)\n", " it = 0\n", " \n", " history = []\n", " t_0 = time.time()\n", " history.append([time.time() - t_0, f(x_n)])\n", " \n", " # criterion\n", " while sqr_norm_grad > N * 1e-8:\n", " it += 1\n", " \n", " # iteration\n", " x_n = x_n - nu * grad_fx\n", " \n", " grad_fx = grad_f(x_n)\n", " sqr_norm_grad = grad_fx.T.dot(grad_fx)\n", " if it % 250 == 0:\n", " print(\"it \",it,\"sqr norm of grad:\", sqr_norm_grad[0,0])\n", " history.append([time.time() - t_0, f(x_n)])\n", " \n", " history.append([time.time() - t_0, f(x_n)])\n", " print(\"Converged in \", str(it), \" iterations\")\n", " \n", " return x_n, np.array(history)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "it 250 sqr norm of grad: 10695.982872611048\n", "it 500 sqr norm of grad: 852.1122953706316\n", "it 750 sqr norm of grad: 153.61664395305002\n", "it 1000 sqr norm of grad: 38.823457218460355\n", "it 1250 sqr norm of grad: 11.636000161738657\n", "it 1500 sqr norm of grad: 3.878974471483368\n", "it 1750 sqr norm of grad: 1.3833125125567958\n", "it 2000 sqr norm of grad: 0.5180988497548122\n", "it 2250 sqr norm of grad: 0.20194502399578051\n", "it 2500 sqr norm of grad: 0.08138476773291385\n", "it 2750 sqr norm of grad: 0.033722879027406394\n", "it 3000 sqr norm of grad: 0.01430031190019378\n", "it 3250 sqr norm of grad: 0.006182391631426786\n", "it 3500 sqr norm of grad: 0.002716684984452983\n", "it 3750 sqr norm of grad: 0.0012104223002435697\n", "it 4000 sqr norm of grad: 0.000545747478912034\n", "it 4250 sqr norm of grad: 0.0002485980001440132\n", "it 4500 sqr norm of grad: 0.00011425256385925908\n", "Converged in 4612 iterations\n" ] } ], "source": [ "x_rec, history_gradient_descent = gradient_descent(f, grad_f, x_0, nu)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.title(\"Reconstruction of x\")\n", "plt.imshow(x_rec.reshape(nx,nx,order='F'), cmap=\"gray\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## II-2 MM quadratic algorithm " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now implement an MM quadratic algorithm wich consists on minimizing, at each iteration, a quadratic majorant of $f$ at the current iterate." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us construct a quadratic majorant of $f$:\n", "\n", "Using the properties of the course, we can deduce that, at $x' \\in \\mathbb{R}^N$, \n", "\n", "$f(x) \\leq q(x,x')$ with\n", "\n", "$q(x,x') = f(x') + <\\nabla f(x'),x-x'> + \\frac{1}{2}||x-x_0||_{A(x')}$\n", "\n", "The matrix $A(x')$ takes the form\n", "\n", "$A(x') = H^TH + \\lambda G^TD(G x') G$\n", "\n", "with\n", "\n", "$D(u) = \\mathrm{Diag}(\\frac{\\psi'(u_{i})}{u_{i}})$\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We define some functions that will be useful to evaluate the majorant function:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "# the diagonal matrix for the regularization function potential:\n", "def D(x):\n", " x = G.dot(x)\n", " d = 1. / (delta ** 2 * np.sqrt(1 + (x/delta)**2))\n", " return scipy.sparse.diags(d[:,0]).tocsc()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "# Returns a linear operator that does the computation of the curvature of the majorant matrix at some point\n", "def majorant_curve_operator(x_0):\n", " D_x_0 = D(x_0)\n", " def linear_operator(x):\n", " return H.T.dot(H.dot(x)) + lbd * G.T.dot(D_x_0.dot(G.dot(x)))\n", " return LinearOperator((N,N), matvec=linear_operator, rmatvec=linear_operator)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can then implement the standard MM Quadratic Algorithm" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "# we use the constructed functions to implement the following algorithm:\n", "def mm_quadratic(f, grad_f, majorant_curve_operator, x_0, theta):\n", " x_n = x_0\n", " grad_fx = grad_f(x_n)\n", " sqr_norm_grad = grad_fx.T.dot(grad_fx)\n", " it = 0\n", " \n", " history = []\n", " t_0 = time.time()\n", " history.append([time.time() - t_0, f(x_n)])\n", " \n", " while sqr_norm_grad > N * 1e-8:\n", " it += 1\n", " \n", " # at each iteration solve the linear system instead of inverting the matrix:\n", " x_n = x_n - theta * bicg(majorant_curve_operator(x_n), grad_fx)[0].reshape(N,1)\n", " \n", " grad_fx = grad_f(x_n)\n", " sqr_norm_grad = grad_fx.T.dot(grad_fx)\n", " if it % 5 == 0:\n", " print(\"it \",it,\"sqr norm of grad:\", sqr_norm_grad[0,0])\n", " history.append([time.time() - t_0, f(x_n)])\n", " \n", " history.append([time.time() - t_0, f(x_n)])\n", " print(\"Converged in \", str(it), \" iterations\")\n", " \n", " return x_n, np.array(history)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "it 5 sqr norm of grad: 4727.440760057238\n", "it 10 sqr norm of grad: 254.02675754652978\n", "it 15 sqr norm of grad: 29.055319639537014\n", "it 20 sqr norm of grad: 4.806741263855145\n", "it 25 sqr norm of grad: 1.021009604576437\n", "it 30 sqr norm of grad: 0.2581543146790757\n", "it 35 sqr norm of grad: 0.07339319380581313\n", "it 40 sqr norm of grad: 0.02260423947066547\n", "it 45 sqr norm of grad: 0.007369659023717522\n", "it 50 sqr norm of grad: 0.0025067931651838846\n", "it 55 sqr norm of grad: 0.0008813189358575759\n", "it 60 sqr norm of grad: 0.00031825589551324145\n", "it 65 sqr norm of grad: 0.00011753083069855779\n", "Converged in 67 iterations\n" ] } ], "source": [ "x_rec, history_mm_quadratic = mm_quadratic(f, grad_f, majorant_curve_operator, x_0, 1.99)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.title(\"Reconstruction of x\")\n", "plt.imshow(x_rec.reshape(nx,nx,order='F'), cmap=\"gray\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## II-3 3MG algorithm " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We rebuild similar functions and algorithm, adding the subspace limitation on the defined operators." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "def my_subspace_majorant_curv_matrix(x_0,dir_mat):\n", " D_x_0 = D(x_0)\n", " Gdir = G.dot(dir_mat)\n", " Hdir = H.dot(dir_mat)\n", " return Hdir.T.dot(Hdir) + lbd * Gdir.T.dot(D_x_0.dot(Gdir))" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "def three_mg_quadratic(f, grad_f, x_0):\n", " x_n = x_0\n", " x_n_minus_one = x_n\n", " grad_fx = grad_f(x_n)\n", " sqr_norm_grad = grad_fx.T.dot(grad_fx)\n", " it = 0\n", " \n", " history = []\n", " t_0 = time.time()\n", " history.append([time.time() - t_0, f(x_n)])\n", " \n", " while sqr_norm_grad > N * 1e-8:\n", " it += 1\n", " d1 = x_n - x_n_minus_one\n", " d2 = grad_fx\n", " dir_mat = np.concatenate((d1,d2),axis=1)\n", " x_n_minus_one = x_n\n", " \n", " # we solve the linear system on a limited subspace at each iteration:\n", " #x_n = x_n - dir_mat.dot(bicg(subspace_majorant_curve_operator(x_n, dir_mat), dir_mat.T.dot(grad_fx))[0].reshape(2,1))\n", " x_n = x_n - dir_mat.dot(scipy.linalg.pinv(my_subspace_majorant_curv_matrix(x_0,dir_mat))@dir_mat.T.dot(grad_fx))\n", " grad_fx = grad_f(x_n)\n", " sqr_norm_grad = grad_fx.T.dot(grad_fx)\n", " if it % 50 == 0:\n", " print(\"it \",it,\"sqr norm of grad:\", sqr_norm_grad[0,0])\n", " history.append([time.time() - t_0, f(x_n)])\n", " \n", " history.append([time.time() - t_0, f(x_n)])\n", " print(\"Converged in \", str(it), \" iterations\")\n", " \n", " return x_n, np.array(history)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "it 50 sqr norm of grad: 479.13397411390025\n", "it 100 sqr norm of grad: 23.122900096163832\n", "it 150 sqr norm of grad: 2.2957871068564115\n", "it 200 sqr norm of grad: 0.3024410253942593\n", "it 250 sqr norm of grad: 0.04704479611184517\n", "it 300 sqr norm of grad: 0.008170434483899786\n", "it 350 sqr norm of grad: 0.0015338564714084315\n", "it 400 sqr norm of grad: 0.0003050569955474268\n", "Converged in 443 iterations\n" ] } ], "source": [ "x_rec, history_three_mg_quadratic = three_mg_quadratic(f, grad_f, x_0)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.title(\"Reconstruction of x\")\n", "plt.imshow(x_rec.reshape(nx,nx,order='F'), cmap=\"gray\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## II-4 Parallel MM quadratic algorithm " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We finally implement a parallelizable version of the quadratic MM algorithm. One way to do this would be to find another majorant function, a \"diagonal\" majorant so that each term of the minimizer can be computed in parallel, independantly from the others, with no need of synchronization. Let us find $B$, such that $\\forall x \\in \\mathbb{R}^N \\quad A(x) \\preceq B(x)$, with $B(x)$ diagonal.\n", "\n", "Matrix $B(x)$ is constructed using Jensen's inequality.\n", "\n", "We have, \n", " \n", "$ H^TH \\preceq Diag(\\mathcal{h})$\n", "\n", "with $\\mathcal{h}_i = \\sum_{m=1}^M |H_{mi}| \\sum_{p=1}^N |H_{mp}|$\n", "\n", "Similarly, for every $x' \\in \\mathbb{R}^N$,\n", "\n", "$G^{T} D(G x')G \\preceq Diag(\\mathcal{g}(x'))$ \n", "\n", "with $\\mathcal{g}_i(x') = \\sum_{n=1}^{2N} \\frac{\\psi'(Gx')_{n}}{(Gx')_{n}} |G_{ni}| \\sum_{p=1}^{n} |G_{np}|$\n", "\n", "We finally obtain:\n", "\n", "$\n", "A(x') \\preceq Diag(\\mathcal{h}) + \\lambda Diag(\\mathcal{g}(x'))\n", "$" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "H_diag = H.multiply(H.dot(np.ones((N,1)))).T.dot(np.ones((H.shape[0],1)))" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "G_diag = G.multiply(G.dot(np.ones((N,1))))" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "def b_diag_inverse(x):\n", " return scipy.sparse.diags(1./(H_diag + lbd * G_diag.T.dot(D(x).diagonal()))[0]).tocsc()" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "def mm_quadratic_parallel(f, grad_f, b_diag_inverse, x_0, theta):\n", " x_n = x_0\n", " grad_fx = grad_f(x_n)\n", " sqr_norm_grad = grad_fx.T.dot(grad_fx)\n", " it = 0\n", " \n", " history = []\n", " t_0 = time.time()\n", " history.append([time.time() - t_0, f(x_n)])\n", " \n", " while sqr_norm_grad > N * 1e-8:\n", " it += 1\n", " x_n = x_n - theta * b_diag_inverse(x_n).dot(grad_fx) \n", " grad_fx = grad_f(x_n)\n", " sqr_norm_grad = grad_fx.T.dot(grad_fx)\n", " if it % 200 == 0:\n", " print(\"it \",it,\"sqr norm of grad:\", sqr_norm_grad[0,0])\n", " history.append([(time.time() - t_0)/32., f(x_n)])\n", " \n", " history.append([(time.time() - t_0)/32., f(x_n)])\n", " print(\"Converged in \", str(it), \" iterations\")\n", " \n", " return x_n, np.array(history)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that, in order to have an idea of the potential performance of the parallel algorithm, we consider that the computation is distributed on 32 workers and we neglect the overhead, so we will have a rough idea of the computational performance on a multicore architecture." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "it 200 sqr norm of grad: 2108.76920190274\n", "it 400 sqr norm of grad: 123.25660003772957\n", "it 600 sqr norm of grad: 16.057799281173736\n", "it 800 sqr norm of grad: 2.8441601379931147\n", "it 1000 sqr norm of grad: 0.5879339438023874\n", "it 1200 sqr norm of grad: 0.13457305500493438\n", "it 1400 sqr norm of grad: 0.03324993177401131\n", "it 1600 sqr norm of grad: 0.008699979519793177\n", "it 1800 sqr norm of grad: 0.002377373121728913\n", "it 2000 sqr norm of grad: 0.0006718285492556624\n", "it 2200 sqr norm of grad: 0.00019494794764590598\n", "Converged in 2345 iterations\n" ] } ], "source": [ "x_rec, history_mm_quadratic_parallel = mm_quadratic_parallel(f, grad_f, b_diag_inverse, x_0, 0.99)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# III Comparison of the methods" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We plot the evolution of the $f - f_{min}$ in function of time for the differents algorithms." ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "min_objective = np.min(history_gradient_descent[:,1])" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "x and y must have same first dimension, but have shapes (10,) and (1, 10)", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtitle\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Objective - Optimal Objective, over time (s) for different algorithms\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msemilogy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mhistory_three_mg_quadratic\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mhistory_three_mg_quadratic\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m-\u001b[0m \u001b[0mmin_objective\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlabel\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m\"3MG quadratic\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msemilogy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mhistory_mm_quadratic_parallel\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mhistory_mm_quadratic_parallel\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m-\u001b[0m \u001b[0mmin_objective\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlabel\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m\"Parallel (32 workers)\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msemilogy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mhistory_gradient_descent\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mhistory_gradient_descent\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m-\u001b[0m \u001b[0mmin_objective\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlabel\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m\"gradient descent\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\pyplot.py\u001b[0m in \u001b[0;36msemilogy\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 2874\u001b[0m \u001b[1;33m@\u001b[0m\u001b[0mdocstring\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcopy_dedent\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mAxes\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msemilogy\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2875\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0msemilogy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2876\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mgca\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msemilogy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2877\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2878\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\axes\\_axes.py\u001b[0m in \u001b[0;36msemilogy\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1842\u001b[0m if k in kwargs}\n\u001b[0;32m 1843\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mset_yscale\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'log'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0md\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1844\u001b[1;33m \u001b[0ml\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1845\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1846\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0ml\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\__init__.py\u001b[0m in \u001b[0;36minner\u001b[1;34m(ax, data, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1808\u001b[0m \u001b[1;34m\"the Matplotlib list!)\"\u001b[0m \u001b[1;33m%\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mlabel_namer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1809\u001b[0m RuntimeWarning, stacklevel=2)\n\u001b[1;32m-> 1810\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0max\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1811\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1812\u001b[0m inner.__doc__ = _add_data_doc(inner.__doc__,\n", "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\axes\\_axes.py\u001b[0m in \u001b[0;36mplot\u001b[1;34m(self, scalex, scaley, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1609\u001b[0m \u001b[0mkwargs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcbook\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mnormalize_kwargs\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmlines\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mLine2D\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_alias_map\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1610\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1611\u001b[1;33m \u001b[1;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_get_lines\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1612\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0madd_line\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mline\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1613\u001b[0m \u001b[0mlines\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mline\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\axes\\_base.py\u001b[0m in \u001b[0;36m_grab_next_args\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 391\u001b[0m \u001b[0mthis\u001b[0m \u001b[1;33m+=\u001b[0m \u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 392\u001b[0m \u001b[0margs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 393\u001b[1;33m \u001b[1;32myield\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_plot_args\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mthis\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 394\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 395\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\axes\\_base.py\u001b[0m in \u001b[0;36m_plot_args\u001b[1;34m(self, tup, kwargs)\u001b[0m\n\u001b[0;32m 368\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mindex_of\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtup\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 369\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 370\u001b[1;33m \u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_xy_from_xy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 371\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 372\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcommand\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'plot'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\axes\\_base.py\u001b[0m in \u001b[0;36m_xy_from_xy\u001b[1;34m(self, x, y)\u001b[0m\n\u001b[0;32m 229\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 230\u001b[0m raise ValueError(\"x and y must have same first dimension, but \"\n\u001b[1;32m--> 231\u001b[1;33m \"have shapes {} and {}\".format(x.shape, y.shape))\n\u001b[0m\u001b[0;32m 232\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mndim\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m2\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mndim\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 233\u001b[0m raise ValueError(\"x and y can be no greater than 2-D, but have \"\n", "\u001b[1;31mValueError\u001b[0m: x and y must have same first dimension, but have shapes (10,) and (1, 10)" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.title(\"Objective - Optimal Objective, over time (s) for different algorithms\")\n", "plt.semilogy(history_three_mg_quadratic[:,0],history_three_mg_quadratic[:,1] - min_objective, label = \"3MG quadratic\")\n", "plt.semilogy(history_mm_quadratic_parallel[:,0],history_mm_quadratic_parallel[:,1] - min_objective, label = \"Parallel (32 workers)\")\n", "plt.semilogy(history_gradient_descent[:,0], history_gradient_descent[:,1] - min_objective, label = \"gradient descent\")\n", "plt.semilogy(history_mm_quadratic[:,0],history_mm_quadratic[:,1] - min_objective, label = \"MM quadratic\")\n", "plt.legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see how much time it took to converge for the different algorithms." ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "With the given criteria, algorithms took the following time to converge:\n", "Gradient descent: 41 s\n", "MM quadratic: 36 s\n", "3MG quadratic: 8 s\n", "Parallel (32 workers): 22 s\n" ] } ], "source": [ "print(\"With the given criteria, algorithms took the following time to converge:\")\n", "print(\"Gradient descent: {} s\".format(int(history_gradient_descent[-1,0])))\n", "print(\"MM quadratic: {} s\".format(int(history_mm_quadratic[-1,0])))\n", "print(\"3MG quadratic: {} s\".format(int(history_three_mg_quadratic[-1,0])))\n", "print(\"Parallel (32 workers): {} s\".format(int(history_mm_quadratic_parallel[-1,0])))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Bibliography\n", "\n", "* A. Kak and M. Slaney, Principles of computerized tomographic imaging, Classics in Applied Mathematics. SIAM, Philadelphia, 1988.\n", "\n", "* A. H. Delaney and Y. Bresler, “Globally convergent edge-preserving regularized reconstruction: an application to limited-angle tomography,” IEEE Transactions on Image Processing, vol. 7, no. 2, pp. 204 –221, Feb. 1998.\n", "\n", "* E. Chouzenoux, F. Zolyniak, E. Gouillart and H. Talbot. A Majorize-Minimize Memory Gradient Algorithm Applied to X-Ray Tomography. In Proceedings of the 20th IEEE International Conference on Image Processing (ICIP 2013), pp. 1011-1015, Melbourne, Australia, 15-18 sep. 2013" ] } ], "metadata": { "anaconda-cloud": {}, "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.7.3" } }, "nbformat": 4, "nbformat_minor": 2 }