{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Quantum Kernel Machine Learning\n", "\n", "The general task of machine learning is to find and study patterns in data. For many datasets, the datapoints are better understood in a higher dimensional feature space, through the use of a kernel function:\n", "$k(\\vec{x}_i, \\vec{x}_j) = \\langle f(\\vec{x}_i), f(\\vec{x}_j) \\rangle$\n", "where $k$ is the kernel function, $\\vec{x}_i, \\vec{x}_j$ are $n$ dimensional inputs, $f$ is a map from $n$-dimension to $m$-dimension space and $\\langle a,b \\rangle$ denotes the dot product. When considering finite data, a kernel function can be represented as a matrix: \n", "$K_{ij} = k(\\vec{x}_i,\\vec{x}_j)$.\n", "\n", "In quantum kernel machine learning, a quantum feature map $\\phi(\\vec{x})$ is used to map a classical feature vector $\\vec{x}$ to a quantum Hilbert space, $| \\phi(\\vec{x})\\rangle \\langle \\phi(\\vec{x})|$, such that $K_{ij} = \\left| \\langle \\phi^\\dagger(\\vec{x}_j)| \\phi(\\vec{x}_i) \\rangle \\right|^{2}$. See [_Supervised learning with quantum enhanced feature spaces_](https://arxiv.org/pdf/1804.11326.pdf) for more details.\n", "\n", "In this notebook, we use `qiskit` to calculate a kernel matrix using a quantum feature map, then use this kernel matrix in `scikit-learn` classification and clustering algorithms.\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "from sklearn.svm import SVC\n", "from sklearn.cluster import SpectralClustering\n", "from sklearn.metrics import normalized_mutual_info_score\n", "\n", "from qiskit import BasicAer\n", "from qiskit.circuit.library import ZZFeatureMap\n", "from qiskit.utils import QuantumInstance, algorithm_globals\n", "from qiskit_machine_learning.algorithms import QSVC\n", "from qiskit_machine_learning.kernels import QuantumKernel\n", "from qiskit_machine_learning.datasets import ad_hoc_data\n", "\n", "seed = 12345\n", "algorithm_globals.random_seed = seed" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Classification\n", "\n", "For our classification example, we will use the _ad hoc dataset_ as described in [_Supervised learning with quantum enhanced feature spaces_](https://arxiv.org/pdf/1804.11326.pdf), and the `scikit-learn` [support vector machine](https://scikit-learn.org/stable/modules/svm.html) classification (`svc`) algorithm. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [ "nbsphinx-thumbnail" ] }, "outputs": [ { "data": { "image/png": "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Xr169f5NmzYZTvMcOy0zACxdunTUBRdcMPnTn/70lLvuuusTAHDy5MmcmTNnTpg0adKUiRMnTv3pT39a9tBDD5179OjRvCuuuOLTn/3sZz+dSazs3CVHbe4MYUHdfC3do02J643b+Ckw8vKQIwaz1yuVWUV43bp1w2bOnNlx4YUXdpeVlYVff/31oZdddtmp6NfETsu8cePGc/bt2zfkj3/84x6lFGbPnj3hN7/5TfGRI0dCo0eP7t26des+QGspDB8+vG/58uWjXn311T+NGTMmo9yoLd+2iyvPw7Zt8ZuDdi2Bl650muJuLQPpt7RP7Gedym38ToiXwvDbeU7E6vjtTpP5VX19ffkdd9xxFADmzp3bvmbNmvLYgj/WSy+9dM5rr712zpQpU6YAwKlTp3Kam5uHfP7zn/9oyZIl42699daK66+/vuPqq6+29L5nVrPIcZ69jZ8oTUeOHMl94403Svbu3Vt4++23o6+vT0RE9ff3H0o0H79SCnfeeefhe+65py32ue3bt+9+7rnnSpcuXVrxyiuvnHzssccsm8iIOX4iogytWbOm7Etf+lL7hx9++G5LS8u7ra2tfxw7dmzPyy+/XBz9uthpma+55pqTa9asGdHR0ZEDAB988EFeS0tLaP/+/XklJSX9X//619vvvvvu1p07dw4FgKKior7IazNhe43fjp59t5reXmvypzOlgx37d5OVKZlkaZ90t+/WCB+7r4tkxxWksf2//OUvy++5557W6Meuv/7642vXri2/5pprzrRro6dlvvLKKztWrFhxaNeuXUNmzJhRCWiLsjz77LMfNDc3F9x7771jc3JyEAqF1E9+8pO/AsCXv/zltquvvvrTo0aN6nnzzTcHLe1oFlM9RBQovb3oN+rI7e1Ff16a83IYFcL333//UaPXxk7LvHTp0qNLly4d8NqpU6d2z507d3fse5csWXJ0yZIlhttNBQt+yjqJlkmUKd5qtZHz8vKwI87jgWFLwX9wx66MmnZeuGkrmtdSPJRYZJnEWCKFGU205reRPk6mApn28Rd27hIRBYyvUj1+qGVFeKHj0y7Jjs2uGl1ku15oEaZb++cYePIC1viJiAKGBT8RUcB4KtVj1IS3K73Dpnb2MrNMYjKpjL13a4lMs5zulE6WzsrWjt7c3NzpEydOPK2UQm5urnryyScPXHXVVV3Rr2lr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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "adhoc_dimension = 2\n", "train_features, train_labels, test_features, test_labels, adhoc_total = ad_hoc_data(\n", " training_size=20,\n", " test_size=5,\n", " n=adhoc_dimension,\n", " gap=0.3,\n", " plot_data=False,\n", " one_hot=False,\n", " include_sample_total=True,\n", ")\n", "\n", "plt.figure(figsize=(5, 5))\n", "plt.ylim(0, 2 * np.pi)\n", "plt.xlim(0, 2 * np.pi)\n", "plt.imshow(\n", " np.asmatrix(adhoc_total).T,\n", " interpolation=\"nearest\",\n", " origin=\"lower\",\n", " cmap=\"RdBu\",\n", " extent=[0, 2 * np.pi, 0, 2 * np.pi],\n", ")\n", "\n", "plt.scatter(\n", " train_features[np.where(train_labels[:] == 0), 0],\n", " train_features[np.where(train_labels[:] == 0), 1],\n", " marker=\"s\",\n", " facecolors=\"w\",\n", " edgecolors=\"b\",\n", " label=\"A train\",\n", ")\n", "plt.scatter(\n", " train_features[np.where(train_labels[:] == 1), 0],\n", " train_features[np.where(train_labels[:] == 1), 1],\n", " marker=\"o\",\n", " facecolors=\"w\",\n", " edgecolors=\"r\",\n", " label=\"B train\",\n", ")\n", "plt.scatter(\n", " test_features[np.where(test_labels[:] == 0), 0],\n", " test_features[np.where(test_labels[:] == 0), 1],\n", " marker=\"s\",\n", " facecolors=\"b\",\n", " edgecolors=\"w\",\n", " label=\"A test\",\n", ")\n", "plt.scatter(\n", " test_features[np.where(test_labels[:] == 1), 0],\n", " test_features[np.where(test_labels[:] == 1), 1],\n", " marker=\"o\",\n", " facecolors=\"r\",\n", " edgecolors=\"w\",\n", " label=\"B test\",\n", ")\n", "\n", "plt.legend(bbox_to_anchor=(1.05, 1), loc=\"upper left\", borderaxespad=0.0)\n", "plt.title(\"Ad hoc dataset for classification\")\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With our training and testing datasets ready, we set up the `QuantumKernel` class to calculate a kernel matrix using the [ZZFeatureMap](https://qiskit.org/documentation/stubs/qiskit.circuit.library.ZZFeatureMap.html), and the `BasicAer` `qasm_simulator` using 1024 shots." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "adhoc_feature_map = ZZFeatureMap(feature_dimension=adhoc_dimension, reps=2, entanglement=\"linear\")\n", "\n", "adhoc_backend = QuantumInstance(\n", " BasicAer.get_backend(\"qasm_simulator\"), shots=1024, seed_simulator=seed, seed_transpiler=seed\n", ")\n", "\n", "adhoc_kernel = QuantumKernel(feature_map=adhoc_feature_map, quantum_instance=adhoc_backend)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `scikit-learn` `svc` algorithm allows us to define a [custom kernel](https://scikit-learn.org/stable/modules/svm.html#custom-kernels) in two ways: by providing the kernel as a callable function or by precomputing the kernel matrix. We can do either of these using the `QuantumKernel` class in `qiskit`.\n", "\n", "The following code gives the kernel as a callable function:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Callable kernel classification test score: 1.0\n" ] } ], "source": [ "adhoc_svc = SVC(kernel=adhoc_kernel.evaluate)\n", "adhoc_svc.fit(train_features, train_labels)\n", "adhoc_score = adhoc_svc.score(test_features, test_labels)\n", "\n", "print(f\"Callable kernel classification test score: {adhoc_score}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following code precomputes and plots the training and testing kernel matrices before providing them to the `scikit-learn` `svc` algorithm:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Precomputed kernel classification test score: 1.0\n" ] } ], "source": [ "adhoc_matrix_train = adhoc_kernel.evaluate(x_vec=train_features)\n", "adhoc_matrix_test = adhoc_kernel.evaluate(x_vec=test_features, y_vec=train_features)\n", "\n", "fig, axs = plt.subplots(1, 2, figsize=(10, 5))\n", "axs[0].imshow(\n", " np.asmatrix(adhoc_matrix_train), interpolation=\"nearest\", origin=\"upper\", cmap=\"Blues\"\n", ")\n", "axs[0].set_title(\"Ad hoc training kernel matrix\")\n", "axs[1].imshow(np.asmatrix(adhoc_matrix_test), interpolation=\"nearest\", origin=\"upper\", cmap=\"Reds\")\n", "axs[1].set_title(\"Ad hoc testing kernel matrix\")\n", "plt.show()\n", "\n", "adhoc_svc = SVC(kernel=\"precomputed\")\n", "adhoc_svc.fit(adhoc_matrix_train, train_labels)\n", "adhoc_score = adhoc_svc.score(adhoc_matrix_test, test_labels)\n", "\n", "print(f\"Precomputed kernel classification test score: {adhoc_score}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`qiskit` also contains the `qsvc` class that extends the `sklearn svc` class, that can be used as follows:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "QSVC classification test score: 1.0\n" ] } ], "source": [ "qsvc = QSVC(quantum_kernel=adhoc_kernel)\n", "qsvc.fit(train_features, train_labels)\n", "qsvc_score = qsvc.score(test_features, test_labels)\n", "\n", "print(f\"QSVC classification test score: {qsvc_score}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Clustering\n", "\n", "For our clustering example, we will again use the _ad hoc dataset_ as described in [_Supervised learning with quantum enhanced feature spaces_](https://arxiv.org/pdf/1804.11326.pdf), and the `scikit-learn` `spectral` clustering algorithm.\n", "\n", "We will regenerate the dataset with a larger gap between the two classes, and as clustering is an unsupervised machine learning task, we don't need a test sample." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "adhoc_dimension = 2\n", "train_features, train_labels, test_features, test_labels, adhoc_total = ad_hoc_data(\n", " training_size=25,\n", " test_size=0,\n", " n=adhoc_dimension,\n", " gap=0.6,\n", " plot_data=False,\n", " one_hot=False,\n", " include_sample_total=True,\n", ")\n", "\n", "plt.figure(figsize=(5, 5))\n", "plt.ylim(0, 2 * np.pi)\n", "plt.xlim(0, 2 * np.pi)\n", "plt.imshow(\n", " np.asmatrix(adhoc_total).T,\n", " interpolation=\"nearest\",\n", " origin=\"lower\",\n", " cmap=\"RdBu\",\n", " extent=[0, 2 * np.pi, 0, 2 * np.pi],\n", ")\n", "plt.scatter(\n", " train_features[np.where(train_labels[:] == 0), 0],\n", " train_features[np.where(train_labels[:] == 0), 1],\n", " marker=\"s\",\n", " facecolors=\"w\",\n", " edgecolors=\"b\",\n", " label=\"A\",\n", ")\n", "plt.scatter(\n", " train_features[np.where(train_labels[:] == 1), 0],\n", " train_features[np.where(train_labels[:] == 1), 1],\n", " marker=\"o\",\n", " facecolors=\"w\",\n", " edgecolors=\"r\",\n", " label=\"B\",\n", ")\n", "\n", "plt.legend(bbox_to_anchor=(1.05, 1), loc=\"upper left\", borderaxespad=0.0)\n", "plt.title(\"Ad hoc dataset for clustering\")\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We again set up the `QuantumKernel` class to calculate a kernel matrix using the [ZZFeatureMap](https://qiskit.org/documentation/stubs/qiskit.circuit.library.ZZFeatureMap.html), and the BasicAer `qasm_simulator` using 1024 shots." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "adhoc_feature_map = ZZFeatureMap(feature_dimension=adhoc_dimension, reps=2, entanglement=\"linear\")\n", "\n", "adhoc_backend = QuantumInstance(\n", " BasicAer.get_backend(\"qasm_simulator\"), shots=1024, seed_simulator=seed, seed_transpiler=seed\n", ")\n", "\n", "adhoc_kernel = QuantumKernel(feature_map=adhoc_feature_map, quantum_instance=adhoc_backend)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The scikit-learn spectral clustering algorithm allows us to define a [custom kernel] in two ways: by providing the kernel as a callable function or by precomputing the kernel matrix. Using the QuantumKernel class in qiskit, we can only use the latter.\n", "\n", "The following code precomputes and plots the kernel matrices before providing it to the scikit-learn spectral clustering algorithm, and scoring the labels using normalized mutual information, since we a priori know the class labels." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Clustering score: 0.7287008798015754\n" ] } ], "source": [ "adhoc_matrix = adhoc_kernel.evaluate(x_vec=train_features)\n", "\n", "plt.figure(figsize=(5, 5))\n", "plt.imshow(np.asmatrix(adhoc_matrix), interpolation=\"nearest\", origin=\"upper\", cmap=\"Greens\")\n", "plt.title(\"Ad hoc clustering kernel matrix\")\n", "plt.show()\n", "\n", "adhoc_spectral = SpectralClustering(2, affinity=\"precomputed\")\n", "cluster_labels = adhoc_spectral.fit_predict(adhoc_matrix)\n", "cluster_score = normalized_mutual_info_score(cluster_labels, train_labels)\n", "\n", "print(f\"Clustering score: {cluster_score}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`scikit-learn` has other algorithms that can use a precomputed kernel matrix, here are a few:\n", "\n", "- [Agglomerative clustering](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.AgglomerativeClustering.html)\n", "- [Support vector regression](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html)\n", "- [Ridge regression](https://scikit-learn.org/stable/modules/generated/sklearn.kernel_ridge.KernelRidge.html)\n", "- [Gaussian process regression](https://scikit-learn.org/stable/modules/gaussian_process.html)\n", "- [Principal component analysis](https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.KernelPCA.html)\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "

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
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

This code is a part of Qiskit

© Copyright IBM 2017, 2021.

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.

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import qiskit.tools.jupyter\n", "\n", "%qiskit_version_table\n", "%qiskit_copyright" ] } ], "metadata": { "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.9" } }, "nbformat": 4, "nbformat_minor": 2 }