|
a |
|
b/Code/All Qiskit, PennyLane QML Nov 23/08a1 Kernel 6Loss 100% kkawchak.ipynb |
|
|
1 |
{ |
|
|
2 |
"cells": [ |
|
|
3 |
{ |
|
|
4 |
"cell_type": "markdown", |
|
|
5 |
"id": "38df9aa0", |
|
|
6 |
"metadata": {}, |
|
|
7 |
"source": [ |
|
|
8 |
"# Quantum Kernel Training for Machine Learning Applications\n", |
|
|
9 |
"\n", |
|
|
10 |
"In this tutorial, we will train a quantum kernel on a labeled dataset for a machine learning application. To illustrate the basic steps, we will use Quantum Kernel Alignment (QKA) for a binary classification task. QKA is a technique that iteratively adapts a parametrized quantum kernel to a dataset while converging to the maximum SVM margin. More information about QKA can be found in the preprint, [\"Covariant quantum kernels for data with group structure.\"](https://arxiv.org/abs/2105.03406)\n", |
|
|
11 |
"\n", |
|
|
12 |
"\n", |
|
|
13 |
"The entry point to training a quantum kernel is the `QuantumKernelTrainer` class. The basic steps are:\n", |
|
|
14 |
"\n", |
|
|
15 |
"1. Prepare the dataset\n", |
|
|
16 |
"2. Define the quantum feature map\n", |
|
|
17 |
"3. Set up an instance of `TrainableKernel` and `QuantumKernelTrainer` objects\n", |
|
|
18 |
"4. Use the `QuantumKernelTrainer.fit` method to train the kernel parameters on the dataset\n", |
|
|
19 |
"5. Pass the trained quantum kernel to a machine learning model" |
|
|
20 |
] |
|
|
21 |
}, |
|
|
22 |
{ |
|
|
23 |
"cell_type": "markdown", |
|
|
24 |
"id": "ed6aafa9", |
|
|
25 |
"metadata": {}, |
|
|
26 |
"source": [ |
|
|
27 |
"### Import Local, External, and Qiskit Packages and define a callback class for our optimizer" |
|
|
28 |
] |
|
|
29 |
}, |
|
|
30 |
{ |
|
|
31 |
"cell_type": "code", |
|
|
32 |
"execution_count": 1, |
|
|
33 |
"id": "1a646351", |
|
|
34 |
"metadata": {}, |
|
|
35 |
"outputs": [ |
|
|
36 |
{ |
|
|
37 |
"name": "stderr", |
|
|
38 |
"output_type": "stream", |
|
|
39 |
"text": [ |
|
|
40 |
"/tmp/ipykernel_192095/3710893010.py:12: DeprecationWarning: ``qiskit.algorithms`` has been migrated to an independent package: https://github.com/qiskit-community/qiskit-algorithms. The ``qiskit.algorithms`` import path is deprecated as of qiskit-terra 0.25.0 and will be removed no earlier than 3 months after the release date. Please run ``pip install qiskit_algorithms`` and use ``import qiskit_algorithms`` instead.\n", |
|
|
41 |
" from qiskit.algorithms.optimizers import SPSA\n" |
|
|
42 |
] |
|
|
43 |
} |
|
|
44 |
], |
|
|
45 |
"source": [ |
|
|
46 |
"# External imports\n", |
|
|
47 |
"from pylab import cm\n", |
|
|
48 |
"from sklearn import metrics\n", |
|
|
49 |
"import numpy as np\n", |
|
|
50 |
"import matplotlib\n", |
|
|
51 |
"import matplotlib.pyplot as plt\n", |
|
|
52 |
"\n", |
|
|
53 |
"# Qiskit imports\n", |
|
|
54 |
"from qiskit import QuantumCircuit\n", |
|
|
55 |
"from qiskit.circuit import ParameterVector\n", |
|
|
56 |
"from qiskit.visualization import circuit_drawer\n", |
|
|
57 |
"from qiskit.algorithms.optimizers import SPSA\n", |
|
|
58 |
"from qiskit.circuit.library import ZZFeatureMap, ZFeatureMap\n", |
|
|
59 |
"from qiskit_machine_learning.kernels import TrainableFidelityQuantumKernel\n", |
|
|
60 |
"from qiskit_machine_learning.kernels.algorithms import QuantumKernelTrainer\n", |
|
|
61 |
"from qiskit_machine_learning.algorithms import QSVC\n", |
|
|
62 |
"from qiskit_machine_learning.datasets import ad_hoc_data\n", |
|
|
63 |
"\n", |
|
|
64 |
"\n", |
|
|
65 |
"class QKTCallback:\n", |
|
|
66 |
" \"\"\"Callback wrapper class.\"\"\"\n", |
|
|
67 |
"\n", |
|
|
68 |
" def __init__(self) -> None:\n", |
|
|
69 |
" self._data = [[] for i in range(5)]\n", |
|
|
70 |
"\n", |
|
|
71 |
" def callback(self, x0, x1=None, x2=None, x3=None, x4=None):\n", |
|
|
72 |
" \"\"\"\n", |
|
|
73 |
" Args:\n", |
|
|
74 |
" x0: number of function evaluations\n", |
|
|
75 |
" x1: the parameters\n", |
|
|
76 |
" x2: the function value\n", |
|
|
77 |
" x3: the stepsize\n", |
|
|
78 |
" x4: whether the step was accepted\n", |
|
|
79 |
" \"\"\"\n", |
|
|
80 |
" self._data[0].append(x0)\n", |
|
|
81 |
" self._data[1].append(x1)\n", |
|
|
82 |
" self._data[2].append(x2)\n", |
|
|
83 |
" self._data[3].append(x3)\n", |
|
|
84 |
" self._data[4].append(x4)\n", |
|
|
85 |
"\n", |
|
|
86 |
" def get_callback_data(self):\n", |
|
|
87 |
" return self._data\n", |
|
|
88 |
"\n", |
|
|
89 |
" def clear_callback_data(self):\n", |
|
|
90 |
" self._data = [[] for i in range(5)]" |
|
|
91 |
] |
|
|
92 |
}, |
|
|
93 |
{ |
|
|
94 |
"cell_type": "markdown", |
|
|
95 |
"id": "39535c04", |
|
|
96 |
"metadata": {}, |
|
|
97 |
"source": [ |
|
|
98 |
"### Prepare the Dataset\n", |
|
|
99 |
"\n", |
|
|
100 |
"In this guide, we will use Qiskit Machine Learning's `ad_hoc.py` dataset to demonstrate the kernel training process. See the documentation [here](https://qiskit.org/ecosystem/machine-learning/stubs/qiskit_machine_learning.datasets.ad_hoc_data.html)." |
|
|
101 |
] |
|
|
102 |
}, |
|
|
103 |
{ |
|
|
104 |
"cell_type": "code", |
|
|
105 |
"execution_count": 2, |
|
|
106 |
"id": "2311cff1", |
|
|
107 |
"metadata": {}, |
|
|
108 |
"outputs": [ |
|
|
109 |
{ |
|
|
110 |
"data": { |
|
|
111 |
"image/png": "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\n", |
|
|
112 |
"text/plain": [ |
|
|
113 |
"<Figure size 500x500 with 1 Axes>" |
|
|
114 |
] |
|
|
115 |
}, |
|
|
116 |
"metadata": {}, |
|
|
117 |
"output_type": "display_data" |
|
|
118 |
} |
|
|
119 |
], |
|
|
120 |
"source": [ |
|
|
121 |
"adhoc_dimension = 2\n", |
|
|
122 |
"X_train, y_train, X_test, y_test, adhoc_total = ad_hoc_data(\n", |
|
|
123 |
" training_size=20,\n", |
|
|
124 |
" test_size=5,\n", |
|
|
125 |
" n=adhoc_dimension,\n", |
|
|
126 |
" gap=0.3,\n", |
|
|
127 |
" plot_data=False,\n", |
|
|
128 |
" one_hot=False,\n", |
|
|
129 |
" include_sample_total=True,\n", |
|
|
130 |
")\n", |
|
|
131 |
"\n", |
|
|
132 |
"plt.figure(figsize=(5, 5))\n", |
|
|
133 |
"plt.ylim(0, 2 * np.pi)\n", |
|
|
134 |
"plt.xlim(0, 2 * np.pi)\n", |
|
|
135 |
"plt.imshow(\n", |
|
|
136 |
" np.asmatrix(adhoc_total).T,\n", |
|
|
137 |
" interpolation=\"nearest\",\n", |
|
|
138 |
" origin=\"lower\",\n", |
|
|
139 |
" cmap=\"RdBu\",\n", |
|
|
140 |
" extent=[0, 2 * np.pi, 0, 2 * np.pi],\n", |
|
|
141 |
")\n", |
|
|
142 |
"\n", |
|
|
143 |
"plt.scatter(\n", |
|
|
144 |
" X_train[np.where(y_train[:] == 0), 0],\n", |
|
|
145 |
" X_train[np.where(y_train[:] == 0), 1],\n", |
|
|
146 |
" marker=\"s\",\n", |
|
|
147 |
" facecolors=\"w\",\n", |
|
|
148 |
" edgecolors=\"b\",\n", |
|
|
149 |
" label=\"A train\",\n", |
|
|
150 |
")\n", |
|
|
151 |
"plt.scatter(\n", |
|
|
152 |
" X_train[np.where(y_train[:] == 1), 0],\n", |
|
|
153 |
" X_train[np.where(y_train[:] == 1), 1],\n", |
|
|
154 |
" marker=\"o\",\n", |
|
|
155 |
" facecolors=\"w\",\n", |
|
|
156 |
" edgecolors=\"r\",\n", |
|
|
157 |
" label=\"B train\",\n", |
|
|
158 |
")\n", |
|
|
159 |
"plt.scatter(\n", |
|
|
160 |
" X_test[np.where(y_test[:] == 0), 0],\n", |
|
|
161 |
" X_test[np.where(y_test[:] == 0), 1],\n", |
|
|
162 |
" marker=\"s\",\n", |
|
|
163 |
" facecolors=\"b\",\n", |
|
|
164 |
" edgecolors=\"w\",\n", |
|
|
165 |
" label=\"A test\",\n", |
|
|
166 |
")\n", |
|
|
167 |
"plt.scatter(\n", |
|
|
168 |
" X_test[np.where(y_test[:] == 1), 0],\n", |
|
|
169 |
" X_test[np.where(y_test[:] == 1), 1],\n", |
|
|
170 |
" marker=\"o\",\n", |
|
|
171 |
" facecolors=\"r\",\n", |
|
|
172 |
" edgecolors=\"w\",\n", |
|
|
173 |
" label=\"B test\",\n", |
|
|
174 |
")\n", |
|
|
175 |
"\n", |
|
|
176 |
"plt.legend(bbox_to_anchor=(1.05, 1), loc=\"upper left\", borderaxespad=0.0)\n", |
|
|
177 |
"plt.title(\"Ad hoc dataset for classification\")\n", |
|
|
178 |
"\n", |
|
|
179 |
"plt.show()" |
|
|
180 |
] |
|
|
181 |
}, |
|
|
182 |
{ |
|
|
183 |
"cell_type": "markdown", |
|
|
184 |
"id": "41a439be", |
|
|
185 |
"metadata": {}, |
|
|
186 |
"source": [ |
|
|
187 |
"### Define the Quantum Feature Map\n", |
|
|
188 |
"\n", |
|
|
189 |
"Next, we set up the quantum feature map, which encodes classical data into the quantum state space. Here, we use a `QuantumCircuit` to set up a trainable rotation layer and a `ZZFeatureMap` from `Qiskit` to represent the input data." |
|
|
190 |
] |
|
|
191 |
}, |
|
|
192 |
{ |
|
|
193 |
"cell_type": "code", |
|
|
194 |
"execution_count": 3, |
|
|
195 |
"id": "60b58ede", |
|
|
196 |
"metadata": {}, |
|
|
197 |
"outputs": [ |
|
|
198 |
{ |
|
|
199 |
"name": "stdout", |
|
|
200 |
"output_type": "stream", |
|
|
201 |
"text": [ |
|
|
202 |
"Figure(454.517x200.667)\n", |
|
|
203 |
"Trainable parameters: θ, ['θ[0]']\n" |
|
|
204 |
] |
|
|
205 |
} |
|
|
206 |
], |
|
|
207 |
"source": [ |
|
|
208 |
"# Create a rotational layer to train. We will rotate each qubit the same amount.\n", |
|
|
209 |
"training_params = ParameterVector(\"θ\", 1)\n", |
|
|
210 |
"fm0 = QuantumCircuit(2)\n", |
|
|
211 |
"fm0.ry(training_params[0], 0)\n", |
|
|
212 |
"fm0.ry(training_params[0], 1)\n", |
|
|
213 |
"\n", |
|
|
214 |
"# Use ZZFeatureMap to represent input data\n", |
|
|
215 |
"fm1 = ZZFeatureMap(2)\n", |
|
|
216 |
"\n", |
|
|
217 |
"# Create the feature map, composed of our two circuits\n", |
|
|
218 |
"fm = fm0.compose(fm1)\n", |
|
|
219 |
"\n", |
|
|
220 |
"print(circuit_drawer(fm))\n", |
|
|
221 |
"print(f\"Trainable parameters: {training_params}\")" |
|
|
222 |
] |
|
|
223 |
}, |
|
|
224 |
{ |
|
|
225 |
"cell_type": "markdown", |
|
|
226 |
"id": "54ae41ca", |
|
|
227 |
"metadata": {}, |
|
|
228 |
"source": [ |
|
|
229 |
"### Set Up the Quantum Kernel and Quantum Kernel Trainer\n", |
|
|
230 |
"\n", |
|
|
231 |
"To train the quantum kernel, we will use an instance of `TrainableFidelityQuantumKernel` (holds the feature map and its parameters) and `QuantumKernelTrainer` (manages the training process).\n", |
|
|
232 |
"\n", |
|
|
233 |
"We will train using the Quantum Kernel Alignment technique by selecting the kernel loss function, `SVCLoss`, as input to the `QuantumKernelTrainer`. Since this is a Qiskit-supported loss, we can use the string, `\"svc_loss\"`; however, note that default settings are used when passing the loss as a string. For custom settings, instantiate explicitly with the desired options, and pass the `KernelLoss` object to the `QuantumKernelTrainer`.\n", |
|
|
234 |
"\n", |
|
|
235 |
"We will select SPSA as the optimizer and initialize the trainable parameter with the `initial_point` argument. Note: The length of the list passed as the `initial_point` argument must equal the number of trainable parameters in the feature map." |
|
|
236 |
] |
|
|
237 |
}, |
|
|
238 |
{ |
|
|
239 |
"cell_type": "code", |
|
|
240 |
"execution_count": 4, |
|
|
241 |
"id": "a190efef", |
|
|
242 |
"metadata": {}, |
|
|
243 |
"outputs": [], |
|
|
244 |
"source": [ |
|
|
245 |
"# Instantiate quantum kernel\n", |
|
|
246 |
"quant_kernel = TrainableFidelityQuantumKernel(feature_map=fm, training_parameters=training_params)\n", |
|
|
247 |
"\n", |
|
|
248 |
"# Set up the optimizer\n", |
|
|
249 |
"cb_qkt = QKTCallback()\n", |
|
|
250 |
"spsa_opt = SPSA(maxiter=10, callback=cb_qkt.callback, learning_rate=0.048, perturbation=0.05, regularization=0.0001)\n", |
|
|
251 |
"\n", |
|
|
252 |
"# Instantiate a quantum kernel trainer.\n", |
|
|
253 |
"qkt = QuantumKernelTrainer(\n", |
|
|
254 |
" quantum_kernel=quant_kernel, loss=\"svc_loss\", optimizer=spsa_opt, initial_point=[np.pi / 2]\n", |
|
|
255 |
")" |
|
|
256 |
] |
|
|
257 |
}, |
|
|
258 |
{ |
|
|
259 |
"cell_type": "markdown", |
|
|
260 |
"id": "b6f4fd48", |
|
|
261 |
"metadata": {}, |
|
|
262 |
"source": [ |
|
|
263 |
"### Train the Quantum Kernel\n", |
|
|
264 |
"\n", |
|
|
265 |
"To train the quantum kernel on the dataset (samples and labels), we call the `fit` method of `QuantumKernelTrainer`.\n", |
|
|
266 |
"\n", |
|
|
267 |
"The output of `QuantumKernelTrainer.fit` is a `QuantumKernelTrainerResult` object. The results object contains the following class fields:\n", |
|
|
268 |
"\n", |
|
|
269 |
" - `optimal_parameters`: A dictionary containing {parameter: optimal value} pairs\n", |
|
|
270 |
" - `optimal_point`: The optimal parameter value found in training\n", |
|
|
271 |
" - `optimal_value`: The value of the loss function at the optimal point\n", |
|
|
272 |
" - `optimizer_evals`: The number of evaluations performed by the optimizer\n", |
|
|
273 |
" - `optimizer_time`: The amount of time taken to perform optimization\n", |
|
|
274 |
" - `quantum_kernel`: A `TrainableKernel` object with optimal values bound to the feature map" |
|
|
275 |
] |
|
|
276 |
}, |
|
|
277 |
{ |
|
|
278 |
"cell_type": "code", |
|
|
279 |
"execution_count": 5, |
|
|
280 |
"id": "9d26212c", |
|
|
281 |
"metadata": {}, |
|
|
282 |
"outputs": [ |
|
|
283 |
{ |
|
|
284 |
"name": "stdout", |
|
|
285 |
"output_type": "stream", |
|
|
286 |
"text": [ |
|
|
287 |
"{ 'optimal_circuit': None,\n", |
|
|
288 |
" 'optimal_parameters': {ParameterVectorElement(θ[0]): 0.4380522741331778},\n", |
|
|
289 |
" 'optimal_point': array([0.43805227]),\n", |
|
|
290 |
" 'optimal_value': 6.051309265394328,\n", |
|
|
291 |
" 'optimizer_evals': 30,\n", |
|
|
292 |
" 'optimizer_result': None,\n", |
|
|
293 |
" 'optimizer_time': None,\n", |
|
|
294 |
" 'quantum_kernel': <qiskit_machine_learning.kernels.trainable_fidelity_quantum_kernel.TrainableFidelityQuantumKernel object at 0x7f4faad9e8c0>}\n" |
|
|
295 |
] |
|
|
296 |
} |
|
|
297 |
], |
|
|
298 |
"source": [ |
|
|
299 |
"# Train the kernel using QKT directly\n", |
|
|
300 |
"qka_results = qkt.fit(X_train, y_train)\n", |
|
|
301 |
"optimized_kernel = qka_results.quantum_kernel\n", |
|
|
302 |
"print(qka_results)" |
|
|
303 |
] |
|
|
304 |
}, |
|
|
305 |
{ |
|
|
306 |
"cell_type": "markdown", |
|
|
307 |
"id": "5455be3c", |
|
|
308 |
"metadata": {}, |
|
|
309 |
"source": [ |
|
|
310 |
"### Fit and Test the Model\n", |
|
|
311 |
"\n", |
|
|
312 |
"We can pass the trained quantum kernel to a machine learning model, then fit the model and test on new data. Here, we will use Qiskit's `QSVC` for classification." |
|
|
313 |
] |
|
|
314 |
}, |
|
|
315 |
{ |
|
|
316 |
"cell_type": "code", |
|
|
317 |
"execution_count": 6, |
|
|
318 |
"id": "e716655f", |
|
|
319 |
"metadata": {}, |
|
|
320 |
"outputs": [ |
|
|
321 |
{ |
|
|
322 |
"name": "stdout", |
|
|
323 |
"output_type": "stream", |
|
|
324 |
"text": [ |
|
|
325 |
"accuracy test: 1.0\n" |
|
|
326 |
] |
|
|
327 |
} |
|
|
328 |
], |
|
|
329 |
"source": [ |
|
|
330 |
"# Use QSVC for classification\n", |
|
|
331 |
"qsvc = QSVC(quantum_kernel=optimized_kernel)\n", |
|
|
332 |
"\n", |
|
|
333 |
"# Fit the QSVC\n", |
|
|
334 |
"qsvc.fit(X_train, y_train)\n", |
|
|
335 |
"\n", |
|
|
336 |
"# Predict the labels\n", |
|
|
337 |
"labels_test = qsvc.predict(X_test)\n", |
|
|
338 |
"\n", |
|
|
339 |
"# Evalaute the test accuracy\n", |
|
|
340 |
"accuracy_test = metrics.balanced_accuracy_score(y_true=y_test, y_pred=labels_test)\n", |
|
|
341 |
"print(f\"accuracy test: {accuracy_test}\")" |
|
|
342 |
] |
|
|
343 |
}, |
|
|
344 |
{ |
|
|
345 |
"cell_type": "markdown", |
|
|
346 |
"id": "9cd4cbf2", |
|
|
347 |
"metadata": {}, |
|
|
348 |
"source": [ |
|
|
349 |
"### Visualize the Kernel Training Process\n", |
|
|
350 |
"\n", |
|
|
351 |
"From the callback data, we can plot how the loss evolves during the training process. We see it converges rapidly and reaches high test accuracy on this dataset with our choice of inputs.\n", |
|
|
352 |
"\n", |
|
|
353 |
"We can also display the final kernel matrix, which is a measure of similarity between the training samples." |
|
|
354 |
] |
|
|
355 |
}, |
|
|
356 |
{ |
|
|
357 |
"cell_type": "code", |
|
|
358 |
"execution_count": 7, |
|
|
359 |
"id": "0cb85c46", |
|
|
360 |
"metadata": {}, |
|
|
361 |
"outputs": [ |
|
|
362 |
{ |
|
|
363 |
"data": { |
|
|
364 |
"image/png": "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N2vjxo16//33bavIzpw584b+CobiLSMjQ0OGDFFaWpoqV67s6u7Ayd5++239/e9/16VLlxQeHq5JkyZpzZo12rZtm3766SdNmjRJd911lzw8+PFYUl25ckUPPPCAdu/eLUlq0qSJZsyYoY0bN2rFihUaPXq0ypYtK0maOnWqJk6c6MruwgE333yzunTpckP3fe211zR9+nRJUvPmzTVnzhxt3rxZc+bMsV1zd9q0aXr99ded1l/AEdu2bdMjjzyixMREBQQE6J133tGGDRu0cuVKPfPMM5KkAwcO6IEHHtCFCxdc3Nvij/eJwuHMz0U8zmY1atTQgAED9M9//lMLFy7Uxo0btX79es2bN08PP/ywPD09FRsbqx49eigqKirXNj799FO9+eabysjIUJ06dTR9+nRt3rxZixYtUseOHSVJy5Yt0+DBg4vy1Nybq6t6QHHzwAMPWOfNm2dNS0vLdf+5c+es4eHhtkr/2rVri7iHKEwffPCBVZK1fv361lGjRjFSzY389NNP2f6impqammeWUagl1/z5823Pc6tWrXJ9L9+6dau1TJkyVknWcuXKWa9cueKCnsKe0aNHW5csWWKNiYmxWq1W69GjR/M9AmX//v22UccRERHWpKSkbPsvXbpkjYiIsEqyenl5MSIIRSpzBJCXl5d1w4YNOfa/++67ttf8mDFjir6DJQDvE4XPWZ+LeJzN8nqMs4qMjLQ91r169cqx//z589bg4GCrJOvNN99sPXfuXI5jdO/enc83TkZRDbgBS5YsyTZ9CO7h+PHj1oCAAKsk65o1a6xjxozhh46bSE9Pt95yyy1WSdamTZtSRHFjL7zwgu37dvHixXnmevXqZcvt2LGjCHuIG3EjH5afe+452302btyYa2bjxo22zF//+lcn9hjI26+//mp73T377LO5ZtLT060NGjSwFf/t/SEIV/E+4RqOfC7icXaeevXq2aaBXm/ixIm2x3DOnDm53v/kyZNWT09PqyRr165dC7u7pQLzW4AbkDl0VpIOHz7swp7Amf72t7/p4sWLevLJJ9W+fXtXdwdOtGLFCh08eFDS1UUovLy8XNwjFJbU1FTbdu3atfPM1alTJ9f7wD1YrVZ99913kqT69eurZcuWueZatmypevXqSZK+++47Wa3WIusjSq9FixbZtgcNGpRrxsPDQwMGDJAkxcfHa/Xq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\n", |
|
|
365 |
"text/plain": [ |
|
|
366 |
"<Figure size 1400x500 with 2 Axes>" |
|
|
367 |
] |
|
|
368 |
}, |
|
|
369 |
"metadata": {}, |
|
|
370 |
"output_type": "display_data" |
|
|
371 |
} |
|
|
372 |
], |
|
|
373 |
"source": [ |
|
|
374 |
"plot_data = cb_qkt.get_callback_data() # callback data\n", |
|
|
375 |
"K = optimized_kernel.evaluate(X_train) # kernel matrix evaluated on the training samples\n", |
|
|
376 |
"\n", |
|
|
377 |
"plt.rcParams[\"font.size\"] = 20\n", |
|
|
378 |
"fig, ax = plt.subplots(1, 2, figsize=(14, 5))\n", |
|
|
379 |
"ax[0].plot([i + 1 for i in range(len(plot_data[0]))], np.array(plot_data[2]), c=\"k\", marker=\"o\")\n", |
|
|
380 |
"ax[0].set_xlabel(\"Iterations\")\n", |
|
|
381 |
"ax[0].set_ylabel(\"Loss\")\n", |
|
|
382 |
"ax[1].imshow(K, cmap=matplotlib.colormaps[\"bwr\"])\n", |
|
|
383 |
"fig.tight_layout()\n", |
|
|
384 |
"plt.show()" |
|
|
385 |
] |
|
|
386 |
}, |
|
|
387 |
{ |
|
|
388 |
"cell_type": "code", |
|
|
389 |
"execution_count": 8, |
|
|
390 |
"id": "aa6e50bc", |
|
|
391 |
"metadata": { |
|
|
392 |
"tags": [] |
|
|
393 |
}, |
|
|
394 |
"outputs": [ |
|
|
395 |
{ |
|
|
396 |
"data": { |
|
|
397 |
"text/html": [ |
|
|
398 |
"<h3>Version Information</h3><table><tr><th>Software</th><th>Version</th></tr><tr><td><code>qiskit</code></td><td>0.44.1</td></tr><tr><td><code>qiskit-terra</code></td><td>0.25.1</td></tr><tr><td><code>qiskit_machine_learning</code></td><td>0.6.1</td></tr><tr><th colspan='2'>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.142810821533203</td></tr><tr><td colspan='2'>Wed Nov 22 08:34:05 2023 UTC</td></tr></table>" |
|
|
399 |
], |
|
|
400 |
"text/plain": [ |
|
|
401 |
"<IPython.core.display.HTML object>" |
|
|
402 |
] |
|
|
403 |
}, |
|
|
404 |
"metadata": {}, |
|
|
405 |
"output_type": "display_data" |
|
|
406 |
}, |
|
|
407 |
{ |
|
|
408 |
"data": { |
|
|
409 |
"text/html": [ |
|
|
410 |
"<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>© 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>" |
|
|
411 |
], |
|
|
412 |
"text/plain": [ |
|
|
413 |
"<IPython.core.display.HTML object>" |
|
|
414 |
] |
|
|
415 |
}, |
|
|
416 |
"metadata": {}, |
|
|
417 |
"output_type": "display_data" |
|
|
418 |
} |
|
|
419 |
], |
|
|
420 |
"source": [ |
|
|
421 |
"import qiskit.tools.jupyter\n", |
|
|
422 |
"\n", |
|
|
423 |
"%qiskit_version_table\n", |
|
|
424 |
"%qiskit_copyright" |
|
|
425 |
] |
|
|
426 |
} |
|
|
427 |
], |
|
|
428 |
"metadata": { |
|
|
429 |
"kernelspec": { |
|
|
430 |
"display_name": "Python 3 (ipykernel)", |
|
|
431 |
"language": "python", |
|
|
432 |
"name": "python3" |
|
|
433 |
}, |
|
|
434 |
"language_info": { |
|
|
435 |
"codemirror_mode": { |
|
|
436 |
"name": "ipython", |
|
|
437 |
"version": 3 |
|
|
438 |
}, |
|
|
439 |
"file_extension": ".py", |
|
|
440 |
"mimetype": "text/x-python", |
|
|
441 |
"name": "python", |
|
|
442 |
"nbconvert_exporter": "python", |
|
|
443 |
"pygments_lexer": "ipython3", |
|
|
444 |
"version": "3.10.8" |
|
|
445 |
}, |
|
|
446 |
"rise": { |
|
|
447 |
"height": "90%", |
|
|
448 |
"scroll": true, |
|
|
449 |
"start_slideshow_at": "beginning", |
|
|
450 |
"theme": "white", |
|
|
451 |
"transition": "zoom", |
|
|
452 |
"width": "90%" |
|
|
453 |
}, |
|
|
454 |
"widgets": { |
|
|
455 |
"application/vnd.jupyter.widget-state+json": { |
|
|
456 |
"state": { |
|
|
457 |
"0b3d40adc90a49508071d342b90d2635": { |
|
|
458 |
"model_module": "@jupyter-widgets/controls", |
|
|
459 |
"model_module_version": "2.0.0", |
|
|
460 |
"model_name": "HTMLStyleModel", |
|
|
461 |
"state": { |
|
|
462 |
"description_width": "", |
|
|
463 |
"font_size": null, |
|
|
464 |
"text_color": null |
|
|
465 |
} |
|
|
466 |
}, |
|
|
467 |
"10a4a47d5baa4709bb35375be95a8133": { |
|
|
468 |
"model_module": "@jupyter-widgets/controls", |
|
|
469 |
"model_module_version": "2.0.0", |
|
|
470 |
"model_name": "HTMLStyleModel", |
|
|
471 |
"state": { |
|
|
472 |
"description_width": "", |
|
|
473 |
"font_size": null, |
|
|
474 |
"text_color": null |
|
|
475 |
} |
|
|
476 |
}, |
|
|
477 |
"13096f9d712a4ea291e08db5599f2ff0": { |
|
|
478 |
"model_module": "@jupyter-widgets/base", |
|
|
479 |
"model_module_version": "2.0.0", |
|
|
480 |
"model_name": "LayoutModel", |
|
|
481 |
"state": { |
|
|
482 |
"width": "145px" |
|
|
483 |
} |
|
|
484 |
}, |
|
|
485 |
"1722bbc2c03549f78352aaa039419259": { |
|
|
486 |
"model_module": "@jupyter-widgets/base", |
|
|
487 |
"model_module_version": "2.0.0", |
|
|
488 |
"model_name": "LayoutModel", |
|
|
489 |
"state": { |
|
|
490 |
"grid_area": "right", |
|
|
491 |
"padding": "0px 0px 0px 0px", |
|
|
492 |
"width": "70px" |
|
|
493 |
} |
|
|
494 |
}, |
|
|
495 |
"24cbb8c9561a41439207210621091be4": { |
|
|
496 |
"model_module": "@jupyter-widgets/controls", |
|
|
497 |
"model_module_version": "2.0.0", |
|
|
498 |
"model_name": "HTMLModel", |
|
|
499 |
"state": { |
|
|
500 |
"layout": "IPY_MODEL_5d27f6f182da4a74b7930bdc68f8d806", |
|
|
501 |
"style": "IPY_MODEL_60c4bce74c834cc3987281ebcd1cf6aa", |
|
|
502 |
"value": "<h5>Queue</h5>" |
|
|
503 |
} |
|
|
504 |
}, |
|
|
505 |
"25fd069e98ad4a1d831936f1e63c06e6": { |
|
|
506 |
"model_module": "@jupyter-widgets/base", |
|
|
507 |
"model_module_version": "2.0.0", |
|
|
508 |
"model_name": "LayoutModel", |
|
|
509 |
"state": { |
|
|
510 |
"margin": "0px 0px 0px 37px", |
|
|
511 |
"width": "600px" |
|
|
512 |
} |
|
|
513 |
}, |
|
|
514 |
"29e2ed0b9e5d4ce89de20f1d1b9bbe8d": { |
|
|
515 |
"model_module": "@jupyter-widgets/base", |
|
|
516 |
"model_module_version": "2.0.0", |
|
|
517 |
"model_name": "LayoutModel", |
|
|
518 |
"state": { |
|
|
519 |
"width": "95px" |
|
|
520 |
} |
|
|
521 |
}, |
|
|
522 |
"32a7b1e7d7ab4c4f963350167f03fa16": { |
|
|
523 |
"model_module": "@jupyter-widgets/controls", |
|
|
524 |
"model_module_version": "2.0.0", |
|
|
525 |
"model_name": "HTMLModel", |
|
|
526 |
"state": { |
|
|
527 |
"layout": "IPY_MODEL_6715cf6864024157909ee5eea225e217", |
|
|
528 |
"style": "IPY_MODEL_d1a5c0045f53430abb89801021cfc1a8", |
|
|
529 |
"value": "<h5>Message</h5>" |
|
|
530 |
} |
|
|
531 |
}, |
|
|
532 |
"4635f93e79f44be8af6cdfd0c0cab824": { |
|
|
533 |
"model_module": "@jupyter-widgets/base", |
|
|
534 |
"model_module_version": "2.0.0", |
|
|
535 |
"model_name": "LayoutModel", |
|
|
536 |
"state": { |
|
|
537 |
"width": "190px" |
|
|
538 |
} |
|
|
539 |
}, |
|
|
540 |
"48f6b3c692344f859898ee79bf3269c6": { |
|
|
541 |
"model_module": "@jupyter-widgets/controls", |
|
|
542 |
"model_module_version": "2.0.0", |
|
|
543 |
"model_name": "HTMLModel", |
|
|
544 |
"state": { |
|
|
545 |
"layout": "IPY_MODEL_29e2ed0b9e5d4ce89de20f1d1b9bbe8d", |
|
|
546 |
"style": "IPY_MODEL_10a4a47d5baa4709bb35375be95a8133", |
|
|
547 |
"value": "<h5>Status</h5>" |
|
|
548 |
} |
|
|
549 |
}, |
|
|
550 |
"5d27f6f182da4a74b7930bdc68f8d806": { |
|
|
551 |
"model_module": "@jupyter-widgets/base", |
|
|
552 |
"model_module_version": "2.0.0", |
|
|
553 |
"model_name": "LayoutModel", |
|
|
554 |
"state": { |
|
|
555 |
"width": "70px" |
|
|
556 |
} |
|
|
557 |
}, |
|
|
558 |
"5d604f0eb7df440099974e8af3489e9b": { |
|
|
559 |
"model_module": "@jupyter-widgets/controls", |
|
|
560 |
"model_module_version": "2.0.0", |
|
|
561 |
"model_name": "HTMLModel", |
|
|
562 |
"state": { |
|
|
563 |
"layout": "IPY_MODEL_4635f93e79f44be8af6cdfd0c0cab824", |
|
|
564 |
"style": "IPY_MODEL_0b3d40adc90a49508071d342b90d2635", |
|
|
565 |
"value": "<h5>Job ID</h5>" |
|
|
566 |
} |
|
|
567 |
}, |
|
|
568 |
"60c4bce74c834cc3987281ebcd1cf6aa": { |
|
|
569 |
"model_module": "@jupyter-widgets/controls", |
|
|
570 |
"model_module_version": "2.0.0", |
|
|
571 |
"model_name": "HTMLStyleModel", |
|
|
572 |
"state": { |
|
|
573 |
"description_width": "", |
|
|
574 |
"font_size": null, |
|
|
575 |
"text_color": null |
|
|
576 |
} |
|
|
577 |
}, |
|
|
578 |
"6715cf6864024157909ee5eea225e217": { |
|
|
579 |
"model_module": "@jupyter-widgets/base", |
|
|
580 |
"model_module_version": "2.0.0", |
|
|
581 |
"model_name": "LayoutModel", |
|
|
582 |
"state": {} |
|
|
583 |
}, |
|
|
584 |
"6bb95d623d0448999be7d0d22204eb79": { |
|
|
585 |
"model_module": "@jupyter-widgets/controls", |
|
|
586 |
"model_module_version": "2.0.0", |
|
|
587 |
"model_name": "GridBoxModel", |
|
|
588 |
"state": { |
|
|
589 |
"children": [ |
|
|
590 |
"IPY_MODEL_c74cf6fd788f4728a30a03fef2d44186" |
|
|
591 |
], |
|
|
592 |
"layout": "IPY_MODEL_c40a71bc7f6a4ca5bc38f29c149f4709" |
|
|
593 |
} |
|
|
594 |
}, |
|
|
595 |
"724ffdf468f54b58a37b24e658fda050": { |
|
|
596 |
"model_module": "@jupyter-widgets/base", |
|
|
597 |
"model_module_version": "2.0.0", |
|
|
598 |
"model_name": "LayoutModel", |
|
|
599 |
"state": { |
|
|
600 |
"margin": "0px 0px 10px 0px" |
|
|
601 |
} |
|
|
602 |
}, |
|
|
603 |
"735d7e88f9d641238c7f40d2e045e3bb": { |
|
|
604 |
"model_module": "@jupyter-widgets/controls", |
|
|
605 |
"model_module_version": "2.0.0", |
|
|
606 |
"model_name": "HTMLStyleModel", |
|
|
607 |
"state": { |
|
|
608 |
"description_width": "", |
|
|
609 |
"font_size": null, |
|
|
610 |
"text_color": null |
|
|
611 |
} |
|
|
612 |
}, |
|
|
613 |
"77d2ef8d5959493dbc421ff1b2c3c6fd": { |
|
|
614 |
"model_module": "@jupyter-widgets/controls", |
|
|
615 |
"model_module_version": "2.0.0", |
|
|
616 |
"model_name": "HTMLStyleModel", |
|
|
617 |
"state": { |
|
|
618 |
"description_width": "", |
|
|
619 |
"font_size": null, |
|
|
620 |
"text_color": null |
|
|
621 |
} |
|
|
622 |
}, |
|
|
623 |
"8723ddc457e54b709e92f5bfad46a3ab": { |
|
|
624 |
"model_module": "@jupyter-widgets/controls", |
|
|
625 |
"model_module_version": "2.0.0", |
|
|
626 |
"model_name": "HTMLModel", |
|
|
627 |
"state": { |
|
|
628 |
"layout": "IPY_MODEL_724ffdf468f54b58a37b24e658fda050", |
|
|
629 |
"style": "IPY_MODEL_77d2ef8d5959493dbc421ff1b2c3c6fd", |
|
|
630 |
"value": "<p style='font-family: IBM Plex Sans, Arial, Helvetica, sans-serif; font-size: 20px; font-weight: medium;'>Circuit Properties</p>" |
|
|
631 |
} |
|
|
632 |
}, |
|
|
633 |
"aed286e7e6d945fa924241a375184150": { |
|
|
634 |
"model_module": "@jupyter-widgets/controls", |
|
|
635 |
"model_module_version": "2.0.0", |
|
|
636 |
"model_name": "HTMLModel", |
|
|
637 |
"state": { |
|
|
638 |
"layout": "IPY_MODEL_13096f9d712a4ea291e08db5599f2ff0", |
|
|
639 |
"style": "IPY_MODEL_735d7e88f9d641238c7f40d2e045e3bb", |
|
|
640 |
"value": "<h5>Backend</h5>" |
|
|
641 |
} |
|
|
642 |
}, |
|
|
643 |
"b471ead916bf42d9b86f5fd941dcb033": { |
|
|
644 |
"model_module": "@jupyter-widgets/controls", |
|
|
645 |
"model_module_version": "2.0.0", |
|
|
646 |
"model_name": "ButtonStyleModel", |
|
|
647 |
"state": { |
|
|
648 |
"font_family": null, |
|
|
649 |
"font_size": null, |
|
|
650 |
"font_style": null, |
|
|
651 |
"font_variant": null, |
|
|
652 |
"font_weight": null, |
|
|
653 |
"text_color": null, |
|
|
654 |
"text_decoration": null |
|
|
655 |
} |
|
|
656 |
}, |
|
|
657 |
"c40a71bc7f6a4ca5bc38f29c149f4709": { |
|
|
658 |
"model_module": "@jupyter-widgets/base", |
|
|
659 |
"model_module_version": "2.0.0", |
|
|
660 |
"model_name": "LayoutModel", |
|
|
661 |
"state": { |
|
|
662 |
"grid_template_areas": "\n \". . . . right \"\n ", |
|
|
663 |
"grid_template_columns": "20% 20% 20% 20% 20%", |
|
|
664 |
"width": "100%" |
|
|
665 |
} |
|
|
666 |
}, |
|
|
667 |
"c74cf6fd788f4728a30a03fef2d44186": { |
|
|
668 |
"model_module": "@jupyter-widgets/controls", |
|
|
669 |
"model_module_version": "2.0.0", |
|
|
670 |
"model_name": "ButtonModel", |
|
|
671 |
"state": { |
|
|
672 |
"button_style": "primary", |
|
|
673 |
"description": "Clear", |
|
|
674 |
"layout": "IPY_MODEL_1722bbc2c03549f78352aaa039419259", |
|
|
675 |
"style": "IPY_MODEL_b471ead916bf42d9b86f5fd941dcb033", |
|
|
676 |
"tooltip": null |
|
|
677 |
} |
|
|
678 |
}, |
|
|
679 |
"d1a5c0045f53430abb89801021cfc1a8": { |
|
|
680 |
"model_module": "@jupyter-widgets/controls", |
|
|
681 |
"model_module_version": "2.0.0", |
|
|
682 |
"model_name": "HTMLStyleModel", |
|
|
683 |
"state": { |
|
|
684 |
"description_width": "", |
|
|
685 |
"font_size": null, |
|
|
686 |
"text_color": null |
|
|
687 |
} |
|
|
688 |
}, |
|
|
689 |
"e1419a1797ec4dcda5bf7c48cd3c035c": { |
|
|
690 |
"model_module": "@jupyter-widgets/controls", |
|
|
691 |
"model_module_version": "2.0.0", |
|
|
692 |
"model_name": "HBoxModel", |
|
|
693 |
"state": { |
|
|
694 |
"children": [ |
|
|
695 |
"IPY_MODEL_5d604f0eb7df440099974e8af3489e9b", |
|
|
696 |
"IPY_MODEL_aed286e7e6d945fa924241a375184150", |
|
|
697 |
"IPY_MODEL_48f6b3c692344f859898ee79bf3269c6", |
|
|
698 |
"IPY_MODEL_24cbb8c9561a41439207210621091be4", |
|
|
699 |
"IPY_MODEL_32a7b1e7d7ab4c4f963350167f03fa16" |
|
|
700 |
], |
|
|
701 |
"layout": "IPY_MODEL_25fd069e98ad4a1d831936f1e63c06e6" |
|
|
702 |
} |
|
|
703 |
} |
|
|
704 |
}, |
|
|
705 |
"version_major": 2, |
|
|
706 |
"version_minor": 0 |
|
|
707 |
} |
|
|
708 |
} |
|
|
709 |
}, |
|
|
710 |
"nbformat": 4, |
|
|
711 |
"nbformat_minor": 5 |
|
|
712 |
} |