Variational Quantum Classifier (VQC)¶
QSVM のノートブックでは、カーネルに基づくアプローチを示しました。このノートブックでは、 VQC アルゴリズムを用いて、変分法に基づく手法を示します。
詳細については、 QSVM ノートブックにも記載してある、以下の参考文献も参照してください。 今回の手法についても記述があります。“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
QSVM ノートブックと同様に、上記の参考文献に記載されているアドホック・データセットを使用します。このデータセットから、訓練・テスト・最終予測 (データ点) として使用するためのサンプルを取ります。
[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}
データセットの準備ができたので、 VQC アルゴリズムを設定して、分類を行います。QSVM でもそうしたように、 Qiskit circuit ライブラリーの ZZFeatureMap データ符号化回路を用います。しかしこれは変分アルゴリズムなので、 VQC のコスト関数を計算する際に、オプティマイザーによってパラメータを変化させることができる変分形式、つまりパラメーター化された回路が必要になります。このために、 Qiskit circuit ライブラリーの TwoLocal を用います。 qasm_simulator にはショットノイズがあるので、ノイズの多い状態でも動作するように設計されている SPSA を使用します。
今回は BasicAer の qasm_simulator
を1024ショットで使用します。
[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%
VQC には QSVM と同様に train
, test
, predict
メソッドがあります。上で用いた run
メソッドは、アルゴリズムに与えられたデータに基づいて、これらを順番に呼び出します。しかし、これらのメソッドは直接呼び出されると、モデルの訓練と予測をそれぞれ別々に実行することができます。 VQC インスタンスは既に訓練済みなので、直接 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%
最後に Qiskit の分類アルゴリズムは、訓練後に save_model
でモデルを保存したり、 load_model
で保存されたモデルを読み込んだりできることも押さえておいてください。
[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.