{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# TP : Reconstruction of NMR signals" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from numpy.linalg import norm\n", "import scipy\n", "from scipy.sparse.linalg import LinearOperator, bicg\n", "%matplotlib inline\n", "plt.rcParams[\"figure.figsize\"] = (8,5)\n", "import time" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# I Introduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook illustrates the applicability of the presented optimization tools in a problem of signal restoration in nuclear magnetic resonance (NMR). The measurement of diffusion by NMR is used in various application fields (agroalimentary sector, pharmaceutical industry, ecology) to analyze the properties of complex chemical mixtures in order to determine their molecular structure and dynamics. After the immersion of the matter in a strong magnetic field, all the nuclear spins align to an equilibrium state along the field orientation. The application of a short magnetic pulse, i.e. the pulsed field gradient, in resonance with the spin motion disturbs the spin orientation. NMR aims at analyzing the process which corresponds to the re-establishment of the spin into its equilibrium state. During the DOSY (Diffusion Order SpectroscopY) experiment, a series of measurements is acquired for different pulsed field gradient strengths. The data are then analyzed with the aim to separate different species according to their diffusion coefficient. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## I-1 Observation model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The DOSY NMR data $\\mathbf{y}= (y^{(m)})_{1 \\leq m \\leq M} \\in \\mathbb{R}^{M}$ gathers the results of $M$ experiments characterized by a vector $\\mathbf{t} = (t^{(m)})_{1 \\leq m \\leq M} \\in \\mathbb{R}^M$ related to the pulsed field gradient strength and to the acquisition time. The relation between $\\mathbf{y}$ and $\\mathbf{t}$ can be expressed as the following Laplace transform:\n", "\\begin{equation}\n", "(\\forall m \\in \\{1,\\ldots,M\\}) \\quad y^{(m)} = \\int \\chi(T) \\exp(- t^{(m)} T ) dT, \\label{eq:lapl}\n", "\\end{equation}\n", "where $\\chi(T)$ is the unknown diffusion distribution. The problem is then to reconstruct $\\chi(T)$ on the sampled grid $\\mathbf{T} = (T^{(n)})_{1 \\leq n \\leq N}$, from the measurements $\\mathbf{y}$. After discretization and appropriate normalization, \n", "the observation model reads\n", "\\begin{equation}\n", "\\mathbf{y} = \\mathbf{H} \\overline{\\mathbf{x}} + \\mathbf{w}, \\label{eq:model}\n", "\\end{equation}\n", "where $\\mathbf{H} \\in \\mathbb{R}^{M \\times N}$ is given by\n", "\\begin{equation}\n", "(\\forall m \\in \\{1,\\ldots,M\\}) (\\forall n \\in \\{1,\\ldots,N\\}) \\qquad H^{(m,n)} = \\exp(-T^{(n)} t^{(m)}), \\label{eq:K}\n", "\\end{equation}\n", "$\\overline{\\mathbf{x}} \\in \\mathbb{R}^N$ is the sought signal related to $\\left(\\chi(T^{(n)})\\right)_{1 \\leq n \\leq N}$ (up to a scaling factor depending on the discretization grid), and $\\mathbf{w} \\in \\mathbb{R}^M$ is a perturbation noise." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x_bar = np.loadtxt(\"signal.txt\").flatten()\n", "Tmin = 1\n", "Tmax = 1000\n", "N = 200\n", "T = Tmin*np.exp(-(np.arange(N))*np.log(Tmin/Tmax)/(N-1))\n", "plt.semilogx(T,x_bar)\n", "plt.xlabel(\"T\")\n", "plt.ylabel(\"Diffusion distribution\")\n", "plt.title(\"Original signal\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tmin = 0\n", "tmax = 1.5\n", "M = 50\n", "np.random.seed(1)\n", "t = tmin + np.arange(M)*(tmax-tmin)/(M-1)\n", "H = np.exp(-t.reshape(-1,1)@T.reshape(-1,1).T)\n", "z = H@x_bar.reshape(-1,1)\n", "noise = np.random.normal(0, 0.01*z[0], size=(M,1))\n", "y = z + noise\n", "plt.title(\"Noisy measure\")\n", "plt.xlabel(\"t\")\n", "plt.plot(t,y)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## I-2 Problem statement" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We propose here to find an estimate $\\widehat{\\mathbf{x}} \\in \\mathbb{R}^N$ of $\\overline{\\mathbf{x}}$ by solving the following minimization problem, requiring the knowledge of $\\mathbf{H}$ and $\\mathbf{y}$:\n", "\\begin{equation}\n", "\\text{minimize}_{\\mathbf{x} \\in \\mathbb{R}^N} \\frac{1}{2} \\| \\mathbf{H} \\mathbf{x} - \\mathbf{y} \\|^2 + \\beta g(\\mathbf{x}) \\label{eq:pb_rmn}\n", "\\end{equation}\n", "where $g \\in \\Gamma_0(\\mathbb{R}^N)$ denotes a regularization term and $\\beta > 0$ is a regularization parameter. \n", "\n", "Note that, in practice, a very large number of DOSY NMR acquisitions (typically, $10^4$) are made for various settings of the pulsed gradient field, \n", "so that the optimization problem must be solved many times, which motivates the search for a fast minimization algorithm. \n", "\n", "In the following, you will implement optimization solutions, for various choices of function $g$ listed below:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Quadratic penalization\n", "* Quadratic penalization + range constraint\n", "* L1 penalization \n", "* Smoothed L1 penalization " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# II Comparison of regularization strategies" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## II-1 Quadratic penalization" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us start with the following regularization term serving to promote the reconstruction of smooth signals:\n", "\n", "$g(\\mathbf{x}) = \\frac{1}{2} \\| \\mathbf{D} \\mathbf{x}\\|^2$\n", "\n", "with $\\mathbf{D} \\in \\mathbb{R}^{N \\times N}$ is the discrete gradient operator such that, \n", "\\begin{equation}\n", "(\\forall n \\in \\left\\{1,\\ldots,N\\right\\}) \\quad [\\mathbf{D} \\mathbf{x} ]^{(n)} = x^{(n)} - x^{(n-1)}\n", "\\end{equation}\n", "with the circular convention $x^{(0)} = x^{(N)}.$" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "D = np.eye(N)+ -np.roll(np.eye(N), 1, axis=0)\n", "def error(x_hat):\n", " return norm(x_bar.flatten() - x_hat.flatten())**2/norm(x_bar.flatten())**2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this case, the problem has an explicit solution given by :\n", "\n", "$ \\widehat{\\mathbf{x}} = (\\mathbf{H}^T \\mathbf{H}+\\beta \\mathbf{D}^T \\mathbf{D})^{-1} \\mathbf{H}^T \\mathbf{y} $ " ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Error(beta = 0.5) = 0.1736648558693157\n" ] } ], "source": [ "beta = 0.5\n", "x_hat = np.linalg.inv(H.T@H+beta*D.T@D)@H.T@y\n", "plt.semilogx(T,x_hat,label=\"beta = {}\".format(beta))\n", "plt.semilogx(T,x_bar, label=\"Ground truth\")\n", "plt.legend()\n", "plt.show()\n", "\n", "print(\"Error(beta = {}) = {}\".format(beta,error(x_hat)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## II-2 Quadratic penalization + range constraints" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, assume that we want to impose some value range constraints on the sought signal. Then a possible regularization function is:\n", "\\begin{equation}\n", "(\\forall \\mathbf{x} \\in \\mathbb{R}^N) \\quad g(\\mathbf{x}) = \\frac{1}{2} \\| \\mathbf{D} \\mathbf{x}\\|^2 + \\iota_{[x_{\\min},x_{\\max}]^N}(\\mathbf{x})\n", "\\end{equation}\n", "with $0 \\leq x_{\\min} < x_{\\max}$ the sought minimum and maximum values of the signal. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For this setting, we can obtain $\\widehat{\\mathbf{x}}$ using the projected gradient method. " ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "scrolled": false }, "outputs": [], "source": [ "xmin = min(x_bar)\n", "xmax = max(x_bar)\n", "cost = lambda x,b: 0.5*np.linalg.norm(H@x-y)**2 +0.5*b*np.linalg.norm(D@x)**2\n", "\n", "def projected_grad_solver(beta,verbose=False):\n", " Grad = H.T@H+beta*D.T@D\n", " nu = max(np.abs(np.linalg.eigvals(Grad)))\n", " gamma = 1.999/nu\n", " delta = 2 - gamma*nu/2\n", " lambda_n = 0.99*delta\n", "\n", " tol = 3e-6\n", " x_0 = np.ones((N,1))\n", " x_n_new = x_0\n", " x_n = x_0\n", " n_iter = 0\n", " start = True\n", " \n", " history = []\n", " t_0 = time.time()\n", " history.append([time.time() - t_0, cost(x_n,beta)])\n", "\n", " while start or np.linalg.norm(x_n-x_n_new)/np.linalg.norm(x_n)> tol:\n", " start = False\n", " x_n = x_n_new\n", " y_n = x_n -gamma*(Grad@x_n - H.T@y)\n", " x_n_new = x_n + lambda_n*(np.clip(y_n,xmin,xmax)-x_n)\n", " history.append([time.time() - t_0, cost(x_n,beta)])\n", " n_iter += 1 \n", " if n_iter % 5000 == 0 and verbose:\n", " print(\"Error and precision at iteration %d : %.4e %.4e\"%(n_iter, error(x_n_new),np.linalg.norm(x_n-x_n_new)/np.linalg.norm(x_n)))\n", " if n_iter == 100000:\n", " break\n", " print('beta %.4e error %.4e'%(beta,error(x_n_new)))\n", " return x_n_new, error(x_n_new), np.array(history)\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "beta 6.2500e-02 error 6.4192e-02\n", "Error(beta = 0.0625) = 0.06419178399677239\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEACAYAAACznAEdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsvXl8W9Wd9/8+kizJsuV9jZ3Ezo6TOMZZIEBCCySBlhIoENYWWraWMtPpPOUZ6AI0084PCk/ToWwtpUNL6SSFEnZIKEtCIAlJyL5vTmIn3m15lW1Z5/fHvVJkW7blTZvP+/XyS9K55557ZCf3c7/nuxwhpUShUCgUCkOoJ6BQKBSK8EAJgkKhUCgAJQgKhUKh0FGCoFAoFApACYJCoVAodJQgKBQKhQJQgqBQKBQKHSUICoVCoQCUICgUCoVCRwmCQqFQKAAwhXoCAyEtLU3m5eWFehoKhUIRUWzbtq1aSpneX7+IEoS8vDy2bt0a6mkoFApFRCGEOBFIP7VkpFAoFApACYJCoVAodJQgKBQKhQKIMB+CQtEbHR0dlJaW4nQ6Qz0VhSJkWK1WcnNziYmJGdT5ShAUUUFpaSl2u528vDyEEKGejkIRdKSU1NTUUFpaSn5+/qDGUEtGiqjA6XSSmpqqxEAxahFCkJqaOiQrWQlCNHJ6O7jdoZ5F0FFioBjtDPX/gBKEaOP4evjDV2DHX0M9k1GH0WikqKjI+/Poo4/22vf1119n37593s8PPfQQ//znP4c8h/r6ep555pkBn/fII4/wxBNPBNR369at/Ou//uuArzHYOdx+++28+uqrAY9TUlLC3/72t+GcWg/a2tq44YYbmDRpEueddx4lJSV++73//vtMnTqVSZMmdfn3IKXkpz/9KVOmTOGcc87hySefBODll1+msLCQwsJCLrjgAnbu3Ok9Jy8vj5kzZ1JUVMScOXNG5HspH0K0se3Fs6/F3w7lTEYdsbGx7NixI6C+r7/+OldeeSUFBQUALF++fFjm4BGEe++9d1jG88ecOXNG7IY0HHgE4eabbx6xa7zwwgskJydz5MgRVq5cyX/8x3+watWqLn06Ozv5wQ9+wAcffEBubi5z587lqquuoqCggBdffJFTp05x4MABDAYDlZWVAOTn57Nu3TqSk5N57733uPvuu9m8ebN3zI8//pi0tLQR+17KQogmWmph/1sQlwFl26B8T6hnpAAeeOABCgoKKCws5Mc//jGff/45b775Jvfffz9FRUUcPXq0y1NwXl4eP/nJT5g/fz5z5szhyy+/ZMmSJUycOJHnnnsOgKamJi699FKKi4uZOXMmb7zxhvdaR48epaioiPvvvx+Axx9/nLlz51JYWMjDDz/sndevfvUrpk6dymWXXcbBgwf9zv2VV15hxowZzJo1i4ULFwLwySefcOWVVwJQVVXFokWLKC4u5p577mH8+PFUV1dTUlLCOeecw1133cX06dNZvHgxra2tADz//PPMnTuXWbNmce2119LS0tLv7/Cf//wnCxYsYMqUKbz99tuAdsO9//77vd/t97//vfd38Omnn1JUVMSKFSsoKSlhwYIFFBcXU1xczOeffz6wP6Af3njjDW677TYArrvuOj788EOklF36fPHFF0yaNIkJEyZgNpu58cYbvX+nZ599loceegiDQbsFZ2RkAHDBBReQnJwMwPnnn09paemQ5zoQlIUQTexaBZ3tcN0L8NdrYftLcMVjoZ5V0PnFW3vZd7phWMcsGJPAw9+Y3mef1tZWioqKvJ8ffPBBFi1axOrVqzlw4ABCCOrr60lKSuKqq67iyiuv5LrrrvM71tixY9m4cSM/+tGPuP322/nss89wOp1Mnz6d733ve1itVlavXk1CQgLV1dWcf/75XHXVVTz66KPs2bPHa6msXbuWw4cP88UXXyCl5KqrrmL9+vXExcWxcuVKtm/fjsvlori4mNmzZ/eYx/Lly1mzZg05OTnU19f3OP6LX/yCSy65hAcffJD333+fP/zhD95jhw8f5n//9395/vnnWbZsGf/4xz+49dZb+eY3v8ldd90FwM9+9jNeeOEF/uVf/qXP321JSQnr1q3j6NGjfPWrX+XIkSP85S9/ITExkS1bttDW1saFF17I4sWLefTRR3niiSe8wtHS0sIHH3yA1Wrl8OHD3HTTTX5L4CxYsIDGxsYe7U888QSXXXZZl7aysjLGjh0LgMlkIjExkZqami5P7759AHJzc71P+0ePHmXVqlWsXr2a9PR0nnzySSZPntzlGi+88AJXXHGF97MQgsWLFyOE4J577uHuu+/u83c2GJQgRBMH34XMGZC/ECYvhoPvjUpBCBX+loxcLhdWq5U777yTr3/9694n6/646qqr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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "beta = 0.0625\n", "x_n, error_n, history = projected_grad_solver(beta)\n", "print(\"Error(beta = {}) = {}\".format(beta,error(x_n)))\n", "plt.semilogx(T,x_n, label = \"Estimated signal,beta = {}\".format(beta))\n", "plt.semilogx(T,x_bar, label = \"Ground Truth\")\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "No handles with labels found to put in legend.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "min_objective = np.min(history[:,1])\n", "plt.semilogy(history[:,0],history[:,1]-min_objective)\n", "plt.title(\"Cost function evolution\")\n", "plt.xlabel(\"time\")\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## II-3 Sparsity prior" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another strategy for regularization is to enforce the sparsity of the sought signal. In that respect, one can use\n", "\\begin{equation}\n", "(\\forall \\mathbf{x} \\in \\mathbb{R}^N) \\quad g(\\mathbf{x}) = \\|\\mathbf{x}\\|_1.\n", "\\end{equation}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Function $g$ is convex, but it is not differentiable. The problem can be solved using the forward-backward algorithm." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "scrolled": true }, "outputs": [], "source": [ "cost = lambda x,b: 0.5*np.linalg.norm(H@x-y)**2 +b*np.sum(np.abs(x))\n", "\n", "def forward_backward(beta, verbose=False):\n", " prox_abs = lambda x,b: np.sign(x)*np.maximum(np.abs(x)-b,0)\n", "\n", " nu = max(np.abs(np.linalg.eigvals(H.T@H)))\n", " gamma = 1.99/nu\n", " delta = 2 - gamma*nu/2\n", " lambda_n = 0.9*delta\n", "\n", " tol = 3e-6\n", " x_0 = np.ones((N,1))\n", " x_n_new = x_0\n", " x_n = x_0\n", " n_iter = 0\n", " start = True\n", " \n", " history = []\n", " t_0 = time.time()\n", " history.append([time.time() - t_0, cost(x_n,beta)])\n", " \n", " while start or np.linalg.norm(x_n-x_n_new)/np.linalg.norm(x_n)> tol :\n", " start = False\n", " x_n = x_n_new\n", " y_n = x_n - gamma*(H.T@H@x_n - H.T@y)\n", " x_n_new = x_n + lambda_n*(prox_abs(y_n,gamma*beta)-x_n)\n", " history.append([time.time() - t_0, cost(x_n,beta)])\n", " n_iter += 1\n", " if n_iter % 40000 == 0 and verbose:\n", " print(\"Error and precision at iteration %d : %.4e %.4e\"%(n_iter, error(x_n_new),np.linalg.norm(x_n-x_n_new)/np.linalg.norm(x_n)))\n", " if n_iter==100000:\n", " break\n", " print('Beta %.4e error %.4e'%(beta,error(x_n_new)))\n", " return x_n, error(x_n_new), np.array(history) \n", "\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Beta 1.6000e-03 error 7.6332e-02\n", "Error(beta = 0.0016) = 0.07633186137841315\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEACAYAAACznAEdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsnXd8W+W9/9+PJGt7jziJnTiLTGc4CSGFhDLCKk1YDfMW7qWFDu5oX+VX6G2Bctv7ggs/6K8FSqG0UC4tq2W0ZaQQIIxsErJ3nMTO8JYtWZYt6fn9cY4UW5Zt2Zat4ef9evkl6ZznnPPIcc7nfOcjpJQoFAqFQmFI9AQUCoVCkRwoQVAoFAoFoARBoVAoFDpKEBQKhUIBKEFQKBQKhY4SBIVCoVAAShAUCoVCoaMEQaFQKBSAEgSFQqFQ6ChBUCgUCgUApkRPoD8UFBTIsrKyRE9DoVAoUorNmzfXSSkL+xqXUoJQVlbGpk2bEj0NhUKhSCmEEEdiGadcRgqFQqEAlCAoFAqFQkcJgkKhUCiAFIshKBQ90dHRQVVVFW1tbYmeikKRMKxWKyUlJWRkZAzoeCUIirSgqqqKzMxMysrKEEIkejoKxbAjpaS+vp6qqiomTJgwoHMol5EiLWhrayM/P1+JgWLEIoQgPz9/UFayEoR05PgWCAYTPYthR4mBYqQz2P8DShDSjcNr4Kkvw9b/TfRMRhxGo5G5c+eGfx544IEex77++uvs2rUr/Pmee+7hvffeG/QcmpqaeOKJJ/p93H333cfDDz8c09hNmzbxb//2b/2+xkDncMstt/Dqq6/GfJ7Kykr++Mc/xnNq3fD5fFx77bVMnjyZRYsWUVlZGXXcO++8w9SpU5k8eXKXv4fDhw+zaNEipkyZwrXXXkt7ezsAa9asoaKiApPJ1O07Hz16lIsuuojp06czY8aMHq85GJQgpBubn+36qhg2bDYbW7duDf/cddddPY6NFIT777+fCy+8cNBzGKgg9IcFCxbwy1/+ckivMRiGQxCeeeYZcnNzOXDgAN/73vf44Q9/2G1MIBDgu9/9Lm+//Ta7du3iT3/6U/jf/Ic//CHf+9732L9/P7m5uTzzzDMAjBs3jmeffZYbbrih2/m+/vWvc+edd7J79242bNhAUVFR3L+XEoR0orUBdv8VHEVQvRlO7kj0jBTAXXfdxYwZM5g9ezY/+MEP+Oyzz3jzzTe58847mTt3LgcPHuzyFFxWVsaPfvQjFi9ezIIFC/j888+5+OKLmTRpEk8++SQAbrebCy64gIqKCsrLy3njjTfC1zp48CBz587lzjvvBOChhx5i4cKFzJ49m3vvvTc8r5///OdMnTqVCy+8kL1790ad+yuvvMKsWbOYM2cOS5cuBeDDDz/k8ssvB6C2tpZly5ZRUVHB7bffzvjx46mrq6OyspLp06fzzW9+k5kzZ3LRRRfh9XoBePrpp1m4cCFz5szh6quvprW1tc/f4XvvvceSJUs444wz+Nvf/gZoN9w777wz/N1+85vfhH8HH3/8MXPnzuXRRx+lsrKSJUuWUFFRQUVFBZ999ln//gGj8MYbb3DzzTcDcM011/D+++8jpewyZsOGDUyePJmJEydiNpu57rrreOONN5BSsnr1aq655hoAbr75Zl5//XVA+7efPXs2BkPXW/OuXbvw+/0sW7YMAKfTid1uH/T3iERlGaUT216CQDtc8wz879Ww5Xm49MFEz2rY+elfd7LreHNczzljTBb3fnVmr2O8Xi9z584Nf7777rtZtmwZr732Gnv27EEIQVNTEzk5OSxfvpzLL788fFOIpLS0lLVr1/K9732PW265hU8//ZS2tjZmzpzJt771LaxWK6+99hpZWVnU1dVx1llnsXz5ch544AF27NjB1q1bAVi1ahX79+9nw4YNSClZvnw5a9asweFw8OKLL7Jlyxb8fj8VFRXMnz+/2zzuv/9+3n33XcaOHUtTU1O3/T/96U85//zzufvuu3nnnXd46qmnwvv279/Pn/70J55++mlWrlzJn//8Z2666SauuuoqvvnNbwLw4x//mGeeeYZ//dd/7fV3W1lZyUcffcTBgwc577zzOHDgAH/4wx/Izs5m48aN+Hw+zj77bC666CIeeOABHn744bBwtLa28o9//AOr1cr+/fu5/vrro7bAWbJkCS0tLd22P/zww92st+rqakpLSwEwmUxkZ2dTX19PQUFB1DEAJSUlrF+/nvr6enJycjCZTOHt1dXVvX7/ffv2kZOTw1VXXcXhw4e58MILeeCBBzAajb0e11+UIKQTe9+CUbNgwlKYchHsfXtECkKiCLmMOuP3+7FarXzjG9/gK1/5SvjJui+WL18OQHl5OW63m8zMTDIz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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "beta = 0.0016\n", "\n", "x_n, error_n, history = forward_backward(beta)\n", "print(\"Error(beta = {}) = {}\".format(beta,error(x_n)))\n", "plt.semilogx(T,x_n, label = \"Estimated signal,beta = {}\".format(beta))\n", "plt.semilogx(T,x_bar, label = \"Ground Truth\")\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "No handles with labels found to put in legend.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "min_objective = np.min(history[:,1])\n", "plt.semilogy(history[:,0],history[:,1]-min_objective)\n", "plt.title(\"Cost function evolution\")\n", "plt.xlabel(\"time\")\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## II-4 Sparsity in a transformed domain" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It can finally be useful to impose the sparsity of the signal in a transformed domain, in order to impose some regularity properties. For instance, it can be assumed \n", "that $\\mathbf{D} \\overline{\\mathbf{x}}$ is sparse:\n", "\\begin{equation}\n", "(\\forall \\mathbf{x} \\in \\mathbb{R}^N) \\quad g(\\mathbf{x}) = \\|\\mathbf{D} \\mathbf{x}\\|_1.\n", "\\end{equation}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Because of the presence of matrix $\\mathbf{D}$, the proximal step in the forward-backward algorithm is not explicit anymore.\n", "We propose two alternative solutions :\n", "\n", "* MM quadratic algorithm (considering a smoothed version of the $\\ell_1$ norm)\n", "* Primal-dual proximal algorithm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### a) MM algorithm" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "delta = 5e-3\n", "lbd = 1e-5\n", "\n", "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(D@x).sum()\n", "\n", "def grad_r(x):\n", " return np.dot(D.T,psi_prime(D@x))\n", "\n", "def f(x):\n", " q = H@x - y\n", " return 0.5 * q.T.dot(q) + lbd * r(x)\n", "\n", "def grad_f(x):\n", " return H.T@(H@x - y) + lbd * grad_r(x)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "# the diagonal matrix for the regularization function potential:\n", "def DD(x):\n", " x = D@x\n", " d = 1. / (delta ** 2 * np.sqrt(1 + (x/delta)**2))\n", " return scipy.sparse.diags(d[:,0]).tocsc()\n", "\n", "# 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 = DD(x_0)\n", " def linear_operator(x):\n", " return H.T.dot(H.dot(x)) + lbd * D.T.dot(D_x_0.dot(D@x))\n", " return LinearOperator((N,N), matvec=linear_operator, rmatvec=linear_operator)\n", "\n", "# we use the constructed functions to implement the following algorithm:\n", "def mm_quadratic(f, grad_f, majorant_curve_operator):\n", " x_0 = np.ones((N,1))\n", " theta = 1\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", " \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", " 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": [ "Converged in 2 iterations\n", "Error(lambda = 1e-05, delta = 0.005) = 0.17065419726453698\n" ] }, { "data": { "image/png": "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d7B161aH7XIEJRh9hMcXxXd9kMITWhnIkFGap1FwFJraFwxbGAwG9uzZwzfffMPatWt5/vnnHfrD9PDwAECn0zU/tjxvamriv//9L4WFhezbtw83Nzeio6NtpgBKKXnkkUe49957Wxx/9tlnHcoCefnll0lNTeXzzz8nMTGxjSC2t5jV2m69Xt88JbVq1So+/vhjEhISeOutt/juu+86tMNCe307es9sYflisfdePPPMMwwZMoSDBw9iMpnw9PS02c4ZHoa9z+qFF17g1VdfBWDTpk2Eh4dz9uzFRIzc3FyGDRsG0HwfGxvLT37yE/bv39+uYIDtbCB7trRHd7xXltcaHh5OU1MT5eXlBAUF2WxjwfJ+hISEUFZWRlNTEwaDocX7FBwc3Nx+9erVNmMjXUXFMAYKUmriYDD/wevdQei0Y5dIVVUV5eXlXH311Tz77LPNX7h+fn42/2kcpby8nMGDB+Pm5sa3337L6dOnbY67YMEC3njjDaqqqgDNfS8oKGD27Nls2LCB2tpaKisr+fTTT21eJzs7m6lTp/Lkk08SEhLS4h8TYObMmaxbtw7QfpWWlpZ2aHtlZSVhYWE0Njby3//+12ab559/nueff75TfdvDZDI1x4reffddZs6cSUBAAP7+/uzYsQOgxbjl5eWEhYWh0+n497//jdFotDnu9u3bWyQ8WG6Xkshg77N64IEHmscbNmwYixcv5p133kFKyQ8//IC/vz9hYWGUlpZSX18PQFFRETt37mTcuHGANj1q8QStmTFjBmvXrm3zuu3ZYk3rv7XueK8WL17M229r2wOtX7+eK664oo3ATZkyhczMTE6dOkVDQwNr165l8eLFCCG4/PLLmz/vt99+myVLtO2HrGM+GzduZOzYsTZt7QrKwxgomJpAGi8KhhBg8OhQMFrHMBYuXMgvf/lLlixZQl1dHVJKnnnmGQBWrFjB6tWree655zqVWnnLLbewaNEikpOTSUxMZMyYMYD2y2nGjBmMHz+eq666ir///e8cO3aM6dOnA1pK5H/+8x+SkpJYvnw5iYmJREVFMWvWLJvXefjhh8nMzERKydy5c0lISOD7779vPv/444+zcuVK3n//febMmUNYWBh+fn7NXzS2+NOf/sTUqVOJiopiwoQJNoXz+PHjzJgxo1N928PHx4f09HQmT56Mv78/77//PgBvvvkm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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x_n, history = mm_quadratic(f, grad_f, majorant_curve_operator)\n", "print(\"Error(lambda = {}, delta = {}) = {}\".format(lbd,delta,error(x_n)))\n", "plt.semilogx(T,x_n, label = \"Estimated signal,lambda = {}, delta = {}\".format(lbd,delta))\n", "plt.semilogx(T,x_bar, label = \"Ground Truth\")\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "No handles with labels found to put in legend.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "min_objective = np.min(history[:,1])\n", "plt.plot(history[:,0],history[:,1])\n", "plt.title(\"Cost function evolution\")\n", "plt.xlabel(\"time\")\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### b) Primal-dual algorithm" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "cost = lambda x,b: 0.5*np.linalg.norm(H@x-y)**2 +b*np.sum(np.abs(D@x))\n", "\n", "def primal_dual(beta, verbose=False):\n", " prox_abs = lambda x,b: np.sign(x)*np.maximum(np.abs(x)-b,0)\n", "\n", " nu = max(np.abs(np.linalg.eigvals(H.T@H)))\n", " gamma = 1\n", " tau = 1/nu\n", " \n", " tol = 3e-6\n", " x_0 = np.ones((N,1))\n", " x_n_new = x_0\n", " x_n = x_0\n", " y_n = D@x_0\n", " n_iter = 0\n", " start = True\n", " history = []\n", " t_0 = time.time()\n", " history.append([time.time() - t_0, cost(x_n,beta)])\n", " H_inv = np.linalg.inv(tau*H.T@H+np.eye(N))\n", " \n", " while start or np.linalg.norm(x_n-x_n_new)/np.linalg.norm(x_n)> tol :\n", " start = False\n", " x_n = x_n_new\n", " x_n_new = np.dot(H_inv,x_n -tau*D.T@y_n + tau*H.T@y)\n", " v_n = y_n + gamma*np.dot(D,2*x_n_new-x_n)\n", " y_n = v_n - gamma*(prox_abs(v_n/gamma,beta/gamma))\n", " history.append([time.time() - t_0, cost(x_n,beta)])\n", " n_iter += 1\n", " if n_iter % 1000 == 0 and verbose:\n", " print(\"Error and precision at iteration %d : %.4e %.4e\"%(n_iter, error(x_n_new),np.linalg.norm(x_n-x_n_new)/np.linalg.norm(x_n)))\n", " if n_iter==100000:\n", " break\n", " print('Beta %.4e error %.4e'%(beta,error(x_n_new)))\n", " return x_n, error(x_n_new), np.array(history) \n", "\n" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Error and precision at iteration 1000 : 4.5723e-01 2.9929e-04\n", "Error and precision at iteration 2000 : 3.6805e-01 1.3772e-04\n", "Error and precision at iteration 3000 : 3.2329e-01 8.7032e-05\n", "Error and precision at iteration 4000 : 2.9508e-01 6.8025e-05\n", "Error and precision at iteration 5000 : 2.7580e-01 5.6811e-05\n", "Error and precision at iteration 6000 : 2.6234e-01 4.8144e-05\n", "Error and precision at iteration 7000 : 2.5280e-01 3.9699e-05\n", "Error and precision at iteration 8000 : 2.4595e-01 3.3998e-05\n", "Error and precision at iteration 9000 : 2.4104e-01 2.9709e-05\n", "Error and precision at iteration 10000 : 2.3754e-01 2.6012e-05\n", "Error and precision at iteration 11000 : 2.3508e-01 2.3152e-05\n", "Error and precision at iteration 12000 : 2.3333e-01 2.0441e-05\n", "Error and precision at iteration 13000 : 2.3223e-01 1.8228e-05\n", "Error and precision at iteration 14000 : 2.3147e-01 1.6414e-05\n", "Error and precision at iteration 15000 : 2.3107e-01 1.4862e-05\n", "Error and precision at iteration 16000 : 2.3072e-01 1.3231e-05\n", "Error and precision at iteration 17000 : 2.3058e-01 1.2046e-05\n", "Error and precision at iteration 18000 : 2.3054e-01 1.1030e-05\n", "Error and precision at iteration 19000 : 2.3057e-01 1.0008e-05\n", "Error and precision at iteration 20000 : 2.3067e-01 9.3038e-06\n", "Error and precision at iteration 21000 : 2.3075e-01 8.6214e-06\n", "Error and precision at iteration 22000 : 2.3085e-01 7.9862e-06\n", "Error and precision at iteration 23000 : 2.3097e-01 7.5377e-06\n", "Error and precision at iteration 24000 : 2.3111e-01 7.0272e-06\n", "Error and precision at iteration 25000 : 2.3126e-01 6.5897e-06\n", "Error and precision at iteration 26000 : 2.3122e-01 6.2457e-06\n", "Error and precision at iteration 27000 : 2.3113e-01 6.0550e-06\n", "Error and precision at iteration 28000 : 2.3107e-01 5.8190e-06\n", "Error and precision at iteration 29000 : 2.3099e-01 5.5011e-06\n", "Error and precision at iteration 30000 : 2.3093e-01 5.4070e-06\n", "Error and precision at iteration 31000 : 2.3086e-01 5.1883e-06\n", "Error and precision at iteration 32000 : 2.3080e-01 4.8762e-06\n", "Error and precision at iteration 33000 : 2.3074e-01 4.7677e-06\n", "Error and precision at iteration 34000 : 2.3068e-01 4.6150e-06\n", "Error and precision at iteration 35000 : 2.3062e-01 4.4689e-06\n", "Error and precision at iteration 36000 : 2.3055e-01 4.4747e-06\n", "Error and precision at iteration 37000 : 2.3050e-01 4.2267e-06\n", "Error and precision at iteration 38000 : 2.3044e-01 4.2053e-06\n", "Error and precision at iteration 39000 : 2.3037e-01 4.1489e-06\n", "Error and precision at iteration 40000 : 2.3031e-01 4.0410e-06\n", "Error and precision at iteration 41000 : 2.3026e-01 4.0463e-06\n", "Error and precision at iteration 42000 : 2.3011e-01 3.9094e-06\n", "Error and precision at iteration 43000 : 2.2998e-01 3.8277e-06\n", "Error and precision at iteration 44000 : 2.2986e-01 3.6752e-06\n", "Error and precision at iteration 45000 : 2.2974e-01 3.5849e-06\n", "Error and precision at iteration 46000 : 2.2965e-01 3.5712e-06\n", "Error and precision at iteration 47000 : 2.2956e-01 3.4072e-06\n", "Error and precision at iteration 48000 : 2.2946e-01 3.4226e-06\n", "Error and precision at iteration 49000 : 2.2938e-01 3.3323e-06\n", "Error and precision at iteration 50000 : 2.2931e-01 3.3537e-06\n", "Error and precision at iteration 51000 : 2.2924e-01 3.2749e-06\n", "Error and precision at iteration 52000 : 2.2920e-01 3.2736e-06\n", "Error and precision at iteration 53000 : 2.2917e-01 3.2493e-06\n", "Error and precision at iteration 54000 : 2.2916e-01 3.2113e-06\n", "Error and precision at iteration 55000 : 2.2916e-01 3.1877e-06\n", "Error and precision at iteration 56000 : 2.2917e-01 3.1711e-06\n", "Error and precision at iteration 57000 : 2.2920e-01 3.1603e-06\n", "Error and precision at iteration 58000 : 2.2926e-01 3.0394e-06\n", "Error and precision at iteration 59000 : 2.2932e-01 3.0264e-06\n", "Beta 5.0000e-04 error 2.2932e-01\n", "Error(beta = 0.0005) = 0.2293195238416273\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "beta = 5e-4\n", "\n", "x_n, error_n, history = primal_dual(beta,verbose = 1)\n", "print(\"Error(beta = {}) = {}\".format(beta,error(x_n)))\n", "plt.semilogx(T,x_n, label = \"Estimated signal,beta = {}\".format(beta))\n", "plt.semilogx(T,x_bar, label = \"Ground Truth\")\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "No handles with labels found to put in legend.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "min_objective = np.min(history[:,1])\n", "plt.semilogy(history[:,0],history[:,1]-min_objective)\n", "plt.title(\"Cost function evolution\")\n", "plt.xlabel(\"time\")\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Bibliography\n", "\n", "* C. S. Johnson Jr. Diffusion ordered nuclear magnetic resonance spectroscopy: principles and applications. Progress in Nuclear Magnetic Resonance Spectroscopy, vol. 34, pp. 203–256, 1999.\n", "\n", "* A. Cherni, E. Chouzenoux and M.-A. Delsuc. PALMA, an Improved Algorithm for DOSY Signal Processing. Analyst, Vol. 142, No. 5, pages 772-779, 2016.\n", "\n", "* N. Komodakis and J.-C. Pesquet. Playing with Duality: An Overview of Recent Primal-Dual Approaches for Solving Large-Scale Optimization problems. IEEE Signal Processing Magazine, vol. 32, no. 6, pp. 31–54, Nov. 2014.\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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 }