|
a |
|
b/Code/All Qiskit ML Demos/07 Pegasos QSVM 22.5s kkawchak.ipynb |
|
|
1 |
{ |
|
|
2 |
"cells": [ |
|
|
3 |
{ |
|
|
4 |
"cell_type": "markdown", |
|
|
5 |
"id": "opened-florist", |
|
|
6 |
"metadata": {}, |
|
|
7 |
"source": [ |
|
|
8 |
"import time\n", |
|
|
9 |
"seconds = time.time()\n", |
|
|
10 |
"print(\"Time in seconds since beginning of run:\", seconds)\n", |
|
|
11 |
"local_time = time.ctime(seconds)\n", |
|
|
12 |
"print(local_time)\n", |
|
|
13 |
"# Pegasos Quantum Support Vector Classifier\n", |
|
|
14 |
"\n", |
|
|
15 |
"There's another SVM based algorithm that benefits from the quantum kernel method. Here, we introduce an implementation of a another classification algorithm, which is an alternative version to the `QSVC` available in Qiskit Machine Learning and shown in the [\"Quantum Kernel Machine Learning\"](./03_quantum_kernel.ipynb) tutorial. This classification algorithm implements the Pegasos algorithm from the paper \"Pegasos: Primal Estimated sub-GrAdient SOlver for SVM\" by Shalev-Shwartz et al., see: https://home.ttic.edu/~nati/Publications/PegasosMPB.pdf.\n", |
|
|
16 |
"\n", |
|
|
17 |
"This algorithm is an alternative to the dual optimization from the `scikit-learn` package, benefits from the kernel trick, and yields a training complexity that is independent of the size of the training set. Thus, the `PegasosQSVC` is expected to train faster than QSVC for sufficiently large training sets.\n", |
|
|
18 |
"\n", |
|
|
19 |
"The algorithm can be used as direct replacement of `QSVC` with some hyper-parameterization." |
|
|
20 |
] |
|
|
21 |
}, |
|
|
22 |
{ |
|
|
23 |
"cell_type": "code", |
|
|
24 |
"execution_count": 12, |
|
|
25 |
"id": "759a01c7-b426-4ebe-8a4e-c9b9a1104603", |
|
|
26 |
"metadata": {}, |
|
|
27 |
"outputs": [ |
|
|
28 |
{ |
|
|
29 |
"name": "stdout", |
|
|
30 |
"output_type": "stream", |
|
|
31 |
"text": [ |
|
|
32 |
"Time in seconds since beginning of run: 1696472962.5317466\n", |
|
|
33 |
"Thu Oct 5 02:29:22 2023\n" |
|
|
34 |
] |
|
|
35 |
} |
|
|
36 |
], |
|
|
37 |
"source": [ |
|
|
38 |
"import time\n", |
|
|
39 |
"seconds = time.time()\n", |
|
|
40 |
"print(\"Time in seconds since beginning of run:\", seconds)\n", |
|
|
41 |
"local_time = time.ctime(seconds)\n", |
|
|
42 |
"print(local_time)" |
|
|
43 |
] |
|
|
44 |
}, |
|
|
45 |
{ |
|
|
46 |
"cell_type": "markdown", |
|
|
47 |
"id": "thirty-painting", |
|
|
48 |
"metadata": {}, |
|
|
49 |
"source": [ |
|
|
50 |
"Let's generate some data:" |
|
|
51 |
] |
|
|
52 |
}, |
|
|
53 |
{ |
|
|
54 |
"cell_type": "code", |
|
|
55 |
"execution_count": 13, |
|
|
56 |
"id": "impressed-laser", |
|
|
57 |
"metadata": {}, |
|
|
58 |
"outputs": [], |
|
|
59 |
"source": [ |
|
|
60 |
"from sklearn.datasets import make_blobs\n", |
|
|
61 |
"\n", |
|
|
62 |
"# example dataset\n", |
|
|
63 |
"features, labels = make_blobs(n_samples=20, n_features=2, centers=2, random_state=3, shuffle=True)" |
|
|
64 |
] |
|
|
65 |
}, |
|
|
66 |
{ |
|
|
67 |
"cell_type": "markdown", |
|
|
68 |
"id": "moderate-yugoslavia", |
|
|
69 |
"metadata": {}, |
|
|
70 |
"source": [ |
|
|
71 |
"We pre-process the data to ensure compatibility with the rotation encoding and split it into the training and test datasets." |
|
|
72 |
] |
|
|
73 |
}, |
|
|
74 |
{ |
|
|
75 |
"cell_type": "code", |
|
|
76 |
"execution_count": 14, |
|
|
77 |
"id": "adolescent-composer", |
|
|
78 |
"metadata": {}, |
|
|
79 |
"outputs": [], |
|
|
80 |
"source": [ |
|
|
81 |
"import numpy as np\n", |
|
|
82 |
"\n", |
|
|
83 |
"from sklearn.model_selection import train_test_split\n", |
|
|
84 |
"from sklearn.preprocessing import MinMaxScaler\n", |
|
|
85 |
"\n", |
|
|
86 |
"features = MinMaxScaler(feature_range=(0, np.pi)).fit_transform(features)\n", |
|
|
87 |
"\n", |
|
|
88 |
"train_features, test_features, train_labels, test_labels = train_test_split(\n", |
|
|
89 |
" features, labels, train_size=15, shuffle=False\n", |
|
|
90 |
")" |
|
|
91 |
] |
|
|
92 |
}, |
|
|
93 |
{ |
|
|
94 |
"cell_type": "markdown", |
|
|
95 |
"id": "central-poverty", |
|
|
96 |
"metadata": {}, |
|
|
97 |
"source": [ |
|
|
98 |
"We have two features in the dataset, so we set a number of qubits to the number of features in the dataset.\n", |
|
|
99 |
"\n", |
|
|
100 |
"Then we set $\\tau$ to the number of steps performed during the training procedure. Please note that, there is no early stopping criterion in the algorithm. The algorithm iterates over all $\\tau$ steps.\n", |
|
|
101 |
"\n", |
|
|
102 |
"And the last one is the hyperparameter $C$. This is a positive regularization parameter. The strength of the regularization is inversely proportional to $C$. Smaller $C$ induce smaller weights which generally helps preventing overfitting. However, due to the nature of this algorithm, some of the computation steps become trivial for larger $C$. Thus, larger $C$ improve the performance of the algorithm drastically. If the data is linearly separable in feature space, $C$ should be chosen to be large. If the separation is not perfect, $C$ should be chosen smaller to prevent overfitting." |
|
|
103 |
] |
|
|
104 |
}, |
|
|
105 |
{ |
|
|
106 |
"cell_type": "code", |
|
|
107 |
"execution_count": 15, |
|
|
108 |
"id": "dying-dispatch", |
|
|
109 |
"metadata": {}, |
|
|
110 |
"outputs": [], |
|
|
111 |
"source": [ |
|
|
112 |
"# number of qubits is equal to the number of features\n", |
|
|
113 |
"num_qubits = 2\n", |
|
|
114 |
"\n", |
|
|
115 |
"# number of steps performed during the training procedure\n", |
|
|
116 |
"tau = 50\n", |
|
|
117 |
"\n", |
|
|
118 |
"# regularization parameter\n", |
|
|
119 |
"C = 1000" |
|
|
120 |
] |
|
|
121 |
}, |
|
|
122 |
{ |
|
|
123 |
"cell_type": "markdown", |
|
|
124 |
"id": "improving-wilderness", |
|
|
125 |
"metadata": {}, |
|
|
126 |
"source": [ |
|
|
127 |
"The algorithm will run using:\n", |
|
|
128 |
"\n", |
|
|
129 |
"- The default fidelity instantiated in `FidelityQuantumKernel`\n", |
|
|
130 |
"- A quantum kernel created from `ZFeatureMap`" |
|
|
131 |
] |
|
|
132 |
}, |
|
|
133 |
{ |
|
|
134 |
"cell_type": "code", |
|
|
135 |
"execution_count": 16, |
|
|
136 |
"id": "automated-allergy", |
|
|
137 |
"metadata": {}, |
|
|
138 |
"outputs": [], |
|
|
139 |
"source": [ |
|
|
140 |
"from qiskit import BasicAer\n", |
|
|
141 |
"from qiskit.circuit.library import ZFeatureMap\n", |
|
|
142 |
"from qiskit.utils import algorithm_globals\n", |
|
|
143 |
"\n", |
|
|
144 |
"from qiskit_machine_learning.kernels import FidelityQuantumKernel\n", |
|
|
145 |
"\n", |
|
|
146 |
"algorithm_globals.random_seed = 12345\n", |
|
|
147 |
"\n", |
|
|
148 |
"feature_map = ZFeatureMap(feature_dimension=num_qubits, reps=1)\n", |
|
|
149 |
"\n", |
|
|
150 |
"qkernel = FidelityQuantumKernel(feature_map=feature_map)" |
|
|
151 |
] |
|
|
152 |
}, |
|
|
153 |
{ |
|
|
154 |
"cell_type": "markdown", |
|
|
155 |
"id": "attractive-stationery", |
|
|
156 |
"metadata": {}, |
|
|
157 |
"source": [ |
|
|
158 |
"The implementation `PegasosQSVC` is compatible with the `scikit-learn` interfaces and has a pretty standard way of training a model. In the constructor we pass parameters of the algorithm, in this case there are a regularization hyper-parameter $C$ and a number of steps.\n", |
|
|
159 |
"\n", |
|
|
160 |
"Then we pass training features and labels to the `fit` method, which trains a models and returns a fitted classifier.\n", |
|
|
161 |
"\n", |
|
|
162 |
"Afterwards, we score our model using test features and labels." |
|
|
163 |
] |
|
|
164 |
}, |
|
|
165 |
{ |
|
|
166 |
"cell_type": "code", |
|
|
167 |
"execution_count": 17, |
|
|
168 |
"id": "representative-thumb", |
|
|
169 |
"metadata": {}, |
|
|
170 |
"outputs": [ |
|
|
171 |
{ |
|
|
172 |
"name": "stdout", |
|
|
173 |
"output_type": "stream", |
|
|
174 |
"text": [ |
|
|
175 |
"PegasosQSVC classification test score: 1.0\n" |
|
|
176 |
] |
|
|
177 |
} |
|
|
178 |
], |
|
|
179 |
"source": [ |
|
|
180 |
"from qiskit_machine_learning.algorithms import PegasosQSVC\n", |
|
|
181 |
"\n", |
|
|
182 |
"pegasos_qsvc = PegasosQSVC(quantum_kernel=qkernel, C=C, num_steps=tau)\n", |
|
|
183 |
"\n", |
|
|
184 |
"# training\n", |
|
|
185 |
"pegasos_qsvc.fit(train_features, train_labels)\n", |
|
|
186 |
"\n", |
|
|
187 |
"# testing\n", |
|
|
188 |
"pegasos_score = pegasos_qsvc.score(test_features, test_labels)\n", |
|
|
189 |
"print(f\"PegasosQSVC classification test score: {pegasos_score}\")" |
|
|
190 |
] |
|
|
191 |
}, |
|
|
192 |
{ |
|
|
193 |
"cell_type": "markdown", |
|
|
194 |
"id": "sustainable-empire", |
|
|
195 |
"metadata": {}, |
|
|
196 |
"source": [ |
|
|
197 |
"For visualization purposes we create a mesh grid of a predefined step that spans our minimum and maximum values we applied in MinMaxScaler. We also add some margin to the grid for better representation of the training and test samples." |
|
|
198 |
] |
|
|
199 |
}, |
|
|
200 |
{ |
|
|
201 |
"cell_type": "code", |
|
|
202 |
"execution_count": 18, |
|
|
203 |
"id": "judicial-pottery", |
|
|
204 |
"metadata": {}, |
|
|
205 |
"outputs": [], |
|
|
206 |
"source": [ |
|
|
207 |
"grid_step = 0.2\n", |
|
|
208 |
"margin = 0.2\n", |
|
|
209 |
"grid_x, grid_y = np.meshgrid(\n", |
|
|
210 |
" np.arange(-margin, np.pi + margin, grid_step), np.arange(-margin, np.pi + margin, grid_step)\n", |
|
|
211 |
")" |
|
|
212 |
] |
|
|
213 |
}, |
|
|
214 |
{ |
|
|
215 |
"cell_type": "markdown", |
|
|
216 |
"id": "marine-constitution", |
|
|
217 |
"metadata": {}, |
|
|
218 |
"source": [ |
|
|
219 |
"We convert the grid to the shape compatible with the model, the shape should be `(n_samples, n_features)`.\n", |
|
|
220 |
"Then for each grid point we predict a label. In our case predicted labels will be used for coloring the grid." |
|
|
221 |
] |
|
|
222 |
}, |
|
|
223 |
{ |
|
|
224 |
"cell_type": "code", |
|
|
225 |
"execution_count": 19, |
|
|
226 |
"id": "competitive-outdoors", |
|
|
227 |
"metadata": {}, |
|
|
228 |
"outputs": [], |
|
|
229 |
"source": [ |
|
|
230 |
"meshgrid_features = np.column_stack((grid_x.ravel(), grid_y.ravel()))\n", |
|
|
231 |
"meshgrid_colors = pegasos_qsvc.predict(meshgrid_features)" |
|
|
232 |
] |
|
|
233 |
}, |
|
|
234 |
{ |
|
|
235 |
"cell_type": "markdown", |
|
|
236 |
"id": "former-constraint", |
|
|
237 |
"metadata": {}, |
|
|
238 |
"source": [ |
|
|
239 |
"Finally, we plot our grid according to the labels/colors we obtained from the model. We also plot training and test samples." |
|
|
240 |
] |
|
|
241 |
}, |
|
|
242 |
{ |
|
|
243 |
"cell_type": "code", |
|
|
244 |
"execution_count": 20, |
|
|
245 |
"id": "monetary-knife", |
|
|
246 |
"metadata": { |
|
|
247 |
"tags": [ |
|
|
248 |
"nbsphinx-thumbnail" |
|
|
249 |
] |
|
|
250 |
}, |
|
|
251 |
"outputs": [ |
|
|
252 |
{ |
|
|
253 |
"data": { |
|
|
254 |
"image/png": "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jBYUFIR58+Y1yrmMCiufffYZOnfuDBcXF7i4uCAqKgr/+c9/6tzn22+/Rbt27eDg4IBOnTphy5Yt91VhIiIiWzZmzBhIkqRbPD090bdvX4PvBKoWExODiRMnmqweBw4cwIsvvmiy49XFqLDi7++PDz74AIcOHcLBgwcRGxuLJ598EsePH6+1/N69ezFs2DC88MILOHz4MBITE5GYmIhjx46ZpPJERESWptEAmZnAqlVVf2o05j9n3759kZ+fj/z8fGzfvh12dnYYMGDAfR9XCIHKysp6lfXy8kKzZs3u+5z1YVRYGThwIPr374/g4GC0bdsWs2fPhpOTE3766aday8+fPx99+/bFm2++idDQULz77ruIiIjAggULTFJ5IiIiS0pLA9q0AXr3BoYPr/qzTZuq9eakVqvh6+sLX19fhIeHY8qUKTh//jwuXrxYa/kxY8Zg586dmD9/vq5HJi8vD5mZmZAkCf/5z38QGRkJtVqN3bt34/Tp03jyySfh4+MDJycnPPzww/j+++/1jnn3bSBJkrB06VI89dRTaNasGYKDg7Fp0yaTtLfBY1Y0Gg1Wr16N8vJyREVF1VomKysLcXFxeuvi4+ORlZVV57ErKipQWlqqtxAREclJWhowZAjQqROQlVX1TsOsrKrPQ4aYP7BUKysrw4oVK9CmTRt4enrWWmb+/PmIiorC+PHjdT0yAQEBuu1TpkzBBx98gNzcXHTu3BllZWXo378/tm/fjsOHD6Nv374YOHAgzp07V2ddZs6ciWeffRZHjhxB//798be//Q2XL1++7zYaPSnc0aNHERUVhRs3bsDJyQnr169H+/btay1bUFAAHx8fvXU+Pj4oKCio8xzJycmYOXOmsVUjIiJqFBoN8I9/AAMGABs2AIrbv/p37171OTERmDwZePJJQKk0/fk3b94MJycnAEB5eTn8/PywefNmKBS190G4urpCpVKhWbNm8PX1rbF91qxZeOKJJ3SfPTw8EBYWpvv87rvvYv369di0aRMmTJhgsF5jxozBsGHDAADvv/8+PvnkE+zfvx99+/ZtUDurGd2zEhISgpycHOzbtw+vvPIKRo8ejRMnTtxXJe42depUlJSU6Jbz58+b9PhERET348cfgbw84O23/woq1RQKYOpU4MyZqnLm0Lt3b+Tk5CAnJwf79+9HfHw8+vXrh7NnzzboeF27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ERGRrDGsEBERkawxrBAREZGsMawQERGRrDGsEBERkawxrBAREZGsMawQERGRrDGsEBERkawxrBAREZGsMawQERGRrDGsEBERkawxrBAREZGsMawQERGRrDGsEBERkawxrBAREZGs2Vm6Asb4ulNPSEqVpatB1KQsC481y3HH5uwwy3HJ9Mz1b4DIVNizQkRERLLGsEJERESyxrBCREREssawQkRERLLGsEJERESyxrBCREREsmZVjy5bghASRFlboNINsCuG5HQKkiQsXS0iIiKbwbBSB21xBKTC4dBc99Cts3O8DK3PSijcsi1YMyIiItvB20AGaIsjoMlLQt/H3ZGVBVy9CmRlAfGxbtDkJUFbHGHpKhIREdkEhpVaCCFBKhyOAQOAjRsldO8OODkB3bsDmzYpkJAgIBUOgxCSpatKRETU5DGs1EKUtUXldQ9MmyZBcddXSKEApk1ToPK6Z9VYFiIiIjIrhpXaVLoBADp2rH2zbv3tckRERGQ+DCu1sSsGABw7Vvtm3frb5YiIiMh8GFZqITmdgp3jZbz3nhZarf42rRaYPVsLO8c/ITmdskwFiYiIbAjDSi0kSUD4rER6uoRBg7R6TwMNGqRFeroE4bOK860QERE1As6zYoDCLRsIWohtO4YjPf3OeVauQBm0ivOsEBERNRKGlToo3LIhXA9DeccMtnA6BQV7VIiIiBoNw8o9SJKA5HzS0tUgIiKyWRyzQkRERLLGsEJERESyxrBCREREssYxK0RkFsvCY01+zLE5O0x+THMxR/uJbBV7VoiIiEjWGFaIiIhI1hhWiIiISNYYVoiIiEjWGFaIiIhI1owOK7t27cLAgQPRokULSJKEDRs23HOfzMxMREREQK1Wo02bNkhNTW1AVYmIiMgWGR1WysvLERYWhoULF9ar/JkzZ5CQkIDevXsjJycHEydOxLhx47Bt2zajK0tERES2x+h5Vvr164d+/frVu/zixYvRqlUrzJkzBwAQGhqK3bt34+OPP0Z8fLyxpyciIiIbY/YxK1lZWYiLi9NbFx8fj6ysLIP7VFRUoLS0VG8hIiIi22T2sFJQUAAfHx+9dT4+PigtLcX169dr3Sc5ORmurq66JSAgwNzVJCIiIpmS5dNAU6dORUlJiW45f/68patEREREFmL2dwP5+vqisLBQb11hYSFcXFzg6OhY6z5qtRpq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xh9//GHwPBUVFSgtLdVbmjqFWzaUQQsB+2L9DfZXoAxayHlWiIjIZpl9UrioqChERUXpPkdHRyM0NBSff/453n333Vr3SU5OxsyZM81dNdlRuGVDcj3MGWypUY3N2WHpKlicOb4Gy8JjTX5MIltlVM/KAw88AKVSicLCQr31hYWF8PX1rdcx7O3t0aVLF/z2228Gy0ydOhUlJSW65fz588ZU06pJkoDC+SQU7vugcD7JoEJERDbPqLCiUqkQGRmJ7du369ZptVps375dr/ekLhqNBkePHoWfn5/BMmq1Gi4uLnoLERER2SajbwNNmjQJo0ePRteuXdGtWzfMmzcP5eXleP755wEAo0aNQsuWLZGcnAwAmDVrFrp37442bdqguLgYH330Ec6ePYtx48aZtiVERETUJBkdVoYOHYqLFy9i+vTpKCgoQHh4OLZu3aobdHvu3DkoFH912Fy5cgXjx49HQUEB3N3dERkZib1796J9+/amawURERE1WZIQQvaDIkpLS+Hq6gq7Tn+DpFRZujpETQoH2JoHB9iantDcROXRf6OkpITDA2wM3w1EREREssawQkRERLLGsEJERESyxrBCREREssawQkRERLLGsEJERESyxrBCREREssawQkRERLLGsEJERESyxrBCREREssawQkRERLLGsEJERESyxrBCREREssawQkRERLJmZ+kKUOMSQoIoawtUugF2xZCcTkGShKWrRUREZBDDig3RFkdAKhwOzXUP3To7x8vQ+qyEwi3bgjWj+hibs8PSVSAjWNP1WhYea+kqENWJt4FshLY4Apq8JPR93B1ZWcDVq0BWFhAf6wZNXhK0xRGWriIREVGtGFZsgBASpMLhGDAA2LhRQvfugJMT0L07sGmTAgkJAlLhMAghWbqqRERENTCs2ABR1haV1z0wbZoExV1XXKEApk1ToPK6Z9VYFiIiIplhWLEFlW4AgI4da9+sW3+7HBERkZwwrNgCu2IAwLFjtW/Wrb9djoiISE4YVmyA5HQKdo6X8d57Wmi1+tu0WmD2bC3sHP+E5HTKMhUkIiKqA8OKDZAkAeGzEunpEgYN0uo9DTRokBbp6RKEzyrOt0JERLLEeVZshMItGwhaiG07hiM9/c55Vq5AGbSK86wQEZFsMazYEIVbNoTrYSjvmMEWTqegYI8KERHJGMOKjZEkAcn5pKWr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hw6J5557Tjg4OIjjx49bqgk1XL16VRw+fFgcPnxYABBz584Vhw8fFmfPnhVCCDFlyhQxcuRIXfnff/9dNGvWTLz55psiNzdXLFy4UCiVSrF161ZLNaFWxrbr448/Fhs2bBC//vqrOHr0qHj99deFQqEQ33//vaWaUMMrr7wiXF1dRWZmpsjPz9ct165d05Wxxu+thrTLGr63pkyZInbu3CnOnDkjjhw5IqZMmSIkSRLfffedEMI6rxU1HQwrt3366afiwQcfFCqVSnTr1k389NNPum29evUSo0eP1iv/zTffiLZt2wqVSiU6dOgg0tPTG7nG9WNMuyZOnKgr6+PjI/r37y+ys7MtUGvDqh/ZvXupbsfo0aNFr169auwTHh4uVCqVeOihh8Ty5csbvd73Ymy7PvzwQ9G6dWvh4OAgPDw8RExMjNixY4dlKm9Abe0BoPf1t8bvrYa0yxq+t8aOHSsCAwOFSqUSXl5e4vHHH9cFFSGs81pR0yEJIUTj9eMQERERGcfmx6wQERGRvDGsEBERkawxrBAREZGsMawQERGRrDGsEBERkawxrBAREZGsMawQERGRrDGsEBERkawxrBAREZGsMawQERGRrDGsEBERkawxrBAREZGs/X9iAnoyZwKRMAAAAABJRU5ErkJggg==\n", |
|
|
255 |
"text/plain": [ |
|
|
256 |
"<Figure size 500x500 with 1 Axes>" |
|
|
257 |
] |
|
|
258 |
}, |
|
|
259 |
"metadata": {}, |
|
|
260 |
"output_type": "display_data" |
|
|
261 |
} |
|
|
262 |
], |
|
|
263 |
"source": [ |
|
|
264 |
"import matplotlib.pyplot as plt\n", |
|
|
265 |
"\n", |
|
|
266 |
"plt.figure(figsize=(5, 5))\n", |
|
|
267 |
"meshgrid_colors = meshgrid_colors.reshape(grid_x.shape)\n", |
|
|
268 |
"plt.pcolormesh(grid_x, grid_y, meshgrid_colors, cmap=\"RdBu\", shading=\"auto\")\n", |
|
|
269 |
"\n", |
|
|
270 |
"plt.scatter(\n", |
|
|
271 |
" train_features[:, 0][train_labels == 0],\n", |
|
|
272 |
" train_features[:, 1][train_labels == 0],\n", |
|
|
273 |
" marker=\"s\",\n", |
|
|
274 |
" facecolors=\"w\",\n", |
|
|
275 |
" edgecolors=\"r\",\n", |
|
|
276 |
" label=\"A train\",\n", |
|
|
277 |
")\n", |
|
|
278 |
"plt.scatter(\n", |
|
|
279 |
" train_features[:, 0][train_labels == 1],\n", |
|
|
280 |
" train_features[:, 1][train_labels == 1],\n", |
|
|
281 |
" marker=\"o\",\n", |
|
|
282 |
" facecolors=\"w\",\n", |
|
|
283 |
" edgecolors=\"b\",\n", |
|
|
284 |
" label=\"B train\",\n", |
|
|
285 |
")\n", |
|
|
286 |
"\n", |
|
|
287 |
"plt.scatter(\n", |
|
|
288 |
" test_features[:, 0][test_labels == 0],\n", |
|
|
289 |
" test_features[:, 1][test_labels == 0],\n", |
|
|
290 |
" marker=\"s\",\n", |
|
|
291 |
" facecolors=\"r\",\n", |
|
|
292 |
" edgecolors=\"r\",\n", |
|
|
293 |
" label=\"A test\",\n", |
|
|
294 |
")\n", |
|
|
295 |
"plt.scatter(\n", |
|
|
296 |
" test_features[:, 0][test_labels == 1],\n", |
|
|
297 |
" test_features[:, 1][test_labels == 1],\n", |
|
|
298 |
" marker=\"o\",\n", |
|
|
299 |
" facecolors=\"b\",\n", |
|
|
300 |
" edgecolors=\"b\",\n", |
|
|
301 |
" label=\"B test\",\n", |
|
|
302 |
")\n", |
|
|
303 |
"\n", |
|
|
304 |
"plt.legend(bbox_to_anchor=(1.05, 1), loc=\"upper left\", borderaxespad=0.0)\n", |
|
|
305 |
"plt.title(\"Pegasos Classification\")\n", |
|
|
306 |
"plt.show()" |
|
|
307 |
] |
|
|
308 |
}, |
|
|
309 |
{ |
|
|
310 |
"cell_type": "code", |
|
|
311 |
"execution_count": 21, |
|
|
312 |
"id": "fddca436-0531-4f77-9c54-71a0ed4dc462", |
|
|
313 |
"metadata": {}, |
|
|
314 |
"outputs": [ |
|
|
315 |
{ |
|
|
316 |
"name": "stdout", |
|
|
317 |
"output_type": "stream", |
|
|
318 |
"text": [ |
|
|
319 |
"Time in seconds since end of run: 1696472984.9916549\n", |
|
|
320 |
"Thu Oct 5 02:29:44 2023\n" |
|
|
321 |
] |
|
|
322 |
} |
|
|
323 |
], |
|
|
324 |
"source": [ |
|
|
325 |
"seconds = time.time()\n", |
|
|
326 |
"print(\"Time in seconds since end of run:\", seconds)\n", |
|
|
327 |
"local_time = time.ctime(seconds)\n", |
|
|
328 |
"print(local_time)" |
|
|
329 |
] |
|
|
330 |
}, |
|
|
331 |
{ |
|
|
332 |
"cell_type": "code", |
|
|
333 |
"execution_count": 22, |
|
|
334 |
"id": "imperial-promise", |
|
|
335 |
"metadata": { |
|
|
336 |
"tags": [] |
|
|
337 |
}, |
|
|
338 |
"outputs": [ |
|
|
339 |
{ |
|
|
340 |
"data": { |
|
|
341 |
"text/html": [ |
|
|
342 |
"<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'>Thu Oct 05 02:29:45 2023 UTC</td></tr></table>" |
|
|
343 |
], |
|
|
344 |
"text/plain": [ |
|
|
345 |
"<IPython.core.display.HTML object>" |
|
|
346 |
] |
|
|
347 |
}, |
|
|
348 |
"metadata": {}, |
|
|
349 |
"output_type": "display_data" |
|
|
350 |
}, |
|
|
351 |
{ |
|
|
352 |
"data": { |
|
|
353 |
"text/html": [ |
|
|
354 |
"<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>" |
|
|
355 |
], |
|
|
356 |
"text/plain": [ |
|
|
357 |
"<IPython.core.display.HTML object>" |
|
|
358 |
] |
|
|
359 |
}, |
|
|
360 |
"metadata": {}, |
|
|
361 |
"output_type": "display_data" |
|
|
362 |
} |
|
|
363 |
], |
|
|
364 |
"source": [ |
|
|
365 |
"import qiskit.tools.jupyter\n", |
|
|
366 |
"\n", |
|
|
367 |
"%qiskit_version_table\n", |
|
|
368 |
"%qiskit_copyright" |
|
|
369 |
] |
|
|
370 |
} |
|
|
371 |
], |
|
|
372 |
"metadata": { |
|
|
373 |
"celltoolbar": "Tags", |
|
|
374 |
"kernelspec": { |
|
|
375 |
"display_name": "Python 3 (ipykernel)", |
|
|
376 |
"language": "python", |
|
|
377 |
"name": "python3" |
|
|
378 |
}, |
|
|
379 |
"language_info": { |
|
|
380 |
"codemirror_mode": { |
|
|
381 |
"name": "ipython", |
|
|
382 |
"version": 3 |
|
|
383 |
}, |
|
|
384 |
"file_extension": ".py", |
|
|
385 |
"mimetype": "text/x-python", |
|
|
386 |
"name": "python", |
|
|
387 |
"nbconvert_exporter": "python", |
|
|
388 |
"pygments_lexer": "ipython3", |
|
|
389 |
"version": "3.10.8" |
|
|
390 |
}, |
|
|
391 |
"widgets": { |
|
|
392 |
"application/vnd.jupyter.widget-state+json": { |
|
|
393 |
"state": { |
|
|
394 |
"2510a0810f054a83b7c0d998a97d6f05": { |
|
|
395 |
"model_module": "@jupyter-widgets/base", |
|
|
396 |
"model_module_version": "2.0.0", |
|
|
397 |
"model_name": "LayoutModel", |
|
|
398 |
"state": { |
|
|
399 |
"margin": "0px 0px 0px 37px", |
|
|
400 |
"width": "600px" |
|
|
401 |
} |
|
|
402 |
}, |
|
|
403 |
"2740f9e368094ddf98713e368606e5f9": { |
|
|
404 |
"model_module": "@jupyter-widgets/controls", |
|
|
405 |
"model_module_version": "2.0.0", |
|
|
406 |
"model_name": "HTMLModel", |
|
|
407 |
"state": { |
|
|
408 |
"layout": "IPY_MODEL_c42f4a3190a24cf79347ef34f4635f42", |
|
|
409 |
"style": "IPY_MODEL_ca2882c4b08e4b7ebfd2d306273683ed", |
|
|
410 |
"value": "<p style='font-family: IBM Plex Sans, Arial, Helvetica, sans-serif; font-size: 20px; font-weight: medium;'>Circuit Properties</p>" |
|
|
411 |
} |
|
|
412 |
}, |
|
|
413 |
"2a0d392e012645c6839339470dfa6884": { |
|
|
414 |
"model_module": "@jupyter-widgets/base", |
|
|
415 |
"model_module_version": "2.0.0", |
|
|
416 |
"model_name": "LayoutModel", |
|
|
417 |
"state": { |
|
|
418 |
"width": "145px" |
|
|
419 |
} |
|
|
420 |
}, |
|
|
421 |
"2d92f0f334dc4378a343209cfa2a469a": { |
|
|
422 |
"model_module": "@jupyter-widgets/base", |
|
|
423 |
"model_module_version": "2.0.0", |
|
|
424 |
"model_name": "LayoutModel", |
|
|
425 |
"state": { |
|
|
426 |
"width": "70px" |
|
|
427 |
} |
|
|
428 |
}, |
|
|
429 |
"2f4cd6604b2248a6b96e62aa082ecb0f": { |
|
|
430 |
"model_module": "@jupyter-widgets/controls", |
|
|
431 |
"model_module_version": "2.0.0", |
|
|
432 |
"model_name": "HTMLStyleModel", |
|
|
433 |
"state": { |
|
|
434 |
"description_width": "", |
|
|
435 |
"font_size": null, |
|
|
436 |
"text_color": null |
|
|
437 |
} |
|
|
438 |
}, |
|
|
439 |
"3feaf14105224daa86f60ecd97a917e0": { |
|
|
440 |
"model_module": "@jupyter-widgets/controls", |
|
|
441 |
"model_module_version": "2.0.0", |
|
|
442 |
"model_name": "HTMLModel", |
|
|
443 |
"state": { |
|
|
444 |
"layout": "IPY_MODEL_f706d41b232847ec8ec859bddaf6d042", |
|
|
445 |
"style": "IPY_MODEL_2f4cd6604b2248a6b96e62aa082ecb0f", |
|
|
446 |
"value": "<h5>Job ID</h5>" |
|
|
447 |
} |
|
|
448 |
}, |
|
|
449 |
"451d96f883ec485eb878bf073a80c757": { |
|
|
450 |
"model_module": "@jupyter-widgets/base", |
|
|
451 |
"model_module_version": "2.0.0", |
|
|
452 |
"model_name": "LayoutModel", |
|
|
453 |
"state": { |
|
|
454 |
"width": "95px" |
|
|
455 |
} |
|
|
456 |
}, |
|
|
457 |
"4ee2dbaaa0d94460a34155eaaefa3ec2": { |
|
|
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 |
"4fe0dc0453a944688c52221fa3ebafa0": { |
|
|
468 |
"model_module": "@jupyter-widgets/controls", |
|
|
469 |
"model_module_version": "2.0.0", |
|
|
470 |
"model_name": "HTMLModel", |
|
|
471 |
"state": { |
|
|
472 |
"layout": "IPY_MODEL_2d92f0f334dc4378a343209cfa2a469a", |
|
|
473 |
"style": "IPY_MODEL_deb18161679c4081b7847b87a971fb94", |
|
|
474 |
"value": "<h5>Queue</h5>" |
|
|
475 |
} |
|
|
476 |
}, |
|
|
477 |
"720cdfcaccfa4a4dbb6108650fed055d": { |
|
|
478 |
"model_module": "@jupyter-widgets/controls", |
|
|
479 |
"model_module_version": "2.0.0", |
|
|
480 |
"model_name": "HTMLModel", |
|
|
481 |
"state": { |
|
|
482 |
"layout": "IPY_MODEL_2a0d392e012645c6839339470dfa6884", |
|
|
483 |
"style": "IPY_MODEL_f8ac1f3c5bef413f918761ac97fc3c34", |
|
|
484 |
"value": "<h5>Backend</h5>" |
|
|
485 |
} |
|
|
486 |
}, |
|
|
487 |
"82953adfc54e47b4994b3521cc3ffe9d": { |
|
|
488 |
"model_module": "@jupyter-widgets/controls", |
|
|
489 |
"model_module_version": "2.0.0", |
|
|
490 |
"model_name": "HBoxModel", |
|
|
491 |
"state": { |
|
|
492 |
"children": [ |
|
|
493 |
"IPY_MODEL_3feaf14105224daa86f60ecd97a917e0", |
|
|
494 |
"IPY_MODEL_720cdfcaccfa4a4dbb6108650fed055d", |
|
|
495 |
"IPY_MODEL_fd818b923dc345a98ca5dc7962c53b06", |
|
|
496 |
"IPY_MODEL_4fe0dc0453a944688c52221fa3ebafa0", |
|
|
497 |
"IPY_MODEL_ad2e5f0edf2a46c6910033225943f815" |
|
|
498 |
], |
|
|
499 |
"layout": "IPY_MODEL_2510a0810f054a83b7c0d998a97d6f05" |
|
|
500 |
} |
|
|
501 |
}, |
|
|
502 |
"90d2312724fd410eaad8198b3a54f96f": { |
|
|
503 |
"model_module": "@jupyter-widgets/base", |
|
|
504 |
"model_module_version": "2.0.0", |
|
|
505 |
"model_name": "LayoutModel", |
|
|
506 |
"state": {} |
|
|
507 |
}, |
|
|
508 |
"985109d9783b4f4a8e8081b1c6a04908": { |
|
|
509 |
"model_module": "@jupyter-widgets/controls", |
|
|
510 |
"model_module_version": "2.0.0", |
|
|
511 |
"model_name": "ButtonModel", |
|
|
512 |
"state": { |
|
|
513 |
"button_style": "primary", |
|
|
514 |
"description": "Clear", |
|
|
515 |
"layout": "IPY_MODEL_b75cad7cf5af4c42beb45a611609d402", |
|
|
516 |
"style": "IPY_MODEL_cd92bb39ee01487c9d9dda7c9c52e086", |
|
|
517 |
"tooltip": null |
|
|
518 |
} |
|
|
519 |
}, |
|
|
520 |
"9f7158bd25844ec9bb05603ca29c1d51": { |
|
|
521 |
"model_module": "@jupyter-widgets/controls", |
|
|
522 |
"model_module_version": "2.0.0", |
|
|
523 |
"model_name": "HTMLStyleModel", |
|
|
524 |
"state": { |
|
|
525 |
"description_width": "", |
|
|
526 |
"font_size": null, |
|
|
527 |
"text_color": null |
|
|
528 |
} |
|
|
529 |
}, |
|
|
530 |
"ad2e5f0edf2a46c6910033225943f815": { |
|
|
531 |
"model_module": "@jupyter-widgets/controls", |
|
|
532 |
"model_module_version": "2.0.0", |
|
|
533 |
"model_name": "HTMLModel", |
|
|
534 |
"state": { |
|
|
535 |
"layout": "IPY_MODEL_90d2312724fd410eaad8198b3a54f96f", |
|
|
536 |
"style": "IPY_MODEL_4ee2dbaaa0d94460a34155eaaefa3ec2", |
|
|
537 |
"value": "<h5>Message</h5>" |
|
|
538 |
} |
|
|
539 |
}, |
|
|
540 |
"b75cad7cf5af4c42beb45a611609d402": { |
|
|
541 |
"model_module": "@jupyter-widgets/base", |
|
|
542 |
"model_module_version": "2.0.0", |
|
|
543 |
"model_name": "LayoutModel", |
|
|
544 |
"state": { |
|
|
545 |
"grid_area": "right", |
|
|
546 |
"padding": "0px 0px 0px 0px", |
|
|
547 |
"width": "70px" |
|
|
548 |
} |
|
|
549 |
}, |
|
|
550 |
"bcb1e868bcbc46fba7efe94ef6b00cae": { |
|
|
551 |
"model_module": "@jupyter-widgets/base", |
|
|
552 |
"model_module_version": "2.0.0", |
|
|
553 |
"model_name": "LayoutModel", |
|
|
554 |
"state": { |
|
|
555 |
"grid_template_areas": "\n \". . . . right \"\n ", |
|
|
556 |
"grid_template_columns": "20% 20% 20% 20% 20%", |
|
|
557 |
"width": "100%" |
|
|
558 |
} |
|
|
559 |
}, |
|
|
560 |
"c42f4a3190a24cf79347ef34f4635f42": { |
|
|
561 |
"model_module": "@jupyter-widgets/base", |
|
|
562 |
"model_module_version": "2.0.0", |
|
|
563 |
"model_name": "LayoutModel", |
|
|
564 |
"state": { |
|
|
565 |
"margin": "0px 0px 10px 0px" |
|
|
566 |
} |
|
|
567 |
}, |
|
|
568 |
"ca2882c4b08e4b7ebfd2d306273683ed": { |
|
|
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 |
"cd92bb39ee01487c9d9dda7c9c52e086": { |
|
|
579 |
"model_module": "@jupyter-widgets/controls", |
|
|
580 |
"model_module_version": "2.0.0", |
|
|
581 |
"model_name": "ButtonStyleModel", |
|
|
582 |
"state": { |
|
|
583 |
"font_family": null, |
|
|
584 |
"font_size": null, |
|
|
585 |
"font_style": null, |
|
|
586 |
"font_variant": null, |
|
|
587 |
"font_weight": null, |
|
|
588 |
"text_color": null, |
|
|
589 |
"text_decoration": null |
|
|
590 |
} |
|
|
591 |
}, |
|
|
592 |
"deb18161679c4081b7847b87a971fb94": { |
|
|
593 |
"model_module": "@jupyter-widgets/controls", |
|
|
594 |
"model_module_version": "2.0.0", |
|
|
595 |
"model_name": "HTMLStyleModel", |
|
|
596 |
"state": { |
|
|
597 |
"description_width": "", |
|
|
598 |
"font_size": null, |
|
|
599 |
"text_color": null |
|
|
600 |
} |
|
|
601 |
}, |
|
|
602 |
"efadc7c52eec46dda395572abb432fba": { |
|
|
603 |
"model_module": "@jupyter-widgets/controls", |
|
|
604 |
"model_module_version": "2.0.0", |
|
|
605 |
"model_name": "GridBoxModel", |
|
|
606 |
"state": { |
|
|
607 |
"children": [ |
|
|
608 |
"IPY_MODEL_985109d9783b4f4a8e8081b1c6a04908" |
|
|
609 |
], |
|
|
610 |
"layout": "IPY_MODEL_bcb1e868bcbc46fba7efe94ef6b00cae" |
|
|
611 |
} |
|
|
612 |
}, |
|
|
613 |
"f706d41b232847ec8ec859bddaf6d042": { |
|
|
614 |
"model_module": "@jupyter-widgets/base", |
|
|
615 |
"model_module_version": "2.0.0", |
|
|
616 |
"model_name": "LayoutModel", |
|
|
617 |
"state": { |
|
|
618 |
"width": "190px" |
|
|
619 |
} |
|
|
620 |
}, |
|
|
621 |
"f8ac1f3c5bef413f918761ac97fc3c34": { |
|
|
622 |
"model_module": "@jupyter-widgets/controls", |
|
|
623 |
"model_module_version": "2.0.0", |
|
|
624 |
"model_name": "HTMLStyleModel", |
|
|
625 |
"state": { |
|
|
626 |
"description_width": "", |
|
|
627 |
"font_size": null, |
|
|
628 |
"text_color": null |
|
|
629 |
} |
|
|
630 |
}, |
|
|
631 |
"fd818b923dc345a98ca5dc7962c53b06": { |
|
|
632 |
"model_module": "@jupyter-widgets/controls", |
|
|
633 |
"model_module_version": "2.0.0", |
|
|
634 |
"model_name": "HTMLModel", |
|
|
635 |
"state": { |
|
|
636 |
"layout": "IPY_MODEL_451d96f883ec485eb878bf073a80c757", |
|
|
637 |
"style": "IPY_MODEL_9f7158bd25844ec9bb05603ca29c1d51", |
|
|
638 |
"value": "<h5>Status</h5>" |
|
|
639 |
} |
|
|
640 |
} |
|
|
641 |
}, |
|
|
642 |
"version_major": 2, |
|
|
643 |
"version_minor": 0 |
|
|
644 |
} |
|
|
645 |
} |
|
|
646 |
}, |
|
|
647 |
"nbformat": 4, |
|
|
648 |
"nbformat_minor": 5 |
|
|
649 |
} |