Nota
Esta página foi gerada a partir de tutorials/machine_learning/03_vqc.ipynb.
Executar interativamente no IBM Quantum lab <https://quantum-computing.ibm.com/jupyter/tutorial/machine_learning/03_vqc.ipynb> _.
Classificador Quântico Variacional (VQC)¶
O capitulo QSVM demonstrou uma abordagem baseada em kernel. Este notebook mostra um método variacional usando o algoritmo VQC.
Para mais informações veja também a seguinte referência, como dada no caderno QSVM, que também descreve esta abordagem: “Supervised learning with quantum enhanced feature spaces,” arXiv: 1804.11326
[1]:
import numpy as np
from qiskit import BasicAer
from qiskit.aqua import QuantumInstance, aqua_globals
from qiskit.aqua.algorithms import VQC
from qiskit.aqua.components.optimizers import SPSA
from qiskit.circuit.library import TwoLocal, ZZFeatureMap
from qiskit.aqua.utils import split_dataset_to_data_and_labels, map_label_to_class_name
seed = 10599
aqua_globals.random_seed = seed
Por meio do caderno QSVM novamente usaremos o conjunto de dados ad hoc conforme descrito no documento referenciado acima. No conjunto de dados pegamos amostras para uso como treinamento, teste e previsão final (pontos de dados).
[2]:
from qiskit.ml.datasets import ad_hoc_data, sample_ad_hoc_data
feature_dim = 2
sample_total, training_input, test_input, class_labels = ad_hoc_data(
training_size=20,
test_size=10,
n=feature_dim,
gap=0.3,
plot_data=True
)
extra_test_data = sample_ad_hoc_data(sample_total, 10, n=feature_dim)
datapoints, class_to_label = split_dataset_to_data_and_labels(extra_test_data)
print(class_to_label)

{'A': 0, 'B': 1}
Com o conjunto de dados pronto, podemos configurar o algoritmo VQC para fazer uma classificação. Nós usamos o ZZFeatureMap circuito de codificação de dados da biblioteca de circuitos Qiskit, como fizemos com QSVM. Mas esse é um algoritmo variacional, então precisamos de uma forma variacional, ou seja, circuito parametrizado, cujos parâmetros podem ser variados por um otimizador ao calcular a função de custo do VQC. Para isso, escolhemos TwoLocal da biblioteca de circuitos de Qiskit. Como o qasm_simulator tem ruído de disparo, nós escolhemos usar o SPSA que é projetado para executar sob condições de ruído.
Aqui o BasicAer qasm_simulator
é usado com 1024 coletas.
[3]:
feature_map = ZZFeatureMap(feature_dimension=feature_dim, reps=2)
optimizer = SPSA(maxiter=40, c0=4.0, skip_calibration=True)
var_form = TwoLocal(feature_dim, ['ry', 'rz'], 'cz', reps=3)
vqc = VQC(optimizer, feature_map, var_form, training_input, test_input, datapoints[0])
backend = BasicAer.get_backend('qasm_simulator')
quantum_instance = QuantumInstance(backend, shots=1024, seed_simulator=seed, seed_transpiler=seed)
result = vqc.run(quantum_instance)
print(f'Testing success ratio: {result["testing_accuracy"]}')
print()
print('Prediction from datapoints set:')
print(f' ground truth: {map_label_to_class_name(datapoints[1], vqc.label_to_class)}')
print(f' prediction: {result["predicted_classes"]}')
predicted_labels = result["predicted_labels"]
print(f' success rate: {100*np.count_nonzero(predicted_labels == datapoints[1])/len(predicted_labels)}%')
Testing success ratio: 0.9
Prediction from datapoints set:
ground truth: ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B']
prediction: ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B']
success rate: 100.0%
Agora o VQC, bem como QSVM, têm métodos train
, test
e predict
. O método run
, como usado acima, irá chamá-los por vez, com base em quaisquer dados fornecidos ao algoritmo. Mas os métodos chamados diretamente para treinar um modelo e, depois, a prever. Como a instância do vqc já foi treinada, permite prever outro conjunto de dados de amostra chamando diretamente predict
.
[4]:
more_test_data = sample_ad_hoc_data(sample_total, 10, n=feature_dim)
more_datapoints, _ = split_dataset_to_data_and_labels(more_test_data)
predicted_probabilities, predicted_labels = vqc.predict(datapoints[0])
print('Prediction from more_datapoints set:')
print(f' ground truth: {map_label_to_class_name(more_datapoints[1], vqc.label_to_class)}')
print(f' prediction: {map_label_to_class_name(predicted_labels, vqc.label_to_class)}')
print(f' success rate: {100*np.count_nonzero(predicted_labels == more_datapoints[1])/len(predicted_labels)}%')
Prediction from more_datapoints set:
ground truth: ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B']
prediction: ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B']
success rate: 100.0%
Por fim, se observa que os algoritmos classificadores Qiskit podem save_model
após o treinamento e também load_model
que haviam sido salvos previamente.
[5]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright
Version Information
Qiskit Software | Version |
---|---|
Qiskit | 0.23.1 |
Terra | 0.16.1 |
Aer | 0.7.1 |
Ignis | 0.5.1 |
Aqua | 0.8.1 |
IBM Q Provider | 0.11.1 |
System information | |
Python | 3.6.1 |Continuum Analytics, Inc.| (default, May 11 2017, 13:09:58) [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] |
OS | Linux |
CPUs | 1 |
Memory (Gb) | 5.827335357666016 |
Fri Nov 13 15:27:38 2020 EST |
This code is a part of Qiskit
© Copyright IBM 2017, 2020.
This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.