Japanese

English
Bengali
French
Hindi
Italian
Japanese
Korean
Malayalam
Russian
Spanish
Tamil
Turkish
Vietnamese
Shortcuts

このページは docs/tutorials/03_quantum_kernel.ipynb から生成されました。

# 量子カーネル法機械学習¶

このノートブックでは、量子特徴マップを使ってカーネル行列を計算するために qiskit を使用し、 scikit-learn の分類とクラスタリングアルゴリズムでこのカーネル行列を使用します。

[3]:

import matplotlib.pyplot as plt
import numpy as np

from sklearn.svm import SVC
from sklearn.cluster import SpectralClustering
from sklearn.metrics import normalized_mutual_info_score

from qiskit import BasicAer
from qiskit.circuit.library import ZZFeatureMap
from qiskit.utils import QuantumInstance, algorithm_globals
from qiskit_machine_learning.algorithms import QSVC
from qiskit_machine_learning.kernels import QuantumKernel

seed = 12345
algorithm_globals.random_seed = seed


## 分類¶

[2]:

adhoc_dimension = 2
training_size=20,
test_size=5,
gap=0.3,
plot_data=False,
one_hot=False,
include_sample_total=True,
)

plt.figure(figsize=(5, 5))
plt.ylim(0, 2 * np.pi)
plt.xlim(0, 2 * np.pi)
plt.imshow(
interpolation="nearest",
origin="lower",
cmap="RdBu",
extent=[0, 2 * np.pi, 0, 2 * np.pi],
)

plt.scatter(
train_features[np.where(train_labels[:] == 0), 0],
train_features[np.where(train_labels[:] == 0), 1],
marker="s",
facecolors="w",
edgecolors="b",
label="A train",
)
plt.scatter(
train_features[np.where(train_labels[:] == 1), 0],
train_features[np.where(train_labels[:] == 1), 1],
marker="o",
facecolors="w",
edgecolors="r",
label="B train",
)
plt.scatter(
test_features[np.where(test_labels[:] == 0), 0],
test_features[np.where(test_labels[:] == 0), 1],
marker="s",
facecolors="b",
edgecolors="w",
label="A test",
)
plt.scatter(
test_features[np.where(test_labels[:] == 1), 0],
test_features[np.where(test_labels[:] == 1), 1],
marker="o",
facecolors="r",
edgecolors="w",
label="B test",
)

plt.show()


[3]:

adhoc_feature_map = ZZFeatureMap(feature_dimension=adhoc_dimension, reps=2, entanglement="linear")

BasicAer.get_backend("qasm_simulator"), shots=1024, seed_simulator=seed, seed_transpiler=seed
)



scikit-learnsvc アルゴリズムでは、custom kernel を次の2つの方法で定義することができます: 呼び出し可能な関数としてカーネルを提供するか、カーネル行列を予測することです。 qiskitQuantumKernel クラスを使用して、どちらかを行うことができます。

[4]:

adhoc_svc = SVC(kernel=adhoc_kernel.evaluate)

print(f"Callable kernel classification test score: {adhoc_score}")

Callable kernel classification test score: 1.0


[5]:

adhoc_matrix_train = adhoc_kernel.evaluate(x_vec=train_features)

fig, axs = plt.subplots(1, 2, figsize=(10, 5))
axs[0].imshow(
)
plt.show()

print(f"Precomputed kernel classification test score: {adhoc_score}")

Precomputed kernel classification test score: 1.0


qiskit には、sklearn svc クラスを拡張した qsvc クラスも含まれており、次のように使用できます。

[6]:

qsvc = QSVC(quantum_kernel=adhoc_kernel)
qsvc.fit(train_features, train_labels)
qsvc_score = qsvc.score(test_features, test_labels)

print(f"QSVC classification test score: {qsvc_score}")

QSVC classification test score: 1.0


## クラスタリング¶

クラスタリングの例では、Supervised learning, with quantum enhanced feature spaces で説明されている アドホック・データセットscikit-learnspectral クラスタリング・アルゴリズムを再度使用します。

2 つのクラス間に大きなギャップがあるデータ・セットを再生成します。クラスタリングは教師なし機械学習タスクであるため、テスト・サンプルは必要ありません。

[7]:

adhoc_dimension = 2
training_size=25,
test_size=0,
gap=0.6,
plot_data=False,
one_hot=False,
include_sample_total=True,
)

plt.figure(figsize=(5, 5))
plt.ylim(0, 2 * np.pi)
plt.xlim(0, 2 * np.pi)
plt.imshow(
interpolation="nearest",
origin="lower",
cmap="RdBu",
extent=[0, 2 * np.pi, 0, 2 * np.pi],
)
plt.scatter(
train_features[np.where(train_labels[:] == 0), 0],
train_features[np.where(train_labels[:] == 0), 1],
marker="s",
facecolors="w",
edgecolors="b",
label="A",
)
plt.scatter(
train_features[np.where(train_labels[:] == 1), 0],
train_features[np.where(train_labels[:] == 1), 1],
marker="o",
facecolors="w",
edgecolors="r",
label="B",
)

plt.show()


[8]:

adhoc_feature_map = ZZFeatureMap(feature_dimension=adhoc_dimension, reps=2, entanglement="linear")

BasicAer.get_backend("qasm_simulator"), shots=1024, seed_simulator=seed, seed_transpiler=seed
)



scikit-learnのスペクトラル・クラスタリング・アルゴリズムでは、[カスタム・カーネル] を2つの方法で定義することができます。つまり、カーネルを呼び出し可能な関数として提供するか、カーネル行列を予測することです。 QiskitのQuantumKernelクラスを使用する場合、後者のみを使用できます。

クラス・ラベルを前もって知っているので、以下のコードは、scikit-learnのスペクトラル・クラスタリング・アルゴリズムに投入し正規化相互情報量でラベルをスコアリングする前に、カーネル行列を事前計算してプロットします。

[9]:

adhoc_matrix = adhoc_kernel.evaluate(x_vec=train_features)

plt.figure(figsize=(5, 5))
plt.show()

cluster_score = normalized_mutual_info_score(cluster_labels, train_labels)

print(f"Clustering score: {cluster_score}")

Clustering score: 0.7287008798015754


scikit-learn には、事前計算されたカーネル行列を使用できる次のような他のアルゴリズムがあります:

[1]:

import qiskit.tools.jupyter

%qiskit_version_table


### Version Information

Qiskit SoftwareVersion
qiskit-terra0.19.0
qiskit-aer0.8.2
qiskit-ignis0.6.0
qiskit-aqua0.9.2
qiskit0.27.0
qiskit-machine-learning0.3.0
System information
Python3.7.9 (default, Aug 31 2020, 17:10:11) [MSC v.1916 64 bit (AMD64)]
OSWindows
CPUs4
Memory (Gb)31.837730407714844
Fri Dec 03 15:08:20 2021 GMT Standard Time