diff --git a/artificial_intelligence/input_files/clusters.csv b/artificial_intelligence/input_files/clusters.csv new file mode 100644 index 0000000..0515d1a --- /dev/null +++ b/artificial_intelligence/input_files/clusters.csv @@ -0,0 +1,101 @@ +id,f0,f1,class +1,-0.790753938295054,0.641879357753121,Green +2,-0.754753938295054,0.495879357753121,Green +3,-0.740753938295054,0.793879357753121,Green +4,-0.709753938295054,0.805879357753121,Green +5,-0.686753938295054,0.509879357753121,Green +6,-0.686753938295054,0.819879357753121,Green +7,-0.679753938295054,0.726879357753121,Green +8,-0.671753938295054,0.493879357753121,Green +9,-0.575753938295054,0.38387935775312,Green +10,-0.574753938295054,0.30487935775312,Green +11,-0.573753938295054,0.20087935775312,Green +12,-0.561753938295054,0.44787935775312,Green +13,-0.544753938295054,0.692879357753121,Green +14,-0.769399328867096,-0.215258156228817,Blue +15,-0.484753938295054,0.20087935775312,Green +16,-0.757399328867096,-0.241258156228817,Blue +17,-0.469753938295054,0.22187935775312,Green +18,-0.742399328867095,-0.181258156228816,Blue +19,-0.737399328867095,-0.782258156228818,Blue +20,-0.737399328867095,-0.434258156228818,Blue +21,-0.733399328867095,-0.380258156228817,Blue +22,-0.443753938295053,0.21187935775312,Green +23,-0.433753938295053,0.631879357753121,Green +24,-0.429753938295053,0.42287935775312,Green +25,-0.404753938295053,0.36387935775312,Green +26,-0.391753938295053,0.28787935775312,Green +27,-0.671399328867095,-0.288258156228817,Blue +28,-0.384753938295053,0.28887935775312,Green +29,-0.660399328867095,-0.565258156228818,Blue +30,-0.345753938295053,0.745879357753121,Green +31,-0.343753938295053,0.39687935775312,Green +32,-0.618399328867095,-0.190258156228817,Blue +33,-0.612399328867095,-0.333258156228817,Blue +34,-0.317753938295053,0.529879357753121,Green +35,-0.295753938295053,0.589879357753121,Green +36,-0.529399328867095,-0.696258156228818,Blue +37,-0.517399328867095,-0.254258156228817,Blue +38,-0.491399328867095,-0.648258156228818,Blue +39,-0.487399328867095,-0.176258156228816,Blue +40,-0.483399328867095,-0.501258156228818,Blue +41,-0.477399328867095,-0.233258156228817,Blue +42,-0.446399328867094,-0.738258156228818,Blue +43,-0.420399328867094,-0.778258156228818,Blue +44,-0.415399328867094,-0.720258156228818,Blue +45,-0.303399328867094,-0.443258156228817,Blue +46,0.206716536168602,0.445607988445591,Black +47,-0.289399328867094,-0.362258156228817,Blue +48,-0.282399328867094,-0.708258156228818,Blue +49,-0.271399328867094,-0.485258156228818,Blue +50,-0.266399328867094,-0.460258156228817,Blue +51,-0.248399328867094,-0.610258156228818,Blue +52,0.359716536168602,0.711607988445591,Black +53,0.362716536168602,0.46960798844559,Black +54,0.394716536168602,0.426607988445591,Black +55,0.379034788304394,0.295206221540858,Black +56,0.415716536168602,0.612607988445591,Black +57,0.430716536168603,0.25660798844559,Black +58,0.438716536168603,0.723607988445591,Black +59,0.439716536168603,0.23760798844559,Black +60,0.495716536168603,0.29360798844559,Black +61,0.527716536168603,0.40160798844559,Black +62,0.544716536168603,0.487607988445591,Black +63,0.671716536168603,0.654607988445591,Black +64,0.689716536168603,0.756607988445592,Black +65,0.719716536168603,0.575607988445591,Black +66,0.745716536168603,0.676607988445591,Black +67,0.763716536168603,0.493607988445591,Black +68,0.777716536168603,0.702607988445591,Black +69,0.784716536168603,0.31760798844559,Black +70,0.797716536168603,0.548607988445591,Black +71,0.801716536168603,0.525607988445591,Black +72,0.806716536168603,0.33160798844559,Black +73,0.821716536168603,0.650607988445591,Black +74,0.866716536168604,0.475607988445591,Black +75,0.879716536168604,0.763607988445592,Black +76,0.514746568057108,-0.592867950964888,Yellow +77,0.719696403912432,-0.544878699686855,Yellow +78,0.666540674252799,-0.621802247509328,Yellow +79,0.635683719072099,-0.47046746454256,Yellow +80,0.618881182104032,-0.576083411198979,Yellow +81,0.573274296047852,-0.662496458463321,Yellow +82,0.513265235447614,-0.427260940910389,Yellow +83,0.419651100911243,-0.52327543787077,Yellow +84,0.798908363904746,-0.465666739694541,Yellow +85,0.561272483927804,-0.456065289998503,Yellow +86,0.549270671807757,-0.506472900902703,Yellow +87,0.467658349391433,-0.460866014846522,Yellow +88,0.515004944090762,-0.690323119906209,Yellow +89,0.582311739084882,-0.52287694699401,Yellow +90,0.493663765190188,-0.545859755040782,Yellow +91,0.473964215435811,-0.573767450526149,Yellow +92,0.684092746149159,-0.429304085660722,Yellow +93,0.730058362242704,-0.485119476631455,Yellow +94,0.636485500909416,-0.532726721871198,Yellow +95,0.646335275786605,-0.419454310783534,Yellow +96,0.69230089188015,-0.590183741988129,Yellow +97,0.475605844582009,-0.644357503812664,Yellow +98,0.657826679809991,-0.404679648467752,Yellow +99,0.496947023482584,-0.499894138947237,Yellow +100,0.447698149096643,-0.578692337964743,Yellow diff --git a/artificial_intelligence/input_files/iris.data b/artificial_intelligence/input_files/iris.data new file mode 100644 index 0000000..5c4316c --- /dev/null +++ b/artificial_intelligence/input_files/iris.data @@ -0,0 +1,151 @@ +5.1,3.5,1.4,0.2,Iris-setosa +4.9,3.0,1.4,0.2,Iris-setosa +4.7,3.2,1.3,0.2,Iris-setosa +4.6,3.1,1.5,0.2,Iris-setosa +5.0,3.6,1.4,0.2,Iris-setosa +5.4,3.9,1.7,0.4,Iris-setosa +4.6,3.4,1.4,0.3,Iris-setosa +5.0,3.4,1.5,0.2,Iris-setosa +4.4,2.9,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.4,3.7,1.5,0.2,Iris-setosa +4.8,3.4,1.6,0.2,Iris-setosa +4.8,3.0,1.4,0.1,Iris-setosa +4.3,3.0,1.1,0.1,Iris-setosa +5.8,4.0,1.2,0.2,Iris-setosa +5.7,4.4,1.5,0.4,Iris-setosa +5.4,3.9,1.3,0.4,Iris-setosa +5.1,3.5,1.4,0.3,Iris-setosa +5.7,3.8,1.7,0.3,Iris-setosa +5.1,3.8,1.5,0.3,Iris-setosa +5.4,3.4,1.7,0.2,Iris-setosa +5.1,3.7,1.5,0.4,Iris-setosa +4.6,3.6,1.0,0.2,Iris-setosa +5.1,3.3,1.7,0.5,Iris-setosa +4.8,3.4,1.9,0.2,Iris-setosa +5.0,3.0,1.6,0.2,Iris-setosa +5.0,3.4,1.6,0.4,Iris-setosa +5.2,3.5,1.5,0.2,Iris-setosa +5.2,3.4,1.4,0.2,Iris-setosa +4.7,3.2,1.6,0.2,Iris-setosa +4.8,3.1,1.6,0.2,Iris-setosa +5.4,3.4,1.5,0.4,Iris-setosa +5.2,4.1,1.5,0.1,Iris-setosa +5.5,4.2,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.0,3.2,1.2,0.2,Iris-setosa +5.5,3.5,1.3,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +4.4,3.0,1.3,0.2,Iris-setosa +5.1,3.4,1.5,0.2,Iris-setosa +5.0,3.5,1.3,0.3,Iris-setosa +4.5,2.3,1.3,0.3,Iris-setosa +4.4,3.2,1.3,0.2,Iris-setosa +5.0,3.5,1.6,0.6,Iris-setosa +5.1,3.8,1.9,0.4,Iris-setosa +4.8,3.0,1.4,0.3,Iris-setosa +5.1,3.8,1.6,0.2,Iris-setosa +4.6,3.2,1.4,0.2,Iris-setosa +5.3,3.7,1.5,0.2,Iris-setosa +5.0,3.3,1.4,0.2,Iris-setosa +7.0,3.2,4.7,1.4,Iris-versicolor +6.4,3.2,4.5,1.5,Iris-versicolor +6.9,3.1,4.9,1.5,Iris-versicolor +5.5,2.3,4.0,1.3,Iris-versicolor +6.5,2.8,4.6,1.5,Iris-versicolor +5.7,2.8,4.5,1.3,Iris-versicolor +6.3,3.3,4.7,1.6,Iris-versicolor +4.9,2.4,3.3,1.0,Iris-versicolor +6.6,2.9,4.6,1.3,Iris-versicolor +5.2,2.7,3.9,1.4,Iris-versicolor +5.0,2.0,3.5,1.0,Iris-versicolor +5.9,3.0,4.2,1.5,Iris-versicolor +6.0,2.2,4.0,1.0,Iris-versicolor +6.1,2.9,4.7,1.4,Iris-versicolor +5.6,2.9,3.6,1.3,Iris-versicolor +6.7,3.1,4.4,1.4,Iris-versicolor +5.6,3.0,4.5,1.5,Iris-versicolor +5.8,2.7,4.1,1.0,Iris-versicolor +6.2,2.2,4.5,1.5,Iris-versicolor +5.6,2.5,3.9,1.1,Iris-versicolor +5.9,3.2,4.8,1.8,Iris-versicolor +6.1,2.8,4.0,1.3,Iris-versicolor +6.3,2.5,4.9,1.5,Iris-versicolor +6.1,2.8,4.7,1.2,Iris-versicolor +6.4,2.9,4.3,1.3,Iris-versicolor +6.6,3.0,4.4,1.4,Iris-versicolor +6.8,2.8,4.8,1.4,Iris-versicolor +6.7,3.0,5.0,1.7,Iris-versicolor +6.0,2.9,4.5,1.5,Iris-versicolor +5.7,2.6,3.5,1.0,Iris-versicolor +5.5,2.4,3.8,1.1,Iris-versicolor +5.5,2.4,3.7,1.0,Iris-versicolor +5.8,2.7,3.9,1.2,Iris-versicolor +6.0,2.7,5.1,1.6,Iris-versicolor +5.4,3.0,4.5,1.5,Iris-versicolor +6.0,3.4,4.5,1.6,Iris-versicolor +6.7,3.1,4.7,1.5,Iris-versicolor +6.3,2.3,4.4,1.3,Iris-versicolor +5.6,3.0,4.1,1.3,Iris-versicolor +5.5,2.5,4.0,1.3,Iris-versicolor +5.5,2.6,4.4,1.2,Iris-versicolor +6.1,3.0,4.6,1.4,Iris-versicolor +5.8,2.6,4.0,1.2,Iris-versicolor +5.0,2.3,3.3,1.0,Iris-versicolor +5.6,2.7,4.2,1.3,Iris-versicolor +5.7,3.0,4.2,1.2,Iris-versicolor +5.7,2.9,4.2,1.3,Iris-versicolor +6.2,2.9,4.3,1.3,Iris-versicolor +5.1,2.5,3.0,1.1,Iris-versicolor +5.7,2.8,4.1,1.3,Iris-versicolor +6.3,3.3,6.0,2.5,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +7.1,3.0,5.9,2.1,Iris-virginica +6.3,2.9,5.6,1.8,Iris-virginica +6.5,3.0,5.8,2.2,Iris-virginica +7.6,3.0,6.6,2.1,Iris-virginica +4.9,2.5,4.5,1.7,Iris-virginica +7.3,2.9,6.3,1.8,Iris-virginica +6.7,2.5,5.8,1.8,Iris-virginica +7.2,3.6,6.1,2.5,Iris-virginica +6.5,3.2,5.1,2.0,Iris-virginica +6.4,2.7,5.3,1.9,Iris-virginica +6.8,3.0,5.5,2.1,Iris-virginica +5.7,2.5,5.0,2.0,Iris-virginica +5.8,2.8,5.1,2.4,Iris-virginica +6.4,3.2,5.3,2.3,Iris-virginica +6.5,3.0,5.5,1.8,Iris-virginica +7.7,3.8,6.7,2.2,Iris-virginica +7.7,2.6,6.9,2.3,Iris-virginica +6.0,2.2,5.0,1.5,Iris-virginica +6.9,3.2,5.7,2.3,Iris-virginica +5.6,2.8,4.9,2.0,Iris-virginica +7.7,2.8,6.7,2.0,Iris-virginica +6.3,2.7,4.9,1.8,Iris-virginica +6.7,3.3,5.7,2.1,Iris-virginica +7.2,3.2,6.0,1.8,Iris-virginica +6.2,2.8,4.8,1.8,Iris-virginica +6.1,3.0,4.9,1.8,Iris-virginica +6.4,2.8,5.6,2.1,Iris-virginica +7.2,3.0,5.8,1.6,Iris-virginica +7.4,2.8,6.1,1.9,Iris-virginica +7.9,3.8,6.4,2.0,Iris-virginica +6.4,2.8,5.6,2.2,Iris-virginica +6.3,2.8,5.1,1.5,Iris-virginica +6.1,2.6,5.6,1.4,Iris-virginica +7.7,3.0,6.1,2.3,Iris-virginica +6.3,3.4,5.6,2.4,Iris-virginica +6.4,3.1,5.5,1.8,Iris-virginica +6.0,3.0,4.8,1.8,Iris-virginica +6.9,3.1,5.4,2.1,Iris-virginica +6.7,3.1,5.6,2.4,Iris-virginica +6.9,3.1,5.1,2.3,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +6.8,3.2,5.9,2.3,Iris-virginica +6.7,3.3,5.7,2.5,Iris-virginica +6.7,3.0,5.2,2.3,Iris-virginica +6.3,2.5,5.0,1.9,Iris-virginica +6.5,3.0,5.2,2.0,Iris-virginica +6.2,3.4,5.4,2.3,Iris-virginica +5.9,3.0,5.1,1.8,Iris-virginica + diff --git a/artificial_intelligence/qnn_base.ipynb b/artificial_intelligence/qnn_base.ipynb new file mode 100644 index 0000000..6d7bf75 --- /dev/null +++ b/artificial_intelligence/qnn_base.ipynb @@ -0,0 +1,578 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quantum Nearest Neighbour: distance based classifier\n", + "## References: \n", + "* Classifier: Implementing a distance-based classifier with a quantum interference circuit, M. Schuld et al 2017 EPL 119 60002" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Preparing the data" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "iris = pd.read_csv(\"input_files/iris.data\",header=None,names=[\"f0\",\"f1\",\"f2\",\"f3\",\"class\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "setosa = iris[iris[\"class\"] == \"Iris-setosa\"].loc[:,[\"f0\",\"f1\",\"class\"]]\n", + "# setosa.loc[:,\"class\"] = -1\n", + "setosa[\"color\"] = \"Red\"\n", + "setosa[\"marker\"] = \"o\"\n", + "\n", + "versicolor = iris[iris[\"class\"] == \"Iris-versicolor\"].loc[:,[\"f0\",\"f1\",\"class\"]]\n", + "# versicolor.loc[:,\"class\"] = 1\n", + "versicolor[\"color\"] = \"Blue\"\n", + "versicolor[\"marker\"] = \"x\"\n", + "\n", + "virginica = iris[iris[\"class\"] == \"Iris-virginica\"].loc[:,[\"f0\",\"f1\",\"class\"]]\n", + "# virginica.loc[:,\"class\"] = 1\n", + "virginica[\"color\"] = \"Green\"\n", + "virginica[\"marker\"] = \".\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.concat([setosa,versicolor])\n", + "# data = pd.concat([versicolor,virginica])\n", + "# data = pd.concat([setosa,versicolor,virginica])" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.scatter(data.to_numpy()[:50,0], data.to_numpy()[:50,1], color=\"red\", marker=\"o\", label=\"setosa\")\n", + "plt.scatter(data.to_numpy()[50:100,0], data.to_numpy()[50:100,1], color=\"blue\", marker=\"x\", label=\"versicolor\")\n", + "\n", + "plt.xlabel('sepal length [cm]')\n", + "plt.ylabel('sepal width [cm]')\n", + "plt.legend(loc='upper left')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.preprocessing import StandardScaler\n", + "scaler = StandardScaler()\n", + "data.iloc[:,[0,1]] = scaler.fit_transform(data.iloc[:,[0,1]])" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAEJCAYAAACdePCvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3df5hV1X3v8fcXBgMTEa3SW66EwfyQqkCGAEZNcuEKiVa9ml+U3ocaQX24kYYQRRu95IZpIsltzQ3lSYwJaYxp5fqjqDeJSZuI1aitVcDyU4JYIwryBMRCIIoG5nv/2OfAmZkzM2fPOWv2r8/refYz7D3nrPPdC9jr7LW+a21zd0REpHgGJB2AiIgkQw2AiEhBqQEQESkoNQAiIgWlBkBEpKDUAIiIFFRiDYCZDTazp81svZltNrO/SCoWEZEisqTmAZiZAW9394NmNgh4Aljg7v+aSEAiIgXTlNQHe9TyHCztDiptPbZGp5xyio8ePTpwZCIi+bJ27dpX3X145+OJNQAAZjYQWAu8G7jV3Z+q8pq5wFyAUaNGsWbNmv4NUkQk48xse7XjiQ4Cu/sRd28FRgJnm9nYKq9Z7u6T3H3S8OFdGjAREemjVGQBufs+4BHgwqRjEREpiiSzgIab2YmlPw8BPgz8Mql4RESKJskxgBHAD0rjAAOAe939wbiF/O53v2PHjh0cOnSo4QEW0eDBgxk5ciSDBg1KOhQRCSzJLKANwIR6y9mxYwdDhw5l9OjRRJml0lfuzt69e9mxYwennXZa0uGISGCpGAOox6FDhzj55JN18W8AM+Pkk0/W3ZRIQWS+AQB08W8g1WUDrFgBo0fDgAHRzxUrko5IpKpE5wGI5M6KFTB3Lrz+erS/fXu0DzBrVnJxiVSRizuALLnjjjt45ZVXkg5DQlm06NjFv+z116PjIimjBqCfqQHIuZdeindcJEHFawAC9M/+9re/5eKLL+a9730vY8eO5Z577mHt2rVMmTKFiRMncsEFF7Br1y5WrlzJmjVrmDVrFq2trbzxxhs8/PDDTJgwgXHjxnHllVfy5ptvAnDjjTdy5plnMn78eK6//noAfvzjH/P+97+fCRMmMH36dH7961/XHbs02KhR8Y6LJMndM7NNnDjRO3v22We7HOvWnXe6Nze7w7GtuTk6XoeVK1f61VdffXR/3759fu655/ru3bvd3f3uu+/2OXPmuLv7lClTfPXq1e7u/sYbb/jIkSN969at7u5++eWX+9KlS/3VV1/1008/3dvb293d/T/+4z/c3f211147euy73/2uX3fddXXF3Z1YdSodBfo3JlIPYI1XuaYW6w4gUP/suHHjeOihh/j85z/P448/zssvv8ymTZv48Ic/TGtrKzfffDM7duzo8r6tW7dy2mmncfrppwNwxRVX8NhjjzFs2DAGDx7MVVddxf33309zczMQzXm44IILGDduHLfccgubN2+uK24JYNYsWL4cWlrALPq5fLkGgCWVitUABOqfPf3003nmmWcYN24cX/jCF7jvvvs466yzWLduHevWrWPjxo38/Oc/r7m8pqYmnn76aT75yU/y4IMPcuGF0RJJ8+fP5zOf+QwbN27kO9/5jvL102rWLHjxRWhvj37q4i8pVawGIFD/7CuvvEJzczN/+qd/yg033MBTTz3Fnj17ePLJJ4FouYryt/WhQ4dy4MABAMaMGcOLL77I888/D8Df/d3fMWXKFA4ePMj+/fu56KKLWLp0KevXrwdg//79nHrqqQD84Ac/qCtmEZFizQNYsqRjjjZAc3N0vA4bN27khhtuYMCAAQwaNIjbbruNpqYmPvvZz7J//34OHz7M5z73Oc466yxmz57Npz/9aYYMGcKTTz7J97//fWbMmMHhw4eZPHkyn/70p3nttde47LLLOHToEO7O17/+dQDa2tqYMWMGJ510Eueffz6/+tWv6opbRIotsUdC9sWkSZO88wNhtmzZwhlnnFF7IStWRH3+L70UffNfskS36J3ErlMRSTUzW+vukzofL9YdAEQXe13wRUQKNgYgIiJHqQEQESkoNQAiIgWlBkBEpKDUAEhxad1+KTg1ACn0xS9+kVWrVsV+36OPPsoll1wSIKIcKq/bv317tGJPed1+NQJSIIVLA3WPlmjpbr//4igtxjSgaxv8pS99qV9iOHz4ME1NhfsnEOlpXSilCUtBFOoOoK0Nrr02uuhD9PPaa6PjfXXjjTdy6623VnxGG1/72te45ZZbmDx5MuPHj2fx4sUAvPjii4wZM4ZPfepTjB07lpdffpnZs2czduxYxo0bx9KlSwGYPXs2K1euBGD16tWcd955vPe97+Xss8/mwIEDHDp0iDlz5jBu3DgmTJjAI4880iWu1157jY9+9KOMHz+ec845hw0bNhyN7/LLL+cDH/gAl19+ed9PPOu0br9IcRoAd9i3D5YtO9YIXHtttL9v37FGIa6ZM2dy7733Ht2/9957GT58ONu2bePpp59m3bp1rF27lsceewyAbdu2MW/ePDZv3syrr77Kzp072bRpExs3bmTOnDkdyn7rrbeYOXMmy5YtY/369axatYohQ4Zw6623YmZs3LiRu+66iyuuuKLLwnCLFy9mwoQJbNiwga985St86lOfOvq7Z599llWrVnHXXXf17aTzQOv2ixSnC8gMSl+wWbYs2gAWLIiO97UbaMKECezevZtXXnmFPXv2cNJJJx1d/XPChAkAHDx4kG3btjFq1ChaWlo455xzAHjnO9/JCy+8wPz587n44ov5yEc+0qHsrVu3MmLECCZPngzACSecAMATTzzB/PnzAfjDP/xDWlpaeO655zq894knnuC+++4D4Pzzz2fv3r385je/AeDSSy9lyJAhfTvhvAi0LpRIlhTmDgA6NgJl9Vz8y2bMmMHKlSu55557mDlzJu7OTTfddHQ56Oeff56rrroKgLe//e1H33fSSSexfv16pk6dyre//W2uvvrq+gKpUWUMhaV1+0WK1QCUu30qVY4J9NXMmTO5++67WblyJTNmzOCCCy7g9ttv5+DBgwDs3LmT3bt3d3nfq6++Snt7O5/4xCe4+eabeeaZZzr8fsyYMezatYvVq1cDcODAAQ4fPsyHPvQhVpSyVZ577jleeuklxowZ0+G9la959NFHOeWUU47eQUiJ1u2XgitMF1Bln3+526e8D/XdCZx11lkcOHCAU089lREjRjBixAi2bNnCueeeC8Dxxx/PnXfeycCBAzu8b+fOncyZM4f29nYAvvrVr3b4/XHHHcc999zD/PnzeeONNxgyZAirVq1i3rx5XHPNNYwbN46mpibuuOMO3va2t3V4b1tbG1deeSXjx4+nubk5Xc8P0IqsIqlQqOWg29qiAd/yxb7cKJx4Yn2ZQHkTdDnocv595753db+IBNPdctCFagAgPfMA0ixoAzB6dDTpqrOWlqgbRkQarrsGoFBjAND1Yq+Lfz9T/r1IauSiAcjSXUzaBa9L5d+LpEZiDYCZvcPMHjGzZ81ss5kt6Es5gwcPZu/evWoEGsDd2bt3L4MHDw73IUuWRH3+lZR/L5KIJLOADgML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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(data.to_numpy()[:50,0], data.to_numpy()[:50,1], color=\"red\", marker=\"o\", label=\"setosa\")\n", + "plt.scatter(data.to_numpy()[50:100,0], data.to_numpy()[50:100,1], color=\"blue\", marker=\"x\", label=\"versicolor\")\n", + "\n", + "plt.xlabel('sepal length [cm]')\n", + "plt.ylabel('sepal width [cm]')\n", + "plt.legend(loc='upper left')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def normalize(v):\n", + " norm = np.linalg.norm(v)\n", + " if norm == 0: \n", + " return v\n", + " return v / norm" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "for i in data.index:\n", + " v = [data.loc[i,\"f0\"],data.loc[i,\"f1\"]]\n", + " v = normalize(v)\n", + " data.loc[i,\"f0\"], data.loc[i,\"f1\"] = v[0], v[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAEGCAYAAABLgMOSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3deZRU5Zn48e/TjYi4sI8iSDcm7iyNtKLmZ8DdqOMyaiBDDJuHUSIgxJzo4TfSMTKamIiQuIQ4LhP7CEpMxMlEIyoYJxppkkYWfwgiKC3KJgTC3vX8/njvtW9VV1XXcmvrfj7n3FN137u93C7qqXe57yuqijHGGJOuskJnwBhjTGmyAGKMMSYjFkCMMcZkxAKIMcaYjFgAMcYYk5F2hc5APnXv3l0rKysLnQ1jjCkpS5cu3aqqPWLT21QAqayspK6urtDZMMaYkiIiG+KlWxWWMcaYjFgAMcYYkxELIMYYYzLSptpA4jl48CAbN25k3759hc5Kq9ChQwd69+7NYYcdVuisGGNyrM0HkI0bN3L00UdTWVmJiBQ6OyVNVdm2bRsbN26kb9++hc6OMSbH2nwV1r59++jWrZsFjxCICN26dbPSnDFtREEDiIg8ISKbRWRFgu0iIrNFZK2IvCciZwa2jRKRNd4yKst8ZHO4CbB7aUzbUegSyFPA5Um2fwM4yVvGA48CiEhXYDowBDgbmC4iXXKaU2NaUlsLlZVQVgZHHQXl5SAC7drBhAnpHV9Z6dbjpaVzvDG5pKoFXYBKYEWCbb8EvhVYXw30BL4F/DLRfomWwYMHa6xVq1Y1SytWTz75pDY0NBQ6Gy0qpXv6pWeeUa2oUBVxrxddpFpergru9dZbWz6+Y0e3f6Il2TniHX/YYart20endezo9k3l+ET7GpMmoE7jfKcWugTSkl7AJ4H1jV5aovRW7amnnuLTTz8tdDZanwkT4KabYMMG99W7YQO89ho0NrrtjY3w6KPJSxHTpsGePcmvM2dOescfPAgHDkSn7dnj9k3l+ET7JmIlGJOmYg8gWROR8SJSJyJ1W7Zsyf6EIf8n+8c//sGVV17JwIED6devH/PmzWPp0qUMHTqUwYMHc9lll7Fp0ybmz59PXV0dI0eOpKqqir179/Laa68xaNAg+vfvz9ixY9m/fz8Ad955J6effjoDBgzgjjvuAOCll15iyJAhDBo0iIsvvpjPP/88yxvRStTWwmOPucDRkmQB4OOPWz7eD0iZHp9s30THp3re2loYPz46iI4dC927W0AxicUrluRzoZSqsHJQTTB//ny9+eabv1zfsWOHnnvuubp582ZVVZ07d66OGTNGVVWHDh2qS5YsUVXVvXv3au/evXX16tWqqnrTTTfpzJkzdevWrXryySdrJBJRVdUvvvhCVVW3b9/+ZdqvfvUrnTp1asZ5bklJVWFVVCSvdopdsjlPeXk4+aioSP34ePtmen2rEmuzKNEqrAXAd7zeWOcAO1V1E/AKcKmIdPEazy/10nIrjGqCGP379+fVV1/lBz/4AX/605/45JNPWLFiBZdccglVVVXce++9bNy4sdlxq1evpm/fvpx88skAjBo1ijfffJNOnTrRoUMHxo0bxwsvvEDHjh0B97zLZZddRv/+/XnggQdYuXJlxnluVdL55V9ennjbjBng3euExo9P7/jDDoP27aPTOnZ0+6ZyfKJ940nlPmT5WTetULyokq8FeBbYBBzEtWOMA24BbvG2C/Aw8CGwHKgOHDsWWOstY1K5XtYlEJH4v8xEUj9HHNu2bdNf//rX+vWvf11ramr0nHPOibtfsARSX1+v559//pfbFi5cqNddd52qqu7bt09///vf65gxY/SCCy748tgXX3xRVVXfeOMNHTp0aFZ5Tib0EshFF0Xf74suCu/c6fzyT6Uh3W+IP/JI1bKyppJHS8fGHl9R4dbjpaVzfKpSvQ9ZftZNaSJBCaSgASTfS9YBJNtqgjgaGhp07969qqr60ksv6Te+8Q39yle+on/+859VVfXAgQO6YsUKVVW96qqr9PXXX1dVV4V1wgkn6Jo1a1RVddSoUfrQQw/prl279PPPP1dVVx3WtWtXVVWtqqrSuro6VVUdPXp06QSQ2OARdhCJVy0ponr66en1wip1qfQiy/KzbkqXBZAwAkgO2kBefvll7d+/vw4cOFCrq6t1yZIl+re//U3PP/98HTBggJ5++uk6Z84cVXXtJSeffLIOHDhQ9+zZowsXLtSqqirt16+fjhkzRvft26effvqpnnXWWdq/f3/t16+fPvXUU6qq+rvf/U779u2rZ555pt5xxx3FF0AS/XrOpD0irGu3NcH70K2b60ZsbSBGLYCEE0BU7csmBRnd00SBOR8BxMRn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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(data.to_numpy()[:50,0], data.to_numpy()[:50,1], color=\"red\", marker=\"o\", label=\"setosa\")\n", + "plt.scatter(data.to_numpy()[50:100,0], data.to_numpy()[50:100,1], color=\"blue\", marker=\"x\", label=\"versicolor\")\n", + "\n", + "plt.xlabel('sepal length [cm]')\n", + "plt.ylabel('sepal width [cm]')\n", + "plt.legend(loc='upper left')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
f0f1classcolormarker
05.13.5Iris-setosaRedo
14.93.0Iris-setosaRedo
24.73.2Iris-setosaRedo
34.63.1Iris-setosaRedo
45.03.6Iris-setosaRedo
\n", + "
" + ], + "text/plain": [ + " f0 f1 class color marker\n", + "0 5.1 3.5 Iris-setosa Red o\n", + "1 4.9 3.0 Iris-setosa Red o\n", + "2 4.7 3.2 Iris-setosa Red o\n", + "3 4.6 3.1 Iris-setosa Red o\n", + "4 5.0 3.6 Iris-setosa Red o" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "setosa.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
f0f1classlabelangle
330.0194490.999811Iris-setosax0 (t0)3.142
850.7886100.614894Iris-versicolorx1 (t1)1.325
28-0.5491040.835754Iris-setosax' (x0)4.304
560.9482210.317610Iris-versicolorx'' (x1)3.036
\n", + "
" + ], + "text/plain": [ + " f0 f1 class label angle\n", + "33 0.019449 0.999811 Iris-setosa x0 (t0) 3.142\n", + "85 0.788610 0.614894 Iris-versicolor x1 (t1) 1.325\n", + "28 -0.549104 0.835754 Iris-setosa x' (x0) 4.304\n", + "56 0.948221 0.317610 Iris-versicolor x'' (x1) 3.036" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# For setosa and versicolor\n", + "vectors = data.loc[[33,85,28,56],[\"f0\",\"f1\",\"class\"]]\n", + "vectors[\"label\"], vectors[\"angle\"] = [\"x0 (t0)\",\"x1 (t1)\",\"x' (x0)\",\"x'' (x1)\"], [round(np.pi,3),1.325,4.304,3.036]\n", + "vectors\n", + "\n", + "# For versicolor and virginica\n", + "# vectors = data.loc[[50,145,53,149],[\"f0\",\"f1\",\"class\"]]\n", + "# vectors[\"label\"] = [\"t0\",\"t1\",\"x0\",\"x1\"]\n", + "# vectors" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "f0 = vectors.columns.get_loc(\"f0\")\n", + "f1 = vectors.columns.get_loc(\"f1\")\n", + "t0 = np.arctan(vectors.iloc[0,f1] / vectors.iloc[0,f0]) * 2 % (2 * np.pi)\n", + "t1 = np.arctan(vectors.iloc[1,f1] / vectors.iloc[1,f0]) * 2 % (2 * np.pi)\n", + "x0 = np.arctan(vectors.iloc[2,f1] / vectors.iloc[2,f0]) * 2 % (2 * np.pi)\n", + "x1 = np.arctan(vectors.iloc[3,f1] / vectors.iloc[3,f0]) * 2 % (2 * np.pi)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Building the quantum circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "import qiskit\n", + "from qiskit import IBMQ\n", + "from qiskit import (\n", + " QuantumCircuit,\n", + " QuantumRegister,\n", + " ClassicalRegister,\n", + " execute,\n", + " Aer)\n", + "from qiskit.visualization import plot_histogram\n", + "# import qiskit.aqua.circuits.gates.controlled_ry_gates" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'4 qubits'" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "str(1+1+1+1) + ' qubits'" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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AAAAqCAKPQAAAACoIAo9AAAAAKggCj0AAAAAqCAKPQAAAACoIAo9AAAAAKggCj0AAAAAqCAKPQAAAACoIAo9AAAAAKggCj0AAAAAqCAKPQAAAACoIAo9AAAAAKggCj0AAAAAqCAKPQAAAACoIAo9AAAAAKggCj0AAAAAqCBtig5Ay7NkyZIGZ2666aaMGTNmuzO9evVqqkgAAAAAFcMOPUrpRz/6UdERAAAAAEpJoQcAAAAAFUShBwAAAAAVRKFHKd1+++1FRwAAAAAoJYUeAAAAAFQQhR6lNHz48KIjAAAAAJSSQg8AAAAAKkibogNA2Vw6uZjPHf+FD/7eqqqqpgvyPtTW1hbyuQAAANCS2aFHKY0ePbroCAAAAAClpNCjlMaMGVN0BAAAAIBSUuhRSscff3zREQAAAABKSaFHKa1evbroCAAAAAClpNADAAAAgAqi0KOU+vTpU3QEAAAAgFJS6FFKd9xxR9ERmr327dund+/eOeyww9KlS5cG588555xUVVXtgmQAAADA9ij0KKWrr7666AjNUs+ePTNu3LgsXrw4r7/+eh5//PE89thjef7557Nq1ar86le/yqmnnppWrer/r+GHP/xhpkyZkptuuqmg5AAAAMAmLa7Qmz59ek477bQceOCB2X333bP//vvnggsuyOuvv150NDYzbdq0oiM0K/vss09uu+22PPHEE7n00kvTq1evrFu3Lk888UQWLlyYV199Nfvtt19OO+203HPPPVm0aFEGDx6cZGOZN2bMmLz99tu5++67C/4mAAAAQJuiA+xqjzzySIYOHZqvfOUr6dChQxYvXpx///d/T5LccsstBaejEt0ypmuOOfNbOWzYBXVrtbW1mfiVD+cTo36ejw46vcB0ybHHHps777wzH/nIR/LWW2/ltttuy09/+tM8/PDDeeedd+rmevTokTPPPDMXX3xxevXqlQcffDBz587NUUcdlbfffjunnXZafvOb3xT4TQAAAICkBRZ6l1xySd3xhg0bMnjw4DzyyCP53e9+V2AqKtWbrz6Xv732Qvbt3r/e+usvLcs7b7+RzgcPLCjZRsccc0x++9vfpl27dpkxY0a+/OUvZ9myZVudXb58eb7//e/nxhtvzFVXXZVvfOMbOeqoo7Ju3TplHgAAAJRIi7rkdv369Zk8eXKGDh2azp07p3Xr1tltt91y8803p3379kmSZ555JjU1NenZs2f69euXBx98sODULdOMGTOKjtAoq5bNSVWr1ul4wGH11l9e+Uj2/HDndOh4YEHJkr333jt33nln2rVrl1/84hc58cQTt1nmbe6dd97JXnvtlVatWqW2tjZt2rRJhw4ddkFiAAAAoDFaVKF37rnn5itf+UoGDx6cW265JbNnz85DDz2UDh06pF+/fkmSUaNGZcSIEVm6dGkmTZqUc845p95liewaixYtKjpCo6xaNid7f6Rn2lTvXm999cpHsl+PYnfn3XDDDenSpUseeOCBfOlLX8r69esb9b7N75n3ox/9KEkyYcKEdOzYcWfGBQAAABqpxVxyu3DhwkyePDm33HJLzj///Lr1WbNm5Y033siRRx6Zl19+OTNnzqy78f/gwYPTtWvX3H///TnllFN2Wraqqqqddu4yuuyyyxqcGTduXINz48aNa6pI9VxyW22jZ1ctm5PXVj2VSRd2qre+ds2bGfiZK9/X5zbl78EhhxySL37xi3n77bfz5S9/+QOVeaeddlruu+++9O3bN8OGDctFF12Ua6+9dqdlBgAAgJautrZxnUSLKfRWrlyZJOnVq1fd2tq1a3P55ZcnSY488sisXLkynTt3Ttu2betmevTokRUrVuzasFSMVcvn5ugzvpneQ/+feuuTr+yXzgXu0Bs1alSSZMqUKXn66acb9Z73lnmb7pl37bXXZtiwYRk1alS+853vNLocBAAAAHaOFlPoHX744dl9993z9a9/PVdddVVeeeWVXH/99fnLX/6S1q1bp3///lmyZEkh2WpqapIk06dP3+bMCSec0OBMpWjMv+dx48Zl5MiR2525/vrrmypSPZdObtzcay8+lTV/+0u6/8Mp6dDxgPrrf38tnQ8e9L4+t7Et/Na8d6fcph2lP/3pTxv1/m2VeUny+9//PitWrEj37t3Tp0+fPPbYY02SGQAAAPhgWsw99Pbff//88pe/zIsvvpjPfe5z+cEPfpB//dd/zeDBg/Oxj30se+65Z7p165ZVq1ZlzZo1de9bvnx5unfvXmDylumaa64pOkKDVi2bkzZt98y+3Q6vt/7Ck7PTvuOB2fPD+xWSa4899kifPn2ybt26zJ07t8H57ZV5m/zpT39KsnEnKwAAAFCsFrNDL0lOP/30nH766fXWzj777LrjTp06ZciQIbn11ltz8cUX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Zs2aPP744znuuOPy9NNPZ9CgQfnkJz+Z1atXZ9q0admwYUPuvffedOmy8cETf//737N06dJ84hOfqHeeTZfafvWrX80ZZ5yRtm3bZtiwYampqdnl32lnevW1N7LPXh0yZOBhRUcBAAAA4AOo+B16CxcuzLp16zJ48ODcf//92XfffXPjjTfmV7/6VT71qU9l7ty5Of744+vmH3300WzYsGGLS2tPPfXUfOc738natWvz/e9/P9dcc02ef/75Xf11drrDPtYj/+srI+zOAwAAAKhQVbW1tbVFhwAAAAAAGqfid+gBAAAAQEui0AMAAACACqLQAwAAAIAKotADAAAAgAqi0AMAAACACqLQAwAAAIAKotADAAAAgAqi0AMAAACACqLQAwAAAIAKotADAAAAgAqi0AMAAACACqLQAwAAAIAKotADAAAAgAqi0AMAAACACqLQAwAAAIAKotADAAAAgAqi0AMAAACACqLQAwAAAIAKotADAAAAgAqi0AMAAACACqLQAwAAAIAKotADAAAAgAqi0AMAAACACqLQAwAAAIAKotADAAAAgAqi0AMAAACACqLQAwAAAIAK8v8D6fLExnpomQ4AAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = QuantumRegister(1,'a')\n", + "m = QuantumRegister(1,'m')\n", + "i = QuantumRegister(1,'i')\n", + "c = QuantumRegister(1,'c')\n", + "b = ClassicalRegister(2, 'bit')\n", + "circuit = QuantumCircuit(a,m,i,c,b)\n", + "\n", + "circuit.h(a)\n", + "circuit.h(m)\n", + "\n", + "circuit.barrier()\n", + "\n", + "circuit.cry(x0,a[0],i[0])\n", + "circuit.x(a)\n", + "\n", + "circuit.barrier()\n", + "\n", + "# circuit.ccx(a,m,i)\n", + "circuit.mcry(t0,a[:]+m[:],i[0],None)\n", + "circuit.x(m)\n", + "\n", + "circuit.barrier()\n", + "\n", + "circuit.mcry(t1,a[:]+m[:],i[0],None)\n", + "\n", + "circuit.barrier()\n", + "\n", + "circuit.cx(m,c)\n", + "\n", + "circuit.barrier()\n", + "\n", + "circuit.h(a)\n", + "circuit.measure(a,b[0])\n", + "circuit.measure(c,b[1])\n", + "\n", + "circuit.draw(output='mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Total counts are: {'00': 3698, '11': 1941, '01': 362, '10': 2191}\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simulator = Aer.get_backend('qasm_simulator')\n", + "job = execute(circuit, simulator, shots=8192)\n", + "result = job.result()\n", + "counts = result.get_counts(circuit)\n", + "print(\"\\nTotal counts are:\",counts)\n", + "plot_histogram(counts)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "goodCounts = {k: counts[k] for k in counts.keys() & {'00', '10'}}\n", + "plot_histogram(goodCounts)" + ] + } + ], + "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.4" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/artificial_intelligence/qnn_clusters.ipynb b/artificial_intelligence/qnn_clusters.ipynb new file mode 100644 index 0000000..fd7cd70 --- /dev/null +++ b/artificial_intelligence/qnn_clusters.ipynb @@ -0,0 +1,445 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quantum Nearest Neighbour: distance based multiclass classifier\n", + "## References: \n", + "* Classifier: Implementing a distance-based classifier with a quantum interference circuit, M. Schuld et al 2017 EPL 119 60002\n", + "* QRAM: Circuit-Based Quantum Random Access Memory for Classical Data, Daniel K. Park, Francesco Petruccione, and June-Koo Kevin Rhee" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Let's test the multiclass classifier with a simple data set" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Preparing the data" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "from numpy import pi\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "data = pd.read_csv(\"input_files/clusters.csv\", usecols=[\"f0\", \"f1\", \"class\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Create binary variables to filter data\n", + "isGreen = data[\"class\"] == 'Green'\n", + "isBlue = data[\"class\"] == 'Blue'\n", + "isBlack = data[\"class\"] == 'Black'\n", + "isYellow = data[\"class\"] == \"Yellow\"\n", + "\n", + "# Filter data\n", + "greenData = data[isGreen]#.drop(['Class'], axis=1)\n", + "blueData = data[isBlue]#.drop(['Class'], axis=1)\n", + "blackData = data[isBlack]#.drop(['Class'], axis=1)\n", + "yellowData = data[isYellow]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(greenData[\"f0\"], greenData[\"f1\"], 'gx')\n", + "plt.plot(blueData[\"f0\"], blueData[\"f1\"], 'bx')\n", + "plt.plot(blackData[\"f0\"], blackData[\"f1\"], 'kx')\n", + "plt.plot(yellowData[\"f0\"], yellowData[\"f1\"], \"yx\")\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def normalize(v):\n", + " norm = np.linalg.norm(v)\n", + " if norm == 0:\n", + " return v\n", + " return v / norm\n", + "\n", + "for i in data.index:\n", + " v = [data[\"f0\"][i],data[\"f1\"][i]]\n", + " v = normalize(v)\n", + " data.loc[i,\"f0\"], data.loc[i,\"f1\"] = v[0], v[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Filter data\n", + "greenData = data[isGreen]#.drop(['Class'], axis=1)\n", + "blueData = data[isBlue]#.drop(['Class'], axis=1)\n", + "blackData = data[isBlack]#.drop(['Class'], axis=1)\n", + "yellowData = data[isYellow]" + ] + }, + { + "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": [ + "plt.plot(greenData[\"f0\"], greenData[\"f1\"], 'gx')\n", + "plt.plot(blueData[\"f0\"], blueData[\"f1\"], 'bx')\n", + "plt.plot(blackData[\"f0\"], blackData[\"f1\"], 'kx')\n", + "plt.plot(yellowData[\"f0\"], yellowData[\"f1\"], \"yx\")\n", + "# plt.savefig(\"Clusters/cluster.png\", dpi=300)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# random_seed : int : Random number generator seed\n", + "random_seed = 1\n", + "rgen = np.random.RandomState(random_seed)\n", + "def _shuffle(self, X, y):\n", + " \"\"\"Shuffle training data\"\"\"\n", + " r = self.rgen.permutation(len(y))\n", + " return X[r], y[r]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "greenRandom = greenData.iloc[rgen.permutation(len(greenData.index))].copy()\n", + "blueRandom = blueData.iloc[rgen.permutation(len(blueData.index))].copy()\n", + "blackRandom = blackData.iloc[rgen.permutation(len(blackData.index))].copy()\n", + "yellowRandom = yellowData.iloc[rgen.permutation(len(yellowData.index))].copy()\n", + "\n", + "greenRandom.loc[:, \"f0\":\"f1\"] = greenRandom.loc[:,\"f0\":\"f1\"].apply(np.arcsin)\n", + "blueRandom.loc[:, \"f0\":\"f1\"] = blueRandom.loc[:,\"f0\":\"f1\"].apply(np.arcsin)\n", + "blackRandom.loc[:, \"f0\":\"f1\"] = blackRandom.loc[:,\"f0\":\"f1\"].apply(np.arcsin)\n", + "yellowRandom.loc[:, \"f0\":\"f1\"] = yellowRandom.loc[:,\"f0\":\"f1\"].apply(np.arcsin)\n", + "\n", + "greenTraining = greenRandom.iloc[:2]\n", + "blueTraining = blueRandom.iloc[:2]\n", + "blackTraining = blackRandom.iloc[:2]\n", + "yellowTraining = yellowRandom.iloc[:2]\n", + "\n", + "greenInput = greenRandom.iloc[2]\n", + "blueInput = blueRandom.iloc[2]\n", + "blackInput = blackRandom.iloc[2]\n", + "yellowInput = yellowRandom.iloc[2]\n", + "\n", + "trainingArray = pd.concat([greenTraining, blueTraining, blackTraining, yellowTraining])" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(trainingArray[\"f0\"], trainingArray[\"f1\"], \"x\")\n", + "plt.plot(greenInput[\"f0\"], greenInput[\"f1\"], \"gx\")\n", + "plt.plot(blueInput[\"f0\"], blueInput[\"f1\"], \"bx\")\n", + "plt.plot(blackInput[\"f0\"], blackInput[\"f1\"], \"kx\")\n", + "plt.plot(yellowInput[\"f0\"], yellowInput[\"f1\"], \"yx\")\n", + "# plt.savefig(\"Clusters/random.png\", dpi=300)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Building the quantum circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "import qiskit\n", + "from qiskit import IBMQ\n", + "from qiskit import (\n", + " QuantumCircuit,\n", + " QuantumRegister,\n", + " ClassicalRegister,\n", + " execute,\n", + " Aer)\n", + "from qiskit.visualization import plot_histogram" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def encodeVector2(circuit, data, i, controls, rotationQubit, ancillaQubits):\n", + " # |i> = |0>\n", + " circuit.x(i)\n", + " circuit.mcry(data[0], controls, rotationQubit, ancillaQubits)\n", + " circuit.x(i)\n", + " \n", + " # |i> = |1>\n", + " circuit.mcry(data[1], controls, rotationQubit, ancillaQubits)\n", + "\n", + "def encodeClass(circuit, vectorClass):\n", + " classSwitcher = {\n", + " \"Green\": 0,\n", + " \"Blue\": 1,\n", + " \"Black\": 2,\n", + " \"Yellow\": 3\n", + " }\n", + " \n", + " # |c> = |00>\n", + " if classSwitcher.get(vectorClass) == 0:\n", + " circuit.x(c)\n", + " # |c> = |01>\n", + " elif classSwitcher.get(vectorClass) == 1:\n", + " circuit.x(c[1])\n", + " # |c> = |10>\n", + " elif classSwitcher.get(vectorClass) == 2:\n", + " circuit.x(c[0])\n", + " # |c> = |11>\n", + " elif classSwitcher.get(vectorClass) == 3:\n", + " None\n", + "\n", + "def encodeIndexBitwise3(circuit,index):\n", + " \"\"\"\n", + " Encode the index of the training vectors with reason\n", + " \"\"\"\n", + " \n", + " zerosInIndex = index ^ 0b111\n", + " \n", + " if zerosInIndex & 0b001:\n", + " circuit.x(m[0])\n", + " if zerosInIndex & 0b010:\n", + " circuit.x(m[1])\n", + " if zerosInIndex & 0b100:\n", + " circuit.x(m[2])\n", + "\n", + "def encodeTraining(circuit, data, i, controls, rotationQubit, ancillaQubits, c, m):\n", + " # Header\n", + " encodeClass(circuit, c)\n", + " encodeIndexBitwise3(circuit, m)\n", + " \n", + " # Encoder\n", + " encodeVector2(circuit, data, i, controls, rotationQubit, ancillaQubits)\n", + " \n", + " # Footer\n", + " encodeClass(circuit, c)\n", + " encodeIndexBitwise3(circuit, m)\n", + "\n", + "def buildTrainingState(trainingArray):\n", + " \"\"\"\n", + " Given an array of up to 32 training vectors,\n", + " build the quantum superposition state. \n", + " \"\"\"\n", + " for index in range(len(trainingArray.index)):\n", + " trainingVector = trainingArray.iloc[index]\n", + " encodeTraining(circuit, trainingVector[\"f0\":\"f1\"], i, a[:]+i[:]+m[:]+c[:], r[0], q, trainingVector[\"class\"], index)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = QuantumRegister(1,'a') # knn ancilla\n", + "m = QuantumRegister(3,'m') # training vector index\n", + "i = QuantumRegister(1,'i') # feature index\n", + "r = QuantumRegister(1,'r') # rotation qubit\n", + "q = QuantumRegister(5,'q') # qram ancilla\n", + "c = QuantumRegister(2,'c') # class\n", + "b = ClassicalRegister(4, 'bit')\n", + "circuit = QuantumCircuit(a,m,i,r,q,c,b)\n", + "\n", + "circuit.h(a)\n", + "circuit.h(m)\n", + "circuit.h(i)\n", + "circuit.h(c)\n", + "\n", + "# >>> Encode the input vector >>>\n", + "\n", + "encodeVector2(circuit, greenInput, i, a[:]+i[:], r[0], q)\n", + "\n", + "circuit.x(a)\n", + "\n", + "# <<< Encode the input vector <<<\n", + "\n", + "# >>> Encode the training vectors >>>\n", + "\n", + "buildTrainingState(trainingArray)\n", + "\n", + "# <<< Encode the training vectors <<<\n", + "\n", + "circuit.measure(r,b[0])\n", + "\n", + "circuit.h(a)\n", + "\n", + "circuit.measure(a,b[1])\n", + "circuit.measure(c[0],b[2])\n", + "circuit.measure(c[1],b[3])" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Total counts are: {'0001': 117, '0101': 97, '1110': 3, '1000': 1906, '1100': 1818, '1111': 136, '0000': 1876, '0011': 56, '0111': 100, '1101': 58, '0110': 3, '1011': 93, '0010': 5, '1001': 72, '0100': 1852}\n" + ] + } + ], + "source": [ + "simulator = Aer.get_backend('qasm_simulator')\n", + "job = execute(circuit, simulator, shots=8192)\n", + "result = job.result()\n", + "counts = result.get_counts(circuit)\n", + "print(\"\\nTotal counts are:\",counts)\n", + "# plot_histogram(counts)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcQAAAFLCAYAAABIufwSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3de3hV5Zn+8e9DIMhZgilNhBACGiMgDVAOyknFVntwaMpP23GqtUVGaXUc2mKtjqDT0pYWB+vY2mo9MjillXpAGSlGoQqlLaQIchCMBCERkXMBCYnP74+1km5CCNmQrJ1k35/rysXe67Dz7Lwk915rve+7zN0RERFJdq0SXYCIiEhToEAUERFBgSgiIgIoEEVERAAFooiICKBAFBERAaB1ogtoLN26dfOsrKxElyEiIk3I3/72tw/cPb22dZEHoplNBr4DZABvAre6+x/rsd9I4FVgg7v3P9n2WVlZFBYWnma1IiLSkqSlpZWcaF2kp0zN7GrgPmAGkA8sAxaaWZ2HcmbWFXgCeLnRixQRkaQU9TXEKcBj7v6Qu69395uBMuCmk+z3a+BxYHljFygiIskpskA0s1RgMLCoxqpFwIV17DcZ6A58v/GqExGRZBflNcSzgBRgR43lO4Bxte1gZgOAacBwd680szq/gZlNAiYBZGRksGrVKgAyMzNp3749mzdvBqBLly7k5ORQVFQEQEpKCgMHDmTjxo0cPHgQgLy8PHbv3s2OHUG5PXr0IDU1leLiYgC6du1KVlYWq1evBqBNmzYMGDCA9evXc/jwYQDOP/98du7cyc6dOwHo1asXZsaWLVsA6NatGxkZGaxduxaAtm3b0q9fP958802OHDkCQP/+/SkrK2PXrl0AZGdn4+6UlASnwdPT00lPT2fdunUAtGvXjry8PNasWcPRo0cBGDhwIFu3bmXPnj0A5OTkUF5ezrZt2wDo3r07aWlprF+/HoAOHTqQm5vL6tWrqaysBCA/P5/i4mL27dsHQN++fTl06BClpaVU/bw7d+7Mxo0bAejUqRPnnHMORUVFuDtmRn5+Pps2beLAgQMA5Obmsn//fsrKytROaie1k9opknaqi0U1ubeZZQLbgTHuvjRm+V3ANe6eW2P7tkAR8EN3fzJcNh2YUJ9ONfn5+a5ONSIiEistLW2luw+pbV2UR4gfAJUEpz9jdQfeq2X7DCAPeNTMHg2XtQLMzCqAz7h7zdOvIiIipySya4juXg6sBC6rseoygt6mNW0HBgCfiPl6ENgcPq5tHxERkVMS9TjEe4EnzezPwOvAjUAmQdBhZk8AuPu17n4UWBu7s5m9Dxxx92OWi4iInK5IA9Hdf2Nm3YA7CU6JriU49Vk1UFJTy4iISEJE1qkmaupUIyIiNdXVqUaTe4uIiKBAFBERARSIIiIigAJRREQEUCCKiIgACkQRERFAgSgiIgIoEEVERAAFooiICKBAFBERARSIIiIigAJRREQEUCA2isWLFzN06FAGDx7M7Nmzj1v/6KOPctFFFzF69GiuuOIKNmzYcMz6bdu20bNnT+6///56v6aIiJweBWIDq6ysZOrUqcybN4/ly5fz9NNPHxd4X/ziF3n99ddZunQpt9xyC3feeecx6++44w4uvfTSuF5TREROjwKxga1cuZLevXuTnZ1NamoqBQUFLFy48JhtOnfuXP340KFDmFn18xdeeIFevXpx3nnnxfWaIiJyehSIDaysrIyzzz67+nlmZiZlZWXHbffwww8zaNAgpk2bxo9+9CMA/v73v3PfffcxderUU3pNERE5dQrEBJk4cSKrVq1i+vTpzJo1C4Af//jH3HTTTXTs2DHB1YmIJJ/WiS6gpcnIyGD79u3Vz0tLS8nIyDjh9gUFBXzrW98CglOjzz33HNOnT2ffvn20atWKM844g4EDB8b1miIiEj8FYgMbNGgQxcXFlJSUkJGRwfz58/nVr351zDZvv/02ffr0AWDRokXVj1988cXqbX70ox/RoUMHbrjhBioqKk76miIicnoUiA2sdevWzJw5kwkTJlBZWck111xDXl4eM2bMID8/nyuuuIKHHnqIJUuW0KZNG84880weeOCBU3pNERFpOObuia6hUeTn53thYWGiyxARkSYkLS1tpbsPqW2dOtWIiIigQBQREQEUiCIiIoACUUREBFAgioiIAApEERERQIEoIiICKBBFREQABaKIiAigQBQREQEUiCIiIoACUUREBNDdLk5q6uNdE11Cg5l53Z5ElyAi0mTpCFFERAQFooiICKBAFBERARSIIiIigAJRREQEUCCKiIgACkQRERFAgSgiIgIoEEVERAAFooiICKBAFBERARSIIiIigAJRREQEUCCKiIgACkQRERFAgSgi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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "goodCounts = {k: counts[k] for k in counts.keys() & {'0001','0101','1001','1101'}}\n", + "plot_histogram(goodCounts)" + ] + } + ], + "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.4" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}