diff --git a/Logistic Regression.ipynb b/Logistic Regression.ipynb new file mode 100644 index 0000000..0f4372c --- /dev/null +++ b/Logistic Regression.ipynb @@ -0,0 +1,512 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Logistic Regression" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import seaborn as sns\n", + "sns.set(color_codes=True)\n", + "sns.set_context(\"notebook\")\n", + "\n", + "from matplotlib import pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Dataset\n", + "Create a simple dataset that can be used for classification." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "num_points = 500\n", + "x1 = np.random.randn(num_points)\n", + "x2 = np.random.randn(num_points)\n", + "y = np.random.randint(2, size=num_points)\n", + "# y.reshape(-1,1)\n", + "x1[y == 0] = x1[y == 0] + 3\n", + "x2[y == 0] = x2[y == 0] + 5" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "df = pd.DataFrame({'y':y, 'x1':x1, 'x2':x2})" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiQAAAHsCAYAAADioLY0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3XmYG+d9J/hvFQpHo8ludqMPHhJJiRSLh0TqtKw44yOK\nFduS45xy4mgex3aSjWeTeWbX88zsZDK7njyTeZ54483GzsTebGLPJPYmVuI4jo9YdizLcmwppniL\nIouH2KTEvtFgHzjr2j8KVV2FLgAFNNAooL+f59EjEQRQhWpS9cX7/t7fK5imCSIiIqJOEjt9AkRE\nREQMJERERNRxDCRERETUcQwkRERE1HEMJERERNRxDCRERETUcQwkRERE1HEMJERERNRxDCRERETU\ncVKnTyAIWZZvA/ApAG8GkAbwh4qi/GFnz4qIiIhapVtGSP4awDKA+wH8GwC/K8vyezp7SkRERNQq\noQ8ksixvA/AwgP+iKMpVRVH+HsA3ADza2TMjIiKiVgl9IAGQB5AF8AFZliVZlmUAbwJwsrOnRURE\nRK0idMNuv7Isvx/AHwFIAIgA+KyiKB/q7FkRERFRq3TDCAkAHALw9wDeAOCXAfycLMu/2NEzIiIi\nopYJ/SobWZYfBfAhALcpilIEcKq86ua3AfxlR0+OiIiIWiL0gQTWyprL5TBiOwXgt4K+gWmapiAI\nLT8xIiKiFuANCt0RSCYB7JdlWVIURSs/dgjAtaBvIAgClpby0HWjLSfYrSIREQMDfbw2FXhdquO1\nqY7Xpjpem+rsa0PdEUi+AuBjAP5UluXfBXAQwH8o/xOYrhvQNP5F8MNr44/XpTpem+p4barjtaFa\nQl/UqijKEqyeIzsA/BDAxwH8jqIof9rREyMiIqKW6YYREiiKchHAT3T6PIiIiKg9Qj9CQkRERL2P\ngYSIiIg6joGEiIiIOo6BhIiIiDqOgYSIiIg6joGEiIiIOo6BhIiIiDqOgYSIiIg6joGEiIiIOo6B\nhIiIiDqOgYSIiIg6joGEiIiIOo6BhIiIiDqOgYSIiIg6joGEiIiIOk7q9AkQUXipmo6zV9OYXshh\n+3AS98mjnT4lIupRDCRE5EvVdHz2Hy5iKp1zHjt1eR4feerBDp4VEfUqTtkQka+zV9OeMAIAk+ks\nXrow06EzIqJexkBCRL6mF3K+j9+cW9ngMyGizYBTNkTka/tw0vfxXaNbNvhMaqusczm6L4WoFOn0\naTnCfn5EYcFAQkS+ju5L4cSlOc+0zc5UPx48NI7sSqGDZ7bKr87lxKU5fOCdB0Nx0w/7+RGFCQMJ\nEfmKShF84J0H16yyiUUjyHb65Mr86lym0jmcvZrGA/JYh85qVdjPr5M4ckSVGEiIqKqoFPHcOCUp\nXGVn1epcqj2+0cJ+fp3CkSPyE67/uxARNaBanUu1xzda2M+vU2qNHNHmxUBCRF3r6L4UdqS8N/cd\nKWv4PwzCfn6dwpEj8sMpGyLqWu46l5vzKygUdSTiEs5eTYeiJsGvDicM59VpHDkiPwwkRNTVolJk\nzYqgU5fnQ1OTUFmHQ/4ruDhyRAwkRNT1uJqlu3DkiPwwkBBR12NNQvfhyBFVYlErEXU91iQQdT8G\nEiLqetVWsxzaM4QTyiy+9sIETiizUDW9MydIRHVxyoaIQqmRTp5+NQmH9gzhc9+6xOZbRF2CgYSI\nNkQjAaOZTp6VNQknlFkWuhJ1EQYSImq7RgNGK1bNhLHQlfu3EFXHQEJEbddowGhFmAhboSv3byGq\njYGEiNrCPRpwcy4L0zQhCILnOdUCRtAwUWvEIWzNt9grhag2BhIiarnK0YBcQUWuoCE1mPCEkmrB\nI0iYqDfiELbmW2GcQiIKEwYSImq5ytGAvriEXEFDvqghmYgCqD1aUW3VjPvXmm7UHXEIU/OtsE0h\nEYUNAwnRJtGqgsqSquP4xVlMzq1UfZ/Kb/2CICA1mMDOVD92jfYHOr47TPiNhhiGCUFA4GmgTgvb\nFBJR2DCQEG0CrSqoLGk6PvP0aUxMLcI0q7+P37d+QRDwgDza1IiFX/1FoaQBgDPiUuvYYRC2KSSi\nsGGnVqJNoFZBZSPOXEnj9dnluu9TrXNqs6MBfqMefXEJiZj3O1XYRxzsUZ/HH9mLB+QxhhEiF46Q\nEG0CrSqonE5nA71Pq0cDqo24vPPh2yFFRI44EPUABhKiTaBVBZXbU/3A5flA79PKgtJq9Rf3Hxhl\nACHqEQwkRD3KXcQ6MpjA+FAfZjJ55/ebmd44tj+Fc68uYGJqcV3v06h2118ELfhlp1Wi9hFMuzKt\nt5mZTBaaZnT6PEJFkkQMDfWD18arF66LXxHr+FAf7rtrBPOLhaZvppIkon9LAs+9dKPmKptu4net\ndqSSawp13c8zTRP5ooZETMK73rgb9x8YRV8i2vV/btqlF/5OtUv52gj1n9n7OEJC1IP8ilhnMnlI\nERGPP7J3Xe8di0bw0MExaPtH1vU+YRG0g6r9PNM0kV4sQNUMLKKEv33+VZy5msavvPvwRp86UU9h\nICHqQewKGlyta+XX/j5f1KC6vuWrmtWg7cyVNB4bHfC8B6d4iIJjICHqQb3eFdTvRg+g5s2/Wjio\ndk1GBhO+7e8lydstIVr+9XTFKAs30yNqDAMJUQ/q5a6gfjf64xdnAcBTtOu++dcKB9WuFQDf9vem\nsVp3F5VE9MWt/41ur+i7ws30iBrDQELUg4KuSunGKQW/G/21qSUA3q6t7pt/vXDgd62+efw1z/Pt\n9vfbh5KYWsihUNLQF5cgCAJ2pJI4tt8b9jhtRtQYBhKiHlWvD0hYphQaDUV+N3S1ysoN+7n1woHf\ntarWjO2hQ2M4ui+15pxjFefcyLRZNwZDolZjICHapDZqSqHWzbaZUOTfhM1/Fwz7uc3U1NSa9grS\n9C3otFlYgiFRpzGQEPWIVow01Hq82XOqdbOtFYr8RiGiUsT3Rn/HDmt1S7XGb83U1Ky3GVvQ17PW\nhMjCQELUAypv/KZp4lsvvYbDe4ewa2SL741wI1bi1LvZVgs/N+dX1gQId5Dxu9Hbx7MfO7RnyPPr\np95+ABeuZxoKF+ttfx/k9aw1IbIwkBD1APeN3924K7NcRDIR9Z0C2IiVOPVuttXCT6Go1wwy1W70\n9mO1RmbCNurQ60u0iYLyn3gloq7ivvG7G3fZ/7Zv5m72SMMTj+zBg/IonnhkT8vrFurdbI/uSzlL\nbG07Ukkk4t7vSqZpIldQ8dzpmzihzELV9JrHrTUyEzbVrkEvLNEmagRHSIh6gPvG715xYhgmFleK\niEoiJuezeED2vq6VO/L6qTcKU2365ezVNE6VdxV2j/gAwFdfuF636LObpkHavXEgUbdgICHqAe4b\nv73iRDesNueCYO3bdX5iAe94ePeG3uiC3Gz9QpH789gjPu4mZPWKPmuNzIRxiW0rgmEYPxdRI7oi\nkMiyHAPwBwB+EUARwGcURfmPnT0rovBw3/gn57N48ZUZzN/KO2EkKokolPSOrNxo5mbr/jzPnb4J\nAE4TMlut0Y5qIzOH9gwFWmIb9Obuft7O0S1464O7G/qctd6vkVDBpcPUC7oikAD4BIC3Ang7gAEA\nX5BleUJRlP+3o2dFFCL2jf8BGTBh4vvnpj0jC4IgdGzKopkbrTvIfPWF62t+v1bRZ62poHpLbIPe\n3CufJ1yaw7lXF/DUY3dBROO7ya8nVHDpMPWC0AcSWZaHAHwQwI8pinKi/NjvA3gYAAMJkY9dI1s8\nbdRtnVi5Ue1GG3QZbrOrgfxGZoLUlgS9ufs97/XZZZy5ksZ9+0dqnpuf9YSKbqqZIaom9IEEwI8C\nuKUoyj/ZDyiK8rEOng9R6IVlcz1V0/Gl51/FxesZz0jN5HwWn/jiWRTV1QLcaqMBrSz6DLLENujN\nverz0jlgf8Ontq5QwaXD1Au6IZDcCWBCluV/CeC3AMQAfBbA7yqKYtZ8JVEPqzUNEoaVG/bIyMXr\nGeQKGgAgV9CQGkwgX9SwlC1hcEvceX6t0YBWrQYKEtSC3tztX5umVTys6gYSMQkj2xJNndt6QkVY\nAijRenRDINkC4ACAXwPwywB2APgTAFlYha5Em06QeoN2L+mtx56CcO8zo2qGZ9VMpXZPMQQJakFv\n7kf3pXD84izOX1uwliQLgKabOHlpDvc2Ef7WEyrCEECJ1qsbAokGYCuAX1QU5XUAkGV5D4APo4FA\nEomwB1wl+5rw2nh1w3U5dWUe0ws5uBadYHohh5cnMnjoYPtCSCPXZvZWHoIAJBNR5ArWCAIAqLqB\n8aEkCqruOX8A2Dm6BVKVjfJaRZJEPHxke83f/5V3H8aZK2lMp3PYnkri2P61u/lKkogHDo5hYnrZ\nCVhbkzHMLuSb+jkEPW6zn6uTuuHvVKfwmqzqhkAyBaBgh5EyBcDtjbzJwEBfS0+ql/Da+AvzdVnM\nqZB8/ke2mFMxNNTf8PuVVB0vXZjBzbkV7BrdggcPjSMWrX4jDHJt9u8edpqbbU/1I1tQoaoG3nL/\nLvz8owfw/3zpHF6fXXaef9vYVrz1wd01jxvkM9yYXsZKvoSFpQJEUcAbDm/HG+/e0fD7PjY6UPc5\n2aKOgf6Y57FIRGj65xD0uN0qzH+nqPO6IZC8CCAhy/J+RVGulB87DGCikTdZWspD1436T9xEIhER\nAwN9vDYVuuG6DCaj0HzObTAZRSaTbei9SpqOz3z1AibTq6/77onX8MEnDq35dt7Itdm3YwvGtvU5\n75uIRXDnjgG86427oRZVPPXYXWtGA7IrBTR29pZsoYT/++mzmFmwGqmVNAMwAVEEXnplBs+feh2/\n+u7DgUcbqilpevmcs9ie6kd/POL8HAQIiEQE6LrZ9M/B/d6NjI6EXTf8neoU+9pQFwQSRVEuybL8\nNQD/XZblfwWrhuTfA/idRt5H1w1oGv8i+OG18Rfm63L33iEcvzCzpt7g7r1DDZ/zKWUON+e9N8+b\n81mcUuaq1qAEuTYiBLz/HfKaugYRAjTNgAjBWh7rWpHSzPVWNR1/8IUzmJhahmGa0PTVWnfdsPb2\nufr6Ys3PE/Q4lXU740N9GNvWh5lMHhBMAEJTPwe/9z5+YabnGpuF+e8UdV7oA0nZLwH4JIDvAcgB\n+ISiKP+ts6dE1DmtLGJsZw+LjSisPXs1jdlMHoC1d08l07RCyXo/j1+fkJlMHu94w+2QIiJmbxWw\nf/cQ9u3Y0nBjNDY2I+qSQKIoyjKsFTa/3NkzIQoPv5t9Mx1RO9nDopkW7ZXPm17I+a7YqbTez1Mt\n0MwvFvD4I3shSSKGhvqRyWQbHgVgYzOiLgkkRFRfs63HO9XDotkW7e7nAUA2r6JUXrEjigIM3TtK\nIgjAjlT/uj/Pmr4j5ZU1I4PN9R3xe++gjxP1IgYSoh7R7LB/p3pYrKdF+1Q6h5OX5nCmvJmgppsw\nDBOiKCAqCDANKyyIoogdqST+zc8fXffnWdN3BNamhacuz+P+A6PrWq7MxmZEDCREXaPe9MZ6hv03\notaj8vwrC2ltQVu0n7mSxtRCDoIgON1fVc3AQwfHcOfOAcwvFjzXqdr1CzptFJUiuO+uEVybWvJs\nWjiTyePs1fS6eoCwsRkRAwlRVwgyvRHmYX+/849GBGTzKjTduyNxtRbttQiC4GwmONAfw8OHveGg\n1gZ/n/vWpUDTXGp5WW7lDspA9xQAE4UZW8QRdYFa0xu2o/tS2JHy3rzDMuxfef6maWJyPovlXAm5\ngobFlRLSiwWMD/X5tmj3+1zH9vt/Lr8A4z6+aZrIFVRcvJ7Bn371FUxWjNRUXldgNdBcnVz0nK9p\nmlWPSUSN4QgJURcIMh0ThmH/atMfleefL2rQdBN98Qhi0Ygz6nDfXSOBd/sFgDMVQadaALOPb5om\n0osFpwbkwvUMACARlxBzjXpUnq8daPriktUGXzOcfXn27RoMRegj6nYMJERdIOh0TCeH/WtNK1We\npx0IYtGIM9UCWEto/VT7XEEDmH18u84EsMKJaVob4umGirwgOLsRV56vHVAq61X27RwM3LysmSXZ\nRJsJAwlRF+iGVRi1ppXc52+a1ooYE1bTMtM0nVqMRqc+ggYw+/gXyyMiQHmJsAkIghVMIFhBKRGL\nrLmu7vNy16s8II8GDiPNLMkm2kwYSIi6QBimY+qpNa30gDyGD7zzIE5emsPXX7yBWDQCzTCxlC0h\nX7RGJXaOVO8Vsp7RBfu124eTKBQ1XJtaQiwaQUk1kC2oEAQBsaiIeDSCqCTiyN5hAMAJZdY53qE9\nQw0HQvc5Z/MqJuezTvAC2ImVqBIDCVGXCPMqDFXTkc2rWFwprlmBYo8uRKUIpIgIURTQ3xdFMiE5\nUx+H9wzhp998Z9Uurc2OLlS+1jRNRKUIErEIlrIl6LoJQQB03YQqGBjoj2FsqK/qipwL1zOBQlHl\ncRdXilA1A6nBhCeUVIY4TuvQZsZAQkTrYt98J+ezUDUDuYLm1GJUjnq4b8DuqY/+vmjVG+969nmp\nfK11TAnDW+NYypYAWNNG1uewpmvs96883oXrmbrHK6k6jl+cxfFXZnB1ctEJZlFJRK6gIV/UPDUz\n7qmg9QYvBhnqdgwkRORo5sZm3/QrCz79Rj2a6ZXSTMM3+3M8d/omcgXVM2IjCAI03cS2rQkYhoHF\nlRJKmoGYJELePVi1sLZer5GSpuMzT5/GxNQibi0XkStoyBY0JOMRaLpVJ1PSDNiftHLKp9ngxfoU\n6hUMJEQ9qJlg0eyNrZFRj8riXNM0kYhFcHN+xfn9ytc0GmLcIza3lovIFjRIkRLGhvogilbrpdtG\n+/HK9QwWlorOqptCSceFiUXcsWNrzamnasf8u+9P4NyVeUQiAqSIdZxCUUOppEMUrfdIxiXcd1cK\nu0a2tKzTLncKpl7BQEJdj8PVXs0Gi2ZvbI0GhmP7UoAJGKaJhaUCCiUdpy6ncepy2vc8G11hdLa8\nv43db8Q0TZRUE7OZPMaHk9g50o8nfmQvXi23gLdJkojJdBa3yvUe7qmn7cNJaLqBr70wsebPmH29\nL97IIF/QYcKEJIowTMAwAcCECGvaJiqJ2DWyxfd6NttplzsFU69gIKGuxuHqtZoNFs3e2IIGhsqf\nVa6gOjf8WufZ6Aqj6YWcp9+IFBFhlJcWu6eRDu8dRma56DRlM01gKVuCJhmeqSf59m3ILBfxt8+/\n6jz3+MVZfOjxQ4hKEed6RyMi8tABEyiUNLj3HBYEYHggDkEQyp1hZ9d8lmaXdjcSZBjeKcwYSKir\ncbh6rWaDRbPf0IMGhsqflbvbqbvQ0+887Ru2+/erbY43MpjwjHwAgCgI2JqMeqaRdo30e467uFIs\nH0v0TD0tZku4cD3jec/z1xZw8tIcHj683TmfvoSEfElHoajBNK0QIghARBRgmtaUUF9cwPmJBZy8\nPO+8lztAN7O0u9lAWHlsok5jIKGuxuHqtZoNFutpvhZkSXLlz8QalTCRLbdit2s2qn2zD7o53vhQ\nH0YG+3CjsOw5VuV7V35ee0qlL+793+Kt5eKagKNqBs5cSePhw9ud9xQFAWNDfZhJ51AwdSQTEnTd\ngKabzmuGtkZQKOlV+5E0s7S72UBYeWyiTmMgoa4W5h1uO6XZYGHf2E5emsOZK9bmcsda2Am28meS\niEVgmNZSWc1p5w4c2jO05rXVbqZf/cHEmsdnMnn8+AO78N3TptUZFkBfPOLZAwdYeyMfGUzg1OV5\nzGTyznN2pJIwdBPAMqqxr/f0Qg6iYPVYAYChrXEAq+3q33h4HIl4BKcup9e8x3oDdDOBsFXHJmoV\nBhLqat3QUn2jrber65mraUyVb1JTP8zhzNV0S3phVP6sCiUd8VgEybgETV8dIfHr9zG9YLWct2/u\n9nNfn/Pu1GtLLxUwPJDArZUickUd+aKO+cU8jl+cRWa56Dk/97HuPzC65jOcvDSH8xMLnlGSqCQ6\nuw3b1/vliQwWcyr64xGcuDjrBJu+uIShrREk4hEUirqnVb5tIwI0wzuFHQMJdbVuaKlu28iCwsob\nrarpnlbo1Y7dzl4YlT+rm3NZTKaza27Oft/YRwYTnl16ASBX0CDfvg3Lry+ueX6hqJeLW63RF9M0\nMTG1jL945hLGh/sgCELg+on7D4zi1OV5XCuvyolKIu7YMYD7D4w6z4lKETx0cAxDQ/3IZLK4d1/K\nWe1zfmLBWUlkmiZyBQ3JxOpy4o0K0AzvFHYMJNT1wtxS3dbOgsJ6QaeRY7e7F4b7Z3VCmcXUC2vf\nd+3OwDpenVxCqRwsRFeA2T2+Bct5dc1NNhGXKnb2RXlnXwO58v41F69n8KXnX3VW3dS6Th96/FBD\nYXL1c87i5OV5T1O2ZELC4T1D6O+LbmiA7qbwTpsTAwnRBmhXQWGQsNHIsdfTC8NvSqVakFE1HZpu\nwDBMFEqa04Cs8hu70+PjeqacKgBTAAaSUQgC8OIrM/jRe3bg2L4U5hcLzk327NW004PENAHdtHcX\nNrGYVWFHmhdfmcGtbMm5Ude6Ts38nPw+v1CuM3n8kb0Nv996dUN4p82LgYRoA7SroDBI2Gjk2M0O\n61ebUhkp9xhxj+K4i0ftwQ7TBN758O24/8Co5xu70+OjvBQXMGEaJm6tlJxQ8Y0fvoYdqaQnhB3d\nl8IzxxNYypbsHAPAalQmGAYi5Y6tUUl0rlejoSqIkcEEcgXV836CIHS8bqNyVO3QnqHAGwcStQsD\nCdEGaFdBYZCw0cix2zGsX6shmrvfh91u3V3rcnPeKlrti0vI5lUUSka5+ykgCkCuqCOZMNeEsKgU\nwVvv3YXXZrIoqbrnfAwDiIirS4EBOEGpVqhq5nOfujyPXGF16ihX0HDkjuG6Aa/WNNx6a5H8dkD+\nwrNXPHUt7E9CncBAQrQB2lVQGCRsNHpse1jfvvF98/hrzo1PkkTf18wvFjzdTe2b/fxiwRnlsEcf\nlnNquZZDc5bIAsDkfHbNeUYlAdm89fxIRIQoGjANa5WKJArQXI3V7P1w7Bv1/GIeW5NR3FoxnEZl\nhrm6f862rXHPPjWa7u014tbspoMzmfya63LfXSM1X1trGg7AumuRKkfV8kUNS9kSBAFOOGR/EuoE\nBhKiDdCugsIgYaOZY1e7Kf7Kuw/7Pn/7cNIz2uF+3J4KsUcfDMOEbphYzJYAwFnyu1JRnGqaJibn\n89B1E6ZpvcY0TcTKbd5Xz9WqFXllIuPp8RGPilA13SqCLc/viIJVwyGKwppVLt88/ppvqJrJ5Na1\n6WDldam2m7Ct1jSc/d9uk/NZfOn5VwMXyVaOqtmjN5XN39ifhDYaAwnRBmlHQWHQsNHosU9emsPV\nm4ueG/NUOoczV9J4bHRgzfPrBaNcQUWxpJdrOawCU003cGulCFGwNp67cD3jCQq5goaSqkOKiIhH\nI9AMEyVVx9ZkzLOCxjBMZxrIPe1QKOlIJqLIF1enbKKSiOGBOI7sHV5zA68WqgpFfUM2HbQ1UvNj\nB70XX5nB4BarEVu9sFR5/Kgkev4d9DyJWo2BhKjLtTroqJqOr794A4srJecxu+ZjOu1/s/QLRof2\nDOHs1TRuzC5jKadCN1aHNcr1qQCsjq2DW2IolKzgkExEy6thStB1E4A1qiJFBMSiEWi6gb64BBMa\n9PLoiqZboSRfXK1NAYBdo/0oqjqyeRWiKEAUrALaPdu3rimgrRaqEnH//022atPBSo0EGTuYJROr\n51gvLFWeV19cgmnC0zKf/UmoExhIiMjj7NU0CiXN85i9Cd72VPVvze5g5J7yyRVUGIYJCNZ+L4IA\naxqm/LpCSYe+VMTwQBz23Eq+qJVrReD0HdF0E1uTEmLRCPJFDZIoQFXN8qZ1EgzT+u9by0UMbolh\nYamIXEGz3t8wUdIMiAKgGya++N2r+PqLN/CuN+52gkm10aazV9M45doMz9aqTQcr1Qsy7t9zj2C5\n1QpL1cIjV9lQpzGQEJHH9EIOfXHJszoEABIxyWmXXo+7DkLVDIiCAAPmamFp+Xn20l1VM1Ao6fiZ\nN98JKSLiudM3ra6mxdV9bgCrHiMqiYhF41hcKUIQBKiaAU0vwTCsniPZgoaiqiNSXrXjvN60Xl8o\n6SipBpayKv72+Vc9rfH9Rpvavemg32tqBRn372XzKl65nmm4Fb3febGAlTqNgYSIPOxaisoCz3e9\ncTdiPt+a/VaguL+h27UJkYhYblRmxREB1mhFRLSCQiImeaZRvvrCdSQT3r4gd2wfwMytvOd9DdOE\naVjLhg3TRCwagQBrCsJeOWMXwRrlRmmmYJ+7UXeKoxMdTmsFmcqRqFsVBbecbqFuxUBCRB7uEQG7\nwHNHKol77kzh+MVZLOZUDCajuHuvtSuv3woU9y7B9mhLsdwPJCIKMAwToihYPUUEAYlYBD/xhts9\njc1OXJrD5Pzq5nl24MgVVPTFJed9CyXdabAWi0aQjEeQL+rIFTUk49b7VQwgOCMzdqipVw/S7g6n\nzfYWqRaWAATau4goTBhIiMijWo3B5751CdMLOUgREZpu4PiFGRzbl/JdgXJsXwo7UklMpXPOaEs2\nr0EzDEQjIrL2qhsTMGCNlJy9msZDB8ecqZOn3n4An/jiWSxmSygUNWTzqrNU2C6yTQ0moGoGckUN\n0YiIXEHFUlYFYI265Io6pIgATQdMEbAniwTB2xhtvStKVE3HqSvzWFguYWEpj7gkYNfIlkBBYL37\nHPltpNiufZOI2omBhIjWqLzJnVBmy+Fi9TlT6dxqMUiF+cXCmlCj6Qa+8cPXnOdY/UOA/oSEbVvj\nmMnkPVMnF65nUFQNxCQR+YIVMDTNwEB/DIIA7Ez149j+FHTDxDM/fA2LK0Voulk+fxHDAwkUShru\n2DGA4a1xxKIi8kW9/L561f1zGuUOAOmlAkqqjmhERGowESgItHqfo3btm0TUbgwkRFRXvSmNyj1g\nRgYTvt/cz5RvlppuFbpGo6KnY6r7OPZ/Vzbs0nQDg1vi2J7qc95PKK+eMQEM9secfiTJRBS3j23B\nYw/d7oSjxx/ZAwCezfiqBYYgUyl2AMgXNajqapOxfFELFARavc9Ru/ZNImo3BhIiqknVrD4eiytF\nxKIRbE2kP3tYAAAgAElEQVTGnN87tj8F47KJl19No6QaMAFIEQEnlLk1fT7cU0EnlDlcnVx0Rils\n7qkT+78rG3bZvy4UdUzOZ50gFBEFCLCmY9zvOTKYWLN3SyIWweFyDUytzx1k6qNacLJ/XS8ItHqf\no3btm0TUbv4bUxDRuqmajhPKLL72wgROKLNQNb3ua8LGvim/cj0DVbM6q85kcjBNq9D1/gOjuOfO\nYWd0Qig3HrtwPYOTl+bWvJ89avKBdx3Evl2DnuBQOXVytFyH0heXPN1E++ISdqSSiEoRpBcLWFwp\nIVfQkC9q0A3TEwx2lPumuMNIerGAa5NLePbETXz+W5fw8S+cRq6grjnXei3cbfWCU70gYH9Ot/VM\nI7X6/Yg2CkdIiNqgVwoLz15NO6MQUkRARIxAkkQcvmMYP/WmvYhKEZy/loFpWqtnbKpm4MyVNB4+\nvN33fYMspXU/5+b8CgpFq+5j50g/ju5L4UvPv+oJH4IgQISJvdu3Yt+uQec9v3l8tW4lX7Ta0euG\niWxBQ0QUMDG1jE988Sw+8t57fUc+KlU+7l6VlCu/f1QSkYhFEI+K5R2LZ6tODbV6WXEnlikTtQID\nCVEb9Eph4c35FWdTPACAAMQA9EUj677BVfbT8LuB2s9x7z5sB4JoVERUEj2hJBaNYO+OrXj8kb3O\nY+4RCruQ1jQB0TWgMVtRUFv5Ore1e8FYAeDliQwWVkpYWMxDEk0oNxZRKOk4dXkepy7P1wykrV5W\n3O5lykTtwEBC1Aa9UlhYKOprayNUA3l1dfrp2P4Uzr2aXjNaYZgmTijVRwac9wswmuT3nHjU2iiv\nUNI9LdR3jWzxvLemW3vhFErWKI89tSS6pouiklhz5MNWbeojKkXw0MExDA31I5PJ4p/PT+PsVW8H\n1W4MpEQbiYGEqA16pbAwUa7fcIeNaFREX2w1YNx/YBSnLs/j2tRSeXWJjkhEwPRCDl994boTLgD4\nNvD60vOv4uL1jBMoBEFYc/P2G3Gy97ARXUMd7sDgDjF2LuiLSZC2iVhYKq5+nvJxq418+I3c+I3o\nSK4akl4JpEQbiYGEqA3Ws/9JmOwa6fe0kLdX2ewaXR2FiEoRfOjxQ1VXz0ylczh5ac5Zoms7fnEW\nAHDptVvIFTSYpomlbAmJuISYJOLm/IoTSOwbeeXy4mP7h7F7bMC3VsIdYuwlwADwxMO78fyZScxm\n8k4YsetSKvlNfVQb0fmVdx92ft0rgZRoIzGQELVBrxQWVgYrQQBuH9+6ZpM9+8Y9vZDDlM8owJkr\n6TWPX5taKr/W2uNGN0xougndUJEXBLwykcE7H9YRlSLYPpx0Vsi4R2uUG4t44pE7fKdBqo1GZJaL\n+Mh777VC0hVrxYy71X293iPV6oPOXEnjrdv6cfziLG7OryAeFctt7a1g1o2BlGgjMZAQtUkYCwsb\n3TOlMljtHN2Ctz64G9mVgmcXXlsjIwB2sBjoj2EpW3K6rJqmNS1UKOnOtM3RfSl866XXvFNHkvWc\nk5fmIEXENZ+p3ijFmaurIWnqhzmcuZrGU28/gM9961LNepZqQefm3Ao++fRpTEwtlgtnrX4nR/YO\nOyMw3RZIiTYSAwnRJtHsUmR3sJIkEbFoBNkqz602VXVsXwpTP/TeyO0+HYIgIBGXoBuqp5W8IAir\nK2qkCA7vHUZmuegpYAWAr794A6JrybH9mWpNm1Ub5fjqDybqro6qFnTyJR2vzy47vxYEAUXVcMJI\nt4+WEbUbAwlRD3OPiGTzKibns21d+VFr99nKGpI7dgwAAGYyeWu/Gp9W8u6b/66RfqcOxJYrqDBN\nE4IgOEFlcj7rfKZq02bVRjlem1vxfdz9fL+gMz7Uh4XFAjJLRUQi1u7F9meYnM+ueX439qQhajcG\nEqIeVTkisrhijS6kBhOeUNLqlR/VpqqqBRW78dkrE5mqNReVy3ftotl4NIKF5aJn+ihX0JyC2Mpe\nJ3bdyMJSAdm86ux5Y7t9dAsu3Li15tzdwagydG3bEsN3T09iKp1DUTUgCCZiUsS5zvaeNm5cAky0\nFgMJUY+qnJaISiKyeRW3losQRaHqctd28dtsz76pjw8lMTLYh5dfXQBg9Tax98KpXL5rmlbouHPH\nAAqqjtlM3nMcVTNQKOoVj+n4s69dwPlrC+XmaCYME8gVNYyUg8OOVBJP/Mhe3Mpeqrs6yv4sqqbj\n4184jRsz1siKYZqAYaJk6sgXNezbNYhE3H8UhEuAibwYSIh6VOUNLxGLwDDhtEwHrJv7oT21N5lr\nB3fIsFfPAFgdvblq9TcB1gYre9nvtekllDQDhmmuaXJm15fYzl5NO31SgNU285IoYGeqHw/Io850\nTiOro85eTa8GIsHaWNAwgGg0gn07B533OnU5vea1XAJM5MVAQtSjKm94hZKOiGjVN7hHSC5cz2zI\n1IF7RGQpW8KV129B000YhomSqjvTG8lE1DOl4Q5WdhgxTBPLORUxSbSKYmMRCAJgmICumzh/bQFj\nQ33OKMv0Qm5Nx1lBECCKAnaN9ns+f5DVUfZnee70TRiGufqeECCKQEwS8YBsHbtXetIQtRsDCVGP\nqrwR2kWf7qJRYGOmDipHRKbSOei6gYgowCgvkY2I8IQG+7wq96LRdGs/GpgGdN2AYVr9UVTdRKGo\nAQAmppfxuW9ewqnL8/jQ44ewfTi5ZjdewBpNaWypslWH8vUXb6BQ0mCaVtAzTBMiBKB8WceG+pzA\nUTnqMjKYAAB88/hrXHFD5MJAQtSjKm+E2byKV65791cBNmbqwL1rcK6gQTdMZ5M7QQAMAzAMa7Rk\ncaWIqCQ6N253sDLKrxME+x9r6mVoaxxztwoQRcGZvlE1A9emlnD2ahpH96Vw/OKsU0NiXR8Rd+wY\nCDxSYYeqqzcXsbhSAmBN0UiSCE0zrDb7EREj2xL4zZ+5Z83OxXbNSS/sAk3UDgwkRD2scpXJrYqb\nYSNTB6qm49SVeSzmVAwmo7h771Dgm+jN+azTZVU3TJiGCROACSAiCNBhwoA12mCdt4hTl+edKRc7\nWH3n1Ou4enMJhmE6wSoWjSCZWLvnjnXOBqYXcnhAHsOHHj/k7c7qKpyt9nndtSSabmAq7Z360XQT\nA/0ShISE7cP9eOJf3Il9O7ZYoyU+guwC3WjzOqJewUBCtEmsp529/c1+eiEHKSJC0w0cvzAT+Jt9\noVz7AcDZ6E6AVWsRj0Wgl+swIq7alplM3rlRu4PVSn7Cs59NX1zC7rGtmLtV8PnMq1MyUSmChw9v\nx8OHtwf+vO7wYIUgrJn60XQTg1tieOv9u/AjR3cik8kiX1Ab6n9iP84RFNrMGEiINola37yD7t/i\nnu1ppJdGIh5xRjBEQYAhWAEkFhUxuCXu3Owrp5Mqb+DVCkSf+JG9WFgurmtKxs1/d2GrPqUvLiFX\n0DzH2ZFKOvv7lGqEinrt7IOMoBD1KgYSok3A75v38YuzuO+uEcxkcmuakgXdv8X9eK1Qs2tki2fX\nYCkiAjCxf9c2PCCPQtMNfOOHr615/8obeK1RnkanZGrx+7x9calcvyI4nyURk/CuN+7G/QdGESsf\n58yV6qHCrmWxlyBXhqYg15moVzGQEIVEO2sHKr95m6a1NNbecXdxpYSoJDp9QILu32I/Xm+qodrI\nhv37qqavaS1frb6l2rLcRqZk6vH7vIIg4J0P3+67kZ/bdNp/p5/phVzd0Zp615molzGQEIVAu2sH\nKr9h2yMV7gJNVTOcPiCmaeKEMufceA/tGcKJS3Oe93EHhnpTDX4jG4f2DHl+/dTbD+DC9UygQNbu\nws9qASrIiMv2VL//48NJnL2axkwm79mTx10rw54ltJl1VSCRZflrAGYURflgp8+FqJXaXTtQ+Q3b\nXf9Q+bjdOTVf1DBVDiAnLs3hqbcfgPL6ou8qmyBTDZUrfqoFsCBNydpd+FlraqheGDq2P4XjF2Z8\nQ8U3j6+dlgJWr9N6Co+Jul3XBBJZln8BwDsB/PcOnwpRy7W7dqDym3dUEj0t1u0izagkIl9cLd60\nTaVzuHA9g4ePbMfQUD8ymaxnQ7tGpxrWE8A2qvDTb2qoVhiSyuEuViNUBLlOQTrFtgKXF1PYdEUg\nkWV5CMDHAPyw0+dC1A7trh3w6xZ66vI8Zsr7sKQGE0jEIjiydxhT6Rwm09m6K17cGp1qWE8A62Th\npx2GTNN0pr1yBRUnL83hTUd3Os+rFirCMiXD5cUURl0RSAD8PoA/B7Cr0ydC1A4bcaOqvEnef2DU\n9xvyCWUWUy+svbnXCkeNTnGsJ4B1svBzemF1M0B3/c3XX7yBhw6P1319WKZkuLyYwij0gUSW5R8D\n8C8A3APg0x0+HaK26MSNqtXf4huZ4njq7QeaDmCdHGXYPpx0RkbcCiUNZ66k8djoQN332KgpmVq4\nvJjCKNSBRJblOKwQ8q8URSnKstzpUyJqmzDcqOzzaFU4qvZN/ML1TNPH6OQow9F9Kfz99yewiJLr\nfKxanOl0czfzTtRycHkxhVGoAwmAjwI4rijKP673jSKRtTt9bnb2NeG18eJ1ASRJxMNH1vbzaPTa\nzN7KQ/DZ1mX2VgF9iajvMdZzfkGUNB1nrqQxnc5ie6ofx/annKZmQY77xJv24m++cwWqbiAaEdGX\nkCAKAnaNWst9G/lzU9J0/I9vKJh09S45dXkeH3ziUOBzasZ98ihOXZ73HHdnqh/3yaNOcW4r8e9U\ndbwmqwTTNDt9DlXJsvwqgHEA9vhovPzvgqIo9cdGV4X3QxL1sB+cncRff/vSmsd//tED+BFXEehG\nKak6Pvn0abw+u+w8dtvYVvzmk/ciFg0WAFrxHrZOXp+SquOlCzO4ObeCXaNb8OCh8YbPn1rGfzfG\nTSbsIyRvARB1/fpjsMLFv2v0jZaW8tB1o/4TN5FIRMTAQB+vTQVel+oavTb7dmzB2La+Nd/E9+3Y\ngkzG29F0PSMXQR2/OIuJqUXPYxNTi3jupRt46GDw6bKnHrurfK45bC/vY1PIlxCLNvbn5sqNBWg+\nz71yI4NDtw8GPp9mHbp90DlOdqUA/x6z68e/U9XZ14ZCHkgURfF0EZJleRmAqSjKtUbfS9cNT98E\nWsVr44/Xpbqg10aEgPe/Q15TIyFC8Lzed6+dBnYTDmpybgV+g8KvzyzD0I3AdRwiBNy3fwTYv/qY\nfaNt5M/N2LY+3/MZ25boyT97/DtFtYQ6kBD1us3QnCpIse5GLUP1K9o0TRPnJxZw8vK889hG9eQI\nS18SojDoqkCiKMoHOn0ORK3S682pGglbfstNK/fTaUVY8wsAiVjEs9Mx0LowVO8ahKUvCVEYdFUg\nIeolG92caiNHYxoNW5UjF9X201lvWPMLADfnV3DqcnrNc9fbkyPoNQjLcm+iTmMgIeqQjWxOtdGj\nMY2GrcqRi2r76bQirPkFAL9Ast6eHOyGStQYLoAm6pCNbE5V6+bYDo2GLXvk4olH9uBBeRT7dg4i\nNZhoaD+dZh3dl8KOlPeat6KOg91QiRrDERKiDtnIgsaNvjnaocq9CV1UEjEymKj6GvfIRdD9dFox\nDdWuOg52QyVqDAMJUYdsZEHjRt8cj+5L4fjFWZy/tuDs+xKVRJy6PI/7D4zW/YxBwlorp6HaUcfB\nFTREjWEgIeqgjSpo3OibY1SK4L67RnBtaskZHemLS5jJ5H1rKPxGOuqFtbDXaHAFDVFjGEiINoH1\n3BzdYWHn6Ba89cHdgY45v1hAMhFd83jlNJGq6fizr13whJfjF2fxoccP1QwWnazR8AtQfnvAcAUN\nUXAMJESbRDM3x8ppEeHSHM69uoCnHrsLYp3tN4JOE528NOeZ2gGA89cWcPLSHB4+XH0DvU7VaLiv\niV0j8/ffn8ATb9qLH394b1uPTdTLuMqGiKrymxZ5fXYZZ67UX50TdPXKmStpTxgBAFUz6h6jXatj\n6rGvid0rZXGlhJmFHL743FV88unTKGl6W49P1Ks4QkJEVVWdFknnPPu4+Kk2TQRYq2jsx4wmdxzv\nVI2GfU3s1UM2VTOcsHbf/pG2ngNRL2IgIaKqqk6LpIJNi1ROE/mtjIlGBEiS6Nl0LSqJOLa//khH\nJ2o07GtSOaoTLdeQBAlrRLQWp2yIqCq/aZHbxrYGCgt+/KaASpqBnal+DG6JIZmQMLglhiN3DOP+\nA6NNn3c72dck6ipitVcRAcHDGhF5cYSEiKqqnBaxV9lkVwpNbSPvNwUkCALuvnMIu0a2dMXyWPua\nnLw0h6+/eAOFkoa+uARBWF9YI9rsGEiIqCb3tIgkiYhFI8g28Hr3EtlsXoVpmmtawu8a2RJo6mUj\nNwisJSpF8PDh7bj/wGjLwhrRZsdAQkSBqJqOU1fmsZhTMZiM4u69Q3XDQGXNiGmayBU0JBOSE0qC\nrozZ6A0Cg1hvWCOiVQwkRCEUlpEA9/l89h8uYnohBykiQtMNHL8wUzcMVNaMCIKAZELC4T1D6O+L\nNvTZgnRmrXXdwnZNiciLgYQoZMI4EmCHAfdMS5A27dVqRvr7onj8kb0NnUO9zqy1rhuA0F1TIvJi\nICEKmTDu0dJsm/ZWdlOt9161rpv9336/t55r2mxb/VYcj6M81GsYSIhCppN7tFTTbLBo5aZ+9d6r\nmeu2nmu6nrb6rTgewFEe6i0MJEQh06k9Wmqxw4D7Bh4kWLSym2q992rmuq3nmp69msbkfNbp2BqL\nRvDaTPs6tZ68NIerNxc9uyd3euSMqJUYSIhCppWjCq1ih4GXJzINrbKxX9uqG2at96p33Vp9TW/O\nZ5FeLDgdW3NFDbmihptzKy0PJKqm4+sv3sDiSsl5LFfQkBpMdHTkjKiVGEiIQqZTe7QEOa+HDo5h\naKgfmUw2dL026l23Vl/TQsVeNgCgqgbypdZvrnf2ahqFkuY9lmYgX9Q6OnJG1EoMJEQh1Ik9WnpB\nrevW6muaiEcQlURPKIlGRfRFWx8cpxdy6ItLyBW8ISgRkzo6ckbUSgwkRERN2DWyBanBhFNDEpVE\nbO2PYdfYlpYfa/twEoIgrDneu964u+MjZ0StwkBC1MO4TLR9KmtWBAHYPT7Qlr1s3MdKJqIArBqY\nsG5ASNQMBhKiHsVlou3V6o0HGzkWwyX1IgYSoh4VxgZrvWYj97JhXRH1OrHTJ0BE7RHGBmtERNUw\nkBD1qDA2WCMiqoaBhKhHHd2Xwo6UN3x0usEaEVE1rCEh6lEshCSibsJAQtTDWAhJRN2CgYSINgR7\nohBRLQwkRNR27IlCRPWwqJWI2q5WTxQiIoCBhIg2AHuiEFE9DCRE1HbsiUJE9TCQEFHbsScKEdXD\nolYiajv2RCGiehhIiHpQGJfYsicKEdXCQELUY7jEtneEMVgStQsDCVGPqbXEliMU3YPBkjYbFrUS\n9Rguse0N7N1Cmw1HSKgrqbqK8+mLmMnNYTw5iiOpg4hGojwfcIltr2CwpM2GgYS6jqqr+PzFv8FM\nbtZ57PTcy/ilgz/XkRAQtvM5ui+FE5fmPN+uucS2+zBY0mbDQEJdxxqJmPU8NpObxfn0Rdw7ds+m\nPx8use0NDJa02TCQUNeZyc35Pj6bm9/gM7GE7XwALrHtBQyWtNkwkFDXGU+O+j4+lhzZ4DOxhO18\nqHcwWNJmwlU2FDqqruL07Dk8M/EsTs+eg6qrnt8/kjqI8aT3f9LjyTEcSR3cyNMM7fkQEXUjjpDQ\nhqq3GiVIgWg0EsUvHfw5nE9fxGxuHmPJkY6uagnb+RARdSMGEtowQcJG0ALRaCTakYLRasJ2PkRE\n3YZTNrRhaoWN1V+Hr0C0G9Sb5iIiCjuOkNCGCRI2WCDauLD1QSEiagZHSGjDBAkbLBBtXJCRJyKi\nsOMICW2YI6mDOD33sufmWRk2WCDaOE5zEVEvYCChDRM0bPRygWgz28nXW5nEaS4i6gUMJLShejls\n1NPMdvJB6kOCjDwREYUdAwnRBqm1nXy1bpxBlkFzmouIekFXBBJZlncC+ASAtwHIAXgawH9QFKXU\n0ROjTa3eVEqlZraTD1ofsplHnoioNzQUSGRZ3gtgCMBZRVH0it+LAnhEUZTnW3d6ji8CSAN4E4AU\ngM8C0AD8+zYci6iuZpbaNrOdPOtDiKjVZFn+MwC6oii/Vv61CGASwBOKorzUqfMKtOxXluUhWZa/\nBeAqgJcAXJdl+YmKpw0D+E6Lzw+yLMsA3gDglxVFuagoyvcB/O8A3tfqYxEF1cxS26P7UtiR8oaP\netvJcxk0EbXB5wH8VDmIAMDbASx2MowAwUdIPgZgHMBbAJiwRib+TpblX1UU5bOu5wktPj8AmAbw\nDkVR3GPUAoDBNhyLKJBmlto2s50860OIqA2+A6AI4McBfBPAL8AKKR0VNJC8E8B7y6MTAPCTsiz/\nPoA/kWV5UVGUvy0/brb6BBVFWQTwLfvXsiwLAH4DwD+2+ljUexqt8wiq2amUZraTZ30IEbWSoiim\nLMt/BeC9six/F8BPA3igw6cVOJBsAeD5Sqgoyr+VZTkF4POyLD8G4FKrT66K/xPAvQAe3KDjUZdq\nZ0t1LrUloi73eQDfBvD3AC4qinK1w+cTOJCcAvBhAP9LxeO/CuB2AF8B8GstPC9fsiz/HoB/DeBJ\nRVEuNPLaSIRd8ivZ16RXr83Z9CXM5OcAYXUmcSY/hwu3LuH+cWvEQdVVnJu/iJnsLMb7x3DPyEFE\nItZfi1rXRZLieP/dT+Lc/EXM5uYwlhzFPSO9P5XSyJ+ZkqbjzJU0ptNZbE/149j+FGJ1msB1s17/\n+7QevDbVdeqaKIpyWpblKQAfBfCZjpxEhaCB5D8CeEaW5XcAeL+iKD8EAEVRNFmWfwrA1wH8ZZvO\nEQAgy/InAfxPAH5JUZS/a/T1AwN9rT+pHtGr12Zp6hYkn7/sy+Yihob6UdJVfPr405hcmrZ+I30e\n529dwK8/9BSAYNfl0ZE3tvScu0W9a1NSdXzm6dN4fXbZeuDyPM69uoDffPJexKK9G0qA3v371Aq8\nNqHzeQD/GcBfdfpEgICBRFGUH8iy/ACAf4mKwlVFUVZkWX4UVmj531p/ioAsy/8HrBGY9yqK8qVm\n3mNpKQ9dN1p7Yl0uEhExMNDXs9dmQNwGzedzbRUGkclkcXLmHG5kJj2/dyMzie9fPYm3HXi46nXx\nG1XZqJGRTh4bCP5n5vjFWUxMLXoem5haxHMv3cBDBxuroekWvf73aT14baqzr02HXAfwj4qi+Ffp\nb7DAfUgURbkE4D/JsnxNluX3KYryguv3VFmWC2hDUassy4cA/DaA/wrgB7Isj7uOOxP0fXTdgKbx\nL4KfXr02h7YdwMm+s2vqPA5tOwBNMzC1PAOYa//ITq9Yz/e7Ln51KSenz7akLqWeTh67Ur0/M5Nz\nK36XFpNzK9D293YPlV79+9QKvDbhIMvyAIA7AfxbAP+lw6fjaKZT6wsAvivL8u8A+F0AewD8BYD7\nYI2StNpPwuqX8tvlfwBrlMYE0Ntjv7Qu9ZbMVl8p4/84EKyVe7vYxzZNIFfUoGoGsoVJnJl7BQ9u\nP9bWYzeqmSZwRLRhDgB4DsCXXKtkO67hQKIoyvtkWf4KgP8GKyzIAE4CuFdRlCstPj8oivJ7AH6v\n1e9Lm0OtJbPVVsrcM1J9pUwz/UdaZSY3B9ME5hcLUF3fMv/h9AUc+/G76+4avJGO7kvhxKU5z949\n9ZrAEdHGKDdA29Lp86jU7F42XwfwLICfgdXC/X+0I4wQtVPlCMpwYggA8I/Xn8e+wu24I3EHhIpB\nuE62ch9PjjojI265xXjNDfo6oZkmcES0uTUcSGRZ/mkAfwSgBODHADwE4FOyLP88gF9VFGWy1uuJ\nwsQeQfHUZwgCzqbPYyQxgvcd+FlPfUYn+48cSR3E14wXAayOxkS0rYjnd9TcoK9TmmkCR0SbVzMj\nJF+EVTPyG4qiLAN4TpblZ8qPvQJgWwvPj2hD+NWGTGfX1oZ0spV7NBLFj48/jr8788/QoyuIqFsQ\nz++AgEjX1ma0q5MuEXWfZgLJz1UWwSiKclaW5QdhFbkSdZ1GakM62cr9/v3jOHP5QE/UZrSzky4R\ndZ9milp9K3IVRVEB/Lt1nxFtKmH5htzJ2pBG9FJtRidXLBFR+DRb1Eq0bmH6huxXG7K9P5x70/RK\nbUYnVywRUfgwkFDHhOkbsrs2ZL6Yxp1jt1mrbMzuGXkIy2hTUN0yKkVEtcmyHAfwx7BW3uYAfFxR\nlP+r0fdhIKGOafc35EZv0HZtiCSJGBrqRyaT7Zquko2MNoUluHDHZKKe8fsA7gfwVgB7Afy5LMsT\njTZdYyChDVN5I0wlhn2f14pvyGGaDtoIQUebwnRdOrliiYhaQ5blJIAPAfgJRVHOADgjy/LHAPwG\nAAYS2nj1vnX73QhH+0Yw2jeCufzqiEirviGHaTpoIwQdbQrbdenkiiUiaoljsLLEC67H/gnAbzX6\nRgwktG5BvnX73Qjn8vN49Pa3QBIjLf+GvNkKJoPWY2y260K02bz7I18+DODDAA4CuAzg01/5+HvO\ntvGQOwDMK4qiuR6bAZCQZTmlKEo66BuJLT812nRqfete/bX/jXChkMG9Y/fgsb1vw71j97RsuH4z\nFEyqmo4Tyiy+9sIEigspjPZ5P7PfaNNmuC5Em9W7P/LlcQCfBvAIgCEAbwDwx+/+yJdva+NhkwCK\nFY/Zv4438kYcIaF1C/Kte6NuhPbU0eTKNGJiDEW9CEEQyufQvQWTlVNiB7bdhc89c9XTIG08dTce\nfcjEQmGh6mgTC0mJetq7YQUEtwSsjXD/uE3HLGBt8LB/3dCeFgwktG5BwsZG3Agrp45M00QsEseh\n4buwo3+8awsm/abEnr36EpbShzyb/82kixAW9+Ax+VjV92IhKVFPG6jy+GAbj3kTwIgsy6KiKPay\nxO0A8oqi3GrkjRhIaN2ChI2NuBFWTh0JggDVKGFH/3hXF0761t8U5oG+KSTy3pHYIJvssZCUqGd9\nF5/UWlIAACAASURBVMD7qjzeLqcBqADeCOAH5cf+BYDjjb4RAwmtW9Cw0c4boaqrODV3DovFZURF\nCX1SwpmqCWvBZtB+IH5TYlFJRCG6AuS9j3frJntEtH5f+fh7Trz7I1/+EwAfhHV/1wH8xVc+/p4f\n1H5l8xRFycuy/OcAPi3L8gcB3AbgIwDe3+h7MZBQS3TyW7c9pTGxeAN5LY88gJyWRyoxBEEQ2lan\nMpObc3qppAsLTqgAUDdoNNIPxG9KLBmXsCWRQn5p9bFu3WSPiFrnKx9/z5+8+yNf/hsA+wBc+8rH\n37MR38j+V1g1Ks8CWATwnxRF+XKjb8JAQmuEpZNnUPaURp+UQE7LQzM0aIaGvFbAHYN72lanYpom\n0oUMADjh5+SstbrO3VvFL2g00g+k2j47T977Y7hwbanrN9kjotb6ysffswBgYaOOpyhKHsAHyv80\njYGEPMLUyTMoe0pDEASkEkPIawWohoY7Bvd4zrsVQcsdJPJaAZqhOf+djPbh+tJrAIBktM91fmuD\nRiP9QGpNiT0gJxo6fyKisGIg2YTsG/NcYR77xm+3NpErr9YIWyfPINxTGoIgOGHg3tG7PWGkFUHL\nHSRUQ1vz3+7H3CqDRr2VSX7hKazXn4ioFRhINhnPjVkQcDZ9HiOJEbzvwM8iGol2ZSfPIKt8WhW0\n3EEiKkpOTWlUlDz/rlRZx1J5zqZpIh6JY3JlGkW9iO/d/GcsFDJOgW7YR6mIiNaLgWST8bsxT2dX\nb8zd2MkzyCqfVgUtd5Cwa1YAoE+ypk72DNwOAHX353Gf81R2BhcWLqOoF3F2/jxm8/NQdRURIQJB\nEJxjNBqeuq0WiIg2NwaSTabejbkbOnlWu9HWulm3KmhVhp/hxBAAqwW+HYQABOq34pzzLHB2/rwV\nPlSrKNcEYJgGBAgo6kVkCos4OXs2cLjoxlogItrcGEg2mXo35rB38mz2RtvKoBVkiXMjIxmVdSkC\nBJgwYMAETAGAiayWw8vzFzCbm4MgCHU/czfWAhHR5sZAsslUW0Ja2VXV76YVhimAZm+0YQ5alXUp\ngiBCMHWYAKw4Yv3bgOms5qn3mbuxFoiINjcGkk3GfWOeL6Zx59ht1iobs3b/irBMAdS70dYKTWFt\nme5fl2LCME1YcUSEKIgQ4F3FUytcdGMtEBFtbgwkm5B9Y5YkEUND/chkstA0o+ZrwjIFUOtGG5bQ\n1Ci/upSJpddwcvYMoqIEE8Byadl6bnkVj2mayKo5PDPxrO9oVTfUAhERuTGQUCBhmQKodaMNS2hq\nRuXozbHRI1hRV5yOsHnXah7TNJHV8lAyl539eiqDV5inqIioN8myHAfwEoD/WVGU5xt9PQMJBdKu\nKYBm6lLuTh2CXVlxd+oQjo0eqdtDpdHjlHQVJ2fOYWp5piP1MrVW82TVnCeMAP7BK6xTVETUe8ph\n5C8BHG72PRhIKJB2TAE0OsXi93zAGk2wzsc/NA0nhho+zqePP40bmUnANOs+v/K1zRb+Bu3O+szE\ns54wYmPBKhF1gizLhwD8f+t9HwaSHtOulTCtmgJwn19OzWM6O1P3m76t3pRMtdBkP6/a6yqdm7+I\nyaXpwM93f7Zma1jWu/svwIJVIuqYtwD4NoDfBpBr9k0YSHpIu4s61zsFUHl+i8VlqIbq7JRrq/ZN\nv14dS7XQ9Oxr3yvXYVib7tnt2KseJzvr+3i9EYj11LCsd/dfFqwSEQA8+YUP3w/gNwHIAK4A+KOn\n3/upH7bzmIqifNr+b1mWm34fsSVnQ6FQ66YWBpXnFxUlaIaGvFbwPK/aN/0gIwN2aHps79tw79g9\niEaiSCWGkS5ksFRaRl7LY6m0jHQh49RlrDlO/1jd47ipuorTs+fwTzdfRE7NwyxP89jcQcZ+7jMT\nz+L07Dmougqgud1/H739LRhPjmEsOVquqyGizezJL3x4F4BPArgHQAxWPccfPvmFD+/t5HkFxRGS\nHhKWlTDVVJ6f3XPD3Vuj1jf9jRoZuGfkIM7fumDVkNQ5jnvUJ6daYSen5T2jPu4dfKuNYDUzDfNy\n+oLzXt/OfRcvpy+EfokzEbXV4wDiFY9FAfwkgE9s/Ok0hoGkh4S9tqDy/ARBQCoxBHnoLvRHk3Xr\nUpqtY0kXFpBKDK2ZslkoZKoe59cfegrfu3wC08uzNY/jHvWxA5Y96pOM9nmCTK0RrEbDlv1e7qmo\nnJrHmbnzeHD7vTWvBxH1rGSVx/s29CyaxEDSQ8JeW+Dftn4cT9z5WKBv9c0W7I4nRyEIgrUjb/nm\nDa1QdcoGAGKRKO4fvwdaam3DOPd5TGanYZomBEFwAlZeK2A0OYIf3fmw5xxrjWDdO9ZY2JrJzcE0\nTaQLGWjlEaY8gG/deM5ZBk1Em86zAJ7yefzbG30izWAg6SFhb4a1nvNbT8HukdRBnJw9iwsLl5yb\ntypKODt/vuGbd+V55NS8Z4pGEAQko3340Z0PrylGDbKxof2aeuFrPDmKvFZwPo+toBW6ohEcEbXe\n0+/91Nknv/DhPwDw67BGRYoA/vTp937qpc6eWTAMJD0m7M2wmj2/9axgiUaiODpyBNeXXvNM2czl\n5wPfvO2AcGruHCYWb6BPSjijLjkt70zRANVHpYKOYAUJX0dSB/H1iX8Eyi3lAUCqs3qIiHrf0+/9\n1Oef/MKHvwxgN4DXnn7vp5brvabFzPpP8cdAQl1hvQW76cKCExgafb07ICwWrZU67lGRVGII2/vH\nsbN/e81Rn6AjREHCVzQSxWO734avvPoNT8gSBCE0NUNE1BlPv/dTKwBe6cSxFUWpvVNrDQwk1BWC\nFOzWmuZIJYaRU/NN3bzdASEqSsgDnsJVQRBw7+jdgUZagowQBQ1fx0aPeFbaAOGqGSIiagQDSY9p\nV6fWTqs33VFrmkM1VHz39e9jsbRkFaBCQE7L49DwgUA3b3dAcK+ksZcrtzoE1GqBf3r2nOdnG+aa\nISKiRjCQ9JB2d2rtpHrTHdWmOc7Mncf3br6A11cmAQgATEAQ0BdJ4OhIsIJWd0Bwr6S5Y3AP7h29\nu+UhwC98jfaN4Oz8eczlV0dJ7J9t2GqGejUUE1F7MZD0kPUUfm4k+4Y1uTKNol5CXIpjZ/943RtX\nremOatMcL6cvYC6fBmDFEUGwmhMLguD0Iam8gR4b925WWRkQBEHAHYN7nKBnd1+tvAE3e2P2C1+a\noePbr3234jOH82fbq6GYiNqLgaSHhL1TK7B6w5rOzjg9NCRRQioxtK4bV7VpDsB06j4852FoGEuO\n+N5Az6TP41+/6ZedX7sDwtTKDAp6EXEpjvPpizgwtA9PX/qy5/UnZ8/i8PBBPPv68yhqRadepZHP\nVxm+npl41vd5YfrZAt0TiokofBhIekjYO7UCqzcsdw8Nu0DUfeNqdHShWo3J3alDmM7OOnUftuHE\nEDRDx+cu/rWzjBcA8loBysIVPP3yV/DYrh+DAKtgPBqJrjnGufnzePa1f0JJLzpt4k3TxIWFS7iU\nuYqiXgQAZ0XOem7M3fCzBdoTijkFRLQ5MJD0kLB3agVWb1hqRUMv+9dTKzPQDB3fvPGdhkYXopEo\nnjzwHjwz8R3cXJnCri078BN734aoGMXL6QsA4LRYT0TiKOjF8pJZFXmtgKyagyAITmj5p+vHMb2Y\nxvsO/KynTmU6O+NpQa8aS4iKUWdJsR20dMHq8GoCKOklpAsZJKU+TGVncC8aDySt/tm26ybf6uDE\nKSCizSPy0Y9+tNPnsBE+WiioMIym+7V0hYgYwZHUQQzEtmIgthXHRo/g0d1vrvo/blEU0NcXw0Ze\nm5XSCq4uXoNhGijqJefxpNQHSZRwq7iIs/PnkSncQlEvoaiX0CclkNVyGIhtxfb+cd/3VXUVf6V8\nCTeWX4NqqEgXFnB96XUcHTmMoyOHMRgfwLb4IHJaHjkth1vFRRT1EjRDhwlAN3Xopu6MdPTHkiho\nRc8xT86ewysLihM67NeLgoiEZO1nlSv/XjwSg2bq0A0NBkwYpg7VUFEyNDw4fi8iYgSqruLc/Cs4\nM3ceK6UVpBLDiIj+S/j9frZvvu0RXFy4HOj1ldfq8xf/BmfmX8Z0bhZXF6/h1cXrOJI66Hm93/lF\nJanmn5lUYhivLl5HVs06j40nx/Do7jcHOrdK5+ZfwZn5lz2PZdVszT8LndKJv0/dgtemuvK1+c+d\nPo8w4AhJjwl7p1b7m/50dsaZRrE7jMYicRT1omf0xN3vo9awf73ahXvH7gFmgbPz56EZuvMc0zQg\nCiI0V3NBKRJFMtYHXTc9xyxqxTWt2k3TcKZ7AKtPiSpKGIxtRSlfgv1sAQIkUUJJLzqb6TX6zb+y\ntXyzIwdB6jyqvf/7736y5nu3evuCbqiLIqLWYCDpUWGdd/crEE1IcezoH8dkdgbn5s+vKUK1A0qt\nYf8gNy77Oe73FwQB8UgcMcSgmzqSUh/6on0QykuE3ceMR2KQRMkTSqKRKO4buQe3DezEbG4ew4kh\nZ3luPBJ3Rl3iYhyiICKvFTCVnSmfT+PFn/bP9fTcOVxztbAP+vqg16paaDk3fxGPjryx5vu3MhR3\nS+0MEa0fA0kPCvu8u33DWruR3Cxyah4JKe4pQo2KUt16iSA3Lvs57uZmgLWz756B2wHA6vNRvsGP\nl5fbPjPxLMaToxhLjjo9SNwdX7dvsaYOTJiQxAh+Qf5pvJK+hOdvvoCp7BQ0Q0exXPia1/I4PnMa\nA7EtyBQWIQoComLUCRa1vvnXa2EPVB85cAfUnJp3diiudq0qQ4tpmshrBXzv9RewZUscdyTucAp+\n26kb6qKIqDUYSHpQNy29dC8Dzml5LJWWsVQSMdo3bPUoicRxYGg/ktE+Z6rDL1QFuXG5n2MHi4QU\nx9t3vw3HRo8AsK7dfDGN3SM78P1rJzy9P0b7RjCWHPU0J/NrWHZy9iwAoKQXof//7d15lFxneefx\n762lu6paaqlVvUiyhLGNdSVLsuWFQAiOwU5MZoYMBwKEQIIJCYFhGCDLH0MmIXMyYc4JE5IDZDGZ\nbCYJc0IgLIcQ7IAMg0LiMdhaLd22vEiypd5baqlrvVV3/rh1b1dVV1V3Vy/3dtfvc46P3aXuW2+9\nLvV96nmf93mdMsWyjQFEnAiOAZPZKSazU272BIhGYmTsLNu6tzJbzPgB0J6+mxiefsbPctnlUssW\n9tA4c1AfoDqOw6ydpSeW9IOS+rmqDvAcx/G3aGMYfOmpb9Cf6K8p+F0tYT/BWkRWjgKSDWg9rbt7\nO1f8Gx4GZadEtpTnP7z0fp6aOsMzV54F3G22zTI9i7lxLeZ7Dg0eJBaLMDw7PG++xrMT3Lf7HmKR\n6LyGZV4GoVi2mc5doSsSp6crRSLaTalcqmRP4pScEo5Tpozj9Y3FqQQtlwszWNNPYxgGjuPwxbNf\nqwkaSk6ZCEbNKcOLaWFfH6AahkFPLInZdzM98VTDeagO3rwiXq/WB2Bkdu0C3LDXRYnIylBAsgG1\nWr6oTt3v2DzE3b13rsmYmtW0jGbGa3qSeN1US+USl2ZHajIPACOzo3zt2UdIxZPzamMWc+Na7M3t\n4sxow8enctPc/9LX+l8//Pzh2gwC7o6dnBElFU8Sj8SJVLrDlp0yjlOm5JQxMIgYUcAhFolVvs/w\ng4+sneNa4RoRDD/7kbfdvibegX6LaWFfLBU5On6CK/mrNYcKGoZBItrNYKrfD2Dr59IL3o68+BhA\nTb0KhDPAFZH1SwHJBtRs+WJP3001qfujEyc5dfk0b3vZG1e1HqBVTctQamBeTxJwlyRenL1U85h3\n43989Em2dG+uuc5Kp/B39g65WY+6E4Lrl0SGUgM1ARW4O2ocp0zWzvmZjGKpiINDyfH6k7hbgaNG\nlE3xHv85PN6ceP92HAfHcSg6NhTngoPqFvb1vHl/7sp5snaWLHNN2gDOTD/N8clT/vfXz2V18Pbw\nufmdYlVYKiIrKRL0AGTleZ9uX3f9vdw+cCuvu/5e3rH3zZV6hNrakoszI5yYOLOq42lV07I/vZf+\nZLrmz7ylget6dtQ87t34q2/c3nVW2v5Bk0wxw0zBLR6dKVxl1s5yw5aXcHTsBA8/f5ijYyfY03cT\n3ZUeJJ6uaBdd0S63dqSSyUgnt5GKJ+mKxolFYnPLNYYbdCRjCRLRuet4rzEeifmB2NXiNeKG+7iD\nw32772kZjHnznowliFWu59WceFusqzWby/3pvQylBmse296jwlIRWVnKkGxQjZYmmteWjEO64R+t\niGbPe+mauyxy89YbmS3OkrVzcztXeoZ43Utfy5XhGT+YKdbVMcyNf+GdJenENgAmc1OL2gZ9aswi\nFU9hYPjZi0Ssmz8/+TmK5bmGbkfHT3Lf7rv5+nPfrMmkADU1Gt6WZq/WpFAukrGzRDAoO2UyxSxl\nymzt6iUSiZCMJSjjkIwlamo4vOUagFgk2vI1ePNevbxTLNvcsOV6BlMDnJg4Ne9nGs1l9fLNRH6S\nGwd3ubtsnNXfZSMinUMBSQdpXlvS7GC61Xlex3HIFLN8b+RxIrgFmvFIjJ5kmn3bbmZH1cm/fjv4\n2Uts7drCVH665XZVT/UykZdhAPwtsgst9VycGcUw5uo3ADLFLFcLs/5yEbhZhQPpfdyw5fp5S2Sv\nv/H+ueuPuUW5/jWLkHWyGIbhZyocwHZK3JU+yI5NQ9yw5SUcPn+EYxOn6I52s6Vr85JqOKrnvfq1\nHBo4ANAwIGm2DOMFuLFYhL6+HqanZ7HtcsvnFxFZCi3ZdJBGqfedvds52L+6qffq551bfpjlauEa\nM4WrfrBQLBfY0TPEocGDxKNxiqUinx/+CsOXzzJbnGU6f5mMncNx5rqqLmZniZdh8JYrYOGlnp29\nc23JvQDqWnG2Upha2/p6KjfdcImsftdK9dy7yzkRylUdYo3KWHdscgOyL539OsOXz+I4ZfKlPFP5\nyzXPvVANR6P/3958tfqz9ahYKtYspRVLxaCHJCJLtC4yJKZpdgN/DLwJyACfsCzr94MdVWth7JRa\nv+11++ZB7r75TmZnCqv6abf6eY+On6wsHRT94KBZe/h2tqt6qpeJqotmq/+7VYbh9h0H+O6z3+fS\n1RF/B42BQc7OMemUapqRDab6F9y9Uz/3s8UMj48+4c+B/32RWGVcc6+9eouvN0+LCR4W2uZcnX26\nrqdyGOE67O8R9kaAIrI46yIgAX4PuAN4DfBS4LOmaT5vWdY/BDmoZsL8C7L6xhmLReiKxpml0PT7\nVyqw8p53NDNe6cgKWeZuxo3awzeqPTEMg554qmbrbSPVyxXVreK9ItGsnePF2UscHTvR8DV1ReO8\n85a38OXhb/D46JOkYkkS0W6m8peXHBjUzwG48/rczHkuXH3B//NY1U6e6tdeXQMykOrn1Ttfsej/\nD80CJS/75L1Hhy+f5crwTCjeo0u1nhoBikhzoV+yMU0zBfwC8EHLso5ZlvUV4OPAB4IdWXOtfkGu\nJ15g9fC5wxwdP8HD5w7zt2e+sKx0eHX79ljVbplG7eGXc45J9ZKE91yxSIxEtJvJ3DQZO8vo7FjL\n1xSPxknFk2zp3kwqniQSiZBO9NHbtZmBVH/DpZnFikfjvO/WB3jJ5l0kY0l6uzazLbGV7mg3F6+N\n+O3dPV4NyKt3vsJf0lqOjfIehfXVCFBEmlsPGZLbcMf5r1WPHQF+PZjhLGyj/IJcjU+ee/pu4vCF\nI0xkJ93dKA4k4wm/fXuzbqGeRhmJZlmc6uWKbZXeGycnT5Mr5Rd9KF19UFQfGCxHKp7iA4d+0T1o\ncHaU01NPky/lOTH51KLauy/HRnmPgg7gE9ko1kNAsgOYsCyrunvWKJAwTTNtWdZkQONqaqP8glzp\nm5a3TFAo5YlHYhTLNgPJNO+99QFS8dS8719Mq/eFlsfqD/C7Vri2pNfU7uFui13q8sc4Bscru3Bg\nafUy7dgo71HQAXwiG8V6CEhSQL7uMe/rbkJoo/yCXOmblpdxqd6CWigXGJ5+pmm2oVFQUX2TX0wW\npzpoyRTdJmfeYXa5Up5i2Wa2mKFYKrZ1Rk69dmqIllMv046N8h4FHcAnslGsh4Akx/zAw/s6s9iL\nRKNrVy4Ti3XzwIG3cmLiDGOZcQZTAxzsD98vSG9Oms3NbUO3cGzyFCOzczet7T2D3DZ0C7E25nM8\nNwF1PUQAJvKTxGKtr1csFfnc8BdrxnJs8pQbNC1wzeOTw4xmx8EwSMaTZEo5iqUiY7lJcBxi0TjW\n5bPMDF/lnbe8hWg0RqFU5Oj4SS5dHWWo8poX+/+v+vnA3Tb83Mx5Pmd9gduHbm34XtixeYijEyfn\nXWv75sEF56Yd7b5HF3rPBCUW6+aunbcFOoawzk0YaG6a05zMWQ8ByYtAv2maEcuyvL2p24GsZVmX\nF3uR3t7kwt+0wu7rf+WaP2c7Ws3NB3/kXTx56SSXro6xY/Mgt+84QFebgdVNQ7trzk7x3Di4i76+\nnpY/+9gLTzKRm6gJhCZyE2zfkm4YHFVfc+bS5ZrvGdqUZip7mYJdpDexiVRXEgODidwEz+We4/a+\nAzz4+N9wcWbE/YHJU5y6fJr3vfxnF/Xaq5/PwWF8dopCyebslWeZyE82vNbdvXdy6vLpuefE7RFz\n9813tj3fi9HuezSIv0/rheamOc2NtLIeApKjQBF4JfC9ymN3A48v5SIzM1lKJXWWrBaNRujtTS44\nN3t69rCnZw8AszOFltuEW7khcQP9if55GZcbEjcwPT3b8mefGb2A3WiMxciC1+yNbJ33s4Zj0BPv\noTuaoFRyoNKg7NmxF8hkClycGaFUmmtbdn76It99+gfcMdR4aalYKnJi4gyjs2PMFrMU7RKGYZAp\nZinY7g6eCDHsUrnptd72sjfOy1gsZ75Xw2LfM51Ic9Oc5qY5b25kHQQklmVlTdP8LPCgaZrvBnYB\nvwo8sJTrlEpltbpuYq3mxiDK2/f81Ly1fsOJLvj8A4l+qJx4653JEo/ESHenuXfXjza8Zjaf59Tk\nGS5eG6HLiJMv5f2i0f5E2m3ZXtd1tb87zaWr7hk7DtT8+cjVMez0/HHWt6nP2FkydpZULEmx5NZi\nxyIxktFu/3qNrmUQ5db0/rlzhRxC+57V36fmNDfNaW6kldAHJBW/gtup9TBwBfjNSj8SWWcW6mja\nzP70Xp4YO87pqWHsShO1YiTG8YlT3Dawf9416wtLy+UytlNiS1cvuzdfx70veTVfOvv1hkWdpy8P\n40yeJFPMuoWuVQ3L6hVLRb727CMMTz9DzIiSLblt6h2gUCmS3RzZ5BfxZorZlkW0IiKdal0EJJZl\nZYGfr/wTCmFsDb9etDN38WicW/v3c27mQs2puuPZiYY9RKp33ziOw1T+sh8IjGTGeG7mPL9w4O08\nd+X8vJ0Ze/tu4h/Ofo2Z/AwAWaCMw56+m/zxHxs/xbHxkzw/c4FcKUuxZOPgUHbKRCMxDCBiROiJ\nJemKdlMo5f0W9LFIDGv6aa6cWZ+dUUVEVsO6CEjCJsyt4RerWCpyfHKYmUuX6Y1sZd/WPW2NfanB\nxXLmbjI3VXP6rqdRD5HqbbTeEk+pbJNxSkSNKOdnLvCpJ/83dw4dYmfV6cIAJyeHwYFYJA44JKMJ\nUrEkw9PPsD+9l78+/XlOTw1TKBUoOXPpZwN3mcdxyhhGhHgkhmEY7Nt2Mzk777eg95qyLaXJXP08\n7+m7ieHpZxQQi8iGoYCkDSvVwTSoLIsfFGTHiUUj2KUyTySPLzmgaie4WM7cLaUvSvX3Fss2juMW\nqEYwcByHklNiPDvBY5e+Tyqe9McN8PBzh7mSv+rXe2SpPvjvDOdmLlSWZZy6Z3VDEgfHP5cGYEfP\nEKOZcbZ0b543zmYN2arfG+nENo5PnGI8636v4zh88ezXarq4Npt3ZfJEZL1QQNKGlehgupxMwXJv\nMn5QUNW/o52Aqp3gon7uvCLVIxcfA5j3yb/663RiGwPJfv/GDM2beVU3/opHYjg4GICBUQkZ3OCk\nUDnDZnj6Gb727CPs3nwduVJtHz7vMD3v0DvvIEDDz4lAxDDojnRTdGwS0W62dvdiGMaCzcaa1aVU\nvzcyRbdI1jthOGvnuFa4RoS5BnON5n0jZPJEpHMoIGnDSnQwbTdTsBI3mZVqCd/OdarnznEcv64C\n4BvPf6vmk399JsBxHOLRLvqTaaJGlAPpff75N42CNK9756XZUR4fPcpUdgrDMCg7ZSoN2smX8uRK\n7qnDj48+yenpYRLRbnJRd7uu47jhS6FcxC6XSCe2+acHG0YEnHIlwDFIxhPs630Jt/bvZyo3XVOX\nspTOqPXvjWLZrjlh2AuIvH83m3edgisi64kCkjasRNvtdoOClbjJLBRQLTYDs5jArFHtgzd3WTvn\nF3kmY4l5n/yrv07GEn7wMpOf8TMDtw3sbxmkHRo8yCEOcs+uV/GZ4w8xnp2kVC6RLeVwKGM7DhEj\ngoF74nDezoNhMNCTZiY7y0zBXbqJR+J868J3GEj2s3vzdVjTZ8nZbiBjYBA1omzp6uVt5hvbPpfH\nU//e8AIgLwDxvo5Hav/61gfEo5nxedukk7HEujxAT0Q2PgUkbViJszPazbKsRHbDD6iyc9fyAqql\nZGAWCsyaXeute97A8PQz/jKNV+RZ/8m/+t+OnaNQKuDg9vlIxhJ+IObOS+sgzTtZ99j4KR459yjF\nXHGutsQpk4gl/JoPx3CDDMNwF2Xi0S5SlT8bz05w3+572Nq9lcdGvu+PPxVLYjv2os/laaX+vZGM\nJcjYWT8AScYSlHH88dbPuyed2FaTgcqCe4ZP5eRjEZEwUUDSpnb7aXjazbKsxHKRF1CdvjzMVecK\nm40t/i6bo2MnWt7c6zMeXnDRKDBrls2pvmk/fO7w3LjqPvl7X8ciMWYKV/0dLYVSgcncNMlogiMX\nH2NTPIXjOH6Bp1+X8qIb8Hhj8saVL+VJRBMYFCiWCxgYJKsKRF/30tewpbeHfzrzbXAcP2DyyE4L\nyQAAHHdJREFUTOWm2dzVQ39y27y5XYnsQ/17w92ps6dmKcirrdFhciKyUSggCUi7WZaVOqU1Ho1z\nx9BB+vp6mJ6e9bsntsrAtF4aWXjpofpajV5L/Sd/72twt9ICfu1H1s6Rs/NkSzmiRhS7bPsBQnVW\n4OFzh2t20Dxy/lF3GQY3cAEDw4j43z+UGuTQ4AEG+7dy7Vqef3r2m/PG3yr4a7Vctdigodl7A/Cv\n581fo3n3TOamSCf65i3ZTOWmFxyDiMhaU0ASoHayLKt91HqrDEyr+pX96b3zbr4LZXMavZb6T/57\n+m7i74a/zNPTz5Ap5ig7JUpOqVJI6lAs2xSxKTtl9wyZcpF8KU8sEiMR664ZI+DWiHgMA8plDMNg\nIJnm7ut+2C+SLZSKlMo2JadM3s77WZLq4K+d5arFFh/Xvzfaud5QagDDMOb1bllKNk1EZK0oIFmH\nlrtcBM0bo7XKwBy+8N2G17p0bXTez3i1Igtlcxq9lvqvbx84yOjsGMWyTaFU9vuDGBhQWaqJGBEK\n5QLFso2BQdlxmMpdJl2plzg6fpKZ/Aw5O1/pqOpQdkqAQQSHfCnPycnTfpHsg49/nvPTF4lUcjIO\n8GO77/EDFqBlYLjSO1zaud5KZdNERNaCApIOtFBjtGY32mYZj1k7y3NXztUsC3i1IiuRzXGDoSPY\nZZuIEaHs+As5lQ23Bo5TpuyU2Rzv8Zdk7LJNxs6RtbNkilmuFWcplN2+I15NSASD3vimms6pkWiE\nizMj/vd5O4BOTD5FLBKtqUlZbL8VT7s1Ju1cb7WzaSIiK0kBSQdaqDFasxtto0/cA8l+rOmn/SDA\n28mRTvQxlpng0ODysznxaJy9227mSv4KxbK7PHOtOAvgd0s1jAjJyk6ZjJ2d21liZ92LGO55NH4r\ns0r9SDQSq1nSGMtMYETmnru6V8rT088ylhlf1NLLShQfr8T1ViKbJiKyFhSQdKB2P703+sRtl0uc\nm7lQ833VnU2Xa64w1A2Cers2AVByShRKBbqiXaRiSXq7eymWChiGUVPI2Z/cRqFUYKZwDQOIRmL+\nWTNlp0wsEmWmcK3mRN9INAKTpwD8Xikwt/tnMUsvK71couUXEdnoFJB0oOV8eq//xP3w84fnZSUA\nErHEsm+W1YWcjuP2H/GyL+lEH93Rbvb23cyOTUPs6buJzw9/hdHMmF/IOZQa5EB6H9+68J257qq4\n2ZRNXZu4UqkpyRv5St1JmT19N5Hs6ubU5dOcn75IsVx0O7saEbdra6VmpZ3gbTnLJVp+aUxn9Yhs\nHApIOlCrxmhL5e3kqN9e+uMveQ1Apa/JMs/cgZrn2N4zxIH0PsDd2goQjzTfKnty8jQjs6N+0BSL\nxPAWq4yq58uV8jw1Ocwrd93B+17+s3zbeowvDX/d/UPH4WrxGtlSjnSir63gbbm0/FJLZ/WIbCwK\nSDpQq8ZoS1W9lODVYgylBrklvWfFz9yZy3wMcHLydNNW8fX8M22ujZIr5UnEujk9NcxM/ipGZK5g\nxC7bnJw8zSt33QHAuZkXsR2biBH1+6DYZZuuaLeWSkJAZ/WIbCwKSDpUs8Zo7VynUWZiNc/cydn5\nJV3byyxUd5p9cuxEpSDWqMmSAP6235MjZ8jaOfdkYCNCd7Sbrmicfdtu1ifwEFjpnUwiEiwFJLJs\njZYSVvTMnbpCzu5o16Ku3ehgP6/OJGfnKDtlcMpEK0s4sUiMA+l9nJg4w8WZEWKROJCt7Mxx6IrG\nScWT7OgZWvRrCEon1Fas9E4mEQmWAhJZFSt55k6j7MuJyadaXrtRfcGjF46QL+X9pZ+M7XZ2jUdi\npGJJru/dzW0D+/n2i0eAyqF2xYxfrFss22u2s2U5AUWn1FZo55HIxqKARFbFSp65U599Wcy1Gy0Z\njWcn3eAj7h6k15/cRtbOMZDq59U7XzHXAK5nECZPzSvWffnQ7bz+xvuXdFNvJ7BYbkDRKbUV2nkk\nsrEoIJFVsZo3i8Vcu9GSUTwSo1i1NdnLlLx65ytqbtQH+/f6236rtxC3E4y0E1gsN6Bo9Nodx6kE\ncRtrCUc7j0Q2DgUksmq8s3Gg9oTalQpKWt2IGi0ZJWMJtkS7KZYLVd83P2sTj8Z538t/lu8+/QNG\nro61HUy1G1gst/6m/rV73Wazds4fz0ZcwhGR9U0BiayaIGsZGi3rbO8Z4q173lBzmnB9oFF/6OBr\nd7+67bEuFFg0W85Zbv1N/WvP2jnADcjmxrbxlnBEZH1TQCKrJshahlbLOs2eO1PM8ODxh5jITZKI\nddEV6eaJ1PG2A6hmgcW2RB/fHznKI+cfJW/n/UDh0QtHMPtexmBqgIFkP+PZiaprLb7+pv61vzh7\nidHZMf9AQY+2x4pImCggkVUTdJ+IpdQXFEtFPnP8IS5cfQFwswqxSAwcp+0AqtlhhMcnTnFu5oJ/\nIGHGzuI4DiWnxOX8FVLxJAPJfu7bfQ9Tuem2loyqX/vRsRM8nDk873u0PVZEwkQBiayaMPWJWGi3\ny6nJM4xnJ2t+xi4Vydq5BQOoZtdudhjhty58p6a4tlBya1oiRsR/fDw7QSwS5f6XvnbZr13bY0Vk\nPVBAIqum1Y1wLRt3LaaWZTQz7h/AV/OzZbtlALXQtRsdRgjUPJfbMRb/cc9KZZK0PVZE1gMFJLJq\nmt0IgTUtdl1MLctQaqDhqcX9yXTLTMJS62S8rFH1c3nN62ORWE3h6UpmkrQ9VkTCTgGJrKpGN0L3\nBOC1K3ZdTC2Ll80ByJbylCmxrXsb7z34Tn/MF2dHydt5uqNd7Ny0nf3pvUvu+VGdNfKarrln5HRh\nl4t+4elKLKl0Qvt4Edk4FJDImlvrYtdWu13c4Mi9YXtbgifyk9w4uIsbEjdg22X+9swXGJkdZTI3\njV22iUVipBN9HB0/yYH0vpprLtTzw8saHRs/xcnJ0zg4HEzfwi3pPS23I8PSAoxOaR8vIhuHAhJZ\nc40CBMdxmC1mePj5w8v+NN/oUL1mu13GMuN+a/iBZJr33voAdyVv809BPjZ6jNHMGFk75y/l2GXb\nDzgOpPcxlBpccs+Pk5On/Z/5VuY7nJw8zTv2vplDg41fc6aY4TPHH/Lb3yei3Ry+cIS9225mZ89Q\nwyLdTmgfLyIbhwISWXP1xa6O4zBrZ7Gmn/aXLNr9NN8sM1DfEM0ul/jm+W/7WQ+A81df4MHjD/HL\nd/2S/7NeNqd6V0z111O56Zo6mYuzlxhZoOfHUoOFYqnIg1VbkjOOwzQOESPClco24UZFuo2o94iI\nhJUCEllz9cWus8VMTTACS/s0X50RyRSzjMyOzrvW8PQz83a7VGc9PBPZSU5MnOHuvjt5YvQEl2ZH\nyBSzxIxo7Wuo7IYZTPUvuefHUoOFU5NnmKjakuzgUHbKGMwFRo2KdBtR7xERCSsFJBKI6pv4w88f\nnpdRgMV9mq/PiFzJX6VYLpJO9NVcs/5aQ6mBeVkPcAONS9dGePDxv+H89EWccpmM7W7QjRpRSk7J\n3w3TqPB0MT0/lhos1G9J9rYJOzhNtwlXj8NxHLJ2jq5oF2cvP8/FayN+Ua7qSUQkLBSQSOCW82m+\nfvkjHomRtbNk7RypeLLptfan9zKQPML5yjIIzG27zdp5Ls6MAO6JwN5umOt7d9PXvZVEtJsdm+bX\nbcDien4stVFZ/ZZkd5uw03KbcHXx7D+f/zYOcDl/hX+5+G81RbkqchWRsFBAIoFbTifR+uUP78Zd\nnf1odqLve299wD27plIomowl2N4zRCLWXfO9hmGQiifZtWnnojqnLtTzY6mNymq2JNs5CqUiZcps\n7e5tuU04Ho0Ti0SJGG4I06goV0WuIhIWCkgkcMvpJFqfXfEyGmbfzfTEUy2vlYqn+C+HftF/3m2J\nPgBOTZ1mtpChK9JN9UJSUI3KGs3Pnr6bFtwmDAsX5arIVUTCQgGJhIJ3g/YKVA9f+O6itv82yq5s\n7xni9Tfev6iApvp5vVoUB5gtZrjqZEh3b8UwjMDPfmkUwCwmoPECtvq2+NVFuSIiYaCAREKjnWZe\nK3VOS3UtimEY9KfSXMtn2N4zxKGBA+u2ANQL2EZmR/0alFZFuSIiQVFAIqHRbjOvlTinpb4WJVKp\nG9nZs33Ba4e5RXt1wHZpdpScnW9ZlCsiEhQFJBIaQTbzWuxOn0ZdYD8//JVQt2j3ArZDqHhVRMJL\nAYmExlK3/zbKTACVc2KewgEOpm/htoH9CwYHjWtRapc0Gi0pHb5whEIp33ZTt8W8prAENiIiq0kB\niYTGUrb/NgoOnhg7TtkpY02f9be4PjVpcXziFD+3760tb+zVfTtOTZ2hqyuKucWs+Z5GS0reluHq\nnifQXlZHB+KJSCdTQCKhsZQC1UbBwbmZC+RLhZp28HbZ5tzMhUVnLE5OnmY0O04sH+H85UscHzvl\nBwSNlpTikVjDjq/t7F7RgXgi0skUkEioLLZAtVFwUCzbFMrFho8vJmPhBwRNll8aLSklYwm2Rrsp\nlAv+Y+3uXtGBeCLSyRSQyIpZy/qHRsFBPBKj7JTJl/LzHm+Usagf78VrIw2fywsImvU8qT9JuN3X\nrQPxRKSTKSCRFbHW9Q+NgoPre3fPqyGJRWJc37t7Xsai0Xi7Il04jjPvoD8vIGi1pLQSSyrLaaEv\nIrLeKSCRFbHW9Q/NggPwdtmcBuBAel/DXTaNxpsv5emKdlN03GUfx3HojnT5mZOVDD6W8ppU0Coi\nnUABiayIIOofmgUHd20/xF3bD7X82UbjNQyDfdtu5rreHUyXpnjihZPk7TwnJp/ixORTa7LjZTUD\nHhGRMIsEPQAJl2KpyNGxEzz8/GGOjp2gWJpfJNrIeqt/aDbeHT1D3DF0kN1bdlAoFxv2F5Hm2n3/\niIgoQyK+5dSBrLf6h4XGe3FmtOHPacdLc+qjIiLLoYBEfMupA1lv9Q8LjXdn71DDnwtrxicM1EdF\nRJZDAYn4llsHshb1Dyu5tbjVeG/fcYDvPvt9Rq7NZUrCnPEJA/VREZHlUEAivrDXgazlkkBXNM47\nb3kLx0afWnbGp1POpwn7+0dEwk0BifjCXgcSxNbi5V63k+oqwv7+EZFwU0AivrDXgdQvCTiOQ9bO\nceTiYwChGqsnLHUVa5GlCfv7R0TCTQGJ1AhzH4zqJQHHcZjMTVMoFcjYWcYzEzwxdnzBU33XWhjq\nKtYySxPm94+IhJv6kMi6sT+9l6HUIAAZO0fOzlF2yhRLRWYKVzk9Ncyx8VMBj7JWGOoqWmVpRETC\nQgGJrBveksDrrr+XZKybiBEhakT95mV22fZbxodFdRDlWeu6ijBkaUREFhL6JRvTNLcAnwBejxtA\n/SPwYcuyrgQ6MAmEtyTw5PiJdXFDDUNdRRiyNCIiC1kPGZLPAAeBnwDuB/YBfxroiCRwB9O3EIvM\nxdMOYGBQckqha1nuBVH3v/S1HBo8uOY1LmHI0oiILCTUGRLTNFPAm4BXWZZ1tPLYh4H/a5pml2VZ\nhUAHKKtmoV0htw3s5/jEKc7NXKBYLpK180SMCOOZCR4+d3jDbq1tRxiyNCIiCwl1QAKUcZdqjlU9\nZgBRYBMwFcSgZHUtZldIPBrn5/a9lVOTZzg6fpLnrpwjGUv49SRqWV5Lu19EJOxCHZBYlpUDHql7\n+EPAccuyFIxsUIvt3eHdZEcz4/O+H1S0KSKyngQekJimmQCua/LHlyzLylR97weANwOvW+rzRKPr\noVxmbXlzEra5Gc9NQCXTUW0iP0ksNn+sOzYPcXTi5LzHt28ebPj9CwnrvISB5qY5zU1zmpvmNCdz\nAg9IgFcAj+LWJdZ7I/BVANM03w98EviQZVnfWuqT9PYmlzPGDS1sc3PT0G6OT87vJ3Lj4C76+nrm\nPX53752cunyaizMj/mM7e7dz98130rWMOomwzUuYaG6a09w0p7mRVgzHaRQHhItpmr8GfBz4Vcuy\n/qCNSzgzM1lKpfIKj2x9i0Yj9PYmCdvcFEtFPvvU3zMyO7cMs71nkHfe8pamhZjFUpETE2cYy4wz\nmBrgYH/7RZthnZcw0Nw0p7lpTnPTXGVu5qeEO1AYMiQtmab5APC7uJmRT7d7nVKpjG3rL0IjYZsb\ngyhv3/NT83aFGE606TgNotya3g/pygMOy35NYZuXMNHcNKe5aU5zI62EOiAxTbMP+DTwEPB50zSH\nqv543LIsvbM3KO0KERHpLGGvprkf6AEeAC5W/rlU+feuAMclIiIiKyjUGRLLsv4O+LugxyEiIiKr\nK9QBich6t1DHWRERcSkgEVkli+k4KyIirrDXkIisW606zoqISC0FJCKrZDQz3vBxtbQXEZlPSzYS\nuI1aZzGUGmj4+GCqf8Gf3ahzIiLSjAISCdRGrrPYn97L0fGTNa9tKDXI/vTelj+3kedERKQZBSQS\nqMWe7LsexaNx3rH3zfM6zi4UVGzkORERaUYBiQRqo9dZtNNxdqPPiYhIIypqlUAtp85io9KciEgn\nUkAigdqf3stQarDmscXUWWxkmhMR6URaspFAtVtnsZFpTkSkEykgkcA1qrPo9G2vOu1YRDqNAhIJ\nHW17FRHpPKohkdBRy3URkc6jgERCR9teRUQ6jwISCR1texUR6TwKSCR0tO1VRKTzqKhVQkfbXkVE\nOo8CEgklbXsVEeksWrIRERGRwCkgERERkcApIBEREZHAKSARERGRwCkgERERkcApIBEREZHAKSAR\nERGRwCkgERERkcApIBEREZHAKSARERGRwCkgERERkcApIBEREZHAKSARERGRwCkgERERkcApIBER\nEZHAKSARERGRwCkgERERkcApIBEREZHAKSARERGRwCkgERERkcApIBEREZHAKSARERGRwCkgERER\nkcApIBEREZHAKSARERGRwCkgERERkcApIBEREZHAKSARERGRwCkgERERkcApIBEREZHAKSARERGR\nwCkgERERkcApIBEREZHAKSARERGRwCkgERERkcApIBEREZHAKSARERGRwCkgERERkcApIBEREZHA\nrauAxDTNPzJN89GgxyEiIiIra90EJKZpvgp4H+AEPRYRERFZWesiIDFNMw58Bvhe0GMRERGRlbcu\nAhLgI8Ax4JtBD0RERERWXugDEtM09+Iu1fxy0GMRERGR1RELegCmaSaA65r88SXcpZqPWpY1bppm\n288TjYY+9lpz3pxobmppXprT3DSnuWlOc9Oc5mRO4AEJ8ArgURoXq34EiFiW9WfLfA6jtze5zEts\n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\nxb90FAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.lmplot(x='x1', y='x2', data=df, hue='y', fit_reg=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Features and Labels\n", + "Split Dataframe into features and labels" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "y_array = df.loc[:,'y'].values\n", + "X_array = df.loc[:,['x1', 'x2']].values" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### One hot vector\n", + "Convert labels format to one hot vectors." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def dense_to_one_hot(labels_dense, num_classes=2):\n", + " labels_one_hot = []\n", + " for label in labels_dense:\n", + " indices = [0]*num_classes\n", + " indices[label] = 1\n", + " labels_one_hot.append(indices)\n", + " \n", + " return labels_one_hot" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[[1, 0], [0, 1], [0, 1], [0, 1], [1, 0]]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_one_hot = dense_to_one_hot(y_array, 2)\n", + "y_one_hot[0:5]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Split into training set and test set." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import sklearn\n", + "from sklearn import metrics, preprocessing\n", + "from sklearn.model_selection import train_test_split" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "X_train, X_test, y_train, y_test = train_test_split(X_array, y_one_hot, test_size=0.2, random_state=42)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Batches\n", + "Define function to take random batches from the training set during training." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def make_batch(X, y, batch_size):\n", + " \n", + " y_size = len(y)\n", + " index_sample = np.random.choice(y_size, batch_size, replace=False)\n", + " # print(\"index_sample: {}\".format(index_sample))\n", + " y_array = np.array(y)\n", + " \n", + " X_batch = X[index_sample]\n", + " y_batch = y_array[index_sample]\n", + " \n", + " return X_batch, y_batch" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tensor Flow" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dave/anaconda/envs/python3_tf/lib/python3.5/site-packages/sklearn/cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", + " \"This module will be removed in 0.20.\", DeprecationWarning)\n" + ] + } + ], + "source": [ + "import tensorflow as tf" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def reset_graph():\n", + " if 'sess' in globals() and sess:\n", + " sess.close()\n", + " tf.reset_default_graph()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Reset graph is session isn't closed\n", + "reset_graph()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define hyperparameters" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "batch_size = X_train.shape[0] // 10\n", + "num_features = X_train.shape[1]\n", + "num_classes = len(df.loc[:,'y'].unique())\n", + "learning_rate = 0.005\n", + "epochs = 1000\n", + "epochs_to_print = epochs // 10" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define placeholders" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "X = tf.placeholder(tf.float32, [None, num_features])\n", + "y_ = tf.placeholder(tf.float32, [None, num_classes])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define softmax function" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def softmax_layer(X_tensor, num_classes, num_features):\n", + " W = tf.Variable(tf.zeros([num_features, num_classes]))\n", + " b = tf.Variable(tf.zeros([num_classes]))\n", + " y = tf.nn.softmax(tf.matmul(X_tensor, W) + b)\n", + " return y" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "y = softmax_layer(X, num_classes, num_features)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def cost_function(y, y_):\n", + " cost = -tf.reduce_mean(y_ * tf.log(y))\n", + " return cost" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "cost = cost_function(y, y_)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def train(cost, learning_rate):\n", + " training_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)\n", + " return training_step" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "training_step = train(cost, learning_rate)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def compute_accuracy(y, y_):\n", + " correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_,1))\n", + " accuracy = tf.reduce_mean(tf.cast(correct_prediction, \"float\"))\n", + " return accuracy" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "accuracy = compute_accuracy(y, y_)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Train the Model" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 0, current cost = 0.343\n", + "Epoch: 100, current cost = 0.218\n", + "Epoch: 200, current cost = 0.186\n", + "Epoch: 300, current cost = 0.203\n", + "Epoch: 400, current cost = 0.161\n", + "Epoch: 500, current cost = 0.139\n", + "Epoch: 600, current cost = 0.154\n", + "Epoch: 700, current cost = 0.166\n", + "Epoch: 800, current cost = 0.096\n", + "Epoch: 900, current cost = 0.146\n", + "Finished training model.\n", + "Final accuracy = 0.940\n" + ] + } + ], + "source": [ + "with tf.Session() as sess:\n", + " \n", + " tf.initialize_all_variables().run()\n", + " \n", + " for i in range(epochs):\n", + " \n", + " X_batch, y_batch = make_batch(X_train, y_train, batch_size)\n", + " sess.run(training_step, feed_dict={X: X_batch, y_: y_batch})\n", + " current_cost = sess.run(cost, feed_dict={X: X_batch, y_: y_batch})\n", + " \n", + " # Print average cost periodically\n", + " if i % epochs_to_print == 0:\n", + " print(\"Epoch: {:4d}, current cost = {:0.3f}\".format(i, current_cost))\n", + "\n", + " print(\"Finished training model.\")\n", + " \n", + " X_batch, y_batch = make_batch(X_test, y_test, batch_size)\n", + " print(\"Final accuracy = {:0.3f}\".format(sess.run(accuracy, feed_dict={X: X_test, y_: y_test})))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python [conda env:python3_tf]", + "language": "python", + "name": "conda-env-python3_tf-py" + }, + "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.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}