In [6]:
!pip install qiskit-machine-learning
Requirement already satisfied: qiskit-machine-learning in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (0.8.2) Requirement already satisfied: qiskit>=1.0 in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from qiskit-machine-learning) (1.4.2) Requirement already satisfied: scipy>=1.4 in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from qiskit-machine-learning) (1.15.2) Requirement already satisfied: numpy>=1.17 in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from qiskit-machine-learning) (2.2.5) Requirement already satisfied: psutil>=5 in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from qiskit-machine-learning) (7.0.0) Requirement already satisfied: scikit-learn>=1.2 in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from qiskit-machine-learning) (1.6.1) Requirement already satisfied: setuptools>=40.1 in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from qiskit-machine-learning) (75.8.0) Requirement already satisfied: dill>=0.3.4 in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from qiskit-machine-learning) (0.4.0) Requirement already satisfied: rustworkx>=0.15.0 in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from qiskit>=1.0->qiskit-machine-learning) (0.16.0) Requirement already satisfied: sympy>=1.3 in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from qiskit>=1.0->qiskit-machine-learning) (1.13.3) Requirement already satisfied: python-dateutil>=2.8.0 in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from qiskit>=1.0->qiskit-machine-learning) (2.9.0.post0) Requirement already satisfied: stevedore>=3.0.0 in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from qiskit>=1.0->qiskit-machine-learning) (5.4.1) Requirement already satisfied: typing-extensions in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from qiskit>=1.0->qiskit-machine-learning) (4.13.2) Requirement already satisfied: symengine<0.14,>=0.11 in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from qiskit>=1.0->qiskit-machine-learning) (0.13.0) Requirement already satisfied: joblib>=1.2.0 in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from scikit-learn>=1.2->qiskit-machine-learning) (1.5.0) Requirement already satisfied: threadpoolctl>=3.1.0 in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from scikit-learn>=1.2->qiskit-machine-learning) (3.6.0) Requirement already satisfied: six>=1.5 in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from python-dateutil>=2.8.0->qiskit>=1.0->qiskit-machine-learning) (1.17.0) Requirement already satisfied: pbr>=2.0.0 in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from stevedore>=3.0.0->qiskit>=1.0->qiskit-machine-learning) (6.1.1) Requirement already satisfied: mpmath<1.4,>=1.1.0 in /home/lpawela/anaconda3/envs/parrondo-old/lib/python3.12/site-packages (from sympy>=1.3->qiskit>=1.0->qiskit-machine-learning) (1.3.0)
In [7]:
%load_ext dotenv
%dotenv
The dotenv extension is already loaded. To reload it, use: %reload_ext dotenv
In [8]:
import matplotlib.pyplot as plt
import numpy as np
from IPython.display import clear_output
# from qiskit_machine_learning.optimizers import COBYLA
from qiskit_machine_learning.utils import algorithm_globals
from qiskit_machine_learning.algorithms.classifiers import NeuralNetworkClassifier
from qiskit_machine_learning.neural_networks import EstimatorQNN
algorithm_globals.random_seed = 42
Data preparation¶
In [9]:
num_inputs = 2
num_samples = 20
X = 2 * algorithm_globals.random.random([num_samples, num_inputs]) - 1
y01 = 1 * (np.sum(X, axis=1) >= 0) # in { 0, 1}
y = 2 * y01 - 1 # in {-1, +1}
y_one_hot = np.zeros((num_samples, 2))
for i in range(num_samples):
y_one_hot[i, y01[i]] = 1
for x, y_target in zip(X, y):
if y_target == 1:
plt.plot(x[0], x[1], "bo")
else:
plt.plot(x[0], x[1], "go")
plt.plot([-1, 1], [1, -1], "--", color="black")
plt.show()
In [10]:
def callback_graph(weights, obj_func_eval):
clear_output(wait=True)
objective_func_vals.append(obj_func_eval)
plt.title("Objective function value against iteration")
plt.xlabel("Iteration")
plt.ylabel("Objective function value")
plt.plot(range(len(objective_func_vals)), objective_func_vals)
plt.show()
In [11]:
from qiskit.primitives import StatevectorEstimator as Estimator
estimator = Estimator()
estimator_qnn = EstimatorQNN(circuit=qc, estimator=estimator)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) Cell In[11], line 4 1 from qiskit.primitives import StatevectorEstimator as Estimator 3 estimator = Estimator() ----> 4 estimator_qnn = EstimatorQNN(circuit=qc, estimator=estimator) NameError: name 'qc' is not defined
In [ ]:
estimator_classifier = NeuralNetworkClassifier(
estimator_qnn, optimizer=COBYLA(maxiter=60), callback=callback_graph
)
In [ ]:
estimator_qnn.forward(X[0, :], algorithm_globals.random.random(estimator_qnn.num_weights))
In [ ]:
# create empty array for callback to store evaluations of the objective function
objective_func_vals = []
plt.rcParams["figure.figsize"] = (12, 6)
# fit classifier to data
estimator_classifier.fit(X, y)
# return to default figsize
plt.rcParams["figure.figsize"] = (6, 4)
# score classifier
estimator_classifier.score(X, y)
In [ ]:
# evaluate data points
y_predict = estimator_classifier.predict(X)
# plot results
# red == wrongly classified
for x, y_target, y_p in zip(X, y, y_predict):
if y_target == 1:
plt.plot(x[0], x[1], "bo")
else:
plt.plot(x[0], x[1], "go")
if y_target != y_p:
plt.scatter(x[0], x[1], s=200, facecolors="none", edgecolors="r", linewidths=2)
plt.plot([-1, 1], [1, -1], "--", color="black")
plt.show()
In [ ]:
estimator_classifier.weights