{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Supervised Learning with a Parameterized Quantum Circuit \n", "\n", "Note: Recall that supervised learning, a branch of Machine Learning is meant to learning a function that maps an input to an output based on example input-output pairs (data).\n", "\n", "\n", "Within the course, you have seen the following diagram representing a typical Quantum Machine Learning situation with classical data :\n", "\n", "
\n", " \"qml\"\n", "
Source: https://dkopczyk.quantee.co.uk/wp-content/uploads/2018/11/outline-768x346.png
\n", "
\n", "\n", "The quantum circuit is defined by an quantum operator \"data preparation\" (i.e., the feature map), followed by a operator dependent on real parameters to tweak by classical optimization. We will introduce an example of such situation, showing and explaining each step of the processus." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from scipy.optimize import minimize\n", "\n", "import cirq\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import mean_squared_error, accuracy_score\n", "\n", "%matplotlib notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## I. Get Data\n", "\n", "We will generate a random 2D binary classification dataset (points with 1/0 labels inside a given radius) given the following functions." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Set a random seed\n", "np.random.seed(42)\n", "\n", "# Make a dataset of points inside and outside of a circle\n", "def circle(samples, center=[0.0, 0.0], radius=np.sqrt(2 / np.pi)):\n", " \"\"\"\n", " Generates a dataset of points with 1/0 labels inside a given radius.\n", "\n", " Args:\n", " samples (int): number of samples to generate\n", " center (tuple): center of the circle\n", " radius (float: radius of the circle\n", "\n", " Returns:\n", " Xvals (array[tuple]): coordinates of points\n", " yvals (array[int]): classification labels\n", " \"\"\"\n", " Xvals, yvals = [], []\n", "\n", " for i in range(samples):\n", " x = 2 * (np.random.rand(2)) - 1\n", " y = 0\n", " if np.linalg.norm(x - center) < radius:\n", " y = 1\n", " Xvals.append(x)\n", " yvals.append(y)\n", " return np.array(Xvals), np.array(yvals)\n", "\n", "\n", "def plot_data(x, y, fig=None, ax=None):\n", " \"\"\"\n", " Plot data with red/blue values for a binary classification.\n", "\n", " Args:\n", " x (array): array of data points \n", " y (array[int]): array of data points labels\n", " \"\"\"\n", " if fig == None:\n", " fig, ax = plt.subplots(1, 1, figsize=(5, 5))\n", " reds = y == 0\n", " blues = y == 1\n", " ax.scatter(x[reds, 0], x[reds, 1], c=\"red\", s=20, edgecolor=\"k\")\n", " ax.scatter(x[blues, 0], x[blues, 1], c=\"blue\", s=20, edgecolor=\"k\")\n", " ax.set_xlabel(\"$x_1$\")\n", " ax.set_ylabel(\"$x_2$\")" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAASMAAAEICAYAAAAUS5LYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO2df5AcZ3nnP6+l3Z2RdlerxQtnbGvHMsYy2MIr1sZwHEGOFEMqhU3iRF6KYMKmjK0ovqqQVGy4CykWQcxdikCwb60gTqaCVgJyOXx3yS0WXpO6HGa9Cv7FYuNfK7DxMUMwKgwjS7af+6N7pN7Z7p7+3W/3vJ+qrvnRPfO+3f2+337e533f51UigsFgMOTNaXlnwGAwGMCIkcFg0AQjRgaDQQuMGBkMBi0wYmQwGLTAiJHBYNCC1XlnIA9OP/10qdVqeWfDYOg6Dh8+/BMRGXHb15ViVKvVWFhYyDsbBkPXoZQ64rXPNNMMBoMWGDEyGAxaYMTIYDBogRZipJT6glKqrpR62GO/Ukp9Vin1uFLqQaXUFse+a5VSj9nbtdnl2mAwJIkWYgTsA97hs/+dwHn2dh3wXwCUUsPAR4E3AZcCH1VKrU81pwaDIRW0ECMR+Sfgpz6HXAl8USzuBYaUUmcAVwB3ichPReQ54C78Rc1g8KTRaHDffffRaDTyzkpXooUYBeBM4IeOz0/b33l9vwKl1HVKqQWl1ELahc0U6uJxcGaGTaOjXL99O5tGRzk4M5N3lrqOoohRbERkj4iMi8j4yIjrmKtEMIW6eDQaDXZOTjLXbHL46FHmmk12Tk6ah0nGFEWMngHOdnw+y/7O6/tcMIW6mCwtLVHr7WWz/XkzMNrTw9LSUmJpGGu5M0URozuB99m9apcBR0XkWWAW+DWl1Hrbcf1r9neJE6QwZVGodaMMlaxWq7F0/DgP2p8fBI6cOEFSU4aMtRwQEcl9A2aAZ4ETWH6fSeB64Hp7vwJuBZ4AHgLGHb/9APC4vf1ekPTe+MY3ShgO7N8vw9WqbFm3ToarVTmwf7/rcfV6XYarVXkAREAeABmuVqVer4dKrygEvS7t1Ot1mZ+f1+q6tM5lbHAw1Ll0otvKRCeABfHSAa8dZd7CiJGzMNVBvgQyVKl4Fqa0CrVuRK1kUQUsC9IQyfn5edmybp1V1extbHBQ5ufnE0ujSBgxiiFGrcJ0AGQYZAvIGpDdU1Oev9HxyZ80USpZN1oJ3XjOfviJUVF8RrlRq9V48oUXuAGYAw4D3wL+8hOf8PSTjIyMcMkll5Bmr13euPlZnnrhBfr7+z1/040+tZGREW7bu5et1SpbBgfZWq1y2969WpeN3PyAXipV5i2sz2j31JS8xmEBeFkB3WAROWk1uS6sVqUKck61anxqHhSlbKTdjMY00+KJUZBKpLMvJE0WFxdlsK9P5gIKTLf41IpIFg8LI0YxxUjEvxJ18xM/qu+oCFZCt5GFs91PjLoy0mMUdkxMcPm2bZbfo1Zb1uY/6QtpNoHlvhCdfQNhaTQaK87f6TvaTLAxOiMjI6W6LmUhyr1MEuPADkDLoQe4OqbTHjSnA14D94rooDW4k/u99DKZyryFaaYF9QWV2RcSpBla1KZXUfOdJmleE4zPKJoYhfUFlbVgl3XgXrd2OuSJnxiZZpoPYcfFlHV8URmboWWf1FzEOYNGjHzwqoT9/f2Fu9FxyN2XkAJlHoCZxsTcTMTNy2Qq8xbFZ9TyBd24a1fXmvZlaoaWdThGGueVZHMW4zOKLkYipyrh4uJipBsdtRKXqfLrSJadDnHvZdDfJ+Hfc6aVtLgZMYopRi2i3OioTxXjXM2GLAQ/7r0M8/u44tGe1u6pqUQ7L4wYJSRGUXrXolpSZWxCdCNx72WU30e1+NzSGqpUMrOMjAM7BGEduVGdpGV2rnYbce9llN/vmJjgkSNHuP3QIR45coQdExOR0zqnt5cPffjD2XReeKlUlhvW8kKPYkVrvMll/6eB++3t+8DPHPtecuy7M0h6US2jFkFNe2MZFZekmm95WEZR8zk7OytDlYprWkldD3RupgGrsMLJbgR6gQeA1/kc/4fAFxyfnw+bZlwxCkNUk7nMI7p1Z//+A1KtDsvAwJj09Q3J9PSeWP8X916mXRacfqJ1vb3S39OTWlq6i9GbgVnH55uBm32O/7/AdsdnLcTI78lhetOKQ71el2p1WOAB21/7gEA1tiBl1ZsW5X/dLK/Z2dnumw4CXA183vH5d4HPeRw7ihW4f5XjuxeBBeBe4CqfdK6zj1vYsGFDohfY9HyVh/n5eRkYGHN2Hglslr6+QS0eCkmLUtZTffzEqGgO7GuAr4rIS47vRkVkHHgP8FdKqXPdfigpLeJY9mkFupH2SOBarcbx40/BsnH3T9PTsyH3DoQ0RlbrNNVHBzEKsxDjNVjLGp1ERJ6xX58E7gHGks+iN6bnKztmZg4yOrqJ7duvZ3R0EzMzBxNPY2RkhM985lPAZcAbgK3An/LSSz/KdS5eWg+9oD3EXTEdBFgNPAmcwykH9utdjtsELAHK8d16oM9+fzrwGD7O79aWpM/I9Hxlg5svp1odTu06T0/vkb6+Qenvv1Cq1WGZnt6Tq/8u7eaUX/Ovq6aDAL+O1WX/BPAR+7uPAe9yHPPnwF+0/e4tWIs6PmC/TgZJL2kHtun5Sp/5+XlZt27LMl/O4OBYqmFMWhV0enqPVKvDsm7dFqlWh2X//gOppemXlzweemY6SMpblr1ppkcsGbK2jPJO1408HnpJW2RGjDIQIzdML1uytMb/DA6OZWah5GGR+ZH1w81YRiUQI+NLSoc8KqMullFeJGmR+YmRWR0kJbplxZCsyXplkZGREfbuvY3Jya309Ixy4sQR9u69ravuod/KOElixMgHt6V5gpL3si+G5JiY2MG2bZenXhl1JouHgA7jjLQk7gCzMoZq7WZ0iG9exLjWofBqv5V56+QzStLfY3rTDF6EKRtZdIZ0yk8SZRnjwA4nRnkszWNEqzuIMnYpi86QTmKXlBgaMQopRln3hJkhAOXC68FyKjTJRQLVwD10WYy+9ivvSdYHI0YhxUgkuwFmZghAuWgJTrvFs3yIwLzAGwKPXUq7jHQSuyTF0IhRBDESyabpVNbVWqNQ9Kaq35ik5YMn6wLhxi6l+XA0llEBxCgLjGVk4WVRFAm/0dorheoWgaoMDFwc+HzTDNDWSeySEkMjRhqLkUg5JtrGqShlGeXc6Tzap7NkGQkgiF+y0z1cXFyUffv2yeLiYuR8GDHSXIxEit1EiWvV6Db/Kw6d5s/lcZ+TsL5Nb1oXiVFRScKqKYtl1EK3B0tcv2RWPiMzAtsQi6WlJXp7a+CIddnTMxoq0mVr/le1upXBwS1Uq1sLMf/La0S0DqO1ncQNLZtZNFMvlSrzZiyj+LSe/ouLix2tmqCWgm4WhR9JONyzPN84fsmu6k2j8yKO7wcanFqs8fcd+67FCjf7GHBtkPSMGMWjvSLu2nWjp5+kDL1k7STRrMzjusQRv67oTSPAIo62GK1YvggYxoqfPYwVD/tJYH2nNI0YBae9AHtVxMXFxRUFvWy+oBZxHe5FvS5pz03TwWd0KfC4iDwpIseBA8CVAX97BXCXiPxURJ4D7sKysgwJ4LYah5eP6Pnnn1/hJ0nCn6Qj1nJGSziXMzpx4kgoH0yW1yWp2f5p+8J0EKMzgR86Pj9tf9fObymlHlRKfVUp1VraKOhvUUpdp5RaUEotlDYEQ4I0Gg0mJ3fSbM5x9Ohhms05Jid30t/fH7gixq20uhLX4Z7ldYkbCifTsCVeJlNWGwFWlAVewakliT4I3G2//2PgPziO+4/AH3dK0zTTOuPXFAkTizqPuNVZEafZksV1iet4TmMCN5r7jN4MzDo+3wzc7HP8KuCo/X4CuN2x73ZgolOa3SBGSUwd8PNrhPn/IvWSJUWQc077usQZX5TWNCXdxajjIo7AGY737wbutd8PA09hOa/X2++HO6VZBjHyK8hJ9dSU2apJE116EOMISloTuLUWIyt//os4Ap8EvmsL1RywyfHbD2ANCXgc+L0g6RVdjPwKe9I9NUW1avLKt249ZVG75LvSMspj00GMolaWToW9TPO8opKnZaLj9Y9a1tKYwG3ESDMxiuMY7FTYdXsyZ03Y80/agirb9U/6+hgx0kiM4pq/QQp7N/l62itLGMskDQuqXq/L1NRuqVSGcrn+ujerjRhpJEYtx2AdZB6kHsExGERsdC+USeAmJkEtkzQsmPb8TE3tTv36O+9zUl3xaZYdI0YaiVG9XpeBnh5ZD7IFZD1If09PJN9R2cXGDz8xaYnC2rWbPcU6ad9OHs2zdvFb29Mb2+Gc9uIQfmKkwwjsruM0pbgHOAzcA6xSKvR/6BamIms6TakQeRl4wX5dSdKjoPOY4tE+Qv6XJ1ZxxsnUw4f5aDQa7JycZK7Z5PDRo8w1m+ycnMxs0UgjRhngHFK/tLTEudXqstgwGyuVws/XyhovMenv72dycifHjn2TX/ziEY4d+yaTkztdYw4lGUMp66kvbuInvJq7TqYefjn1zOIWeeFlMpV5y7KZ1m727pmeNgH4E8LNdxa2+ZVkczfLjgO3ZmFv7zoZqlQid8WnNbbICcZnlI8Yed3cliAVOQC/LgQNcZKV2Gfpy3MTv7jpp704hBGjnMTIb0h9tzug06Sbhzbo+p8t/MRIWfu7i/HxcVlYWEg9nUajwabRUeaaTTZjteO3Vqs8cuRI5o7nRqPBd77zHQDGxsZK7/hu+edqtVrpz7VIKKUOi8i42z7jwE6RkZERbtu7l7f19vIarPAEx198kbsPHco0HzMzBznrrPO44oo/4Ior3s2ZZ25kZuZgpnnImm7vbSwixjJKmUajwWs3bODWY8fYDjxLttZRo9FgdHQTzeYcnLTP3k6lIvzgB983lVVzymbhGcsoR5aWltjY18d7gBGy7y5dWlritNPOhmUdtjVWrXqlGU6gOW5hf8uMEaOEaQ/TGXfNqrjUajVefvmHsCwHS7z0Uj21PGQaqrSkeIX9LfM1NWIUEr+K5hZvuOU32lqtsmVwkK3VKrft3ZuZyd0a3Nfb+zawPVc9PSf4whemU8lD3k9zXYUwbL7KupiBL17dbGXeonbt+83b6TRgLO+u/Hq9LrOzszI7O5t4HsIs6JgmukRYbCdKvtIaL5VmOQgCuo8zovMijn8ELGK1Mb4BjDr2vcSpxR3vDJJeFDHqJDZphenUnVZFGxi4SHp61kqlcmEugcXyHuyYRr6SHi91YP9+WdfbK68BWWNP0M56wK3WYkSwRRy3Amvs9zcABx37ng+bZhQx6iQ2WQyl141TFe0WgWGB1wtUcxEEHSMsJpGvOBFB20emt5fP9SBDlUqmZdRPjHTwGXVcxFFE5kTkl/bHe4GzMs5jR0d03r6hPFhaWmL16jOBW7BCkz8M/DlwGQMDY1SrW/nwhz+USV50XaMtbr6ijJfyWnzz7NNOa+tThVeuWqWPH8pLpbLaCLBuWtvxn2P5WmkvAgtYInWVz++us49b2LBhQyRVDzJvJ2/fUJbU63Xp6xsUeMOyJ//atRfKBz94g1QqQ5n6b9qbNdPTe7S4F3lPoG0tP667ZVQoMQLea4tOn+O7M+3XjcAScG6nNOPMTesmsQnC9PQe16ZZpTKUS3OtdX+mp/do5czOqtz4NQtbPqNzjc/IU4wCLeIIbAO+B7zS57/2AVd3SjPvgPxlY3p6j/T1DcnAwMUnw63m6b/R1ZmdBZ3O3fSm+YtRkEUcx7Cc3Oe1fb+eU8tenw48Rpvz220zYpQ8zid/3mKgqzM7K+tI56gFWouRlb+OizgeAn5MWxc+8BbgIVvAHgImg6SXhBiVpbmW1nnkWSHyFkM3sh4DpWv51F6Mst6iilHrBreCo6UVtDwr0q4geVYInawDHcUxL4wYJSBGJ3vSBgakCnJLwccTdUMF0cU60LXZmAd+YqTDOCPtca6a8C8//zn3Yo2saZBD0PKE6Ia5T7rENNJ1DJQXec3vM2IUALdVE87CGkeQ9Sz8pChaBSkySa9EkiZuk70zw8tkKvMWtpnmNpS+CnJhf38pfEY6+FWKQpymny7NRi/M6iAFECORlaOv90xPa12wgqJ7BdGJtBz+utyDLCZ7GzFKQIxE8ik0uhTUbicth39YgUuzPBjLqEBilDW6xufpRtLoEQsrcFmUB7NumhGjFXRD13s7OluBadyPMAKXZXnIa90005umKVl0vesUorU97MXHP/4JLfLVIo0esTA9mkmVhyD3PLchEV4qVebNWEZ6NQHdzhXWSKUylHu+2i2EpK2GoD2aSZQHHe45ppmWnhiladKm1fWuWxPQrbkCYwJfyi1fWVbcoGUoTnnQ5Z4bMUpJjPwC9CdFGmLn56vIq8dwpWU0LFDPZdqELhXXK29R7o8uU1KMGKUgRkl1g+pS+VuREVvB9fv6BmV6ek9meWo99eFcgfUCB3ITAV0qbpLoIrBGjFIQoyQGiLU3BaamdgcuHHFFzC1E6/Lg+m8QqGYqSPV6XaamdkulMpTrqHBdKm7S6DDi3ohRRDHyq/BxLaM4Ttuk/BnO85ufn5eBgYtsIXpAoC7wJentHcy8EurQxa9DxU2DvK+tEaMIYhTEHxRngFhUp21aT+163Rlc/4AtSlsE1sjU1O5Y/11U8q64ZSQRMQK2A38DXGx/vi7obwP8d6dFHPuAg/b+bwM1x76b7e8fBa4Ikl4nMQpj9UQtsFGdtmn6M6zg+hXbZ6N3EyVpodBVeHTNV1SSEqMZYAj4z8DlwG1Bf9vhf4Ms4rgTmLbfX4O9iCPwOvv4PqwY2k8Aqzql2UmMslodthXIPozTNm1/xk03fVjgNVo7b5Pudtdh/I3ISuHRJV9JkpQY7XG8/wvgvqC/7fC/HVcHAWaBN9vvVwM/AVT7sc7j/LYkLaOoOJeFXrWqKj09AzIwcLH09Q11dBqn6c/Q3XkbJ39egxh1ON924TnVoaDnfYhKUmJ0ZdvnPwz62w7/23HdNKylSs9yfH4CazWQzwHvdXy/F4+ligi5iGOaEwbdKsDq1Wulr29QBgYuyn32ts7O26jNVC8rQ4dufLfyYJWFMa0t1CjEEiPgM4DqdFzULSsxcm5J9KbFYWUFqAus0eopqKuvIool4/cbHSwjN0Hs77/QbsLrUyaSwE+MgkyU/Tlwp1JqDYBS6gql1D8H+F1QngHOdnw+y/7O9Ril1GpgHfCvAX8bmbQmDK6cIHkX8Gp0iketS/zoFq0JnkDoCat+k0x1CAnrNmH2pZd+xGc+86lChKpNDC+Vcm7Ae4D7gH/G8sv8uyC/C/jfQRZx/AOWO7C/bL9/Pcsd2E+SgAM7C5xNoUplSHp715XuKZgUbk2sMJZbEOsnb0vQq2mcZL7yPkeR+M20XwXmgHuwus/P7/SbsBudF3GsAF/B6sKfBzY6fvsR+3ePAu8Mkp4OYiSyvHDo7KfJk6SaUUW4vln4AfPumYsrRncDb7XfX4S1ouvlnX6n86aLGLWjw5NLN5J0MHfr9dXBL9bCT4xWB2jGXe54/5BS6p3A32EtLW1IkJGRkXL7BCKw3J+ymThLKnXr9W35zJpNd5+ZLoSO9Cgiz2I13QyG1NHBwVx0irJGXkfLyA0RaSadEYPBi4mJHWzbdrm1mGatZoQoJC1Bn5zcSk/PKCdOHNFS0JXVjOsuxsfHZWFhIe9sGEpCo9EohFDqkE+l1GERGXfbZwLyFwCdAucbltO+kMDMzMG8s+SJbmPH2jFipDlFKuzdRqPRYHJyJ83mHEePHqbZnGNycmfuD42iPryMGGlMlMJe1IIYlTzPN4vlpMJS6IeXV59/mTddxxm1E3aMjS4D27Ii7/PVafyOjvlxAxPpsZhiFKZwFaEgJoku56vTyG4dIhB0wk+MTDNNY8KMsdGxyZAmupzvxMQOjhx5hEOHbufIkUeYmNiRafpO8hhPlGgz2UulyrwVxTJqEWQagy6WQlZ02/kGJUtLLcq6gZhmWrHFKCg6NRmyoNvONyhZzMGLGg3VT4zMoMeSocPAtizptvPVhfvuu4/rt2/n8NGjJ7/bMjjI7YcOcckll3j+zm/QY6TpIAZ96bbJoN12vnnTEv/+/n6Wjh93TF+GIydOxPJPGQe2Aei+8UlpUKZr6HYuB2dm2DQ6yvXbt/PWN76R905OsrVaZcvgIFurVW7buzfeg8Gr/Vbmraw+o6jkPV6nDJTpGro5pr18RIuLi6H8U+jqwAaGsQJAP2a/rnc55mLgW8B3sazBHY59+4CnsAK+3Y+9wGSnzYjRKUyvVHzKdA29RGd2djaRtQT9xCjvZtpNwDdE5DzgG/bndn4JvE9EXo+18uxfKaWGHPv/REQutrf7089yudBlvE6RKfI1bG+OLS0tUevtdZwJjPb0WPtsHxEk4yNqJ28xuhK4w35/B3BV+wEi8n0Recx+/yOgDhTKY6mzL6Eogbd0pqjX0OkD2jQ6ysGZGWq1mqvojI2Ncdvevcn6iNrxMpmy2ICfOd4r52eP4y8FvgecJqeaaY/a1+zTQJ/Pb0Mt4pgUUQaGZcn+/Qekp6ffXrftXOntXVdof0deZDnmKYlxRH7jhPwWMI2bNnn6jIBDWIswtm9XtosP8JzP/5xhC89lbd8prKWK7gD+LEiesvIZZbFMdhyW+zrqAl+SSmVIm/wVjSwGG7Y7yqemdkdKb35+3tcHlNa55CpGfpstLmeIQ2w8jhsE/gWf1WKBtwP/M0i6WYlRpxueN2EnVnbr6hq64OYohzVSqQyFtsTyelD6iVHePqM7gWvt99cCX2s/QCnVC/w98EUR+WrbvjPsV4Xlb3o41dyGxKv9rYsvIYyvo9BxckqCm6MczufYsVtDB3UbGRlJ3wcUFi+VymIDXoHVi/YYVnNu2P5+HPi8/f69wAlOdd+f7MLHWtPtISwR+lugP0i6WXbt+7W/dSCIr6NMXddFxt0yGhaoF2YtOXRtpuW1ZT3OyO2G69Tk6ZSXIsTJ6RZaDw84V2C9wIHADwcdypwRo5zFqB3de9jaMZaRXtTrdZma2i2VylDg3jtdypwRo5TEKMqTRvceNhH38zLhOvQjaPmLUua6rjctry0JMfJ60gRp8ujcw+Y3x0oHM9+JbvnRlbBlLk0ryohRwmLk9aTZMz3d8SbqbBkVqTlWpompSeElzmHKXNrl04hRwmLk9qS5sL9fhvr6At1EXXvYiuKoLpJoZkUncQ5a5tK23I0YJSxGbk+Pwb4+GRsYCHwTdWxiFKWSF0U0syLofQsaS91YRgUSI5GVT5pWE03H5lcYdHZUtyrT4uJiIUQzK5IW5zQtdyNGKYiRyMonja7Nr7CE6aXJyrprb4bs2nWjtqKZNWlYtKY3rWBi5IaOza80iOtADnOdvCpb2CiDZUZni9aJEaMMxagbiPskDitkxkcUjCI8CP3EKO+JsoVH58BpaREnsmGj0WBycifN5hxHjx6m2ZzrOMlTp+Bled9vv/RHRka45JJLCrtaihGjGLhFyusG4ohDFCELs8x3muQduSDv9FPHy2Qq85ZEM03nwYtZ4Oej8GsuxGni5dkMyWvYQ9l6EDE+o+TFSPdpHVngN4fNzx9UFGerkzz8Vs5r2dc3KNXqRYX3mxkxSkGMut0yciOM9VAEZ6uTrC2jlenNCVRLbRkZn1FEtIyUlzNh/EFFc7Zm7bdaeS3fTqXyKvr6fiVXv1maKEusckpcqWHgIFADloDfEZHnXI57CSuiI8APRORd9vfnAAewIkYeBn5XRI53Snd8fFwWFhaSOIWTa4/XarVEC0Za/5smjUaD0dFNNJtztFZgr1a3cuTII4U5h05kdV+8ruXhw/+H559/PpH0w5xLUuetlDosIuOuO71Mpiw24FPATfb7m4BbPI573uP7LwPX2O+ngRuCpKv7OKM0Qzik3TyK6tg2rCRN31qYMpZkeURXnxHBVwdZIUZYSxT9BFhtf34zMBskXZ3FKE1fVFZhN6I6tpNOswykcV6tMjYHMg8yFzGkSJS86SxGgRZxBF7EWoDxXuAq+7vTgccdx5wNPOyTVi6LOIYlrV66PGfkp522rrGNdBXI+fl52VityjDIFpBhkFql4lrGvMrj7qmpSNZSrmJEAos4AmfarxuxfEvnhhUj59aNllGeUyrSTFvXsCe6CqSIWGOW7LLVKmNVkMXFxRXHupXHoUolchnV2TIK1Exr+80+4OqyNtNE0pn9XzbLqGV1zM7OZiayYaIZ6CiQLebn5+WianWZtXNhtdoxDG2rPO6emopsvessRv+pzYH9KZdj1gN99vvTsdZYe539+SttDuydQdLVXYxE0jHx8xxs2Ep77drNsdN2Wh2VypD09q5LveKHsXR0n9gbN0B/HOtdZzEKsojjW7C69R+wXycdv98IzAOP28LUFyTdIohRWuTlx9i//4BUKkOydu35kZZjbuFmdfT09KcqsmEtnaiWUZb3Jq71HfX32opRXls3i1EeJNls8bI6ZmdnU6vIUSydsFZoFB9TXPHK4/dGjIwY5UqSzZY8/DFpWzpR/l+XRRnDYsTIiFGuJC0gefi+0kwzrFgXeV6kEaMcxUjXsSZZk3RlzuO6ppVmvV5f4YTv7V3nmU6RI0b4idFqDKlxcGaGnZOT1Hp7WTp+nNv27mXHxETe2cqFiYkdbNt2eWLzukZGRjKf75Zmmj3S5DTeRC+v5jg/YpW87HlsrVZj6fhxHqQ1aw2OnDiRS+TLJDGz9lOi0Wiwc3KSuWaTw0ePMtdssnNyMla40qxDniadXlYz9fMODRuWpaUlzl9T5Qcc4xBP8gOO8dpqZVm0A+c5lTZihJfJVOYti2Za0qZ01g5LnUcQ+1HEfHfyAXnd+yK6ADA+o+zFKEknY1oOS6/CnLTDOatKk1ZP2+Liouzbt891ukRSeI3bKbKz2g0jRjmIkUhy0zrScFj6WRBJdsVnaanEybeXYO7a9e/FirD4WoGq7Np1Y1rZd81DkZ3VbhgxykmMRJKxCpJ+OnayIJKyMPIP1RosPS/BXFxclPZQr1CRgwcPZmaZGMuo5FtQMdKpTZ7k5Fk3C5zL6JAAAAu/SURBVGLt2s0yOzt78pgkuuLzDGIfNN9+ArZv3z7bImrl/4DAGqlWL8zUH1WWZdNFjBhFEqO8R7i6CWFS4uhWAWHNijljSUwXyHN5nyDp+AnmcsuoLrA+83NpodODMQ5GjEKKUd6mcRZC2LIg4Fy7kh1IpYLpvixRJ8HctetGW5DOtq/VStEyBMeIUUgxytNpmKUQzs7Oytq159tP/fQqmO5P9U6Cubi4KJ/97GelUsnPMioLfmJkRmC7kOcI16WlJWq9vWxuNsFOf7Snh6WlpcQHtY2NjfHyyw3gWWCEtNawz2O0dBgmJnZw8cWbmZ+f59JLL+WCCy5Ytv+CCy7gggsu4PTTX8nk5FZ6ekY5ceJI6ZYKapHbyjReKlXmLYzPKGunYdZNRN2bUVkQZviB7lZeXNJ2EWCaaeHFSCS/gpe1EJa9gvmhe4jYLMniQegnRrk204Is4qiU2gp82vHVJqxQs/9dKbUP+BXgqL3v/SJyf1L5y6t5sWNigsu3bcvMVNa9GZUmrZVbm82Vq+B22zXJ0kXgRt4TZW8CviEi52GFn72p/QARmRORi0XkYuBy4JfA1x2H/Elrf5JClDdFW/65qNRqNY4fX8LyDEJafrMi4PSVQvbRAPIWoyuBO+z3dwBXdTj+auAfReSXqeaqjaLNAk+L9utQhusyMjLC3r23Ua1uLe0a9kHJPRqAV/sti42Aizg6jrkb+A3H531Yyx09iNWU8wzIT8RFHNsderunprrGn+D0JbVfhxt37Spk2FMvutlv1k6a14KiL+Jo7zsDaAA9bd8poA/LsvqzIHkK48Bud+itwVrEruiVrxNO8RmqVGRdb++KRf/mSjJfypAdfmKUejNNRLaJyIUu29eAHyulzgCwX+s+f/U7wN+LyAnHfz9rn+MLwH8FLk0y7ycdevbnzcD5wK3HjsUOlKYrjUaDr3/968sCw9167Bgjx48vuw5nAWsdn1uOziTzUfQmoCEcefuM7gSutd9fC3zN59gJYMb5hUPIFJa/6eEkM+fq0AO2k3zl04GDMzNsGh3lxt/8TYabzZPisx34ESy7Dk8Dv3B8fur4cZ577rlExKOVj+u3b2fT6CgHZ2Y6/6gDRtwKgJfJlMVGgEUc7c814BngtLbf3421sOPDwN8C/UHSDRNCpNVcORdkPciBkjZLnE3Sun2uzmZZf0/PsrFPLZ/R2OCgDPT0yLre3kT8R2mMdcl70rPhFJhBj9HFSMSqILunpmSoUilFGAc32ufjHbD9Y5vXrj15vu2OzXq9LrOzs4mKR9LzAqOIm9t5Gud2MhgxiilGLcpcKN0q7VClIrOzs77nG0c8vMKk5CluZe81zBsjRgmJURGII5hRpqFEFQ+/plOS02HC5M/t2Cx7Dcv8sGthxKiEYuRWcJPwjUSpEGHFI4hAJFkxg+bPzYo6D2Q+g1Ay3eLXMmJUMjFyK7hpTnIMIgxhoytmHS8q6DnkYRnlHcwvS4wYlUiMvAru7OxsKhU8jSe2zpWv3Ypy9hqmZbGUbQUQP4wYlUiMvApu0r1aIumKhs5B5rPuTdNZnJPGiFGJxMiv4CZdwdN+YneDwzYoOotzkhgxKpEYifgX3CQreNmf2J2uVdZi2Q3ibMQoQTFyFpg8C09WaZf1id3JF9YtvVtZY8QoITFyFtAkp0DkSdI9ZbrTGjU+VKl4WnxltwjzxIhRAmLUae5WEQtrtz39W+f7hrVrZY095cXNF9ZNvVtZ4ydGec/aLwzOcCJLwDmwLKRG0WbxNxoNrv/AB/jrZpP/ffQoc81macOigHW+rbAo9//iF3wLuAErQFZ7eNW8w69GoQxRCYwYBcRZQGvAUxCqsOpWWP7m9ts5fuwYf4m1wsH3KJ6ghsEtNtUw8Na1a1eEV809/GpI0gi5kgteJlOZt7g+o7HBQem3fUZBHLu6NYfcfCLr7YmxRWtqBsVvsGic3rS8/WlF829hfEbJiJFI+N40HQuLm0/kXJDdU1O55SkLvHoGowqKDg+Zovm3jBglKEZh0bGw6CiQWdEuPFEFRZdrqEs+gqKtGAG/DXwXeBkY9znuHVirgDwO3OT4/hzg2/b3B4HeIOlmKUa6Fpayjh8KQ5x7o9NDpkj3UmcxugArxv09XmIErAKeADYCvcADwOvsfV/GWl0WYBq4IUi6WY/A1rWw5O3vyJu4geF0esgU5V5qK0YnM+EvRm8GZh2fb7Y3BfwEWO12nN+Wx3SQohSWbiKuoOj6kNEZPzFanVi3XHqcCfzQ8flp4E1Ywfx/JiIvOr4/0+tPlFLXYS3kyIYNG9LJqQ/dvJ69rpzswp+cZLSnhyMnToTqwt8xMcHl27ZZwwZqNXN/Y5K6GCmlDgH/xmXXR8RaOy0TRGQPsAdgfHxcskrXoDdxBcU8ZJIjdTESkW0x/+IZ4GzH57Ps7/4VGFJKrbato9b3BkMojKDoQRFGYN8HnKeUOkcp1QtcA9xptz/ngKvt467FfxFIg8GgMbmKkVLq3Uqpp7Gcz/9LKTVrf/9qpdQ/ANhWzy5gFmvWwpdF5Lv2X/wp8EdKqcexfEh7sz4Hg8GQDMoyMLqL8fFxWVhYyDsbBkPXoZQ6LCLjbvuK0EwzGAxdgBEjg8GgBUaMDAaDFnSlz0gp1QCOBDj0dKxR3mXAnIuedNu5jIqI6ziKrhSjoCilFrycbUXDnIuemHM5hWmmGQwGLTBiZDAYtMCIkT978s5Agphz0RNzLjbGZ2QwGLTAWEYGg0ELjBgZDAYtMGLkQCn120qp7yqlXlZKeXZRKqXeoZR6VCn1uFLqpizzGBSl1LBS6i6l1GP263qP415SSt1vb3dmnU8vOl1jpVSfUuqgvf/bSqla9rkMRoBzeb9SquG4D7+fRz6DoJT6glKqrpR62GO/Ukp91j7XB5VSWwL/uVcIyG7ciBmTW6cN+BT24gXATcAtHsc9n3deo1xjYCcwbb+/BjiYd75jnMv7gc/lndeA5/M2YAvwsMf+Xwf+ESss9GXAt4P+t7GMHIjI90Tk0Q6HXQo8LiJPishx4ABwZfq5C82VwB32+zuAq3LMS1iCXGPn+X0V+FWllMowj0EpSnkJhIj8E/BTn0OuBL4oFvdiBUA8I8h/GzEKj1tMbs/Y2znyKhF51n7//4BXeRxXUUotKKXuVUrpIlhBrvHJY8SKeXUUK6aVbgQtL79lN2u+qpQ622V/UYhcP4oQkD9RdInJnQR+5+L8ICKilPIawzEqIs8opTYCdyulHhKRJ5LOq8GX/wHMiMgLSqkPYll8l+ecp8zpOjGS9GJyZ47fuSilfqyUOkNEnrXN5LrHfzxjvz6plLoHGMPyceRJkGvcOuZppdRqYB1WXHTd6HguIuLM9+ex/H1FJXL9MM208LjG5M45T27ciRUXHDzigyul1iul+uz3pwP/FljMLIfeBLnGzvO7GrhbbA+qZnQ8lzafyruwwisXlTuB99m9apcBRx3uAn/y9s7rtAHvxmrjvgD8GHtRSODVwD+09Rh8H8uC+Eje+fY4l1cA3wAeAw4Bw/b348Dn7fdvAR7C6uF5CJjMO99+1xj4GPAu+30F+ArW0ubzwMa88xzjXD6Jtcz7A1iLTGzKO88+5zIDPAucsOvKJHA9cL29XwG32uf6ED7L1rdvZjqIwWDQAtNMMxgMWmDEyGAwaIERI4PBoAVGjAwGgxYYMTIYDFpgxMhgMGiBESOD1iil5pRS2+33H1dK/XXeeTKkQ9dNBzEUjo8CH1NKvRJrqsq7cs6PISXMoEeD9iilvgn0A28XkZ/bk3o/AqwTkavzzZ0hKUwzzaA1SqmLgDOA4yLyc7Am9YrIZL45MySNESODttgTSL+EFbDreaXUO3LOkiFFjBgZtEQptQb4b8CHROR7wBSW/8hQUozPyFA4lFKvAHYD27EiEHwy5ywZEsCIkcFg0ALTTDMYDFpgxMhgMGiBESODwaAFRowMBoMWGDEyGAxaYMTIYDBogREjg8GgBUaMDAaDFhgxMhgMWvD/Af8UU4dLM+jAAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "X, Y = circle(200)\n", "fig, ax = plt.subplots(1, 1, figsize=(4, 4))\n", "plot_data(X, Y, fig=fig, ax=ax)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## II. Dataset transformation \n", "\n", "Often in Machine Learning, we transform the data before feeding to a model. For instances, adding new features, or filling missing values. More on this topic can be found at https://scikit-learn.org/stable/data_transforms.html\n", "\n", "Here, we will add another feature as the product of the x1 and x2 features." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "data = np.empty((X.shape[0],X.shape[1]+1))\n", "data[:,:2] = X\n", "data[:,-1] = X[:,0]*X[:,1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## III. Split into train/validation\n", "\n", "In Machine Learning, the goal is to build a model that will generalize well. That means performance should be equivalent on unseen data. One way to train is to split into a training set and a validation set." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "data_train, data_test, Y_train, Y_test = train_test_split(data, Y, test_size=0.5, random_state=42, stratify=Y)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnEAAAEICAYAAAAwSKKsAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3de5Rc1X3g++/P0C2VI3WjNj2OAqgabByBA6FFg+08Jm65FWPWXUDGxKKz7OBMxUAUHCe+8QyM7rWzwMT2PBbjwdZFmHYgE6ulxHMTa2bI0nVDM7l54FJrjHipZYTSZUMYd8XGulZcRsL+3T/qlHS6VO86j33O+X3WOqvrcaprV9U5v7PP2b+9t6gqxhhjjDEmWV4XdwGMMcYYY0z3rBJnjDHGGJNAVokzxhhjjEkgq8QZY4wxxiSQVeKMMcYYYxLIKnHGGGOMMQl0dtwFiMO5556rY2NjcRfDGBORAwcO/KOqjsZdjiBY/DIme5rFsExW4sbGxlhYWIi7GMaYiIhIKe4yBMXilzHZ0yyGOdGcKiJfFJFlEXmmyfMiIv9JRI6IyFMissn33M0i8ry33BxdqY0xxhhj4uNEJQ54CLimxfPvAS72lluA/wtAREaATwBvA64GPiEi60ItqTHGGGOMA5yoxKnqXwHfbbHK9cAfa9UTwDkish54N/BVVf2uqr4CfJXWlUFjjDHGmFRwohLXgfOAb/nuv+g91uxxY4yJhKWDGGPikpRKXN9E5BYRWRCRhXK5HHdxjDHp8RCWDmKMiUFSKnEvARf47p/vPdbs8TOo6gOqOqGqE6OjqRhpwJgVyuUy+/fvx05SomXpICZtLJYkR1IqcXuBX/eaJd4OHFPVl4F9wC+LyDrvDPaXvceMyZQ9s7NszOe5bcsWNubz7JmdjbtI5rS+00HibEmwA3q2WCxJFicqcSIyC/wd8NMi8qKIFETkNhG5zVvlEeAocAT4ArANQFW/C9wN7PeWu7zHTErZAeVM5XKZbYUC85UKB44dY75SYVuhYN9RisTVkmAH9GyxWJI8Tgz2q6rTbZ5X4LebPPdF4IthlMu4Zc/sLNsKBcYGB1k6cYIdMzNsnW656WTC0tISY4ODXF6pAHA5kB8YYGlpCUsdcEKrdJB31j3+eGSlasN/QL+8UuEpYLJQYPPUlG1XKWWxJHmcuBJnTDt2htjc2NgYSydO8JR3/ymgdPIkNjWTM5xJB+nmSvapA7p3339Az6q0twRYLEkeq8SZRLADSnOjo6PsmJlhMpdj09AQk7kcO2Zm7Mw5IklJB+m2adQO6CtloWnZYknySLWlMlsmJiY07LkHy+VyteIxNmY7QAudfk/lcpmN+Xy1aYfqAWUyl2OxVLLv12PbXHMickBVJ+IuRxB6iV/+/Wc91W6wv716Nd/45jdbbiu1FIb8wAClkyczm8KQtfhjscQ9zWKYXYkLQRbO2ILQzfdkZ4jtjY6OctVVV9l3Ys5Qu5J9CNgI/AfgxA9/yBd27mz5uq3T0yyWSuycm2OxVMpkBQ6y1xJgsSQ57EpcwLJ2xtarXr8nO0M0vbArcWXesmED8sMf8jhYbOqSxXXTTFTHJLsSF5GsnbH1qtfvyc4Qjene6OgoH9u+nTeAxaYeWEuAacSFVjerxAXMkoE7Y9+TMdH60K238t1czva5HlnTsvFzZcQEq8QFzM7YOmPfkzHRsn2uf9YSYGpcaXWznLiQWO5WZ+x7MlHIek6cn+1z7dl3ZNqJOk/ScuIiZmdsnbHvyZho1AaqBWyfa8GFPCfjPleubFslrg9pH73bGJMOVjHpjCt5TlGzY1lvXMiTtEpcjywoGmOSIKsVk164kucUJTuW9Sfu1iSrxPUg7qBoZ03GmE5lsWLSq6z1mo/7WBa3NBxLrRLXgziDop01mSjEHdzifv80yVrFpB+u5DlFJcsV/DCPpZHGL1XN3HLllVdqP5aXl3Ukl9ODoAp6EHQkl9Pl5eW+/q+r72uyZfeuXTqSy+mm4WEdyeV0965diX9/YEEdiD1BLL3Er9p3Oj40FMtvmjTLy8taLBZTH1uzekwJ83OHFT+bxbDYA1IcS7+VONV4gmKxWNRNw8PVn81bxoeGtFgshv7eJhviDuphvX/WK3GqwVVMslLByYo4K/hxbUthHUvDjJ/NYpg1p/Yojl4p1ixiwhZ380rc759mQSRgWzpH+sTVwzLObSmsY2ks8atRzS7qBbgGOAwcAe5o8Py9wJPe8g3ge77nfuR7bm8n7xfElbi4WLNIsrl+FSPOVIFisajPPfecXYlzNH7FfZXWpIcL21IYx9I4rsTFHpCAs4AXgIuAQeAgcGmL9T8MfNF3/3i375nkSpyq+xUB09iuXbs1lxvR4eFNmsuN6K5du+MuUkNRnyjU55D8zu23B/7+Vonrn6VzmKC4si2FcSwNK342i2GxT7slIu8A/kBV3+3dvxNAVT/VZP2/BT6hql/17h9X1TXdvGcU024Z41cul8nnN1KpzIM3SUsuN0mptOhkz7eoph1qNnXNXx84wPHjxwN7/zCn3RKRa4DPUj0hfVBVP133/L3ApHf39cA/U9VzvOd+BDztPfdNVb2u3fvFFb+inmbIpFfat6Uw4mezGHZ2IP+9P+cB3/LdfxF4W6MVRSQPXAg85nt4tYgsAK8Bn1bVv2jy2luAWwA2bNgQQLGN6dzS0hKDg2NUKqezJQYG8iwtLTkZtEZHRyMp16kckkoFOJ1Dcvz4ca666qrQ379fInIW8HlgC9XYtV9E9qrqc7V1VPX3fOt/GBj3/YuKql4RVXn7cWr4jUKB/MAApZMnUz38hjkt6EpJ2relqOInuFGJ68ZNwJdV9Ue+x/Kq+pKIXAQ8JiJPq+oL9S9U1QeAB6B6JhtNcY2rop7gemxsjBMnlqiec1bPPU+eLGW+U4o/wbh2Rp6wzjpXA0dU9SiAiOwGrgeea7L+NPCJiMrWk1b7xtbpaTZPTdnk8BkyO7uHQmEbg4PVGDYzs4Pp6a19/1/bloLhQu/Ul4ALfPfP9x5r5CZgRRcWVX3J+3sUeJyVZ7nGnGF2dg/5/Ea2bLmNfH4js7N7Qn/P0dFRZmZ2kMtNMjS0iVxukpmZHYyOjmZ6YNsUDK7aqCXhvEYrtmpJEJEnROSGZm8iIrd46y2EuZ100mMw7mmGTHTK5TKFwjYqlXmOHTtApTJPobAtsFgVxraUuXjaKFEuyoXq1cCjVINbrWPDWxustxFYgmoen/fYOmCVd/tc4HladIqoLUnv2GB6t7y8rLnciMJBL5/2oOZyI5GOg+ZPpE1KZ4ewhd1Zh5A6NgA3Us2Dq93/APC5Juv+a+C+usfO8/5e5MW3N7V7z7Dilws9Bo1bisWiDg9v8vc/0KGhcWc7s8Q9UHmYmsWw2K/EqeprwO3APuAQ8Keq+qyI3CUi/iTfm4Dd3oepuQRYEJGDwDzVnLhmzRjGnMpNgzNz06LgP/MM+yw3SRJ8dSc1LQk2Rp+ptzINBFxOA3FtHtiorgjGXokDUNVHVPUtqvomVb3He+zjqrrXt84fqOodda/7W1W9TFV/1vs7E3XZu5W5S72OcSkoxV2hNIHYD1wsIheKyCDVitre+pVEZCPVloO/8z22TkRWebfPBX6e5rl0obPBxE29VmkgrnHpJCTKgYydqMRlhY12Hj+XgpJLFUrTmzS1JKQgP9GEYHp6K6XSInNzOymVFgPp1BAGV05CIr8i2KiNNe1LHDlxlm/iFlcGTK7lxA0NjWc6Jy5s2GC/HXNl3zCmWy7MaBTWQMbNYljShhhJrGbjYbk6TljaRTmOTyvT01uZmtps3eyNM1zZN4zplgvDlkQ9bJJV4toIajyxFIyHZUJiB01jjAlG3PE06oGMLSeuhSBz2CzfxCSNdcIxxpjubZ2eZrFUYufcHIulElunp0N7r9jnTo1DJ3MPhjW3W9QzBRjTiz2zs2wrFBgbHGTpxAl2zMyEGogg3H0jzLlTo2ZzPxuTPc1imF2JayKs7srdjodlV0NM1OIYb8l6bhtjTPesEteEC92V7cBmGgm7Yh/1eEuuDdJpjIlPWi5cZGqwXxfFncNmBzbTSBTzvkZ9AuPSIJ3GmOjVKjw7d34h8nmtwxDpBZhG446kfelmnKW4xkwKa6wZk1xRzvsa5XhLUYyhiI0TZ4yTamNlrl07rpBT+Ews81oHJax41iyG2RAjbcTVXdmGJDH1atN0VSpnTtMV9DYa5XhLUXfJN8a4wT9/9Okj3STwG4QZ38IU9ZiwVolzlB3YTL2V03RVA16Y03RFeQLTTaXRenibNMny9tzoxBTOB5aAlxM5DWHUF2AsJ85hUY41Y9zn0ryvYeik57Z19jFpEkWOq8sazR8Nz7Nmzb+MLb712yEh6nx6GyfOmITJ6pl7P2M32jhxJkhB7IPlcpl8fuOKpsRcbpJSaTFT+/Xs7B4KhW0MDOQ5ebLEvfd+mk2broglvgU5PmbQcbpZDLPmVGMSJu5pZeJi8w8bF9QqHYOD1atIMzM7mJ7e2vX/iTLH1WWuzB/tHxHi8kqlepJYKLB5aqqnMkUVp6051UQmLeP/mHi4MHajyTZ/Iv6xYweoVOYpFLb1FNMaNSUmMQcsCN0Ogh+GpA515EQlTkSuEZHDInJERO5o8PwHRaQsIk96y2/6nrtZRJ73lpujLbnpVNZzP+KUlspz3GM3GlO7egZnXj3rVtpyXJMeZxJ7ktho3JEoF+As4AXgImAQOAhcWrfOB4HPNXjtCHDU+7vOu72u3XvaOEvRinJ8M7NSbQym4eFNmsuN6K5du+MuUt96GbsRGyfOBKCbWNbpdhrXWKRBSkuciXJ8zG41i2GxByTgHcA+3/07gTvr1mlWiZsGdvru7wSm272nBcFoFYtFHR7e5B+3WIeGxm3g4pBZ5fm0MCtxwDXAYeAIcEeD5z8IlIEnveU3fc/dDDzvLTd38n4Wv+JVq7AMDY03rbCkpVLTibTFGVcr1c1imAsdG84DvuW7/yLwtgbrvVdE/jnwDeD3VPVbTV57XlgFNb2JenwzU2WJ0+ETkbOAzwNbqMaf/SKyV1Wfq1t1j6reXvfaEeATwASgwAHvta9EUHRTp9PehO0S8f15c9V97ykKhUmmpjancr9LW5xJWscxJ3LiOvBfgTFVvRz4KvBwt/9ARG4RkQURWUhqm31SpS33IykscToSVwNHVPWoqp4AdgPXd/jadwNfVdXvehW3r1K9qmci1m3ObqtE/CDz5pIgLXEmqTl9LlTiXgIu8N0/33vsFFX9jqq+6t19ELiy09f6/scDqjqhqhNWeaiKcqOdnt5KqbTI3NxOSqXFnrrkm9M6+e2s8hyJTlsD3isiT4nIl0WkFrM6bkmwk9DwBNnjFNJTqelUGuJMkIOIR14ZbNTGGuVCday6o8CFnO7Y8Na6ddb7bv8K8IR3ewT4e6qdGtZ5t0favWfac0o6adPPUs5G2nT727ma4xElQsqJA24EHvTd/wB1+bvAG4BV3u1bgce8278P/B++9f5P4PfbvWfa41fUwsjZ7SRvLm2SGmeCnLC+1jFi0/Bw4B0jmsWw2Ctx1bJxLdVctxeA7d5jdwHXebc/BTzrVfDmgY2+1/5LqgnFR4Df6OT90hwEOznApy0RNUvst+tNiJW4th2z6tY/Czjm3baOWQ4Ia59KaqUma4rFom4aHlZ/LX58aKjrSnyQlcFGmsUwF5pTUdVHVPUtqvomVb3He+zjqrrXu32nqr5VVX9WVSdVddH32i+q6pu95Y/i+gwu6LRZIGs5G/1yKVfCfjvn7AcuFpELRWQQuAnY619BRNb77l4HHPJu7wN+WUTWicg64Je9x0yEwmoOdGEAW9NeUOPDxTVYsBOVOBOMTg/wWcvZ6IdrgxTbb+cWVX0NuJ1q5esQ8Keq+qyI3CUi13mr/Y6IPCsiB4HfoTrkCKr6XeBuqhXB/cBd3mMmYpazm11BDSIe22DBjS7PpX1Ja3NEN80CWczZ6JaLTZfLy8t699332G/XJWyw39BZ86FJsiC23zAHC24Ww1wYJ84EpNYsUChMMjCQ5+TJUtNmAVcmHXaZa+Mf+SfeVv0xH/vYjdx664fstzOx2zM7y7ZCgbHBQZZOnGDHzAxbp6fjLpbpQqfj5KVVEOPDbZ2eZvPUVKTfo1QreNkyMTGhCwsLcRcjNFnfGYNSLpfJ5zdSqfwX4CeAfyKXey+l0mLk3+vpssxTGzA5l5uMrSxhbl9h/H8ROaCqE4H8s5i5Fr/K5TIb83nmKxVvy4TJXI7FUsniT8iC2lf8J4gnTiwxM7Mj1U3KSTxGNothlhOXQpZQG4zR0VEKhQ9Q7Tz9fuBaCoX3x/K9utKhIewcwSDHazLRqCV0r6ea2LeeaBK6sy6ofTHocfJcl7oY06iNNe2Lqzklxi0u5cS5UJawyxBmF30sJy40y8vLunZgQNeBbgJdB7pmYMBy40IU5L6Ypbmtwx4GJEzNYphdiTOmCVeufoEbo6KH/X3E1UXf9O91IjwOHAAeB84SibU8aRfkvpilHu9pjDFWiTOmCdeCW9zDIIT9fcTWRd90pX7cxKWlJd6Uy604MF60enWiD4yuC3JfdOEEMSqpjDGNLs+lfXGtOcK4y4ZiWSns7yOsLvpYc2ogGk0rlOQmqiQLel/MyhAxYQ4DEqZmMcx6p8YoiT1kssh+p5Wsd2q84opfrXqhPjY3x7ZCgfzAAKWTJ22IkYhYbOpNEr+3ZjHMxomLiY2rlBxBjB+UJmF/H/Z9u+lUPlGlAqzMJ4pjfCxj+0qv0vS9WU5cDMrlMtsKBeYrFQ4cO8Z8pcK2QiG1XbqNMcnXLp8o7qGNDh06xMMPP8yhQ4far2xMSlglLgZp7CFj0qE+ad2YmqDmmAzDhz/8u1x66ZV88IN/yKWXXsmHP/yRuItkTCSsEheDVPaQCYBVIOIV9kC+Jvm2Tk+zWCqxc26OxVLJiRSQQ4cO8bnPPQA8ARwGnuBzn/uCXZEzmWCVuBi4fEYbFxcrEEmsVPZa5qyN2m56F3ezab1isQhcACvaNs73Hjcm3awS16N+D/AuntHGxcUKhIuVynb6KbNLAxsbdyThRObqq68GvgUr2jZe9B43Jt2sEteDoOZec+2MNi6uVSBcrFS202+ZXRvY2MQvKXNMXnLJJdx++4eAtwNvAd7O7bd/iEsuuSTmkhkTPicqcSJyjYgcFpEjInJHg+c/KiLPichTIvKoiOR9z/1IRJ70lr1hl9V6lgarXC7zyiuv8OqrR3GlAuFapbIT/ZY5iFHbk3DVxnQmaXHuvvs+y3PPHeChh7bz3HMHuO++z4b2Xradp1/tNz506JD7v3WjEYCjXICzgBeAi4BB4CBwad06k8Drvdu/BezxPXe82/fsZ8TzYrGom4aH1T9b8PjQUConCw5bbcTx4eFNOjg4rAMDa5yYGcGFyea7FVSZex213f9bxv37NUKIMzYA11DNqD8C3NHg+Y8Cz1E9S3kUyPue+xHwpLfs7eT9opixweJcY65v56Z/tRkdLsvlNAd6YS7nxMwOzWKYC5W4dwD7fPfvBO5ssf448De++5FW4myKmWA0q3Ts27dPn3vuudinf0nidFtxlTkJld6wKnFJOwntlMW5MyVhOzf9abjdg847sP03i2EuNKeeRzUrteZF77FmCsBf+u6vFpEFEXlCRG5o9iIRucVbb6GfS6PWszQYzZr/isUFrrzyF2LvUBD3ZPO9iKvMSWx+DtDVwBFVPaqqJ4DdwPX+FVR1XlV/4N19Ajg/4jJ2zeLcmTK+nWdCwzFcgZ/A3bFcEzXtloi8H5gAfsn3cF5VXxKRi4DHRORpVX2h/rWq+gDwAFTnHuynHDbFTP9WJtJXZ2I8ceLv+cM//A9UKvNUKtXHCoVJpqY2x/IdJ3FqljjK3Oi3zFCniEYnoW9rsX7Dk1DgNeDTqvoXjV4kIrcAtwBs2LChrwJ3yuLcSknczpM4R2ic/GO41uYHLgH/hLtjubpwJe4lqoP81JzvPbaCiEwB24HrVPXV2uOq+pL39yjwONXm1tBZz9L+NEqk3779Y3amm0BBdIrIAt9J6L/zPZzX6qTWvwb8RxF5U6PXquoDqjqhqhNRfq8W505L2naexGGS4ua/An1ZLsfbgaHVq3mvw1eipdrUGmMBRM4GvgG8i2rlbT/wa6r6rG+dceDLwDWq+rzv8XXAD1T1VRE5F/g74HpVfa7Ve05MTOjCwkLwH8Z0zX+mCJDPb6RSmad2HpTLTVIqLTq585iVXD7rF5EDXmUp6P/7DuAPVPXd3v07AVT1U3XrTQH3Ab+kqstN/tdDwH9T1S+3ek+LX/FyeTuvKZfLFkv7UPuN16xZw/Hjx534rZvFsNibU1X1NRG5HdhHNUn4i6r6rIjcRTWRby/VM9c1wJ+JCMA3VfU64BJgp4j8mOpVxU+3q8CFIQk7tavqm/9mZnZQKEwyMJDn5MmS02e6ZqUkNj8HYD9wsYhcSPUk9CaqV9VO8U5Cd1I9CV32PV5/EvrzwL+NrOSmJ0nYzmv5e9W0FPC3arhWdhePn0n4jWtir8QBqOojwCN1j33cd3uqyev+Frgs3NKdyb/RPTY3x7ZCgbHBQZZOnGDHzEymZ1/o1/T0VqamNju3UxvTSBpOQrPAxYpCmJKSvzc7u4dCYRuDg9XyzszsSEQnMpfE3pwah36aI/bMzp6qtB199VX0xz/mr06cOJUEOZnLsVgqZSJQGJMUYTWnxsGaU7uT1YpC7XP7WzVc+tzW5NudZjHMhY4NiVE/ivnnf/hDRr0KHHjdkR3thmyMMVmTxCn0guL6MEk2ZEswrBLXhfoxZLYA/8DKaZdd7YZsjDFZk/WKgsu9i9MyX3Pc07BZJa4L/jFkAF4GXjcwYANimkDEHQyMSZu0VBTSKGlDtjSyZ3aWjfk8t23ZwsZ8nj2zs5GXwSpxXWg0ivmDDz/MYqnEzrk5Fksl69RgemJjOhkTvDRUFNLM9SbfVurTq+YrFbYVCpGfhFvHhh5kraeTCZfrCb5p2N6tY0O2pWEbziKXf7f9+/dz25YtHDh27NRjm4aG2Dk3x1VXXRX4+1nHhgC5nGdgksflvB27QmjCEmX6gMXs5HE99tSnV8WVE2+VOGNi5mreTpZ79plwuX6ANvFKQuxplF4VR068VeJMW5ZwHy5X83aCvEJo25CpScIBOmq2f6zkcuuE39bp6dhz4q0SZ1qyM+bgNQrYLib4BnWF0LYh45eUA3RUavvHu95V4IIL3szOnV+Iu0ixc7V1opHYm+pVNXPLlVdeqWFYXl7WYrGoy8vLofz/qC0vL2suN6JwUEEVDmouN5KazxeHXbt2ay43osPDmzSXG9Fdu3bHXaSWauUdGhrvqbyubENUp8CKPfYEsYQVv6LiyjbhgtPfxWcURhR+ViGn99//QNxFi12/sSdtmsWw2ANSHEsYQXD3rl06ksvppuFhHcnldPeuXYG/R9SKxaIOD2/yAm11GRoa12KxGHfREimpB69+Tk5c2YasEucWO0BXFYtFXbv2Mq8CdzourFp1jvNxIQppuzDSj2Yx7Ox4rv+li3+8mMsrleocqoUCm6emYs9r6kdSJlFOilozUqVyZjOSy9vJ6Ohoz+Wzbcg0Mj29lampzbENH+HK0BXV/aMEXIi/eXlwcMz5uBCFfmJPVlhOXADqp+NKyxyqribcJ1WS8jyCYttQ9nSapB9XLpE/R3PDhrfwyU/+YWwdCkZHR/nsZ/898A38ceG1176Z6rhgAtTo8lzal26bI9pd0l1eXtaRXE4Peu1FB0FHcrnUXAK2S9rByWozUtzbENacGon6nM/773+gp989rO1lZUrDboV1Cm+OfV+8//4HdNWqc3Tt2itiL4txU7MYFntAimPpJgh2mutWW298aCg1OXGdivsAnTT2fUXPKnHhOzPn8zMKOV27trsTljA7/5zO0Vw+Iw8t7vxUiwumFacrccA1wGHgCHBHg+dXAXu8578GjPmeu9N7/DDw7k7er9Mg2O0VtizuhEnrbVkvi79ZM2n+LqwSF76VnVh6qySF3fnn9P//kkL8HW6M6VSzGNZxTpyIbBGRL4jIFd79W4JozhWRs4DPA+8BLgWmReTSutUKwCuq+mbgXuAz3msvBW4C3kq1IrjD+3+B6DbXLYgcjyQN+pj0QTtt/LLTMvBdDIURv2pE5BoROSwiR0TkjgbPrxKRPd7zXxORMd9zd3qPHxaRdwdZriitzPlcAi6g27Hgwh5DrpajuXr1bwOLZCk/tVNJOgYZOr8SB8wC5wD/HtgM7Oj0tW3+7zuAfb77dwJ31q2zD3iHd/ts4B8BqV/Xv16rJawrcf1K2lUtV4aP6EVQZ/xJvXrlL3dShz7pBvCdMOJX9V9zFvACcBEwCBwELq1bZxtwv3f7JmCPd/tSb/1VVLsovgCc1er9XL0Sp3o6hq1Z8zMKOeeuxPnf5+6778lkfmorSTsGZQn9NqcCD/hufxrY3+lr2/zfG4EHffc/AHyubp1ngPN9918AzgU+B7zf9/gMcGO79+wlJy7sXLckHkiTWOaaICqgSQ149eW+++57ElsZ7xRQ1hDil/f/Ij0RdbkSp3r6BOH++x/QXG5E1669QletOqfjAWyj7PyT1JOwMCQ5nmdBEJW46+vuf7jT17b5v5FU4oBbgAVgYcOGDV19eVHs6Em9qpXU3pb9BqykBrxm5V69+pzEfZZuAEc0hPilEcWwfuJXnKq9Lod07drLuooPVrmKXlKPQVnRrBLXNidORD4rIqKqX/E/rqr3tXtth16imjxRc773WMN1RORsYJhq80gnr62V9wFVnVDViW5z1qIYzyipY4i5OOdnJ/odvyyp8z82K/f27R9L5VhuH/nIR2qVoO/5Hw8wfkWin/gVl3K5zO/93h28+ur/y/e//1RXObOxz0eZQUk9BmVdJx0bvg/sFZHXA4jIu0XkbwIsw37gYhG5UEQGqeaL7K1bZy9ws3f7RuAxr2a6F7jJSxq+ELgYKAZYtsgkeVDUpAbcfiqgSQ14zcp9660fSmRlvJ21a9dy3XXXgRfrQohfENGJaNIk9UTHNVF1NEjyMSjTGl2eq1+AX9rK9foAAB9VSURBVKNa2fobqjkbv9jJ6zpdgGupDln9ArDde+wu4Drv9mrgz6gOJVIELvK9drv3usPAezp5P5dzSqwZITmS2pSc1HL36ktf+pIC/xRi/DobOEq1Y0KtY8Nb69b5bVZ2bPhT7/ZbWdmx4SgJ7tjgl9SUA5fEkXeb9WOQq5+fXnPigHcB88DjXkXpp9u9xvUlKUHQuM/VHb6dpJa7W3Nzc/rOd75TqbYohBa/ojwRTVL8ytoJQ5CsEhw9lzurNavESfW55kTkMeDjqvrXInIZ8J+Bj6rqYy1f6LCJiQldWFiIuxjGmJBt3ryZu+66i1/8xV88APwGFr8i58pk80mzf/9+tmy5jWPHDpx6bGhoE3NzO7nqqqtiLFk6lctl8vmNVCrzVFMAniKXm6RUWnRiuxWRA6o6Uf/42e1eqKqbfbefFpH3AP8F+Llgi2iMMcF67LHTdTWLX/EYHR114iCYNCvzV6uViiTk3SZVLYezUjkzh9Pl7bfjGRtqVPVlqk2sxhiTKBa/TFJYR4NoJbWzWtsrcY2oaiXoghhjTBQsfpmkmJ7eytTUZmuOjkCt0lwoTDIwkOfkyVIiKs09VeKMMdGxnCJjssuao6OTxEpz182pxi02WXG6ZWBiemOMcUbSxj21SlyC9XqAt4pfY659L+VymUJhG5XKPMeOHehqxPuoufbdGWNMFlglLqF6PcDblZ3GXPxekjLivYvfnTHGZIFV4hKqlwN8kq7sRMnV7yUJvaVc/e6MMSYLrBKXUL0c4JNyZSdqrn4vSRhiwNXvzhhjssAqcQnVywE+CVd24uDy9zI9vdXpield/u6MMcY1QecPWyUuwbo9wCfhyk4cXP9eXO4t5fp3Z4wxrtgzO8vGfJ7btmxhYz7PntnZvv9n27lT0yhpcw8GzcYda8y+l965/t01m3cwibIev4xJonK5zMZ8nvlKxZtEDSZzORZLpY5iZs9zp5r0scEjG7PvpXf23RljTHNLS0uMDQ5yeaU6YczlQH5goO+5Wa0SZ4wxxhgTglorxZo1a1g6cYKn4NSVuNLJk33nD1tOnOmaDexqwmbbmDHJl/X92J8D9wtXXsn7CwUmczk2DQ0xmcuxY2am7xYMq8SZrtjAriZsYST/GmOilfVjRblcZluhwHylwoFjx5ivVPiTmRn++sABds7NsVgqsXV6uu/3ibUSJyIjIvJVEXne+7uuwTpXiMjficizIvKUiGz1PfeQiPy9iDzpLVdE+wmyxQZ2NWFrFPi2FQpObmMWv4xpzI4Vvhw4734tB+748eOBjjYQ95W4O4BHVfVi4FHvfr0fAL+uqm8FrgH+o4ic43v+Y6p6hbc8GX6Rs8sGdjVBq29uaRb4HN3GLH4Z04AdK6pjaNZy4CC4HLh6cVfirgce9m4/DNxQv4KqfkNVn/du/wOwDFg3uBiMjY3x6qtHgV1AGRvY1fSjUbNpVIEvIJmMX1nPczLt2SDg1R77O2ZmAs+BO4OqxrYA3/PdFv/9JutfDRwCXufdfwg4THVLuRdY1eK1twALwMKGDRvUdG/Xrt06ODis8GaF1+vAwBrdtWt33MUyCbS8vKwjuZweBFXQg6AjuZwuLy/r7l27dCSX0/GhIR3J5XT3rl19vx+woBa/+lb7bTYNDwf225h02rVrt+ZyIzo0NK653Eikx4rl5WUtFou6vLwc2XuGXZZmMSyKitoc8EyD5fr6oAe80uL/rPcC3tvrHhNgFdUz4Y93UqYrr7yyry8zi5aXlzWXG1E4qNXj7kHN5Uac2ElMNIIMjMViUTcND6u3MamCjg8NabFYDPy9VHuvxFn8Oq1VxduYRuKoTNUqj8PDmyKvPIapWQwLfZw4VZ1q9pyIfFtE1qvqyyKynmpTQ6P1hoD/DmxX1Sd8//tl7+arIvJHwO8HWHTjU8txqFTOzHGwQV7Tb3Z2D4XCNgYHq80kMzM7+prH1d9s2mjMJFcGD7b4dVpYg5W6yPUZSJIi6v3Y36Gieqx6ikJhkqmpzan9HePOidsL3Ozdvhn4Sv0KIjII/Dnwx6r65brn1nt/hWo+yjOhljbDLMchu8LoaRZZvki4MhW/Epav2LOsD42RZJnsUNHo8lxUC/AGqr26nqfabDHiPT4BPOjdfj9wEnjSt1zhPfcY8DTV4PcnwJpO3teaU3sTZ46DiU+xWNTh4U3+lk8dGho/1fTZj6iaWwgnJy5z8SuMfEWXWNpIsqX592sWw6T6XLa4OoF0Ei7hJ6GMJljlcpl8fiOVyjy1xs9cbpJSabHjbSDu7abZ5NFJFHf8ivu3DNP+/fvZsuU2jh07cOqxoaFNzM3t5KqrroqxZKZTtdSPgYE8J0+W+k79cEWzGBZ3c6rxJGWU+tHR0UAHKjTuGx0dZWZmB7ncJENDm8jlJpmZ2dHxNpCUbdt0Js0xwNJGkm96eiul0iJzczsplRZTUYFrxa7EBaSfs9NyuczGfJ75SuVUkvdkLsdiqZSIQJnmM3NzWi+/syvbtl2JM51K65Uck2x2JS5Era40dDIwZsJGqV8hDUnANnhpZ3q5AtPrtm2/iYlL1q7kmIRrlCiX9iXIxOBOBi1tNzBmUsdfSkMSaVrHFIpSq84JvWzbYQwoSwgdG+JarGOWMdnTLIbFHpDiWIIMgs0GLd23b19XB68k9voKs9diFNJQCY1bJ5XgbrbtsE5orBJnjEmyZjEs9MF+067ZoKVAVwNjbp2eZvPUVKJyy1YmAVc/fZKSgG0A4/50OrBmN9t2lgaUNcaYfllOXJ+aDVo6Pj7e9cCYSev11W+vxbhZT7T+dDOwZqfbdlYGlDWmW5YnahqxSlwAtk5Ps1gqsXNujsVSia3T02kZkb6tJCcBJ70SGrcwKsFZ2W9M8sRZiUpDBzITDhtiJGQ2/Ib77DfqXVjDMQT9m9gQI6YfQc0d3OswPf0Otm2Sr1kMs5y4kLkykbdpzn6j3k1Pb2VqanPglWD7TYwrgppUvdeKoOXumlasOdUYRyQ15yVpuZzGdCOISdX9FcFjxw5QqcxTKGzraF+33N3OJTWG9sMqcQHK4gZkgmE5L8a4KYhKVD8VQcvd7UxmY2ijcUfSvoQxzlIYA5SabHBlvLpWg/YmHTZOnOlDbTzEoaHxhuMhttt3gtjH07x/9suVGBqmZjHMrsQFoFwus61QYL5S4cCxY8xXKmwrFOyKnOlIEM01/crsWawxHWjVC7+TfSeIq2mWttCcCzE0LtaxIQA2QKnpR9yDJgeVuG1MmjXqbNPNvhNWJyATfwyNk12JC4ANUGr6EXfOS5bPYo3pR7f7jl1NC0fcMTROsV6JE5ERYA8wBiwB71PVVxqs9yPgae/uN1X1Ou/xC4HdwBuAA8AHVPVE+CVf6dQApYUC+YEBSidPhjZAqY1plk5xnqVn+Sy2X2mJYaY3tu+4w7UrnVEdq+O+EncH8KiqXgw86t1vpKKqV3jLdb7HPwPcq6pvBl4BCuEWt7lGszYEbc/sLBvzeW7bsoWN+Tx7ZmcDfw9XZaHnb1xn6XGcxabo90xNDDPdy/IVIBe5cqUz0mN1o94OUS3AYWC9d3s9cLjJescbPCbAPwJne/ffAezr5H2T2LtreXlZR3I5PVjteqMHQUdyudB637jUE6rWM2x4eFPDnmEmGFH95nH05Cak3qlxxLAkxq+0iztexv3+5rRWx+p+fqdmMSzuStz3fLfFf79uvdeABeAJ4AbvsXOBI751LgCeafFet3j/Y2HDhg1df4FxKxaLuml4WL3+06qg40NDWiwWA38vlypNWeg6niVRn4zUhFiJiySGJT1+mfC4FK87kfYKZ7Nj9T13393XyWtslThgDnimwXJ9fcADXmnyP87z/l5ENe/kTd1W4vxLEs9kozr4uVZpKhaLOjy8yb8/6NDQeCiVVxO+YrGol+VyKwLcz+Ryof+e/VTiXIthSYxfJhyuxet2klbh7EWjY/U5q1f3ffxuFsNCz4lT1SlV/ZkGy1eAb4vIegDv73KT//GS9/co8DgwDnwHOEdEap0zzgdeCvnjxOZU54lcjk1DQ0zmcqF0nnCtp6JNOZMua9as4UilsqIn9wuVCmvWrImzWC1ZDDOuqeWUfv3rX3cqXrfSz9RjSdLoWP2x7durw5B56/iHIetX3B0b9gI3e7dvBr5Sv4KIrBORVd7tc4GfB57zaqbzwI2tXp8mUXSecK3SlIXE4RQl+bd1/PhxfjKXYxLYBEwCb1y9muPHj8dcsp5ZDDNNhbFv+wcXvv76rVQqL+BKvG7FtQsEYao/Vn/o1lvDG4as0eW5qBaq3eofBZ6n2mQx4j0+ATzo3f45ql3zD3p/C77XXwQUgSPAnwGrOnlfa45ord0UM3FIax5FFpoX/GpNDfOgRdD55OfERR7DLH4lQxj7dqPm04GBNc7F60b6afpNQ/yvdegaHxpKVk6ci4sFwfbSsNO4Lmn5LKrBbBf9BrNehFWJi2Ox+OW+sPbtZjnC+/btS0S87uUCQZpOdMPonWrTbpmGGk0xY4JVa16oTtcD/uYFF7/7PbOzbCsUGBscZOnECXbMzPTUpL91eprNU1PODMppTNDC2rebDS48Pj6eiP2o2wF50zYlYBjH1bhz4ozJLNfyD1spl8tsKxSYr1Q4cOwY85UK2wqFnnN9XBmU05gwhLVvpyFHuJt9P0t5dL2ySpwxMYkzIHebcL20tBRa7yqTHFnqhNOPMPft6emtlEqLzM3tpFRaZHp6awAldlOSTnTjYs2pxsQojvn+emkWHRsbO9W7qtqoEWDvKpMIQTWnZ0WY+3ZW0l1qleFCYZKBgTwnT5YSd+UxbFLNl8uWiYkJXVhYiLsYxkSuXC6zMZ9nvlI5VRmbzOVYLJXaBsbaQTw/MEDp5MlEHcRF5ICqTsRdjiDEEb/62W6SIKrJyqOStc+Tts/bSLMYZs2pKWHNHKYT/TSLRjFOoXFTmpvT/eOu5fMbmZ3dE3eR+pK2zwOt8+ginWzeRY26rKZ9SVsX/TgmFDfBiHool7jmLo0bNsRIX5K83bTax5I4zE8rUXwel4afSvJ22a1mMcyuxCVc0L0GXZPmK4xxnDFHNX2bSZekbjft9rG09X7s9/O0i7euXeVL8xXijjWq2aV9SdOVuGKxqJuGh9U/+uP40FAqJohP0yCP9eK+AuDS2XQUsCtxgUjSdtPJPhb3fhi0fj5Pu3jr4ndlV+LsSlzi+XsNQnp6DaZ9suRGZ8xnn72BRx55JJLPaOO0ZUeQV7OTtN2cuY+t53WvO5evf/3rp9ZJw7hrfr1+nk7irYtXLZN6hThQjWp2aV/SdCVONZ5pjMLWbHqZNFxhVG18Vgs5Xbv2stRddXQBGb0S51q+bJRX8lbuY7sV1im8uelVpqRcYexEt5+nk3jr4pU4f9nS9Ps10iyGxR6Q4ljSVolTTd9G7HLACEqt+WLt2isUcgqfSe1njVsWK3GuNTXFUaHctWu3rl59jsLrUx1L+tVpvO1l7lMTDKvEpbwSl0ZZCBjLy8v60EMP6dq1l6X2qqMLsliJcylfNs4K5b59+/QnfuJnbf9qo9N4m7YLBknRLIbZjA3GWXHMZhC10dFRrr32Wn7rtz5K/aTWSc9rNPFyaZaNU70IKxVgZS/CsPfr8fFxfvzjb2H7V2u1eFvLGRwfH2+4XlZmi0gK69hgnJakROpepS25ul9pHlYmSi4lfcfZAcv2r87NzT3GDTdM87733enEECKmPZt2yxhHZGHqmHbCmp8zy9NuubJdxT1tmyvfg6vK5TL5/EYqlXlqVyxzuUlKpUX7vhzQLIZZc6oxjsh6M4V/4OrLK5Xq/JyFApunppz8XkRkBNgDjAFLwPtU9ZW6dSaBe30PbQRuUtW/EJGHgF8CjnnPfVBVnwy6nK5sV1unp9k8NRVbRcqV78FVtSFEKpUzhxCx781dsTanisiIiHxVRJ73/q5rsM6kiDzpW34oIjd4zz0kIn/ve+6K6D+FMSYICRx9/Q7gUVW9GHjUu7+Cqs6r6hWqegWwGfgB8P/4VvlY7fkwKnCuyUJ6RFKNjY1x4sQS+Bq9LXfQfXHnxFkQNMYAiRy4+nrgYe/2w8ANbda/EfhLVf1BqKUyfavPy8xCnqblDiZT3JW4xATBLOzExsTJpUT8Dr1RVV/2bv8v4I1t1r8JmK177B4ReUpE7hWRVc1eKCK3iMiCiCz0G4MslrW2Z3aWjfk8t23ZwsZ8nt/98IdX3N8zW/8Tpsf09FZKpUXm5nZSKi0yPb017iKZdhqNOxLVAnzPd1v895us/xjwv/nuPwQcpnrSfi+wqsVrbwEWgIUNGzZ0NT6La6Oeu8jGDjJBCWNbosdx4oA54JkGy/X18Qp4pcX/WQ+UgYG6xwRYRfUk9uOdlKmfcS4tlrVWP57dPGjOG9fOhQGTTXY1i2FRVNQSHQRdG/XcRXZgMK7rtRLXavFOINfr6Vh0uMW6HwEeaPH8O4H/1sn79lqJs1jWXv0AyUXQt/hHCY5gwGQ7ITaNNIthoTenquqUqv5Mg+UrwLdFZD2A93e5xb96H/DnqnrS979f9j7fq8AfAVcHXf4EJltHyt+j8MCxY8xXKmwrFKypxmTBXuBm7/bNwFdarDtNXVOqL/YJ1VSSZ0Io4ykWy9qrz8v8J6A2TDCEn6dZ35Sb5qZbE4y4c+KcD4IJTLaOTLlc5pFHHiF/9tk9HxiSmp+T1HKbQH0a2CIizwNT3n1EZEJEHqytJCJjwAXA/6h7/ZdE5GngaeBc4JNhFtZiWXv1eZnvzeX40O23R5KnaSfEpieNLs9FtQBvoNor9Xmqza4j3uMTwIO+9caAl4DX1b3+MaoB8BngT4A1nbxvt80RtebC8aEhay701L6Ty9au7TlnJKnNsEktd5aRwblTG7FY1pn6Js0omjhdmuu2GWvqjU+zGBZ7QIpj6SUI2sZ7Wn1uzWe85N8r1q7t+MCQ1Pycfspt21B8rBJ3mm2H8Wr2/bseE+3kNV7NYljczamJYYNUnlafW/OvgDetWcPv3ncfi6VSR1PpJDU/p9dyW66LcYXFsvi0igMuD7ETd1Ovpa80Z5W4DOp3h2iUW/MPP/oR1157bccBJ6n5Ob2UO+4AaIyJXydxYOv0NIulEjvn5jo+IY5CnCfddgLcmlXiUqhVJS2IHSKIM0aXzzpb6aXcSb3qaIwJTqdxwMUrpXGddNsJcAcatbGmfek3p8RlrfIWgs65aJXb0WnOTVLzc7r9jC7numQBlhNnYpb0OBBHp5gkdPaISrMYFntAimNJaxBsFySi2CEs+bUx6xUYL6vEGRckPQ5EfdKd9IpvkJrFsLPjvQ5ognTqcn2lAqy8XD86OrrikvjlBH9J3H/p+/JKhaeAyUKBzVNTTjUNxGHr9DSbp6aqv9HYWOa/D2OyKOlxYHR0NNIyn0pfKRTIDwxQOnkyEWk3UbJKXIq0q6SFvUO0q0RmXdQB0BjjHtfiQLlc7qhS2el6QUt6xTds1rEhRTpJug+z91NSe5wakzU2ZIOBzju6xd1D1MXOHq6QalNrtkxMTOjCwkKg/zOusxTXyrJndpZtdVf6XOkmb7JLRA6o6kTc5QhCv/Grto+ODQ6ydOJE6vdRl2KzC2rfx5o1a/iFK6+spr9QPemezOVYLJVWfE/lcpmN+Xzb9Uy4msUwuxIXgLjPUurFedbi6jhHxpjsDdngWmyOm//7ePv4OOdB2yFPbIgkt1klrk9ZC4qdsEvfxrgpSwdki80r1X8fX3n1VY54HdCgefqLpcm4zSpxfcpSUDTGJFuWDshf2LmTEa8JECw21x+r3gm8cfVqfmnVqpYDlyd1YPassN6pfQp72A5jXGW5RsmTlSEbyuUy/+6eexCw2OxpdKz6/0T42//5Pzl+/HjL/dh6iLrLKnF96ico2kHQtOLy9pG15Pg0ycIBeWlpiYtWreJf/fCHTAJ54DCw/d/8m1R+3k40O1Zdcsklp9ZpFXNcGxrFeBqNAJz2JYwRz7sdydpmNjCtuLx9JHEUdWzGhkzxb6PLoF8CPWf1aqe30ag0O1a5HHNM8xgWe0CKY4k7CCbxIGii4/r2kcT5DMOqxAG/CjwL/BiYaLHeNVQvBh0B7vA9fiHwNe/xPcBgu/eMO34lRdKnuIqS6zHHNI9hsXZsEJFfFZFnReTHItJ0DCcRuUZEDovIERG5w/f4hSLyNe/xPSIyGE3J+2OdIUwrrm8fWUqO78AzwL8A/qrZCiJyFvB54D3ApcC0iFzqPf0Z4F5VfTPwClAIt7jZYcMddc71mGOai7t3aiYDoB0ETSuubx/WW+00VT2kqofbrHY1cERVj6rqCWA3cL2ICLAZ+LK33sPADeGVNntsuKPOuB5zTHOxVuKyGgDtIGhaScL2YVc5unIe8C3f/Re9x94AfE9VX6t7/AwicouILIjIQlbHOTPhSULMMY0loXdqowD4NroIgFANgsAtABs2bAinpF3IQg8x07skbB9Z6a0mInPATzZ4aruqfiWKMqjqA8ADUJ12K4r3NNmShJhjzhR6Jc6FAAhuBsGsHARNb2z7cIOqTvX5L14CLvDdP9977DvAOSJytncyWnvcmFhYzEme0CtxFgCNMRm3H7hYRC6kGqNuAn5NVVVE5oEbqaaJ3AxEdmJrjEm+uDs2dOJUAPR6n94E7PW63NYCIFgANMZETER+RUReBN4B/HcR2ec9/lMi8giAd5J5O7APOAT8qao+6/2Lfw18VESOUE0RmYn6MxhjkivWnDgR+RXgPmCUagB8UlXfLSI/BTyoqteq6msiUguAZwFfrAuAu0Xkk8DXsQBojImQqv458OcNHv8H4Frf/UeARxqsd5Rq5y1jjOlarJU4C4DGGGOMMb1JQnOqMcYYY4ypY5U4Y4wxxpgEkmr/gGwRkTJQ6nD1c4F/DLE4LrHPml5Z+ryNPmteVVMxdoLFr4bsc6aLfc4zNYxhmazEdUNEFlS16byuaWKfNb2y9Hmz9Fnbycp3YZ8zXexzds6aU40xxhhjEsgqccYYY4wxCWSVuPYeiLsAEbLPml5Z+rxZ+qztZOW7sM+ZLvY5O2Q5ccYYY4wxCWRX4owxxhhjEsgqccYYY4wxCWSVuDoi8qsi8qyI/FhEmnb9FZFrROSwiBwRkTuiLGNQRGRERL4qIs97f9c1We9HIvKkt+yNupz9aPc7icgqEdnjPf81ERmLvpTB6OCzflBEyr7f8jfjKGcQROSLIrIsIs80eV5E5D9538VTIrIp6jLGISvxK+2xKytxKwsxK/RYpaq2+BbgEuCngceBiSbrnAW8AFwEDAIHgUvjLnsPn/XfAnd4t+8APtNkveNxl7XHz9f2dwK2Afd7t28C9sRd7hA/6weBz8Vd1oA+7z8HNgHPNHn+WuAvAQHeDnwt7jJH9L1kIn6lOXZlJW5lJWaFHavsSlwdVT2kqofbrHY1cERVj6rqCWA3cH34pQvc9cDD3u2HgRtiLEsYOvmd/N/Bl4F3iYhEWMagpGWb7Iiq/hXw3RarXA/8sVY9AZwjIuujKV18MhS/0hy7shK30rAdthV2rLJKXG/OA77lu/+i91jSvFFVX/Zu/y/gjU3WWy0iCyLyhIgkKVh28judWkdVXwOOAW+IpHTB6nSbfK93yf7LInJBNEWLRVr20TCk4btJc+zKStyymFXV1/54duDFSQARmQN+ssFT21X1K1GXJ0ytPqv/jqqqiDQbbyavqi+JyEXAYyLytKq+EHRZTej+KzCrqq+KyK1Uz+Q3x1wm06WsxC+LXQaLWW1lshKnqlN9/ouXAP8ZwfneY85p9VlF5Nsisl5VX/Yu3y43+R8veX+PisjjwDjVXAbXdfI71dZ5UUTOBoaB70RTvEC1/ayq6v9cD1LNK0qrxOyj3cpK/Mpw7MpK3LKYVdXX/mjNqb3ZD1wsIheKyCDVxNLE9Hzy2Qvc7N2+GTjjLF5E1onIKu/2ucDPA89FVsL+dPI7+b+DG4HH1Ms2TZi2n7Uuz+I64FCE5YvaXuDXvZ5fbweO+Zrfsi4N8SvNsSsrcctiVlV/sSrunhuuLcCvUG2TfhX4NrDPe/yngEd8610LfIPqWd32uMvd42d9A/Ao8DwwB4x4j08AD3q3fw54mmrPoaeBQtzl7vIznvE7AXcB13m3VwN/BhwBisBFcZc5xM/6KeBZ77ecBzbGXeY+Puss8DJw0ttfC8BtwG3e8wJ83vsunqZJT820LVmJX2mPXVmJW1mIWWHHKpt2yxhjjDEmgaw51RhjjDEmgawSZ4wxxhiTQFaJM8YYY4xJIKvEGWOMMcYkkFXijDHGGGMSyCpxxhhjjDEJZJU4k1oiMi8iW7zbnxSR++IukzHGdMpimGknk9Numcz4BHCXiPwzqtPtXBdzeYwxphsWw0xLNtivSTUR+R/AGuCdqvp9byLs7cCwqt4Yb+mMMaY1i2GmFWtONaklIpcB64ETqvp9qE6EraqFeEtmjDHtWQwz7VglzqSSN3Hyl4DrgeMick3MRTLGmI5ZDDOdsEqcSR0ReT3wfwP/u6oeAu6mmltijDHOsxhmOmU5cSZTROQNwD3AFuBBVf1UzEUyxpiOWQwzflaJM8YYY4xJIGtONcYYY4xJIKvEGWOMMcYkkFXijDHGGGMSyCpxxhhjjDEJZJU4Y4wxxpgEskqcMcYYY0wCWSXOGGOMMSaBrBJnjDHGGJNAVokzxhhjjEmg/x8CYnk4TA0hfwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1, 2, figsize=(10, 4))\n", "plot_data(data_train, Y_train, fig=fig, ax=ax[0])\n", "plot_data(data_test, Y_test, fig=fig, ax=ax[1])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## IV. Setting the model\n", "\n", "We will prepare the quantum circuit preparation mapping input-output pairs. \n", "\n", "### 1. Set a few hyperparameters \n", "\n", "We will work on 3 qubits and in a noiseless environment. \n", "n_layers is for the number of times we will apply the parameterized circuit $U(\\theta)$.\n", "If n_measurements is specified as 0, we will use the amplitudes of the final state as the output.\n", "Otherwise, you will use the results after measurements." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of parameters to optimize: 15\n" ] } ], "source": [ "n_qubits = 3\n", "n_layers = 5\n", "n_measurements = 0\n", "\n", "# Create a register of qubits\n", "qubits = cirq.LineQubit.range(n_qubits) \n", "\n", "# Initialize simulator\n", "simulator = cirq.Simulator()\n", "\n", "# initial parameters \n", "n_params = n_qubits * n_layers\n", "\n", "np.random.seed(42)\n", "theta0 = np.random.uniform(-2*np.pi, 2*np.pi, size=n_params)\n", "\n", "print(\"Number of parameters to optimize: \",n_params)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Create the function yielding the circuit\n", "\n", "We will set the data preparation circuit to be a layer of RZ-RY-RZ operations and input the data as angles of the layer.\n", "\n", "For the parameterized circuit, we will use a layer of RX rotation followed by an entangling layer of CZs. " ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "First instance : \n", "[-0.25091976 0.90142861 -0.22618625]\n", "Divided by pi: [-0.07987024 0.28693364 -0.07199732] \n", "\n", "Initial params : \n", "[-1.57657536 5.66384302 2.91532185 1.23977908 -4.32259725 -4.32290035\n", " -5.55328511 4.60150516 1.27064871 2.61471713 -6.02451292 5.90506136\n", " 4.17759743 -3.61485335 -3.99830538]\n", "Divided by pi: [-0.50183952 1.80285723 0.92797577 0.39463394 -1.37592544 -1.37602192\n", " -1.76766555 1.46470458 0.40446005 0.83229031 -1.91766202 1.87963941\n", " 1.32977056 -1.15064356 -1.27270013] \n", "\n", "0 1 2\n", "│ │ │\n", "Rz(-0.08π) Rz(0.287π) Rz(-0.072π)\n", "│ │ │\n", "Ry(-0.08π) Ry(0.287π) Ry(-0.072π)\n", "│ │ │\n", "Rz(-0.08π) Rz(0.287π) Rz(-0.072π)\n", "│ │ │\n", "Rx(-0.502π) Rx(1.803π) Rx(0.928π)\n", "│ │ │\n", "@───────────@ │\n", "│ │ │\n", "Rx(-0.502π) @───────────@\n", "│ │ │\n", "│ Rx(0.928π) Rx(-1.376π)\n", "│ │ │\n", "@───────────@ │\n", "│ │ │\n", "Rx(-0.502π) @───────────@\n", "│ │ │\n", "│ Rx(0.395π) Rx(-1.768π)\n", "│ │ │\n", "@───────────@ │\n", "│ │ │\n", "Rx(-0.502π) @───────────@\n", "│ │ │\n", "│ Rx(-1.376π) Rx(0.404π)\n", "│ │ │\n", "@───────────@ │\n", "│ │ │\n", "Rx(-0.502π) @───────────@\n", "│ │ │\n", "│ Rx(-1.376π) Rx(-1.918π)\n", "│ │ │\n", "@───────────@ │\n", "│ │ │\n", "│ @───────────@\n", "│ │ │\n" ] } ], "source": [ "def data_preparation(x_i):\n", " \n", " # input x_i as angles of RY operations\n", " yield (cirq.ops.Rz(x_i[j]).on(qubits[j]) for j in range(len(x_i)))\n", " yield (cirq.ops.Ry(x_i[j]).on(qubits[j]) for j in range(len(x_i)))\n", " yield (cirq.ops.Rz(x_i[j]).on(qubits[j]) for j in range(len(x_i)))\n", "\n", "def pqc(params):\n", " \n", " for l in range(n_layers):\n", " yield (cirq.ops.Rx(params[(l+1)*j]).on(qubits[j]) for j in range(n_qubits))\n", " yield (cirq.ops.CZ(qubits[j],qubits[j+1]) for j in range(n_qubits-1))\n", " \n", " \n", "def qml_classifier_circuit(params, x_i):\n", " \n", " if n_measurements > 0:\n", " return cirq.Circuit(\n", " data_preparation(x_i),\n", " pqc(params),\n", " cirq.measure(*qubits, key='x'))\n", " else:\n", " return cirq.Circuit(\n", " data_preparation(x_i),\n", " pqc(params))\n", " \n", "initial_circuit = qml_classifier_circuit(theta0, data[0,:])\n", "print(\"First instance : \")\n", "print(data[0,:])\n", "print(\"Divided by pi: \",data[0,:] / np.pi,\"\\n\")\n", "\n", "print(\"Initial params : \")\n", "print(theta0)\n", "print(\"Divided by pi: \",theta0 / np.pi,\"\\n\")\n", "\n", "print(initial_circuit.to_text_diagram(transpose=True))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. Specify the output for binary classification\n", "\n", "We will do many measurements when running the circuit. To associate a probability to predict 1, we will take the probability of outputing the bitstring with only 1s. That means, if the output of the parameterized circuit is a quantum state $\\psi_{x_i,\\theta}$, we have:\n", "$$ p(x_i = 1) = |\\langle 111 | \\psi_{x_i,\\theta} \\rangle|^2 $$\n", "\n", "which, when we do many measurements, is estimated by giving the frequence of the bitstring with all bits equal 1, divided by the number of measurements." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0077321352" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def run_without_measurements(circuit):\n", " results = simulator.simulate(circuit)\n", " return abs(results.final_state[-1])\n", "\n", "def run_with_measurements(circuit):\n", " results = simulator.run(circuit, repetitions=n_measurements)\n", " counter_measurements = results.histogram(key='x')\n", " probability_being_1 = 0.\n", " if 7 in counter_measurements.keys():\n", " probability_being_1 = float(counter_measurements[7]) / n_measurements\n", " return probability_being_1\n", "\n", "def run_circuit(params, x_i):\n", " \n", " circuit = qml_classifier_circuit(params,x_i)\n", " \n", " if n_measurements > 0:\n", " probability_being_1 = run_with_measurements(circuit)\n", " else:\n", " probability_being_1 = run_without_measurements(circuit)\n", " return probability_being_1 \n", " \n", " \n", "run_circuit(theta0, data[0,:])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4. Set the loss function to optimize\n", "\n", "Our circuit will take data rows one by one. After sweeping the entire dataset, one has to define a loss function, characterizing the learning performance of our model. We will use the square loss, which will be our cost passed to a classical optimizer." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def sweep_data(params,X):\n", " \n", " probas = [run_circuit(params,X[i,:]) for i in range(X.shape[0])]\n", " return probas\n", "\n", "def compute_loss(params, X, labels):\n", " predictions = sweep_data(params,X)\n", " return mean_squared_error(labels, predictions)\n", "\n", "# will save by iterations the current cost, and accuracies\n", "tracking_cost = []\n", "\n", "\n", "def cost_to_optimize(params):\n", " cost = compute_loss(params, data_train, Y_train)\n", " tracking_cost.append(cost)\n", " return cost\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## IV. Learning\n", "\n", "Now is the time to optimize the parameters of the model for classification. We will use a simple derivative-free optimizer from scipy." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "32.46814274787903\n" ] } ], "source": [ "from time import time\n", "start_time = time()\n", "final_params = minimize(cost_to_optimize,theta0,method=\"COBYLA\",options={\"maxiter\":80})\n", "end_time = time()\n", "print(end_time-start_time)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " fun: 0.17432712074953746\n", " maxcv: 0.0\n", " message: 'Maximum number of function evaluations has been exceeded.'\n", " nfev: 80\n", " status: 2\n", " success: False\n", " x: array([-1.35375219, 6.52793509, 4.19245231, 1.28112633, -3.76285872,\n", " -4.38606526, -6.46510572, 4.54199861, 1.39333321, 2.69138756,\n", " -5.80072732, 5.84681918, 4.23858995, -3.5551252 , -3.98503786])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final_params" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## V. Performances\n", "\n", "Let us see the accuracy performance by setting the predict function, converting probabilities to binary labels." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def predict(params,X):\n", " probas = sweep_data(params,X)\n", " return np.array([1 if p > .5 else 0 for p in probas])" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3deXSc5XX48e+dXTPaF8ubbHnDGwEDwkAIBIgJTtJAerKRhWYnaYCQJr+mpO2PNOkv5zShzdKWhqzQLOAASRuXOBAgQAnBi4wNeLcseZe12tpnf35/zDujkTQjjS1ZM5q5n3N0rHnnfUdXi6+u7vO8zyPGGJRSSuUvW7YDUEopdX5poldKqTyniV4ppfKcJnqllMpzmuiVUirPObIdwGjV1dWmvr4+22EopdSMsn379k5jTE2q53Iu0dfX19PY2JjtMJRSakYRkSPpnsuodSMi60Vkv4g0icg945z3bhExItJgPa4XkSER2Wm9PXD24SullJqMCSt6EbED9wM3AseBbSKy0RizZ9R5JcDdwJZRL3HIGLNmiuJVSil1ljKp6NcCTcaYZmNMENgA3JLivH8EvgH4pzA+pZRSk5RJop8HHEt6fNw6liAilwJ1xpjfprh+kYjsEJEXROSaVB9ARG4XkUYRaezo6Mg0dqWUUhmY9PRKEbEB3wK+mOLpVmCBMeYS4AvAwyJSOvokY8wPjDENxpiGmpqUg8ZKKaXOUSaJ/gRQl/R4vnUsrgS4EHheRA4DVwIbRaTBGBMwxnQBGGO2A4eAC6YicKWUUpnJJNFvA5aJyCIRcQG3AhvjTxpjeowx1caYemNMPbAZuNkY0ygiNdZgLiKyGFgGNE/5Z6GUUiqtCRO9MSYM3Ak8BewFHjXG7BaRr4nIzRNcfi3wmojsBB4HPmOM6Z5s0Kn0+kN855kD7Dx25ny8vFJKzVgZ3TBljNkEbBp17N40516X9P6vgF9NIr6z8p1nDuJzOVhTVz5dH1IppXJe3qx1U+J2UOS009arszuVUipZ3iR6EaG21E1bXyDboSilVE7Jm0QPMKvUoxW9UkqNkleJvlYTvVJKjZFXiX52qZu2Xj+64blSSg3Lq0RfW+rBH4rS6w9nOxSllMoZeZXoZ5V6AGjX9o1SSiXkVaKvLXED0NarM2+UUiouvxK9VdGf0opeKaUS8jLR68wbpZQalleJvshlp9Tj0B69UkolyatED/G59NqjV0qpuPxM9H1a0SulVFzeJfpZpW7aejTRK6VUXN4l+tpSD+19AaJRvTtWKaUgDxP97FIP4aihezCY7VCUUion5F2iry2N3zSl7RullII8TPTDyyDozBullII8TPR6d6xSSo2Ud4m+plhbN0oplSzvEr3LYaO62KU3TSmllCXvEj3ArBKPLoOglFKWvEz0sU3CNdErpRTkbaL3cKpHWzdKKQV5muhnlXroGggQikSzHYpSSmVdXib62lI3xkBnv1b1SimVl4l+dmIDEk30SimVl4led5pSSqlhGSV6EVkvIvtFpElE7hnnvHeLiBGRhqRjX7au2y8iN01F0BOZZa13o1MslVIKHBOdICJ24H7gRuA4sE1ENhpj9ow6rwS4G9iSdGwVcCuwGpgLPCMiFxhjIlP3KYxV5XNjt4kug6CUUmRW0a8FmowxzcaYILABuCXFef8IfANIzq63ABuMMQFjTAvQZL3eeWW3CTXFbu3RK6UUmSX6ecCxpMfHrWMJInIpUGeM+e3ZXmtdf7uINIpIY0dHR0aBT6S2zKM9eqWUYgoGY0XEBnwL+OK5voYx5gfGmAZjTENNTc1kQwKgtsStSxUrpRSZJfoTQF3S4/nWsbgS4ELgeRE5DFwJbLQGZCe69rzRTcKVUiomk0S/DVgmIotExEVscHVj/EljTI8xptoYU2+MqQc2AzcbYxqt824VEbeILAKWAVun/LNIobbUzZnBEP7QeR33VUqpnDdhojfGhIE7gaeAvcCjxpjdIvI1Ebl5gmt3A48Ce4AngTvO94ybON1pSimlYiacXglgjNkEbBp17N4051436vHXga+fY3znLH7TVGvPEAuqvNP94ZVSKmfk5Z2xACtmlwDw2vGeLEeilFLZlbeJvrbUw+JqH5ubu7IdilJKZVXeJnqAKxZXsbWlm0jUZDsUpZTKmrxO9FcurqQvEGbPyd5sh6KUUlmT54m+CkDbN0qpgpbXiV779EopleeJHrRPr5RSeZ/otU+vlCp0eZ/or7L69C83d2Y5EqWUyo68T/SzSj0srvGxubk726EopVRW5H2ih9jsm20t3YQj0WyHopRS065gEn1fIMye1qnr0z/x2kn6A+Epez2llDpfCiPRL6oEpm4+/ckzQ9z58A42vdY6Ja+nlFLnU0Ek+qnu0w9YlbxW9EqpmaAgEj1MbZ9+yNrMZEg3NVFKzQAFk+jX1JXTFwhz4szQpF9rMBhL8Lp7lVJqJiiYRF/pdQHQMxSa9GslKvqgJnqlVO4rmERfWuQEoHdo8n11f1BbN0qpmaNgEn2ZleintKLXRK+UmgEKJtGXFsW2x+31T12iD4T0BiylVO4rnETvibdupiDRa+tGKTWDFEyi97rsOGwyJa0bvw7GKqVmkIJJ9CJCaZFzSls3WtErpWaCgkn0EBuQ7ZmCWTdDwVhvXufRK6VmgoJK9KUex9T06ENh619N9Eqp3FdYiX6qWjdB7dErpWaOgkv0Oo9eKVVoMkr0IrJeRPaLSJOI3JPi+c+IyOsislNE/igiq6zj9SIyZB3fKSIPTPUncDZKPc4puTN2KKQ9eqXUzOGY6AQRsQP3AzcCx4FtIrLRGLMn6bSHjTEPWOffDHwLWG89d8gYs2Zqwz43ZUVOeodCGGMQkRHPHWjro3coREN95YSvE18CIRQxhCNRHPaC+sNIKTXDZJKh1gJNxphmY0wQ2ADcknyCMSZ56yYfYKYuxKlTWuQgGIkSCI+9o/W+p/bzt//1ekavk9yy8ad4LaWUyiWZJPp5wLGkx8etYyOIyB0icgj4JvC5pKcWicgOEXlBRK6ZVLSTFL87NlWfvqMvQJ8/s7ZOcqLXAVmlVK6bsp6DMeZ+Y8wS4G+Av7cOtwILjDGXAF8AHhaR0tHXisjtItIoIo0dHR1TFdIYZUXpl0HoHggmdo6ayFAwQrzzo316pVSuyyTRnwDqkh7Pt46lswF4F4AxJmCM6bLe3w4cAi4YfYEx5gfGmAZjTENNTU2msZ+1xFLFKaZYdvUHGAxGMGbirpM/FKHcei2deaOUynWZJPptwDIRWSQiLuBWYGPyCSKyLOnhO4CD1vEaazAXEVkMLAOapyLwc5FuqWJ/KMJAMEI4aghmsNXgUChChS+2kYm2bpRSuW7CWTfGmLCI3Ak8BdiBnxhjdovI14BGY8xG4E4RWQeEgNPAR6zLrwW+JiIhIAp8xhgzNTt0n4NSj7VU8agplt0DwcT7g4EIboc97WsYYxgKRaj0umhmQCt6pVTOmzDRAxhjNgGbRh27N+n9u9Nc9yvgV5MJcCqVpqnou/qTEn0oQsU4rxEIRzGG4YpeE71SKscV1ATwdGvSdw0EEu8PTjAgG2/VxPeg9WvrRimV4woq0bscNoqc9jGDsckV/cAEiTtewccren9YE71SKrcVVKKH+FLFIxP9yB79BBW9legrfdasm6DeMKWUym0Fl+hLixxjBmO7Bs6ioreer/Bqj14pNTMUXqL3jK3ou/qTevTB8Sv6+A1SVcWuEY+VUipXFVyiL0uxJn33QJBqK3EPBDLr0Zd4nNhtovPolVI5r+ASfarNRzoHgsyv8AITV/TxxF7ktONx2LR1o5TKeQWX6MuKnPQMjq7oA9RVxhJ9phV9kctOkcuuiV4plfMKLtGXehz0BcJEo8Nr2nT3B6kpduN22M6uonfadR69UirnFV6iL3JiDPRZ0yjj69xUFbvwuR0MTJToQ8OJvsipFb1SKvcVZKKH4btj41Mrq3wuvC47g2fZutFZN0qpXFd4iX7U5iPd1l2xlT4XPpeDwQlaMfFWjdthw6MVvVJqBii4RF82ak36Tmudm6piN163PaPWTZHTjohYrRu9M1YpldsKLtGXFo1cqjhe0VdlWNEPhSIUuWLLGBfpYKxSagYovETvGd2jj1f0sR79RNsJDgWjFDmtRK/TK5VSM0DBJfoy78jWTddAEJfdRrHbgc+dQY8+qaLXHr1SaiYouERf7HIgMnIwttLnQkRis24y7NEDeJw2bd0opXJewSV6m00o9ThHTK+ML1DmczsmvDN2MBgebt1oRa+UmgEKLtGDtVSxP1a5dw3EKnoAr9VzjyTdNTvaUCiKJ2kwNhw1hDLYUFwppbKlIBN98uYjXf0BqovdAPhcsRk541Xp/mCEImfsyxbv1etNU0qpXFaQiT65ddOdXNG7Y4l7vF2mRvbo7YljSimVqwo20fcMhRgKRhgMRka0bmD8XaZGz6MH8Ot2gkqpHFaQiT6++Uh8Dn180xGv1boZby69PxhJVPLxhK8VvVIqlxVkoo/vGxvfFLzSN7JHP95c+uTWTZG2bpRSM0BBJvqyIidDoQitPX5geP/XRI8+zVz6UCRKOGoSLZ5Ej17n0iulclhBJvr4UsWHOweA2Do3MHFFH6/cPUk3TIHOulFK5bbCTPTWejctVqIfMxibpkef2F3KpT16pdTMUZCJPr5UcXPnAC5HbJ0biN0ZC+NU9EnbCCb/q60bpVQuyyjRi8h6EdkvIk0ick+K5z8jIq+LyE4R+aOIrEp67svWdftF5KapDP5cxZcqPtw5QJW1zg0kT69MU9GHUid6f1gTvVIqd02Y6EXEDtwPvA1YBXwgOZFbHjbGvMEYswb4JvAt69pVwK3AamA98B/W62VVvKJv7wskBmIhtmuU3SZptxNM9Ojjg7EureiVUrkvk4p+LdBkjGk2xgSBDcAtyScYY3qTHvqA+GIxtwAbjDEBY0wL0GS9XlbFe/QwPLUSSKxgma6i96dp3ehgrFIqlzkyOGcecCzp8XHgitEnicgdwBcAF3BD0rWbR107L8W1twO3AyxYsCCTuCclPusGhmfcxPlcjgkr+niCd9ptOGyig7FKqZw2ZYOxxpj7jTFLgL8B/v4sr/2BMabBGNNQU1MzVSGl5XHacTlin/roRD/evrGJRO8a7j4VOe0M6RIISqkclkmiPwHUJT2ebx1LZwPwrnO8dtrE2zeVxaMSvcue8awbiPXps1nRNx7u5mMPbiWsSyUrpdLIJNFvA5aJyCIRcREbXN2YfIKILEt6+A7goPX+RuBWEXGLyCJgGbB18mFPXpk186Y6qUcPsfVu0s2j96ep6LPZo3/xYCfP7e+gezCYtRiUUrltwh69MSYsIncCTwF24CfGmN0i8jWg0RizEbhTRNYBIeA08BHr2t0i8iiwBwgDdxhjcqKhHe/TV47p0dvp7E+dNAdTVfROW1Zn3XT0xxZm6/eHmVWStTCUUjksk8FYjDGbgE2jjt2b9P7d41z7deDr5xrg+ZK2deN2MNA9mPKa0UsgQPa3E+zssxL9OCtuKqUKW0HeGQvDc+lHt258LnvaCn0oFMFlzbWP82S5ddOZVNErpVQqBZvo43fHjh2MHadHH4yMaNtArF+fzUQfb930aUWvlEqjYBP90ppi5pUX4XONTNw+d2zWjTFjNwhPXos+LputG2MMnX2x8QSt6JVS6WTUo89HH3ljPR+6cmFinZs4r8tBOGoIRqK4HSOT+lAoOmLGDWQ30Q8EI4mPnW7uv1JKFWxFLyI47WM//XiFn+ru2KGkbQTjPK7s3TAVH4gF6NOKXimVRsEm+nS81lLFqSpkfyhCkXPklyyb8+jj/XnQWTdKqfQ00Y8y3i5TQ6FIYgPxuHjrJlVP/3xLrui1R6+USkcT/SjxfWNTzbxJ2bpx2ohEDaFIFhK9VdF7XXat6JVSaWmiH2Wiin70YGxig/AstG86+gLYBBZUerVHr5RKSxP9KOPtGzsUTNGjt84PZCPR9wep9LkoLXLSHwhN+8dXSs0MmuhHiSf6tBV9inn08eemW0dfgOpiNyVuh7ZulFJpaaIfxTfOrJuhUCSxfWBcNhN9Z3+AmhI3xR6HDsYqpdLSRD+KN808+kjUEAxHx1T02dw3tqMvQE2xG59W9EqpcRTsnbHpeNMMxvpDY5coTn483RW9MYbO/gDVJW4EvWFKKZWeVvSj2G2Cx2ljcFTrJtU2gpC9DcL7A2EC4SjVxS6K3Q4C4SjBsO4ypZQaSxN9Cj6XY0yPPt6aGT2PvijRupneJNth3SwV79FD6plCSimliT4Fr9s+pkcfr9i9OTIYG98Fq7rYTbE1gKx9eqVUKtqjTyFVRZ9qG0EAtzWvfroTfXJFH6/ktU+vlEpFK/oUvC77mMHYoQkGY6f7hqn48gexij62W5YuVayUSkUTfQo+99hdphL7xaZbAmGap1fGlz+o8LoSPXqdS6+USkUTfQqpKnp/mtaN027DaZcs9OgDVBW7sdsk0aPX7QSVUqlook/Bm2rWTZrWDcSq+mwk+uri2MbmJVrRK6XGoYk+Ba9r7KybdPPoITubj3T0xZY/AJJm3ejCZkqpsTTRp+BzZz6PHmLJf7p79J39QaqLXUDsF5OIVvRKqdQ00afgddnxh6JEosObiaRbAiF+bDpbN8aYxDo3ENv/ttjl0B69UiolTfQpxDcfSU7eQ6EIdpvgtMuY82M9+szvjD3WPcihjv5zjq/XHyYYiSZaN4CuYKmUSksTfQrx7QQHkyrkoWAUr9OOyNhEX+S0J2blZOLzv9zJxx7cds77zMZvlooPxkKsT693xiqlUtFEn0K8oh8IJlf04TFz6OM8Thv+cGaJvqMvwCtHT3O0e5D9bX3nFF/8ZqkxFb0meqVUChklehFZLyL7RaRJRO5J8fwXRGSPiLwmIs+KyMKk5yIistN62ziVwZ8vqbYTjG0jmDrRn81g7B/2tREv5J/Z03ZO8SXfFRtX7HboEghKqZQmTPQiYgfuB94GrAI+ICKrRp22A2gwxlwEPA58M+m5IWPMGuvt5imK+7yK7zI1GBzZo0+X6M9mHv3Te9qZV17ExfPLeHpv+znFN9y6cSWOlWhFr5RKI5OKfi3QZIxpNsYEgQ3ALcknGGOeM8YMWg83A/OnNszplajok6ZYDoWiaVs3mc6jHwpG+GNTBzeuquXGVbW8euwM7b3+s46vsz+A3SZUeIcTfbFbB2OVUqllkujnAceSHh+3jqXzCeB3SY89ItIoIptF5F2pLhCR261zGjs6OjII6fxKVPRJN035gxGKnKm/XEXOzFo3LzV14g9FWbeylnWragF4dt/ZV/UdfQGqfC5stuGB4WK3Uyt6pVRKUzoYKyIfBhqA+5IOLzTGNAAfBL4jIktGX2eM+YExpsEY01BTUzOVIZ2T1BX9BD36UGTCWTTP7G2jxO1g7aJKlteWUFdZdE59+s7+4IiBWBgejI1Gz20mj1Iqf2WS6E8AdUmP51vHRhCRdcDfATcbYwLx48aYE9a/zcDzwCWTiHdaxGfdjJheGYqkXP4AYj36qIFgJP1c+mjU8Mzedt68vAaXw4aIsG5lLX9s6hyzbeFEOvoCIwZiAUrif4VM81IMSqncl0mi3wYsE5FFIuICbgVGzJ4RkUuA7xNL8u1JxytExG29Xw1cDeyZquDPl6JERZ80GBuMpFz+AJL2jR1nO8Gdx8/Q2R/gRqtlA3DjyloC4SgvHuw8q/iSFzSL06WKlVLpTJjojTFh4E7gKWAv8KgxZreIfE1E4rNo7gOKgcdGTaNcCTSKyKvAc8A/GWNyPtG7HTbsNhlRafsnaN3A+LtMPbOnDbtNuO6CWYljly+qpMTjOKv2jTGGzv7A2NaNLmymlEojo60EjTGbgE2jjt2b9P66NNf9CXjDZALMBhHB67IzEIj13Z/b306vPzRmv9g4jzVIO97Mm2f2tnHFokrKvM7EMafdxvXLZ/GHfe1Eoga7bexdt6P1DIUIRcyIqZUwXNHrXHql1Gh6Z2waPpeDfad6+dCPtvDxhxqZX+HlfQ11Kc9N3iD89ECQ7Ue6eWr3Kfa29uIPRTjSNcCBtn7Wrawdc+26VbV0DQTZeex0RnGluisW0A3ClVJp6ebgaXjddjY3d1PhdfLVm1fzwSsW4LSn/r0Y792/53t/GtHXBxCBUk+sik+V6K9bXoPDJnzh0VepLfVMGFe8B18zukfv1h69Uio1TfRpfOyN9bT1BvjUtYspK3KOe+7F88tZv3o2FT4ni6uLWVzjo6rYzdHuQZo7+mnuGKCmxM2CKu+Ya0s9Tu66YRkvN2c2IFta5GDdylounF824rhuJ6iUSkcTfRq3XVWf8bkVPhcP3HbZmONr6sozuv7udcu4m2UZf7xUdDtBpVQ62qPPEz7t0Sul0tBEnyecdhsep00TvVJqDE30eaTY7dTplUqpMTTR5xFdqlgplYom+jwSW6pY74xVSo2kiT6P6L6xSqlUNNHnkdhSxbp6pVJqJE30eaTE7ZhwUbPn9rdz4Bw3JVdKzUya6POIb4LtBI0xfO6RHfzL7/enff6xxmMZbYuolJo5NNHnkfguU+l2umrt8dPnD7PvVOqKfvuR0/z146/x8Jaj5zNMpdQ000SfR4rdDkIRQyCcegOU/VbL5kjXIAMpBm13n+wF4Nl9Z7+9oVIqd2mizyOJ9W7SzLw5mNSb35+iT7/7ZA8AW5q76dVpmkrlDU30eWSipYr3n+rH5Yh9y/e1jk30e1p7qfK5CEcNL+zvOH+BKqWmlSb6PDLR5iMH2vq4vL6CYndsU5VkoUiUA6f6+fNL5lHpc/HMXm3fKJUvdJniPDLedoLRqOFgex8fumIh/lB0TEV/qKOfYCTKG+aXcWYoxO93nyIUiabdbEUpNXPo/+I8UuKObZCSqqI/dnoQfyjK8toSVswuYe+p3hGzc3afiFX4q+eWsm7lLHr9YRoPZ7a9oVIqt2mizyPFicHYsQOp+60plctqi1kxp5Q+f5iTPf7E83tae/E4bSyqLuaaZTW47La8bd8caOvjs7/YrvcLqIKhiT6PjDcYG78bdlltCStnlwCwr3W4T7/nZC/LZ5ditwk+t4OrllTxzN62tHPyZ7Kndp1i0+unEr/8lMp3mujzSHx6Zap9Yw+09TO/oohit4ML4oneSnTGGHaf7GH13NLE+etW1XKka5BDHf3TEPn0in9OLZ0DWY5EqemhiT6PuB02HDZJW9FfUBtL8KUeJ/MrithrVfQnzgzR6w+zak5Sol85C4Cn97RPQ+TTq8lK9M15+EtMqVQ00ecREUksg5AsFIlyqKM/kegBVswuTVT0e6w7YlclVfRzyopYPbeUZ/OsTx+NGg61xyr5Zq3oVYHQRJ9nfK6xif5w5wChiGH57OLEsZVzSmju6McfirD7ZC82gZWzS0dct25lLduPnqarPzAtsU+H1l4/Q9YgbHOHJnpVGDTR55kSz9gVLA+0xVoUoyv6qIGm9n72tPayqNpHkcs+4rprllVjDDQeyZ9plofaY1+L1XNLaekcIBrNv8FmpUbTRJ9nUu0ytb+tD5vAkprhin7FnFjS39vay56TvayaWzbmtS6cV4bDJuw8dub8Bj2N4gOxN66qZSgUoa3PP8EVSs18GSV6EVkvIvtFpElE7knx/BdEZI+IvCYiz4rIwqTnPiIiB623j0xl8GqsVD36A6f6qK/y4XEOV+z1VT7cDhtbWro5cWZoxEBsnMdpZ8WcEnYezZ9E39TeT1mRk8vrKwFt36jCMGGiFxE7cD/wNmAV8AERWTXqtB1AgzHmIuBx4JvWtZXAV4ArgLXAV0SkYurCV6MVp9h8JHnGTZzdJiyfXcLvXm8FGDG1MtmaunJeO36GSJ60OA519LOkxsfiGh+gA7KqMGRS0a8FmowxzcaYILABuCX5BGPMc8aYQevhZmC+9f5NwNPGmG5jzGngaWD91ISuUikrcnKq18+x7ti3wx+KcLhrgAtqi8ecu2J2CQPB2MDkyhQVPcCaugoGghGa2vNjKmJT+wBLZxUzu9SD12XXKZaqIGSS6OcBx5IeH7eOpfMJ4Hdnc62I3C4ijSLS2NGhy+NOxl9cVY/DJnz4x1to7/VzqKOfqCFxk1SyFdYsm1klbmpK3Clfb01dOQCvTrJP7w9FuO3HW/hTU+ekXmcyegZDdPYHWFJTjIiwqNqnN02pgjClg7Ei8mGgAbjvbK4zxvzAGNNgjGmoqamZypAKzvLZJTz08bV09AX40I+2sLm5O3a8NkWitwZk07VtABZX+yjxONgxyUT/u12tvHiwk5++fGRSrzMZ8Rul4oPSi6p9BdWj//KvX+dLj7+a7TBUFmSS6E8AdUmP51vHRhCRdcDfATcbYwJnc62aWpcuqOBHH2ngaPcgX//tHpx2ob7aN+a8lbNLEYnNrknHZhPW1JVPeubNhq2xP+yeP9DOUDA7i4nFZ9wsnRVL9Itrijl+epBAOP8XN4tEDU+8epJNr5/Km/EWlblMEv02YJmILBIRF3ArsDH5BBG5BPg+sSSffM/8U8BbRaTCGoR9q3VMnWdvXFLN9z58KTYRltQUp1xXvsLn4mcfv4JPvmnxuK+1pq6c/ad6GQym3tBkIs0d/Wxp6eaaZdX4Q1FeOJCd9tyhjn5cdhvzK4qA2F8rUQNHuwYnuHLm23eql75AmP5AWBdzK0ATJnpjTBi4k1iC3gs8aozZLSJfE5GbrdPuA4qBx0Rkp4hstK7tBv6R2C+LbcDXrGNqGtywopaffmItX715ddpz3rSsmjKvc9zXWVNXTtTA68d7zimORxuPY7cJ33j3RZR7nTy1+9Q5vc5kHWrvp77ai8P6pRefeXOoANo3W1uG/9ttP6L/BQtNRjtMGWM2AZtGHbs36f1141z7E+An5xqgmpw3Lqme9GvEB2R3HjvDFYurzuraUCTK49uPc8OKWcwtL+LGlbU8ufsUwXA0sX/tVGjv87P/VB/dA0FODwTpD4R53+V1zCrxJM451DHAyjnDYxWLrHZWIQzIbm3pZl55EeFolMYjp7ntqvpsh6SmkW4lqCZUVeymrrLonPr0f9jXTmd/gFsvjw3VrL9wNpSWqY4AABD4SURBVI9tP87LzV28+YKpGXg/1ePnxm+/MGYLxaPdg3zzPRcDEAhHONI1wJ9dNCfxfInHSU2JO++nWBpj2NrSzZuX1+APRXTnsAKkiV5lZE1dBY2HR/7J//PNR/j9njYuXVDO2vpKLllQMWa9nA1bj1Jb6k4k9auXVuNz2Xly16kpS/T/77d7CISjPPixy6mr8FLpc/Htpw+wYdtRPr/uAuaWF3Gka5CoGbkMBFAQUyybOwfoGgiytr6SwWCETa+forVniDllRdkOTU0TXetGZWRNXTmtPX7aemNrw7zU1Mm9v9nFnpO9fPfZg3zwR1u46KtP8fGHtiV+IZw8M8QLBzp472V1ib64x2nn+hWzeHrP2c3+CEeiKWfrvNTUyROvtfLZ65Zw/fJZLJ1VTKXPxaffvBhj4IcvNgPDi5nFZ9zELanx5f3dsfH+/NpFlTTUx25M16q+sGhFrzIS79PvOHqGi+aX8blHdrCkppj/vuNqwlHDK0dO83JzF49vP857HniZKxdXUlvqIWrgfQ11I15r/YWzeeK1VrYfOc3aRZUTfuzWniE+8VAj7X1+fvgXDVyyIJasAuEI//c3u1hY5eUzb14y4pr5FV5uWTOPDVuPcdcNyxJ39sYHYOMWVfvoHghyZjBIudd1zl+fXLa1pZvqYjeLqn2Eo4Yip53tR07zzovnZjs0NU20olcZWT23FKdd2Ha4m8/+4hUC4Sjf+/Bl+NwOyoqcXL9iFn/79pX88W+u5+/fsZLmjgF+s/MkVy+tYkGVd8RrXbd8Fi6HjSd3xWbfdPYH+MpvdnHDPz/PAy8cGrFp9+vHe7jl31/iaPcgboedW3+wmd++Fluf50cvttDcMcA/3Lx6xIJtcX953WL84QgPvdTCoY5+5pUX4XWNrG0WV8cq/Kmq6o0xNLX359Reu1tburliUSUigtNuY01dOY0686agaEWvMuJx2lk5p5QHX2ohauB7H7p0TBsEwOty8MlrFvPhKxfy5K5TXGz9JZCs2O3g2mXVPLmrlUqfkwdeaGYoFGH13FL+6Xf7+OmfDvPFty7H57bzV798lUqfi1/95RVUF7v49M+2c8fDr/Da8cX858uHuWl1Ldcvn5Uy5qWzSrhp1Wwe+tNhqkvcY6p5GK7wmzsGuHRBBf5QhM89soOTPUN85/2XpPwcx/PtZw7yr88e5G/fvoLbr10y8QWjNLX3U+51Ul2cekmKs3X89CAnzgzxqWsWJY411FfwH88fYiAQxufWFFAItKJXGYvPp//0tYt52xvmjHuux2nnXZfMS0xhHO2m1bM52ePnn39/gDcuqeKpz1/LxjvfxMOfuoKqYjdffOxVPvPzV1g+u4T/vuNqls8uoarYzc8/eQW3rJnL9/+3GUG4953p7xEA+Oz1S+j1h2nuGBgzEAtQV+nFYRNaOvsZCkb45H828vTeNo52DXLzv/+R/96R+Y3cT+0+xb8+e5AKr5N/+t0+/nTo7Nb1aWrv553/9kfe98DLDKTY4P1cbDsc788PT4u9bGEFkajJq30G1Pj017nK2IevXEhZkZO737Js0q/1jovmcLC9nxtX1SbWhofYvP/f3HE1T7zeyr7WXj73lmUj2jIep53vvH8NDQsrqCnxMK98/JkjF80v55pl1bx4sDNlde6021hQ6WXXiV4+/tA2Nrd0cd97LuZNS6v53CM7+Pwvd7KlpYuvvDN1eyiuqb2PL/xyJxfPL+PBj63lfd9/mbse3sH/3PUm5loxdvUHuHfjbpo7BvjJRxtGzHrxhyLc9cgOHHahpWuAf9i4m/vee3HGX890trZ0U+pxsDxpUbtLF1YgEhuQvXppZvdZnB4I8szeNt51ybyUd1mr3KbfMZWxC2pL+OJblydm0EyG1+Xgb9++ckSSj7PZhJsvnsuX1q9ImVxFhNuuqmf9hbMz+life8synHZJDCiPtqjaxwsHOtjS0sW337eG91w2n9llHh7+1BV89rolPLL1GG++7znuf66J7oHgmOt7/SFu/+l2ilx2HrjtMip9Lr5/22UEwlH+8hevEAhHeHJXK2/99v/y9O42jnYN8MEfxlYXjfvGk/vY29rLd96/hjuvX8pj24/zm52TXxZqS0s3l9dXYrdJ4lipx8ny2pKM+/QtnQP8+X+8xF8//hr/57FXdfvFGUgrepX3Lq+v5PV/uCltRb5iTgnPH+jgu7eu4c8uGp6J4rDb+NL6FVyzrIb/eL6J+57az78+e5B3rZnHijklRKKGqDE8v7+Do92DPPypKxNV+pKaYv75vRfzmZ9vZ/13XqSlc4AL55Xy8HvX0B8I8Rc/3soHfriZDbdfxesnzvDgS4f56BvrecvKWt58QQ0vNXXy9/+1i0sXVFBXGRvM3n2yhz/sbefShRVctbgKW1LyTqWjL0Bzx8CYWU8Qa9/8ZudJIlEz4pfAaFtburn9Z43YRPjA2gU8svUoFV4XX3nnKkTG//jpGGNo7hxgTplnzOB4ptcbw4SfvxqmiV4VhPHaLndcv5R3XzqfxSl6+ABXLaniqiVVHGzr48E/HebXrxznl43RxPMOm/DVW1aPmSq6/sLZ3Hn9Uh544RB/te4CPnv9kkTb4ycfvZyPPriND/1oM539QVbOKeWet62IvZ7dxndvvYS3f/dF7npkB+9rqGPDtqO8lrTW0IJKL++/vI6bVs+mpXOA7UdOs/1IN609fi6aX8alCyoIhGMxpprC2lBfwS+2HGXfqV6WzirmuX0dPLX7FG6HjYVVPuqrvHQPBvnqxj3MryziwY9ezoJKL0VOOz95qYUqn4u7RrXwAuEIu0700Hj4NK8cPY3X5WD9hbN58wU1eJx2wpEoT+4+xQ9fbOHVY2fwuey846I5vLehjoaFFRP+4hgMhnl02zF+9McW+vxhbr28jtuuWsj8Cu+41ymQXJoGBtDQ0GAaGxuzHYZSaflDEYaCEWw2wWETHHbB7Uj/iyTd7JY/NXXysYe2IQJP3PUmls4auWfA/7x6krse2QHEdgO79fI63v6GObzc3MUjW48m9hoAcNqF1XPLmFdexKvHz3D89BAARU47r37lrWPWFTrWPcg133yONXXlNHf00+sPU+lzYRPo7B9uT12xqJLv33ZZ4h6DaNTwxcde5b92nODO65fidtg41NHPoY4B9rf1EbR+uSys8tI7FOL0YAivy861y2rYdbKH46eHqK/y8qErFnKgrY/fvt7KYDDCgkovF9QWM6vUQ22Jh+oSF26HHac9NiV0X2svP918hDODIS5bWEFNsZvf74lNz33rqtlcvTT2F45NBJuAw2bD5bDe7DZCkSj+cBR/KEIoEsVpt+Fx2vE4bDjtNgLhKIFwhEA4SigSJWoAY4gaCEcNgXCEYDhKIBzF7bBR6XNR7nVR4XXidtgRAZuATYTSIicVXhdlRc6Ufy2FIlFO9fg5eWaIQDjKvIoi5pUXjVuMZEJEthtjGlI+p4leqezZdaKHYCTKpQtSb6X85K5Waks9rKkrH1PxtnQO8FJTJxfUlnDR/LIRiaKt10/j4dOUe50pB1yNMdzwLy/Q1utn/erZvOuSebxxSRUOu41ef4ijXYN0DQS5anHVmF8SoUiUT/9sO3/YF1uRfF55EYtrfKyYXcJlCytjibjETSgSZXNzF5teP8Wze9tYUOnlk9cs5sZVtYkEOBAI87tdp3hyVysnzvhp7/XTlWIcRATWrazl09cupsEa1zlxZoifvXyER7YepWcodBZf9XPntAuhSGY5UwRK3A5cDhs2iRUFoaihsz9AqrRbXezmqiVV/NsHLjmn2DTRK6XG6POHcNhsY9YnykQkamjpHGBu+bn12ccTDEc5PRgkaFXXoYihxONIzF5Kdf6ZoSAYiBqIGEM4Ek1U4MFIFJfdhsdpw+2w43YMV/D+UOx5t2P4OZfDZlXoghD768DtjP1lYLMJ4UiUM0MhTg8EOT0Ysv4CiFX/0aih1x+KraI6GKJ3aPj5cCQ2HlJb6mFuuYc5ZUW4HTZO9gxx4vQQx08PUelz8aX1K87p6zZeotcevVIFqsQz/j4E47Hb5KxvJsuUy2GjttQz8YlJ5ycvR32+Oew2qovdU3ZT23TQ6ZVKKZXnNNErpVSe00SvlFJ5ThO9UkrlOU30SimV5zTRK6VUntNEr5RSeU4TvVJK5bmcuzNWRDqAI5N4iWrg7HZ8mB65Ghfkbmy5Ghfkbmy5Ghfkbmy5GhecXWwLjTE1qZ7IuUQ/WSLSmO424GzK1bggd2PL1bggd2PL1bggd2PL1bhg6mLT1o1SSuU5TfRKKZXn8jHR/yDbAaSRq3FB7saWq3FB7saWq3FB7saWq3HBFMWWdz16pZRSI+VjRa+UUiqJJnqllMpzeZPoRWS9iOwXkSYRuSfLsfxERNpFZFfSsUoReVpEDlr/pt477vzGVSciz4nIHhHZLSJ351BsHhHZKiKvWrF91Tq+SES2WN/XX4qIa7pjs+Kwi8gOEXkix+I6LCKvi8hOEWm0juXC97NcRB4XkX0isldErsqRuJZbX6v4W6+IfD5HYvsr62d/l4g8Yv2fmJKfs7xI9CJiB+4H3gasAj4gIquyGNJDwPpRx+4BnjXGLAOetR5PtzDwRWPMKuBK4A7r65QLsQWAG4wxFwNrgPUiciXwDeDbxpilwGngE1mIDeBuYG/S41yJC+B6Y8yapPnWufD9/C7wpDFmBXAxsa9d1uMyxuy3vlZrgMuAQeC/sh2biMwDPgc0GGMuBOzArUzVz5kxZsa/AVcBTyU9/jLw5SzHVA/sSnq8H5hjvT8H2J8DX7ffADfmWmyAF3gFuILYXYGOVN/naYxnPrH//DcATwCSC3FZH/swUD3qWFa/n0AZ0II12SNX4koR51uBl3IhNmAecAyoJLbF6xPATVP1c5YXFT3DX6S449axXFJrjGm13j8F1GYzGBGpBy4BtpAjsVntkZ1AO/A0cAg4Y4wJW6dk6/v6HeBLQNR6XJUjcQEY4Pcisl1EbreOZfv7uQjoAB602l0/EhFfDsQ12q3AI9b7WY3NGHMC+GfgKNAK9ADbmaKfs3xJ9DOKif16ztq8VhEpBn4FfN4Y05v8XDZjM8ZETOxP6vnAWmBFNuJIJiJ/BrQbY7ZnO5Y03mSMuZRY2/IOEbk2+cksfT8dwKXA94wxlwADjGqF5MD/ARdwM/DY6OeyEZs1JnALsV+ScwEfY9u/5yxfEv0JoC7p8XzrWC5pE5E5ANa/7dkIQkScxJL8L4wxv86l2OKMMWeA54j9qVouIg7rqWx8X68GbhaRw8AGYu2b7+ZAXECiEsQY006s17yW7H8/jwPHjTFbrMePE0v82Y4r2duAV4wxbdbjbMe2DmgxxnQYY0LAr4n97E3Jz1m+JPptwDJrhNpF7E+yjVmOabSNwEes9z9CrD8+rUREgB8De40x38qx2GpEpNx6v4jY2MFeYgn/PdmKzRjzZWPMfGNMPbGfqz8YYz6U7bgARMQnIiXx94n1nHeR5e+nMeYUcExElluH3gLsyXZco3yA4bYNZD+2o8CVIuK1/p/Gv2ZT83OWzcGQKR7MeDtwgFhf9++yHMsjxPpsIWLVzSeI9XWfBQ4CzwCVWYjrTcT+JH0N2Gm9vT1HYrsI2GHFtgu41zq+GNgKNBH7M9udxe/rdcATuRKXFcOr1tvu+M99jnw/1wCN1vfzv4GKXIjLis0HdAFlSceyHhvwVWCf9fP/M8A9VT9nugSCUkrluXxp3SillEpDE71SSuU5TfRKKZXnNNErpVSe00SvlFJ5ThO9UkrlOU30SimV5/4/S8jrkafkxzsAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(list(range(len(tracking_cost))), tracking_cost)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy on training set: 0.5\n", "Accuracy on validation set: 0.51\n" ] } ], "source": [ "# before training\n", "\n", "print(\"Accuracy on training set: \", accuracy_score(Y_train,predict(theta0,data_train)))\n", "print(\"Accuracy on validation set: \", accuracy_score(Y_test,predict(theta0,data_test)))" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy on training set: 0.94\n", "Accuracy on validation set: 0.92\n" ] } ], "source": [ "# after training\n", "\n", "print(\"Accuracy on training set: \", accuracy_score(Y_train,predict(final_params.x,data_train)))\n", "print(\"Accuracy on validation set: \", accuracy_score(Y_test,predict(final_params.x,data_test)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You may have different results at each run. Normally, one should improve the results. There are many ways to do so (more optimization steps, better optimizer, different circuit architecture...)." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(1, 3, figsize=(10, 3))\n", "plot_data(data_test, predict(theta0,data_test), fig, axes[0])\n", "plot_data(data_test, predict(final_params.x,data_test), fig, axes[1])\n", "plot_data(data_test, Y_test, fig, axes[2])\n", "axes[0].set_title(\"Predictions with random weights\")\n", "axes[1].set_title(\"Predictions after training\")\n", "axes[2].set_title(\"True test data\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "References:\n", "\n", "https://pennylane.ai/qml/app/tutorial_data_reuploading_classifier.html\n", "\n", "https://cirq.readthedocs.io/en/stable/tutorial.html\n", "\n", "https://github.com/Qiskit/qiskit-aqua/blob/master/qiskit/aqua/components/variational_forms/ry.py" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 2 }