{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Exploring Quantum Classification Library" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook offers a high-level walk-through of solving classification problems using the [quantum machine learning library](https://docs.microsoft.com/azure/quantum/user-guide/libraries/machine-learning/intro) that is part of the Microsoft Quantum Development Kit. \n", "It does not require any familiarity with the basic of quantum computing to follow.\n", "\n", "* The companion Q# notebook [Inside Quantum Classifiers](./InsideQuantumClassifiers.ipynb) offers a deep dive in the internals of a simple quantum classifier and several exercises on implementing it from scratch.\n", "* The Python + Q# notebook [Quantum Classification With Feature Engineering](./QuantumClassificationWithFeatureEngineering.ipynb) continues the high-level exploration of the quantum classification library, focusing on using feature engineering.\n", "\n", "> This notebook contains some heavy computations, and might take some time to execute. \n", " Precomputed cell outputs are included - you might want to study these before you opt to re-run the cells." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setup\n", "\n", "To start with, execute this cell using Ctrl+Enter (or ⌘+Enter on a Mac). This is necessary to prepare the environment, import the Q# libraries and operations we'll use later in the tutorial, and configure the plotting routines. If any Python packages are reported as missing, install them." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Preparing Q# environment...\n", "\n", "Setup complete!\n" ] } ], "source": [ "import math\n", "import random\n", "from typing import List\n", "\n", "import numpy as np\n", "from matplotlib import pyplot\n", "pyplot.style.use('ggplot')\n", "\n", "import warnings\n", "warnings.simplefilter('ignore')\n", "\n", "%matplotlib inline\n", "\n", "# Plotting configuration\n", "cases = [(0, 0), (0, 1), (1, 1), (1, 0)]\n", "markers = [\n", " '.' if actual == classified else 'X'\n", " for (actual, classified) in cases\n", "]\n", "colors = ['blue', 'blue', 'red', 'red']\n", "\n", "# Q# configuration and necessary imports\n", "import qsharp\n", "import Microsoft.Quantum.Kata.QuantumClassification as QuantumClassification\n", "\n", "print()\n", "print(\"Setup complete!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first step of solving a classification problem is preparing the training and validation datasets.\n", "\n", "> In the first part of the tutorial we will use artificially generated data, in which the two classes can be separated using two lines that go through the (0, 0) point. \n", "This mirrors the data used in the [deep dive tutorial](./InsideQuantumClassifiers.ipynb). \n", "A real classification problem will load real data instead, but this choice of artificial data allows to construct a simple quantum classifier by hand, which will be helpful for a deep dive in the classifier structure." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training and validation data generated\n" ] } ], "source": [ "def generate_data (samples_number : int, separation_angles : List[float]):\n", " \"\"\"Generates data with 2 features and 2 classes separable by a line that goes through the origin\"\"\"\n", " features = []\n", " labels = []\n", " for i in range(samples_number):\n", " sample = [random.random(), random.random()]\n", " angle = math.atan2(sample[1], sample[0])\n", " features.append(sample)\n", " labels.append(0 if angle < separation_angles[0] or angle > separation_angles[1] else 1)\n", " \n", " data = { 'Features' : features, 'Labels' : labels }\n", " return data\n", "\n", "# generate training and validation data using the same pair of separation angles\n", "separation_angles = [math.pi / 6, math.pi / 3]\n", "training_data = generate_data(150, separation_angles)\n", "validation_data = generate_data(50, separation_angles)\n", "print(\"Training and validation data generated\")" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def plot_data (features : list, actual_labels : list, classified_labels : list = None, extra_lines : list = None):\n", " \"\"\"Plots the data, labeling it with actual labels if there are no classification results provided, \n", " and with the classification results (indicating their correctness) if they are provided.\n", " \"\"\"\n", " samples = np.array(features)\n", " pyplot.figure(figsize=(8, 8))\n", " for (idx_case, ((actual, classified), marker, color)) in enumerate(zip(cases, markers, colors)):\n", " mask = np.logical_and(np.equal(actual_labels, actual), \n", " np.equal(actual if classified_labels == None else classified_labels, classified))\n", " if not np.any(mask): continue\n", " pyplot.scatter(\n", " samples[mask, 0], samples[mask, 1],\n", " label = f\"Class {actual}\" if classified_labels == None else f\"Was {actual}, classified {classified}\",\n", " marker = marker, s = 300, c = [color],\n", " )\n", " # Add the lines to show the true classes boundaries, if provided\n", " if extra_lines != None:\n", " for line in extra_lines:\n", " pyplot.plot(line[0], line[1], color = 'gray')\n", " pyplot.legend()\n", " \n", "def separation_endpoint (angle : float) -> (float, float):\n", " if (angle < math.pi / 4):\n", " return (1, math.tan(angle))\n", " return (1/math.tan(angle), 1)\n", "\n", "# Set up lines that show class separation\n", "separation_lines = list(zip([(0,0), (0,0)], list(map(separation_endpoint, separation_angles))))\n", "extra_lines = []\n", "for line in separation_lines:\n", " extra_lines.append([[line[0][0], line[1][0]], [line[0][1], line[1][1]]])\n", " \n", "plot_data(training_data['Features'], training_data['Labels'], extra_lines = extra_lines)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Training\n", "\n", "Now that the data is ready, we can get to the interesting part: training the model! \n", "\n", "> This code calls Q# operation `TrainLinearlySeparableModel` defined in the `Backend.qs` file. \n", "This operation is a wrapper for the library operation [TrainSequentialClassifier](https://docs.microsoft.com/qsharp/api/qsharp/microsoft.quantum.machinelearning.trainsequentialclassifier). \n", "It provides all \"quantum\" details, such as the model structure.\n", "We will take a closer look at these details in the [deep dive tutorial](./InsideQuantumClassifiers.ipynb)." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training complete, found optimal parameters: [1.6047999999999956], -0.4360311896062463 with 4 misses\r\n" ] } ], "source": [ "(parameters, bias) = QuantumClassification.TrainLinearlySeparableModel.simulate(\n", " trainingVectors = training_data['Features'],\n", " trainingLabels = training_data['Labels'],\n", " initialParameters = [[1.0], [2.0]]\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Validation\n", "\n", "Let's validate our training results on a different data set, generated with the same distribution.\n", "\n", "> This code calls Q# operation `ClassifyLinearlySeparableModel` defined in the `Backend.qs` file. \n", "This operation is a wrapper for the library operations [EstimateClassificationProbabilities](https://docs.microsoft.com/qsharp/api/qsharp/microsoft.quantum.machinelearning.estimateclassificationprobabilities) \n", "and [InferredLabels](https://docs.microsoft.com/qsharp/api/qsharp/microsoft.quantum.machinelearning.inferredlabels). \n", "Again, we will take a closer look at the details of what's going on in the [deep dive tutorial](./InsideQuantumClassifiers.ipynb)." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Miss rate: 0.00%\n" ] } ], "source": [ "# Validation parameters\n", "tolerance = 0.0005\n", "nMeasurements = 10_000\n", "\n", "# Classify validation data set using training results\n", "classified_labels = QuantumClassification.ClassifyLinearlySeparableModel.simulate(\n", " samples = validation_data['Features'],\n", " parameters = parameters, bias = bias,\n", " tolerance = tolerance, nMeasurements = nMeasurements\n", ")\n", "\n", "# Calculate miss rate\n", "mask = np.not_equal(validation_data['Labels'], classified_labels)\n", "miss_count = np.array(classified_labels)[np.where(mask)].size\n", "miss_rate = miss_count / len(classified_labels)\n", "print(f\"Miss rate: {miss_rate:0.2%}\")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_data(validation_data['Features'], validation_data['Labels'], classified_labels, extra_lines)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Under the Hood\n", "\n", "So far everything we've seen looked perfectly normal, there was no noticeable difference between using a quantum classification library and a traditional machine learning library. \n", "Let's take the same data and see what is going on under the hood: what does a quantum classifier model look like, what are the parameters it uses and how it can be trained.\n", "\n", "**Go on to the [deep dive tutorial](./InsideQuantumClassifiers.ipynb)**.\n", "\n", "## Next Step: Feature Engineering\n", "\n", "Similarly to the traditional machine learning libraries, quantum classification can take advantage of feature engineering, modifying the input data to enable classification of more complex classes.\n", "In the next part of the tutorial, you can find several examples of feature engineering used with the QML library, and solve exercises on picking the right parameters to distinguish classes of increasingly complex shapes.\n", "\n", "**Go on to the [Quantum Classification With Feature Engineering tutorial](./QuantumClassificationWithFeatureEngineering.ipynb)**.\n", "\n", "\n", "## What's Next?\n", "\n", "This tutorial covered classifying artificial data, taking advantage of its simple structure. Classifying real data will require more complex models - same as in traditional machine learning.\n", "\n", "* Check out [introduction to quantum machine learning](https://docs.microsoft.com/azure/quantum/user-guide/libraries/machine-learning/) at Microsoft Quantum Development Kit documentation, which features a more interesting example - classifying half-moons dataset.\n", "* [Quantum machine learning samples](https://github.com/microsoft/Quantum/tree/main/samples/machine-learning) offer examples of classifying several more datasets." ] } ], "metadata": { "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.3" } }, "nbformat": 4, "nbformat_minor": 2 }