[404218]: / Code / Qiskit / 06 Effective Dimension kkawchak.ipynb

Download this file

1089 lines (1088 with data), 165.0 kB

{ 
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 228,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Time in seconds since beginning of run: 1681782752.844612\n",
      "Tue Apr 18 01:52:32 2023\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "seconds = time.time()\n",
    "print(\"Time in seconds since beginning of run:\", seconds)\n",
    "local_time = time.ctime(seconds)\n",
    "print(local_time)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Effective Dimension of Qiskit Neural Networks\n",
    "In this tutorial, we will take advantage of the `EffectiveDimension` and `LocalEffectiveDimension` classes to evaluate the power of Quantum Neural Network models. These are metrics based on information geometry that connect to notions such as trainability, expressibility or ability to generalize.\n",
    "\n",
    "Before diving into the code example, we will briefly explain what is the difference between these two metrics, and why are they relevant to the study of Quantum Neural Networks. More information about global effective dimension can be found in [this paper](https://arxiv.org/pdf/2011.00027.pdf), while the local effective dimension was introduced in a [later work](https://arxiv.org/abs/2112.04807)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 1. Global vs. Local Effective Dimension\n",
    "Both classical and quantum machine learning models share a common goal: being good at **generalizing**, i.e. learning insights from data and applying them on unseen data.\n",
    "\n",
    "Finding a good metric to assess this ability is a non-trivial matter. In [The Power of Quantum Neural Networks](https://arxiv.org/pdf/2011.00027.pdf), the authors introduce the **global** effective dimension as a useful indicator of how well a particular model will be able to perform on new data. In [Effective Dimension of Machine Learning Models](https://arxiv.org/pdf/2112.04807.pdf), the **local** effective dimension is proposed as a new capacity measure that bounds the generalization error of machine learning models.\n",
    "\n",
    "The key difference between global (`EffectiveDimension` class) and **local** effective dimension (`LocalEffectiveDimension` class) is actually not in the way they are computed, but in the nature of the parameter space that is analyzed. The global effective dimension incorporates the **full parameter space** of the model, and is calculated from a **large number of parameter (weight) sets**. On the other hand, the local effective dimension focuses on how well the **trained** model can generalize to new data, and how **expressive** it can be. Therefore, the local effective dimension is calculated from **a single** set of weight samples (training result). This difference is small in terms of practical implementation, but quite relevant at a conceptual level."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. The Effective Dimension Algorithm\n",
    "\n",
    "Both the global and local effective dimension algorithms use the Fisher Information matrix to provide a measure of complexity. The details on how this matrix is calculated are provided in the [reference paper](https://arxiv.org/pdf/2011.00027.pdf), but in general terms, this matrix captures how sensitive a neural network's output is to changes in the network's parameter space.\n",
    "\n",
    "In particular, this algorithm follows 4 main steps:\n",
    "\n",
    "1. **Monte Carlo simulation:** the forward and backward passes (gradients) of the neural network are computed for each pair of input and weight samples.\n",
    "2. **Fisher Matrix Computation:** these outputs and gradients are used to compute the Fisher Information Matrix.\n",
    "3. **Fisher Matrix Normalization:** averaging over all input samples and dividing by the matrix trace\n",
    "4. **Effective Dimension Calculation:** according to the formula from [*Abbas et al.*](https://arxiv.org/pdf/2011.00027.pdf)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## 3. Basic Example (SamplerQNN)\n",
    "\n",
    "This example shows how to set up a QNN model problem and run the global effective dimension algorithm. Both Qiskit `SamplerQNN` (shown in this example) and `EstimatorQNN` (shown in a later example) can be used with the `EffectiveDimension` class.\n",
    "\n",
    "We start off from the required imports and a fixed seed for the random number generator for reproducibility purposes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 229,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "# Necessary imports\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from IPython.display import clear_output\n",
    "from qiskit import QuantumCircuit\n",
    "from qiskit.algorithms.optimizers import COBYLA\n",
    "from qiskit.circuit.library import ZZFeatureMap, ZFeatureMap, RealAmplitudes\n",
    "from qiskit.utils import algorithm_globals\n",
    "from sklearn.datasets import make_classification\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "from qiskit_machine_learning.algorithms.classifiers import NeuralNetworkClassifier\n",
    "from qiskit_machine_learning.neural_networks import EffectiveDimension, LocalEffectiveDimension\n",
    "from qiskit_machine_learning.neural_networks import SamplerQNN, EstimatorQNN\n",
    "\n",
    "# set random seed\n",
    "algorithm_globals.random_seed = 42"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "source": [
    "### 3.1 Define QNN\n",
    "\n",
    "The first step to create a `SamplerQNN` is to define a parametrized feature map and ansatz. In this toy example, we will use 3 qubits, and we will define the circuit used in the `SamplerQNN` class."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 230,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 621.941x284.278 with 1 Axes>"
      ]
     },
     "execution_count": 230,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_qubits = 3\n",
    "# create a feature map\n",
    "feature_map = ZZFeatureMap(feature_dimension=num_qubits, reps=1)\n",
    "# create a variational circuit\n",
    "ansatz = RealAmplitudes(num_qubits, reps=1)\n",
    "\n",
    "# combine feature map and ansatz into a single circuit\n",
    "qc = QuantumCircuit(num_qubits)\n",
    "qc.append(feature_map, range(num_qubits))\n",
    "qc.append(ansatz, range(num_qubits))\n",
    "qc.decompose().draw(\"mpl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The parametrized circuit can then be sent together with an optional interpret map (parity in this case) to the `SamplerQNN` constructor."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 231,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# parity maps bitstrings to 0 or 1\n",
    "def parity(x):\n",
    "    return \"{:b}\".format(x).count(\"1\") % 2\n",
    "\n",
    "\n",
    "output_shape = 2  # corresponds to the number of classes, possible outcomes of the (parity) mapping."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 232,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# construct QNN\n",
    "qnn = SamplerQNN(\n",
    "    circuit=qc,\n",
    "    input_params=feature_map.parameters,\n",
    "    weight_params=ansatz.parameters,\n",
    "    interpret=parity,\n",
    "    output_shape=output_shape,\n",
    "    sparse=False,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2 Set up Effective Dimension calculation\n",
    "\n",
    "In order to compute the effective dimension of our QNN using the `EffectiveDimension` class, we need a series of sets of input samples and weights, as well as the total number of data samples available in a dataset. The `input_samples` and `weight_samples` are set in the class constructor, while the number of data samples is given during the call to the effective dimension computation, to be able to test and compare how this measure changes with different dataset sizes."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can define the number of input samples and weight samples and the class will randomly sample a corresponding array from a normal (for `input_samples`) or a uniform (for `weight_samples`) distribution. Instead of passing a number of samples we can pass an array, sampled manually."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 233,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# we can set the total number of input samples and weight samples for random selection\n",
    "num_input_samples = 14\n",
    "num_weight_samples = 10\n",
    "\n",
    "global_ed = EffectiveDimension(\n",
    "    qnn=qnn, weight_samples=num_weight_samples, input_samples=num_input_samples\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we want to test a specific set of input samples and weight samples, we can provide it directly to the `EffectiveDimension` class as shown in the following snippet:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 234,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# we can also provide user-defined samples and parameters\n",
    "input_samples = algorithm_globals.random.normal(0, 1, size=(10, qnn.num_inputs))\n",
    "weight_samples = algorithm_globals.random.uniform(0, 1, size=(10, qnn.num_weights))\n",
    "\n",
    "global_ed = EffectiveDimension(qnn=qnn, weight_samples=weight_samples, input_samples=input_samples)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The effective dimension algorithm also requires a dataset size. In this example, we will define an array of sizes to later see how this input affects the result."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 235,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# finally, we will define ranges to test different numbers of data, n\n",
    "n = [5000, 8000, 10000, 40000, 60000, 100000, 150000, 200000, 500000, 1000000]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.3 Compute Global Effective Dimension\n",
    "Let's now calculate the effective dimension of our network for the previously defined set of input samples, weights, and a dataset size of 5000."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 236,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "global_eff_dim_0 = global_ed.get_effective_dimension(dataset_size=n[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The effective dimension values will range between 0 and `d`, where `d` represents the dimension of the model, and it's practically obtained from the number of weights of the QNN. By dividing the result by `d`, we can obtain the normalized effective dimension, which correlates directly with the capacity of the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 237,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Data size: 5000, global effective dimension: 5.2723\n",
      "Number of weights: 6, normalized effective dimension: 0.8787\n"
     ]
    }
   ],
   "source": [
    "d = qnn.num_weights\n",
    "\n",
    "print(\"Data size: {}, global effective dimension: {:.4f}\".format(n[0], global_eff_dim_0))\n",
    "print(\n",
    "    \"Number of weights: {}, normalized effective dimension: {:.4f}\".format(d, global_eff_dim_0 / d)\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By calling the `EffectiveDimension` class with an array if input sizes `n`, we can monitor how the effective dimension changes with the dataset size."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 238,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [],
   "source": [
    "global_eff_dim_1 = global_ed.get_effective_dimension(dataset_size=n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 239,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Effective dimension: [5.27227634 5.31631775 5.33668784 5.44933207 5.47721785 5.5092323\n",
      " 5.53235213 5.5476252  5.59074899 5.6185936 ]\n",
      "Number of weights: 6\n"
     ]
    }
   ],
   "source": [
    "print(\"Effective dimension: {}\".format(global_eff_dim_1))\n",
    "print(\"Number of weights: {}\".format(d))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 240,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot the normalized effective dimension for the model\n",
    "plt.plot(n, np.array(global_eff_dim_1) / d)\n",
    "plt.xlabel(\"Number of data\")\n",
    "plt.ylabel(\"Normalized GLOBAL effective dimension\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 4. Local Effective Dimension Example\n",
    "As explained in the introduction, the local effective dimension algorithm only uses **one** set of weights, and it can be used to monitor how training affects the expressiveness of a neural network. The `LocalEffectiveDimension` class enforces this constraint to ensure that these calculations are conceptually separate, but the rest of the implementation is shared with `EffectiveDimension`.\n",
    "\n",
    "This example shows how to leverage the `LocalEffectiveDimension` class to analyze the effect of training on QNN expressiveness."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1 Define Dataset and QNN\n",
    "\n",
    "We start by creating a 3D binary classification dataset using `make_classification` function from scikit-learn."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 241,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "num_inputs = 3\n",
    "num_samples = 57\n",
    "\n",
    "X, y = make_classification(\n",
    "    n_samples=num_samples,\n",
    "    n_features=num_inputs,\n",
    "    n_informative=3,\n",
    "    n_redundant=0,\n",
    "    n_clusters_per_class=1,\n",
    "    class_sep=2.0,\n",
    ")\n",
    "X = MinMaxScaler().fit_transform(X)\n",
    "y = 2 * y - 1  # labels in {-1, 1}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The next step is to create a QNN, an instance of `EstimatorQNN` in our case in the same fashion we created an instance of `SamplerQNN`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 242,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "estimator_qnn = EstimatorQNN(\n",
    "    circuit=qc, input_params=feature_map.parameters, weight_params=ansatz.parameters\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.2 Train QNN\n",
    "\n",
    "We can now proceed to train the QNN. The training step may take some time, be patient. You can pass a callback to the classifier to observe how the training process is going on. We fix `initial_point` for reproducibility purposes as usual."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 243,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# callback function that draws a live plot when the .fit() method is called\n",
    "def callback_graph(weights, obj_func_eval):\n",
    "    clear_output(wait=True)\n",
    "    objective_func_vals.append(obj_func_eval)\n",
    "    plt.title(\"Objective function value against iteration\")\n",
    "    plt.xlabel(\"Iteration\")\n",
    "    plt.ylabel(\"Objective function value\")\n",
    "    plt.plot(range(len(objective_func_vals)), objective_func_vals)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 244,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# construct classifier\n",
    "initial_point = algorithm_globals.random.random(estimator_qnn.num_weights)\n",
    "\n",
    "estimator_classifier = NeuralNetworkClassifier(\n",
    "    neural_network=estimator_qnn,\n",
    "    optimizer=COBYLA(maxiter=80),\n",
    "    initial_point=initial_point,\n",
    "    callback=callback_graph,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 245,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+kAAAIjCAYAAAB/OVoZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAACErUlEQVR4nO3deXhTZdrH8V+SNt33QqFQaCmbLAKDgqCIC4qIu6OMwyjgNvriiOLKOO4juC/MqIwrqDOC2+i4orKIKMomiyh7C8hOS/c9Oe8fadKGLiRtStLm+7muXqQnJyd3chLgPvfz3I/JMAxDAAAAAADA78z+DgAAAAAAADiQpAMAAAAAECBI0gEAAAAACBAk6QAAAAAABAiSdAAAAAAAAgRJOgAAAAAAAYIkHQAAAACAAEGSDgAAAABAgCBJBwAAAAAgQJCkA0Ar9cADD8hkMunQoUNH3Tc9PV0TJ05s+aCOMHv2bJlMJmVnZx/z516xYoWGDx+uqKgomUwmrVmz5pjH4Al/nRtf8+e59ieTyaQHHnjA32FIap3nwPn3GACgBkk6AASQDRs26E9/+pM6deqksLAwpaamavz48dqwYYO/Q2vU9OnT9eGHH/o7DJfKykpddtllys3N1TPPPKM333xTXbt29Vs833//vR544AHl5eX5LQa0Pnv27NEDDzzQrAtML7zwgmbPnu2zmJqipKREDzzwgBYvXuzXOACgtTAZhmH4OwgAgPTBBx/oiiuuUGJioq655hplZGQoOztbr776qnJycjR37lxdfPHFrv0feOABPfjggzp48KCSk5MbPXZ5ebnMZrNCQ0NbJPbo6Gj9/ve/r5MM2Gw2VVZWKiws7JhWyzZu3KjjjjtOL7/8sq699tpj9rwNefLJJ3XHHXcoKytL6enpbve19Lk5VmbPnq1JkybV+xrbsrKyMoWEhCgkJMTnx165cqVOPPFEvf766x6Ntqjv+9avXz8lJyf7NUE+dOiQ2rVrp/vvv7/OqIOqqipVVVUpPDzcP8EBQADy/b8oAACvbdu2TVdeeaW6deumJUuWqF27dq77pkyZohEjRujKK6/UunXr1K1bN6+PHxYW5stwPWaxWGSxWI758x44cECSFB8ff8yf21v+OjfwjUBKLo/V962qqkp2u11Wq7XZx2qpCxwA0Jox3B0AAsATTzyhkpISvfTSS24JuiQlJyfrX//6l4qLi/X444/XeeyhQ4d0+eWXKzY2VklJSZoyZYrKysrc9qlv3nNeXp5uueUWpaWlKSwsTN27d9djjz0mu93utp/dbtdzzz2n/v37Kzw8XO3atdM555yjlStXSnLMyS0uLtacOXNkMplkMplcz3XkHNnzzjuvwYsMw4YN0wknnOC27a233tLgwYMVERGhxMRE/eEPf9CuXbsafS8nTpyokSNHSpIuu+wymUwmnXbaaZKk0047zXX7yMfUrv5mZ2fLZDLpySef1EsvvaTMzEyFhYXpxBNP1IoVK+o8fuPGjbr88svVrl07RUREqFevXrrnnnskOUY83HHHHZKkjIwM13vkfE/qOzfbt2/XZZddpsTEREVGRuqkk07Sp59+6rbP4sWLZTKZ9M477+iRRx5R586dFR4erjPPPFNbt25t9D167733ZDKZ9M0339S571//+pdMJpN+/vlnSdK6des0ceJEdevWTeHh4erQoYOuvvpq5eTkNPocUsPztZvzeazPRx99pLFjxyo1NVVhYWHKzMzUww8/LJvNVmff559/Xt26dVNERISGDBmib7/9ts7noqKiQvfdd58GDx6suLg4RUVFacSIEVq0aNFRX6NzjvXWrVs1ceJExcfHKy4uTpMmTVJJSYnbY7/66iudcsopio+PV3R0tHr16qW//vWvkhzn98QTT5QkTZo0yfW5aWzo+pHft/T0dG3YsEHffPON6/G1X6cn73nt78Kzzz7r+i788ssvHr1P2dnZrr/THnzwQVcczvesvjnpVVVVevjhh13PlZ6err/+9a8qLy932y89PV3nnXeeli5dqiFDhig8PFzdunXTG2+80eB7BACtAZcuASAAfPzxx0pPT9eIESPqvf/UU09Venp6nURNki6//HKlp6drxowZ+uGHHzRz5kwdPny40f+olpSUaOTIkdq9e7f+/Oc/q0uXLvr+++81bdo07d27V88++6xr32uuuUazZ8/WmDFjdO2116qqqkrffvutfvjhB51wwgl68803de2112rIkCG6/vrrJUmZmZn1Pu+4ceN01VVXacWKFa4ERJJ27NihH374QU888YRr2yOPPKJ7771Xl19+ua699lodPHhQ//jHP3Tqqafqp59+arBK/uc//1mdOnXS9OnTdfPNN+vEE09USkpKg+9FY/7zn/+osLBQf/7zn2UymfT444/rkksu0fbt213D09etW6cRI0YoNDRU119/vdLT07Vt2zZ9/PHHeuSRR3TJJZdo8+bNevvtt/XMM8+4piYceTHGaf/+/Ro+fLhKSkp08803KykpSXPmzNEFF1yg9957z23KgyQ9+uijMpvNuv3225Wfn6/HH39c48eP148//tjg6xo7dqyio6P1zjvvuC5oOM2bN099+/ZVv379JDkSye3bt2vSpEnq0KGDNmzYoJdeekkbNmzQDz/84JNpDN58Husze/ZsRUdHa+rUqYqOjtbChQt13333qaCgwO0z9eKLL+qmm27SiBEjdOuttyo7O1sXXXSREhIS1LlzZ9d+BQUFeuWVV3TFFVfouuuuU2FhoV599VWNHj1ay5cv18CBA4/6mi6//HJlZGRoxowZWr16tV555RW1b99ejz32mCRH/4nzzjtPxx9/vB566CGFhYVp69at+u677yRJxx13nB566CHdd999uv76611/NwwfPtzj9/XZZ5/VX/7yF0VHR7suGjm/C96+56+//rrKysp0/fXXKywsTImJiR69T+3atdOLL76oG2+8URdffLEuueQSSdLxxx/fYNzXXnut5syZo9///ve67bbb9OOPP2rGjBn69ddf9d///tdt361bt+r3v/+9rrnmGk2YMEGvvfaaJk6cqMGDB6tv374ev1cAEFAMAIBf5eXlGZKMCy+8sNH9LrjgAkOSUVBQYBiGYdx///2GJOOCCy5w2+///u//DEnG2rVrXdu6du1qTJgwwfX7ww8/bERFRRmbN292e+zdd99tWCwWY+fOnYZhGMbChQsNScbNN99cJx673e66HRUV5XZ8p9dff92QZGRlZRmGYRj5+flGWFiYcdttt7nt9/jjjxsmk8nYsWOHYRiGkZ2dbVgsFuORRx5x22/9+vVGSEhIne1HWrRokSHJePfdd922jxw50hg5cmSd/SdMmGB07drV9XtWVpYhyUhKSjJyc3Nd2z/66CNDkvHxxx+7tp166qlGTEyMK3an2u/PE0884fY+1HbkubnlllsMSca3337r2lZYWGhkZGQY6enphs1mc3uNxx13nFFeXu7a97nnnjMkGevXr6//zal2xRVXGO3btzeqqqpc2/bu3WuYzWbjoYcecm0rKSmp89i3337bkGQsWbLEte3Ic20YhiHJuP/++4/6mj39PDakvhj//Oc/G5GRkUZZWZlhGIZRXl5uJCUlGSeeeKJRWVnp2m/27NmGJLfPRVVVldt7ahiGcfjwYSMlJcW4+uqr3bYf+Rqd38sj97v44ouNpKQk1+/PPPOMIck4ePBgg69rxYoVhiTj9ddfb3Cf2uo7B3379q33M+/pe+78LsTGxhoHDhxw29fT9+ngwYMNfhac75fTmjVrDEnGtdde67bf7bffbkgyFi5c6NrWtWvXOp/DAwcO1Pt3DAC0Jgx3BwA/KywslCTFxMQ0up/z/oKCArftkydPdvv9L3/5iyTps88+a/BY7777rkaMGKGEhAQdOnTI9TNq1CjZbDYtWbJEkvT+++/LZDLp/vvvr3OMplRQY2NjNWbMGL3zzjsyavUtnTdvnk466SR16dJFkqOJnt1u1+WXX+4WX4cOHdSjR496hx23hHHjxikhIcH1u7OauX37dknSwYMHtWTJEl199dWu2J2aWmH+7LPPNGTIEJ1yyimubdHR0br++uuVnZ2tX375xW3/SZMmuc0NPjLGhowbN04HDhxwayj23nvvyW63a9y4ca5tERERrttlZWU6dOiQTjrpJEnS6tWrvX+B9fD089iQ2jEWFhbq0KFDGjFihEpKSrRx40ZJjiZsOTk5uu6669zmQI8fP97tHEuOud3O99Rutys3N1dVVVU64YQTPH7NN9xwg9vvI0aMUE5Ojuv76xwJ8tFHH3k0pN/XvH3PL7300jqjP3zxPh3J+ffW1KlT3bbfdtttklRnNFGfPn3cRiC1a9dOvXr1OurnHwACGcPdAcDPnMm3M1lvSEPJfI8ePdx+z8zMlNlsbnSt5C1btmjdunUNDrl2Nl7btm2bUlNTlZiY2Ghs3hg3bpw+/PBDLVu2TMOHD9e2bdu0atUqt+G1W7ZskWEYdV6b07HqhH5k4u1M5g4fPiypJhF2Dg33hR07dmjo0KF1th933HGu+2s/39FibMg555yjuLg4zZs3T2eeeaYkx8WSgQMHqmfPnq79cnNz9eCDD2ru3Lmuz4VTfn6+F6+sYZ5+HhuyYcMG/e1vf9PChQvrXMRyxrhjxw5JUvfu3d3uDwkJqbcb/Zw5c/TUU09p48aNqqysdG3PyMg46uuRGj8vsbGxGjdunF555RVde+21uvvuu3XmmWfqkksu0e9//3uZzS1fQ/H2PW/odTf3fTrSjh07ZDab65ynDh06KD4+3nUenY58nyXHe320zz8ABDKSdADws7i4OHXs2FHr1q1rdL9169apU6dOio2NbXQ/Tyq4drtdZ511lu68885676+dpPna+eefr8jISL3zzjsaPny43nnnHZnNZl122WVu8ZlMJn3++ef1dquOjo5u0nObTCa3Cr5TfQ3GJDXYKbu+Y/hLU2MMCwvTRRddpP/+97964YUXtH//fn333XeaPn26236XX365vv/+e91xxx0aOHCgoqOjZbfbdc455zS5Anzk+92cz2NeXp5Gjhyp2NhYPfTQQ8rMzFR4eLhWr16tu+66q0kxvvXWW5o4caIuuugi3XHHHWrfvr0sFotmzJihbdu2eXSMo52XiIgILVmyRIsWLdKnn36qL774QvPmzdMZZ5yhL7/8ssW7tHv7ntcereDki/epIZ6ORGkN31EA8BZJOgAEgPPOO08vv/yyli5d6jbM2enbb79Vdna2/vznP9e5b8uWLW5Vq61bt8putze6VnVmZqaKioo0atSoRuPKzMzU/PnzlZub22g13Zuh3VFRUTrvvPP07rvv6umnn9a8efM0YsQIpaamuj2vYRjKyMjw6QWDhISEeofBHlmd85SzU72zE3pDvHl/unbtqk2bNtXZ7hy23bVrVy8ibNy4ceM0Z84cLViwQL/++qsMw3Ab6n748GEtWLBADz74oO677z7X9i1btnh0/ISEBOXl5bltq6io0N69e922efp5rM/ixYuVk5OjDz74QKeeeqpre1ZWltt+zvdt69atOv30013bq6qqlJ2d7dbI7L333lO3bt30wQcfuJ27+qZ9NIfZbNaZZ56pM888U08//bSmT5+ue+65R4sWLdKoUaN80pSvoWM05z138vR98vbzb7fbtWXLFtfoEcnRUDEvL8+nn38ACFTMSQeAAHDHHXcoIiJCf/7zn+ssbZWbm6sbbrhBkZGRrqW8anv++efdfv/HP/4hSRozZkyDz3f55Zdr2bJlmj9/fp378vLyVFVVJckxD9UwDD344IN19qtdqYqKiqqTjDVm3Lhx2rNnj1555RWtXbvWLTGUpEsuuUQWi0UPPvhgnYqYYRgeLf9Vn8zMTG3cuFEHDx50bVu7dq2ro7a32rVrp1NPPVWvvfaadu7cWSdOp6ioKEny6D0699xztXz5ci1btsy1rbi4WC+99JLS09PVp0+fJsVan1GjRikxMVHz5s3TvHnzNGTIELcLPs4q5ZHn4Gjd1p0yMzPrzG1+6aWX6lTSPf081qe+GCsqKvTCCy+47XfCCScoKSlJL7/8stvx/v3vf9cZGl3fMX/88Ue3c9Jcubm5dbY5u8Y7lxrz5nPTkIa+m815z508fZ8iIyNdxz2ac889V1Ldz9jTTz8tybEyAQC0dVTSASAA9OjRQ3PmzNH48ePVv39/XXPNNcrIyFB2drZeffVVHTp0SG+//Xa9S5tlZWXpggsu0DnnnKNly5bprbfe0h//+EcNGDCgwee744479L///U/nnXeea7mi4uJirV+/Xu+9956ys7OVnJys008/XVdeeaVmzpypLVu2uIY4f/vttzr99NN10003SZIGDx6sr7/+Wk8//bRSU1OVkZFR77xqp3PPPVcxMTG6/fbbZbFYdOmll7rdn5mZqb///e+aNm2aa5msmJgYZWVl6b///a+uv/563X777V6/z1dffbWefvppjR49Wtdcc40OHDigWbNmqW/fvnXmMntq5syZOuWUU/S73/1O119/veu8ffrpp1qzZo0kx/sjSffcc4/+8Ic/KDQ0VOeff74rCavt7rvv1ttvv60xY8bo5ptvVmJioubMmaOsrCy9//77Pp2vHBoaqksuuURz585VcXGxnnzySbf7Y2Njdeqpp+rxxx9XZWWlOnXqpC+//LJOlboh1157rW644QZdeumlOuuss7R27VrNnz/ftQydk6efx/oMHz5cCQkJmjBhgm6++WaZTCa9+eabdS4sWK1WPfDAA/rLX/6iM844Q5dffrmys7M1e/ZsZWZmulV7zzvvPH3wwQe6+OKLNXbsWGVlZWnWrFnq06ePioqKPHrtR/PQQw9pyZIlGjt2rLp27aoDBw7ohRdeUOfOnV2jaTIzMxUfH69Zs2YpJiZGUVFRGjp0qFfzvQcPHqwXX3xRf//739W9e3e1b99eZ5xxRrPecydP36eIiAj16dNH8+bNU8+ePZWYmKh+/frV28thwIABmjBhgl566SXXVIbly5drzpw5uuiii9xGQQBAm3WMu8kDABqxbt0644orrjA6duxohIaGGh06dDCuuOKKepfTci5d9Msvvxi///3vjZiYGCMhIcG46aabjNLSUrd9j1zyyjAcy3pNmzbN6N69u2G1Wo3k5GRj+PDhxpNPPmlUVFS49quq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0759+3wSFBCsnJV0ursDAAAAwcnjJD05OVnZ2dkN3p+VlaXExERfxAQELYa7AwAAAMHN4yR99OjRuueee1RRUTd5KC8v17333qtzzjnHp8EBwSapurv74ZIK2e2Gn6MBAAAAcKx51TjuhBNOUI8ePTR58mT17t1bhmHo119/1QsvvKDy8nK9+eabLRkr0OYlRIVKkmx2QwVllYqPtPo5IgAAAADHkseV9M6dO2vZsmXq06ePpk2bposuukgXX3yx7rnnHvXp00ffffed0tLSvA7g+eefV3p6usLDwzV06FAtX7680f2da7V37NhRYWFh6tmzpz777DOvnxcIRGEhFsWEOa6dMeQdAAAACD4eV9IlKSMjQ59//rkOHz6sLVu2SJK6d+/e5Lno8+bN09SpUzVr1iwNHTpUzz77rEaPHq1Nmzapffv2dfavqKjQWWedpfbt2+u9995Tp06dtGPHDsXHxzfp+YFAlBhtVWF5lXKLK5TZzt/RAAAAADiWvErSnRISEjRkyJBmP/nTTz+t6667TpMmTZIkzZo1S59++qlee+013X333XX2f+2115Sbm6vvv/9eoaGOYcHp6enNjgMIJElRVu3IKVEOy7ABAAAAQcfj4e6+VlFRoVWrVmnUqFE1wZjNGjVqlJYtW1bvY/73v/9p2LBhmjx5slJSUtSvXz9Nnz5dNputwecpLy9XQUGB2w8QyBKrm8flFJf7ORIAAAAAx5rfkvRDhw7JZrMpJSXFbXtKSkqD661v375d7733nmw2mz777DPde++9euqpp/T3v/+9weeZMWOG4uLiXD9NmTcPHEtJzrXSqaQDAAAAQcdvSXpT2O12tW/fXi+99JIGDx6scePG6Z577tGsWbMafMy0adOUn5/v+tm1a9cxjBjwXmI0a6UDAAAAwapJc9J9ITk5WRaLRfv373fbvn//fnXo0KHex3Ts2FGhoaGyWCyubccdd5z27duniooKWa11l6sKCwtTWFiYb4MHWpCrkk6SDgAAAAQdv1XSrVarBg8erAULFri22e12LViwQMOGDav3MSeffLK2bt0qu93u2rZ582Z17Nix3gQdaI0SSdIBAACAoOXX4e5Tp07Vyy+/rDlz5ujXX3/VjTfeqOLiYle396uuukrTpk1z7X/jjTcqNzdXU6ZM0ebNm/Xpp59q+vTpmjx5sr9eAuBzziSd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ZDKZ3H569+7tup/zFFh2796tP/3pT0pKSlJERIT69++vlStXuu7n/xeBIT09vc73ymQyafLkyZL4XgUSm82me++9VxkZGYqIiFBmZqYefvhh1e6XHujfK5L0ADRv3jxNnTpV999/v1avXq0BAwZo9OjROnDggL9DC2rFxcUaMGCAnn/++Xrvf/zxxzVz5kzNmjVLP/74o6KiojR69GiVlZUd40jxzTffaPLkyfrhhx/01VdfqbKyUmeffbaKi4td+9x66636+OOP9e677+qbb77Rnj17dMkll/gx6uDUuXNnPfroo1q1apVWrlypM844QxdeeKE2bNggifMUqFasWKF//etfOv744922c74CR9++fbV3717Xz9KlS133cZ4Cx+HDh3XyyScrNDRUn3/+uX755Rc99dRTSkhIcO3D/y8Cw4oVK9y+U1999ZUk6bLLLpPE9yqQPPbYY3rxxRf1z3/+U7/++qsee+wxPf744/rHP/7h2ifgv1cGAs6QIUOMyZMnu3632WxGamqqMWPGDD9GhdokGf/9739dv9vtdqNDhw7GE0884dqWl5dnhIWFGW+//bYfIkRtBw4cMCQZ33zzjWEYjnMTGhpqvPvuu659fv31V0OSsWzZMn+FiWoJCQnGK6+8wnkKUIWFhUaPHj2Mr776yhg5cqQxZcoUwzD4XgWS+++/3xgwYEC993GeAstdd91lnHLKKQ3ez/8vAteUKVOMzMxMw263870KMGPHjjWuvvpqt22XXHKJMX78eMMwWsf3ikp6gKmoqNCqVas0atQo1zaz2axRo0Zp2bJlfowMjcnKytK+ffvczltcXJyGDh3KeQsA+fn5kqTExERJ0qpVq1RZWel2vnr37q0uXbpwvvzIZrNp7ty5Ki4u1rBhwzhPAWry5MkaO3as23mR+F4Fmi1btig1NVXdunXT+PHjtXPnTkmcp0Dzv//9TyeccIIuu+wytW/fXoMGDdLLL7/sup//XwSmiooKvfXWW7r66qtlMpn4XgWY4cOHa8GCBdq8ebMkae3atVq6dKnGjBkjqXV8r0L8HQDcHTp0SDabTSkpKW7bU1JStHHjRj9FhaPZt2+fJNV73pz3wT/sdrtuueUWnXzyyerXr58kx/myWq2Kj49325fz5R/r16/XsGHDVFZWpujoaP33v/9Vnz59tGbNGs5TgJk7d65Wr16tFStW1LmP71XgGDp0qGbPnq1evXpp7969evDBBzVixAj9/PPPnKcAs337dr344ouaOnWq/vrXv2rFihW6+eabZbVaNWHCBP5/EaA+/PBD5eXlaeLEiZL4+y/Q3H333SooKFDv3r1lsVhks9n0yCOPaPz48ZJax//bSdIBtGmTJ0/Wzz//7DYfE4GlV69eWrNmjfLz8/Xee+9pwoQJ+uabb/wdFo6wa9cuTZkyRV999ZXCw8P9HQ4a4awWSdLxxx+voUOHqmvXrnrnnXcUERHhx8hwJLvdrhNOOEHTp0+XJA0aNEg///yzZs2apQkTJvg5OjTk1Vdf1ZgxY5SamurvUFCPd955R//+97/1n//8R3379tWaNWt0yy23KDU1tdV8rxjuHmCSk5NlsVjqdIPcv3+/OnTo4KeocDTOc8N5Cyw33XSTPvnkEy1atEidO3d2be/QoYMqKiqUl5fntj/nyz+sVqu6d++uwYMHa8aMGRowYICee+45zlOAWbVqlQ4cOKDf/e53CgkJUUhIiL755hvNnDlTISEhSklJ4XwFqPj4ePXs2VNbt27lexVgOnbsqD59+rhtO+6441zTE/j/ReDZsWOHvv76a1177bWubXyvAssdd9yhu+++W3/4wx/Uv39/XXnllbr11ls1Y8YMSa3je0WSHmCsVqsGDx6sBQsWuLbZ7XYtWLBAw4YN82NkaExGRoY6dOjgdt4KCgr0448/ct78wDAM3XTTTfrvf/+rhQsXKiMjw+3+wYMHKzQ01O18bdq0STt37uR8BQC73a7y8nLOU4A588wztX79eq1Zs8b1c8IJJ2j8+PGu25yvwFRUVKRt27apY8eOfK8CzMknn1xnidDNmzera9eukvj/RSB6/fXX1b59e40dO9a1je9VYCkpKZHZ7J7mWiwW2e12Sa3ke+XvznWoa+7cuUZYWJgxe/Zs45dffjGuv/56Iz4+3ti3b5+/QwtqhYWFxk8//WT89NNPhiTj6aefNn766Sdjx44dhmEYxqOPPmrEx8cbH330kbFu3TrjwgsvNDIyMozS0lI/Rx58brzxRiMuLs5YvHixsXfvXtdPSUmJa58bbrjB6NKli7Fw4UJj5cqVxrBhw4xhw4b5MergdPfddxvffPONkZWVZaxbt864++67DZPJZHz55ZeGYXCeAl3t7u6GwfkKFLfddpuxePFiIysry/juu++MUaNGGcnJycaBAwcMw+A8BZLly5cbISEhxiOPPGJs2bLF+Pe//21ERkYab731lmsf/n8ROGw2m9GlSxfjrrvuqnMf36vAMWHCBKNTp07GJ598YmRlZRkffPCBkZycbNx5552ufQL9e0WSHqD+8Y9/GF26dDGsVqsxZMgQ44cffvB3SEFv0aJFhqQ6PxMmTDAMw7Gcw7333mukpKQYYWFhxplnnmls2rTJv0EHqfrOkyTj9ddfd+1TWlpq/N///Z+RkJBgREZGGhdffLGxd+9e/wUdpK6++mqja9euhtVqNdq1a2eceeaZrgTdMDhPge7IJJ3zFRjGjRtndOzY0bBarUanTp2McePGGVu3bnXdz3kKLB9//LHRr18/IywszOjdu7fx0ksvud3P/y8Cx/z58w1J9b7/fK8CR0FBgTFlyhSjS5cuRnh4uNGtWzfjnnvuMcrLy137BPr3ymQYhuGXEj4AAAAAAHDDnHQAAAAAAAIESToAAAAAAAGCJB0AAAAAgABBkg4AAAAAQIAgSQcAAAAAIECQpAMAAAAAECBI0gEAAAAACBAk6QAAAAAABAiSdAAA4FPp6el69tln/R0GAACtEkk6AACt2MSJE3XRRRdJkk477TTdcsstx+y5Z8+erfj4+DrbV6xYoeuvv/6YxQEAQFsS4u8AAABAYKmoqJDVam3y49u1a+fDaAAACC5U0gEAaAMmTpyob775Rs8995xMJpNMJpOys7MlST///LPGjBmj6OhopaSk6Morr9ShQ4dcjz3ttNN000036ZZbblFycrJGjx4tSXr66afVv39/RUVFKS0tTf/3f/+noqIiSdLixYs1adIk5efnu57vgQcekFR3uPvOnTt14YUXKjo6WrGxsbr88su1f/9+1/0PPPCABg4cqDfffFPp6emKi4vTH/7wBxUWFrbsmwYAQAAiSQcAoA147rnnNGzYMF133XXau3ev9u7dq7S0NOXl5emMM87QoEGDtHLlSn3xxRfav3+/Lr/8crfHz5kzR1arVd99951mzZolSTKbzZo5c6Y2bNigOXPmaOHChbrzzjslScOHD9ezzz6r2NhY1/PdfvvtdeKy2+268MILlZubq2+++UZfffWVtm/frnHjxrntt23bNn344Yf65JNP9Mknn+ibb77Ro48+2kLvFgAAgYvh7gAAtAFxcXGyWq2KjIxUhw4dXNv/+c9/atCgQZo+fbpr22uvvaa0tDRt3rxZPXv2lCT16NFDjz/+uNsxa89vT09P19///nfdcMMNeuGFF2S1WhUXFyeTyeT2fEdasGCB1q9fr6ysLKWlpUmS3njjDfXt21crVqzQiSeeKMmRzM+ePVsxMTGSpCuvvFILFizQI4880rw3BgCAVoZKOgAAbdjatWu1aNEiRUdHu3569+4tyVG9dho8eHCdx3799dc688wz1alTJ8XExOjKK69UTk6OSkpKPH7+X3/9VWlpaa4EXZL69Omj+Ph4/frrr65t6enprgRdkjp27KgDBw549VoBAGgLqKQDANCGFRUV6fzzz9djjz1W576OHTu6bkdFRbndl52drfPOO0833nijHnnkESUmJmrp0qW65pprVFFRocjISJ/GGRoa6va7yWSS3W736XMAANAakKQDANBGWK1W2Ww2t22/+93v9P777ys9PV0hIZ7/s79q1SrZ7XY99dRTMpsdA+/eeeedoz7fkY477jjt2rVLu3btclXTf/nlF+Xl5alPnz4exwMAQLBguDsAAG1Eenq6fvzxR2VnZ+vQoUOy2+2aPHmycnNzdcUVV2jFihXatm2b5s+fr0mTJjWaYHfv3l2VlZX6xz/+oe3bt+vNN990NZSr/XxFRUVasGCBDh06VO8w+FGjRql///4aP368Vq9ereXLl+uqq67SyJEjdcIJJ/j8PQAAoLUjSQcAoI24/fbbZbFY1KdPH7Vr1047d+5UamqqvvvuO9lsNp199tnq37+/brnlFsXHx7sq5PUZMGCAnn76aT322GPq16+f/v3vf2vGjBlu+wwfPlw33HCDxo0bp3bt2tVpPCc5hq1/9NFHSkhI0KmnnqpRo0apW7dumjdvns9fPwAAbYHJMAzD30EAAAAAAAAq6QAAAAAABAySdAAAAAAAAgRJOgAAAAAAAYIkHQAAAACAAEGSDgAAAABAgCBJBwAAAAAgQJCkAwAAAAAQIEjSAQAAAAAIECTpAAAAAAAECJJ0AAAAAAACBEk6AAAAAAAB4v8BMoOWBdi8rGUAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 1200x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# create empty array for callback to store evaluations of the objective function (callback)\n",
    "objective_func_vals = []\n",
    "plt.rcParams[\"figure.figsize\"] = (12, 6)\n",
    "\n",
    "# fit classifier to data\n",
    "estimator_classifier.fit(X, y)\n",
    "\n",
    "# return to default figsize\n",
    "plt.rcParams[\"figure.figsize\"] = (6, 4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The classifier can now differentiate between classes with an accuracy of:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 246,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 246,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# score classifier\n",
    "estimator_classifier.score(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.3 Compute Local Effective Dimension of trained QNN\n",
    "\n",
    "Now that we have trained our network, let's evaluate the local effective dimension based on the trained weights. To do that we access the trained weights directly from the classifier."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 247,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "normalized local effective dimensions for trained QNN:  [0.78817108 0.799816   0.80533436 0.83703744 0.84511436 0.8544592\n",
      " 0.861245   0.86574121 0.87847895 0.88672665]\n"
     ]
    }
   ],
   "source": [
    "trained_weights = estimator_classifier.weights\n",
    "\n",
    "# get Local Effective Dimension for set of trained weights\n",
    "local_ed_trained = LocalEffectiveDimension(\n",
    "    qnn=estimator_qnn, weight_samples=trained_weights, input_samples=X\n",
    ")\n",
    "\n",
    "local_eff_dim_trained = local_ed_trained.get_effective_dimension(dataset_size=n)\n",
    "\n",
    "print(\n",
    "    \"normalized local effective dimensions for trained QNN: \",\n",
    "    local_eff_dim_trained / estimator_qnn.num_weights,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.4 Compute Local Effective Dimension of untrained QNN\n",
    "\n",
    "We can compare this result with the effective dimension of the untrained network, using the `initial_point` as our weight sample:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 248,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "normalized local effective dimensions for untrained QNN:  [0.94296572 0.94645781 0.94808227 0.95703629 0.95923551 0.9617518\n",
      " 0.96356412 0.96475947 0.96812829 0.97029999]\n"
     ]
    }
   ],
   "source": [
    "# get Local Effective Dimension for set of untrained weights\n",
    "local_ed_untrained = LocalEffectiveDimension(\n",
    "    qnn=estimator_qnn, weight_samples=initial_point, input_samples=X\n",
    ")\n",
    "\n",
    "local_eff_dim_untrained = local_ed_untrained.get_effective_dimension(dataset_size=n)\n",
    "\n",
    "print(\n",
    "    \"normalized local effective dimensions for untrained QNN: \",\n",
    "    local_eff_dim_untrained / estimator_qnn.num_weights,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 4.5 Plot and analyze results\n",
    "\n",
    "If we plot the effective dimension values before and after training, we can see the following result:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 249,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": [
     "nbsphinx-thumbnail"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAikAAAFzCAYAAAD7bpkSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAABuXElEQVR4nO3deVhU1f8H8PcwMOyL7IsIimuKQCC4L4XhEqnZV1Nzy/UXVkqamiguKWouuFu5lktm7ktUkmgaqeGWKSiLoCgIKrtsM/f3BzE6sjiDMyzyfj3PPMycuffcz70Z98M5554jEgRBABEREVEto1XTARARERGVh0kKERER1UpMUoiIiKhWYpJCREREtRKTFCIiIqqVmKQQERFRrcQkhYiIiGolJilERERUK2nXdAB1lUwmw71792BsbAyRSFTT4RAREdUZgiAgOzsb9vb20NKquL2ESUoV3bt3D46OjjUdBhERUZ11584dNGzYsMLvmaRUkbGxMYCSC2xiYlLD0RAREdUdWVlZcHR0lN9LK1LjScq6devw1VdfISUlBW5ublizZg28vb3L3baoqAghISHYvn07kpOT0aJFCyxZsgS9evWSb+Ps7IzExMQy+3700UdYt24dAKB79+44deqUwvcTJkzAxo0blY67tIvHxMSESQoREVEVvGi4RI0OnN2zZw8CAwMRHByMixcvws3NDX5+fnjw4EG52wcFBeHrr7/GmjVrcP36dUycOBEDBgzApUuX5NtcuHAB9+/fl79+++03AMD//vc/hbrGjRunsN3SpUs1d6JERESkMlFNroLs4+ODdu3aYe3atQBKBqM6Ojri448/xowZM8psb29vj1mzZiEgIEBeNnDgQOjr62PHjh3lHmPy5Mk4evQobt26Jc/YunfvDnd3d4SGhlY59qysLJiamiIzM5MtKURERCpQ9h5aYy0phYWFiIqKgq+v79NgtLTg6+uLyMjIcvcpKCiAnp6eQpm+vj7OnDlT4TF27NiBDz/8sEyT0s6dO2FpaYk2bdpg5syZyMvLqzTegoICZGVlKbyIiIhIc2psTEp6ejqkUilsbGwUym1sbBAdHV3uPn5+flixYgW6du0KFxcXhIeHY//+/ZBKpeVuf/DgQWRkZGDUqFEK5UOHDoWTkxPs7e1x9epVTJ8+HTExMdi/f3+F8YaEhGDevHmqnSQRERFV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IqoFVB6TolXJpGIikQhSqfSlg6oL1D4mJes+sKIlINICpicCehqah4WIiKiGKXsPVbkl5dlHjkmNCrIAlzeB4gImKERERKjiPCml8vPzyyz4R1Vk1QIYvr+moyAiIqo1VB44K5VKsWDBAjg4OMDIyAjx8fEAgNmzZ2Pz5s1qD5CIiIjqJ5WTlIULF2Lbtm1YunQpJJKna8q0adMGmzZtUmtwREREVH+pnKR89913+OabbzBs2DCIxWJ5uZubG6Kjo9UaHBEREdVfVZrMrWnTpmXKZTIZioqK1BIUERERkcpJymuvvYY//vijTPlPP/0EDw8PtQRFREREpPLTPXPmzMHIkSORnJwMmUyG/fv3IyYmBt999x2OHj2qiRiJiIioHlK5JaVfv344cuQITpw4AUNDQ8yZMwc3btzAkSNH0LNnT03ESERERPWQyjPOUgmNrIJMRERUD2hsxtln5eTklJmBljdsIiIiUgeVu3sSEhLQt29fGBoawtTUFA0aNECDBg1gZmaGBg0aaCJGIiIiqodUbkn54IMPIAgCtmzZAhsbG4hEIk3ERURERPWcyknKlStXEBUVhRYtWmgiHiIiIiIAVejuadeuHe7cuaOJWIiIiIjkVG5J2bRpEyZOnIjk5GS0adMGOjo6Ct+3bdtWbcERERFR/aVykpKWloa4uDiMHj1aXiYSiSAIAkQiEaRSqVoDJCIiovpJ5STlww8/hIeHB3bv3s2Bs0RERKQxKicpiYmJOHz4cLmLDBIRERGpi8oDZ9944w1cuXJFE7EQERERyanckuLv748pU6bgn3/+gaura5mBs++8847agiMiIqL6S+W1e7S0Km58qU8DZ7l2DxERUdVobO2e59fqISIiItIElcekqNu6devg7OwMPT09+Pj44Pz58xVuW1RUhPnz58PFxQV6enpwc3NDWFiYwjYhISFo164djI2NYW1tjf79+yMmJkZhm+7du0MkEim8Jk6cqJHzIyIioqpRqiVl9erVGD9+PPT09LB69epKt/3kk0+UPviePXsQGBiIjRs3wsfHB6GhofDz80NMTAysra3LbB8UFIQdO3bg22+/RcuWLfHLL79gwIAB+PPPP+Hh4QEAOHXqFAICAtCuXTsUFxfjiy++wFtvvYXr16/D0NBQXte4ceMwf/58+WcDAwOl4yYiIiLNU2pMSuPGjfH333/D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\n",
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot the normalized effective dimension for the model\n",
    "plt.plot(n, np.array(local_eff_dim_trained) / estimator_qnn.num_weights, label=\"trained weights\")\n",
    "plt.plot(\n",
    "    n, np.array(local_eff_dim_untrained) / estimator_qnn.num_weights, label=\"untrained weights\"\n",
    ")\n",
    "\n",
    "plt.xlabel(\"Number of data\")\n",
    "plt.ylabel(\"Normalized LOCAL effective dimension\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In general, we should expect the value of the local effective dimension to decrease after training. This can be understood by looking back into the main goal of machine learning, which is to pick a model that is expressive enough to fit your data, but not too expressive that it overfits and performs badly on new data samples.  \n",
    "\n",
    "Certain optimizers help regularize the overfitting of a model by learning parameters, and this action of learning inherently reduces a model’s expressiveness, as measured by the local effective dimension. Following this logic, a randomly initialized parameter set will most likely produce a higher effective dimension that the final set of trained weights, because that model with that particular parameterization is “using more parameters” unnecessarily to fit the data. After training (with the implicit regularization), a trained model will not need to use so many parameters and thus have more “inactive parameters” and a lower effective dimension. \n",
    "\n",
    "We must keep in mind though that this is the general intuition, and there might be cases where a randomly selected set of weights happens to provide a lower effective dimension than the trained weights for a specific model. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 250,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<h3>Version Information</h3><table><tr><th>Qiskit Software</th><th>Version</th></tr><tr><td><code>qiskit-terra</code></td><td>0.23.3</td></tr><tr><td><code>qiskit-aer</code></td><td>0.12.0</td></tr><tr><td><code>qiskit-ibmq-provider</code></td><td>0.20.2</td></tr><tr><td><code>qiskit</code></td><td>0.42.1</td></tr><tr><td><code>qiskit-nature</code></td><td>0.5.2</td></tr><tr><td><code>qiskit-finance</code></td><td>0.3.4</td></tr><tr><td><code>qiskit-optimization</code></td><td>0.5.0</td></tr><tr><td><code>qiskit-machine-learning</code></td><td>0.5.0</td></tr><tr><th>System information</th></tr><tr><td>Python version</td><td>3.10.8</td></tr><tr><td>Python compiler</td><td>GCC 10.4.0</td></tr><tr><td>Python build</td><td>main, Nov 22 2022 08:26:04</td></tr><tr><td>OS</td><td>Linux</td></tr><tr><td>CPUs</td><td>8</td></tr><tr><td>Memory (Gb)</td><td>31.211322784423828</td></tr><tr><td colspan='2'>Tue Apr 18 01:53:26 2023 UTC</td></tr></table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div style='width: 100%; background-color:#d5d9e0;padding-left: 10px; padding-bottom: 10px; padding-right: 10px; padding-top: 5px'><h3>This code is a part of Qiskit</h3><p>&copy; Copyright IBM 2017, 2023.</p><p>This code is licensed under the Apache License, Version 2.0. You may<br>obtain a copy of this license in the LICENSE.txt file in the root directory<br> of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.<p>Any modifications or derivative works of this code must retain this<br>copyright notice, and modified files need to carry a notice indicating<br>that they have been altered from the originals.</p></div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import qiskit.tools.jupyter\n",
    "\n",
    "%qiskit_version_table\n",
    "%qiskit_copyright"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 251,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Time in seconds since beginning of run: 1681782806.4820957\n",
      "Tue Apr 18 01:53:26 2023\n"
     ]
    }
   ],
   "source": [
    "seconds = time.time()\n",
    "print(\"Time in seconds since beginning of run:\", seconds)\n",
    "local_time = time.ctime(seconds)\n",
    "print(local_time)"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Tags",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.10.8"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "00ff000b85c047ad9ec718c80854b865": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "grid_template_areas": "\n                                       \". . . . right \"\n                                        ",
       "grid_template_columns": "20% 20% 20% 20% 20%",
       "width": "100%"
      }
     },
     "1a76ec94041f437d8e8f684fdde5ab08": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "22f71ffa02674e94824f916c8e77dcea": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "margin": "0px 0px 10px 0px"
      }
     },
     "2efcad80b1484621a3859038182cc524": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "44e6ac4f3165497f86a6e2803df36829": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_ed5aa35fba6e45b1912ca5d906722d57",
       "style": "IPY_MODEL_1a76ec94041f437d8e8f684fdde5ab08",
       "value": "<h5>Backend</h5>"
      }
     },
     "479c6021ffd741e598ba3020cfdc8831": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "margin": "0px 0px 0px 37px",
       "width": "600px"
      }
     },
     "50585cb84dd74796b348623fb7fa4c77": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_ff8b7637f01c4c38ae3a21eda2253c57",
       "style": "IPY_MODEL_936be4501ea947e48a451efc75817e4c",
       "value": "<h5>Queue</h5>"
      }
     },
     "61796ffe951e46ba93bb519dc0fa1b33": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_626e3af07a1d4d898ab3bf9e92391882",
       "style": "IPY_MODEL_fc17ce0ccec24acb953546d95c0d9c6b",
       "value": "<h5>Job ID</h5>"
      }
     },
     "626e3af07a1d4d898ab3bf9e92391882": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "190px"
      }
     },
     "70dcdea04d674c2fbdbfe3006bf7a355": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ButtonModel",
      "state": {
       "button_style": "primary",
       "description": "Clear",
       "layout": "IPY_MODEL_b899286d80ab468a9112b20f4fd4493e",
       "style": "IPY_MODEL_e6962bd0aa0f47c39fab558662540fe0",
       "tooltip": null
      }
     },
     "936be4501ea947e48a451efc75817e4c": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "a664b48b92294feab5670a8dbb33d1f8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_61796ffe951e46ba93bb519dc0fa1b33",
        "IPY_MODEL_44e6ac4f3165497f86a6e2803df36829",
        "IPY_MODEL_b65821210d9d4856be85065ca6f43db8",
        "IPY_MODEL_50585cb84dd74796b348623fb7fa4c77",
        "IPY_MODEL_b389dc63dbf3440cb4fc47c4248741b0"
       ],
       "layout": "IPY_MODEL_479c6021ffd741e598ba3020cfdc8831"
      }
     },
     "aff26731dddf414ea0f02cdc925f4984": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "b281b483938a47a38a2c9b0557ad9460": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "GridBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_70dcdea04d674c2fbdbfe3006bf7a355"
       ],
       "layout": "IPY_MODEL_00ff000b85c047ad9ec718c80854b865"
      }
     },
     "b389dc63dbf3440cb4fc47c4248741b0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_2efcad80b1484621a3859038182cc524",
       "style": "IPY_MODEL_eaa209783aab44f6900647dc0232e522",
       "value": "<h5>Message</h5>"
      }
     },
     "b65821210d9d4856be85065ca6f43db8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_ce5fe57ad4a446aaaa7c5a5576dda99f",
       "style": "IPY_MODEL_d31108da903f4569a2ffbfb6eb6700c0",
       "value": "<h5>Status</h5>"
      }
     },
     "b899286d80ab468a9112b20f4fd4493e": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "grid_area": "right",
       "padding": "0px 0px 0px 0px",
       "width": "70px"
      }
     },
     "ce5fe57ad4a446aaaa7c5a5576dda99f": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "95px"
      }
     },
     "d31108da903f4569a2ffbfb6eb6700c0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "e6962bd0aa0f47c39fab558662540fe0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ButtonStyleModel",
      "state": {
       "font_family": null,
       "font_size": null,
       "font_style": null,
       "font_variant": null,
       "font_weight": null,
       "text_color": null,
       "text_decoration": null
      }
     },
     "eaa209783aab44f6900647dc0232e522": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "ed5aa35fba6e45b1912ca5d906722d57": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "145px"
      }
     },
     "fc17ce0ccec24acb953546d95c0d9c6b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "fcc816b2f8a44260886e5091f0bfdacd": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_22f71ffa02674e94824f916c8e77dcea",
       "style": "IPY_MODEL_aff26731dddf414ea0f02cdc925f4984",
       "value": "<p style='font-family: IBM Plex Sans, Arial, Helvetica, sans-serif; font-size: 20px; font-weight: medium;'>Circuit Properties</p>"
      }
     },
     "ff8b7637f01c4c38ae3a21eda2253c57": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "70px"
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}