{ "cells": [ { "cell_type": "markdown", "id": "532b911b", "metadata": {}, "source": [ "# Sparsity with MirrorCBO\n", "## Imports\n", "We need numpy and the CBXPy package. \n", "\n", "- `MirrorCBO` is the main class for the Mirror CBO algorithm.\n", "- `ElasticNet` is a specific mirror map that we will use in this example.\n", "- `scheduler` is used to adjust parameters during optimization." ] }, { "cell_type": "code", "execution_count": 1, "id": "ea0958f9", "metadata": {}, "outputs": [], "source": [ "from cbx.dynamics.mirrorcbo import MirrorCBO, ElasticNet\n", "from cbx.scheduler import multiply\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "id": "7a28bd80", "metadata": {}, "source": [ "## Create a synthetic optimization problem\n", "\n", "We consider sparse signal recovery. We create a random matrix A and a sparse vector x0, and we observe b = A x0 + noise. The goal is to recover x0 from A and b. The loss function is the least squares loss.\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "bb61e608", "metadata": {}, "outputs": [], "source": [ "dim = 30\n", "num_signals = 3\n", "sigma = 0.01\n", "A = np.random.randn(dim, dim)\n", "x_true = np.zeros(dim)\n", "idx = np.random.permutation(dim)[:num_signals]\n", "x_true[idx] = np.random.randn(num_signals)\n", "meas = A @ x_true + sigma * np.random.randn(dim)\n", "\n", "def loss(x):\n", " return 0.5 * np.linalg.norm(x @ A.T - meas, axis=-1)**2" ] }, { "cell_type": "markdown", "id": "3c890345", "metadata": {}, "source": [ "## Run the Mirror CBO algorithm\n", "\n", "We create an instance of the `MirrorCBO` class with the specified parameters, including the mirror map, noise type, and time step. We then call the `optimize` method to run the optimization process. We use a scheduler to adjust parameters during optimization.\n", "\n", "Note: CBO performance is sensitive. Finetuning for different problems might be necessary." ] }, { "cell_type": "code", "execution_count": 10, "id": "f7789f82", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "....................\n", "Starting Optimization with dynamic: MirrorCBO\n", "....................\n", "Time: 1.000, best current energy: [7.13625709]\n", "Number of function evaluations: [2100]\n", "Time: 2.000, best current energy: [0.00419865]\n", "Number of function evaluations: [4100]\n", "Time: 3.000, best current energy: [0.00219423]\n", "Number of function evaluations: [6100]\n", "Time: 4.000, best current energy: [0.00219431]\n", "Number of function evaluations: [8100]\n", "Time: 5.000, best current energy: [0.0021943]\n", "Number of function evaluations: [10100]\n", "--------------------\n", "Finished solver.\n", "Best energy: [0.00219412]\n", "--------------------\n" ] } ], "source": [ "dyn = MirrorCBO(loss, N= 100, d = dim, mirrormap=ElasticNet(1.9),\n", " noise = 'anisotropic', sigma = 2.,\n", " dt = 0.05,\n", " max_it=100)\n", "sched = multiply(factor = 1.4)\n", "dyn.optimize(sched=sched, print_int = 20)\n", "x = dyn.best_particle[0,:]" ] }, { "cell_type": "markdown", "id": "015d1be6", "metadata": {}, "source": [ "## Plot results" ] }, { "cell_type": "code", "execution_count": 11, "id": "43a8cbc8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiIAAAGdCAYAAAAvwBgXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB0tUlEQVR4nO29eZgU1fn+fVd3z87MsA0My7DvqyyCgAsoZlCCMYliDCqo0agYf4pLwKi4Y1wS15DERMRvNGgUjREFFUVfWQSBEWRT1kEYdph96+56/zicru6Z7pleqqqruu/PdfU1Mz1VfU5XV5+6636e8xxFVVUVhBBCCCFxwBHvDhBCCCEkeaEQIYQQQkjcoBAhhBBCSNygECGEEEJI3KAQIYQQQkjcoBAhhBBCSNygECGEEEJI3KAQIYQQQkjccMW7A03h9Xpx8OBBZGdnQ1GUeHeHEEIIIWGgqirKy8vRsWNHOBxNex6WFiIHDx5EQUFBvLtBCCGEkCjYv38/Onfu3OQ2lhYi2dnZAMQbycnJiXNvCCGEEBIOZWVlKCgo8F3Hm8LSQkSGY3JycihECCGEEJsRTloFk1UJIYQQEjcoRAghhBASNyhECCGEEBI3LJ0jEg6qqsLtdsPj8cS7K4TohtPphMvl4rR1QkjCY2shUldXh5KSElRVVcW7K4ToTmZmJjp06IDU1NR4d4UQQgzDtkLE6/Viz549cDqd6NixI1JTU3n3SBICVVVRV1eHo0ePYs+ePejdu3ezBYEIIcSu2FaI1NXVwev1oqCgAJmZmfHuDiG6kpGRgZSUFOzbtw91dXVIT0+Pd5cIIcQQbH+bxTtFkqjw3CaEJAMc6QghhBASNyhECCGEEBI3KEQIIYQQEjcoROLAjBkzoCgKbrrppkb/mzlzJhRFwYwZM8zvWAKhKAree++9eHeDEEJIM1CIxImCggIsWrQI1dXVvudqamrwxhtvoEuXLnHsWfPU1dXFuwuEECM4cQLYtAnweuPdE5JEmCZEnnjiCSiKgttvv93Yhtzu+DwiZPjw4SgoKMDixYt9zy1evBhdunTBsGHDfM95vV7MmzcP3bt3R0ZGBoYOHYq3337b93+Px4Prr7/e9/++ffviueeeC2hrxYoVGDVqFLKystCyZUuMGzcO+/btAyDcmUsvvTRg+9tvvx3jx4/3/T1+/HjceuutuP3229G2bVsUFhYCAL777jtcdNFFaNGiBdq3b4+rr74ax44dC9jvd7/7HW6//Xa0atUK7du3x8svv4zKykpce+21yM7ORq9evfDRRx8FtB/O6952222455570Lp1a+Tn5+PBBx/0/b9bt24AgJ///OdQFMX397fffosJEyYgOzsbOTk5GDFiBL755ptmPilCkog1a8SjuDjePSFJhCl1RNatW4e//e1vGDJkiLENud3AK68Y20YorrsOcEV2OK+77josWLAA06ZNAwC88soruPbaa7FixQrfNvPmzcO//vUv/PWvf0Xv3r3x5Zdf4qqrrkJeXh7OO+88eL1edO7cGf/5z3/Qpk0brFq1CjfeeCM6dOiAqVOnwu1249JLL8UNN9yAf//736irq8PatWsjLv62cOFC3HzzzVi5ciUA4NSpUzj//PPxm9/8Bn/+859RXV2N3//+95g6dSo+++yzgP3uuecerF27Fm+++SZuvvlmvPvuu/j5z3+Oe++9F3/+859x9dVXo7i4GJmZmRG97qxZs/D1119j9erVmDFjBsaNG4cLL7wQ69atQ7t27bBgwQJMmjQJTqcTADBt2jQMGzYM8+fPh9PpRFFREVJSUiI6DoQkNLJKdVlZfPtBkgrDhUhFRQWmTZuGl19+GY8++qjRzdmKq666CnPmzPG5EytXrsSiRYt8QqS2thaPP/44Pv30U4wZMwYA0KNHD3z11Vf429/+hvPOOw8pKSl46KGHfK/ZvXt3rF69Gm+99RamTp2KsrIylJaW4qc//Sl69uwJAOjfv3/Efe3duzeefPJJ39+PPvoohg0bhscff9z33CuvvIKCggJ8//336NOnDwBg6NChuO+++wAAc+bMwRNPPIG2bdvihhtuAAA88MADmD9/PjZt2oSzzjoLL774YlivO2TIEMydO9fXtxdffBHLly/HhRdeiLy8PABAy5YtkZ+f73ud4uJi3H333ejXr59vP0KIH/X14ieXzSAmYrgQmTlzJiZPnoyJEyc2K0Rqa2tRW1vr+7ssUlXucglnIh5E6IYAQF5eHiZPnoxXX30Vqqpi8uTJaNu2re//O3fuRFVVFS688MKA/erq6gLCNy+99BJeeeUVFBcXo7q6GnV1dTjjjDMAAK1bt8aMGTNQWFiICy+8EBMnTsTUqVPRoUOHiPo6YsSIgL+//fZbfP7552jRokWjbXft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MnVE8vLyAmbbAEBRUZHv9wEDBiAtLQ3FxcXo1atXwKOpY+hyuTBx4kQ8+eST2LRpE/bu3YvPPvus0XZ9+/aF2+3Gxo0bfc/t3LkTJ0+ejOh9rFy5EmPHjsUtt9yCYcOGoVevXti1a1dEr0EI0ZmmQjMOhxAjAMMzxDAMd0T69u2LoqIilJaW4u2338b06dPxxRdfBBUjc+bMwaxZs3x/l5WVRSRGVFWFWl0dWQe7TUTVtatw8x/nI085hcemXYC07qcrq0YwZU3JyIBikG15/vnn46mnnsJrr72GMWPG4F//+he+++47X9glOzsbd911F+644w54vV6cffbZKC0txcqVK5GTk4Pp06c3es0PPvgAu3fvxrnnnotWrVrhww8/hNfrRd++fRtt269fP0ycOBE33ngj5s+fj5SUFNx5553IiPA99+7dG6+99hqWLVuG7t274//+7/+wbt06dO/ePfqDQwiJjaZCM4AIz1RVCSGSl2dev0jSYLgQSU1NRa9evQAAI0aMwLp16/Dcc8/hb3/7W6Nt09LSQoYSwkGtrsaO4SOi2vfe0z/3vve/qPbvu2E9FINsy8LCQtx///245557UFNTg+uuuw7XXHMNNm/e7NvmkUceQV5eHubNm4fdu3ejZcuWGD58OO69996gr9myZUssXrwYDz74IGpqatC7d2/8+9//Dpm789prr+H666/Hueeei/z8fMybNw9btmxBenp62O/jt7/9LTZu3IgrrrgCiqLgyiuvxC233GKdmVSEJCPhCJGjR1lLhBiGojZMPjCY888/H126dMGrr77a7LZlZWXIzc1FaWkpcnJyAv5XU1ODPXv2oHv37r6LobeqKmohEit9N6yHI4nipz/++CMKCgrw6aef4oILLoh3dxKSYOc4Ibqzfr14DBgAnH124/+vXAls2QKccQYwapTp3SP2pKnrd0MMdUTmzJmDiy66CF26dEF5eTneeOMNrFixAsuWLTOkPSUjA303rDfktcNpO5H57LPPUFFRgcGDB6OkpAT33HMPunXr1mTtEUKIDWgqRwRgdVWrU1srHs1c7K2MoULkyJEjuOaaa1BSUoLc3FwMGTIEy5Yti6hGRiQoimJYeCTZqa+vx7333ovdu3cjOzsbY8eOxeuvv95olgwhxGaEE5oBmKxqVZYsAU6cAKZN0xKLbYahQuSf//ynkS9P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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "s = np.linspace(0,1, dim)\n", "plt.stem(s, x, '-o', label='CBO reconstruction')\n", "plt.stem(s, x_true, '-o', label='True signal')\n", "plt.plot(s, meas, color='r', alpha=0.4, label='Measurements')\n", "plt.legend()" ] } ], "metadata": { "kernelspec": { "display_name": "cbxpy", "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.12.4" } }, "nbformat": 4, "nbformat_minor": 5 }