{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "np.random.seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.rcParams['figure.figsize'] = [10, 3] #Did not work in the same box"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Task 2.1\n",
    "One step of sequential minimal optimization "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def f(x, y, beta, b, xij):\n",
    "    if isinstance(xij[0],np.ndarray)==False:\n",
    "        return np.sum(beta*y*np.dot(x,xij))+b\n",
    "    else:\n",
    "        return np.dot((x@xij.T).T,beta*y) + b            \n",
    "        #return np.array([f(x,y,beta,b,xij[i]) for i in range(len(xij))]) (Erst geändert, aber langsam)\n",
    "\n",
    "def step(i,j,x,y,beta,b,C):\n",
    "    delta = y[i]*((f(x,y,beta,b,x[j])-y[j])-(f(x,y,beta,b,x[i])-y[i])) \n",
    "    s = y[i]*y[j]\n",
    "    chi = np.dot(x[i],x[i]) + np.dot(x[j],x[j]) - 2*np.dot(x[i],x[j])\n",
    "    gamma = s*beta[i] + beta[j]\n",
    "    if s==1:\n",
    "        L = max(0,gamma-C)\n",
    "        H = min(gamma,C)\n",
    "    else:\n",
    "        L = max(0,-gamma)\n",
    "        H = min(C,C-gamma)\n",
    "    \n",
    "    if chi>0: \n",
    "        beta[i]= min(max(beta[i]+delta/chi,L),H)\n",
    "    elif delta>0:\n",
    "        beta[i] = L\n",
    "    else:\n",
    "        beta[i] = H\n",
    "    \n",
    "    beta[j] = gamma - s*beta[i]\n",
    "    b = b - 0.5*(f(x,y,beta,b,x[i])-y[i]+f(x,y,beta,b,x[j])-y[j])\n",
    "    \n",
    "    return beta, b   "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Task 2.2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.concatenate((np.random.exponential(1/4,(20,2)),np.random.exponential(2,(20,2))))\n",
    "y = np.concatenate((np.ones(20),-np.ones(20)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Task 2.3\n",
    "SMO which initializes beta=0, b=0. In each iteration i,j are picked randomly"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "b = 0\n",
    "beta = np.zeros(40)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "a)\n",
    "Computation of final estimate for b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def b_final(x, y, b, beta):\n",
    "    ind = np.nonzero(beta)\n",
    "    if len(ind[0]) > 0:\n",
    "        med = np.median(f(x,y,beta,b,x[ind]) - y[ind])\n",
    "        b = b - med\n",
    "    return b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "b) - d) SMO with 10000 iteration steps for C=0.01, C=1 and C=100. \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def lls(x, labels):\n",
    "    X = np.insert(x,0,1,axis=1)\n",
    "    return np.linalg.solve(X.T @ X, X.T @ labels)\n",
    "\n",
    "def plot_lls(x, labels, alpha):\n",
    "    x_min = np.min(x[:,0])\n",
    "    x_max = np.max(x[:,0])\n",
    "    y_min = np.min(x[:,1])\n",
    "    y_max = np.max(x[:,1])\n",
    "    X = np.linspace(x_min - 1, x_max + 1, 1000)\n",
    "    Y = np.linspace(y_min - 1, y_max + 1, 1000)\n",
    "    XX,YY = np.meshgrid(X,Y)\n",
    "    Z = (alpha[0] + alpha[1] * XX + alpha[2] * YY > 0) * 1\n",
    "\n",
    "    un = np.unique(labels)\n",
    "    x0 = x[np.where(labels == un[0])]\n",
    "    x1 = x[np.where(labels == un[1])]\n",
    "    \n",
    "    fig = plt.figure()\n",
    "    plt.scatter(x0[:, 0], x0[:, 1], c='b', marker='.', label='Class -1')\n",
    "    plt.scatter(x1[:, 0], x1[:, 1], c='r', marker='.', label='Class 1')\n",
    "    plt.contourf(XX, YY, Z, 1, colors=['b','r'], alpha=0.15)\n",
    "    plt.xlim(x_min - 1, x_max + 1)\n",
    "    plt.ylim(y_min - 1, y_max + 1)\n",
    "\n",
    "    plt.xlabel('x1')\n",
    "    plt.ylabel('x2')\n",
    "    plt.title('LLS')\n",
    "    plt.legend(loc='upper right')\n",
    "    \n",
    "    plt.show(fig)\n",
    "    plt.close(fig)\n",
    "\n",
    "def plot_svm(x, labels, beta, b, C, func):\n",
    "    x_min = np.min(x[:,0])\n",
    "    x_max = np.max(x[:,0])\n",
    "    y_min = np.min(x[:,1])\n",
    "    y_max = np.max(x[:,1])\n",
    "    X = np.linspace(x_min - 1, x_max + 1, 1000)\n",
    "    Y = np.linspace(y_min - 1, y_max + 1, 1000)\n",
    "    XX,YY = np.meshgrid(X,Y)\n",
    "    Z = np.concatenate((XX.flatten(),YY.flatten())).reshape(2,-1).T\n",
    "    fZ = func(x,y,beta,b,Z)\n",
    "    fZ = ((fZ>0)*1).reshape(1000,1000)\n",
    "    \n",
    "     # seperate training points into classes.\n",
    "    un = np.unique(labels)\n",
    "    x0 = x[np.where(labels == un[0])]\n",
    "    x1 = x[np.where(labels == un[1])]\n",
    "    supvec = x[np.where(beta > 0)]\n",
    "    margvec = x[np.where(np.logical_and((beta > 0), (beta < C)))]\n",
    "    \n",
    "    # Print statistics.\n",
    "    print('  Number of support vectors: {}'.format(supvec.shape[0]))\n",
    "    print('  Number of margin vectors: {}'.format(margvec.shape[0]))\n",
    "    \n",
    "    # Plot.\n",
    "    fig = plt.figure()\n",
    "    plt.scatter(supvec[:, 0], supvec[:, 1], c='black', alpha=0.8,\n",
    "                marker='x', label='support vectors')    \n",
    "    plt.scatter(margvec[:, 0], margvec[:, 1], c='grey', alpha=0.8,\n",
    "                marker='D', label='margin vectors')\n",
    "\n",
    "    \n",
    "    plt.scatter(x0[:, 0], x0[:, 1], c='b', alpha=1,\n",
    "                marker='.', label='Class -1')\n",
    "    plt.scatter(x1[:, 0], x1[:, 1], c='r', alpha=1,\n",
    "                marker='.', label='Class  1')\n",
    "    \n",
    "    plt.contourf(XX, YY, fZ, 1, colors=['b','r'], alpha=0.15)\n",
    "    plt.xlim(x_min - 1, x_max + 1)\n",
    "    plt.ylim(y_min - 1, y_max + 1)\n",
    "\n",
    "    plt.xlabel('x1')\n",
    "    plt.ylabel('x2')\n",
    "    plt.title('C = {}'.format(C))\n",
    "    plt.legend(loc='upper right')\n",
    "    \n",
    "    plt.show(fig)\n",
    "    plt.close(fig)\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def our_svc(n_obj,C,x,y):\n",
    "    rnd_ij = np.random.randint(0,n_obj,(10000,2))\n",
    "    b = 0\n",
    "    beta = np.zeros(n_obj)\n",
    "    for k in range(10000):\n",
    "        i,j = rnd_ij[k]\n",
    "        while i==j:\n",
    "            j = np.random.randint(0,n_obj)\n",
    "            \n",
    "        beta,b = step(i,j,x,y,beta,b,C)    \n",
    "    \n",
    "    b = b_final(x,y,b,beta)\n",
    "    return [beta, b]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "C = 0.01:\n",
      "  Number of support vectors: 36\n",
      "  Number of margin vectors: 2\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlsAAADgCAYAAAA0V6PuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xl8lOW5//HPlY1AAEEhKlAErSAYhZCQgEAAUVyICi6A4gKoWGs9FH+eupRDLXVpPZ66tfWoVXChGFH0KKh1ZRGEkJAEBTQuiAaQABKEIBIm9++PLCYQQiB58sxMvu/Xi1eYyTPzXDOD5pv7up/7NuccIiIiIuKNCL8LEBEREQlnClsiIiIiHlLYEhEREfGQwpaIiIiIhxS2RERERDyksCUiIiLiIYUtEREREQ8pbImIr8zsCjPLMrNdZrbJzN40s4ENfI5mZva0mf1gZt+Z2S2HOH5K+XE7yh/XrMr3/mRmH5vZPjO7qyHrFJHwpLAlIr4pDz0PAfcCxwKdgX8AFzXwqe4CTgZOAIYCvzOzcw9S0znA7cAwoAtwIvDHKod8AfwOmN/ANYpImDKtIC8ifjCzo4ANwATn3ByPz1VxnrfLb/8JONk5N7aGY/8FfO2cu7P89jBglnPuuP2Oex74wjl3l5e1i0jo08iWiPilPxALvFLXB5jZ7WZWdLA/B3lMW6ADkFfl7jzg1IOc5tQajj3WzI6pa50iIlUpbImIX44Btjrn9tX1Ac65Pzvn2hzsz0Ee1rL8644q9+0AWtVy/P7HUsvxIiK1UtgSEb9sA9qZWZTH59lV/rV1lftaAztrOX7/Y6nleBGRWilsiYhfPgL2ACPr+gAzu7P8qsUa/9T0GOfcdmAT0KvK3b2A1Qc5zeoajt3snNtW1zpFRKpS2BIRXzjndgDTgL+b2Ugza2Fm0WZ2npndf5DH3Ouca3mwP7Wc7llgqpm1NbNTgOuBmbUce62Z9Syf7zW16rHlNcZS9v/PKDOLNbPIw339ItJ06GpEEfGVmY0DpgA9KGvVZQP3OOeWNuA5mgGPAZcCPwJ/cc79tfx7nYE1QE/n3Dfl990C3AY0B14GfuWc+6n8ezOBa/Y7xQTn3MyGqldEwovCloiIiIiH1EYUERER8ZDCloiIiIiHFLZEREREPKSwJSIiIuIhhS0RERERD3m9cvNhadu2nevYsYvfZYiIiIgc0urV2Vudc+0PdVxQha2OHbswd26W32WIiIiIHFL37ra+LsepjSgiIiLiIYUtEREREQ8pbImIiIh4KKjmbImIiISb0tISSkoKcG6P36XIETKLJTq6ExER0Uf0eIUtERERD5WUFNCuXSvatOmCmfldjhwm5xzbt29j27YCmjXrekTPoTaiiIiIh5zbQ5s2xyhohSgzo23bY+o1MqmwJSIi4jEFrdBW389PYUtEREQaxaOPPsTu3bs9e/68vFzeeusNz57/SClsiYiIBBHnXK23Q1UgEOBvf/M2bK1adfhha9++fR5V8zOFLRERkSDx1FNP8PDDf60MWM45Hn74rzz11BNH/JzFxcWMGjWClJReJCUlMGdOBgDdu3dh69atAGRnZzF8+BAA7r77LiZOvIpzzz2ThISTefrpJwFYtGgBZ52VxujRo0hM7MnNN/+K0tJSADIyZpOcfBpJSQn8/ve3VZ67XbuWTJ8+jUGDUvnLX+5h06aNnHvuUM45Z2i1Gv/97zcZN2505e1FixZwySUXAPDuu28zeHB/+vfvwxVXXMauXbsAyMpawZAhZ5CS0ouBA1PYsWMH06dP4+WXM0hN7c2cORl8//33XHbZSPr2PZ20tH58/PGqytd4002TSE8fzrXXXs2aNasZODCF1NTe9O17Ol988fkRv9810dWIIiIiQcA5x86dO5kzZzYAkyffwsMP/5U5c2Zz2WWX45w7orlDb7/9Fscf34FXXpkPwI4dOw75mE8+WcXChcsoLi6mX79Ezj13BABZWZnk5Kyhc+cTuPDCc3n11bn063cGU6fextKl2bRt25b09OG89tqrXHjhSIqLi+nZM4Fp06YD8MwzT/PWWx/Qrl27aucbNuxsfvObGyguLiYuLo6XXsrg0kvHsHXrVv7857t54413iYuL44EH/sIjj/yVW2+9nauuGsNzz2WQnNyXH374gRYtWjBt2nSys7N46KG/ATBlys307p3InDmvsmDB+1x33dUsX54LQE5ONu+99yHNmzdnypSbuemmyVx++Tj27t1LIBA47Pe5NgpbISAnBzIzISUFEhP9rkZERLxgZkyefAsAc+bMrgxdl112OZMn33LEk7QTEk7jjjtu5fe/v43zzktn4MBBh3xMevpFNG/enObNmzN48FCysjJp06YNyckpdO16IgCjR1/O0qUfEh0dTVraENq3L9uPeezYcXz44SIuvHAkkZGRjBp1ySHPFxUVxfDh5zJ//utcfPGlvPnmfO65534WL17Ip5+u4cwzBwCwd+9eUlP7k5//GccddzzJyX0BaN26dY3P+9FHHzJ79ssADBlyJtu2basMmyNGXEjz5s0BSE3tz/3338OGDQWMHHkxv/zlyYes+XCojRjkcnLgmmvgoYfKvubk+F2RiIh4pWrgqlCfoAVw8sndWLo0m4SE05g27Q7uvbdslCkqKqqyDbhnT/VlDfY/X8Xtmu6vbU5ZbGwskZGRdarz0kvH8PLLL7JgwfskJfWlVatWOOc488yzWb48l+XLc8nJWcP//u9TdR7lq6m2ise1aBFXed/YsVfw0kuv0bx5cy644BwWLHi/TjXXlcJWkMvMhJISKC0t+5qZ6XdFIiLilYo5WlVVncN1JDZu3EiLFi24/PIr+e1vbyUnZyUAJ5zQhZycbABeffXlao+ZN+//2LNnD9u2bWPRogUkJZWNIGVlZfL11+soLS3lpZcyOOOMgfTtm8rixQvZunUrgUCAF1+czaBBg2uspVWrVuzatbPG76WlDSE3dyVPP/0kl146BoCUlH589NESvvzyCwB2797N55/n0737KWzatJGsrBUA7Ny5k3379tGyZfXnHzAgjRdemAWUzQNr165djaNg69Z9RdeuJ3LTTf/BiBEXVs7taigKW0EuJQWioyEiouxrSorfFYmIiBcqglbFHK0PP1zBZZddzpw5s+sVuFav/phBg8omf//lL/dw++1TAbjzzj9w662TGTZs0AGjT8nJKYwaNYLBg/txxx3/RYcOHYCydtvUqbeTlJRAly5dueiiURx//PFMn34f5547lJSUXvTu3YcLLrioxlomTpzERRedd8AEeYDIyEjOOy+dt99+k/PPTwegffv2PPnkTK6++nL69j2dwYP78dlnnxITE8Nzz2Vwyy03k5LSixEjzmbPnj0MHjyUtWvXVE6Qnzr1LlauzKJv39OZOvV2nnzymRrreumlDJKSEkhN7U1+/qeMG3f1Eb3XB2PBdElpQkKymzs3y+8ygo7mbImIhK49e9bSrVuPOh371FNPsHPnzsrWYUUAa9WqFddeO8njSsvcffddxMW1ZMqUW6vdv2jRAh566AHmzp3XKHUEm/z8tcTGVv8cu3e3bOdc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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "C = 1:\n",
      "  Number of support vectors: 13\n",
      "  Number of margin vectors: 3\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlsAAADgCAYAAAA0V6PuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xl41OW9/vH3J5NgIIBJZRFBBa0gGCEhIWENIIgLEQG1qKhsiseqh+Lxd9xpy3Fpe2y1tj2tuIBValMWOYpL1SoQQMlCAgrRoAIHBEFoghAaEybP749JQsIaknwzk+R+XVeuZGa+M89nMnrl5lnNOYeIiIiIeCMs2AWIiIiINGUKWyIiIiIeUtgSERER8ZDCloiIiIiHFLZEREREPKSwJSIiIuIhhS0RERERDylsiUijYGY3mlmWmR0ws51m9raZDa7nNn5kZqvN7KCZLavP1xaR5kthS0RCnpndAzwNPA50BM4B/ge4up6b+md5O7+o59cVkWbMtIO8iIQyMzsd+BqY4pxb0EBt3grc5Jwb1hDtiUjTpp4tEQl1A4BI4LWaPsHM7jezwuN9eVeqiMjRwoNdgIjISZwB7HHOHarpE5xzv0BDgSISItSzJSKhbi/Qzsz0j0MRaZQUtkQk1H0EFANja/oEM3uwfNXiMb+8K1VE5GgKWyIS0pxz+4BZwB/MbKyZtTKzCDO7wsx+dZznPO6ca328r+O1ZWY+M4skMMUizMwizSzCm3cmIs2FViOKSKNgZhOBmUBPYD+QDTzmnFtdj21MBuYecfdLzrnJ9dWGiDQ/ClsiIiIiHtIwooiIiIiHFLZEREREPKSwJSIiIuIhhS0RERERDylsiYiIiHgopHZkjolp5zp37hrsMkREREROasOG7D3OufYnuy6kwlbnzl1ZvDgr2GWIiIiInFSPHra1JtdpGFFERETEQwpbIiIiIh5S2BIRERHxUEjN2RIREWlqyspKKS3djnPFwS5FaskskoiILoSF1e5ceoUtERERD5WWbqdduzZER3fFzIJdjpwi5xwFBXvZu3c7p53WrVavoWFEERERDzlXTHT0GQpajZSZERNzRp16JhW2REREPKag1bjV9fNT2BIREZEG8bvfPc3Bgwc9e/1163J55523PHv92lLYEhERCSHOuRPebqz8fj+//723YWv9+lMPW4cOHfKomsMUtkRERELECy/M4be//U1lwHLO8dvf/oYXXphT69csKipi3LjRJCX1ISEhlgUL0gDo0aMre/bsASA7O4tRo4YB8OijP2Pq1Ju5/PJLiI29gBdffA6AFSuWMXJkCj/60Tji43tx993/RllZGQBpaa+SmHgxCQmxPPTQfZVtt2vXmtmzZzFkSDK//OVj7Ny5g8svH85llw2vVuPf//42Eyf+qPL2ihXLuOaaqwB4//13GTp0AAMG9OXGG6/jwIEDAGRlZTJs2ECSkvoweHAS+/btY/bsWSxalEZychwLFqTxz3/+k+uuG0u/fr1JSenPJ5+sr3yPd945ndTUUUybdgsbN25g8OAkkpPj6NevN198sanWv+9j0WpEERGREOCcY//+/SxY8CoAM2bcw29/+xsWLHiV6667AedcreYOvfvuO3TqdBavvfYmAPv27Tvpcz79dD3Ll39MUVER/fvHc/nlowHIysogJ2cj55xzLmPGXM6SJYvp338gDz98H6tXZxMTE0Nq6ihef30JY8aMpaioiF69Ypk1azYAL730Iu+88yHt2rWr1t6IEZdy1123U1RURFRUFAsXpnHttRPYs2cPv/jFo7z11vtERUXx5JO/5JlnfsO9997PzTdP4OWX00hM7Md3331Hq1atmDVrNtnZWTz99O8BmDnzbuLi4lmwYAnLln3Arbfewpo1uQDk5GTzj3+spGXLlsyceTd33jmDG26YSElJCX6//5R/zyeisNUI5ORARgYkJUF8fLCrERERL5gZM2bcA8CCBa9Whq7rrruBGTPuqfUk7djYi3nggXt56KH7uOKKVAYPHnLS56SmXk3Lli1p2bIlQ4cOJysrg+joaBITk+jW7TwAfvSjG1i9eiURERGkpAyjffvAeczXXz+RlStXMGbMWHw+H+PGXXPS9sLDwxk16nLefPMNxo+/lrfffpPHHvsV6enL+eyzjVxyySAASkpKSE4eQH7+55x5ZicSE/sB0LZt22O+7kcfreTVVxcBMGzYJezdu7cybI4ePYaWLVsCkJw8gF/96jG+/no7Y8eO54c/vOCkNZ8KDSOGuJwcmDQJnn468D0nJ9gViYiIV6oGrgp1CVoAF1zQndWrs4mNvZhZsx7g8ccDvUzh4eGVw4DFxdW3NTiyvYrbx7r/RHPKIiMj8fl8Narz2msnsGjR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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "C = 100:\n",
      "  Number of support vectors: 9\n",
      "  Number of margin vectors: 5\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlsAAADgCAYAAAA0V6PuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3XtclWW6//HPxQLDE8nkodRKa9IkUhAETUVLs1IztRrtYJmW7aYax3a/3XGscTc1h2Y6zezZ2cGO0ziWuZ1qOo2peEgOgpZRWJmjaZYOomIELO7fHwsQFBWBZ60FfN+vFy9gPWut51oLiy/3fT33bc45RERERMQbEaEuQERERKQ5U9gSERER8ZDCloiIiIiHFLZEREREPKSwJSIiIuIhhS0RERERDylsiYiIiHhIYUtEwoKZXWlmWWa2z8y2m9k/zGxII5/jJ2a2ysz2m9nSWo4nmFl2xfFsM0uodszM7Ddmtqvi47dmZo1Zn4g0TwpbIhJyZnYb8CjwINAFOAX4H+CSRj7VvyvO8+taamgF/B/wEhALPA/8X8XtADOA8UA/oC8wFrixkesTkWbItIK8iISSmR0PfA1c55xbEKRzXg9c7ZwbXu22UcA8oLur+B+jmf0LmOGce9vMVgHPOefmVhybDtzgnBsYjJpFpOnSyJaIhNogIBp4va4PMLM7zWz34T7qWcdZwHpX8y/Q9RW3Vx5fV+3YumrHREQOKzLUBYhIi3cCsNM5V1bXBzjnfk0tU4EN1A4oPOi2QqD9YY4XAu3MzJymCETkCDSyJSKhtgvoaGah/uNvHxBz0G0xwN7DHI8B9iloicjRKGyJSKitBooJNJ/XiZndXXHVYq0f9axjA9D3oCsM+1bcXnm8X7Vj/aodExE5LIUtEQkp51whMBv4k5mNN7M2ZhZlZheZ2W8P85gHnXPtDvdxuHOZmc/Mogm0UESYWbSZRVUcXgr4gZ+Z2XFmdkvF7UsqPr8A3GZm3cysK/CfwHMNff0i0vzpakQRCQtmdhUwC+hDYOouG/iVc25VI55jKoErDqt73jk3teJ4IvA0EAfkAdOdczkVxwz4DXB9xeOeBu7QNKKIHI3CloiIiIiHNI0oIiIi4iGFLREREREPKWyJiIiIeEhhS0RERMRDClsiIiIiHgr1is01xMZ2dN269Qh1GSIiIiJHtWFD9k7nXKej3S+swla3bj1YuDAr1GWIiIiIHFXv3ra5LvfTNKKIiIiIhxS2RERERDyksCUiIiLiobDq2RIREWluystLKS3dinPFoS5F6sksmqio7kRERB39zrVQ2BIREfFQaelWOnZsT4cOPQjsZy5NiXOOgoJd7Nq1leOO61mv59A0ooiIiIecK6ZDhxMUtJooMyM29oQGjUwqbImIiHhMQatpa+jPT2FLREREguKJJx5l//79nj3/unW5vP32W549f30pbImIiIQR59wRv2+q/H4/f/yjt2Fr/fpjD1tlZWUeVXOAwpaIiEiYeOaZuTz22B+qApZzjsce+wPPPDO33s9ZVFTEhAljSEnpR1JSPAsWzAegd+8e7Ny5E4Ds7CxGjRoOwAMP3M+0aVO48MLziI8/g2effQqA5cuXMnJkGj/5yQQSE+O49db/oLy8HID5818hOflskpLiueeeO6rO3bFjO+bMmc3Qoan85je/Yvv2bVx44blccMG5NWp8551/cNVVP6n6fvnypVx66cUAvP/+uwwbNohBg/pz5ZWXs2/fPgCysjIZPvwcUlL6MWRICoWFhcyZM5vXXptPamoCCxbM59///jeXXz6eAQP6kpY2kI8+Wl/1Gm++eQZjx45i+vRr+OSTDQwZkkJqagIDBvTl88831vv9ro2uRhQREQkDzjn27t3LggWvADBz5m089tgfWLDgFS6//Aqcc/XqHXr33bc56aSuvP76mwAUFhYe9TEff7yeZcs+pKioiIEDE7nwwjEAZGVlkJPzCaeccirjxl3IokULGTjwHO699w5WrcomNjaWsWNHsXjxIsaNG09RURFxcfHMnj0HgOeff5a33/6Ajh071jjfiBHnc8stN1JUVETbtm159dX5XHbZJHbu3Mmvf/0Ab731Pm3btuXhh3/D44//gdtvv5MpUybx4ovzSU4ewJ49e2jTpg2zZ88hOzuLRx/9IwCzZt1KQkIiCxYsYunSJVx//TWsWZMLQE5ONv/85wpat27NrFm3cvPNM7niiqsoKSnB7/cf8/t8JApbTUBODmRkQEoKJCaGuhoREfGCmTFz5m0ALFjwSlXouvzyK5g587Z6N2nHx5/NXXfdzj333MFFF41lyJChR33M2LGX0Lp1a1q3bs2wYeeSlZVBhw4dSE5OoWfP0wD4yU+uYNWqFURFRZGW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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlsAAADgCAYAAAA0V6PuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAGvdJREFUeJzt3XuQnXWd5/H3tzsdI0EqmQGUJNxnyBDCkCZNhyyQyUAQxBusq8CUTBAEBhdH2d3xWooy3qZ0BbWsqSAygwKKQqRcoWRYRzQg0HTSCRLQBAmRcBPYBBWEbrq/+8fphiR0kkO6n/Ocy/tV1XX6nH7O+X2fdLrO5/xuT2QmkiRJKkZb2QVIkiQ1M8OWJElSgQxbkiRJBTJsSZIkFciwJUmSVCDDliRJUoEMW5IkSQUybElqWBHxUEQs2uqxhRGxYRvHz4iI6yPiqYh4JiJ+GRFn1qRYSS1rQtkFSFINfRtYBewLvAAcCryh1IokNT3DlqRWcgRwYWY+O3y/r8xiJLUGhxEltZI7ga9HxGkRsU/ZxUhqDYYtSa3kncAy4BPAuohYGRFHlFyTpCZn2JLUMjJzY2Z+JDMPAV4PrARuiIgouTRJTcywJaklZeZTwJeAacCflVyOpCZm2JLU6DoiYtLIF8MLfzZ/bPgrIuJfImJ2REyIiNcB5wMPZObTpZ6BpKbmakRJje6mre7fDkwH/rTV438J7AL8ANhr+Od3AW8rukBJrS0ys+waJEmSmpbDiJIkSQUybEmSJBXIsCVJklQgw5YkSVKBDFuSJEkFqqutH6ZO3T2nT9+v7DIkSZJ2aPXq5U9l5h47Oq6uwtb06fuxdGlv2WVIkiTt0MyZsb6a4xxGlCRJKpBhS5IkqUCGLUmSpALV1ZwtSZJUG0NDAwwMbCDz+bJLqXsRk+jomEFbW8dOPd+wJUlSCxoY2MDuu7+OKVP2IyLKLqduZSYbNz7N009v4DWv2X+nXsNhREmSWlDm80yZ8ucGrR2ICKZO/fMx9QAatiRJalEGreqM9d/JsCVJkkrx+OOPc8YZpzFr1oF0ds7i5JNPYu3aNaxf/xBz586uSQ0XXfRx/uIv9mb33XctrA3DliRJqrnM5NRTT2HBgoXcd99v6Ou7j09/+nM88cQTNa3jpJPeyrJlPYW2YdiSJEk197Of/ZSOjg7OOecfXnrssMPmcPTRx2xx3Pr1D3Hccccwf/7hzJ9/OHfc8QsAHnvsMRYtWsC8eXOYO3c2t922jMHBQc4550zmzp1NV9ehfPWrl+ywjnnzjmSvvfYa35PbiqsRJUlSVe68E5Ytg2OOgSOPHNtrrV59L52dc3d43B577MmNN97CpEmTeOCBtSxefDq3397Ltddew/HHn8CHP/xxBgcHee6551i1aiWPPvoIy5ffC8CmTZvGVuQ4MWw1gL4+6OmB7m7o7Cy7GklSK7rzTjjpJOjvh4kT4aabxh64qjEwMMCFF17APfespL29nbVr1wDQ1XUE5513FgMDA7z1rSdz2GFz2H//A1i37kEuvPD9vOlNb2bRojcWX2AVHEasc319sHgxXHpp5bavr+yKJEmtaNmyStAaHKzcLls2ttebNesQ+vqW7/C4r33tEvbc8/X09Kzi9tt76e/vB+Dooxdwyy0/Z9q06Zx99hlcffW3mDp1Kj09q1iwYCFLlnyd889/7xavNTg4yLx5c5g3bw4XX/zJsZ3Aq2DPVp3r6YGBARgaqtz29Ni7JUmqvWOOqfRojfRsHXPMjp+zPQsXHssnP/kxrrjiG5x11jkA9PbezZ/+9Bz77LPvS8c988wzTJ8+g7a2Nq666koGBwcBWL9+PdOnT+ess87h2Wefpa9vBSeccBITJ07klFPewQEHHMi55565RZvt7e3cddfKsRW+E+zZqnPd3dDRAW1tldvu7rIrkiS1oiOPrAwdXnTR+AwhRgTXXvsDfvKTW5g160AOP/wQPvvZT7HXXtO2OO68897H1VdfyYIFR7J27RomT54MwLJltzJv3hyOPLKTG264ngsu+ACPPvoIJ5ywkHnz5nDuuWdy8cWf32EdH/vYhzjwwBk899xzHHjgDD7zmU+N7cRGO9fMHPcX3VmzZ3fl0qW9ZZdRd5yzJUkab88/fz8HHXRw2WU0jDVr7mfSpC3/vWbOjOWZ2bWj5zqM2AA6Ow1ZkiQ1KocRJUmSCmTYkiRJKpBhS5IkqUCFhq2IuDAiVkfEvRHxnYiYVGR7kiRJ9aawsBUR04F/BLoyczbQDpxWVHuSJEn1qOhhxAnAayNiArAL8GjB7UmSpAbx+OOPc8YZpzFr1oF0ds7i5JNPYu3aNaxf/xBz584upM3bbvs58+cfzq67TmDp0usKaWNrhYWtzHwE+BLwW+Ax4JnM/I+tj4uIcyOiNyJ6N258sqhyJElSHclMTj31FBYsWMh99/2Gvr77+PSnP8cTTzxRaLt7770Pl13275x66t8V2s7mihxGnAq8HdgfmAZMjoh3b31cZl6WmV2Z2TV16h5FlSNJkurIz372Uzo6OjjnnH946bHDDpvD0UdveR2g9esf4rjjjmH+/MOZP/9w7rjjFwA89thjLFq0gHnz5jB37mxuu20Zg4ODnHPOmcydO5uurkP56lcveUW7++67H4ce+te0tdVujWCRm5ouAtZl5pMAEbEU+C/AVQW2KUmSChJ33kHbslsZOmYheeT8Mb3W6tX30tk5d4fH7bHHntx44y1MmjSJBx5Yy+LFp3P77b1ce+01HH/8CXz4wx9ncHCQ5557jlWrVvLoo4+wfPm9AGzatGlMNY6XIsPWb4EjI2IX4E/AcYDX4pEkqQHFnXcw8aTjXroSdf9NPxlz4KrGwMAAF154Affcs5L29nbWrl0DQFfXEZx33lkMDAzw1reezGGHzWH//Q9g3boHufDC9/OmN72ZRYveWHh91ShyztZdwHXACuCXw21dVlR7kiSpOG3LboX+fmJwEPr7K/fHYNasQ+jrW77D4772tUvYc8/X09Ozittv76W/vx+Ao49ewC23/Jxp06Zz9tlncPXV32Lq1Kn09KxiwYKFLFnydc4//71jqnG8FDpgmZkXZeZfZebszDwjM18osj1JklSMoWMWwsSJZHs7TJxYuT8GCxceywsvvMAVV3zjpcd6e+9m2bKfbXHcM888wxvesBdtbW1cc823GRwcBGD9+vXsueeenHXWOSxefDZ9fSt46qmnGBoa4pRT3sEnP/nPrFy5Ykw1jhcvRC1JknYoj5xP/00/Gbc5WxHBtdf+gH/6pw/ypS99gUmTJrHvvvvxxS9eusVx5533Pk4//R0sXfp9/uZv/pbJkycDsGzZrVxyyRfp6Ohg8uRd+eY3v8Wjjz7Ceee9h6GhIQAuvvjzr2i3t/duTj31FDZt2shNN/0fPvOZi1ixYvWYzmWH55qZhTbwasye3ZVLlzqtS5Kkoj3//P0cdNDBZZfRMNasuZ9Jk7b895o5M5ZnZteOnuu1ESVJkgpk2JIkSSqQYUuSJKlAhi1JklpUPc3brmdj/XcybEmS1IIiJrFx49MGrh3ITDZufJqISTv9Gm79IElSC+romMHTT2/gqaeeLLuUuhcxiY6OGTv9fMOWJEktqK2tg9e8Zv+yy2gJDiNKkiQVyLAlSZJUIMOWJElSgQxbkiRJBTJsSZIkFciwJUmSVCDDliRJUoEMW5IkSQUybEmSJBXIsCVJklQgw5YkSVKBDFuSJEkFKjRsRcSUiLguIn4VEfdHxPwi25MkSao3Ewp+/a8AP87M/xYRE4FdCm5PkiSprhQWtiJiN2ABcCZAZvYD/UW1J0mSVI+KHEY8AHgS+LeI6IuIyyNicoHtSZIk1Z0iw9YE4HDgXzOzE3gW+MjWB0XEuRHRGxG9Gzc+WWA5kiRJtVdk2NoAbMjMu4bvX0clfG0hMy/LzK7M7Jo6dY8Cy5EkSaq9wsJWZj4OPBwRM4cfOg64r6j2JEmS6lHRqxHfD1w9vBLxQeA9BbcnSZJUVwoNW5m5Eugqsg1JkqR65g7ykiRJBTJsSZIkFciwJUmSVCDDliRJUoEMW5IkSQUybEmSJBXIsCVJklQgw5Y0Rn19sGRJ5VaSpK0VvYO81NT6+mDxYhgYgI4OuPJK6OwsuypJUj2xZ0sag56eStAaGqrc9vSUXZEkqd4YtqQx6O6u9Gi1tVVuu7vLrkiSVG8cRqwzfX2V3pHuboejGkFnZ2Xo0N+ZJGlbDFt1xPk/jamz09+TJGnbHEasI87/kSSp+Ri26ojzfyRJaj4OI9YR5/9IktR8DFt1xvk/klQMFyCpLNsNWxGxG7BHZv5mq8f/OjPvKbQySZLGiQuQVKZtztmKiHcBvwKuj4jVEXHEZj/+96ILkyRpvLgASWXa3gT5jwFzM3MO8B7g2xHxX4d/FoVXJknSOHEBksq0vWHE9sx8DCAzeyLib4EfRcQMIGtSnSRJ48AFSCrT9sLWHyLiwJH5Wpn5WEQsBG4ADqlFcZIkjRcXIKks2xtGPB9oi4hZIw9k5h+AE4H3VttARLRHRF9E/Gjny5QkSWpM2wxbmbkqM9cC34uID0fFa4EvA+97FW18ALh/jHVKkiQ1pGp2kJ8H7A38ArgbeBQ4qpoXH57f9Wbg8p0tUJIkqZFVE7YGgD8BrwUmAesyc6jK178U+BCwzeMj4tyI6I2I3o0bn6zyZSVJkhpDNWHrbiph6wjgaOD0iLhuR0+KiLcAv8vM5ds7LjMvy8yuzOyaOnWPamqWJElqGNVcrufszOwd/v5x4O0RcUYVzzsKeFtEnESlR2y3iLgqM9+9k7VKkiQ1nB32bG0WtDZ/7NtVPO+jmTkjM/cDTgP+06AlSZJaTTXDiJIkSdpJ1Qwjjllm3grcWou2JEmS6ok9W5IkSQUybEmSJBXIsFWyvj5YsqRyK0mSmk9N5mxpdH19sHgxDAxAR0flivReJFWSpOZiz1aJenoqQWtoqHLb07Pzr2UPmSRJ9cmerRJ1d1d6tEZ6trq7d+517CGTJKl+GbZK1NlZCUY9PZWgtbMBabQeMsOWJEn1wbBVss7OsQej8eohkyRJ48+w1QTGq4dMkqRXo6/P955q1FXYiv7n6Vi3BoCB/Q8quZrGMh49ZJIkVcv5wtWrq9WIr5kI++9f+b5j3ZotviRJUv0YzxX1za6uerZGjASuza0bJXDZ+yVJUjmcL1y9ugxbo9k6gK1bxyt6vAxfkiTVhvOFq9cwYWtrhi9JksrlfOHqNGzY2ppDj9IruVJIksrXNGFrNPZ+qZW5UkiS6kNTh62t2fulVuKVBSSpPrRU2BqNvV9qVq4UkqT60PJha2vV9H4ZvtQIXCkkSfXBsFWFV/Z+OfSoxuBKIUkqn2FrJ1Qz9AiNG8BcwSZJ0vgxbI2D0YceG3PulyvYJEkaX4WFrYjYG/gW8AZgCLgsM79SVHv1plEn3ruCTZKk8VVkz9aLwP/MzBUR8TpgeUTckpn3Fdhm3WqUoUdXsEmSNL4KC1uZ+Rjw2PD3f4iI+4HpQEuGra3V69CjK9gkSRpfNZmzFRH7AZ3AXaP87FzgXIB9pk2rRTl1q156v1zBJknS+Ck8bEXErsD1wAcz8/db/zwzLwMuA+iaPTuLrqeR1GvvlyRJql6hYSsiOqgEraszc2mRbbUKN12VJKmxFLkaMYBvAvdn5peLakduuipJUj0rsmfrKOAM4JcRsXL4sY9l5k0Ftikad9sJSZKaUZGrEW8DoqjXV/WqGXqE0QOYu8lLkjQ27iDfoqrp/erZdNA2d5M3hEmSVB3DloDRe7+++4U17NcPQwlt/dDTcxCdnV7SR5KkV6Ot7AI0Nn19sGRJ5Xa8nXgCTJwI7W2V22NnrKFj3RoevHkN+/Wv4cChNS9d0keSJI3Onq0GVnQP07Z2kz/xBPjONdDfDwe3r+HYGdCxrvIzJ95LkrQlw1YDG7lo9OAQUNBFo0fbTX57l/Rx2wlJkrZk2GpgIxeNpoSLRm/rkj5uOyFJ0pYMWw2sES4a7Y73kqRWZ9hqcI140Wh3vJcktRLDlkpXzdAjGMAkSY3JsFU2dwd9hdGHHp37pbHxT01SWQxbZXJ30Ko58V5j4Z+apDIZtsrU01PZrCqzcju8d8PIJ/CFU/qYucmP4qMZy/Ue1XpGtkkZGuKljXj9k5JUK4atMk2ZUglaULmdMuWlT+CH9Pfx97mYjAFioh/Fq2Hvl7ZlZJuUgRK2SZEkw1aZNm2CiErQioBNm176BN6VPXQwQGTzfRSv1dwZJ95rRCNskyKpeRm2ytTdXbno4GYft7upfNvb381AdtAeA0QTfRQvc+6ME+9bWyNukyKpORi2ytTZCR//ONx8M5xwAnR20snIJ/BOfjvlyqabs1WLSwy9Gs79kiQVzbBVpr4++OxnK+mjtxcOOqgSuF76BN45/PXy4XU/DLKDIsu8xND2bK9se792TkP8f5WkGjBslanaJVJ9fTxyQw//+/pulg921u/S9SrGCOtx7syOynbi/avnVguS9DLDVpmqWSI1/K611wsDfIMOFnMlvxzo5KEb+uisp8QCVYfHeps782qHNh163DG3WpCklxm2ylRNN8/wu1YbQ0xggCPpYWI7vO36xTA4SrdBmWM3W4XHX0/p5tYl9ZUHRzMeQ5v2fm3JrRYk6WWRI/s81YGu2bOzd+nSsssoz0hQmjKlsi3EyDvU8HjMYHsHP3zHlXTTw/TvXVrpNmhrg3e9C6ZNqzxvZA5YWWM3w+fw6yndvPOznQ0zjFSLjLpu3Ssfa+YAdu21L6/9OPXUsquRpPE3c2Ysz8yuHR1XaM9WRJwIfAVoBy7PzC8U2V5DG5nkMrKjPFRSyic+AaecAkD7ySdzSmcn9AE/GO42aG+H66+HwcFK8BocrDy/rLGb4THCW5fU16rDHanF0GYr9X5tY+2HJLWkwsJWRLQDXweOBzYAd0fEDzPzvqLabGg33AAvvLDlYwMD8KlPVb7v6ICTT375Z4ceCg8/DHvvDStWVHq5MiuBK3P0sZsaDjHW66rDetLM4cs5W5L0siJ7trqBBzLzQYCI+C7wdsCwtbW+Pvj+90f/2dBQ5XbkHQvg3e+GF1+sfP/EEzBh+NfY0VHZt2tkCHLzd7caLw+rx1WH9a6ZJt47Z0uSXlZk2JoOPLzZ/Q3AvALba1w9PZXhv9G0tVVuR96xenpeDlojDj4Yjj9++6mmhK6Gelt12IgatffLsC1JLysybMUoj71iNn5EnAucC7DPtGkFllPHNu8G2NzInK2te6omTNgycL3znTuegWxXQ1OopverXsKXYVuSKgpbjRgR84FPZeYJw/c/CpCZn9/Wc1p6NWJfX2XeFsCsWaMPBW5+7OWXV4YQqwlamz/Proam12qrHiWpLNWuRiwybE0A1gDHAY8AdwN/l5mrt/Wclg5bUkFGC19gAJOksSp964fMfDEiLgBuprL1wxXbC1qSijH60GNjzP2SpGZQ6D5bmXkTcFORbUh69aqZeA8GMEkaD16uR5K9X5JUIMOWpFE16rYTklRvDFuSquLQoyTtHMOWpJ3i0KMkVcewJWncNNMlhyRpvBi2JBXKuV+SWp1hS1JNNdIlhyRpPBi2JJXulb1fDj1Kah6GLUl1x6FHSc3EsCWp7jn0KKmR1U3Yiohzgadi5sz1ZddSY7sDT5VdREla9dw979biebcWz7u17FvNQZGZRRdSlYjorebK2c2mVc8bWvfcPe/W4nm3Fs9bo2kruwBJkqRmZtiSJEkqUD2FrcvKLqAkrXre0Lrn7nm3Fs+7tXjeeoW6mbMlSZLUjOqpZ0uSJKnp1FXYioh3RsTqiBiKiKZf1RARJ0bEryPigYj4SNn11EJEXBERv4uIe8uupZYiYu+I+GlE3D/8f/wDZddUCxExKSJ6ImLV8Hl/uuyaaiki2iOiLyJ+VHYttRQRD0XELyNiZUT0ll1PrUTElIi4LiJ+Nfy3Pr/smooWETOHf88jX7+PiA+WXVe9qathxIg4GBgClgD/KzOb9o80ItqBNcDxwAbgbuD0zLyv1MIKFhELgD8C38rM2WXXUysRsRewV2auiIjXAcuBk1vg9x3A5Mz8Y0R0ALcBH8jMO0surSYi4n8AXcBumfmWsuuplYh4COjKzJbadykirgSWZeblETER2CUzN5VdV60Mv689AszLzFbbM3O76qpnKzPvz8xfl11HjXQDD2Tmg5nZD3wXeHvJNRUuM38O/L+y66i1zHwsM1cMf/8H4H5gerlVFS8r/jh8t2P4q34+4RUoImYAbwYuL7sWFS8idgMWAN8EyMz+Vgpaw44DfmPQeqW6ClstZjrw8Gb3N9ACb76CiNgP6ATuKreS2hgeSlsJ/A64JTNb4ryBS4EPUemtbzUJ/EdELB++OkgrOAB4Evi34aHjyyNictlF1dhpwHfKLqIe1TxsRcT/jYh7R/lq+l6drcQoj7XEJ/5WFhG7AtcDH8zM35ddTy1k5mBmzgFmAN0R0fTDxxHxFuB3mbm87FpKclRmHg68Cfjvw9MHmt0E4HDgXzOzE3gWaIm5uADDw6ZvA75fdi31qObXRszMRbVus05tAPbe7P4M4NGSalENDM9Zuh64OjOXll1PrWXmpoi4FTgRaPYFEkcBb4uIk4BJwG4RcVVmvrvkumoiMx8dvv1dRPyAyrSJn5dbVeE2ABs267m9jhYKW1SC9YrMfKLsQuqRw4jluRv4y4jYf/gTwWnAD0uuSQUZnij+TeD+zPxy2fXUSkTsERFThr9/LbAI+FW5VRUvMz+amTMycz8qf9v/2SpBKyImDy8CYXgY7Y00f7gmMx8HHo6ImcMPHQc09QKYrZyOQ4jbVFdhKyJOiYgNwHzgxoi4ueyaipKZLwIXADdTmSz9vcxcXW5VxYuI7wB3ADMjYkNEnF12TTVyFHAGcOxmS6RPKruoGtgL+GlE3EPlA8YtmdlS2yC0oNcDt0XEKqAHuDEzf1xyTbXyfuDq4f/vc4DPlVxPTUTELlRW1rdcj3216mrrB0mSpGZTVz1bkiRJzcawJUmSVCDDliRJUoEMW5IkSQUybEmSJBXIsCWp6UXEjyNiU0S47YSkmjNsSWoFX6Syz5kk1ZxhS1LTiIgjIuKeiJg0vJP56oiYnZk/Af5Qdn2SWlPNr40oSUXJzLsj4ofAZ4DXAldlZtNfKkZSfTNsSWo2F1O5NNDzwD+WXIskOYwoqen8GbAr8DpgUsm1SJJhS1LTuQz4BHA18C8l1yJJDiNKah4R8ffAi5l5TUS0A7+IiGOBTwN/BewaERuAszPz5jJrldQ6IjPLrkGSJKlpOYwoSZJUIMOWJElSgQxbkiRJBTJsSZIkFciwJUmSVCDDliRJUoEMW5IkSQUybEmSJBXo/wM2mL/TF6sRawAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "Ci = [0.01,1,100]\n",
    "svm_Ci = []\n",
    "\n",
    "rnd_ij = np.random.randint(0,40,(10000,2))\n",
    "\n",
    "for C in Ci:\n",
    "    \n",
    "    beta, b = our_svc(40,C,x,y)\n",
    "\n",
    "    svm_Ci.append((beta,b))\n",
    "    \n",
    "    #Plot of the results\n",
    "    print('C = {}:'.format(C))\n",
    "    plot_svm(x,y,beta,b,C,f)\n",
    "\n",
    "alpha = lls(x,y)\n",
    "plot_lls(x,y,alpha)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Task 2.4\n",
    "Percentage of correctly classified data points for LLS and SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def accuracy(pred, y_test):\n",
    "    C = np.zeros((2,2))\n",
    "    _ , number = np.unique(y_test, return_counts=True)\n",
    "    for i in range(2):\n",
    "        C[i,1] = np.count_nonzero(pred[np.where(y_test == i)])\n",
    "        C[i,0] = number[i] - C[i,1]\n",
    "    \n",
    "    accuracy = np.trace(C) / pred.size\n",
    "    return accuracy\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SVM:\n",
      "  Accuaracy for C = 0.01: 64.5%\n",
      "  Accuaracy for C = 1: 90.55%\n",
      "  Accuaracy for C = 100: 89.45%\n",
      "LLS:  accuracy: 84.7%\n"
     ]
    }
   ],
   "source": [
    "x_test = np.concatenate((np.random.exponential(1/4,(1000,2)),np.random.exponential(2,(1000,2))))\n",
    "y_test = np.concatenate((np.ones(1000),np.zeros(1000)))\n",
    "\n",
    "print('SVM:')\n",
    "for k in range(len(svm_Ci)):\n",
    "    beta,b = svm_Ci[k]\n",
    "    pred = f(x,y,beta,b,x_test)\n",
    "    pred = ((pred > 0) * 1)\n",
    "    acc = accuracy(pred,y_test)\n",
    "    print('  Accuaracy for C = {}: {}%'.format(Ci[k],acc*100))\n",
    "\n",
    "\n",
    "#LLS\n",
    "pred = (x_test @ alpha[1:]) > (-alpha[0])\n",
    "acc = accuracy(pred,y_test)\n",
    "print('LLS:  accuracy: {}%'.format(acc*100))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Task 2.5"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "KKT"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def our_svc2(n_obj,C,x,y):\n",
    "    maxit = 10000\n",
    "    b = 0\n",
    "    beta = np.zeros(n_obj)\n",
    "    k = 0\n",
    "    i=0    #DAS HAST DU VERGESSEN ZU DEFINIEREN AM ANFANG; WEISS NICHT OB 0 RICHTIG IST und ob das mit in die schleife muss\n",
    " \n",
    "    while k < maxit: \n",
    "        yf = y * f(x,y,beta,b,x) - 1\n",
    "        kkt = (C-beta)*(-yf * (yf<0)) + beta*(yf*(yf>0))\n",
    "        \n",
    "        if np.allclose(kkt,np.zeros(kkt.shape)):\n",
    "            break\n",
    "\n",
    "        while (kkt[i] < 1e-12):\n",
    "            i += 1\n",
    "            if i == len(kkt):\n",
    "                i = np.random.randint(n_obj)\n",
    "                break\n",
    "\n",
    "        possible_j = np.where(np.logical_and(beta > 0 , beta < C))[0]\n",
    "        if (possible_j.size == 0) or np.all(possible_j == i):\n",
    "            possible_j = np.arange(len(kkt))\n",
    "        while True:\n",
    "            j = np.random.choice(possible_j)\n",
    "            if i!=j:\n",
    "                break\n",
    "            \n",
    "        beta,b = step(i,j,x,y,beta,b,C)    \n",
    "        k += 1\n",
    "        i = (i+1) % len(kkt)\n",
    "        \n",
    "    b = b_final(x,y,b,beta)\n",
    "    return [beta,b,k]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "C = 0.01:\n",
      "Number of iterations:153\n",
      "Accuaracy: 64.5%\n",
      "  Number of support vectors: 36\n",
      "  Number of margin vectors: 2\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlsAAADgCAYAAAA0V6PuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xl8lOW5//HPlY1AAEEhKlAErSAYhZCQgEAAUVyICi6A4gKoWGs9FH+eupRDLXVpPZ66tfWoVXChGFH0KKh1ZRGEkJAEBTQuiAaQABKEIBIm9++PLCYQQiB58sxMvu/Xi1eYyTPzXDOD5pv7up/7NuccIiIiIuKNCL8LEBEREQlnClsiIiIiHlLYEhEREfGQwpaIiIiIhxS2RERERDyksCUiIiLiIYUtEREREQ8pbImIr8zsCjPLMrNdZrbJzN40s4ENfI5mZva0mf1gZt+Z2S2HOH5K+XE7yh/XrMr3/mRmH5vZPjO7qyHrFJHwpLAlIr4pDz0PAfcCxwKdgX8AFzXwqe4CTgZOAIYCvzOzcw9S0znA7cAwoAtwIvDHKod8AfwOmN/ANYpImDKtIC8ifjCzo4ANwATn3ByPz1VxnrfLb/8JONk5N7aGY/8FfO2cu7P89jBglnPuuP2Oex74wjl3l5e1i0jo08iWiPilPxALvFLXB5jZ7WZWdLA/B3lMW6ADkFfl7jzg1IOc5tQajj3WzI6pa50iIlUpbImIX44Btjrn9tX1Ac65Pzvn2hzsz0Ee1rL8644q9+0AWtVy/P7HUsvxIiK1UtgSEb9sA9qZWZTH59lV/rV1lftaAztrOX7/Y6nleBGRWilsiYhfPgL2ACPr+gAzu7P8qsUa/9T0GOfcdmAT0KvK3b2A1Qc5zeoajt3snNtW1zpFRKpS2BIRXzjndgDTgL+b2Ugza2Fm0WZ2npndf5DH3Ouca3mwP7Wc7llgqpm1NbNTgOuBmbUce62Z9Syf7zW16rHlNcZS9v/PKDOLNbPIw339ItJ06GpEEfGVmY0DpgA9KGvVZQP3OOeWNuA5mgGPAZcCPwJ/cc79tfx7nYE1QE/n3Dfl990C3AY0B14GfuWc+6n8ezOBa/Y7xQTn3MyGqldEwovCloiIiIiH1EYUERER8ZDCloiIiIiHFLZEREREPKSwJSIiIuIhhS0RERERD3m9cvNhadu2nevYsYvfZYiIiIgc0urV2Vudc+0PdVxQha2OHbswd26W32WIiIiIHFL37ra+LsepjSgiIiLiIYUtEREREQ8pbImIiIh4KKjmbImIiISb0tISSkoKcG6P36XIETKLJTq6ExER0Uf0eIUtERERD5WUFNCuXSvatOmCmfldjhwm5xzbt29j27YCmjXrekTPoTaiiIiIh5zbQ5s2xyhohSgzo23bY+o1MqmwJSIi4jEFrdBW389PYUtEREQaxaOPPsTu3bs9e/68vFzeeusNz57/SClsiYiIBBHnXK23Q1UgEOBvf/M2bK1adfhha9++fR5V8zOFLRERkSDx1FNP8PDDf60MWM45Hn74rzz11BNH/JzFxcWMGjWClJReJCUlMGdOBgDdu3dh69atAGRnZzF8+BAA7r77LiZOvIpzzz2ThISTefrpJwFYtGgBZ52VxujRo0hM7MnNN/+K0tJSADIyZpOcfBpJSQn8/ve3VZ67XbuWTJ8+jUGDUvnLX+5h06aNnHvuUM45Z2i1Gv/97zcZN2505e1FixZwySUXAPDuu28zeHB/+vfvwxVXXMauXbsAyMpawZAhZ5CS0ouBA1PYsWMH06dP4+WXM0hN7c2cORl8//33XHbZSPr2PZ20tH58/PGqytd4002TSE8fzrXXXs2aNasZODCF1NTe9O17Ol988fkRv9810dWIIiIiQcA5x86dO5kzZzYAkyffwsMP/5U5c2Zz2WWX45w7orlDb7/9Fscf34FXXpkPwI4dOw75mE8+WcXChcsoLi6mX79Ezj13BABZWZnk5Kyhc+cTuPDCc3n11bn063cGU6fextKl2bRt25b09OG89tqrXHjhSIqLi+nZM4Fp06YD8MwzT/PWWx/Qrl27aucbNuxsfvObGyguLiYuLo6XXsrg0kvHsHXrVv7857t54413iYuL44EH/sIjj/yVW2+9nauuGsNzz2WQnNyXH374gRYtWjBt2nSys7N46KG/ATBlys307p3InDmvsmDB+1x33dUsX54LQE5ONu+99yHNmzdnypSbuemmyVx++Tj27t1LIBA47Pe5NgpbISAnBzIzISUFEhP9rkZERLxgZkyefAsAc+bMrgxdl112OZMn33LEk7QTEk7jjjtu5fe/v43zzktn4MBBh3xMevpFNG/enObNmzN48FCysjJp06YNyckpdO16IgCjR1/O0qUfEh0dTVraENq3L9uPeezYcXz44SIuvHAkkZGRjBp1ySHPFxUVxfDh5zJ//utcfPGlvPnmfO65534WL17Ip5+u4cwzBwCwd+9eUlP7k5//GccddzzJyX0BaN26dY3P+9FHHzJ79ssADBlyJtu2basMmyNGXEjz5s0BSE3tz/3338OGDQWMHHkxv/zlyYes+XCojRjkcnLgmmvgoYfKvubk+F2RiIh4pWrgqlCfoAVw8sndWLo0m4SE05g27Q7uvbdslCkqKqqyDbhnT/VlDfY/X8Xtmu6vbU5ZbGwskZGRdarz0kvH8PLLL7JgwfskJfWlVatWOOc488yzWb48l+XLc8nJWcP//u9TdR7lq6m2ise1aBFXed/YsVfw0kuv0bx5cy644BwWLHi/TjXXlcJWkMvMhJISKC0t+5qZ6XdFIiLilYo5WlVVncN1JDZu3EiLFi24/PIr+e1vbyUnZyUAJ5zQhZycbABeffXlao+ZN+//2LNnD9u2bWPRogUkJZWNIGVlZfL11+soLS3lpZcyOOOMgfTtm8rixQvZunUrgUCAF1+czaBBg2uspVWrVuzatbPG76WlDSE3dyVPP/0kl146BoCUlH589NESvvzyCwB2797N55/n0737KWzatJGsrBUA7Ny5k3379tGyZfXnHzAgjRdemAWUzQNr165djaNg69Z9RdeuJ3LTTf/BiBEXVs7taigKW0EuJQWioyEiouxrSorfFYmIiBcqglbFHK0PP1zBZZddzpw5s+sVuFav/phBg8omf//lL/dw++1TAbjzzj9w662TGTZs0AGjT8nJKYwaNYLBg/txxx3/RYcOHYCydtvUqbeTlJRAly5dueiiURx//PFMn34f5547lJSUXvTu3YcLLrioxlomTpzERRedd8AEeYDIyEjOOy+dt99+k/PPTwegffv2PPnkTK6++nL69j2dwYP78dlnnxITE8Nzz2Vwyy03k5LSixEjzmbPnj0MHjyUtWvXVE6Qnzr1LlauzKJv39OZOvV2nnzymRrreumlDJKSEkhN7U1+/qeMG3f1Eb3XB2PBdElpQkKymzs3y+8ygo7mbImIhK49e9bSrVuPOh371FNPsHPnzsrWYUUAa9WqFddeO8njSsvcffddxMW1ZMqUW6vdv2jRAh566AHmzp3XKHUEm/z8tcTGVv8cu3e3bOdc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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "C = 1:\n",
      "Number of iterations:186\n",
      "Accuaracy: 90.55%\n",
      "  Number of support vectors: 13\n",
      "  Number of margin vectors: 3\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlsAAADgCAYAAAA0V6PuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xl41OW9/vH3J5NgIIBJZRFBBa0gGCEhIWENIIgLEQG1qKhsiseqh+Lxd9xpy3Fpe2y1tj2tuIBValMWOYpL1SoQQMlCAgrRoAIHBEFoghAaEybP749JQsIaknwzk+R+XVeuZGa+M89nMnrl5lnNOYeIiIiIeCMs2AWIiIiINGUKWyIiIiIeUtgSERER8ZDCloiIiIiHFLZEREREPKSwJSIiIuIhhS0RERERDylsiUijYGY3mlmWmR0ws51m9raZDa7nNn5kZqvN7KCZLavP1xaR5kthS0RCnpndAzwNPA50BM4B/ge4up6b+md5O7+o59cVkWbMtIO8iIQyMzsd+BqY4pxb0EBt3grc5Jwb1hDtiUjTpp4tEQl1A4BI4LWaPsHM7jezwuN9eVeqiMjRwoNdgIjISZwB7HHOHarpE5xzv0BDgSISItSzJSKhbi/Qzsz0j0MRaZQUtkQk1H0EFANja/oEM3uwfNXiMb+8K1VE5GgKWyIS0pxz+4BZwB/MbKyZtTKzCDO7wsx+dZznPO6ca328r+O1ZWY+M4skMMUizMwizSzCm3cmIs2FViOKSKNgZhOBmUBPYD+QDTzmnFtdj21MBuYecfdLzrnJ9dWGiDQ/ClsiIiIiHtIwooiIiIiHFLZEREREPKSwJSIiIuIhhS0RERERDylsiYiIiHgopHZkjolp5zp37hrsMkREREROasOG7D3OufYnuy6kwlbnzl1ZvDgr2GWIiIiInFSPHra1JtdpGFFERETEQwpbIiIiIh5S2BIRERHxUEjN2RIREWlqyspKKS3djnPFwS5FaskskoiILoSF1e5ceoUtERERD5WWbqdduzZER3fFzIJdjpwi5xwFBXvZu3c7p53WrVavoWFEERERDzlXTHT0GQpajZSZERNzRp16JhW2REREPKag1bjV9fNT2BIREZEG8bvfPc3Bgwc9e/1163J55523PHv92lLYEhERCSHOuRPebqz8fj+//723YWv9+lMPW4cOHfKomsMUtkRERELECy/M4be//U1lwHLO8dvf/oYXXphT69csKipi3LjRJCX1ISEhlgUL0gDo0aMre/bsASA7O4tRo4YB8OijP2Pq1Ju5/PJLiI29gBdffA6AFSuWMXJkCj/60Tji43tx993/RllZGQBpaa+SmHgxCQmxPPTQfZVtt2vXmtmzZzFkSDK//OVj7Ny5g8svH85llw2vVuPf//42Eyf+qPL2ihXLuOaaqwB4//13GTp0AAMG9OXGG6/jwIEDAGRlZTJs2ECSkvoweHAS+/btY/bsWSxalEZychwLFqTxz3/+k+uuG0u/fr1JSenPJ5+sr3yPd945ndTUUUybdgsbN25g8OAkkpPj6NevN198sanWv+9j0WpEERGREOCcY//+/SxY8CoAM2bcw29/+xsWLHiV6667AedcreYOvfvuO3TqdBavvfYmAPv27Tvpcz79dD3Ll39MUVER/fvHc/nlowHIysogJ2cj55xzLmPGXM6SJYvp338gDz98H6tXZxMTE0Nq6ihef30JY8aMpaioiF69Ypk1azYAL730Iu+88yHt2rWr1t6IEZdy1123U1RURFRUFAsXpnHttRPYs2cPv/jFo7z11vtERUXx5JO/5JlnfsO9997PzTdP4OWX00hM7Md3331Hq1atmDVrNtnZWTz99O8BmDnzbuLi4lmwYAnLln3Arbfewpo1uQDk5GTzj3+spGXLlsyceTd33jmDG26YSElJCX6//5R/zyeisNUI5ORARgYkJUF8fLCrERERL5gZM2bcA8CCBa9Whq7rrruBGTPuqfUk7djYi3nggXt56KH7uOKKVAYPHnLS56SmXk3Lli1p2bIlQ4cOJysrg+joaBITk+jW7TwAfvSjG1i9eiURERGkpAyjffvAeczXXz+RlStXMGbMWHw+H+PGXXPS9sLDwxk16nLefPMNxo+/lrfffpPHHvsV6enL+eyzjVxyySAASkpKSE4eQH7+55x5ZicSE/sB0LZt22O+7kcfreTVVxcBMGzYJezdu7cybI4ePYaWLVsCkJw8gF/96jG+/no7Y8eO54c/vOCkNZ8KDSOGuJwcmDQJnn468D0nJ9gViYiIV6oGrgp1CVoAF1zQndWrs4mNvZhZsx7g8ccDvUzh4eGVw4DFxdW3NTiyvYrbx7r/RHPKIiMj8fl8Narz2msnsGjR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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "C = 100:\n",
      "Number of iterations:1246\n",
      "Accuaracy: 89.3%\n",
      "  Number of support vectors: 8\n",
      "  Number of margin vectors: 3\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "Ci = [0.01,1,100]\n",
    "\n",
    "for C in Ci:\n",
    "    \n",
    "    beta, b,k = our_svc2(40,C,x,y)\n",
    "    \n",
    "    pred = f(x,y,beta,b,x_test)\n",
    "    pred = ((pred > 0) * 1)\n",
    "    acc = accuracy(pred,y_test)\n",
    "    \n",
    "    #Plot of the results\n",
    "    print('C = {}:'.format(C))\n",
    "    print('Number of iterations:{}'.format(k))\n",
    "    print('Accuaracy: {}%'.format(acc*100))\n",
    "    plot_svm(x,y,beta,b,C,f)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Time comparison"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "With C= 0.01 and no use of KKT:\n",
      "276 ms ± 1.05 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
      "With C= 0.01 and use of KKT:\n",
      "16 ms ± 1.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
      "\n",
      "With C= 1 and no use of KKT:\n",
      "278 ms ± 2.06 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
      "With C= 1 and use of KKT:\n",
      "16.8 ms ± 2.34 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
      "\n",
      "With C= 100 and no use of KKT:\n",
      "278 ms ± 1.06 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
      "With C= 100 and use of KKT:\n",
      "92.8 ms ± 4.87 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "Ci = [0.01,1,100]\n",
    "\n",
    "for C in Ci:\n",
    "    print('With C=',C,'and no use of KKT:')\n",
    "    %timeit -n 10 our_svc(40,C,x,y)\n",
    "    \n",
    "    print('With C=',C,'and use of KKT:')\n",
    "    %timeit -n 10 our_svc2(40,C,x,y)\n",
    "    print()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Task 2.6"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_classes(class1,class2):\n",
    "    plt.plot(class1[:,0],class1[:,1],'ro',label='class 1')\n",
    "    plt.plot(class2[:,0],class2[:,1],'bo',label='class 2')\n",
    "    plt.legend()\n",
    "\n",
    "def get_circle(number_of_vectors,dim=2):\n",
    "    class1=np.array([]).reshape(0,dim)\n",
    "    class2=np.array([]).reshape(0,dim)\n",
    "    while(len(class1)<number_of_vectors):\n",
    "        new=np.random.uniform(-1,1,(1,2))\n",
    "        if(np.linalg.norm(new)<1):\n",
    "            class1=np.append(class1,new,axis=0)\n",
    "    while(len(class2)<number_of_vectors):\n",
    "        new=np.random.uniform(-2,2,(1,2))\n",
    "        if(np.linalg.norm(new)>1 and np.linalg.norm(new)<2):\n",
    "            class2=np.append(class2,new,axis=0)\n",
    "    class1=np.concatenate((class1,np.full((number_of_vectors,1),-1)),1)\n",
    "    class2=np.concatenate((class2,np.full((number_of_vectors,1),1)),1)\n",
    "    return class1, class2\n",
    "\n",
    "Class1,Class2=get_circle(50)\n",
    "plot_classes(Class1,Class2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  Number of support vectors: 99\n",
      "  Number of margin vectors: 13\n"
     ]
    },
    {
     "data": {
      "image/png": "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4/7OcZZoAy8UiEk8UjAmIjU0S3x0FIy3ZJJYDbwQiX2OzDNmjHnQGPOpMWaNMWa2MSbdiXaIyI9ifk6nVavg6ae9/wbBVzDeoUMHKk46iTWDB1Nx0kl06NAhYgXjLZ1nrn6bFIiJxBanMmPzgd9aa6uMMX8Ffgvc7lBbRITo6qJrsVWr4Jpr4OBBSEmB55+Hfv0CXlw0FIxHQ4ZORCLDkWDMWvtOrYcfA5c60Q4RqStmA4CiIm8g5vF4/y0qCioYA+cLxjWlg0jiiIaasTyg0ft2GGOmAFMAunXuHKk2iSSkmA0AsrK8GTFfZiwrK2SLdjITGA0ZOhEJPxOue84ZY94Fjm7gpbustf+ufs9dQCYwwfrRkMw+fezyWbNC21AROURMBgCrVnkzYllZQWfFolFDM/CLSHQzPXuusNZmNve+sGXGrLXnNPW6MeYaIBs4259ATEQix+kuuoD06xeXQZhPzOwHEWkxR7opjTHn4y3YH2GtrXSiDSLSPAUAIiLh58jUFsATQDtgvjGm2BjzlEPtEBEREXGUU6MpT3RivSIiIiLRxqnMmIiIiIigYExERETEUQrGRERERBykYExERETEQQrGRERERBykYExERETEQQrGRERERBykYExERETEQQrGRERERBykYExERETEQQrGRERERBykYExERETEQQrGRERERBykYExERETEQQrGRERERBykYExERETEQQrGRERERBykYExERETEQQrGRERERBykYExERETEQQrGRERERBykYExERETEQcZa63Qb/GaM2QFscrodceZIYKfTjUhw2gfRQfshOmg/RAfth9A4zlrbqbk3xVQwJqFnjFlurc10uh2JTPsgOmg/RAfth+ig/RBZ6qYUERERcZCCMREREREHKRiTZ5xugGgfRAnth+ig/RAdtB8iSDVjIiIiIg5SZkxERETEQQrGEpwx5kFjzKfGmDXGmNnGmHSn25SIjDGXGWPWGmM8xhiNYIowY8z5xpjPjDGfG2PucLo9icgYM80YU2qM+cTptiQyY8yxxpj3jDEl1cekW5xuUyJQMCbzgT7W2tOA9cBvHW5PovoEmAB84HRDEo0xxgX8A7gA6A1cYYzp7WyrElIBcL7TjRCqgF9Za3sBg4Cb9PcQfgrGEpy19h1rbVX1w4+Brk62J1FZa0ustZ853Y4ElQV8bq390lp7AHgZuMjhNiUca+0HwHdOtyPRWWu/sdaurP7/fUAJ0MXZVsU/BWNSWx7wptONEImwLsDmWo+3oJOPCMaY44F+wFJnWxL/kp1ugISfMeZd4OgGXrrLWvvv6vfchTc9PT2SbUsk/uwHcYRp4DkNM5eEZoxpC7wK3Gqt3et0e+KdgrEEYK09p6nXjTHXANnA2VZznYRNc/tBHLMFOLbW467ANofaIuI4Y0wK3kBsurV2ltPtSQTqpkxwxpjzgduBcdbaSqfbI+KAZcBJxpjuxphWwOXA6w63ScQRxhgDPAeUWGsfdro9iULBmDwBtAPmG2OKjTFPOd2gRGSMGW+M2QIMBuYZY952uk2JonoAyy+At/EWK8+w1q51tlWJxxjzEvAR0NMYs8UYc63TbUpQQ4CrgLOqzwnFxpgLnW5UvNMM/CIiIiIOUmZMRERExEEKxkREREQcpGBMRERExEEKxkREREQcpGBMRERExEEKxkQk4Rlj3jLG7DHGzHW6LSKSeBSMiYjAg3jnVhIRiTgFYyKSMIwxA4wxa4wxqcaYNsaYtcaYPtba/wD7nG6fiCQm3ZtSRBKGtXaZMeZ14H6gNfCitfYTh5slIglOwZiIJJp78d6Pcj/wS4fbIiKibkoRSTiHA23x3pM11eG2iIgoGBORhPMM8DtgOvBXh9siIqJuShFJHMaYq4Eqa+2/jDEuYIkx5izgf4GTgbbGmC3Atdbat51sq4gkDmOtdboNIiIiIglL3ZQiIiIiDlIwJiIiIuIgBWMiIiIiDlIwJiIiIuIgBWMiIiIiDlIwJiIiIuIgBWMiIiIiDlIwJiIiIuKg/w+oMWJj+JQ10QAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x=np.concatenate((Class1,Class2))[:,:2]\n",
    "y=np.concatenate((Class1,Class2))[:,2]\n",
    "rnd_ij = np.random.randint(0,100,(10000,2))\n",
    "C=10\n",
    "b = 0\n",
    "beta = np.zeros(100)\n",
    "for k in range(10000):\n",
    "    i,j = rnd_ij[k]\n",
    "    while i==j:\n",
    "        j = np.random.randint(0,100)\n",
    "        \n",
    "    beta,b = step(i,j,x,y,beta,b,C)    \n",
    "    \n",
    "b = b_final(x,y,b,beta)\n",
    "\n",
    "plot_svm(x,y,beta,b,C,f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "def kern(x):\n",
    "    new_x=np.array([]).reshape((0,3))\n",
    "    for t in x:\n",
    "        new_x=np.append(new_x,[[t[0],t[1],t[0]**2+t[1]**2]],axis=0)\n",
    "    return new_x\n",
    "    \n",
    "x=kern(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_svm3D(x, labels, beta, b, C):\n",
    "    x_min = np.min(x[:,0])\n",
    "    x_max = np.max(x[:,0])\n",
    "    y_min = np.min(x[:,1])\n",
    "    y_max = np.max(x[:,1])\n",
    "    X = np.linspace(x_min - 1, x_max + 1, 1000)\n",
    "    Y = np.linspace(y_min - 1, y_max + 1, 1000)\n",
    "    XX,YY = np.meshgrid(X,Y)\n",
    "    #Z = np.concatenate((XX.flatten(),YY.flatten())).reshape(2,-1).T   (HIER GEAENDERT!!!!!!!!!!!!!!!!!)\n",
    "    Z = np.array([[XX[i,j],YY[i,j],XX[i,j]**2+YY[i,j]**2] for i in range(1000) for j in range(1000)])\n",
    "    fZ = f(x,y,beta,b,Z)\n",
    "    fZ = ((fZ>0)*1).reshape(1000,1000)\n",
    "    \n",
    "    \n",
    "     # seperate training points into classes.\n",
    "    un = np.unique(labels)\n",
    "    x0 = x[np.where(labels == un[0])]\n",
    "    x1 = x[np.where(labels == un[1])]\n",
    "    supvec = x[np.where(beta > 0)]\n",
    "    margvec = x[np.where(np.logical_and((beta > 0), (beta < C)))]\n",
    "    \n",
    "    # Print statistics.\n",
    "    print('  Number of support vectors: {}'.format(supvec.shape[0]))\n",
    "    print('  Number of margin vectors: {}'.format(margvec.shape[0]))\n",
    "    \n",
    "    # Plot.\n",
    "    fig = plt.figure()\n",
    "    plt.scatter(supvec[:, 0], supvec[:, 1], c='black', alpha=0.8,\n",
    "                marker='x', label='support vectors')    \n",
    "    plt.scatter(margvec[:, 0], margvec[:, 1], c='grey', alpha=0.8,\n",
    "                marker='D', label='margin vectors')\n",
    "\n",
    "    \n",
    "    plt.scatter(x0[:, 0], x0[:, 1], c='b', alpha=1,\n",
    "                marker='.', label='Class -1')\n",
    "    plt.scatter(x1[:, 0], x1[:, 1], c='r', alpha=1,\n",
    "                marker='.', label='Class  1')\n",
    "    \n",
    "    plt.contourf(XX, YY, fZ, 1, colors=['b','r'], alpha=0.15)\n",
    "    plt.xlim(x_min - 1, x_max + 1)\n",
    "    plt.ylim(y_min - 1, y_max + 1)\n",
    "\n",
    "    plt.xlabel('x1')\n",
    "    plt.ylabel('x2')\n",
    "    plt.title('C = {}'.format(C))\n",
    "    plt.legend(loc='upper right')\n",
    "    \n",
    "    plt.show(fig)\n",
    "    plt.close(fig)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  Number of support vectors: 13\n",
      "  Number of margin vectors: 8\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "rnd_ij = np.random.randint(0,100,(10000,2))\n",
    "C=10\n",
    "b = 0\n",
    "beta = np.zeros(100)\n",
    "for k in range(10000):\n",
    "    i,j = rnd_ij[k]\n",
    "    while i==j:\n",
    "        j = np.random.randint(0,100)\n",
    "        \n",
    "    beta,b = step(i,j,x,y,beta,b,C)    \n",
    "    \n",
    "b = b_final(x,y,b,beta)\n",
    "\n",
    "plot_svm3D(x,y,beta,b,C)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Task 2.7\n",
    "Change SMO() so that it can get a kernel as an argument"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "sigma = 1\n",
    "\n",
    "def K(xij,x):\n",
    "    return np.exp(- (np.linalg.norm(x.reshape(x.shape[0], 1, x.shape[1])-xij, axis = -1)) / (2*sigma**2))\n",
    "\n",
    "def f2(x, y, beta, b, xij):\n",
    "    return np.sum((beta*y).reshape(-1,1)*K(xij,x),axis=0) + b\n",
    "    \n",
    "    \n",
    "def step2(i,j,x,y,beta,b,C):\n",
    "    delta = y[i]*((f2(x,y,beta,b,x[j])-y[j])-(f2(x,y,beta,b,x[i])-y[i])) \n",
    "    s = y[i]*y[j]\n",
    "    chi = K(x[[i]],x[[i]]) + K(x[[j]],x[[j]]) - 2*K(x[[i]],x[[j]])\n",
    "    gamma = s*beta[i] + beta[j]\n",
    "    if s==1:\n",
    "        L = max(0,gamma-C)\n",
    "        H = min(gamma,C)\n",
    "    else:\n",
    "        L = max(0,-gamma)\n",
    "        H = min(C,C-gamma)\n",
    "    \n",
    "    if chi>0: \n",
    "        beta[i]= min(max(beta[i]+delta/chi,L),H)\n",
    "    elif delta>0:\n",
    "        beta[i] = L\n",
    "    else:\n",
    "        beta[i] = H\n",
    "    \n",
    "    beta[j] = gamma - s*beta[i]\n",
    "    b = b - 0.5*(f2(x,y,beta,b,x[i])-y[i]+f2(x,y,beta,b,x[j])-y[j])\n",
    "    \n",
    "    return beta, b \n",
    "\n",
    "def b_final2(x, y, b, beta):\n",
    "    ind = np.nonzero(beta)\n",
    "    if len(ind[0]) > 0:\n",
    "        med = np.median(f2(x,y,beta,b,x[ind]) - y[ind])\n",
    "        b = b - med\n",
    "    return b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  Number of support vectors: 30\n",
      "  Number of margin vectors: 27\n"
     ]
    },
    {
     "data": {
      "image/png": "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z1pr/U6/sNbOs9bmWWvzumZmRreBIiIiIhHmWBgznhGHjwOl1to/ONUOERGReLRv/36nm9Bq1//4x2wsLY36cX9z//1RP2ZrOFkZGwFcA5xhjFlf9+98B9sjIiISF0o2bOCJZ56hZMMGp5vSQE1NTbPX/+XPf6ZfdnaUWnNIa8OYtbZ+K6hocHI25bvWWmOt7W+tHVj371Wn2iMiSaCkBObO9XwViVMlGzawom4D7hWrVoUcyL7YsoWTBwzg+h//mJxBg7hqyhSWvfUWI04/nZNycihaswaAojVrGD52LLlDhzJ87Fg+LSsD4K9PP82kK6/kwksu4Zzx46mtreW/br6ZU047jfEFBZx/8cUsrFsIduw551C8di0AHY46irt+8QsG5OczdPRodu7c2aBdtbW19Orblz179tRf9oNTTmHnzp188803XHL55QweMYLBI0bw3qpVABw4cICp06dzal4e/QcPZtHixdx+9918//33DBwyhKumTAE8W0jlDBpEzqBBzHn44frnIXvgQP7r5ps5bdgwtm7dypQbbiBn0CBOzcvjwT/+MaTnuTlOrjMmIhI9JSVw7bVQXQ2pqfDUU5Cb63SrRFrFG8Tatm2Ly+UiJSWFFXVBJLd//6Af97PPP2fBs88y709/YvDIkfx9/nzefestlixdym/uv58XFyzg5L59WbFsGW3atGHZW29x56xZLKrb1/H91avZsGYNRx55JAsLC/liyxY+Ki7m66+/Jjs3l2mTJx92zIqKCobm53PPr37Ff995J489+WT9VkwAKSkpXDR+PIuXLGHq5MmsLiqi1wkn0L17d6689lpm3nQTI0eM4N///jfnTphA6fr1/O+999KpY0c+qtuTcvfu3VwycSKPPPoo61d7FmxYu24dTz79NKtXrMBay5DRoxkzahSZmZl8WlbGk3Pn8n8PPcTadev4cvt2Pq4Lj76hMNwUxkQkORQVeYJYba3na1GRwpjElcZBDDz7NbZt2zbkQJbVqxen5uQAcEp2NmeOHYsxhlNzcvji3/8GYO/evVx7/fVs+vxzjDFUV1fX3//sM8/kyCOPBODdVauYVFBASkoKRx99NKc3sRBs27Zt6/eYHJSby5tvvXXYbS679FJm33svUydP5vkFC+o3CF/29tts/Ne/6m+3b98+9u/fz7K33+b5v/2t/vJMPxP/3l21iokT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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.concatenate((Class1,Class2))[:,:2]\n",
    "y = np.concatenate((Class1,Class2))[:,2]\n",
    "rnd_ij = np.random.randint(0,100,(10000,2))\n",
    "C = 10\n",
    "b = 0\n",
    "beta = np.zeros(100)\n",
    "for k in range(10000):\n",
    "    i,j = rnd_ij[k]\n",
    "    while i==j:\n",
    "        j = np.random.randint(0,100)\n",
    "        \n",
    "    beta,b = step2(i,j,x,y,beta,b,C)    \n",
    "    \n",
    "b = b_final2(x,y,b,beta)\n",
    "\n",
    "plot_svm(x,y,beta,b,C,f2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Task 2.8\n",
    "First steps on **scikit-learn**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Load MNIST Data\n",
    "import numpy as np\n",
    "import os\n",
    "import gzip\n",
    "from urllib.request import urlretrieve\n",
    "\n",
    "def download(filename , source='http://yann.lecun.com/exdb/mnist/'):\n",
    "    print(\"Downloading %s\" % filename)\n",
    "    urlretrieve(source + filename , filename)\n",
    "             \n",
    "def load_mnist_images(filename):\n",
    "    if not os.path.exists(filename):\n",
    "        download(filename)\n",
    "    with gzip.open(filename , 'rb') as f:\n",
    "        data = np.frombuffer(f.read(), np.uint8 , offset=16)\n",
    "    data = data.reshape(-1, 28, 28)\n",
    "    return data / np.float32(256)\n",
    "\n",
    "def load_mnist_labels(filename):\n",
    "    if not os.path.exists(filename):\n",
    "        download(filename)\n",
    "    with gzip.open(filename , 'rb') as f:\n",
    "        data = np.frombuffer(f.read(), np.uint8 , offset=8)\n",
    "    return data\n",
    "\n",
    "X_train = load_mnist_images('train-images-idx3-ubyte.gz')\n",
    "y_train = load_mnist_labels('train-labels-idx1-ubyte.gz')\n",
    "X_test = load_mnist_images('t10k-images-idx3-ubyte.gz')\n",
    "y_test = load_mnist_labels('t10k-labels-idx1-ubyte.gz')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Task 2.8 a)\n",
    "\n",
    "Search for the right parameters with 5-fold crossvalidation on a small subset of training data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.model_selection import GridSearchCV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Create smaller training data\n",
    "n_sampels=500\n",
    "selection=np.random.randint(0,len(X_train),n_sampels)\n",
    "X_small=X_train[selection]\n",
    "y_small=y_train[selection]\n",
    "X_small=X_small.reshape((n_sampels,28*28))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Jannik\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:841: DeprecationWarning: The default of the `iid` parameter will change from True to False in version 0.22 and will be removed in 0.24. This will change numeric results when test-set sizes are unequal.\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10\n",
      "0.01\n"
     ]
    }
   ],
   "source": [
    "#Search for the right parameters\n",
    "parameters = {'C':[1, 10,100], 'gamma':[0.1,0.01,0.001]}\n",
    "clf = GridSearchCV(SVC(), parameters,cv=5,n_jobs=-1)\n",
    "clf.fit(X_small,y_small)\n",
    "C=clf.best_params_['C']\n",
    "gamma=clf.best_params_['gamma']\n",
    "#Save best parameters\n",
    "print(C)\n",
    "print(gamma)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Task 2.8 b)\n",
    "\n",
    "Test on the complete test data and calculate the accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Confusion matrix:\n",
      "[[ 966    0    2    1    0    5    2    1    2    1]\n",
      " [   0 1123    3    1    0    1    3    0    4    0]\n",
      " [  10    5  954    7    8    4   11   19   11    3]\n",
      " [   1    5   12  939    1   25    0   10   11    6]\n",
      " [   1    3    4    0  926    2   10    2    2   32]\n",
      " [   9    6    8   32    5  796   11    2   18    5]\n",
      " [  16    5    8    1    8   15  901    0    4    0]\n",
      " [   2   11   17    2    6    0    1  960    2   27]\n",
      " [   4    3   11   24    9   20   10   12  869   12]\n",
      " [   6    8    1   13   28    3    2    9    8  931]]\n",
      "Accuracy: 93.65 %\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "n_sampels=2000\n",
    "selection=np.random.randint(0,len(X_train),n_sampels)\n",
    "X_small=X_train[selection]\n",
    "y_small=y_train[selection]\n",
    "X_small=X_small.reshape((n_sampels,28*28))\n",
    "svc=SVC(C=C,gamma=gamma)\n",
    "svc.fit(X_small,y_small)\n",
    "y_pred=svc.predict(X_test.reshape((10000,28*28)))\n",
    "conf=confusion_matrix(y_test,y_pred)\n",
    "print('Confusion matrix:')\n",
    "print(conf)\n",
    "acc=np.trace(conf)/10000\n",
    "print('Accuracy:',acc*100,'%')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
