Portuguese, Brazilian
Idiomas
English
Japanese
German
Korean
Portuguese, Brazilian
French
Shortcuts

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)
../../_images/tutorials_machine_learning_03_vqc_3_0.png
{'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 SoftwareVersion
Qiskit0.23.1
Terra0.16.1
Aer0.7.1
Ignis0.5.1
Aqua0.8.1
IBM Q Provider0.11.1
System information
Python3.6.1 |Continuum Analytics, Inc.| (default, May 11 2017, 13:09:58) [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]
OSLinux
CPUs1
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.