{ "cells": [ { "cell_type": "markdown", "id": "9a515258", "metadata": {}, "source": [ "Basis Pursuit DeNoising (APGM)\n", "==============================\n", "\n", "This example demonstrates the solution of the the sparse coding problem\n", "\n", " $$\\mathrm{argmin}_{\\mathbf{x}} \\; (1/2) \\| \\mathbf{y} - D \\mathbf{x}\n", " \\|_2^2 + \\lambda \\| \\mathbf{x} \\|_1\\;,$$\n", "\n", "where $D$ the dictionary, $\\mathbf{y}$ the signal to be represented,\n", "and $\\mathbf{x}$ is the sparse representation." ] }, { "cell_type": "code", "execution_count": 1, "id": "46e9afac", "metadata": { "collapsed": false, "execution": { "iopub.execute_input": "2021-12-16T21:53:44.804160Z", "iopub.status.busy": "2021-12-16T21:53:44.803272Z", "iopub.status.idle": "2021-12-16T21:53:47.399774Z", "shell.execute_reply": "2021-12-16T21:53:47.398649Z" } }, "outputs": [], "source": [ "# This scico project Jupyter notebook has been automatically modified\n", "# to install the dependencies required for running it on Google Colab.\n", "# If you encounter any problems in running it, please open an issue at\n", "# https://github.com/lanl/scico-data/issues\n", "\n", "!pip install 'scico[examples] @ git+https://github.com/lanl/scico'\n", "\n", "import numpy as np\n", "\n", "import scico.numpy as snp\n", "from scico import functional, linop, loss, plot\n", "from scico.optimize.pgm import AcceleratedPGM\n", "from scico.util import device_info\n", "plot.config_notebook_plotting()" ] }, { "cell_type": "markdown", "id": "d4811c44", "metadata": {}, "source": [ "Construct a random dictionary, a reference random sparse\n", "representation, and a test signal consisting of the synthesis of the\n", "reference sparse representation." ] }, { "cell_type": "code", "execution_count": 2, "id": "09d25dd4", "metadata": { "collapsed": false, "execution": { "iopub.execute_input": "2021-12-16T21:53:47.407013Z", "iopub.status.busy": "2021-12-16T21:53:47.406537Z", "iopub.status.idle": "2021-12-16T21:53:49.436430Z", "shell.execute_reply": "2021-12-16T21:53:49.435063Z" } }, "outputs": [], "source": [ "m = 512 # Signal size\n", "n = 4 * m # Dictionary size\n", "s = 32 # Sparsity level (number of non-zeros)\n", "σ = 0.5 # Noise level\n", "\n", "np.random.seed(12345)\n", "D = np.random.randn(m, n).astype(np.float32)\n", "L0 = np.linalg.norm(D, 2) ** 2\n", "\n", "x_gt = np.zeros(n, dtype=np.float32) # true signal\n", "idx = np.random.permutation(list(range(0, n - 1)))\n", "x_gt[idx[0:s]] = np.random.randn(s)\n", "y = D @ x_gt + σ * np.random.randn(m) # synthetic signal\n", "\n", "x_gt = snp.array(x_gt) # convert to jax array\n", "y = snp.array(y) # convert to jax array" ] }, { "cell_type": "markdown", "id": "3ca055bd", "metadata": {}, "source": [ "Set up the forward operator and `AcceleratedPGM` solver object." ] }, { "cell_type": "code", "execution_count": 3, "id": "211e1c3a", "metadata": { "collapsed": false, "execution": { "iopub.execute_input": "2021-12-16T21:53:49.443362Z", "iopub.status.busy": "2021-12-16T21:53:49.442761Z", "iopub.status.idle": "2021-12-16T21:53:49.900380Z", "shell.execute_reply": "2021-12-16T21:53:49.901258Z" } }, "outputs": [], "source": [ "maxiter = 100\n", "λ = 2.98e1\n", "A = linop.MatrixOperator(D)\n", "f = loss.SquaredL2Loss(y=y, A=A)\n", "g = λ * functional.L1Norm()\n", "solver = AcceleratedPGM(\n", " f=f, g=g, L0=L0, x0=A.adj(y), maxiter=maxiter, itstat_options={\"display\": True, \"period\": 10}\n", ")" ] }, { "cell_type": "markdown", "id": "493ca9ed", "metadata": {}, "source": [ "Run the solver." ] }, { "cell_type": "code", "execution_count": 4, "id": "30c49e8b", "metadata": { "collapsed": false, "execution": { "iopub.execute_input": "2021-12-16T21:53:49.957466Z", "iopub.status.busy": "2021-12-16T21:53:49.947684Z", "iopub.status.idle": "2021-12-16T21:53:51.931612Z", "shell.execute_reply": "2021-12-16T21:53:51.931975Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Solving on GPU (NVIDIA GeForce RTX 2080 Ti)\n", "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iter Time Objective L Residual\n", "---------------------------------------------\n", " 0 9.71e-01 7.795e+09 4.611e+03 4.126e+03\n", " 1 1.80e+00 2.097e+09 4.611e+03 1.310e+03\r", " 2 1.80e+00 5.399e+08 4.611e+03 4.524e+02\r", " 3 1.81e+00 1.406e+08 4.611e+03 1.845e+02\r", " 4 1.81e+00 4.021e+07 4.611e+03 1.002e+02\r" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 5 1.81e+00 1.382e+07 4.611e+03 6.608e+01\r", " 6 1.81e+00 5.955e+06 4.611e+03 4.542e+01\r", " 7 1.81e+00 3.351e+06 4.611e+03 3.125e+01\r", " 8 1.82e+00 2.373e+06 4.611e+03 2.261e+01\r", " 9 1.82e+00 1.771e+06 4.611e+03 1.751e+01\r", " 10 1.82e+00 1.211e+06 4.611e+03 1.369e+01\n", " 11 1.82e+00 7.238e+05 4.611e+03 1.023e+01\r", " 12 1.82e+00 3.867e+05 4.611e+03 7.277e+00\r", " 13 1.83e+00 2.045e+05 4.611e+03 5.249e+00\r", " 14 1.83e+00 1.251e+05 4.611e+03 4.212e+00\r", " 15 1.83e+00 9.184e+04 4.611e+03 3.683e+00\r", " 16 1.83e+00 7.175e+04 4.611e+03 3.203e+00\r", " 17 1.83e+00 5.452e+04 4.611e+03 2.665e+00\r", " 18 1.84e+00 4.005e+04 4.611e+03 2.153e+00\r", " 19 1.84e+00 2.904e+04 4.611e+03 1.756e+00\r", " 20 1.84e+00 2.102e+04 4.611e+03 1.476e+00\n", " 21 1.84e+00 1.503e+04 4.611e+03 1.254e+00\r", " 22 1.85e+00 1.064e+04 4.611e+03 1.066e+00\r", " 23 1.85e+00 7.613e+03 4.611e+03 9.034e-01\r", " 24 1.85e+00 5.804e+03 4.611e+03 7.621e-01\r", " 25 1.85e+00 4.800e+03 4.611e+03 6.525e-01\r", " 26 1.86e+00 4.155e+03 4.611e+03 5.744e-01\r", " 27 1.86e+00 3.596e+03 4.611e+03 5.036e-01\r", " 28 1.86e+00 3.034e+03 4.611e+03 4.274e-01\r", " 29 1.87e+00 2.518e+03 4.611e+03 3.595e-01\r", " 30 1.87e+00 2.126e+03 4.611e+03 3.078e-01\n", " 31 1.87e+00 1.849e+03 4.611e+03 2.687e-01\r", " 32 1.87e+00 1.642e+03 4.611e+03 2.391e-01\r", " 33 1.88e+00 1.466e+03 4.611e+03 2.222e-01\r", " 34 1.88e+00 1.312e+03 4.611e+03 2.004e-01\r", " 35 1.88e+00 1.186e+03 4.611e+03 1.782e-01\r", " 36 1.88e+00 1.083e+03 4.611e+03 1.549e-01\r", " 37 1.88e+00 1.006e+03 4.611e+03 1.361e-01\r", " 38 1.89e+00 9.468e+02 4.611e+03 1.197e-01\r", " 39 1.89e+00 9.051e+02 4.611e+03 1.049e-01\r", " 40 1.89e+00 8.819e+02 4.611e+03 9.747e-02\n", " 41 1.89e+00 8.693e+02 4.611e+03 8.916e-02\r", " 42 1.90e+00 8.638e+02 4.611e+03 8.379e-02\r", " 43 1.90e+00 8.617e+02 4.611e+03 7.405e-02\r", " 44 1.90e+00 8.629e+02 4.611e+03 6.725e-02\r", " 45 1.90e+00 8.617e+02 4.611e+03 5.961e-02\r", " 46 1.90e+00 8.588e+02 4.611e+03 5.390e-02\r", " 47 1.91e+00 8.519e+02 4.611e+03 4.903e-02\r", " 48 1.91e+00 8.442e+02 4.611e+03 4.319e-02\r", " 49 1.91e+00 8.367e+02 4.611e+03 3.636e-02\r", " 50 1.91e+00 8.306e+02 4.611e+03 2.501e-02\n", " 51 1.92e+00 8.270e+02 4.611e+03 2.013e-02\r", " 52 1.92e+00 8.251e+02 4.611e+03 1.787e-02\r", " 53 1.92e+00 8.243e+02 4.611e+03 1.639e-02\r", " 54 1.92e+00 8.244e+02 4.611e+03 1.716e-02\r", " 55 1.93e+00 8.246e+02 4.611e+03 1.604e-02\r", " 56 1.93e+00 8.249e+02 4.611e+03 1.536e-02\r", " 57 1.93e+00 8.249e+02 4.611e+03 1.426e-02\r", " 58 1.93e+00 8.247e+02 4.611e+03 1.538e-02\r", " 59 1.93e+00 8.244e+02 4.611e+03 1.266e-02\r", " 60 1.94e+00 8.240e+02 4.611e+03 1.229e-02\n", " 61 1.94e+00 8.234e+02 4.611e+03 1.125e-02\r", " 62 1.94e+00 8.228e+02 4.611e+03 1.075e-02\r", " 63 1.94e+00 8.221e+02 4.611e+03 9.987e-03\r", " 64 1.95e+00 8.215e+02 4.611e+03 9.180e-03\r", " 65 1.95e+00 8.210e+02 4.611e+03 1.101e-02\r", " 66 1.95e+00 8.206e+02 4.611e+03 7.595e-03\r", " 67 1.95e+00 8.203e+02 4.611e+03 8.156e-03\r", " 68 1.95e+00 8.202e+02 4.611e+03 6.299e-03\r", " 69 1.96e+00 8.201e+02 4.611e+03 7.833e-03\r", " 70 1.96e+00 8.201e+02 4.611e+03 6.280e-03\n", " 71 1.96e+00 8.201e+02 4.611e+03 7.016e-03\r", " 72 1.96e+00 8.201e+02 4.611e+03 5.411e-03\r", " 73 1.96e+00 8.201e+02 4.611e+03 4.842e-03\r", " 74 1.97e+00 8.200e+02 4.611e+03 4.669e-03\r", " 75 1.97e+00 8.200e+02 4.611e+03 4.320e-03\r", " 76 1.97e+00 8.200e+02 4.611e+03 4.308e-03\r", " 77 1.97e+00 8.199e+02 4.611e+03 3.889e-03\r", " 78 1.98e+00 8.198e+02 4.611e+03 3.467e-03\r", " 79 1.98e+00 8.197e+02 4.611e+03 3.102e-03\r", " 80 1.98e+00 8.197e+02 4.611e+03 2.978e-03\n", " 81 1.98e+00 8.196e+02 4.611e+03 2.504e-03\r", " 82 1.99e+00 8.196e+02 4.611e+03 2.324e-03\r", " 83 1.99e+00 8.196e+02 4.611e+03 2.238e-03\r", " 84 1.99e+00 8.196e+02 4.611e+03 2.207e-03\r", " 85 1.99e+00 8.196e+02 4.611e+03 2.227e-03\r", " 86 1.99e+00 8.196e+02 4.611e+03 2.541e-03\r", " 87 2.00e+00 8.196e+02 4.611e+03 2.320e-03\r", " 88 2.00e+00 8.196e+02 4.611e+03 2.407e-03\r", " 89 2.00e+00 8.196e+02 4.611e+03 2.051e-03\r", " 90 2.00e+00 8.195e+02 4.611e+03 1.815e-03\n", " 91 2.00e+00 8.195e+02 4.611e+03 1.688e-03\r", " 92 2.01e+00 8.195e+02 4.611e+03 1.948e-03\r", " 93 2.01e+00 8.195e+02 4.611e+03 1.494e-03\r", " 94 2.01e+00 8.195e+02 4.611e+03 1.362e-03\r" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 95 2.01e+00 8.195e+02 4.611e+03 1.294e-03\r", " 96 2.02e+00 8.195e+02 4.611e+03 1.317e-03\r", " 97 2.02e+00 8.195e+02 4.611e+03 1.384e-03\r", " 98 2.02e+00 8.195e+02 4.611e+03 1.132e-03\r", " 99 2.02e+00 8.195e+02 4.611e+03 1.059e-03\r\n" ] } ], "source": [ "print(f\"Solving on {device_info()}\\n\")\n", "x = solver.solve()\n", "hist = solver.itstat_object.history(transpose=True)" ] }, { "cell_type": "markdown", "id": "901e3dcd", "metadata": {}, "source": [ "Plot the recovered coefficients and convergence statistics." ] }, { "cell_type": "code", "execution_count": 5, "id": "e942c39d", "metadata": { "collapsed": false, "execution": { "iopub.execute_input": "2021-12-16T21:53:51.955842Z", "iopub.status.busy": "2021-12-16T21:53:51.951901Z", "iopub.status.idle": "2021-12-16T21:53:52.715080Z", "shell.execute_reply": "2021-12-16T21:53:52.716233Z" } }, "outputs": [ { "data": { "image/png": "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/foxb948AO69914efvjhwnV06dKFlStXsnLlSjp27MhVV11F586dGTx4MHv27AFg1qxZdO/enf79+zNmzJgjjnngwIHcddddnHDCCTz++ONcdtllvP3224XvV69eHYA77riDb775hrS0NP71r38BsGbNGoYMGULbtm25/fbby3nUwkpJ1wGdc26Tc+5a51xr59w/AhN3Oecud879rrSb4pxzzzrn0p1z6fXrl32U6KlLN/LZ/HVlXk5EQm/SpEmkpKRw+eWXAxAfH8+//vUvXnzxRXbv3s2qVasYMmQI7du357777itcbn8ZC/DQQw/Ru3dvunXrxujRowunv/rqq3Tr1o3u3btz8cUX89133/Hhhx9y2223kZaWxvLlywvL7k8//ZQLLrigcNmvv/6aM888E4CJEyfSv39/evbsyfnnn8/OnRXP5SqcBDvn1jrnZgee7wAW4tVIhKXjH/yKkx6Z7HcYImFnwYIF9OzZ85DzTJs2jVdeeYVJkyYxevRoevTowbx58/j73//OJZdccthtLF26lOuuu44FCxZQu3Zt3nnnHQAuv/xynnjiCaZNm1bmuLdu3crkyZO59dZbS53ngQce4PjjjyczM5Obb74ZgMzMTN58801++OEH3nzzTVatWlXq8hEiC2ha5HUTYI1PsfDsNyt4ZOJivzYvImWwYMECevXqdcC0mjVr0qxZM/Ly8vj+++957bXXyMzM5K233jpoGPWJEyeydOlSvv/+ezIzM5k1axZTpkxhwYIF3H///UyaNIm5c+fy+OOPc8wxxxxwRa9169aF6xk0aBDTp09n165dALz55puMGDGCjRs38re//Y0vvviC2bNnk56ezqOPPlrh/Q5qF2lm1gLoAcwI5npFYs19Hy3gxzXbg7rOTo1qMvrMzkc8/3XXXcfUqVNJSkpi5syZgFdApaamAjB16tTCJPakk05i06ZNbNu27ZDr3N+WF6BXr16sXLmSbdu2sXXrVk444QQALr74Yj799NMjjnPEiBFHPG9RJ598MrVq1QKgU6dO/PzzzzRt2vQwS4W1mUBbM2sJrAZGAqP8CqZ/q7r887NFZO/YR/0ayX6FIRJR/Cr7nXMl3lS2f/qgQYOoW7cuAOeeey5Tp04lPT29cL6JEycyceJEevToAcDOnTtZunQpc+fOZfjw4dSrVw+g8PujNAkJCQwZMoSPPvqI4cOH88knn/Dggw8yefJkfvzxR4499lgAcnJy6N+//5EfhNK2V+E1BJhZdeAd4A/OuYM+QTO7GrgaoFmzZsHarIgESefOnQuTWoAxY8awcePGAwq6atWqFT53zh20DjMjISGBgoKCwmlFu6tJTv41GYqPj2fPnj2lFr5HqmhMRbftnCMnJ6fU5YrHEup2zhVhZmOBgUA9M8sCRjvnXjCz64EJQDzwonNugV8xHtPa+8KctmITZ3Vv5FcYInIEipf/ANu3b2fVqlXEx8cfVEYXf+2c48477+Saa645YPoTTzxR5vJ9xIgRjBkzhtTUVHr37k2NGjVwzjFo0CDGjh1bpnUdTlCSYDNLxEuAX3POvVvSPM65Z4FnAdLT0w/+9hSRQmWpsQ2Wk046ibvuuounn36a3/3udwDs3r271PkHDBjAa6+9xp///Ge+/vpr6tWrR82aNWnRogUff/wxALNnz+ann3465HZr165NrVq1mDp1KscddxyvvVb+cRtatGjBrFmzuOCCC/jggw/Izc0FoEaNGuzYsaPc6w03zrkLS5k+Hhgf4nBK1LlRTWokJzBtuZJgkSPlR9kP3pWxO+64g1dffZVLLrmE/Px8br31Vi677DKqVq3K559/zubNm6lSpQrvv/8+L7744gHLn3rqqfz5z3/moosuonr16qxevZrExEROPvlkzjnnHG6++Wbq1q3L5s2bSU1NPWSZPHDgQK644gqee+65wit9/fr147rrrmPZsmW0adOG3bt3k5WVRbt27Sq038HoHcKAF4CFzrmKN9CoZP9IeI4xiY/5HYZI2DEz3n//fSZPnkzLli3p06cPl156Kf/85z9LnP/ee+8lIyODbt26cccdd/DKK68AcN5557F582bS0tJ4+umnj6iQeumll7juuuvo378/VapUKfc+XHXVVUyePJk+ffowY8aMwlribt26kZCQQPfu3QtvjJPKlRAfR5+WqUxfscnvUETkMMyM9957j7feeou2bdvSrl07UlJS+Pvf/w7Acccdx8UXX0xaWhrnnXde4RXC/bW8gwcPZtSoUfTv35+uXbsyfPhwduzYQefOnbn77rs54YQT6N69O7fccgsAI0eO5KGHHqJHjx4sX778gFji4+MZOnQon376KUOHDgWgfv36vPzyy1x44YWFN2MvWrSo4vtd0iXNMq3A7DjgG+AHYP810LsCNRIlSk9Pd8UbVYfMvbUC/x+67aJIqC1cuJCOHTv6HYYUUdJnYmaznHPppSwSlcpbZj//zQr+9slCpt15Eg1rlf/HjUg0i9Syf9OmTfTs2ZOff/7Z71AOUJZyu8LNIZxzUym5ax4REYlh/fe3C16+iXN7NjnM3CISKdasWcPAgQP5v//7P79DqZCg9g4hIiKyX8eja1K7aqKSYJEo06hRI5YsWeJ3GBWm4TJFRKRSxMUZ/VrWZZraBYtIGFISLCIilaZ/67pkbdnDqs2l9zQiIuIHJcEiIlJpjinSLlhEJJwoCRYRkUrTpkF16lVPVpMIEQk7SoJFpFB8fDxpaWl06dKFM888k61bt/odUpnde++9PPzww36HIQFmRt+WqcxYsanEUQZFxH/BKPszMjK48cYbS3yvRYsWbNy4sVyxVWaZriRYRApVqVKFzMxM5s+fT2pqKmPGjPE7JMAbkrPoUMwSWfq2SmXNtr1kbdnjdygiUoJglP3p6ek88cQTlRBd5VESLCIl6t+/P6tXrwZg+fLlDBkyhF69enH88ccXjtSzfv16zjnnHLp370737t357rvvAHj00Ufp0qULXbp04bHHHgPgj3/8I0899VTh+u+9914eeeQRAB566CF69+5Nt27dGD16NAArV66kY8eO/P73v6dnz56sWrWqxPkA7r//ftq3b88pp5zC4sWLK/3YSNn0bem1C9bocSLh70jK/rfeeosuXbrQvXt3BgwYAMDXX39dOMLbpk2bGDx4MD169OCaa64pvAq0cuVKunTpUrithx9+mHvvvReA5557jt69e9O9e3fOO+88du+u/JtplQSLyEHy8/P58ssvOeusswC4+uqr+fe//82sWbN4+OGH+f3vfw/AjTfeyAknnMDcuXOZPXs2nTt3ZtasWbz00kvMmDGD6dOn89xzzzFnzhxGjhzJm2++WbiNcePGcf755zNx4kSWLl3K999/T2ZmJrNmzWLKlCkALF68mEsuuYQ5c+awePHiEuebNWsWb7zxBnPmzOHdd99l5syZoT9gckhtG1QntVoS01ds9jsUETmEIy37//KXvzBhwgTmzp3Lhx9+eNB67rvvPo477jjmzJnDWWedxS+//HLYbZ977rnMnDmTuXPn0rFjR1544YXg7lwJNFiGSDj69A5Y90Nw13l0VzjtgUPOsmfPHtLS0li5ciW9evVi0KBB7Ny5k++++47zzz+/cL59+/YBMGnSJF599VXAa1NWq1Ytpk6dyjnnnEO1atUAr2D75ptvuPHGG9mwYQNr1qwhOzubOnXq0KxZM5544gkmTpxIjx49ANi5cydLly6lWbNmNG/enH79+gEwceLEEufbsWMH55xzDlWrVgUoLLwlfMTFGX1apDLjJ9UEixxShJT9xx57LJdddhkXXHAB55577kHrmzJlCu+++y4AZ5xxBnXq1DlsmPPnz+dPf/oTW7duZefOnZx66qll2ctyURIsIoX2twvbtm0bQ4cOZcyYMVx22WXUrl2bzMzMI1rHoW5+Gj58OG+//Tbr1q1j5MiRhfPfeeedXHPNNQfMu3LlysJE+lDzPfbYY5hp5PZw17dVKp8tWMfqrXtoXLuK3+GISBFlLfufeeYZZsyYwSeffEJaWlqJ85RULickJBxwf8fevXsLn1922WW8//77dO/enZdffpmvv/46GLt2aM65kD969erlfDO6pvcQCTM//vij3yG4atWqFT6fPXu2a9q0qcvJyXH9+/d348aNc845V1BQ4DIzM51zzo0YMcL961//cs45l5eX57Zt2+ZmzZrlunbt6nbt2uV27tzpOnfu7GbPnu2cc27+/Pmuf//+rm3btm7NmjXOOecmTJjg+vTp43bs2OGccy4rK8utX7/e/fTTT65z586F8ZQ23/7t7d69223fvt21adPGPfTQQ0E5HiV9JkCG86Hc9PMRjDJ7weptrvkfP3bvzFpV4XWJRJNILPuXLVtWOH9aWpqbM2eO++qrr9wZZ5zhnHPuhhtucH/961+dc86NHz/eAS47O9vl5OS4unXruo0bN7q9e/e6vn37utGjRzvnnKtbt65bv369y8nJcaeccoq79NJLnXPOjR49ukxlelnKbbUJFpES9ejRg+7du/PGG2/w2muv8cILL9C9e3c6d+7MBx98AMDjjz/OV199RdeuXenVqxcLFiygZ8+eXHbZZfTp04e+ffty5ZVXFjZh6Ny5Mzt27KBx48Y0bNgQgMGDBzNq1Cj69+9P165dGT58ODt27DgontLm69mzJyNGjCAtLY3zzjuP448/PnQHSY5Yh6NrUKtKom6OEwlzR1L233bbbXTt2pUuXbowYMAAunfvfsA6Ro8ezZQpU+jZsycTJ06kWbNmACQmJnLPPffQ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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plot.subplots(nrows=1, ncols=2, figsize=(12, 5))\n", "plot.plot(\n", " np.vstack((x_gt, x)).T,\n", " title=\"Coefficients\",\n", " lgnd=(\"Ground Truth\", \"Recovered\"),\n", " fig=fig,\n", " ax=ax[0],\n", ")\n", "plot.plot(\n", " np.vstack((hist.Objective, hist.Residual)).T,\n", " ptyp=\"semilogy\",\n", " title=\"Convergence\",\n", " xlbl=\"Iteration\",\n", " lgnd=(\"Objective\", \"Residual\"),\n", " fig=fig,\n", " ax=ax[1],\n", ")\n", "fig.show()" ] } ], "metadata": { "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.8.12" } }, "nbformat": 4, "nbformat_minor": 5 }