注釈
このページは、 tutorials/machine_learning/01_qsvm_classification.ipynb から生成されました。
IBM Quantum lab でインタラクティブに実行します。
量子サポート・ベクター・マシン (QSVM)¶
機械学習の分類アルゴリズムや手法は、パターン認識やデータマイニングの応用に不可欠です。サポート・ベクター・マシンやニューラル・ネットワークなどのよく知られた技術は、古典的なハードウェアの計算能力の目覚ましい進歩の結果として、過去二十年の間に開花しました。こうした計算能力の進歩によって、二十世紀半ばに理論的に開発された技術を、より難しい分類問題にも適用することが可能となってきました。
分類における重要な概念は、カーネルです。データは通常、元の空間では超平面で分離することができません。このような超平面を得るために用いられる一般的な手法は、データに対する非線形変換関数の適用からなります。この関数は、研究対象の特徴量や測定量を変換することから、特徴マップと呼ばれます。この新しい特徴空間で分類を行うことは、データ点が互いにどれだけ近いかを見ることに他なりません。これは実は、元の空間を含む他の空間においても同様です。これは、集合内の各データ点の組に対して内積を計算するのと同じです。つまり実際には、各データの非線形特徴マップを計算する必要はなく、新たな特徴空間の各データ点の組に対して内積を計算するだけで十分です。この内積の集合はカーネルと呼ばれます。特徴マップを計算するのは困難だが、カーネルは計算できるという場合はありえます。
このノートブックでは、カーネルの計算が古典手法では効率的でない特徴マップを要する分類問題の例を示します。効率的でないとは、必要な計算リソースが問題のサイズに対して指数関数的に大きくなることを意味しています。量子プロセッサで特徴空間のカーネルを直接的に推定することで、この問題を解決する方法を紹介します。用いた手法は、学習段階 (カーネルを計算し、サポート・ベクトルを得る段階) と、テストあるいは分類段階 (学習段階で得られた解に基づき、ラベルされていない新たなデータを分類する段階) からなる、いわゆる教師あり学習として分類されるものです。
参考文献と追加資料:
[1] Vojtech Havlicek, Antonio D. C´orcoles, Kristan Temme, Aram W. Harrow, Abhinav Kandala, Jerry M. Chow, and Jay M. Gambetta1, “Supervised learning with quantum enhanced feature spaces,” arXiv: 1804.11326
[1]:
import matplotlib.pyplot as plt
import numpy as np
from qiskit import BasicAer
from qiskit.circuit.library import ZZFeatureMap
from qiskit.aqua import QuantumInstance, aqua_globals
from qiskit.aqua.algorithms import QSVM
from qiskit.aqua.utils import split_dataset_to_data_and_labels, map_label_to_class_name
seed = 10599
aqua_globals.random_seed = seed
アドホック・データセット¶
最初の例として、上記の参考文献に記載されているアドホック・データセットを用います。このデータセットから、訓練・テスト・最終予測 (データ点) として使用するためのサンプルを取ります。
[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}
データセットの準備ができたので、 QSVM アルゴリズムを設定して、分類を行います。ここでは Qiskit circuit ライブラリの ZZFeatureMap データ符号化回路を用います。
今回は BasicAer の qasm_simulator
を1024ショットで使用します。
テストの結果には、詳細と成功率が含まれています。予測の結果には、予測ラベルが含まれています。
[3]:
feature_map = ZZFeatureMap(feature_dimension=feature_dim, reps=2, entanglement='linear')
qsvm = QSVM(feature_map, 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 = qsvm.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], qsvm.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: 1.0
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%
データセットの訓練サンプルから作成したカーネル行列を以下に示します。
[4]:
kernel_matrix = result['kernel_matrix_training']
plt.imshow(np.asmatrix(kernel_matrix),interpolation='nearest',origin='upper',cmap='bone_r');

Qiskit には、同じ入力データを取る古典的な SVM の実装もあります。これを実行して、比較を行ってみましょう。このアドホック・データは、量子が有利となるデータセットが存在していることを示すために作成されました。
[5]:
from qiskit.aqua.algorithms import SklearnSVM
result = SklearnSVM(training_input, test_input, datapoints[0]).run()
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], qsvm.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)}%')
kernel_matrix = result['kernel_matrix_training']
plt.imshow(np.asmatrix(kernel_matrix), interpolation='nearest', origin='upper', cmap='bone_r');
Testing success ratio: 0.65
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: ['B', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'A', 'A', 'A', 'B', 'B', 'B', 'A', 'B', 'A', 'B', 'B', 'A']
success rate: 55.0%

乳がんデータセット¶
次に、実データでアルゴリズムを実行します。乳がんデータセットの第一主成分と第二主成分を特徴量として用います。
[6]:
from qiskit.ml.datasets import breast_cancer
feature_dim = 2
sample_total, training_input, test_input, class_labels = breast_cancer(
training_size=20,
test_size=10,
n=feature_dim,
plot_data=True
)

[7]:
feature_map = ZZFeatureMap(feature_dimension=feature_dim, reps=2, entanglement='linear')
qsvm = QSVM(feature_map, training_input, test_input)
backend = BasicAer.get_backend('qasm_simulator')
quantum_instance = QuantumInstance(backend, shots=1024, seed_simulator=seed, seed_transpiler=seed)
result = qsvm.run(quantum_instance)
print(f'Testing success ratio: {result["testing_accuracy"]}')
Testing success ratio: 0.9
データセットの訓練サンプルから作成されたカーネル行列
[8]:
kernel_matrix = result['kernel_matrix_training']
img = plt.imshow(np.asmatrix(kernel_matrix),interpolation='nearest',origin='upper',cmap='bone_r')

ここでも、古典的なアプローチと結果を比較することができます。
[9]:
result = SklearnSVM(training_input, test_input).run()
print(f'Testing success ratio: {result["testing_accuracy"]}')
kernel_matrix = result['kernel_matrix_training']
plt.imshow(np.asmatrix(kernel_matrix), interpolation='nearest', origin='upper', cmap='bone_r');
Testing success ratio: 0.85

[10]:
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:24:51 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.
[ ]: