├── Week 2
├── qnn.png
└── Machine Learning with Qiskit.ipynb
├── Week 1
├── img
│ ├── vqc.png
│ ├── qkernel.png
│ └── feature_map.png
└── data_generators.py
├── README.md
└── .gitignore
/Week 2/qnn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mostafa-Atallah2020/openHPI-QML-course/HEAD/Week 2/qnn.png
--------------------------------------------------------------------------------
/Week 1/img/vqc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mostafa-Atallah2020/openHPI-QML-course/HEAD/Week 1/img/vqc.png
--------------------------------------------------------------------------------
/Week 1/img/qkernel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mostafa-Atallah2020/openHPI-QML-course/HEAD/Week 1/img/qkernel.png
--------------------------------------------------------------------------------
/Week 1/img/feature_map.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mostafa-Atallah2020/openHPI-QML-course/HEAD/Week 1/img/feature_map.png
--------------------------------------------------------------------------------
/Week 1/data_generators.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 |
3 |
4 | def clouds(num_points=100):
5 | """
6 | Generate synthetic data for a two-class classification problem.
7 |
8 | Parameters:
9 | -----------
10 | `num_points` (`int`): Number of points to generate for each class. (default=100)
11 |
12 | Returns:
13 | --------
14 | `tuple`: A tuple of two lists, `X` and `y`, where `X` is a list of points and `y` is a list of labels for each point.
15 | """
16 | centers = [(1, 1), (-1, -1)]
17 | spreads = [0.5, 0.7]
18 | labels = [-1, 1]
19 |
20 | X = []
21 | y = []
22 |
23 | for center, spread, label in zip(centers, spreads, labels):
24 | X += np.random.multivariate_normal(
25 | center, spread * np.identity(2), num_points
26 | ).tolist()
27 | y += [label] * num_points
28 |
29 | return X, y
30 |
31 |
32 | def circle(num_points=250):
33 | """
34 | Generates a synthetic dataset of points distributed in a circle.
35 |
36 | Parameters:
37 | ------------
38 |
39 | `num_points`: `int`, the number of points in the dataset.
40 |
41 | Returns:
42 | --------
43 |
44 | `tuple`: (`points`, `labels`), where points is a 2D array of size `(num_points, 2)` and labels is a 1D array of size `num_points`.
45 | """
46 | points = 1 - 2 * np.random.random((num_points, 2))
47 | radius = 0.6
48 | labels = [1 if np.linalg.norm(point) > radius else -1 for point in points]
49 | return points, labels
50 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # openHPI-QML-course
2 |
3 | Study Notebooks for [openHPI: Quantum Machine Learning (with IBM Quantum) Course](https://open.hpi.de/courses/qc-machineLearning2023/)
4 |
5 | ## Course Contents
6 |
7 | In this course, you will:
8 |
9 | - Understand how to build both basic and advanced quantum machine learning models.
10 | - Implement classical and quantum algorithms to solve machine learning tasks with Python and Qiskit.
11 | - Learn about roadblocks and challenges of quantum machine learning.
12 | - Explore the future prospects of quantum machine learning.
13 |
14 | ## Table of Contents
15 |
16 | Week 1:
17 |
18 | - [Support Vector Machines](https://github.com/Mostafa-Atallah2020/openHPI-QML-course/blob/main/Week%201/Support%20Vector%20Machines.ipynb)
19 | - [Quantum SVM](https://github.com/Mostafa-Atallah2020/openHPI-QML-course/blob/main/Week%201/Quantum%20SVM.ipynb)
20 | - [Variational Quantum Classifier](https://github.com/Mostafa-Atallah2020/openHPI-QML-course/blob/main/Week%201/Variational%20Quantum%20Classifier.ipynb)
21 |
22 | Week 2:
23 |
24 | - [Machine Learning with Qiskit](https://github.com/Mostafa-Atallah2020/openHPI-QML-course/blob/main/Week%202/Machine%20Learning%20with%20Qiskit.ipynb)
25 |
26 | ## Course Instructors
27 |
28 | - Dr. Christa Zoufal
29 | - Julien Gacon
30 | - Dr. David Sutter
31 |
32 | ## Contact
33 |
34 | If you have any questions or need more information, you can reach me on [LinkedIn](https://www.linkedin.com/in/mostafa-atallah-540334120/) or on [Twitter](https://twitter.com/M_Ataallah)
35 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | pip-wheel-metadata/
24 | share/python-wheels/
25 | *.egg-info/
26 | .installed.cfg
27 | *.egg
28 | MANIFEST
29 |
30 | # PyInstaller
31 | # Usually these files are written by a python script from a template
32 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
33 | *.manifest
34 | *.spec
35 |
36 | # Installer logs
37 | pip-log.txt
38 | pip-delete-this-directory.txt
39 |
40 | # Unit test / coverage reports
41 | htmlcov/
42 | .tox/
43 | .nox/
44 | .coverage
45 | .coverage.*
46 | .cache
47 | nosetests.xml
48 | coverage.xml
49 | *.cover
50 | *.py,cover
51 | .hypothesis/
52 | .pytest_cache/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | target/
76 |
77 | # Jupyter Notebook
78 | .ipynb_checkpoints
79 |
80 | # IPython
81 | profile_default/
82 | ipython_config.py
83 |
84 | # pyenv
85 | .python-version
86 |
87 | # pipenv
88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
91 | # install all needed dependencies.
92 | #Pipfile.lock
93 |
94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow
95 | __pypackages__/
96 |
97 | # Celery stuff
98 | celerybeat-schedule
99 | celerybeat.pid
100 |
101 | # SageMath parsed files
102 | *.sage.py
103 |
104 | # Environments
105 | .env
106 | .venv
107 | env/
108 | venv/
109 | ENV/
110 | env.bak/
111 | venv.bak/
112 |
113 | # Spyder project settings
114 | .spyderproject
115 | .spyproject
116 |
117 | # Rope project settings
118 | .ropeproject
119 |
120 | # mkdocs documentation
121 | /site
122 |
123 | # mypy
124 | .mypy_cache/
125 | .dmypy.json
126 | dmypy.json
127 |
128 | # Pyre type checker
129 | .pyre/
130 |
131 | # pdf files
132 | *.pdf
--------------------------------------------------------------------------------
/Week 2/Machine Learning with Qiskit.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 20,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "import numpy as np\n",
10 | "import matplotlib.pyplot as plt"
11 | ]
12 | },
13 | {
14 | "attachments": {},
15 | "cell_type": "markdown",
16 | "metadata": {},
17 | "source": [
18 | "Quantum Neural Networks (QNNs) are a type of machine learning algorithms that use quantum computing to model and analyze data. They can be used for both classification and regression of data, similar to classical neural networks. The key difference between QNNs and classical neural networks is the way they process data, with QNNs relying on quantum mechanics and quantum algorithms to make predictions.\n",
19 | "\n",
20 | "In classification problems, the goal of a QNN is to predict the class label of a given input data. In regression problems, the goal is to predict a continuous output value given a set of input data. Both of these tasks can be performed by QNNs by training the network on a dataset and adjusting its parameters to minimize the difference between the predicted and actual output values.\n",
21 | "\n",
22 | "One advantage of QNNs over classical neural networks is their ability to process large amounts of data in parallel, which can lead to faster training and prediction times for certain types of problems. Additionally, some researchers believe that QNNs may have better generalization performance, meaning that they can generalize from their training data to new, unseen data better than classical neural networks.\n",
23 | "\n",
24 | "Overall, the use of QNNs in machine learning is still an active area of research, with many open questions and challenges that need to be addressed before they can be widely adopted in practical applications. However, their potential to offer new and powerful ways of analyzing and making predictions from data makes them a promising area of research for the future"
25 | ]
26 | },
27 | {
28 | "attachments": {},
29 | "cell_type": "markdown",
30 | "metadata": {},
31 | "source": [
32 | "In Qiskit, there are three types of quantum neural networks (QNNs): Circuit QNN, Opflow QNN, and Two-Layer QNN. Each type of QNN has a different architecture and is used for different applications. The Circuit QNN is a type of QNN that is built by stacking quantum gates and classical operations, while the Opflow QNN is a type of QNN that is built using quantum operations that are modeled as quantum circuits. The Two-Layer QNN is a type of QNN that is built using two quantum circuits, where the first quantum circuit is used to embed the input data into quantum states, and the second quantum circuit is used to learn the mapping between the embedded data and the target output."
33 | ]
34 | },
35 | {
36 | "attachments": {},
37 | "cell_type": "markdown",
38 | "metadata": {},
39 | "source": [
40 | "
\n",
41 | " \n",
42 | "
"
43 | ]
44 | },
45 | {
46 | "attachments": {},
47 | "cell_type": "markdown",
48 | "metadata": {},
49 | "source": [
50 | "# Regression"
51 | ]
52 | },
53 | {
54 | "cell_type": "code",
55 | "execution_count": 21,
56 | "metadata": {},
57 | "outputs": [],
58 | "source": [
59 | "def generate_waveline(num_points):\n",
60 | " \"\"\"\n",
61 | " Generates a waveform with `num_points` data points using a combination of sine functions.\n",
62 | "\n",
63 | " Parameters:\n",
64 | " ------------\n",
65 | "\n",
66 | " `num_points` (`int`): the number of data points to generate.\n",
67 | "\n",
68 | " Returns:\n",
69 | " --------\n",
70 | "\n",
71 | " `tuple`: a tuple of two arrays - `x` values and `y` values.\n",
72 | "\n",
73 | " \"\"\"\n",
74 | " x = np.linspace(0.5, 0.5 + 2 * np.pi, num_points)\n",
75 | " y = 0.3 * np.sin(x) + 0.4 * np.sin(2 * x) - 0.2 * np.sin(0.5 * x)\n",
76 | "\n",
77 | " return x.reshape((-1, 1)), y"
78 | ]
79 | },
80 | {
81 | "attachments": {},
82 | "cell_type": "markdown",
83 | "metadata": {},
84 | "source": [
85 | "This function generates a waveform by creating an array of `x` values using the numpy function `linspace`, which returns evenly spaced numbers over a specified interval. Then, it calculates the corresponding `y` values using a combination of sine functions with different frequencies and amplitudes. The final output is a tuple of two arrays - `x` values and `y` values."
86 | ]
87 | },
88 | {
89 | "cell_type": "code",
90 | "execution_count": 22,
91 | "metadata": {},
92 | "outputs": [
93 | {
94 | "data": {
95 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0YAAAKYCAYAAABXZ+jzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABBm0lEQVR4nO3df3Dc5Z0f8M9KDt7cVVpHBrEycYLjmwvoFCAG7Jj8uF6wgyCjhpk0JZx9EEJJRwUuiXMdcGcaRZc2Jj0yJSmMKUwuyY2Tkh4zQERzSgmUpGmdCFA9EyEgF6I7CEjoQGUlTGWIdvuHKgVZki3J2p/f12tmh9mvnt39CNnrfet5ns+TKhQKhQAAAEiwunIXAAAAUG6CEQAAkHiCEQAAkHiCEQAAkHiCEQAAkHiCEQAAkHiCEQAAkHiCEQAAkHiCEQAAkHiCEQAAkHglCUa33XZbnH766ZFOp2Pbtm3R19d3zPEvv/xyXHvttdHS0hJr166N3//934/vf//7pSgVAABIoDXFfoHvfve7sWfPnrj99ttj27Ztccstt8RFF10UTz31VDQ3N88b/9prr8XOnTujubk57r777jjttNPi7//+72PdunXFLhUAAEioVKFQKBTzBbZt2xbnn39+3HrrrRERkc/nY+PGjXH99dfHjTfeOG/87bffHn/xF38RTz75ZLzpTW9a9uvl8/l4/vnno6GhIVKp1AnXDwAAVKdCoRATExOxYcOGqKs79mK5ogaj1157LX7nd34n7r777rj00ktnr1955ZXx8ssvx3333TfvMZdcckk0NTXF7/zO78R9990Xp5xySvzxH/9x3HDDDVFfXz9v/JEjR+LIkSOz95977rlobW0tyvcDAABUn2effTbe+ta3HnNMUZfSvfjiizE1NRWnnnrqnOunnnpqPPnkkws+5le/+lU89NBDsWvXrvj+978fv/zlL+Nf/st/Ga+//np0dXXNG79v377o7u6ed/3ZZ5+NxsbG1flGAACAqjM+Ph4bN26MhoaG444t+h6j5crn89Hc3Bx33HFH1NfXx7nnnhvPPfdc/MVf/MWCwWjv3r2xZ8+e2fsz33xjY6NgBAAALGmLTVGD0cknnxz19fXxwgsvzLn+wgsvRDabXfAxLS0t8aY3vWnOsrkzzzwzRkZG4rXXXouTTjppzvi1a9fG2rVrV794AAAgMYrarvukk06Kc889Nx588MHZa/l8Ph588MHYvn37go9573vfG7/85S8jn8/PXvvFL34RLS0t80IRAADAaij6OUZ79uyJO++8M771rW/FE088EZ2dnXH48OG46qqrIiLiiiuuiL17986O7+zsjLGxsfj0pz8dv/jFL+K//tf/Gl/60pfi2muvLXapAABAQhV9j9Fll10W//AP/xCf//znY2RkJM4555zo7e2dbcjwzDPPzGmdt3HjxvjBD34Qn/3sZ+Oss86K0047LT796U/HDTfcUOxSAQCAhCr6OUalNj4+HplMJnK5nOYLAACQYMvJBkVfSgcAAFDpBCMAACDxBCMAACDxBCMAACDxBCMAACDxBCMAACDxBCMAACDxBCMAACDxBCMAACDxBCMAACDxBCMAACDxBCMAACDxBCMAACDxBCMAACDxBCMAACDx1pS7ACrDVL4QfUNjMToxGc0N6di6qSnq61LlLgsAAEpCMCJ6B4aju2cwhnOTs9daMuno6miN9raWMlYGAAClYSldwvUODEfngf45oSgiYiQ3GZ0H+qN3YLhMlQEAQOkIRgk2lS9Ed89gFBb42sy17p7BmMovNAIAAGqHpXQ1ZLn7hPqGxubNFL1RISKGc5PRNzQW2zevL0LFAADUkmrety4Y1YiV7BManVg8FK1kHAAAyVXt+9YtpasBK90n1NyQXtLzL3UcAADJVAv71gWjKnci+4S2bmqKlkw6FpvcTMV0yt+6qWmVqgUAoNbUyr51wajKLWef0NHq61LR1dEaETEvHM3c7+porZp1oQAAlN6JfB6tJIJRlTvRfULtbS2xf/eWyGbmLpfLZtKxf/eWqlgPCgBA+dTKvnXNF6rcauwTam9riZ2t2RV1EKnmziMAAJy4Wtm3LhhVuZl9QiO5yQXXdaZievbnePuE6utSy27JXe2dRwAAOHGr9Xm03Cylq3Ll2idUC51HAAA4cbWyb10wqgGl3idUK51HAABYHbWwb91SuhpxIvuElms5nUeWuzwPAIDqVMrPo8UgGNWQlewTWola6TwCAMDqKtXn0WKwlI5lq5XOIwAAMEMwYtlmOo8sNimaiunudJXeeQQAAGYIRixbrXQeAQCAGYIRK1ILnUcAAGCG5gsVaCpfqIpuHtXeeQQAAGYIRhWmd2A4unsG57TDbsmko6ujtSJnYaq58wgAAMywlK6C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GLEiP/7xj6OjoyM2bNgQqVQq7r333nKXxBLt27cvzj///GhoaIjm5ua49NJL46mnnip3WSzD/v3746yzzpo98Xv79u3xN3/zN+UuixW46aabIpVKxWc+85lyl8ISfeELX4hUKjXndsYZZ5S7LJbhueeei927d8f69evjzW9+c7zrXe+KRx99tNxlsQSnn376vL9/qVQqrr322lV5fsGIFTl8+HCcffbZcdttt5W7FJbpRz/6UVx77bXx05/+NB544IF4/fXX40Mf+lAcPny43KWxRG9961vjpptuisceeyweffTR+OAHPxgf+chH4vHHHy93aSzDI488Ev/pP/2nOOuss8pdCsv0B3/wBzE8PDx7+8lPflLuklii//N//k+8973vjTe96U3xN3/zNzE4OBhf+cpX4i1veUu5S2MJHnnkkTl/9x544IGIiPjYxz62Ks+/ZlWehcS5+OKL4+KLLy53GaxAb2/vnPvf/OY3o7m5OR577LH4wAc+UKaqWI6Ojo459//dv/t3sX///vjpT38af/AHf1CmqliOV155JXbt2hV33nln/Nt/+2/LXQ7LtGbNmshms+UugxX48pe/HBs3boxvfOMbs9c2bdpUxopYjlNOOWXO/Ztuuik2b94cf/iHf7gqz2/GCBIul8tFRERTU1OZK2Elpqam4q677orDhw/H9u3by10OS3TttdfGhz/84dixY0e5S2EF/vZv/zY2bNgQ73jHO2LXrl3xzDPPlLskluh73/tenHfeefGxj30smpub493vfnfceeed5S6LFXjttdfiwIED8clPfjJSqdSqPKcZI0iwfD4fn/nMZ+K9731vtLW1lbscluHnP/95bN++PSYnJ+Mf/aN/FPfcc0+0traWuyyW4K677or+/v545JFHyl0KK7Bt27b45je/Ge985ztjeHg4uru74/3vf38MDAxEQ0NDucvjOH71q1/F/v37Y8+ePfGv//W/jkceeST+9E//NE466aS48sory10ey3DvvffGyy+/HJ/4xCdW7TkFI0iwa6+9NgYGBqyPr0LvfOc749ChQ5HL5eLuu++OK6+8Mn70ox8JRxXu2WefjU9/+tPxwAMPRDqdLnc5rMAbl5GfddZZsW3btnj7298e/+W//Je4+uqry1gZS5HP5+O8886LL33pSxER8e53vzsGBgbi9ttvF4yqzNe//vW4+OKLY8OGDav2nJbSQUJdd911cf/998d//+//Pd761reWuxyW6aSTTorf+73fi3PPPTf27dsXZ599dnz1q18td1kcx2OPPRajo6OxZcuWWLNmTaxZsyZ+9KMfxde+9rVYs2ZNTE1NlbtElmndunXx+7//+/HLX/6y3KWwBC0tLfN+gXTmmWdaDlll/v7v/z5++MMfxj//5/98VZ/XjBEkTKFQiOuvvz7uueeeePjhh206rRH5fD6OHDlS7jI4jgsvvDB+/vOfz7l21VVXxRlnnBE33HBD1NfXl6kyVuqVV16Jp59+Ov7kT/6k3KWwBO9973vnHVHxi1/8It7+9reXqSJW4hvf+EY0NzfHhz/84VV9XsGIFXnllVfm/HZsaGgoDh06FE1NTfG2t72tjJVxPNdee2185zvfifvuuy8aGhpiZGQkIiIymUy8+c1vLnN1LMXevXvj4osvjre97W0xMTER3/nOd+Lhhx+OH/zgB+UujeNoaGiYt5/vd3/3d2P9+vX2+VWJP/uzP4uOjo54+9vfHs8//3x0dXVFfX19XH755eUujSX47Gc/GxdccEF86Utfin/2z/5Z9PX1xR133BF33HFHuUtjifL5fHzjG9+IK6+8MtasWd0oIxixIo8++mj80R/90ez9PXv2RETElVdeGd/85jfLVBVLsX///oiI+Mf/+B/Puf6Nb3xjVTcwUjyjo6NxxRVXxPDwcGQymTjrrLPiBz/4QezcubPcpUHN+/Wvfx2XX355vPTSS3HKKafE+973vvjpT386r40wlen888+Pe+65J/bu3Rt//ud/Hps2bYpbbrkldu3aVe7SWKIf/vCH8cwzz8QnP/nJVX/uVKFQKKz6swIAAFQRzRcAAIDEE4wAAIDEE4wAAIDEE4wAAIDEE4wAAIDEE4wAAIDEE4wAAIDEE4wAAIDEE4wAAIDEE4wAAIDEE4wAAIDE+38NTxz5R53tlQAAAABJRU5ErkJggg==",
96 | "text/plain": [
97 | ""
98 | ]
99 | },
100 | "metadata": {},
101 | "output_type": "display_data"
102 | }
103 | ],
104 | "source": [
105 | "X, y = generate_waveline(50)\n",
106 | "\n",
107 | "plt.figure(figsize=(10, 8))\n",
108 | "plt.plot(X, y.real, \"o\")\n",
109 | "plt.show()"
110 | ]
111 | },
112 | {
113 | "attachments": {},
114 | "cell_type": "markdown",
115 | "metadata": {},
116 | "source": [
117 | "This code uses the `generate_waveline` function to generate a waveform with 50 data points, and assigns the resulting `x` and `y` values to the variables `X` and `y` respectively. \n",
118 | "It will create a plot with 50 data points represented by circles, with `x` and `y` values generated by the function `generate_waveline` on the given figure size."
119 | ]
120 | },
121 | {
122 | "cell_type": "code",
123 | "execution_count": 23,
124 | "metadata": {},
125 | "outputs": [
126 | {
127 | "data": {
128 | "image/png": "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",
129 | "text/plain": [
130 | ""
131 | ]
132 | },
133 | "execution_count": 23,
134 | "metadata": {},
135 | "output_type": "execute_result"
136 | }
137 | ],
138 | "source": [
139 | "from qiskit import QuantumCircuit, Aer\n",
140 | "from qiskit.circuit import Parameter, ParameterVector\n",
141 | "\n",
142 | "reps = 3\n",
143 | "circuit = QuantumCircuit(1)\n",
144 | "x = Parameter(\"x\")\n",
145 | "theta = ParameterVector(\"th\", 3 * (reps + 1))\n",
146 | "\n",
147 | "for i in range(reps):\n",
148 | " circuit.u(theta[3 * i], theta[3 * i + 1], theta[3 * i + 2], 0)\n",
149 | " circuit.rx(x, 0)\n",
150 | "\n",
151 | "circuit.u(*theta[-3:], 0)\n",
152 | "circuit.draw(\"mpl\", style=\"iqx\", scale=2)"
153 | ]
154 | },
155 | {
156 | "attachments": {},
157 | "cell_type": "markdown",
158 | "metadata": {},
159 | "source": [
160 | "It creates a quantum circuit with 1 qubit, and creates a `Parameter` `'x'` and a `ParameterVector` `'th'` which will store `3*(reps+1)` parameters.\n",
161 | "\n",
162 | "It then enters a for loop that iterates for the number of reps, which is 3. In each iteration, it applies a unitary gate `u` to the qubit with the parameters given by `theta[3 * i]`, `theta[3 * i + 1]`, `theta[3 * i + 2]`. Then it applies a rotation gate `rx` to the qubit with parameter `'x'`.\n",
163 | "\n",
164 | "After the loop, it applies another unitary gate to the qubit with the last 3 parameters of theta.\n",
165 | "\n",
166 | "The final circuit will have 3 unitary gates with 3 parameters each, in a sequence and each one of them with a rotation gate."
167 | ]
168 | },
169 | {
170 | "cell_type": "code",
171 | "execution_count": 24,
172 | "metadata": {},
173 | "outputs": [],
174 | "source": [
175 | "from qiskit_machine_learning.neural_networks import OpflowQNN\n",
176 | "from qiskit.opflow import Z, StateFn\n",
177 | "\n",
178 | "expectation = StateFn(Z, is_measurement=True) @ StateFn(circuit)\n",
179 | "qnn = OpflowQNN(\n",
180 | " expectation,\n",
181 | " input_params=[x],\n",
182 | " weight_params=list(theta),\n",
183 | " quantum_instance=Aer.get_backend(\"statevector_simulator\"),\n",
184 | ")"
185 | ]
186 | },
187 | {
188 | "attachments": {},
189 | "cell_type": "markdown",
190 | "metadata": {},
191 | "source": [
192 | "The code defines an `expectation` variable that is equal to the expectation of the `Z` operator (a Pauli Z operator) applied to the output state of the circuit. The `StateFn` function is used to create a quantum state object representing the circuit. The `@` operator is used to represent the inner product between states. The `is_measurement` parameter set to `True`, indicates that this operator is a measurement operator.\n",
193 | "\n",
194 | "The QNN is then created by passing the expectation variable, the input parameter `'x'` and the weight parameter list `theta` to the `OpflowQNN` class. The `quantum_instance` parameter specifies the quantum backend to use for the simulation, in this case, the `'statevector_simulator'` backend from the `Aer` provider is used to simulate the quantum neural network."
195 | ]
196 | },
197 | {
198 | "cell_type": "code",
199 | "execution_count": 25,
200 | "metadata": {},
201 | "outputs": [],
202 | "source": [
203 | "loss_history = []\n",
204 | "\n",
205 | "\n",
206 | "def store_loss(weights, loss_value):\n",
207 | " \"\"\"\n",
208 | " Store the loss value during the training process of a neural network.\n",
209 | "\n",
210 | " Parameters:\n",
211 | " -----------\n",
212 | " `weights`: `array-like`\n",
213 | " The current weights of the neural network\n",
214 | " `loss_value`: `float`\n",
215 | " The current value of the loss function\n",
216 | "\n",
217 | " Returns:\n",
218 | " --------\n",
219 | " `None`\n",
220 | " \"\"\"\n",
221 | " loss_history.append(loss_value)"
222 | ]
223 | },
224 | {
225 | "attachments": {},
226 | "cell_type": "markdown",
227 | "metadata": {},
228 | "source": [
229 | "The `weights` argument is not used in this function, it could be used to keep track of the weights during the training process or to store the weights after the training process is complete.\n",
230 | "\n",
231 | "The function can be used to track the loss during the training process of a neural network, and the `loss_history` list can be plotted to visualize the training progress over time. The loss value is a metric to evaluate the performance of the network. It can be used to check whether the network is improving or not. If the loss is decreasing then it means that the network is learning and improving, otherwise, it means that the network is not learning or has reached a local minimum."
232 | ]
233 | },
234 | {
235 | "cell_type": "code",
236 | "execution_count": 26,
237 | "metadata": {},
238 | "outputs": [],
239 | "source": [
240 | "from qiskit_machine_learning.algorithms import NeuralNetworkRegressor\n",
241 | "from qiskit.algorithms.optimizers.cobyla import COBYLA\n",
242 | "\n",
243 | "regressor = NeuralNetworkRegressor(\n",
244 | " neural_network=qnn, optimizer=COBYLA(), loss=\"squared_error\", callback=store_loss\n",
245 | ")"
246 | ]
247 | },
248 | {
249 | "attachments": {},
250 | "cell_type": "markdown",
251 | "metadata": {},
252 | "source": [
253 | "This class is used to train a quantum neural network (QNN) for regression tasks.\n",
254 | "\n",
255 | "The `neural_network` argument is set to the `qnn` object created previously, which is the quantum neural network that will be trained.\n",
256 | "\n",
257 | "The `optimizer` argument is set to an instance of the `COBYLA` class. This is the optimization algorithm that will be used to adjust the weights of the QNN during training. COBYLA (Constrained Optimization BY Linear Approximations) is a type of optimization algorithm that finds the minimum of a function subject to nonlinear constraints.\n",
258 | "\n",
259 | "The `loss` argument is set to `'squared_error'`, which means that the mean squared error will be used as the loss function to evaluate the performance of the QNN during training.\n",
260 | "\n",
261 | "The `callback` argument is set to `store_loss`, which means that the `store_loss` function defined earlier will be called after each iteration of the optimization algorithm to store the current value of the loss function."
262 | ]
263 | },
264 | {
265 | "cell_type": "code",
266 | "execution_count": 27,
267 | "metadata": {},
268 | "outputs": [
269 | {
270 | "data": {
271 | "text/plain": [
272 | ""
273 | ]
274 | },
275 | "execution_count": 27,
276 | "metadata": {},
277 | "output_type": "execute_result"
278 | }
279 | ],
280 | "source": [
281 | "regressor.fit(X, y)"
282 | ]
283 | },
284 | {
285 | "attachments": {},
286 | "cell_type": "markdown",
287 | "metadata": {},
288 | "source": [
289 | "This code calls the `fit` method on the `regressor` object, which trains the quantum neural network (QNN) on the dataset specified by the `X` and `y` variables.\n",
290 | "\n",
291 | "`X` and `y` are the independent and dependent variables of the dataset respectively. The fit method takes these variables as input and uses them to train the QNN. The method adjusts the weights of the QNN using the optimization algorithm specified in the `optimizer` argument of the `NeuralNetworkRegressor` class. It also uses the loss function specified in the `loss` argument to evaluate the performance of the QNN during training.\n",
292 | "\n",
293 | "The training process stops when the optimization algorithm converges to a minimum of the loss function or when the maximum number of iterations is reached.\n",
294 | "\n",
295 | "It's also worth noting that the `fit` method can take additional arguments such as `batch_size` and `epochs` to control the training process. The `batch_size` argument is used to specify the number of samples used in each iteration of the optimization algorithm and the `epochs` argument is used to specify the number of times the optimization algorithm is run over the entire dataset."
296 | ]
297 | },
298 | {
299 | "cell_type": "code",
300 | "execution_count": 28,
301 | "metadata": {},
302 | "outputs": [],
303 | "source": [
304 | "y_hat = regressor.predict(X)"
305 | ]
306 | },
307 | {
308 | "attachments": {},
309 | "cell_type": "markdown",
310 | "metadata": {},
311 | "source": [
312 | "This code calls the `predict` method on the regressor object, which uses the trained quantum neural network (QNN) to make predictions on the input dataset specified by the `X` variable.\n",
313 | "\n",
314 | "The `predict` method takes the input dataset as an argument, and the QNN uses this data to make predictions on the dependent variable. The method returns an array of predictions, which in this case is assigned to the variable `y_hat`.\n",
315 | "\n",
316 | "It's worth noting that the predict method can also take an optional argument `batch_size` that is used to specify the number of samples used in each iteration of the prediction process."
317 | ]
318 | },
319 | {
320 | "cell_type": "code",
321 | "execution_count": 29,
322 | "metadata": {},
323 | "outputs": [
324 | {
325 | "data": {
326 | "image/png": "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Dhw4oNtvv13p6elKTk7WpEmT9M4770S6rJgyduzYbl/LhmHovvvuO6vnJazGmcOHD2vy5Ml65plnIl1KzPrzn/+s++67T2+//bY2b96s9vZ2XX/99Tp8+HCkS4sZ559/vpYvX653331X77zzjv7hH/5BX//61/Xhhx9GurSYtX37dv2f//N/dOmll0a6lJh0ySWXqLa2tvPjzTffjHRJMeWLL77QjBkzlJCQoP/+7/9WVVWVfvrTn+rcc8+NdGkxZfv27QFfx5s3b5Yk3XLLLWf1vEOCURyixw033KAbbrgh0mXEtPLy8oDHL730kjIyMvTuu+/qmmuuiVBVsaWgoCDg8b/9279p9erVevvtt3XJJZdEqKrY1draqrlz5+r555/Xj3/840iXE5OGDBkit9sd6TJi1ooVK5SVlaWf//znncfGjRsXwYpi08iRIwMeL1++XNnZ2frqV796Vs9LzyoQYs3NzZKktLS0CFcSm3w+n371q1/p8OHDysvLi3Q5Mem+++7TTTfdpFmzZkW6lJj1t7/9TR6PR+PHj9fcuXP12WefRbqkmFJWVqapU6fqlltuUUZGhi6//HI9//zzkS4rph0/flxr167VPffcI8Mwzuq56FkFQsg0TS1cuFAzZszQxIkTI11OTNm5c6fy8vLU1tam4cOH69VXX1VOTk6ky4o5v/rVr7Rjxw5t37490qXErGnTpumll17SRRddpNraWpWUlOjqq6/Wrl27lJKSEunyYsKnn36q1atXa9GiRXrkkUe0fft2LViwQEOHDtWdd94Z6fJi0oYNG3To0CHdddddZ/1chFUghO677z7t2rWL8WchcNFFF+n9999Xc3OzXnnlFd15553685//TGANov379+vBBx/U5s2blZSUFOlyYtbpQ7MuvfRSTZs2TWPGjNH69es1b968CFYWO0zT1NSpU/Xkk09Kki6//HLt2rVLa9asIayGyAsvvKAbbrhBHo/nrJ+LYQBAiNx///363e9+p//3//6fzj///EiXE3OGDh2qCy+8UFdccYWWLVumyZMn6+mnn450WTHl3XffVUNDg6ZMmaIhQ4ZoyJAh+vOf/6xVq1ZpyJAh8vl8kS4xJo0YMUJf/vKX9cknn0S6lJiRmZnZ7Q/Ziy++mOEWIbJv3z796U9/0ne+852gPB89q0CQWZalBx54QK+++qq2bNnCIP4wMU1Tx44di3QZMWXmzJnauXNnwLG7775bEyZM0MMPPyyn0xmhymJba2urqqurdccdd0S6lJgxY8aMbksI/vWvf9WYMWMiVFFs+/nPf66MjAzddNNNQXk+wmqcaW1tDfhrfc+ePXr//feVlpamCy64IIKVxY777rtP69at029/+1ulpKSorq5OkpSamqrk5OQIVxcblixZohtuuEEXXHCBWlpatG7dOm3ZskWbNm2KdGkxJSUlpdtY63POOUfp6emMwQ6if/7nf1ZBQYHGjBmjmpoaFRcXy+l06tZbb410aTHjhz/8oaZPn64nn3xSc+bMUWVlpZ577jk999xzkS4t5pimqZ///Oe68847NWRIcGImYTXOvPPOO/ra177W+XjRokWSpDvvvFMvvfRShKqKLatXr5YkXXvttQHHf/7znwdloDmkhoYGFRUVqba2Vqmpqbr00ku1adMmXXfddZEuDRiwv//977r11lvV2NiokSNH6itf+YrefvvtbssAYfCuvPJKvfrqq1qyZImWLl2qcePGaeXKlZo7d26kS4s5f/rTn/TZZ5/pnnvuCdpzGpZlWUF7NgAAACCImGAFAAAA2yKsAgAAwLYIqwAAALAtwioAAABsi7AKAAAA2yKsAgAAwLYIqwAAALAtwioAAABsi7AKAAAA2yKsAgAAwLYIqwAAALCt/w8dqcVd5VbKVQAAAABJRU5ErkJggg==",
327 | "text/plain": [
328 | ""
329 | ]
330 | },
331 | "metadata": {},
332 | "output_type": "display_data"
333 | }
334 | ],
335 | "source": [
336 | "plt.figure(figsize=(8, 6))\n",
337 | "plt.plot(X, y, \"o\", label=\"data\")\n",
338 | "plt.plot(X, y_hat, \"o\", label=\"fit\")\n",
339 | "plt.legend(loc=\"best\")\n",
340 | "plt.show()"
341 | ]
342 | },
343 | {
344 | "attachments": {},
345 | "cell_type": "markdown",
346 | "metadata": {},
347 | "source": [
348 | "This code will display a graph that plots the input data points and the predictions made by the QNN on the same graph, allowing you to compare the two and see how well the QNN has fit the data."
349 | ]
350 | },
351 | {
352 | "cell_type": "code",
353 | "execution_count": 30,
354 | "metadata": {},
355 | "outputs": [
356 | {
357 | "data": {
358 | "image/png": "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NbrkXQAAAN8ReP0AM7gAAACNh8DrB879ZGESMQAAgK8IvAAAAAhqBF4/wAwuAABA4yHw+oFzlzQ0yTAAAACCEoHXDxBoAQAAGg+B1y/waGEAAIDGQuD1Azx4AgAAoPH4FHgXLlyof/3rX+7PDz30kNq0aaNBgwbpf//7X4MNrrkgzwIAADQenwLv008/rZYtW0qSCgsLlZubq1mzZik6Olq///3v691fbm6uEhMTFRYWptTUVK1Zs6bGtvPnz9eQIUPUtm1btW3bVunp6dXaG4ahqVOnKi4uTi1btlR6erq2bt1a73E1lXPO8DbNMAAAAIKST4F3165d6tatmyRp2bJluummm3T77bcrJydHn3zySb36Wrp0qbKyspSdna3169erX79+ysjI0P79+722Lygo0JgxY/TRRx+psLBQCQkJuvrqq7Vnzx53m1mzZumFF17QvHnztHr1arVq1UoZGRn68ccffTndRkeNLgAAQOPxKfBGRETo0KFDkqQPPvhAV111lSQpLCxMx44dq1dfs2fP1oQJE5SZmalevXpp3rx5Cg8P14IFC7y2f+ONN3TXXXcpOTlZPXr00MsvvyyXy6X8/HxJJ2d358yZo8cff1wjRoxQ37599dprr2nv3r1atmyZL6fb6M5dw0sgBgAA8JVPgfeqq67Sbbfdpttuu03ffvuthg8fLknatGmTEhMT69xPVVWV1q1bp/T09NMDslqVnp6uwsLCOvVx9OhRHT9+XO3atZMk7dixQyUlJR59RkVFKTU1tcY+Kysr5XA4PF7+hLgLAADgO58Cb25urtLS0nTgwAH94x//UPv27SVJ69at05gxY+rcz8GDB+V0OhUTE+OxPSYmRiUlJXXq4+GHH1Z8fLw74J46rj595uTkKCoqyv1KSEio8zk0BCZwAQAAGk+ILwe1adNGL730UrXtTzzxxHkPqD5mzJihJUuWqKCgQGFhYT73M3nyZGVlZbk/OxyOJg2956zhJRADAAD4zKcZ3ry8PK1cudL9OTc3V8nJyfrtb3+rH374oc79REdHy2azqbS01GN7aWmpYmNjaz322Wef1YwZM/TBBx+ob9++7u2njqtPn3a7XZGRkR6vpsQqDQAAAI3Hp8A7adIkd53rxo0b9cADD2j48OHasWOHx0zpuYSGhqp///7uG84kuW9AS0tLq/G4WbNmafr06crL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unVrdezYUSNHjtSWLVs82vz444+6++671b59e0VEROimm25SaWmpR5vi4mJde+21Cg8PV8eOHTVp0iSdOHGiKU8F9TBjxgxZLBbdf//97m1c5+CwZ88e/b//9//Uvn17tWzZUn369NHnn3/u3m8YhqZOnaq4uDi1bNlS6enp2rp1q0cf33//vcaOHavIyEi1adNGt956q8rLy5v6VOCF0+nUlClTlJSUpJYtW6pr166aPn26zrx/n2scpAyYasmSJUZoaKixYMECY9OmTcaECROMNm3aGKWlpWYPDXWQkZFhvPLKK8ZXX31lFBUVGcOHDzc6d+5slJeXu9vccccdRkJCgpGfn298/vnnxs9//nNj0KBB7v0nTpwwevfubaSnpxtffPGFsXz5ciM6OtqYPHmyGaeEc1izZo2RmJho9O3b17jvvvvc27nOge/77783LrzwQuOWW24xVq9ebXz33XfGv//9b2Pbtm3uNjNmzDCioqKMZcuWGV9++aVxww03GElJScaxY8fcbYYNG2b069fPWLVqlfHJJ58Y3bp1M8aMGWPGKeEsTz31lNG+fXvjvffeM3bs2GG8+eabRkREhPH888+723CNgxOB12QDBw407r77bvdnp9NpxMfHGzk5OSaOCr7av3+/Icn4+OOPDcMwjMOHDxstWrQw3nzzTXebzZs3G5KMwsJCwzAMY/ny5YbVajVKSkrcbebOnWtERkYalZWVTXsCqNWRI0eM7t27GytWrDCGDh3qDrxc5+Dw8MMPG5dddlmN+10ulxEbG2s888wz7m2HDx827Ha78de//tUwDMP4+uuvDUnG2rVr3W3ef/99w2KxGHv27Gm8waNOrr32WuN3v/udx7Zf/vKXxtixYw3D4BoHM0oaTFRVVaV169YpPT3dvc1qtSo9PV2FhYUmjgy+KisrkyS1a9dOkrRu3TodP37c4xr36NFDnTt3dl/jwsJC9enTRzExMe42GRkZcjgc2rRpUxOOHudy991369prr/W4nhLXOVi8++67SklJ0a9//Wt17NhRl1xyiebPn+/ev2PHDpWUlHhc56ioKKWmpnpc5zZt2iglJcXdJj09XVarVatXr266k4FXgwYNUn5+vr799ltJ0pdffqmVK1fqmmuukcQ1DmYhZg+gOTt48KCcTqfH/wFKUkxMjL755huTRgVfuVwu3X///Ro8eLB69+4tSSopKVFoaKjatGnj0TYmJkYlJSXuNt7+DJzaB/+wZMkSrV+/XmvXrq22j+scHL777jvNnTtXWVlZevTRR7V27VpNnDhRoaGhGj9+vPs6ebuOZ17njh07euwPCQlRu3btuM5+4JFHHpHD4VCPHj1ks9nkdDr11FNPaezYsZLENQ5iBF6ggdx999366quvtHLlSrOHgga2a9cu3XfffVqxYoXCwsLMHg4aicvlUkpKip5++mlJ0iWXXKKvvvpK8+bN0/jx400eHRrC3/72N73xxhtavHixLr74YhUVFen+++9XfHw81zjIUdJgoujoaNlstmp3cpeWlio2NtakUcEX99xzj9577z199NFHuuCCC9zbY2NjVVVVpcOHD3u0P/Max8bGev0zcGofzLdu3Trt379fl156qUJCQhQSEqKPP/5YL7zwgkJCQhQTE8N1DgJxcXHq1auXx7aePXuquLhY0unrVNu/s2NjY7V//36P/SdOnND333/PdfYDkyZN0iOPPKLRo0erT58+uvnmm/X73/9eOTk5krjGwYzAa6LQ0FD1799f+fn57m0ul0v5+flKS0szcWSoK8MwdM899+jtt9/Whx9+qKSkJI/9/fv3V4sWLTyu8ZYtW1RcXOy+xmlpadq4caPHv0BXrFihyMjIav/nC3NceeWV2rhxo4qKityvlJQUjR071v2e6xz4Bg8eXG1ZwW+//VYXXnihJCkpKUmxsbEe19nhcGj16tUe1/nw4cNat26du82HH34ol8ul1NTUJjgL1Obo0aOyWj2jj81mk8vlksQ1Dmpm3zXX3C1ZssSw2+3Gq6++anz99dfG7bffbrRp08bjTm74rzvvvNOIiooyCgoKjH379rlfR48edbe54447jM6dOxsffvih8fnnnxtpaWlGWlqae/+p5aquvvpqo6ioyMjLyzM6dOjAclV+7sxVGgyD6xwM1qxZY4SEhBhPPfWUsXXrVuONN94wwsPDjddff93dZsaMGUabNm2Md955x9iwYYMxYsQIr0tWXXLJJcbq1auNlStXGt27d2fJKj8xfvx4o1OnTu5lyd566y0jOjraeOihh9xtuMbBicDrB1588UWjc+fORmhoqDFw4EBj1apVZg8JdSTJ6+uVV15xtzl27Jhx1113GW3btjXCw8ONG2+80di3b59HPzt37jSuueYao2XL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PYLip59+qtatW+uCCy6o13hOiYmJUXx8vL777jt169bN45WUlORuN2LECP3444/Ky8vT4sWLPWZ3v/nmGx06dEgzZszQkCFD1KNHj1pvWJNO/qYlJSUe53L2esOffvqpJk6cqOHDh+viiy+W3W7XwYMHPdq0aNGi1t8tMjJS8fHx+vTTT6v13atXr1rHeLaEhATdcccdeuutt/TAAw9o/vz59ToeQGAi8AJoFv7v//5PixYt0ieffKKNGzdq/Pjxstls9erjnnvukcPh0OjRo/X5559r69atWrRokbZs2SLp5IoDGzZs0JYtW3Tw4EGvwfiuu+7Srl27dO+99+qbb77RO++8o+zsbGVlZclq9f1fyU888YRycnL0wgsv6Ntvv9XGjRv1yiuvaPbs2e42rVq10siRIzVlyhRt3rxZY8aMce/r3LmzQkND9eKLL+q7777Tu+++q+nTp9f6nVdccYUOHDigWbNmafv27crNzdX777/v0aZ79+5atGiRNm/erNWrV2vs2LHVZsoTExOVn5+vkpIS/fDDD16/a9KkSZo5c6aWLl2qLVu26JFHHlFRUZHuu+++Ov9G999/v/79739rx44dWr9+vT766CP17NmzzscDCFwEXgDNwuTJkzV06FBdd911uvbaazVy5Eh17dq1Xn20b99eH374ocrLyzV06FD1799f8+fPd/9n9AkTJuiiiy5SSkqKOnToUG1GUpI6deqk5cuXa82aNerXr5/uuOMO3XrrrXr88cfP6/xuu+02vfzyy3rllVfUp08fDR06VK+++qrHDK90sqzhyy+/1JAhQ9S5c2f39g4dOujVV1/Vm2++qV69emnGjBl69tlna/3Onj176k9/+pNyc3PVr18/rVmzRg8++KBHm7/85S/64YcfdOmll+rmm2/WxIkT1bFjR482zz33nFasWKGEhARdcsklXr9r4sSJysrK0gMPPKA+ffooLy9P7777rrp3717n38jpdOruu+9Wz549NWzYMP3sZz/zWLoNQPCyGGcXYAEAAABBhBleAAAABDUCLwAAAIIagRcAAABBjcALAACAoEbgBQAAQFAj8AIAACCoEXgBAAAQ1Ai8AAAACGoEXgAAAAQ1Ai8AAACCGoEXAAAAQY3ACwAAgKD2/wOhpHXpjVAejwAAAABJRU5ErkJggg==",
359 | "text/plain": [
360 | ""
361 | ]
362 | },
363 | "metadata": {},
364 | "output_type": "display_data"
365 | }
366 | ],
367 | "source": [
368 | "plt.figure(figsize=(8, 6))\n",
369 | "plt.plot(loss_history)\n",
370 | "plt.ylabel(\"loss\")\n",
371 | "plt.xlabel(\"function evaluations\")\n",
372 | "plt.show()"
373 | ]
374 | },
375 | {
376 | "attachments": {},
377 | "cell_type": "markdown",
378 | "metadata": {},
379 | "source": [
380 | "This will display a graph that plots the loss history against the number of function evaluations, which in this case corresponds to the number of optimization steps taken during the training of the QNN. This can be useful for understanding how the loss function changes over time, and can indicate if the optimization algorithm is making progress towards finding a good set of parameters for the QNN."
381 | ]
382 | },
383 | {
384 | "attachments": {},
385 | "cell_type": "markdown",
386 | "metadata": {},
387 | "source": [
388 | "# Classification"
389 | ]
390 | },
391 | {
392 | "cell_type": "code",
393 | "execution_count": 31,
394 | "metadata": {},
395 | "outputs": [],
396 | "source": [
397 | "num_inputs = 2\n",
398 | "num_samples = 20\n",
399 | "\n",
400 | "X = 2 * np.random.random([num_samples, num_inputs]) - 1\n",
401 | "y01 = 1 * (np.sum(X, axis=1) >= 0)\n",
402 | "y = 2 * y01 - 1"
403 | ]
404 | },
405 | {
406 | "attachments": {},
407 | "cell_type": "markdown",
408 | "metadata": {},
409 | "source": [
410 | "This code creates a 2D array `X` with `num_samples` rows and `num_inputs` columns. The values in the array are randomly generated numbers between -1 and 1. It multiplies the random values by 2 and subtracts 1 to get the values between -1 and 1.\n",
411 | "\n",
412 | "Then it creates a new variable `y01` that is equal to 1 if the sum of the elements in each row of `X` is greater than or equal to 0, else 0.\n",
413 | "\n",
414 | "Then it creates a new variable `y` that is equal to `2 * y01 - 1`, this is equivalent to mapping 0 to -1 and 1 to 1.\n",
415 | "\n",
416 | "It means, we are creating a binary classification problem where `X` is a 2-dimensional input space of `num_samples` samples with `num_inputs` features and `y` is a binary output (-1, 1) indicating the class of the samples."
417 | ]
418 | },
419 | {
420 | "cell_type": "code",
421 | "execution_count": 32,
422 | "metadata": {},
423 | "outputs": [],
424 | "source": [
425 | "from torch import Tensor\n",
426 | "\n",
427 | "X_ = Tensor(X)\n",
428 | "y01_ = Tensor(y01).reshape(len(y)).long()\n",
429 | "y_ = Tensor(y).reshape(len(y), 1)"
430 | ]
431 | },
432 | {
433 | "cell_type": "code",
434 | "execution_count": 33,
435 | "metadata": {},
436 | "outputs": [
437 | {
438 | "data": {
439 | "image/png": "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",
440 | "text/plain": [
441 | ""
442 | ]
443 | },
444 | "metadata": {},
445 | "output_type": "display_data"
446 | }
447 | ],
448 | "source": [
449 | "for x, y_target in zip(X, y):\n",
450 | " if y_target == 1:\n",
451 | " plt.plot(x[0], x[1], \"bo\")\n",
452 | "\n",
453 | " else:\n",
454 | " plt.plot(x[0], x[1], \"go\")\n",
455 | "\n",
456 | "plt.plot([-1, 1], [1, -1], \"--\", color=\"black\")\n",
457 | "plt.show()"
458 | ]
459 | },
460 | {
461 | "attachments": {},
462 | "cell_type": "markdown",
463 | "metadata": {},
464 | "source": [
465 | "This code is plotting a scatter plot of `X`, where the points are colored blue if their corresponding value in `y` is 1 and green if the value is -1. The line `plt.plot([-1, 1], [1, -1], '--', color='black')` is plotting a diagonal line with a dashed style, this line separates the points in two regions, the points above the line have $y=1$ and the points below the line have $y=-1$."
466 | ]
467 | },
468 | {
469 | "cell_type": "code",
470 | "execution_count": 34,
471 | "metadata": {},
472 | "outputs": [
473 | {
474 | "name": "stdout",
475 | "output_type": "stream",
476 | "text": [
477 | "Initial Weights: [ 0.06696973 -0.02812149 -0.09155609 -0.06973436 0.0138001 0.04944962\n",
478 | " 0.07294072 0.01887594]\n"
479 | ]
480 | }
481 | ],
482 | "source": [
483 | "from qiskit_machine_learning.neural_networks import TwoLayerQNN\n",
484 | "from qiskit_machine_learning.connectors import TorchConnector\n",
485 | "from qiskit import BasicAer\n",
486 | "\n",
487 | "qnn = TwoLayerQNN(\n",
488 | " num_qubits=num_inputs,\n",
489 | " quantum_instance=BasicAer.get_backend(\"statevector_simulator\"),\n",
490 | ")\n",
491 | "\n",
492 | "initial_weights = 0.1 * (2 * np.random.random(qnn.num_weights) - 1)\n",
493 | "model = TorchConnector(qnn, initial_weights)\n",
494 | "print(\"Initial Weights: \", initial_weights)"
495 | ]
496 | },
497 | {
498 | "attachments": {},
499 | "cell_type": "markdown",
500 | "metadata": {},
501 | "source": [
502 | "The code above imports the necessary modules and classes to create a 2-layer quantum neural network (`TwoLayerQNN`) and connect it to a torch connector (`TorchConnector`). It also sets the number of qubits to the number of inputs (`num_inputs`) and sets the `quantum_instance` to the `statevector_simulator` from `BasicAer`. The initial weights for the network are also set to a random value between -0.1 and 0.1. The number of weights is also printed with the initial weights."
503 | ]
504 | },
505 | {
506 | "cell_type": "code",
507 | "execution_count": 35,
508 | "metadata": {},
509 | "outputs": [
510 | {
511 | "data": {
512 | "text/plain": [
513 | "TorchConnector()"
514 | ]
515 | },
516 | "execution_count": 35,
517 | "metadata": {},
518 | "output_type": "execute_result"
519 | }
520 | ],
521 | "source": [
522 | "from torch.nn import MSELoss\n",
523 | "from torch.optim import LBFGS\n",
524 | "\n",
525 | "optimizer = LBFGS(model.parameters())\n",
526 | "f_loss = MSELoss(reduction=\"sum\")\n",
527 | "\n",
528 | "model.train()"
529 | ]
530 | },
531 | {
532 | "attachments": {},
533 | "cell_type": "markdown",
534 | "metadata": {},
535 | "source": [
536 | "The above code is defining an optimizer and loss function for the QNN. The optimizer being used is the limited-memory Broyden-Fletcher-Goldfarb-Shanno (LBFGS) algorithm, which is a popular optimization algorithm for neural networks. The loss function being used is the mean squared error (MSE) loss, which measures the average squared difference between the predicted and actual values. The `reduction` attribute is set to `'sum'` which means that the loss is computed as the sum of squared differences.\n",
537 | "\n",
538 | "And `model.train()` is to set the model in training mode, which turns on dropout and batch normalization if they are used in the model."
539 | ]
540 | },
541 | {
542 | "cell_type": "code",
543 | "execution_count": 36,
544 | "metadata": {},
545 | "outputs": [],
546 | "source": [
547 | "def closure():\n",
548 | " \"\"\"\n",
549 | " This function performs a single optimization step by computing the loss,\n",
550 | " performing the backward pass, and updating the model parameters.\n",
551 | " \"\"\"\n",
552 | " optimizer.zero_grad()\n",
553 | " loss = f_loss(model(X_), y_)\n",
554 | " loss.backward()\n",
555 | " return loss\n",
556 | "\n",
557 | "\n",
558 | "for _ in range(100):\n",
559 | " optimizer.step(closure)"
560 | ]
561 | },
562 | {
563 | "attachments": {},
564 | "cell_type": "markdown",
565 | "metadata": {},
566 | "source": [
567 | "The for loop here is training the model for 100 iterations. At each iteration, the `closure()` function is called which performs the following steps:\n",
568 | "\n",
569 | "* It sets the gradients of the model parameters to zero.\n",
570 | "\n",
571 | "* It calculates the loss by comparing the model's output to the target output.\n",
572 | "\n",
573 | "* It calculates the gradients of the model parameters with respect to the loss.\n",
574 | "\n",
575 | "* It returns the loss.\n",
576 | "\n",
577 | "* The optimizer updates the model's parameters using the gradients and the specific optimization algorithm used (LBFGS) to minimize the loss.\n",
578 | "\n",
579 | "* The loop continues for 100 iterations, updating the model's parameters at each iteration, until the model has been trained for 100 iterations."
580 | ]
581 | },
582 | {
583 | "cell_type": "code",
584 | "execution_count": 37,
585 | "metadata": {},
586 | "outputs": [
587 | {
588 | "name": "stdout",
589 | "output_type": "stream",
590 | "text": [
591 | "Accuracy: 0.45\n"
592 | ]
593 | }
594 | ],
595 | "source": [
596 | "y_predict = []\n",
597 | "\n",
598 | "for x, y_target in zip(X, y):\n",
599 | " output = model(Tensor(x))\n",
600 | " y_predict += [np.sign(output.detach().numpy())[0]]\n",
601 | "\n",
602 | "print(\"Accuracy: \", sum(y_predict == y) / len(y))"
603 | ]
604 | },
605 | {
606 | "attachments": {},
607 | "cell_type": "markdown",
608 | "metadata": {},
609 | "source": [
610 | "The code above is computing the prediction of a two-layer quantum neural network (QNN) trained on the provided data `X` and target values `y`. The QNN has been defined using the `TwoLayerQNN` class and its weights have been optimized using the `LBFGS` optimizer and the mean squared error loss function `MSELoss`. The trained model is then evaluated on the input data `X` using the `model(Tensor(X))` function, which returns the predicted target values.\n",
611 | "\n",
612 | "The prediction is then converted to a binary class using the `np.sign` function and compared to the actual target values `y` to compute the accuracy of the prediction. The accuracy is calculated as the ratio of the number of correct predictions to the total number of samples."
613 | ]
614 | },
615 | {
616 | "cell_type": "code",
617 | "execution_count": 38,
618 | "metadata": {},
619 | "outputs": [
620 | {
621 | "data": {
622 | "image/png": "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",
623 | "text/plain": [
624 | ""
625 | ]
626 | },
627 | "metadata": {},
628 | "output_type": "display_data"
629 | }
630 | ],
631 | "source": [
632 | "for x, y_target, y_p in zip(X, y, y_predict):\n",
633 | " if y_target == 1:\n",
634 | " plt.plot(x[0], x[1], \"bo\")\n",
635 | " else:\n",
636 | " plt.plot(x[0], x[1], \"go\")\n",
637 | "\n",
638 | " if y_target != y_p:\n",
639 | " plt.scatter(x[0], x[1], s=200, facecolors=\"none\", edgecolors=\"r\", linewidths=2)\n",
640 | "\n",
641 | "plt.plot([-1, 1], [1, -1], \"--\", color=\"black\")\n",
642 | "plt.show()"
643 | ]
644 | },
645 | {
646 | "attachments": {},
647 | "cell_type": "markdown",
648 | "metadata": {},
649 | "source": [
650 | "This code generates a scatter plot of the input data points, colored based on their target values (blue for positive, green for negative). The points that are not correctly predicted are also plotted as red circles, with larger size and black edge. Finally, it plots a line with the equation $y = x - 1$ to visualize the boundary that separates positive and negative samples."
651 | ]
652 | },
653 | {
654 | "cell_type": "code",
655 | "execution_count": null,
656 | "metadata": {},
657 | "outputs": [],
658 | "source": []
659 | }
660 | ],
661 | "metadata": {
662 | "kernelspec": {
663 | "display_name": "Python 3",
664 | "language": "python",
665 | "name": "python3"
666 | },
667 | "language_info": {
668 | "codemirror_mode": {
669 | "name": "ipython",
670 | "version": 3
671 | },
672 | "file_extension": ".py",
673 | "mimetype": "text/x-python",
674 | "name": "python",
675 | "nbconvert_exporter": "python",
676 | "pygments_lexer": "ipython3",
677 | "version": "3.10.6"
678 | },
679 | "orig_nbformat": 4,
680 | "vscode": {
681 | "interpreter": {
682 | "hash": "916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1"
683 | }
684 | }
685 | },
686 | "nbformat": 4,
687 | "nbformat_minor": 2
688 | }
689 |
--------------------------------------------------------------------------------