IBM Qiskit量子机器学习速成(四)

量子核机器学习

一般步骤

量子核机器学习的一般步骤如下

定义量子核

我们使用FidelityQuantumKernel类创建量子核,该类需要传入两个参数:特征映射和忠诚度(fidelity)。如果我们不传入忠诚度,该类会自动创建一个忠诚度。

注意各个类所属的模块!

from qiskit.circuit.library import ZZFeatureMap
from qiskit.primitives import Sampler
from qiskit_algorithms.state_fidelities import ComputeUncompute
from qiskit_machine_learning.kernels import FidelityQuantumKernel

feature_map = ZZFeatureMap(feature_dimension=dimension, reps=2, entanglement="linear")

sampler = Sampler()

fidelity = ComputeUncompute(sampler=sampler)

kernel = FidelityQuantumKernel(fidelity=fidelity, feature_map=feature_map)

利用经典支持向量分类器

量子核在经典支持向量分类器中有两种方式:

  1. 将核本身作为可调用函数

注意:经典模式下传入的是kernel.evaluate

from sklearn.svm import SVC

svc = SVC(kernel=kernel.evaluate)

svc.fit(train_features, train_labels)

score_callable_function = svc.score(test_features, test_labels)

print(f"Callable kernel classification test score: {score_callable_function}")
  1. 提前计算核矩阵

使用kernel.evaluate函数进行核矩阵的计算

matrix_train = kernel.evaluate(x_vec=train_features)
matrix_test = kernel.evaluate(x_vec=test_features, y_vec=train_features)

利用量子支撑向量分类器

注意:量子模式下传入的是kernel本身

from qiskit_machine_learning.algorithms import QSVC

qsvc = QSVC(quantum_kernel=kernel)

qsvc.fit(train_features, train_labels)

qsvc_score = qsvc.score(test_features, test_labels)

使用量子核的谱聚类方法

定义量子核方法同前,此处只需要从sklearn中导入SpectralClustering类。

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

matrix = kernel.evaluate(x_vec=train_features)

spectral = SpectralClustering(2, affinity="precomputed")

cluster_labels = spectral.fit_predict(matrix)

cluster_score = normalized_mutual_info_score(cluster_labels, train_labels)

实战演练

导入数据集

我们接下来使用一组来自qiskit_machine_learning.datasets的人造随机数据

from qiskit_machine_learning.datasets import ad_hoc_data

adhoc_dimension = 2
train_features, train_labels, test_features, test_labels, adhoc_total = ad_hoc_data(
    training_size=20,
    test_size=5,
    n=adhoc_dimension,
    gap=0.3,
    plot_data=False,
    one_hot=False,
    include_sample_total=True,
)

其中gap描述了两类不同数据间的距离。官网提供了以下函数来可视化这一组数据

import matplotlib.pyplot as plt
import numpy as np


def plot_features(ax, features, labels, class_label, marker, face, edge, label):
    # A train plot
    ax.scatter(
        # x coordinate of labels where class is class_label
        features[np.where(labels[:] == class_label), 0],
        # y coordinate of labels where class is class_label
        features[np.where(labels[:] == class_label), 1],
        marker=marker,
        facecolors=face,
        edgecolors=edge,
        label=label,
    )


def plot_dataset(train_features, train_labels, test_features, test_labels, adhoc_total):

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

    # A train plot
    plot_features(plt, train_features, train_labels, 0, "s", "w", "b", "A train")

    # B train plot
    plot_features(plt, train_features, train_labels, 1, "o", "w", "r", "B train")

    # A test plot
    plot_features(plt, test_features, test_labels, 0, "s", "b", "w", "A test")

    # B test plot
    plot_features(plt, test_features, test_labels, 1, "o", "r", "w", "B test")

    plt.legend(bbox_to_anchor=(1.05, 1), loc="upper left", borderaxespad=0.0)
    plt.title("Ad hoc dataset")

    plt.show()

运行以下命令查看数据形状

plot_dataset(train_features, train_labels, test_features, test_labels, adhoc_total)

IBM Qiskit量子机器学习速成(四)_第1张图片

随后,和一般步骤完全相同,先定义量子核。

注意此时还没有导入数据!

from qiskit.circuit.library import ZZFeatureMap
from qiskit.primitives import Sampler
from qiskit_algorithms.state_fidelities import ComputeUncompute
from qiskit_machine_learning.kernels import FidelityQuantumKernel

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

sampler = Sampler()

fidelity = ComputeUncompute(sampler=sampler)

adhoc_kernel = FidelityQuantumKernel(fidelity=fidelity, feature_map=adhoc_feature_map)

接下来我们分别介绍经典支撑向量分类器 和量子支撑向量分类器的用法

经典支撑向量分类器

一方面,我们可以直接传入量子核的取值函数

from sklearn.svm import SVC

adhoc_svc = SVC(kernel=adhoc_kernel.evaluate)

adhoc_svc.fit(train_features, train_labels)

adhoc_score_callable_function = adhoc_svc.score(test_features, test_labels)

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

另一方面,我们还可以根据已知数据提前计算核矩阵

adhoc_matrix_train = adhoc_kernel.evaluate(x_vec=train_features)
adhoc_matrix_test = adhoc_kernel.evaluate(x_vec=test_features, y_vec=train_features)

adhoc_svc = SVC(kernel="precomputed")

adhoc_svc.fit(adhoc_matrix_train, train_labels)

adhoc_score_precomputed_kernel = adhoc_svc.score(adhoc_matrix_test, test_labels)

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

量子支撑向量分类器

直接传入量子核即可

from qiskit_machine_learning.algorithms import QSVC

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}")

你可能感兴趣的:(机器学习,人工智能)