diff --git a/.gitignore b/.gitignore index 6dfc6a8..0d0d59f 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,4 @@ tmp/ *.ipynb_checkpoints/ data/ data_temp/ -notebooks/ + diff --git a/notebooks/Project 1 Results - Comparison Plots.ipynb b/notebooks/Project 1 Results - Comparison Plots.ipynb new file mode 100644 index 0000000..72f513d --- /dev/null +++ b/notebooks/Project 1 Results - Comparison Plots.ipynb @@ -0,0 +1,645 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "logistic_normal_mcc_10 = [.567, .636, .679]\n", + "logistic_normal_mcc_1000 = [.749, .769, .809]\n", + "logistic_normal_mcc_100000 = [.653, .691, .722]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "logistic_normal_accuracy_10 = [0.853, 0.874, 0.891]\n", + "logistic_normal_accuracy_1000 = [0.911, 0.920, 0.936]\n", + "logistic_normal_accuracy_100000 = [0.886, 0.894, 0.903]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# logistic_undersampled_mcc_10 = [.489, .539, .581]\n", + "# logistic_undersampled_mcc_1000 = [.662, .731, .801]\n", + "# logistic_undersampled_mcc_100000 = [.525, .56, .590]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# logistic_undersampled_accuracy_10 = [.805, .82, .848]\n", + "# logistic_undersampled_accuracy_1000 = [.879, .899, .924]\n", + "# logistic_undersampled_accuracy_100000 = [.785, .81, .833]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "multinomial_nb_mcc = [.421, .493, .549]\n", + "multinomial_nb_accuracy = [.785, .798, .812]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "gaussian_nb_mcc = [.343, .385, .413]\n", + "gaussian_nb_accuracy = [.799, .809, .825]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "logistic_pca_mcc_01 = [.716, .754, .773]\n", + "logistic_pca_mcc_1 = [.733, .758, .772]\n", + "logistic_pca_mcc_10 = [.669, .740, .767]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "logistic_pca_accuracy_01 = [0.904, 0.915, 0.921]\n", + "logistic_pca_accuracy_1 = [0.908, 0.916, 0.919]\n", + "logistic_pca_accuracy_10 = [0.894, 0.911, 0.919]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "lda_mcc_001 = [.539, .605, .658]\n", + "lda_mcc_01 = [.635, .67, .729]\n", + "lda_mcc_3 = [.566, .610, .646]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "lda_accuracy_001 = [0.85, 0.869, 0.879]\n", + "lda_accuracy_01 = [0.878, .888, .914]\n", + "lda_accuracy_3 = [.852, .87, .888]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "model_names = []\n", + "metric_names = []\n", + "metric_values = []" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "model_names = model_names + [\"Gaussian NB\" for i in range(6)]\n", + "metric_names = metric_names + [\"mcc\" for i in range(3)] + [\"accuracy\" for i in range(3)]\n", + "metric_values = metric_values + gaussian_nb_mcc + gaussian_nb_accuracy" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model_names = model_names + [\"Miltinomial NB\" for i in range(6)]\n", + "metric_names = metric_names + [\"mcc\" for i in range(3)] + [\"accuracy\" for i in range(3)]\n", + "metric_values = metric_values + multinomial_nb_mcc + multinomial_nb_accuracy" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model_names = model_names + [\"Logistic Reg-Low\" for i in range(6)]\n", + "metric_names = metric_names + [\"mcc\" for i in range(3)] + [\"accuracy\" for i in range(3)]\n", + "metric_values = metric_values + logistic_normal_mcc_10 + logistic_normal_accuracy_10" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model_names = model_names + [\"Logistic Reg-Opt\" for i in range(6)]\n", + "metric_names = metric_names + [\"mcc\" for i in range(3)] + [\"accuracy\" for i in range(3)]\n", + "metric_values = metric_values + logistic_normal_mcc_1000 + logistic_normal_accuracy_1000" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model_names = model_names + [\"Logistic Reg-High\" for i in range(6)]\n", + "metric_names = metric_names + [\"mcc\" for i in range(3)] + [\"accuracy\" for i in range(3)]\n", + "metric_values = metric_values + logistic_normal_mcc_100000 + logistic_normal_accuracy_100000" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model_names = model_names + [\"PCA Logistic Reg-Low\" for i in range(6)]\n", + "metric_names = metric_names + [\"mcc\" for i in range(3)] + [\"accuracy\" for i in range(3)]\n", + "metric_values = metric_values + logistic_pca_mcc_01 + logistic_pca_accuracy_01" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model_names = model_names + [\"PCA Logistic Reg-Opt\" for i in range(6)]\n", + "metric_names = metric_names + [\"mcc\" for i in range(3)] + [\"accuracy\" for i in range(3)]\n", + "metric_values = metric_values + logistic_pca_mcc_1 + logistic_pca_accuracy_1" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model_names = model_names + [\"PCA Logistic Reg-High\" for i in range(6)]\n", + "metric_names = metric_names + [\"mcc\" for i in range(3)] + [\"accuracy\" for i in range(3)]\n", + "metric_values = metric_values + logistic_pca_mcc_10 + logistic_pca_accuracy_10" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model_names = model_names + [\"LDA Reg-Low\" for i in range(6)]\n", + "metric_names = metric_names + [\"mcc\" for i in range(3)] + [\"accuracy\" for i in range(3)]\n", + "metric_values = metric_values + lda_mcc_001 + lda_accuracy_001" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model_names = model_names + [\"LDA Reg-Opt\" for i in range(6)]\n", + "metric_names = metric_names + [\"mcc\" for i in range(3)] + [\"accuracy\" for i in range(3)]\n", + "metric_values = metric_values + lda_mcc_01 + lda_accuracy_01" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model_names = model_names + [\"LDA Reg-High\" for i in range(6)]\n", + "metric_names = metric_names + [\"mcc\" for i in range(3)] + [\"accuracy\" for i in range(3)]\n", + "metric_values = metric_values + lda_mcc_3 + lda_accuracy_3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "metric_df = pd.DataFrame({\"model\": model_names,\n", + "\"metric\": metric_names,\n", + "\"values\": metric_values})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Plot" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "accuracy_df = metric_df[metric_df.metric == \"accuracy\"]\n", + "accuracy_df.columns = [\"metric\", \"Model\", \"Accuracy Score\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAr4AAAKyCAYAAAAzRd0OAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3XlYlOX+P/D3sIvsm6KCuww7CEiIBKKiYpqiSbll5amj\nrZ46J+102m05nb6do1bn9LWsoxhqGopYmuaKJItsKoSSICCK7CI78/z+8Od8m2CYGZgN5/26Lq8r\n7ufzDO+ZBv3wzP3ct0gQBAFERERERPc4I10HICIiIiLSBja+RERERGQQ2PgSERERkUFg40tERERE\nBoGNLxEREREZBDa+RERERGQQ2PgSERERkUFg40tEREREBoGNLxEREREZBDa+RESkt/bu3QuxWIxr\n165Jx5YvX44VK1boMFXvNm3aBLFY3Kdz161bh+joaDUnIqK72PgSUZ8lJCRALBYjPj5e11EGnObm\nZmzcuBFz585FYGAgQkNDMX/+fGzYsAE3b97UdTytWbRoEcRiMRITE3s8LhKJIBKJ+vTY0dHREIvF\nePzxx3s8vmvXLojFYojFYly4cKFP36Mn/cncn3OJSDE2vkTUZwcOHMCIESOQl5eHsrIyXccZMDo7\nO7F06VJs3boVwcHBWL9+PVavXg1vb2+kpKSgpKRE1xG1orS0FOfPn8eIESOQnJyske9hYWGBs2fP\noqamptux5ORkWFhYsNEkMiBsfImoT8rKypCdnY1169bB3t4e+/fv13UkuVpaWnQdQcaPP/6IgoIC\nbNiwAa+//joWL16MlStXYsOGDTh+/Di8vLy0lkWXr82+ffvg5OSEdevW4dy5czLTGdRl4sSJsLS0\nxMGDB2XGb9y4gaysLERGRqr9exKR/mLjS0R9kpycDFtbW0RFRWHmzJlyr9gJgoCvv/4ac+fOhZ+f\nH8LCwrBq1apuHy3v27cPDz30EAICAjBp0iQsW7YMqamp0uNisRibN2/u9vjR0dFYv3699OvvvvsO\nYrEYGRkZeOONNzB58mRERUUBAK5du4Y33ngDs2bNgr+/P0JDQ/H888+joqKi2+PeunUL7777LqKj\no+Hr64vIyEi8/PLLqK+vR3NzMwIDA/Huu+92O+/GjRvw8vLC559/Lve1Kysrg0gkQmBgYLdjZmZm\nGDx4sMzYr7/+iueffx5hYWHw9/fHrFmz8PHHH8vUXLx4EatWrUJQUBACAwOxcuVK5ObmytT09trc\nzb5+/XqEh4fD19cXDzzwAPbs2SP3efRXSkoKZs2ahcjISFhbW+PAgQNq/x5mZmaYMWNGt8e++/6d\nMmVKj+elpaVhyZIlCAwMREhICNasWYPi4uJudZmZmVi4cCH8/PwQExODnTt3ys2yb98+xMXFSd97\nf/rTn3D9+nWFzyElJQVxcXGYOHEigoKCMHfuXPz3v/9VeB4RdWei6wBENDAdOHAAM2fOhImJCebM\nmYPExEScP38ePj4+MnWvvPIKvvvuO0RFRWHx4sXo6upCZmYmcnJy4O3tDQDYvHkzNm/ejIkTJ+L5\n55+HqakpcnNzcfbsWYSHh/cp35tvvgkHBwc8/fTT0qua+fn5yM3NxQMPPIAhQ4agoqIC33zzDVas\nWIGDBw/C3NwcwJ35t0uWLMGVK1ewcOFCeHl5oa6uDj/99BOuX78OsViM6dOn4+DBg1i/fr3MR+V3\nfwF48MEH5WYbPnw4BEFAUlISVq9e3evzKCwsxNKlS2FmZob4+HgMHz4cV69exfHjx7F27VoAwOXL\nl7F06VJYW1vjySefhLGxMXbu3Inly5dj+/bt8PPzU/ja1NTUYPHixTA2Nsby5cthb2+PkydP4q9/\n/Stu376t9pvJcnNzUVpaivfffx+mpqaYMWMGkpOT8eSTT6r1+wDAAw88gMcffxxlZWVwc3MDcKeZ\nvPv+/b0zZ87gySefhJubG5599lm0trZi27ZtWLJkCb777jsMGzYMAFBUVIRVq1bBwcEBzz33HDo7\nO7Fp0yY4Ojp2e8zPPvsMGzduRGxsLBYvXoza2lps27YNy5YtQ1JSEqysrHrMnpqaihdffBHh4eF4\n6KGHAADFxcXIzs7W6xv8iPSWQESkovz8fMHDw0NIS0uTjkVGRgrvvvuuTF1aWprg4eHRbfy3SktL\nBU9PT+HZZ5/t9Xt6eHgImzZt6jY+depUYd26ddKv9+7dK3h4eAjLli0TJBKJTG1bW1u383NzcwUP\nDw9h37590rF//etfglgsFo4cOSI3z+nTpwWxWCycOnVKZnzevHnC8uXLe30ura2twqxZswQPDw9p\n/m+//VaoqanpVrt06VIhKChIuH79utzHW7NmjeDr6yuUl5dLx6qqqoSJEycKy5Ytk4719tq88sor\nQkREhNDQ0CAz/qc//UkICQnp8bXrj7feekuYOnWq9OvU1FRBLBYLBQUFMnV79+4VxGKxUFFRIR1b\ntmyZwtdYEO68N5566imhq6tLCA8PFz777DNBEATh8uXLgoeHh5CRkSF9/PPnz0vPe/DBB4Xw8HCh\nsbFROlZYWCh4enrKvNfWrFkj+Pv7y/y/KS4uFry8vASxWCwdq6ioELy8vIT//Oc/MvkuXbokeHt7\ny4yvW7dOiI6Oln69YcMGITg4WOFzJSLlcKoDEaksOTkZTk5OCA0NlY7Nnj0bKSkpEARBOnb48GEY\nGRnh6aeflvtYP/74IwRB6LVGVSKRCA899FC3m5bMzMyk/93Z2Yn6+nqMGDECNjY2uHjxokwmsViM\nadOmyf0ekydPhrOzs8wUj6KiIvzyyy+9Xu0FAHNzc+zevRurVq2CSCRCUlIS/vrXv2LKlCl45513\n0NHRAQCora1FZmYmFi1ahCFDhvT4WBKJBGfOnMGMGTMwfPhw6bizszMeeOABnDt3Drdv31b42vz4\n44+YOnUqurq6UFdXJ/0THh6OW7duqXXVg66uLnz//feIjY2Vjt13331wcHDQyE1uRkZG0vcnAOzf\nvx/Dhg1DcHBwt9qbN2+isLAQcXFxsLa2lo57eHhg8uTJOHHiBIA7r3tqaiqmT58u8/9mzJgx3aZP\nHD58GIIgYPbs2TKvrYODA0aOHImzZ8/KzW5jY4OWlhacOnWqX68BEd3BqQ5EpBKJRIKDBw8iNDRU\nZiUHPz8/bN26FWlpaZg8eTKAO3NZXVxcYGNjI/fxysrKYGRkhLFjx6o152+bwLva2trw73//G999\n9x1u3LghbdJFIhFu3bolrbt69SpmzpzZ6+OLRCLMnTsXiYmJaGtrg7m5uXSVAEXnAoCVlRVeeukl\nvPTSS6isrERaWhq+/PJLbN++HdbW1nj++edRXl4OABg3bpzcx6mtrUVLSwtGjRrV7djYsWMhkUhw\n/fp1mdf3969NbW0tGhsbsWvXrh7nqIpEoh5XRbiroaFB2qwDd1ZSkPfRPQCcPn0atbW18PX1xdWr\nVwHcmQseGhqKlJQU/PnPf5Z7bl/NnTsX27dvR2FhIVJSUjBnzpwe6+7eYCfv9UxNTUVrayuamprQ\n2tqKkSNHdqsbPXo0Tp48Kf26tLQUEokEM2bM6FYrEolgamoqN/eSJUvwww8/4Mknn4SLiwvCw8Mx\ne/ZsREREKHrKRNQDNr5EpJKff/4ZN2/exMGDB6VX0O4SiURITk6WNr7aIJFIehy3sLDoNvbWW28h\nKSkJjz76KAICAqRX9NauXSv3cXozf/58fPHFFzhy5AjmzJmDlJQUTJ06tdemryeurq6Ii4vD9OnT\nMX36dCQnJ+P5559XOY+yfv/a3H3u8+bNw/z583s8x8PDQ+7jPfPMM8jIyABw5z0wf/58vPfee3Lr\nk5OTIRKJuj3Hu1eh09PTMWnSJMVPRAV+fn5wc3PDu+++i4qKCrmNryZIJBIYGRlhy5YtPS6d9vub\nGX/LwcEBSUlJOH36NE6ePImTJ09i7969WLBgQa+vMRH1jI0vEalk//79cHJywuuvvy4zrQEADh06\nhB9//BFvvvkmzMzM4O7ujtTUVDQ2Nsq96uvu7g6JRILLly/3utuVra2tzFVZAOjo6FBps4fDhw9j\nwYIF+Mtf/iIda29v7/a47u7uuHTpksLHGz9+PLy8vJCcnIwhQ4bg2rVreO2115TO83s2NjZwc3PD\n5cuXAQAjRowAgF6zODg4YNCgQbhy5Uq3Y8XFxTAyMsLQoUN7/b4ODg4YPHgwurq6EBYWpnLu9evX\no6GhQfq1i4uL3NqWlhYcPXoUsbGxPV4Zf/vtt5GcnKz2xhcA5syZg88++wzjx4+X+167e+NaT6/n\nr7/+Cnt7e1hYWMDMzAwWFhY9rrn866+/ynzt7u4OQRAwfPjwHq8QK2JiYoKoqCjpChyvv/46du3a\nhTVr1khv1iMi5XCOLxEpra2tTToXdMaMGYiJiZH5s2zZMjQ1NeHo0aMAgJiYGEgkkh6XIbtr+vTp\nEIlE+PTTT7s10r/l5uYmvap4186dO9HV1aV0fiMjo25Xdv/73/92e4yYmBgUFhbiyJEjCh9z3rx5\nOH36NL7++mvY29sr9RF0YWEh6urquo1XVFSguLgYY8aMAXCnIQ0JCcGePXtQWVkp9zmFh4fj6NGj\nMuvgVldXIyUlBUFBQb1eUbz7GDExMTh8+HCPTXZtbW2v53t5eSEsLEz6p7dpK4cPH0ZrayuWLl3a\n7f0TExODqVOn4vDhwzJTJ9TloYcewjPPPCPzi8/vOTs7w9PTE9999x2ampqk40VFRUhNTZWu+2tk\nZIQpU6bg6NGjMkuSFRcXyyzDB9x5PxkZGcn9Oaivr5ebp6djEyZMAHDnlzYiUg2v+BKR0o4ePYrb\nt28jOjq6x+MBAQHSG5Rmz56N0NBQPPjgg9i2bRtKSkoQEREBiUSCrKwshIaGYunSpXB3d8cf//hH\nfPbZZ1iyZAliYmJgZmaG/Px8DBkyRLpk10MPPYTXX38dzz33HCZPnozCwkKkpqbCwcGhWw55DfTU\nqVOxf/9+WFlZYdy4ccjOzsbPP/8Me3t7mbonnngChw4dwgsvvIC4uDh4e3ujvr4ex44dw5tvvinz\nsf/cuXPxj3/8A0eOHMGSJUtgbGys8HU8c+YMNm3ahOjoaPj7+8PS0hJlZWXYs2cPOjo68Mwzz0hr\n//rXv2Lp0qVYsGAB4uPjMWLECJSXl+PEiRNISkoCALzwwgs4c+YMHnnkESxZsgRGRkbYtWsXOjo6\nus2XlffavPTSS0hPT8fixYvx0EMPYdy4caivr8eFCxfw888/93oDliqSk5NhZ2fX4xrGwJ11mXft\n2oUTJ05g+vTpavmedw0bNkzmtb3r96/JX/7yF/zhD3/A4sWLsWjRIrS0tCAhIQE2NjYy5z/77LM4\ndeoUlixZgkceeQSdnZ1ISEjA+PHj8csvv0jr3Nzc8Pzzz+Pjjz9GeXk5pk+fjsGDB6OsrAxHjhzB\nww8/jMcee6zHzK+++ioaGhoQGhqKoUOHoqKiAgkJCfD09FT7vHgiQ8DGl4iUlpycjEGDBsmdwysS\niRAZGYkDBw6goaEBtra2eP/99yEWi/Htt9/iww8/hLW1NXx8fDBx4kTpec899xzc3Nywbds2/POf\n/4SFhQU8PDxkVkdYvHgxKioq8O233+LUqVMICQnBl19+iZUrV3abNylvC9pXX30VxsbGOHDgANra\n2hAUFIStW7fiiSeekDnH0tISO3bswMaNG3HkyBEkJSXB0dERYWFh3aYNODo6Ijw8HCdPnsS8efOU\neh1nzpyJ5uZmnD59GmfPnkV9fT1sbW3h5+eHxx9/HCEhIdJasViMXbt24V//+pf0Rrphw4bJrIgw\nbtw47NixAx999BE+//xzSCQSBAQE4KOPPoKvr69Sr42joyN2796NTz/9FEeOHME333wDOzs7jB8/\nXm03m9XW1uLnn3/G3Llz5eYICwvDoEGDsH///l4bX2W2GRaJRErX/T7Dli1bsGnTJmzatAkmJiaY\nNGkSXnzxRZkbAz08PPDFF1/g/fffx6ZNmzB06FA899xzqKqqkml8AeDJJ5/EmDFj8NVXX+GTTz4B\ncGdud0RERLdfJH+b58EHH8TOnTuRmJiIxsZGODk5Yc6cOT028ESkmEjo7bNFIiJS6JlnnsGlS5dw\n6NAhXUchIqJe6NUc34SEBERHR8PPzw+LFy9GXl6ewvrY2Fj4+/tj9uzZ0o/97rq7PaenpyfEYjHE\nYjH8/f01+RSIyMBUVVXh+PHjCtfuJSIi3dObqQ4HDx7E+++/j7fffhu+vr74+uuvsWrVKvzwww89\nzuHbsWMHPv74Y7zzzjvw8fFBXl4eXn31VdjZ2cnsPW9tbY1Dhw7JrNdJRNRf5eXlyMrKwrfffgtT\nU1PEx8frOhIRESmgN1d8v/rqK8THx2P+/PkYO3Ys3nzzTVhYWGDPnj091u/fvx/x8fGYNWsWRowY\ngdjYWMTHx+N///d/ZepEIhEcHBzg6OgIR0fHHptoIiJVZWRk4OWXX8a1a9fw97//HY6OjrqORERE\nCujFFd+Ojg5cuHABTz31lHRMJBJh8uTJyMnJ6fGc9vZ2mJuby4yZmZkhLy8PXV1d0jurm5ubER0d\nDYlEAi8vL/zpT3/qdRckIiJlLFiwAAsWLNB1DCIiUoFeNL51dXXo6uqCk5OTzLijo2OPi4gDQERE\nBHbv3o1p06bB29sb+fn52LNnDzo7O1FXVwcnJyeMHj0aGzZsgIeHB5qamrBlyxY8/PDDSElJkbvv\n/e91dnaioaEB5ubmMDLSmwvkRERERPT/SSQStLW1wdbWFiYm8ttbvWh8+2LNmjWorq5GfHw8BEGA\nk5MTFixYgC1btkgb1ICAAAQEBEjPCQgIQGxsLHbu3InnnntOqe/T0NDQ4848RERERKRfRo0a1evU\nM71ofO3t7WFsbIzq6mqZ8Zqamm5Xge8yNzfHhg0b8NZbb6G6uhouLi5ITEzE4MGD5c7jNTExgaen\nJ0pLS5XOdnc6haura7epFURERESke21tbaisrFTYq+lF42tqagpvb2+kpaVh2rRpAO7spJOWlobl\ny5f3eq6xsbF02sLBgwcxdepUubUSiQRFRUUyqz4ocvfqsZ2dHSwtLZU+j4iIiIi0o7m5GZWVlQqn\npepF4wsAK1euxPr16+Hj4yNdzqy1tRVxcXEAgI8++ghVVVX44IMPAAAlJSXIy8uDv78/GhoasHXr\nVly6dEl6HAA++eQTBAQEwN3dHbdu3cKWLVtQWVmJRYsW6eQ5EhEREZHu6E3jGxsbi7q6OmzcuBHV\n1dXw9PTEli1bpNMWqqurUVlZKa3v6urC1q1bUVJSAhMTE4SGhiIxMRHDhg2T1jQ2NuJvf/sbqqur\nYWNjAx8fHyQmJnJ/cyIiIiIDxC2LFWhubkZBQQE8PT051YGIiIhIDynbr3F9LiIiIiIyCGx8iYiI\niMggsPElIiIiIoPAxpeIiIiIDAIbXyIiIiIyCGx8iYiIiMggsPElIiIiIoPAxpeIiIiIDAIbXyIi\nIiIyCGx8iYiIiMggsPElIiIiIoPAxpeIiIiIDAIbXyIiIiIyCGx8iYiIiMggsPElIiIiIoPAxpeI\niIiIDAIbXyIiIiIyCGx8iYiIiMggsPElIiIiIoPAxpeIiIiIDAIbXyIiIiIyCCa6DkBE+k8QBFy6\ndAlZWVmorKyESCSCu7s7goODMXLkSF3HIyIiUgobXyLqVUdHB3bv3o1Lly7JjJ8/fx7nz59HYGAg\n5s6dC5FIpKOEREREyuFUByLq1YEDB7o1vb+VnZ2NY8eOaTERERFR37DxJSK56uvrkZ+fr7AuPT0d\n7e3tWkhERETUd2x8iUiu3NxcCIKgsK6trQ0FBQVaSERERNR3bHyJSK7GxkaN1BIREekCG18iksvc\n3FwjtURERLrAxpeI5PL09FSqTiQSwcPDQ8NpiIiI+oeNLxHJ5ebmhmHDhimsE4vFsLW11UIiIiKi\nvmPjS0S9WrRoEWxsbOQed3Fxwdy5c7WYiIiIqG+4gQUR9cre3h6rVq1CamoqcnNz0draCgCwsrLC\nxIkTMXnyZM7vJSKiAYGNLxEpZG1tjVmzZmHatGloaGiASCSCnZ0djI2NdR2NiIhIaWx8iUhppqam\ncHJy0nUMIiKiPuEcXyIiIiIyCGx8iYiIiMggsPElIiIiIoPAxpeIiIiIDAIbXyIiIiIyCGx8iYiI\niMggsPElIiIiIoPAxpeIiIiIDAIbXyIiIiIyCGx8iYiIiMggsPElIiIiIoPAxpeIiIiIDAIbXyIi\nIiIyCGx8iYiIiMggsPElIiIiIoPAxpeIiIiIDAIbXyIiIiIyCGx8iYiIiMggsPElIiIiIoPAxpeI\niIiIDAIbXyIiIiIyCGx8iYgMTGdnJwRB0HUMIiKtM9F1ACIi0ryGhgZkZGQgJycHt2/fhpGRETw8\nPBAaGoqRI0fqOh4RkVaw8SUiuseVl5cjISEBra2t0jGJRIKCggIUFBRg6tSpuP/++3WYkIhIO9j4\nEpFSGhsbce7cOVy/fh0ikQhubm4ICAiApaWlrqNRL1pbW7Fjxw6Zpvf3jh07BmdnZ3h6emoxGRGR\n9rHxJSKFfvrpJ5w+fVpmXmhhYSGOHTuGmJgYhISE6DAd9SY7OxstLS0K69LS0tj4EtE9j40vEfXq\nxIkTOHXqVI/HOjs7cfDgQZiamiIgIEDLyUgZ58+fV6qurKwM9fX1sLOz03AizaqpqUF5eTkAwNXV\nFS4uLjpOpF7t7e0oLi5Ga2srrK2tMWbMGBgZ8T51ImWx8SUiuVpaWnD69GmFdT/99BP8/Pz4D7Ae\nun37ttK1zc3NA7bxvXHjBg4dOoQrV67IjLu7uyMmJgbDhw/XUTL16OzsxJEjR5CdnY329nbpuLW1\nNSZPnoz77rtPh+mIBg7+K0VEcuXm5qKzs1Nh3a1bt1BUVKSFRKQqVeZgD9T52tevX8fWrVu7Nb0A\ncPXqVXz99dcoKyvTQTL16Orqwo4dO3D27FmZphe487N36NAhHD58WEfpiAYWNr5EJFd1dbVGakl7\nfH19laobMWLEgL3au2/fPrS1tck93tHRgaSkpAG7dnF6enqPTf1vpaWlDejmnkhb2PgSkVzGxsZK\n13Kag34KCAjAoEGDFNaFhYVpIY36lZWV4fr16wrramtrUVxcrIVE6iUIAjIzM5WqzcjI0HAaooGP\n/1IRkVyjR49WunbMmDEaTEJ9NWjQIDzyyCOwsLCQWxMVFQUvLy8tplIfRVdC+1qrLxobG1FbW6tU\n7UB8fkTaxpvbiEiuCRMmwNbWFg0NDb3Wubm5YejQoVpKRapyc3PDU089hfT0dOTk5KClpQUikQge\nHh6YNGmSSr/g6BuJRKJ0bVdXlwaTaIYqmQfi8yPSNja+RCSXkZER5s+fj4SEBLk3uQ0aNAhz587V\ncjJSlZ2dHWJiYhATE4P29naYmJjcE9NTnJyclK51dnbWYBLNsLGxgbm5ea9zmO8aiM+PSNsG/t96\nRKRRo0aNwqOPPgp3d3eZcZFIhPHjx+Pxxx/nP7gDjJmZ2T3R9AKAp6cnBg8erLDOzMxM6Rv99ImJ\niQn8/PyUqg0KCtJwGqKBj1d8iUihESNG4LHHHkNVVZV0y+IRI0bA3t5e19FIRRKJBK2trTA1NYWp\nqamu4/SbsbExJk6cKHeTlbv8/PxgZmampVTqFR4ejosXL/a6JvOwYcPg7e2txVREAxMbXyJSmouL\nyz23E5ahqKmpwc8//4y8vDzpWrBjx47FpEmTMGHCBB2n6x9l1pC+fPkyBEGASCTSQiL1srW1xYoV\nK5CYmIi6urpux0eOHInFixertAoLkaFi40tEdI8rKSnBN998023zg+LiYhQXFyM8PBzTp0/XUbr+\nuXr1Km7cuKGwrr6+HpcvX8b48eO1kEr9XFxc8Mwzz6CoqAgFBQXSLYv9/f3h5uam63hEAwYbXyKi\ne1hzczMSExO7Nb2/lZqaiqFDh8LHx0eLydSjpKREpdqB2vgCd242FYvFEIvFuo5CfdTU1IRz586h\ntLQUEokEzs7OCA4O5idpWsTGl4joHpadna3UigBpaWkDsvFVZTkzVWqJ1C0jIwM//PCDzPuwpKQE\nGRkZCAgIwNy5c++Zm071GV9hIqJ72Pnz55Wqu3btWo/zR/WdKiuKcPUR0pX8/HwcPHhQ7i9fOTk5\n+P7777WcyjCx8SUiuoe1trYqXdvS0qLBJJohFothZWWlsM7c3HxAXtGmgU8QBBw7dkxhXVZWFurr\n67WQyLCx8SUiuocps8ZtX2r1hbGxMaZNm6awLioqasAuZ0YD25UrV5T6NEUQBGRnZ2shkWFj40tE\ndA9TdtOGkSNHwtbWVsNpNCMgIABz5szpcV1iY2NjTJ8+Hffdd58OkhHdWUpQWbW1tRpMQgBvbiMi\nuqcFBATg1KlTvW5+AABhYWFaSqQZwcHB8PHxQU5ODioqKiAIAlxdXREYGAhLS0tdxyMDZmKifKvF\ntZg1j40vESmlqqoKmZmZ0p3b3NzcEBwcDDs7O11Ho16Ym5tj6dKl2L59O5qbm3usiYmJgYeHh5aT\nqZ+FhcU9fWW3o6MDeXl5KCgoQFtbG6ytreHn54cJEyZwNQA9NmbMGIhEIgiCoLB23LhxWkhk2Nj4\nElGvBEFASkoKsrKyZMavXr2KM2fOIDIyEpGRkTpKR8pwdXXF6tWrkZmZiZycHDQ0NMDMzAxisRiT\nJk3C8OHDdR2RFLh69Sp27tzZ7ZeXgoICuLi4YMmSJQN2qsq9ztbWFh4eHigsLOy1zsrKCp6enlpK\nZbjY+BJRrw4fPtyt6b1LEAQcP34cFhYWCA0N1XIyUoWVlRWioqIQFRWl6yikopqaGuzYsUPuesxV\nVVXYvn07nnzyyR7nOZPuxcbGorKyEg0NDT0eNzExQVxcHKc6aAE/GyEiuZqampCRkaGw7uTJk+jq\n6tJCIiLDk5qaqnATkurqauTl5WkpEanK2toaTzzxBPz8/Lo1t6NHj8ajjz6K0aNH6yidYeEVXyKS\nKzc3V6mGtrm5GYWFhfD29tZCKiLD0d7ervQmJNnZ2QgKCtJwIuora2trLFiwADNnzkR5eTkkEglc\nXFzg4OCUHPpqAAAgAElEQVSg62gGhY0vEcmlyk5eXIaHSP2amprQ0dGhVC1/BgcGS0tLTJgwQdcx\nDBanOhCRXKosw8O5hUTqp8rPoCq1RIaKPyVEJNe4ceNw9uxZpWuJdKm6uhoZGRkoLy8HcGc1i5CQ\nEAwZMkTHyfrOxsYGLi4uqKqqUljLn0Eixdj4EpFcY8eOhYODg8KPUEePHg0nJyctpSLq7scff8SZ\nM2dkxq5du4asrCwEBQVhzpw5EIlEOkrXPyEhIUhJSVGqjoh6x6kORCSXSCTCwoULYW5uLrfG2toa\n8+bN02IqIlmnTp3q1vT+VlZWFo4eParFROoVFBSkcH3X6OhouLq6aikR0cDFxpeIejVs2DA88cQT\nEIvFMlfMjI2N4efnh1WrVnH3NtKZ9vZ2pKamKqw7e/YsWlpatJBI/UQiERYtWoTo6GhYW1vLHHNx\ncUFcXBwiIiJ0lI5oYOFUByJSyNnZGfHx8WhsbERVVRVEIhFcXV1haWmp62hk4C5evKhwjVsA6Ozs\nRF5e3oDdaMXIyAgREREIDw9HWVmZdMtiXuUlUg0bXyJSmo2NDWxsbHQdg0hKlSX3VKnVV0ZGRhg5\ncqSuYxANWJzqQEREA5Yqy+hxuS8iYuNLREQD1vjx45Wu5aYBRMTGl4iIBqwhQ4Yo9dH/kCFD4O7u\nroVERKTP2PgSERmItrY2nDt3DseOHUNqaipqamp0HUktHnzwwW6rHfyWpaUlFi5cqMVERKSvOOGJ\niOgeJwgCfvrpJ6Snp6O9vV06fuTIEYwbNw7z5s3rtXHUd/b29njiiSdw/PhxnD9/Hp2dnQDuLLnn\n5eWFqKgoODg46DglEekDkSAIgq5D6LPm5mYUFBTA09OTSzcRGYDa2lp0dHTA2tr6nvmZT05Oxrlz\n5+Qed3BwwBNPPHFPPN+WlhbcuHEDgiDAxcUFgwcP1nUkItICZfs1XvElIoMnCAKysrKQnp6Omzdv\nArizbJRYLEZ4eDiGDRum44R9V1ZW1mvTC9xp9k+dOoWZM2dqKZXmDBo0CKNGjdJ1DCLSU5zjS0QG\nTRAE7N27FykpKdKmFwAkEgkuXryIL7/8EkVFRTpM2D+ZmZlK1eXk5KCjo0PDaYiIdIuNLxEZtLNn\nz+L8+fNyj3d1deHbb7/F7du3tZhKfcrLy5Wqa21tvWdudiMikoeNLxEZLEEQkJ6errCuo6MD2dnZ\nWkikfryNg4jo/7DxJSKDdePGDaW3sS0sLNRwGs1Qdn6yubk5Vz4gonseG18iMli/XdpLkba2Ng0m\n0Zzg4GCl6vz8/GBmZqbhNEREusXGl4gMlo2NjUZq9cmoUaPg7e3da42NjQ0iIiK0lIiISHf0qvFN\nSEhAdHQ0/Pz8sHjxYuTl5Smsj42Nhb+/P2bPno2kpKRuNd9//z1mz54NPz8/zJs3DydOnNBUfCIa\nYOzs7JTa7hYAAgICNJxGcxYsWIDg4GAYGXX/K3/48OFYuXLlgN7AgohIWXqzju/Bgwfx/vvv4+23\n34avry++/vprrFq1Cj/88EOP88527NiBjz/+GO+88w58fHyQl5eHV199FXZ2doiKigIAnDt3Di+9\n9BJeeuklREZGIjk5GU8//TSSkpIwbtw4LT9DItJHERERuHr1aq83gTk6OsLLy0uLqdTL2NgYc+bM\nQWRkJPLy8tDQ0AAzMzOIxWIMHz5c1/GIiLRGb3ZuW7x4Mfz8/PDqq68CuHMncmRkJJYvX44//OEP\n3eoffvhhBAUF4c9//rN07IMPPkBeXh4SEhIAAGvXrkVLSwv+/e9/S2vi4+Ph6emJN954Q6lc3LmN\n6N6XnZ2NAwcOQCKRdDvm6OiIZcuWwc7OTgfJiIhIGQNq57aOjg5cuHABTz31lHRMJBJh8uTJyMnJ\n6fGc9vZ2mJuby4yZmZkhLy8PXV1dMDY2Rk5ODh577DGZmilTpuDo0aPqfxJENGAFBgZi5MiRyMzM\nRFFREdrb22FnZ4fAwED4+PjA1NRU1xGJiEgN9KLxraurQ1dXF5ycnGTGHR0dceXKlR7PiYiIwO7d\nuzFt2jR4e3sjPz8fe/bsQWdnJ+rq6uDk5ISbN2/2+JjV1dUqZ2xpaVH5HCIaOCwsLDBlyhRMmTJF\nZryjo4M7mhER6Tll+zS9aHz7Ys2aNaiurkZ8fDwEQYCTkxMWLFiALVu29HgDR3+VlJSo/TGJiIiI\nSHv0ovG1t7eHsbFxtyuxNTU13a7Y3mVubo4NGzbgrbfeQnV1NVxcXJCYmIjBgwdLb4ZzdnZW6TF7\nM2rUKAwaNEjl84iIiIhIs1paWpS6SKkXja+pqSm8vb2RlpaGadOmAbhzc1taWhqWL1/e67nGxsYY\nMmQIgDsrQ0ydOlV6LCAgAGlpaVixYoV0LDU1tU/LEg0aNIg3txERERENYHqzju/KlSuxe/duJCUl\nobi4GK+//jpaW1sRFxcHAPjoo4/w8ssvS+tLSkqwf/9+lJaWIi8vD2vXrsWlS5ewdu1aac2KFStw\n6tQpbN26Fb/++is2bdqECxcuYNmyZVp/fkRERESkW3pxxRcAYmNjUVdXh40bN6K6uhqenp7YsmWL\ndNpCdXU1KisrpfVdXV3YunUrSkpKYGJigtDQUCQmJsrsSx8YGIiPPvoIH3/8MT7++GOMHDkSn376\nKdfwJSIiIjJAerOOr77iOr5ERERE+k3Zfk1vpjoQEREREWkSG18iIiIiMgh6M8eXiEjXJBIJKisr\npTu32dvb6zoSkQxBEHD9+nW0trbC2tq6T8tzEhkyNr5EZPC6urqQmpqKzMxM3Lp1Szo+atQo3H//\n/Rg9erQO0xHdaXjPnj2L9PR01NXVSceHDx+OKVOmQCwW6zAd0cDBqQ5EZNC6urqQmJiIY8eOyTS9\nwJ1lE7dt24b8/HwdpSO60/QmJSXh0KFDMk0vAFRUVGDnzp34+eefdZSOaGBh40tEBu3MmTO4fPmy\n3OOCIGDfvn3dmmIibcnJyUFeXl6vNYcOHcKNGze0lIho4GLjS0QGSyKRIDMzU2FdV1cXsrKytJCI\nqLv09HSl6jIyMjSchGjgY+NLRAbrxo0baGxsVKq2qKhIw2mIurt16xauX7+uVO2lS5c0nIZo4GPj\nS0QGq6OjQyO1ROrC9yiRenFVByI1un79OpqammBhYYHhw4dDJBLpOhL1ws7OTulaLm1GumBlZQUT\nExN0dnYqrFXl/UxkqNj4EqlBfn4+UlNTZW4usbOzw6RJk3DfffexAdZTNjY2GDt2LIqLixXWBgYG\naiERkSwzMzN4e3sjNzdXYS3fo0SKcaoDUT+dOHECe/fu7XZHdX19PQ4fPoykpCQIgqCjdKTI/fff\nDyOj3v8qdHV1hYeHh5YSEckKDw+HqalprzX29vbw9/fXUiKigYuNL1E/lJeX4/jx473W5OXlcR1Y\nPebu7o5FixbBxKTnD8BcXV2xZMkShc0xkaY4OzvjkUcegbm5eY/HHR0dsXz5cpiZmWk5GdHAw6kO\nRP2g7PJB6enp8PPz03Aa6itPT0+88MILOHfuHIqKitDR0QFbW1sEBgZiwoQJbHpJ50aPHo0XXngB\nOTk5KCgokG5Z7O/vDy8vLxgbG+s6ItGAwMaXqB+UXT6ooqICzc3NsLS01HAi6qvBgwcjIiICERER\nuo5C1CMLCwvcd999uO+++3QdhWjA4mUMon5QZfkgZe7KJiIiIs3hFV+ifnBwcEBVVZXCOjMzM17t\nJSIitLS0oKKiAhKJBM7OzvfcUomCIKCsrAwtLS2wtLTEiBEj9GplIza+RP0QGBiIQ4cOKazz8/OT\ne/MUERHd+5qamnD06FGcP39e5hPAsWPHIjo6GsOGDdNhuv4TBAFnz57F2bNnUV9fLx23t7dHWFgY\nQkJCdJju/3CqA1E/BAQEKPxt3cLCAmFhYVpKRERE+ubWrVv44osvkJOT023aW3FxMbZu3YqSkhLd\nhFOTAwcO4NChQzJNLwDU1dXh4MGD+P7773WUTBYbX6J+sLCwwPLly+Ho6NjjcUtLSyxduhQODg5a\nTkZERPri+++/79YQ/lZnZyf27NmDrq4uLaZSn8LCQpw7d67XmvT0dFy+fFlLieTjZ69E/WRvb481\na9agoKAAeXl50i2Lvby84Ofnp3DheSIiunc1NjaisLBQYV1TUxMKCgrg4+OjhVTqlZ6ernTduHHj\nNJymd2x8idTAyMgI3t7e8Pb21nUU6iOJRIKioqJu6/jKu5pPRKSM4uJipXfvvHz58oBrfLu6unDl\nyhWlau++Frq82Y2NLxEZvGvXrmH37t3dPopMTU2Fr68v5s2bx5sTiahPVFnKciBOdVAls0Qi0Xnj\nyzm+RGTQqqursW3bNrnz7/Lz87F7924tpyKie4Uq93gMxKXNzMzMYGVlpVStra2tznfCZONLRAbt\nxIkTaG1t7bWmqKhowN9xTUS6MWbMGNjZ2SmsE4lEmDhxohYSqV9gYKBSdfrw/Nj4EpHBam5uRkFB\ngVK1mZmZGk5DRPcikUiEqVOnKqwLDAxUqkHWR5MmTVJ41dfGxgbBwcFaSiQfG18iMlg1NTVKz09T\nZoc+IqKe+Pn5YdasWXI/5vf390dsbKyWU6mPlZUVli9fDltb2x6P29vbY/ny5Xqxgynv1iAig6XK\nXDNdz0sjooEtNDQUXl5eyMrKQmlpKSQSCVxcXBAUFIShQ4fqOl6/ubi44Nlnn8XFixdx/vx56ZbF\nvr6+8PT01Ju/Q9n4EpHBcnFxgYWFhcI5vgAwcuRILSQionuZtbU1oqKidB1DY4yNjeHr6wtfX19d\nR5FLP9pvIiIdMDU1RUBAgFK1+rLPPBER9R0bXyIyaJGRkXB2dlZY4+TkpKVERESkKWx8icigWVhY\n4LHHHoOvr2+3OWjW1taIjY29pz+aJCIyJJzjS0QGb9CgQYiLi0NMTAwuX76M9vZ22NnZYdy4cXpz\nQwYREfUfG18iov/PyspK6Tm/REQ08PBSBhEREREZBDa+RERERGQQ2PgSERERkUHgHF8iIiLSG6Wl\npairq4OJiQlGjx6NwYMH6zoS3UPY+BIREZHOXbhwAcePH0d1dbV0zNjYGN7e3pg5cyYsLS11mI7u\nFZzqQERERDqVmZmJb7/9VqbpBYCuri7k5eVh69ataGlp0VE69evs7ER7e7uuYxgkXvElIiIinbl1\n6xa+//77Xmuqq6tx9OhRPPDAA1pKpX4SiQT5+fnIyMhARUUFAMDOzg5BQUEIDg6GhYWFjhMaBl7x\nJSIiIp3JysqCRCJRWJefn4+2tjYtJFK/rq4u7Ny5E0lJSdKmFwDq6+tx9OhRbNmyBY2NjTpMaDjY\n+BIREZHOlJSUKFXX3t4u0zQOJEePHkVRUZHc4zU1Ndi1a5cWExkuNr5ERESkM11dXRqp1Rft7e3I\nyspSWFdRUYGrV69qIZFhY+NLREREOuPk5KSRWn1RVFSk9I1s+fn5Gk5DbHyJiIhIZ4KDg5WqGzt2\nLOzt7TWcRv2am5uVrr2XVq7QV2x8iYiISGeGDx8OLy+vXmtMTEwQFRWlnUBqpsoGHFyrWPPY+BIR\nEZFOLViwAL6+vj0eGzRoEB555BGMGDFCy6nUY8KECTA3N1eq1s/PT8NpiOv4EhERkU6ZmJggLi4O\nEREROHfunHTL4nHjxsHHxwcmJgO3XTE1NUVISAhOnz7da52bm9uAbe4HkoH7TiLSI4Ig4NKlS8jL\ny0NTUxMsLCzg5eUFLy+vAf0XNhGRNjk7O2PmzJm6jqF2U6dORW1tLS5evNjjcWdnZyxevFjLqQwT\n/0Um6qeGhgZ88803uHHjhsz4L7/8giNHjuCRRx6Bq6urjtIREZGuGRkZYdGiRbh48SIyMzNRWloK\nQRDg5OSEoKAgBAYGKj0dgvqHjS9RP7S3t2Pbtm2oqanp8fitW7ewfft2/OEPf4CdnZ2W0xERkb4Q\niUTw9vaGt7c3BEGAIAgwMuKtVtrGV5yoH3JycuQ2vXc1Nzfj559/1lIiIiLSdyKRiE2vjvBVJ+qH\nc+fOKVWXm5s7IHccIiIiupf0qfHt6OjAN998g1deeQWPP/64dJ/tgwcPori4WJ35iPRabW2tUnWt\nra24ffu2htMQERFRb1RufMvKyjBr1ix8+OGHuHr1KtLS0qT/oGdkZGDLli1qD0mkr4yNjZWu5eoO\nREREuqVy4/vOO+/AwcEBR44cwVdffQVBEKTHQkJCkJGRodaARPps3LhxStW5urpyRx4iIiIdU7nx\nTU9Px+rVq+Hg4ACRSCRzzNnZGTdv3lRbOCJ9FxISotY6IiIi0hyVG19jY2OZq7y/VV1dzataZFDc\n3d0xZcqUXmu8vLwQEBCgpURERES609LSguzsbKSmpiInJwetra26jiRD5UmHISEh2Lp1K+6//37p\nUhwikQiCIGDXrl0ICwtTe0gifTZt2jTY29sjNTVV5mY3KysrhISEYMqUKd0+HSEiIrqXdHZ24tCh\nQ8jJyUFnZ6d0/ODBg5g4cSJmzJih0n0xmqJy4/vSSy/hkUcewZw5cxAdHQ2RSISEhARcunQJpaWl\n2L17tyZyEum1iRMnIjAwEOXl5dIti93d3fXih5yIaCDp6OjA7du3YWJiAisrK13HISVIJBIkJib2\nuLJXR0cHzp49i7q6OsTHx+t8/WKVG9+xY8diz5492Lx5Mw4cOABjY2McP34cYWFh+Mc//gF3d3dN\n5CTSeyKRCG5ubrqOQUQ0INXW1iI1NRXnz59He3s7AGDo0KEICQlBYGAgPznTY7m5uQqXsy0qKsKF\nCxfg6+urpVQ9U6nxFQQBDQ0NGDJkCD744ANNZSIiIiIDUl5eju3bt6OtrU1m/Pr160hOTsavv/6K\nhQsXsvnVU5mZmUrVZWRk6LzxVel6c0dHByZPnowzZ85oKg8REREZkI6ODiQmJnZren/rwoULSE1N\n1WIqUlZnZyeuXbumVG1ZWZncBRK0RaXG18zMDEOHDuXWq0RERKQW+fn5Su1smZGRAYlEooVEpApV\n/58MqMYXAJYsWYKvvvqq19/MiIiIiJRx8eJFpeoaGxtRXl6u4TSkKjMzMzg4OChV6+zsPPBubqus\nrMSVK1cQFRWFSZMmwcnJqducm1dffVVtAYmIiOjepco6r/q2JizdERQUhB9//FFhXXBwsBbS9E7l\nxvfYsWMwMzMDcOfjid8TiURsfImIiEgp1tbWGqkl7QkKCkJOTk6vu/cOHToUgYGBWkzVM5Ub359+\n+kkTOYiIiMgA+fv7o7CwUGGdi4sLXF1dtZCIVGVubo4VK1Zgz549KCkp6XZ8zJgxWLhwIUxNTbUf\n7ndUbnyJiIiI1GXChAlwdnbu9WohAISHh2spEfWFlZUVHn30UVRWViI/Px8tLS2wtLSEr68vhg4d\nqut4Un1qfG/cuIGvvvoK586dQ319Pezs7BAUFIRHH30UQ4YMUXdGIiIiukcZGRlh6dKl2LZtG2pq\nanqsmTp1Kvz8/LScjPrC1dVVr6/MiwQV15UoKirCsmXL0NHRgfDwcDg6OqKmpgZnzpyBqakptm/f\njvHjx2sqr9Y1NzejoKAAnp6esLS01HUcIiKie1J7eztyc3ORnZ2N2tpamJiYYPz48QgJCcGwYcN0\nHY/0nLL9msqN7xNPPIH6+np8+eWXsLW1lY43NDTg8ccfh729PbZs2dL35HqGjS8RERGRflO2X1N5\nMbVz585h9erVMk0vANja2mL16tXIyspSPS0RERERkYap3PgaGxujvb29x2Pt7e0wNjbudygiIiIi\nInVTufGdPHky/vnPf+LKlSsy4yUlJfjXv/6FyZMnqy0cEREREZG6qLyqw7p167Bs2TLMmTMH48eP\nh5OTE2pqalBUVARXV1esX79eEzmJiIiIiPpF5cZ32LBhSE5Oxp49e5CVlYXGxkaMGjUKCxcuRFxc\nHAYPHqyJnERERERE/dKndXwHDx6MFStWYMWKFerOQ0RERESkESrP8S0sLMSJEyd6PHbixAmlth0k\nIiIiItI2lRvfd999F9nZ2T0ey8vLwwcffNDvUERERERE6tanK74TJ07s8VhAQAAuXrzY71BERERE\nROqmcuPb3t6Ojo4Oucfa2tr6HYqIiIiISN1Ubnw9PT2xb9++Ho/t27cPYrG436GIiIiIiNRN5VUd\nnnrqKaxevRpPPvkk4uLi4OLigqqqKuzduxenT5/Gp59+qomcRERERET9onLjGxUVhY8++gh///vf\n8cILL0AkEkEQBAwdOhT/+Mc/EBUVpYGYRERERET906d1fGNjYxEbG4tff/0V9fX1sLOzw5gxY9Sd\njYiIiIhIbfrU+N7FZpeIiIiIBgqlbm4rLS3FTz/91G381KlTiIuLQ0BAAKZPn47t27erPSARERER\nkToo1fhu3rwZX3zxhczYL7/8gjVr1qC0tBT3338/LC0tsWHDBhw5ckQjQYmIiIiI+kOpqQ65ublY\nsWKFzNj27dshkUiQkJAAsVgMQRCwevVqfP3115g+fbpGwhIRERER9ZVSV3xv3ryJsWPHyowdP34c\nfn5+0nV7RSIRFi1ahCtXrqg/JRERERFRPynV+Jqbm6O9vV36dUVFBW7evImQkBCZOjs7O9y6dUu9\nCYmIiIiI1ECpxnf8+PE4dOiQ9Osff/wRIpEIERERMnXXrl2Dk5OTehMSEREREamBUnN8V61ahaee\negrXrl2Ds7MzDh06BG9v725XfI8dOwZvb2+NBCUiIiIi6g+lrvhGRkbif/7nf9De3o6CggLMnj0b\nn3zyiUxNTU0NSkpKMGvWLI0EJSIiIiLqD5EgCIKuQ+iz5uZmFBQUwNPTE5aWlrqOQ0RERES/o2y/\nptQVXyIiIiKiga5fWxYT0R3Nzc04d+4ccnNz0dTUBAsLC3h7eyM4OBh2dna6jkdERERg40vUbxUV\nFdixYweam5ulY62trUhNTcXZs2cRFxcHT09PHSYkIiIigI0vUb80NTUhISEBLS0tPR7v7OzEnj17\nsGrVKgwdOlTL6YiIiLTr+vXrOH/+PJqbmzF48GD4+vrCxcVF17Gk2PgS9UNWVpbcpveurq4upKWl\nYcGCBVpKRUREpF23b9/Gnj17uu3ge/r0aYwbNw5xcXEYNGiQjtL9H5Vvblu7di3OnDmjiSxEA05u\nbq5SdRcuXEBHR4eG0xAREWlfe3s7/vvf/3Zreu+6fPkytm3bphf/Dqrc+JaXl+Pxxx9HdHQ0Nm/e\njIqKCk3kIhoQlN2iu6urS2YOMBER0b0iKysLVVVVvdZUVlYiJydHS4nkU7nx3b17N5KTkxETE4Nv\nvvkGM2bMwGOPPYaUlBS0t7drIiOR3jI3N9dILRER0UCRmZmp1jpN6tM6vuPHj8e6detw8uRJbNy4\nERYWFnj55ZcRERGBt99+GwUFBX0Kk5CQgOjoaPj5+WHx4sXIy8vrtX7//v148MEHERAQgClTpuCV\nV15BfX299Ph3330HsVgMT09PiMViiMVi+Pv79ykbUU+8vLyUqhszZgwsLCw0nIaIaOBqa2tDeno6\n/v3vf+O9997Dhx9+iO+++w7l5eW6jka96OjoQG1trVK1VVVVkEgkGk7Uu35tYGFsbIzo6GgsXLgQ\nPj4+aGhowN69exEXF4dly5bJnevRk4MHD+L999/Hc889J21YV61aJffFzMrKwrp167B48WKkpKRg\n48aNyM/Px2uvvSZTZ21tjdTUVOmfY8eO9ecpE8kICQmBkZHiH6P77rtPC2mIiAam+vp6fP755/j+\n++9x48YNtLe3o7m5GXl5efjiiy9w4sQJXUckOUQikUbr1a3Pje+vv/6KDz/8EPfffz9eeOEFODk5\n4T//+Q+ysrLw5Zdform5GX/+85+VfryvvvoK8fHxmD9/PsaOHYs333wTFhYW2LNnT4/1ubm5GDFi\nBJYuXYrhw4dj4sSJiI+P73aVWCQSwcHBAY6OjnB0dISDg0NfnzJRN87Ozpg3b16vP8j3338/xo8f\nr8VUREQDh0QiwY4dO3q9anj8+HGFnwKTbpiYmMDV1VWp2hEjRgy8xnf37t14+OGHMWfOHBw+fBgr\nVqzA8ePHsXnzZkRGRsLIyAhhYWFYv349Ll68qNRjdnR04MKFCwgLC5OOiUQiTJ48We5E6ICAAFRW\nVkp/C6yursYPP/yAyMhImbrm5mZER0cjKioKa9asweXLl1V9ykS98vf3x8qVKyEWi2V+oEeNGoX4\n+HhMnTpVh+mIiPTbL7/8gps3byqsS01N1UIa6ovg4GCl6kJCQjScRDGV1/F96623MGPGDDz//PMy\njervjRw5EmvWrFHqMevq6tDV1QUnJyeZcUdHR7nTJSZOnIgPP/wQa9euRXt7Ozo7OxEdHS0z1WH0\n6NHYsGEDPDw80NTUhC1btuDhhx9GSkoKhgwZolQ2ImW4u7vD3d0dra2tuH37NiwsLDB48GBdxyIi\n0nvKXsmtqqpCZWWl0lcXSXv8/f1x/vz5Xqe4jhs3Dj4+PlpM1TOVG9+TJ0/C3t5eYZ2LiwueeeaZ\nPoVSxuXLl7FhwwY8++yzCA8Px82bN/HBBx/gtddew4YNGwDcuSocEBAgPScgIACxsbHYuXMnnnvu\nOZW+n6JNCojuurtAN5cvIyJSrKGhQena6upq2NraajAN9dWDDz6In376CRcuXEBXV5d03MTEBL6+\nvoiKikJra6vGvr+yfZrKjW9raysuXLgAb2/vbscuXLgAR0dHlbdmtbe3h7GxMaqrq2XGa2pqul0F\nvuvzzz/HxIkT8dhjjwEAJkyYgNdffx1Lly7F2rVrezzPxMQEnp6eKC0tVSkfAJSUlKh8DhEREfWu\ns7NT6drr169z6VQ95u7ujqFDh6KyshIdHR0wMzPD0KFDYWZmhkuXLuk6HoA+NL5vvPEGRo4c2WPj\ne+DAAZSUlOCzzz5T6TFNTU3h7e2NtLQ0TJs2DQAgCALS0tKwfPnyHs9pbW2FqampzJiRkRFEIhEE\nQYc2gL8AACAASURBVOjxHIlEgqKiIkRFRamUD7gzX1MfttojIiK6l3R0dODQoUMK66ytrREWFqbU\nSjqkW7pYOralpUWpi5QqN765ubmIj4/v8VhoaCiSkpJUfUgAwMqVK7F+/Xr4+PjA19cXX3/9NVpb\nWxEXFwcA+Oijj1BVVYUPPvgAADB16lT87W9/Q3BwMKZMmYKqqiq899578Pf3h7OzMwDgk08+QUBA\nANzd3XHr1i1s2bIFlZWVWLRokcr5Bg0aBEtLyz49NyIiIupZUFAQTp8+jdu3b/daFxoaCisrKy2l\nonuVyo1vc3MzTEx6Pk0kEil848oTGxuLuro6bNy4EdXV1fD09MSWLVuky49VV1ejsrJSWr9gwQI0\nNzdjx44d+Pvf/y79TfDFF1+U1jQ2NuJvf/sbqqurYWNjAx8fHyQmJmLs2LF9ykhERETqZWpqiocf\nfhgJCQly54D6+Phg8uTJWk5G9yKRIG9egBwLFiyAr68v3nrrrW7HXnvtNeTm5mLfvn1qC6hrzc3N\nKCgogKenJ6/4EhERaUhdXR3OnDmDvLw86TxeV1dXTJo0Cf7+/jpf/5X0m7L9mspXfB999FGsW7cO\nRkZGWLhwIVxcXFBVVYW9e/di9+7dePfdd/sVnIiIiAyPvb095syZg5kzZ+L27dswMTHhspCkdio3\nvvPnz0d1dTU++eQT7Ny5UzpuYWGBF198EQsWLFBrQCIiIjIcJiYmXLKMNEblxhcAVq1ahYcffhjZ\n2dmor6+HnZ0dAgMDOemciIiIiPRWnxpfALCyskJERIQ6sxARERERaUyfG9/S0lKUlJSgra2t27GY\nmJh+hSIiIiIiUjeVG9+mpiY8/fTTSE9PBwDpZhG/vduyoKBATfGIiIiIiNRD5e1PPvzwQ1RXVyMh\nIQGCIGDz5s3Ytm0bFi1ahBEjRsjc8EZEREREpC9UbnxPnTqFP/7xj9Lt6FxcXBASEoK3334b06ZN\nw9atW9UekoiIiIiov1RufGtra+Hq6gpjY2MMGjQI9fX10mORkZE4deqUWgMSERHR/2PvzuNqyv8/\ngL9uO7JvSdYWZUmK7DLFDI117IPGNsbSMIyv/WsbO9kNYxmyDSZKJL5kxhpKyJYlEiamKJGl7fz+\n8Oj+XIWWezv3nPN6Ph4ej5x7NK/GW73v+bzP5xCRNuS58bWwsEBCQgIAoHr16jh27Jj6tYsXL8LU\n1FR76YiIiIiItCTPN7c1b94coaGhaNeunfopbpGRkTA2NkZkZCQGDhyoi5xERERERAWS58Z33Lhx\neP36NYB3T3ErVqwYDh06hLdv3+K///0vevfurfWQREREREQFlafGNzU1FSdPnoSDgwPKlCkDAGjb\nti3atm2rk3BERERERNqSpxlfExMT/Pzzz/jnn390lYeIiIiISCfyfHNbzZo1ERcXp4ssREREREQ6\nk+fGd+zYsVizZg2uXLmiizxERERERDqR55vbFi9ejKSkJPTs2ROlSpVCuXLlNF5XqVQIDAzUWkAi\nIiIiIm3Ic+Nbp04d1K1bVxdZiIiIiIh0Js+N7/z583WRg4iIiIhIp/I840tEREREJEV5vuI7adKk\nz54zb968fIUhIiIiItKVPDe+N27cyHYsOTkZcXFxKF26NCpWrKiVYERERERE2pTnxjcgICDH49HR\n0Rg7diwmTJhQ4FBERERERNqmtRlfa2trfP/99xxzICIiIiK9pNWb24oXL47Y2FhtfkoiIiIiIq3I\n86hDUlJStmNpaWmIjo7GkiVLYGtrq5VgRERERETalOfGt0mTJlCpVNmOC4KASpUqYfXq1VoJRkRE\nRESkTXlufOfOnZut8TU1NUXFihVRv359GBnl+VMSEREREelcnrvUb775Rhc5iIiIiIh0Ks83t0VF\nReH48eM5vnb8+HFERUUVOBQRERERkbblufGdO3cuLl68mONrkZGRWLBgQYFDERERERFpW76u+Do7\nO+f4mpOTE65fv17gUERERERE2pbnxjc1NRVpaWkffe3t27cFDkVEREREpG15bnwdHBywb9++HF/b\nt28f7O3tCxyKiIiIiEjb8ryrww8//IDhw4dj6NCh+Oabb1ChQgX8+++/2Lt3L06dOoVff/1VFzmJ\niIiIiAokz41v69at4ePjg4ULF+Knn36CSqWCIAiwsLDA4sWL0bp1ax3EJCIiIiIqmHw9bcLT0xOe\nnp64e/cukpKSUKpUKdSsWVPb2YiIiIiItKZAj1ljs0tEREREUpHnm9uWLl2KadOm5fjatGnTsHz5\n8gKHIiIiIiLStjw3vgcOHPjoPr4uLi4ICgoqcCgiIiIiIm3Lc+P777//olKlSjm+ZmFhgcePHxc4\n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\nCRMmqM//4osvcPjwYfzxxx948OABLly4gDlz5qB+/fooX748AMDLywsnT57Epk2bcPfuXaxcuRLX\nrl1Dv379RPkaP5SXK8/5uUotttjYWLx48SJX5169elXHaYiIiEjp9OKKLwB4enoiMTERK1asQEJC\nAhwcHLBhwwaUKVMGwLtdG+Li4tTnd+3aFa9evcKOHTuwcOFCFC9eHE2bNsXPP/+sPqdBgwbw8fHB\n0qVLsXTpUlSrVg2//vorbGxsCv3ry4mzszNOnz79yZvbAMDCwgJWVlaFlEp7Xr16pZNziYiIiPJD\nJXyu61K4V69e4caNG3BwcNDJqMHBgwcRFhb20ddVKhW+/fZbvWnW8yImJga+vr65Ord27dro0aOH\njhMRERGRHOW2X9ObUQelateuHRo1apTjvK+JiQm6desmyaYXAKpVq5brh2/Uq1dPx2mIiIhI6fRm\n1EGpDAwM4OnpiaZNmyIiIgLx8fEwNDRE9erVUb9+fZiYmIgdMd9UKhWaNGmCw4cPf/K8cuXKwc7O\nrpBSERERkVKx8dUTpUuXVu9oISdNmjTB06dPER4enuPrpUqVQp8+fbiVGREREekcG1/Sua+//hp2\ndnYICwtDdHQ0MjMzUapUKbi4uMDFxUWSD+YgIiIi6WHjS4XC1tYWtra2EAQBgiDwCi8REREVOja+\nVKhUKlWeHtxBREREpC287EZEREREisDGl4iIiIgUgY0vERERESkCG18iIiIiUgQ2vkRERESkCGx8\niYiIiEgR2PgSERERkSKw8SUiIiIiRWDjS0RERESKwMaXiIiIiBSBjS8RERERKQIbXyIiIiJSBDa+\nRERERKQIbHyJiIiISBHY+BIRERGRIrDxJSIiIiJFYONLRERERIpgJHYAUobnz58jPDwc0dHRyMjI\nQNmyZeHs7Axra2uoVCqx4xEREZECsPElnQsPD8fBgwchCIL62L///osbN26gWrVq6N27N8zMzERM\nSERERErAUQfSqRs3biAoKEij6X3f/fv38eeffxZyKiIiIlIiNr6kU8ePH//sOXfv3kVsbGwhpCEi\nIiIlY+NLOhMXF4cnT57k6tyLFy/qOA0REREpHRtf0pnExMRcn5uUlKTDJERERERsfEmHTExMcn2u\nsbGxDpMQERERsfElHapatSpMTU1zda6dnZ2O0xAREZHSsfElnTExMYGTk9NnzzMzM4Ojo2MhJCIi\n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\nCMqQZ8oAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8,6))\n", + "sns.set_style(\"whitegrid\")\n", + "g = sns.stripplot(x=\"Model\",\n", + " y=\"Accuracy Score\",\n", + " data=accuracy_df,\n", + " size=8,\n", + " color=\"gray\")\n", + "for item in g.get_xticklabels():\n", + " item.set_rotation(90)\n", + "\n", + "plt.title(\"Accuracy Score - All Models\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "mcc_df = metric_df[metric_df.metric == \"mcc\"]\n", + "mcc_df.columns = [\"metric\", \"Model\", \"Matthews Correlation\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAArUAAAKyCAYAAADLpSb5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3XdYU3f/P/5n2EM2TnAhlSAbgggOFBVbR1Ws6G1FbWvt\nslZr+63aeffu0K67Vdtab2ed1VrcE61arQo4ABFxIKCiIBvZkPP7wx/5mLISJIs8H9fV66rnvJI8\nk0B45Zz3eb9FgiAIICIiIiLSYQaaDkBERERE9KTY1BIRERGRzmNTS0REREQ6j00tEREREek8NrVE\nREREpPPY1BIRERGRzmNTS0REREQ6j00tEREREek8NrVEREREpPPY1BJpAbFYjM8++0zTMfROWFgY\nFi5c2Kr3uWDBAoSFhbXqfeqKjIwMvPjii5BIJHB3d8fRo0cBAImJiZg8eTL8/Pzg7u6Oq1evYtmy\nZRCLxUo/RlRUFKKiolo7ula6e/cuxGIxdu7cKdvW0tdNXWJjYyEWixEXF6f0bf/44w+IxWJkZWWp\nIBnpAza1pFeio6MhFoshFotx4cKFBmtCQ0MhFovx6quvtugxfvnlF8TExNTbfvHiRSxfvhwPHz5s\n0f3qgpSUFLzzzjsYPHgwvLy8EBQUhBdeeAF//PEHpFKppuO1mpycHCxfvhxXr16tt08kEsHAQHMf\nrQ8fPsTy5csxduxY+Pn5wcfHB2PGjME333yDnJwclT72e++9h+vXr2PevHn46quv4OnpiZqaGsyd\nOxfFxcVYtGgRvvrqKzg5OT3R66Tq11ddv6tfffUVxGIx3n77bYVvIxKJIBKJmq1buHAhxGIxJBIJ\nqqqq6u3PyMiQfRauXbtWqdyKZGzp7Vp6WyIAMNJ0ACJNMDMzw969e+Hv7y+3PTY2FtnZ2TA1NW3x\nfa9YsQJPP/00hg0bJrf94sWL+PHHHxEREYF27dq1+P611fbt2/HJJ5/A0dERY8eORffu3VFaWooz\nZ87ggw8+QG5uLmbNmqXpmK2irql1dnaud9Tss88+01gDf/v2bcyYMQPZ2dkYMWIEJk2aBGNjY6Sm\npmLHjh2IiYnBwYMHVfLYlZWVuHTpEl5//XU8//zzsu1paWnIysrC559/jgkTJsi2v/766y36eWjt\nBqwh6vpd3b9/P5ydnfHnn3+irKwMFhYWrXr/RkZGqKiowLFjx/D000/L7duzZw9MTU0bbHiJdBWb\nWtJLgwYNwsGDB/HBBx/IHfXZu3cvPD09UVBQ0OqPKQhCq9+ntrh06RI++eQT+Pv7Y+XKlTA3N5ft\nmzZtGpKTk3H9+vUnfhxBEFBdXQ0TE5N6+2prayGVSmFsbPzEj6NIjsYYGhrC0NBQ5Rn+qba2FrNn\nz0Z+fj42bNgAPz8/uf3z5s3D//73P5U9fl5eHgDAyspKoe0GBgYNvo/NMTJS/Z8tdfyunj17FtnZ\n2Vi/fj1efPFFHD58GOPGjWvVxzAxMYG/vz/27dvXYFM7ePBgHD58uFUfk0iTOPyA9I5IJMLo0aNR\nWFiI06dPy7ZXV1fj0KFDGD16dIN/1FavXo3JkycjKCgIPj4+iIiIwKFDh+RqxGIxKioq5IY5LFy4\nEMuXL8fXX38N4NE4TrFYDHd393pjx2JiYjBmzBh4eXlh9OjR+Ouvv+rlyM7OxsKFC9G/f39Z3Y4d\nO+Rq+vXrhyVLlsj+LQgCJBIJPDw85E6prly5Eh4eHigvLwcA5ObmYuHChQgNDYWXlxcGDBiA119/\nvdkxbsuXL4dIJMI333wj19DW8fDwkPuDXV5ejsWLF8uGKTz99NNYs2ZNvdvVjTXes2cPRo8eDS8v\nL/z111+ysYZr167F+vXrMXz4cHh7e+PmzZsAgKqqKixduhTh4eHw8vLC4MGD8fXXXzd7VKqoqAhL\nlizBmDFj4Ofnh4CAALz88stywwxiY2MxceJEiEQiLFiwQPZe1o17bGhMrbLPV5Gfg386dOgQUlNT\n8dprr9VraAHA0tISc+fOldt24MABREREwMfHB/369cO7776L7OzserdNS0vDnDlzEBQUBG9vb0yY\nMAHHjh2T7V++fDnCwsIgEomwZMkSiMViDB06FAsXLkRUVBREIhHmzJkDsViMadOmAWh8bOiuXbsw\nceJE+Pr6om/fvpg6dSr+/vtv2f6oqCjZfdRR9P1W5PVV9Hf1Se3Zsweurq7o27cvQkJCsGfPnla9\n/zqjR4/GiRMn5H7vExMTkZmZiTFjxjT4WXf79m3Z++3r64tJkybhxIkT9eqys7Px+uuvw8/PDyEh\nIfjyyy9RVVXV4H0mJCTgpZdegkQiga+vL6KiohodAva4pKQkvPTSS+jXrx98fHwwdOhQLFq0SMlX\ngfQFj9SSXnJycoKPjw/27duHgQMHAoDsg3/UqFH49ddf691mw4YNGDp0KJ599llUV1dj//79mDt3\nLlasWIHQ0FAAwNdff433338fPj4+iIyMBAB069YN5ubmuHXrFvbv34/3338ftra2AAB7e3vZ/cfH\nx+Pw4cOYMmUKLC0tsWHDBsyZMwfHjx+HjY0NgEdHvSIjI2FoaIioqCjY2dnh5MmTeP/991FaWir7\nY+/v7y93oUZqaioePnwIQ0NDnD9/Xpb3woUL6NOnj6wRnT17NtLS0hAVFYUuXbogLy8Pf//9N7Ky\nstClS5cGX8uKigqcPXsWgYGB6Nixo0Kv/6uvvoq4uDg899xzEIvFOHXqFL766ivk5ORgwYIFcrVn\nzpzBgQMH8Pzzz8POzg5OTk6yfTt27EBVVRUmTZoEExMT2NraQhAEvPbaa7hw4QImT54MFxcXpKam\nYv369cjIyMDy5csbzXX79m3ZqVpnZ2fk5ubit99+w7Rp07Bv3z60b98evXr1wpw5c7B06VJMmjQJ\nEokEAGSNZEPjApV5vor8HDTk6NGjEIlEGDt2rELvwR9//IFFixbBx8cH8+fPR15eHtavX4+LFy9i\n586dstPu169fx5QpU9CpUyfMmjUL5ubmOHDgAN544w0sW7YMw4YNQ3h4OKytrfHFF19g9OjRCA0N\nhYWFBRwdHdGhQwf88ssvmDZtGry8vODo6Njo67R8+XIsX74c/v7+eOutt2BsbIyEhAScPXsWISEh\nDT4PZd/v5l7f8PDwZn9Xn1RVVRWOHDmCl156CQAwatQovP/++8jLy4ODg0OrPQ4AhIeH4+OPP8bh\nw4cREREB4NEZKRcXF7i7u9erz8vLw+TJk1FZWYlp06bBxsYGO3fuxGuvvYalS5fKhlXV7c/Ozsa0\nadPQvn177Nq1C2fPnq33vp45cwazZs2Cp6cnZs+eDQMDA/zxxx+YPn06Nm/eDC8vrwaz5+fnY+bM\nmbC3t8crr7wCKysr3L17F0eOHGnV14jaEIFIj/zxxx+CWCwWLl++LGzcuFEICAgQKisrBUEQhLfe\nekuYPn26IAiCMGTIEOGVV16Ru21dXZ2amhph9OjRwowZM+S2+/r6CgsWLKj32KtXrxbEYrFw9+7d\nevvc3NwELy8v4fbt27JtV69eFdzc3ISNGzfKti1atEgYOHCgUFRUJHf7t99+WwgMDJRlXL16teDh\n4SGUlpYKgiAIGzZsEMLCwoTIyEjh22+/FQRBEKRSqRAYGCgsXrxYEARBKC4uFtzc3IQ1a9Y08uo1\nrC7nF198oVD9kSNHBDc3N+GXX36R2z5nzhzB3d1dyMzMlG1zc3MT+vTpI9y8eVOu9s6dO4Kbm5sg\nkUiEgoICuX07d+4U+vTpI1y4cEFu+9atWwWxWCxcvHhRtm3IkCFy71VVVVW9vHfv3hW8vLyEn376\nSbYtKSlJcHNzE6Kjo+vVL1iwQAgLC2vx81Xk56Ah48ePFwIDA5usqVNdXS2EhIQIzz77rNzP9fHj\nxwU3Nzdh2bJlsm3Tp08Xxo4dK1RXV8vdx+TJk4URI0bI/l33nvzz5+fcuXOCm5ubcOjQIbnty5Yt\nE8RisezfGRkZgru7u/Dmm282mX3q1KlCVFSU7N/KvN+Kvr5N/a62hoMHDwpisVj23j98+FDw9vYW\n1q9fL1dX95o+/nP2z9etMQsWLBD8/PwEQXj0s/bCCy8IgvDo975///7CTz/91OB79vnnnwtisVju\n9SwtLRWGDh0qDB06VLZt3bp1glgslntfKyoqhPDwcEEsFguxsbGy7eHh4cLLL78sl6+yslIYOnSo\n8OKLL8q21X0+173uR44cEcRisZCcnNzs8yUSBEHg8APSW8888wwqKirw559/orS0FMePH8eYMWMa\nrX98/F9xcTGKioogkUhw5cqVVskTEhICZ2dn2b/d3NzQrl073LlzR7btyJEjGDJkCGpra1FQUCD7\nr3///igpKUFycjIAQCKRoKamBhcvXgTw6OiURCJBQEAA4uPjATw6eltcXIyAgAAAgKmpKYyNjXHu\n3DkUFxcrnLvutKalpaVC9SdPnoSRkRGmTp0qt/3FF1+EVCrFyZMn5bb37dsXLi4uDd7XiBEjZEfS\n6hw6dAguLi7o0aOH3GsUFBQEQRBw7ty5RrM9Ph5XKpWisLAQZmZm6NmzZ4vfZ2WfryI/Bw15+PCh\nwu/B5cuXkZeXhylTpsj9XIeGhsLFxQXHjx8H8Gg4xrlz5/D000+jpKSk3s9cRkZGq82ocOTIEQiC\ngDfeeEOp2yn7frf09W1NdWP3u3btCuDR705oaKjKhiCMGTMGsbGxyMvLw5kzZ5CXl4fRo0c3WHvy\n5El4e3vLDWGxsLBAZGQk7t69ixs3bsjq2rdvj/DwcFmdqamp7AxVnZSUFGRkZGDUqFFy78/Dhw8R\nHBws+zxqiLW1NQRBwLFjx1BTU/MkLwHpCQ4/IL1lb2+P4OBg7N27F+Xl5ZBKpRgxYkSj9X/++SdW\nrFiBlJQUubF6rTW9UOfOnetts7a2RlFREYBHp+KKi4uxbds2/Pbbb/VqRSKR7KKcuiEF8fHx6N+/\nP+Lj4/HWW2/BwcEBGzduRFVVFc6fPw+RSCRrak1MTPDOO+/gq6++QkhICHx9fTF48GCMGzdOdsq4\nIXWnqUtLSxV6nllZWejQoUO9K7179eol2/+4x4cb/FND+zIyMpCWlobg4OB6+x5/jRoiCALWr1+P\nLVu24M6dO6itrZXdzs7OrvEn1QRln29zPweNUaYxy8rKgkgkQo8ePertc3FxkY11zMjIgCAI+OGH\nH/D999/XqxWJRMjPz0eHDh0Uetym3L59GwYGBrLXRVHKvt8tfX0bU1ZWhrKyMtm/DQwMmhyqUFJS\nghMnTmDq1KnIzMyUbff398eSJUuQkZGB7t27tyhLYwYNGgRLS0vs27cPKSkp8PLyQteuXXH37t16\ntVlZWfD19a23ve59uXv3LlxdXZGVldVgzp49e8r9Oz09HcCj6d4aYmBggJKSknoXEgKPvtCOGDEC\nP/74I9atW4e+ffti2LBhGD16dIsuMqS2j00t6bXRo0fjww8/xIMHDzBo0KBGp++Jj4/H66+/jr59\n++KTTz5B+/btYWRkhB07dmDfvn2tkqWxK+aF//+ii7ppop599tlGr5J2c3MD8OgKcW9vb8THxyMz\nMxO5ubmQSCSwt7dHTU0NEhMTcf78ebi4uMg1a9OnT0dYWBiOHj2Kv/76C0uXLsXKlSvx66+/Njrh\ne/fu3WFkZIRr1661+Lk3xczMTKl9UqkUvXv3xsKFCxu8YKWhpqbOzz//jKVLl2LixIl46623YGtr\nC5FIhC+++EJt03Q193PQmJ49eyIlJQXZ2dkKj21uTt1jvvjiixgwYECDNd26dWuVx2opZd/vlr6+\njVmzZo3cuF0nJyfZohMNOXDgAKqqqrB27dp6FwuKRCLs2bMHs2fPblGWxpiYmGDYsGHYuXMnbt++\njTfffLNF99OS16juNgsWLJB9Pv1TU1OZ/fDDD0hMTMSxY8dw6tQpLFq0CGvXrsW2bdsavCiV9Bub\nWtJrw4cPx8cff4yEhAT897//bbTu8OHDMDMzw+rVq+WmFPr999/r1TY2efiTTipub28PS0tL1NbW\nNnhU6p8kEglWrVqFv//+G/b29rIjKK6uroiLi0N8fDyGDBlS73Zdu3bFjBkzMGPGDGRmZmLs2LFY\ns2YNvvrqqwYfx8zMDEFBQTh37pxCDVWXLl1w9uzZevNy1s1c0NgFaYrq1q0bUlNT0a9fP6Vve/jw\nYfTr1w//+c9/5LYXFxfLNf/KvJeqfr51wsLCsG/fPuzatavZ+V+7dOkCQRBw69YtBAUFye27deuW\nLFPd6XEjIyOFfuaeRLdu3SCVSnHjxg2lVsx6kve7Mcq8v+PGjZOd7QCa/hIGPJr1oHfv3g02rlu3\nblVJUwtANkuKoaEhRo0a1Whdly5dcOvWrXrbb968CZFIJDs70qVLF9lQhMelpaXJ/fvxIRYt/Rny\n9vaGt7c35s6di7179+Kdd97Bvn378Nxzz7Xo/qjt4pha0msWFhb45JNPMHv27CaXNq07ulN3OhoA\n7ty5Izet0eP3WVJSUm973VEFZcarPs7AwADh4eE4fPhwg3O+5ufny/1bIpGgsrIS69evl/ujGxAQ\ngF27duHBgweyK/eBR7MY/HMKJGdnZ1haWjY7Fdbs2bMhCALeffdduVOxdS5fviyb8io0NBQ1NTXY\nuHGjXM26detgYGCAQYMGNflYzXnmmWdw//59bNu2rd6+yspK2fRlDTEwMKh3NOrAgQP1prlS5r1U\n9fOtM2LECPTu3RsrVqzApUuX6u1/+PCh7Iubp6cnHBwcsHXrVlRXV8tqTpw4gZs3b2Lw4MEAHn2R\n6tu3L3777Tc8ePCg3n3+82fuSQwbNgwikQg//fSTUkcEn+T9bowy76+zszOCg4Nl/zU0nVqd+/fv\nIz4+HiNHjkR4eHi9/yIiIpCZmYnExESlMzenX79+mDt3Lj788MMmZ1gIDQ1FYmIiEhISZNvKysqw\nbds2ODs7w9XVVVaXk5MjN61heXk5tm/fLnd/np6e6NatG1avXt3gZ0NTP0MNvf51X3i4aAQ1hEdq\nSe/88w+mIhOeh4aGYu3atXjppZcwevRo5ObmYsuWLejevTtSU1Plaj08PPD3339j3bp16NChA5yd\nneHt7Q0PDw8IgoD//ve/GDlyJIyNjREWFtbskZ3HvfPOO4iNjUVkZCQmTpwIV1dXFBYWIjk5GWfP\nnpW7KMbX1xdGRkZIT0/HpEmTZNsDAwOxZcsWiEQiuaY2PT0d06dPxzPPPANXV1cYGhriyJEjTV5U\nUsfPzw8fffQRPv30UzzzzDNyK4rFxsbi2LFjsjlSw8LCEBQUhO+//x537tyRTXH1559/YsaMGbIj\nOy01duxYHDhwAJ988gnOnTsHf39/1NbW4ubNmzh48CDWrFkDDw+PBm87ZMgQ/PTTT1i4cCH8/f2R\nmpqKPXv21DvF3q1bN1hbW2Pr1q2wsLCAhYUFfHx8Ghzjq+rnW8fIyAjLly/HCy+8gKlTp+Lpp5+G\nv78/jI2Ncf36dezduxc2NjaYN28ejIyM8M4772DRokWYOnUqRo0ahdzcXGzYsEF2pL7Oxx9/jClT\npmDMmDGIjIxE165dkZubi0uXLiE7O1v2ZeVJdevWDa+++ip+/vlnTJkyBeHh4TAxMUFSUhI6duyI\nefPmNXi7J3m/G9Mav6sN2b17NwA0eIYEePQ5Y2hoiD179sDb2/uJHuufRCKRQkt/z5o1C/v27cPM\nmTMRFRUFGxsbREdHIysrC8uWLZPVRUZGYtOmTfh//+//4fLly7Ipvf45JEAkEuGzzz7DrFmzMHr0\naERERKBjx47Izs7GuXPn0K5dO/z8888NZomOjsbmzZsxfPhwdOvWDaWlpdi2bRusrKxk0xISPY5N\nLekdRU4t/nMOzX79+uGLL77AypUr8eWXX8LZ2Rnvvvsu7ty5U6+pXbBgAT766CP88MMPqKiowLhx\n4+Dt7Q0vLy/MnTsXW7duxalTpyCVSnH06FF06dKlySELj+9zcHDA9u3b8dNPPyEmJgZbtmyBra0t\nnnrqKbz77rtytzU3N4e7uzuSk5PrHakViUTo3Lmz3HjDTp06YcyYMThz5gx2794NIyMjuLi44Icf\nfqi35G9DJk2aBG9vb6xZswa7du1Cfn6+LMMXX3whmz9VJBJhxYoVWLp0Kfbv34/o6Gg4OTnhvffe\nk2um6mob09g68XVH+9atW4edO3ciJiYGZmZmsmbt8Yuj/nkfr7zyCsrLy7F3714cPHgQHh4e+N//\n/odvvvlGrs7IyAhLlizBd999h08++QS1tbX48ssvZU3t47Wt8Xwbe67/1K1bN+zatQvr1q3DkSNH\ncPToUUilUnTt2hUTJkzA9OnTZbXjx4+Hubk5Vq5ciW+//Rbm5uYIDw/H/Pnz5caW9+rVCzt27MCP\nP/6I6OhoFBYWwsHBAe7u7vVOkzf1njT2vB43Z84cdO3aFRs2bMD3338PMzMzuLm51Zt795+vrzLv\nd2M5Ht/X1O/qk9i7dy+6dOnS6NhSKysr+Pv748CBA1i4cGGjmRUdHtGSz7q6I/jffPMNNm3ahMrK\nSri5uWHFihVyZxXMzMywfv16/Oc//8HGjRthbm6OZ599FgMHDsTMmTPlHqNv377YunUrfvrpJ2za\ntAllZWVwdHSEj4+P3Bfuf+rbty+SkpKwf/9+5OXlwcrKCt7e3vj222+bvICU9JdIaOnoeCIiIiIi\nLaFVY2o3bdqEsLAweHt7IzIystlxRZs2bcLIkSPh4+ODZ555ptVOgxERERGRbtGapnb//v1YvHgx\n5syZg+joaIjFYsycObPRQeSbN2/Gf//7X8yZMwf79u3Dm2++iU8//VQ2aTgRERER6Q+tGX4QGRkJ\nb29vfPDBBwAeXcwTGhqKqKgovPzyy/XqJ0+ejICAALlxhEuWLEFiYiI2bdqkttxEREREpHlacaS2\nuroaycnJcnPYiUQihISENDg1DfBoOg9TU1O5bSYmJkhMTJSbdomIiIiI2j6tmP2goKAAtbW19Zbi\ndHBwaHASaAAYOHAgtm/fjqFDh8LDwwNJSUnYsWMHampqUFBQ0OSynnVqampQVFQEU1PTVlvqlIiI\niIhaj1QqRWVlJWxsbOQWQPonrWhqW+L1119Hbm4uJk2aBEEQ4OjoiPHjx2PVqlUKN6hFRUWydamJ\niIiISHv16NGjycVDtKKptbOzg6GhIXJzc+W25+XlNXrE1dTUFJ9//jk+/fRT5ObmokOHDti6dSss\nLS1hb2+v0OPWDV/o3LlzvaEMRERERKR5lZWVuHfvXrO9mlY0tcbGxvDw8MCZM2cwdOhQAI8uFDtz\n5gyioqKavK2hoaFsrfn9+/c3ulJLQ+qO6Nra2sqtyU5ERERE2qGsrAz37t1r9ky8VjS1ADBjxgws\nXLgQnp6e8PLywvr161FRUYGIiAgAwLfffoucnBwsWbIEwKMlPRMTE+Hj44OioiKsXbsW169fl+0n\nIiIiIv2hNU3tyJEjUVBQgKVLlyI3Nxfu7u5YtWqVbChBbm4u7t27J6uvra3F2rVrkZ6eDiMjIwQF\nBWHr1q1PvIwhEREREekerZmnVhPKysqQkpICd3d3Dj8gIiIi0kKK9mucx4qIiIiIdB6bWiIiIiLS\neWxqiYiIiEjnsaklIiIiIp3HppaIiIiIdB6bWiIiIiLSeWxqiYiIiEjnsaklIiIiIp3HppaIiIiI\ndB6bWiIiIiLSeWxqiYiIiEjnsaklIiIiIp3HppaIiIiIdB6bWiIiIiLSeWxqiYiIiEjnsaklIiIi\nIp3HppaIiIiIdB6bWiIiIiLSeWxqiYiIiEjnsaklIiIiIp3HppaIiIiIdB6bWiIiIiLSeWxqiYiI\niEjnsaklIiIiIp3HppaIiIiIdB6bWiIiIiLSeWxqiYiIiEjnsaklIiIiIp3HppaIiIiIdB6bWiIi\nIiLSeWxqiYiIiEjnsaklIiIiIp3HppaIiIiIdB6bWiIiIiLSeWxqiYiIiEjnsaklIiIiIp3HppaI\niIiIdB6bWiIiIiLSeWxqiYiIiEjnsaklIiIiIp3HppaIiIiIdB6bWiIiIiLSeWxqiYiIiEjnsakl\nIiIiIp3HppaIiIiIdB6bWiIiIiLSeWxqiYiIiEjnsaklIiIiIp3HppaIiIiIdB6bWiIiIiLSeWxq\niYiIiEjnsaklIiIiIp3HppaIiIiIdB6bWiIiIiLSeWxqiYiIiEjnsaklIiIiIp3HppaIiIiIdB6b\nWiIiIiLSeWxqiYiIiEjnGWk6ABFpXlpaGuLi4nD79m0IgoBOnTpBIpHAzc0NBgb87ktERNqPTS2R\nHpNKpdi9ezcSEhLktqelpSEtLQ0uLi6YPHkyjI2NNZSQiIhIMTwEQ6THjh07Vq+hfVxaWhp2796t\nxkREREQtw6aWSE9VVlYiLi6u2brLly+joKBADYmIiIhajk0tkZ5KSUlBVVWVQrVNHc0lIiLSBmxq\nifRUSUmJSmqJiIg0gU0tkZ4yNTVVSS0REZEmaFVTu2nTJoSFhcHb2xuRkZFITExssn737t0YO3Ys\nfH19MWDAACxatAiFhYVqSkuk28RiscLTdfXp00fFaYiIiJ6M1jS1+/fvx+LFizFnzhxER0dDLBZj\n5syZyM/Pb7D+/PnzWLBgASIjI7Fv3z4sXboUSUlJ+Oijj9ScnEg3WVtbK9SsOjk5wdnZWQ2JiIiI\nWk5rmtp169Zh0qRJGDduHHr16oV///vfMDMzw44dOxqsT0hIgLOzM55//nk4OTnB398fkyZNavbo\nLhH9n1GjRqFz586N7re1tcXEiRPVmIiIiKhltKKpra6uRnJyMoKDg2XbRCIRQkJCcOnSpQZv4+vr\ni3v37uHEiRMAgNzcXBw8eBChoaFqyUzUFpiZmWHGjBkYMmQIrK2tZdstLCzQv39/zJw5EzY2NhpM\nSEREpBitWFGsoKAAtbW1cHR0lNvu4OCAW7duNXgbf39/fP3115g3bx6qqqpQU1ODsLAwDj8gUpKJ\niQkGDRqEAQMGoLi4GIIgwNraGoaGhpqORkREpDCtaGpb4saNG/j888/x5ptvon///njw4AGWLFmC\njz76CJ8xYxO8AAAgAElEQVR//rlS91VeXq6ilES6xcTEBMCjhRmIiIi0gaJ9mlY0tXZ2djA0NERu\nbq7c9ry8vHpHb+usXLkS/v7+eOGFFwAAvXv3xscff4znn38e8+bNa/R2DUlPT29xdiIiIiLSPK1o\nao2NjeHh4YEzZ85g6NChAABBEHDmzBlERUU1eJuKigoYGxvLbTMwMIBIJIIgCEo9fo8ePWBubt6y\n8ERERESkMuXl5QodgNSKphYAZsyYgYULF8LT0xNeXl5Yv349KioqEBERAQD49ttvkZOTgyVLlgAA\nhgwZgg8//BASiQQDBgxATk4OvvzyS/j4+KB9+/ZKPba5uTksLCxa/TkRERERkXpoTVM7cuRIFBQU\nYOnSpcjNzYW7uztWrVoFe3t7AI9mN7h3756sfvz48SgrK8PmzZvx1VdfwcrKCsHBwZg/f76mngIR\nERERaYhIUPZcfRtSVlaGlJQUuLu780gtERERkRZStF/TinlqiYiIiIieBJtaIiIiItJ5bGqJiIiI\nSOexqSUiIiIincemloiIiIh0HptaIiIiItJ5bGqJiIiISOexqSUiIiIincemloiIiIh0HptaIqI2\npLa2Fnq8UCQR6TEjTQcgIqInU1ZWhvj4eFy4cAFFRUUQiURwcXFBYGAg3NzcNB2v1VRXV+P+/fuo\nra2Fg4MDrKysNB2JiLQIm1oiIh2Wn5+PX3/9FUVFRbJtgiDg5s2buHnzJvz9/TF69GiIRCINpnwy\nFRUVOHHiBC5duoSKigoAgEgkgpubG0JDQ9GpUycNJyQibcDhB0REOkoqlWLz5s1yDe0/XbhwAWfP\nnlVjqtZVUVGBdevW4ezZs7KGFnjUuF+9ehVr1qxBZmamBhMSkbbgkVoiQlpaGuLi4nD79m0IgoBO\nnTpBIpHAzc0NBgb87qutUlNTkZeX12zduXPnEBQUpJPv5aFDh5Cdnd3o/urqamzfvh1z586FoaGh\nGpMRkbZhU0ukx6RSKXbv3o2EhAS57WlpaUhLS4OLiwsmT54MY2NjDSWkply+fFmhuqKiImRmZqJH\njx6qDdTKysrKFHqODx8+xJUrV+Dl5aWGVKpTU1ODtLQ0lJaWwsLCAr169YKREf9MEymKvy1EeuzY\nsWP1GtrHpaWlYffu3ZgwYYIaU5GiSktLFa4tKytTYRLVSEtLQ01NjUK1165d09mmVhAEnDx5ErGx\nsXLvk7m5OSQSCQYPHqyTR9mJ1I2/JUR6qrKyEnFxcc3WXb58GQUFBWpIRMqysLBQSa22qK6uVkmt\nNhEEATt37sTx48frffEoLy/HX3/9hR07dnCaNiIFsKkl0lMpKSmoqqpSqLapo7mkOYoembS2tka3\nbt1UnKb12dnZKVxra2urwiSqc/XqVSQmJjZZc+XKFYWHmhDpMza1RHqqpKREJbWkPm5ubrC3t2+2\nTlcvEuvevbtCzw8A/P39VZxGNRQ5W6JMHZE+071POSJqFaampiqpJfUxMDDAlClTYG1t3WiNr68v\ngoOD1Ziq9YhEIoSGhjZb16dPH3To0EENiVqXIAhIT09XqPb27dsKjy8m0ldsaon0lFgsVvjoXZ8+\nfVSchlrKwcEBs2bNwuDBg+VW2OrZsyciIyMxduxYnV54wdvbG+Hh4Y0+h6eeegrjxo1Tc6rWIQiC\nUmNlpVKpCtMQ6T7OfkCkp6ytrdGnT59mx+o5OTnB2dlZTamoJSwtLREaGorQ0FBUV1fD0NBQJ4cb\nNCY4OBhisRinT5/GzZs3IZVK4eDggEGDBuncNGWPMzAwgL29PfLz85uttba2homJiRpSEemutvOp\nR0RKGzVqFDp37tzofltbW0ycOFGNiehJGRsbt6mGFgAKCwtx4MABXLhwAYWFhSguLsatW7ewf/9+\npKamajreEwkICGjVOiJ91rY++YhIKWZmZpgxYwaGDBkiNy7TwsIC/fv3x8yZM2FjY6PBhKTvCgsL\nsXr1aly/fr3eqfoHDx7gt99+0+mZAQICAuDg4NBkja2tLSQSiZoSEekuDj8g0nMmJiYYNGgQBgwY\ngOLiYgiCAGtray45qoNyc3ORn58PQ0NDdO3atU2crj548CAePnzY6H5BELBnzx489dRTOnlBo6mp\nKaZNm4atW7fi3r179fZ36NABkydP1sl5honUjU0tEQF4NL5PV+f61Hfp6ek4fvw4MjIyZNtMTEzg\n4+ODsLAwmJmZaTBdyxUVFeHatWvN1lVVVSExMRGBgYFqSNX6rK2tMWvWLNy6dQuJiYkoKyuDhYUF\nPD094eLiotMX+hGpE5taIiIddvXqVWzfvr3elfFVVVWIi4tDZmYmZsyYoZONbUZGhsKzA6Snp+ts\nU1unZ8+e6Nmzp6ZjEOksjqklItJRFRUViI6ObnKqp+zsbMTExKgxVetRZgorTndFRGxqiQjAo+Yn\nLi4OcXFxuH37tqbjkAISEhIUWuo4KSkJlZWVakjUutq3b6+SWiJqmzj8gEjP3b9/H/v376/XyHbs\n2BHh4eFwcXHRUDJqzo0bNxSqq6qqQkZGBnr37q3iRK3LyckJnTt3bvACqseJRCJOeUVEPFJLpM/u\n3buHtWvXNnhkNjs7G5s2bcL169c1kIwUocyyqbq6xOqwYcOanXe3b9++nHqOiNjUEumzvXv3Nnn6\nWiqVYvfu3RyvqKXs7e1VUqtNXFxcMHHixAYvdBOJROjXrx9GjBihgWREpG04/IBIT929exdZWVnN\n1j18+BApKSnw8PBQQypShr+/Py5cuNBsXZcuXdCpUyc1JFINsViMXr164fLly7h16xakUikcHR3h\n7+8vt2gIEek3NrVEeurxOU0VqWVTq32cnJzg5ubW5FKxIpEIQ4YMUWMq1TA2Noafnx/8/Pw0HYWI\ntBSHHxDpKU6X1DZMmDCh0QvAjIyMMH78eLi6uqo5FRGR+vFILZGe6tixo0pqSb2MjY3xr3/9C3fu\n3MH58+eRl5cHIyMj9OrVC35+flxeVYdUVFTg6tWrKC0thYWFBcRiMczNzTUdi0hnsKkl0lOurq6w\ntbVFYWFhk3UmJibw9vZWUypqKWdnZzg7O2s6BrVAbW0tjhw5ggsXLqC6ulq2ff/+/fD19cWIESNg\nZMQ/10TN4fADIj0lEokwfPjwZutCQ0NhamqqhkRE+kcqlWL79u04d+6cXEMLPJqGLT4+Hlu2bEFt\nba2GEhLpDja1RHqsT58+GD9+fINNq5GREYYNG4aQkBANJCPSD8nJyU1e6AcAaWlpSExMVFMiIt3F\n8xlEes7b2xtisRhJSUm4c+cOBEFAx44d4evry/F8RCoWHx+vUF1cXBxnfiBqBptaIoKJiQkCAgK4\n1ChpPUEQIJVKYWhoqOkoT0wQBGRmZipUe+/ePdTU1HBsLVET+NtBRERaTRAEpKSkIC4uDunp6QAA\nOzs72RexhlYb0wWCIChVz6n1iJrGppaIiLSWVCpFdHQ0Ll++LLe9oKAAMTExuHDhAqZNmwYbGxsN\nJWw5AwMDdOjQATk5Oc3W2tnZwcTERA2piHQXLxQjIiKtdfLkyXoN7ePy8/Px22+/qTFR61J0yI9E\nIlFxEiLdxyO1RESklWpqahAbG9ts3b1793Dr1i307NlTDalal5+fHy5evIj79+83WtO+fXuOd9cB\n9+/fR2xsLG7cuIGamhrY2dnB398f3t7eMDY21nQ8vcCmloiItNLNmzdRXl6uUG1SUpJONrXGxsaI\niorCjh07kJaWVm9/9+7d8dxzz3GuaC136tQpHD16VG5beXk5srKycPbsWUydOlUnh8joGja1RESk\nlcrKylRSq20sLCwQFRWF+/fvIykpCWVlZTA3N4eXlxc6d+6s6XjUjMuXL9draB+Xm5uLzZs345VX\nXoGBAUd9qhKbWiIi0koWFhYK17aFOZU7deqETp06aToGKenUqVPN1uTk5ODatWsQi8VqSKS/+JWB\niIi0Uq9evRRuVr28vFSchqi++/fvIzs7W6HahIQEFachHqklIr1QVFSEK1euoKKiAu3atYOHh4dS\nRwJJ/YyMjBAYGIiTJ082WdexY0edHE9Luq+kpEQltdQybGqJqE2rqKjAnj17kJKSIjfZ/eHDh+Hn\n54cRI0a0idWp2qrQ0FDk5eUhOTm5wf12dnaYPHkyRCKRmpMRQakL+Hixn+qxqSWiNquqqgq//vor\n7t27V29fTU0N4uLiUFxcjEmTJrEp0lIGBgaYMGECxGIx4uLiZMvK2tjYICAgABKJpE2MpyXd5Ozs\nDCsrK4WOwvbp00cNifQbm1oiarPi4uIabGgfl5qaitTUVF7AocVEIhE8PT3h6emJ2tpaSKVSzvtJ\nWsHAwAB9+/ZtcvYD4NFFjxz3rXq8UIyI2iRBEHD+/HmFauPi4lSchlqLoaEhG1rSKiEhIXB3d290\nv6mpKSZNmsRljtWAR2qJqE0qLS1FQUGBQrV37txRcRrVEgQB165dw/nz55Gfnw9DQ0P06tULEokE\n9vb2mo5H1KYZGBhg4sSJOH/+POLj42WzIRgbG8PT0xMhISFwdHTUcEr9wKaWiNqkxy8Ka8vKy8ux\nZcsW3L59W257Tk4Ozp49ixEjRiAoKEhD6Yj0g0gkgkQigUQiQXFxMWpqatCuXTsenVUzDj8gojap\nXbt2sLa2VqhWl1dt2rZtW72Gto4gCDh48GCjMwcQUeuztraGvb09G1oNYFNLRG2SSCSCv7+/QrUS\niUTFaVQjIyMD6enpzdY1N88rEVFbwKaWiNqsoKCgZsey9ezZU2en2rl48aJCdTk5Obh7966K0xAR\naRabWiJqs8zMzDB9+nS4uLjU2ycSieDl5YV//etfMDDQzY/CoqIildQSEekiXihGRG1au3btEBUV\nhZycHCQnJ8uWyfXy8oKtra2m4z0RZcbscXwfEbV1bGqJSC906NABHTp00HSMVtW7d29cu3at2Toz\nMzN0795dDYmIiDRHN8+5ERERvL29FVoi1tfXlwsWEFGbx6aWiEhHGRsbY+LEiU02rN26dUNYWJga\nUxERaQabWiIiHdazZ0+8+OKL6NOnj9wFb1ZWVhg8eDCioqJ4lJaI9ALH1BIR6bhOnTph4sSJsqWB\njYyM0KFDB52d1YGIqCXY1BIRtRGWlpawtLTUdAwiIo3Qqq/xmzZtQlhYGLy9vREZGYnExMRGaxcu\nXAixWAx3d3eIxWLZf2PGjFFjYiIiIiLSBlrT1O7fvx+LFy/GnDlzEB0dDbFYjJkzZyI/P7/B+vff\nfx+nT5/GqVOncPr0aZw4cQI2NjZ4+umn1ZyciIiIiDRNa5radevWYdKkSRg3bhx69eqFf//73zAz\nM8OOHTsarG/Xrh0cHBxk/yUlJaGkpAQRERFqTk5EREREmqYVTW11dTWSk5MRHBws2yYSiRASEoJL\nly4pdB+///47goOD0blzZ1XFJCIiIiItpfSFYlKpFNu3b8ehQ4dw//59VFZWyu0XiUSIiYlR6j4L\nCgpQW1sLR0dHue0ODg64detWs7fPycnBX3/9he+++06px61TXl7eotsRERERkWop2qcp3dR+/fXX\nWLt2LQIDAxEUFKQV8x9GR0fD2toaQ4cObdHt09PTWzcQEREREamV0k3tnj178Oabb+KNN95otRB2\ndnYwNDREbm6u3Pa8vLx6R28b8scff2DcuHEwMmrZDGU9evRQaKlJItJdDx8+xPXr11FZWQkLCwv0\n7t0bZmZmmo5FRETNKC8vV+gApNJdYFVVFfz9/VuSqVHGxsbw8PDAmTNnZEdbBUHAmTNnEBUV1eRt\nz507h8zMTDz33HMtfnxzc3NYWFi0+PZEpL0qKyuxb98+JCcnQyqVyrYfO3YMAQEBGD58OBcpICJq\nA5T+JB8zZgyOHTvW6kFmzJiB7du3Y+fOnbh58yY+/vhjVFRUyGYz+Pbbb/Hee+/Vu93vv/8OHx8f\n9OrVq9UzEZFuq66uxoYNG5CUlCTX0NbtO3v2LHbs2AFBEDSUkIiIWovSR2p9fHzw/fffIy8vDyEh\nIbC2tq5XEx4ernSQkSNHoqCgAEuXLkVubi7c3d2xatUq2NvbAwByc3Nx7949uds8fPgQMTExeP/9\n95V+PCJq++Li4nD37t0ma65cuYJr167Bzc1NTamIiEgVRIKShyjEYnHTdygSISUl5YlCqUtZWRlS\nUlLg7u7O4QdEbYwgCFi2bBkKCgqarXV1dcXzzz+vhlRERKQsRfs1pY/UHj169ImCERGpQ2lpqUIN\nLQDcvn1bxWmIiEjVlG5qnZycVJGDiKhVKXMSimNqiYh0X4vmwBIEASdOnMD58+dRVFQEGxsbSCQS\nDBo0CCKRqLUzEhEpzdLSElZWVigpKWm2tlOnTmpIREREqqR0U1tUVIRZs2YhISEB1tbWcHBwQF5e\nHv73v//B19cXK1eubPDiMSIidTIwMIC/vz9OnDjRbK1EIlFDIiIiUiWlp/RasmQJMjMzsXr1asTG\nxuLAgQOIjY3F6tWrkZmZiSVLlqgiJ5HGlZeXIzs7G/n5+ZqOQgoKCgqCg4NDkzXdu3dHnz591JSI\niIhURenZD/r164d3330XEyZMqLfv999/xzfffIOzZ8+2WkBV4uwHpIisrCycPn0aV69elc112r59\ne/Tt2xcBAQEccqPlSkpKsGPHDmRkZNTb16dPH4wdOxYmJiYaSEZERIpQ2ewH5eXljS5d2759e5SX\nlyt7l0Ra69q1a9i2bRtqa2vltj948AD79u1DRkYGIiIi2NhqMSsrK8yYMQP37t1DcnIyKioq0K5d\nO3h7e8vmwSYiIt2ndFPr7u6OjRs3YsCAATA0NJRtl0ql2LBhA0/jUZtRWlqK33//vV5D+7jLly/D\nyckJ/fr1U2MyaonOnTujc+fOmo5BREQqonRTO3/+fLz44osYPnw4hg4dCkdHR+Tl5SEmJga5ublY\ns2aNKnISqd3FixdRXV3dbF1cXByCgoJ4tJaIiEiDlG5qAwMDsWXLFqxYsQJ79+5FcXExbGxsEBAQ\ngFdffRUeHh6qyEmkdlevXlWoLj8/H9nZ2ZwWioiISINaNE+tp6cnli9f3tpZiLRKZWWlwrVVVVUq\nTEJERETNUXpKLyJ9ocx8y1ZWVipMQkREukAQBOTk5CArKwtlZWWajqN3FDpS++qrr2LBggXo0aMH\nXn311SZrRSIRfv7551YJR6RJvr6+SEtLa7auR48esLOzU0MiImrLqqqqkJqairKyMpibm8PNzQ2m\npqaajkUKqK2txdmzZxEfH4/CwkIAjxaAcXNzw8CBA3mRqpoo1NSWlpbKrgAvLS1VaSAibdGnTx+c\nPHkSubm5jdaIRCIMGDBAjamIqK2RSqU4evQo4uPj5YYymZiYwM/PD8OHD5ebbYi0S21tLbZs2YKb\nN2/KbZdKpUhJScH169cxefJk9OrVS0MJ9YfSiy+0JVx8gZpTWFiIjRs3Ii8vr94+AwMDjB49Gn5+\nfhpIRkRtgSAI2L59O1JSUhqteeqppzB58mQYGHDEoDb6888/cfLkySZrTE1NMW/ePB55byFF+zWl\nf0OWL1+O7OzsBvfl5OTwAjJqU2xtbfHKK6/g2WefRdeuXWFlZQUHBwcEBwfjjTfeYENLRE/kypUr\nTTa0AHD9+nUkJiaqKREpo7a2FufPn2+2rrKyEgkJCWpIpN+Unv3gxx9/xKBBg9CxY8d6+3JycvDj\njz9i9uzZrRKOSBsYGxvDz8+PDSwRtbq4uDiF6uLj4+Hr66viNKSsO3fuKDws8+rVq+jbt6+KE+k3\npY/UNjVa4cGDB0pdMU5ERKSvBEFAZmamQrV3795FTU2NihORspSZzpFTP6qeQkdq9+7di7179wJ4\ndGHMkiVL6k1hVFVVhcuXL8Pf37/1UxIREbUxgiA0eaDon6RSqQrTUEvY2NiopJZaRqGmtrq6WnZ4\nXRAElJeX1xuwbmJigrFjx2LmzJmtn5KIiKiNMTAwgKOjY5MzrNSxtbWFiYmJGlKRMjp06IAuXbog\nKyur2VoOH1E9hZra8ePHY/z48QCAqKgofPLJJ5yagoiI6AlJJBIcPHhQoTrSTgMHDsRvv/3WZE2X\nLl3g6uqqpkT6S+kLxTZs2KCKHERERHrHz88PFy9ebHRWIQBwdHREQECAGlO1PqlUitTUVJw/fx45\nOTkwMDBA9+7dERgYCGdnZ03HeyJisRgjR47EgQMHGhxO0rlzZ0yZMgUikUgD6fRLi+aplUqlOHv2\nLG7dulVv4LNIJMKMGTNaK59KcZ5aIiLStNLSUmzfvh0ZGRn19jk7OyMyMlKnl+KurKzE1q1bkZ6e\n3uD+oKAgPP300+oNpQL5+fmIj4/HjRs3UF1dDXt7e/j7+8Pd3Z1zDD8hRfs1pZvaBw8eYOrUqcjI\nyIBIJJJ9K3n8G0hzc+5pCza1RESkLe7evYukpCTZMrmenp7o2rWrpmM9sa1btyI1NbXJmuHDhyMk\nJERNiUjXKNqvKT38YPHixbCzs8Ovv/6K0NBQbNu2DY6Ojti9ezd27tyJlStXPlFwIiJVqqmpgZGR\n0h99RCrn5OQEJycnTcdoVTk5Oc02tADw999/IygoiMsB0xNR+pM9Li4OH3zwAdq3by/b1qVLF7z6\n6qsQBAGffvopVq1a1aohiYieRFZWFmJjY5GcnIyamhqYmZnB29sbffv2hYODg6bjEbVZly5dUqiu\ntLQU169fh1gsVnEiasuUHuRRUlICOzs7GBgYoF27dsjLy5Pt8/X1VWi5OCIidTl//jxWrVqFhIQE\n2eT1FRUViI2NxS+//IIbN25oOCFR21VSUqJwbXFxsQqTkD5Quql1dnaWXaXp6uqKXbt2yfbFxMTA\n1ta29dIRET2BzMxM7Nu3r9EJ7qurq7Ft2zYUFhaqORmRflBmbl1TU1MVJiF9oHRTO3jwYJw+fRoA\n8NprryEmJgbBwcEYOHAgNm/ejKlTp7Z6SCKiljhz5kyzKzZVV1cjPj5eTYmI9IuiwwmMjIzw1FNP\nqTgNtXVKj6mdP3++7P9DQ0OxZcsWxMTEoKKiAiEhIQgNDW3VgERELVFVVaXQBSoAkJSUhGHDhqk4\nEZH+cXV1hYODg9xQxYZ4enpyFiJ6Yk98CbCXlxe8vLxaIwsRUaspLy9v9ihtnbKyMhWnIdJPIpEI\nkyZNwvr161FaWtpgjZOTU5uYp1Yf5OfnIyEhASUlJTAzM4O7u7tWTTunUFOr7HgzjqslIk0zNzeX\nm0u7KTxCRKQ67du3x8svv4xTp04hMTFRtmiTtbU1AgICEBwcDGNjYw2npKZUVVVh9+7dSE5Oltt+\n5swZODk54bnnntOK3k+hprZfv35KLe+mK4svEFHbZWJigt69eys0BMHT01MNiYj0l42NDUaNGoXh\nw4ejqKgIBgYGspmUSLtJpVL89ttvSEtLa3D/3bt3sW7dOrz88suwtLRUczp5CjW1X3zxBdcsJiKd\nExwc3GxTa2xsDIlEoqZERPrNxMREbp570n6pqamNNrR1ioqK8Pfff2P48OFqStUwhZraiIgIVecg\nImp13bt3x8iRI3HgwIEGhyEYGRnhueeeg52dnQbSERFpP0Vnh7l48SLCwsI0uipciy8UKyoqwvXr\n13Hv3j0MGjQINjY2qKyshLGxMU8nEJHWCAwMROfOnREbG4srV66gtrYWJiYm8Pb2RlBQEBwdHTUd\nkYhIa92/f1+huvLychQXF2v0IIHSTa1UKsX333+PDRs2oLy8HCKRCL///jtsbGwwe/Zs+Pj4YPbs\n2arISkTUIs7OznB2dsb48eNRXV0NY2NjDqkiIlKAMp+Vmv5cVfqQ6g8//ICNGzfivffew6FDh+RO\n6YWFheHYsWOtGpCIqLWIRCKYmJho/IOXiEhXdOvWTaE6a2trWFtbqzhN05Q+UhsdHY23334bkydP\nRm1trdy+bt264fbt260Wjkgb1NbWIiUlBRcvXkRhYSGMjY3h5uaGgIAAjf8CExGRdqmqqkJNTQ3M\nzMzaxHBMiUSi0KxWAQEBGn++Sje1hYWF6NWrV4P7amtrUVNT88ShiLRFSUkJNm7ciJycHLnt2dnZ\nOH36NMaOHcvFR4iICMnJyYiNjUVmZiaAR3Nl+/r6IigoCDY2NhpO13IuLi7w8fFBQkJCozWdO3dG\nv3791JiqYUq31D169MDp06cb3BcbG8u1m6nNqK2tbbChfXx/dHQ00tPT1RuMiIi0hiAI2LVrF37/\n/XdZQws8unDqzJkzWLlypcIXW2mrsWPHYsCAATAxMZHbbmBgAE9PT0ybNq3ePk1Q+kjtjBkz8OGH\nH8LIyEi2rN39+/dx6dIlbNiwAV9++WWrhyTShKtXrzba0NYRBAF//fUXevTooZ5QRESkVc6dO4dL\nly41ur+srAybN2/GnDlzYGTU4kmnNEokEmHo0KEYOHAgUlJSUFJSAlNTU4jFYlhZWWk6nozSr25E\nRASKioqwbNky/PLLLwCAN954A+bm5pg7dy5GjhzZ6iGJNKGpD6nHpaWlobCwUCuWCCQiIvURBAHn\nzp1rtq6kpASXL1+Gr6+vGlKpjomJCXx8fDQdo1Et+srwwgsvIDIyEhcvXkRBQQFsbGzg5+enVd06\n0ZMqLCxUuLa4uJhNLRGRnrlz547CfyuSk5N1vqnVdko1tZWVlXjrrbfw0ksvITAwEAMGDFBVLiKN\nU2Z8kLGxsQqTEBGRNqqoqFC4try8XIVJCFDyQjFTU1PExcXVm8qLqC1yc3NTqM7W1hadOnVScRoi\nItI2lpaWKqmlllF69oP+/fs3OvsBUVvi7++v0KB+iUTCyfyJiPRQly5dFF5q29vbW8VpSOkxtRMm\nTMBHH32E0tJShIaGwsHBod4fdA8Pj1YLSKQp7dq1w/jx47Fjxw5IpdIGa9zc3BAcHKzmZEREpC2C\ng4OxZ8+eJmvs7e0hFovVlEh/iYTH17lVwD/flMcbWkEQIBKJFFp5QhuUlZUhJSUF7u7usLCw0HQc\n0gTd86gAACAASURBVFKZmZk4deoUbty4IVsW2s7ODhKJBP369dP4CipERKRZMTExjZ7FtrGxQVRU\nFBwcHNScqu1QtF9T+kjtr7/++kTBiHRNt27dMGXKFJSUlKCoqAgmJiZo3749hxwQEREAYNiwYXB1\ndUVcXByuX7+Ompoa2NnZwd/fH/7+/jA3N9d0RL2gVFNbVVWFwsJCuLu7o2vXrqrKRKSVrKysOG0d\nERE1qEePHlyIR8OUOm9qYmKC+fPnIysrS1V5iIiIiIiUpvRgQBcXF9y7d08VWYiIiIiIWkTppvbt\nt9/Gzz//jKSkJFXkISIiIiJSmtIXin3zzTcoLCxEZGQkbG1t683PJhKJsHv37lYLSERERETUHKWb\nWg8PD3h6eqoiCxERERFRiyjd1C5evFgVOYiIiIiIWuyJZo2vqKhATk4OKioqWisPEREREZHSlD5S\nCwB//vknli9fjpSUFNkqYu7u7pgzZw5CQ0NbOyMRERERaVhmZiYSEhJQUlICU1NT9OnTB25ublqz\nsqbSTW1MTAzefPNN+Pj4YMGCBXB0dMSDBw9w8OBBvPbaa1i6dCmGDRumiqxEREREpGZlZWXYtm0b\nMjIy5LZfvnwZtra2mDx5Mjp27KihdP9HJNQtZq+gcePGwdXVFd988029fe+88w5u3LiBnTt3tlpA\nVVJ0LWEiIiIifVRTU4O1a9c2ufCWhYUFXn75Zdja2qokg6L9mtLHi9PS0jBu3LgG940dOxZpaWnK\n3iURERERaaHk5ORmV5ItKyvD33//raZEjVN6+IGNjQ1u3bqFAQMG1Nt369Yt2NjYtEowIiIiajvS\n09Nx/vx55OTkwMDAAN27d0dgYCAcHBw0HY2acOHCBYXqEhISMHz4cBgbG6s4UeOUbmpHjhyJ7777\nDmZmZhgxYgSsra1RUlKCgwcP4vvvv0dkZKQqchIREZEOqqmpwY4dO3D16lW57ffv38e5c+cwePBg\nXmSuxR48eKBQXVVVFUpKSmBvb6/iRI1TuqmdP38+srKy8OGHH+Kjjz6CkZERampqIAgCwsPD8fbb\nb6siJxEREemgPXv21GtoH3f8+HFYWlpCIpGoMRUpytDQUCW1qqB0U2tiYoJly5YhNTUV8fHxKC4u\nho2NDQICAuDm5qaKjERERKSD8vLykJiY2GzdX3/9BX9/f62ZGor+j4uLi0LvoYODA6ytrdWQqHEt\nmqcWANzc3Fq9id20aRNWr16N3NxciMVifPDBB/D29m60vqqqCj/++CP27NmDBw8eoEOHDnjjjTcQ\nERHRqrmIiIhIeRcvXlSorri4GDdv3sRTTz2l4kSkrMDAQIWaWolEApFIpIZEjVPoK1F6ejoiIiJw\n4sSJRmtOnDiBiIgI3L59u0VB9u/fj8WLF2POnDmIjo6GWCzGzJkzkZ+f3+ht3nrrLZw7dw5ffPEF\nDh06hO+++w49e/Zs0eMTERFR6yoqKlK4trCwUIVJqKWcnZ0REhLSZE3Pnj0RGBiopkSNU6ipXbNm\nDSwsLJocyB0aGgpLS0usXv3/sXfvcTXl+//AX7t7SShMKrdCRREql6FMMWeEwbgdTHSIYTSMcxzX\nOcb9MsQwDMOgzHAwjGsuQ2aOW7q5U+65Jkpula7r90e/9tdWsau999pr9Xo+Hh4P1l7Vy8xbvfdn\nvddnrStXkLCwMAwYMAC9evWCk5MTZs6cCTMzM+zYsaPE848dO4b4+HisWbMGbdu2hZ2dHVq0aIGW\nLVuW6+sTERGRZhkZqX9BWMy75undunTpgq5duxYbLzA1NUXbtm0xaNAg0edpATXHD06ePImQkJD3\nntenTx+sWLGizCFyc3Nx+fJlfPHFF8pjCoUC7du3x7lz50r8mD///BNubm5Yu3Ytdu/eDXNzc/j5\n+eHrr7+GqalpmTMQERGRZjk7O5f6c/xNBgYGaNSokQ4SUXl5e3vD09MTSUlJePHiBczMzODo6AgT\nExOxoymp1dSmpKSgbt267z3PwcEBKSkpZQ6Rnp6O/Px81KxZU+W4jY0Nbt++XeLH3Lt3D3FxcTAx\nMcHKlSuRnp6OGTNm4Pnz55g3b16ZMxAREZFmNWnSBNWqVXvvGELTpk1haWmpo1RUXgYGBnB0dBQ7\nRqnUamqrVKmC9PT095737NkznT1uVhAEGBgYIDQ0FFWqVAEATJkyBePGjcOMGTPK9M4hKytLWzGJ\niIgqtR49euC3335DdnZ2ia/b2NigU6dOyMzM1HEykgp1+zS1mlo3Nzfs378fXbp0eed5ERERcHNz\nU+sLv6lGjRowNDREamqqyvG0tLRiq7dFatWqhQ8++EDZ0AKF204IgoBHjx6hXr16an/9pKSkMmcm\nIiIi9bRt2xbXr19HcnIyBEEAUDhD6+DggMaNG/PnMGmEWk3toEGDMGbMGDg5OWH06NHFhoELCgrw\n448/4uDBg1i5cmWZQxgbG6NZs2aIioqCv78/gMKV2KioKAQGBpb4Ma1atcKhQ4eQlZUFc3NzAIWP\n6TUwMICtrW2Zvn6DBg2Un4OIiIg0z9vbGxkZGUhPT4eBgQFq1arFm8NILVlZWWq98VGrqfX390dw\ncDBWrFiBLVu2oF27drCzswMAJCcnIyoqCqmpqRg+fDj8/PzKFTgoKAhTpkyBm5sb3N3dER4ejtev\nXyv3nA0NDcXjx4+xcOFCAED37t2xatUqTJkyBV999RWePn2KRYsWoU+fPmUeWjY3N9fZ2AQREVFl\nZWFhgVq1aokdg2RK7b02JkyYAC8vL6xfvx6HDh1CTk4OgMLtHFq1aoU5c+ZU6NnNAQEBSE9Px/Ll\ny5GamgpXV1f8/PPPymcIp6amIjk5WXm+hYUF1q9fjzlz5qBv376oXr06unbtiq+//rrcGYiIiIhI\nmhRC0XBLGeTn5ys3Sa5evbpe7E1WHpmZmUhISICrqytXaomIiIj0kLr9Wrkek2toaAgbG5tyhyMi\nIiIi0iS1nihGRERERKTP2NQSERERkeSxqSUiIiIiyWNTS0RERESSp5Gm9v79+zh16pRyRwQiIiIi\nIl0q8+4HCxYsQH5+PqZNmwYAOHz4MMaPH4+8vDxUq1YN69atK9ejcomIiIiIyqvMK7WHDx9WaVqX\nLFkCX19f7NmzB+7u7vj+++81GpCIiIiI6H3K3NQ+efJE+Yjcu3fv4vbt2xg9ejSaNGmCwMBAXLp0\nSeMhiYiIiIjepcxNbdWqVZGWlgYAOHnyJKpVq6ZcuTUxMUF2drZmExIRERERvUeZZ2o9PT2xfPly\npKWlYd26dejcubPytVu3bqFOnToaDUhERERE9D5lXqmdOnUqatasicWLF8POzg7jx49XvrZnzx54\nenpqNCARERER0fuUeaX2gw8+wMaNG0t8bd26dTAxMalwKCIiIiKisijzSu2hQ4fw9OnTEl+ztLRk\nU0tEREREOlfmldp//etfyM/PR4MGDeDl5QVPT094enoqd0QgkiNBEJCUlIRnz57BxMQEjo6OMDc3\nFzsWERER/X9lbmpjYmJw5swZxMXFIS4uDrt27UJubi7q1KkDT09PeHl5oV+/ftrISiSKc+fO4dix\nY0hPT1ceMzIygru7Oz7++GOYmZmJmI6IiEg3nj59ivPnz+Ply5cwMzODq6sr6tatK3YsJYUgCEJF\nPkFOTg6io6OxZs0axMbGQqFQICEhQVP5tCozMxMJCQlwdXWFhYWF2HFID508eRJHjhwp9XVbW1sE\nBQXB1NRUh6mIiIh0JycnB3v27MHly5eLvWZvb4++ffuievXqWvv66vZrZV6pLfrkZ86cQWxsLGJj\nY3Hx4kWYmprCx8cHXl5e5Q5NpE+ePn36zoYWAB49eoTjx4+rbG1HREQkFwUFBdi6dStu3bpV4usP\nHjxAWFgYRowYgSpVqug4naoyN7X9+vVDQkICqlatCk9PT3z88ceYNm0aXF1dYWBQ5vvOiPRWbGys\nWuedPXsWnTp1gpFRud4jEhER6a2rV6+W2tAWef78OU6dOoUuXbroKFXJytyFXrx4EYaGhvjwww/h\n4+MDX19fNGvWjA0tyU5SUpJa52VmZiIlJUW7YYiIiEQQFxen1nlnz55Ffn6+ltO8W5mXlqKiohAX\nF4fY2Fj897//xbfffgtra2vlTWKenp5wdnbWRlYinSrLP06x/yETERFpw6NHj9Q6LysrCy9evECN\nGjW0nKh0ZW5qa9SogS5duiiXmF+9eoWYmBhs2LABc+bMgUKhwJUrVzQelEjXatWqhSdPnrz3PAMD\nA9jY2OggERERkW4pFAqtnKsN5RoCzMnJwYULFxAbG4u4uDicPXsWmZmZsLGx4WNySTZatWql1hs0\nFxcX0YfjiYiItKFevXpq7WplZWUFKysrHSQqXZmb2sGDB+PSpUvIzs6Gra0tvLy8MHnyZHh6esLR\n0VEbGYlE4ejoCCcnJ9y8ebPUc0xMTODr66vDVERERLrj6empVlPbunVr0e+vKnNT26BBA/Tr1w+e\nnp5wcHDQRiYivaBQKNC/f3/s3LkTiYmJxV63tLRE//79Ubt2bRHSERERaZ+joyNatGiB8+fPl3pO\nnTp10LZtWx2mKlmFH74gZXz4Aqnr0aNHOHv2LJ4/fw5jY2M0adIETZs2haGhodjRiIiItEoQBBw9\nehQxMTHIyclRHjcwMEDTpk3RrVs3rT5dU91+rVxNbW5uLrZv346LFy/i0aNHmD59Oho0aID9+/fD\n2dkZTk5OFQqvK2xqiYiIiNSTk5ODhIQEvHz5EqampnBxcUHVqlW1/nW19kSxe/fuISgoCOnp6Wja\ntCni4+ORkZEBoHCz+uPHj2P+/PnlT05EREREesfExAQtWrQQO0apytzUzpkzB9bW1vjtt99gZWUF\nNzc35WteXl5YsmSJRgOSNLx69QrXr19HTk4OqlWrhsaNG/PSPBEREelMmZvamJgYhIaGwtrautiG\n8+ru60ny8fr1a+zfvx+XL19GQUGB8niVKlXw4Ycfol27diKmIyIiosqizE2toaEhShvDTU1N5Wxq\nJZKdnY2wsLASHxGbkZGBP/74A69evRL9WdBEREQkf2XeUMzLywsbNmxAbm6u8phCoYAgCNi2bRtX\n5iqREydOlNjQvunUqVNITk7WUSIiIiKqrMq8UjthwgQMHDgQ3bp1g5+fHxQKBTZt2oTr16/jzp07\n+O2337SRk/RMfn4+zp49q9a5sbGx+PTTT7WciIiIiCqzMq/UOjk5YceOHWjZsiX27dsHQ0ND/PXX\nX6hXrx5+++031KtXTxs5Sc+kpqYqd714nzt37mg5DREREVV2ZV6pBYC6deti4cKFms5CEvLmTWHv\nU4mf70FEREQ6Iu5DekmyrK2tYWxsrNa5fIwsERERaVuZV2oLCgrw22+/4dChQ3j06BGys7NVXlco\nFDhy5IjGApJ+MjU1hZubm1pztZ6enjpIRERE+uzFixc4c+YMnjx5AoVCgfr166NFixYwMTEROxrJ\nRJmb2kWLFmHDhg3w8vJCmzZt1F6tI/np2LEjrl69iszMzFLPadSokWQem0xERJonCAKOHDmC06dP\nq4yuXb58GZGRkejWrRvc3d1FTEhyUeamdu/evfjqq68wZswYbeQhCalRowaGDh2Kbdu2IS0trdjr\nzZo1Q8+ePaFQKERIR0RE+iAyMhKnTp0q8bXs7Gzs3LkTJiYmcHZ21nEykpsyN7U5OTlo1aqVNrKQ\nBNWuXRtjxozBzZs3kZiYiJycHFhZWcHDwwM1a9YUOx4REYno5cuXiIqKeuc5RSu5bGqposrc1Pbo\n0QNHjx7lQxZISaFQoFGjRmjUqJHYUYiISI+cPXtWrd1yUlNTcefOHdSvX18HqUiu1Gpq//jjD+Xv\nPTw8sHTpUqSlpaF9+/awsrIqdv7HH3+suYREREQkSampqWqf+/jxYza1VCFqNbVjx44tduzhw4fY\nv39/seMKhQIJCQkVT0ZERESSZmCg/s6hhoaGWkxClYFaTW1kZKS2cxAREZHMNGjQAOfPn1f7XKKK\nUKuptbe3V/7+4cOHqFWrVolbeeXl5eHx48eaS0dERESS5ebmhj/++ANZWVnvPM/JyQnW1tY6SkVy\nVeYnivn7+5c6XpCYmAh/f/8KhyIiIiLpMzIyQs+ePd85hlClShUEBAToMBXJVZmbWkEQSn0tJyeH\nTwYhIiIiJWdnZwwaNAi2trYqxxUKBRo3boxhw4ZxlZY0Qq3xg5s3b+LmzZvKP0dHR+PRo0cq52Rn\nZyMiIgJ169bVbEIiIiKSNCcnJzg5OeHBgwd4/PgxDAwMUK9ePdSoUUPsaCQjajW1Bw4cwIoVKwAU\nvrMKDQ0t8TwrKyvMnz9fc+mIiIhINuzt7VXu0yHSJLWa2qFDh6J3794QBAGdO3fGihUr4OrqqnKO\nsbExatWqxUeiEhEREZHOqdXUVq1aFVWrVgVQuL1X7dq137n7gZ2dnWZTEhERERG9Q5lvFOvcuTN3\nPyAiIiIivcLdD4iIiIhI8rj7ARERERFJHnc/ICIiIiLJ4+4HRERERCR55dr9oFatWpydJSIiIiK9\noVZT+6Y3N03OyspCdnZ2sXOqV69esVRERERERGVQ5qZWEAT8+OOP2Lp1K548eVLiOaVt+UVERERE\npA1l3tIrLCwMYWFhGDx4MARBwKhRozBmzBg0aNAA9vb2mD17tjZyEhERERGVqsxN7fbt2/HVV18h\nODgYQOHDGEJCQhAREQEnJyfcvXtX4yGJiIiIiN6lzE3tgwcP4OrqCkNDQxgZGeHFixeFn8jAAIMG\nDcLvv/+u8ZBERERERO9S5qa2evXqePXqFQDAzs4OV65cUb6Wnp6O169fay4dEREREZEaynyjWKtW\nrXDx4kV89NFH6N69O1asWIHU1FQYGRlh27ZtaNeunTZyEhERERGVqsxNbUhICFJSUgAAo0aNwosX\nL7Bv3z5kZ2ejffv2+M9//qPxkERERERE76IQBEEQO4RYMjMzkZCQAFdXV1hYWIgdh4iIiIjeom6/\nVuaZWiIiIiIifaPW+MGUKVPU/oQKhQLz5s0rV5hNmzZh3bp1SE1NhYuLC7755hs0b968xHNjYmIw\nZMiQYl/7xIkTsLGxKdfXJyIiIiJpUqup3blzJ6pUqYJ69erhfdMKCoWiXEH279+PBQsWYPbs2XB3\nd0d4eDiCg4Nx8OBBWFtbl/q1Dh06hCpVqiiPsaElIiIiqnzUamo9PDxw/vx55Ofno3v37ujWrRvs\n7e01GiQsLAwDBgxAr169AAAzZ87EX3/9hR07dmDEiBGlfpy1tTUsLS01moWIiIiIpEWtmdotW7Yg\nMjISPXr0QEREBDp37oyBAwdi06ZNePr0aYVD5Obm4vLlyyrbgSkUCrRv3x7nzp0r9eMEQUDPnj3R\noUMHDBs2DGfOnKlwFiIiIiKSHrW39LKzs8OIESMwYsQI3LhxA/v27cPGjRsxf/58tG3bFoGBgfD1\n9S1XiPT0dOTn56NmzZoqx21sbHD79u0SP6ZWrVqYNWsW3NzckJOTg23btmHIkCH47bff4OrqWqav\nn5WVVa7cpEoQBOTn58PIqMw7xRERERGVSN0+rVzdR6NGjfD1119j9OjRWLZsGcLCwmBmZlbuprY8\nGjZsiIYNGyr/7OHhgXv37iEsLAwLFy4s0+dKSkrScLrKJS0tDUlJSUhJSUFBQQFMTExQt25dNGjQ\nAObm5mLHIyIiokqgzE1tfn4+Tpw4gf379yMyMhKGhobo27cv+vbtW+4QNWrUgKGhIVJTU1WOp6Wl\nFVu9fRd3d/dyjSCw+Sq/06dPIyoqSuVYTk4Obt68iQcPHqBPnz6ws7MTKR0RERFJXVZWlloLkGo3\ntbGxsdi3bx8OHjyInJwc+Pv7Y/HixejQoUOFLzcbGxujWbNmiIqKgr+/P4DCS9lRUVEIDAxU+/Mk\nJiaidu3aZf765ubmfPhCOSQkJOD48eOlvv769Wv8/vvvGDt2LMzMzHSYjIiIiCobtbpRX19fpKen\nw8fHBzNmzICfnx9MTU01GiQoKAhTpkyBm5ubckuv169f47PPPgMAhIaG4vHjx8rRgvDwcDg4OKBx\n48bIzs7Gtm3bEB0djfXr12s0F5Xu7RXakmRlZeHs2bMqNwESERERaZpaTW1KSgqMjIxw8uRJnDp1\n6p3nKhQKxMfHlzlIQEAA0tPTsXz5cqSmpsLV1RU///yzco/a1NRUJCcnK8/Pzc3FwoUL8fjxY5iZ\nmcHZ2RlhYWHw8vIq89emsnv27Bnu3bun1rmXLl1iU0tERERapVZTGxISou0cAIDBgwdj8ODBJb42\nf/58lT8HBwcjODhYF7GoBJmZmWqfm5GRocUkRERERHrW1JJ0lGUGmfPKREREpG1qPXyB6G3Vq1eH\ng4ODWue6u7trOQ0RERFVdmxqqdzUmZM1NzeHh4eHDtIQERFRZcamlsqtadOm6NSpU6mvm5mZYeDA\ngdwDmIiIiLSOzzOlCvH19UW9evUQExODq1evQhAE5eqst7c3qlevLnZEIiIiqgTY1FKFFT2yuKCg\nAHl5eTAxMRE7EhEREVUyHD8gjTEwMGBDS0RERKJgU0tEREREksemloiIiIgkj00tEREREUkem1oi\nIiIikjw2tUREREQkeWxqiYiIiEjy2NQSERERkeSxqSUiIiIiyWNTS0RERESSx6aWiIiIiCSPTS0R\nERERSR6bWiIiIiKSPDa1RERERCR5bGqJiIiISPLY1BIRERGR5LGpJSIiIiLJY1NLRERERJLHppaI\niIiIJI9NLRERERFJHptaIiIiIpI8NrVEREREJHlsaomIiIhI8tjUEhEREZHksaklIiIiIsljU0tE\nREREksemloiIiIgkj00tEREREUkem1oiIiIikjw2tUREREQkeWxqiYiIiEjy2NQSERERkeSxqSUi\nIiIiyWNTS0RERESSx6aWiIiIiCSPTS0RERERSR6bWiIiIiKSPDa1RERERCR5bGqJiIiISPLY1BIR\nERGR5LGpJSIiIiLJY1NLRERERJLHppaIiIiIJM9I7AAkD4Ig4PHjx8jJyYGVlRWqVasmdiQiIiKq\nRNjUUoUIgoDo6GjExMQgPT1debxhw4bo2LEjGjZsKGI6IiIiqizY1FK5CYKA7du348qVK8Veu337\nNpKSktCrVy80b95chHRERERUmXCmlsotJiamxIa2iCAI2L17N549e6bDVERERFQZsamlchEEAbGx\nse89r6CgAPHx8TpIRERERJUZm1oql7S0NKSlpal17tWrV7WchoiIiCo7NrU6VFBQgIKCArFjaERO\nTo7a5+bm5moxCRERERFvFNO6vLw8nDt3DnFxcUhJSQEA2NnZwdPTE82bN4ehoaHICcvHysoKCoUC\ngiC891xu70VERETaxpVaLXr9+jXCwsIQERGhbGgB4OHDh9izZw9+/fVXya5iWlpaonHjxmqd27Jl\nSy2nISIiosqOTa0W7d69Gw8ePCj19aSkJEREROgwkWZ17NgRBgbvLqGaNWuiWbNmOkpERERElRWb\nWi15+vQpEhMT33vexYsX8fLlSx0k0jwHBwf07dsXRkYlT7HUrFkTn3/+eamvExEREWkKuw0tuXTp\nklrnFRQU4MqVK2jTpo2WE2mHq6srxo0bhzNnzuDq1avIzs5GtWrV0LJlS7i6ukp2ZpiIiIikhU2t\nlmRkZKh9bmZmphaTaJ+lpSV8fHzg4+MjdhQiIiKqpDh+oCUWFhZqn2tubq7FJERERETyx6ZWS9zc\n3NQ6z8DAgDdSEREREVUQm1otsbGxgbOz83vPc3NzQ9WqVXWQiIiIiEi+2NRqUa9evWBnZ1fq6/Xr\n10e3bt10mIiIiIhInvSqqd20aRP8/PzQvHlz9O/fHxcuXFDr4+Lj49GsWTP07t1bywnLxszMDEFB\nQejatStq1aqlPP7BBx+ge/fuCAwMhImJiYgJiYiIiORBb3Y/2L9/PxYsWIDZs2fD3d0d4eHhCA4O\nxsGDB2FtbV3qx718+RKTJ09Gu3btkJaWpsPE6jE2Noa3tze8vb2Rl5cHANy3lYiIiEjD9GalNiws\nDAMGDECvXr3g5OSEmTNnwszMDDt27Hjnx3377bfo0aMHPDw8dJS0/IyMjNjQEhEREWmBXjS1ubm5\nuHz5Mtq1a6c8plAo0L59e5w7d67Uj9uxYwfu37+PkJAQXcQkIiIiIj2lF8uG6enpyM/PR82aNVWO\n29jY4Pbt2yV+TFJSEpYuXYrNmzfDwEAvenMiIiIiEoleNLVlVVBQgAkTJuCrr75CvXr1AACCIJT7\n82VlZWkqGhERERFpkLp9ml40tTVq1IChoSFSU1NVjqelpRVbvQUKH0F76dIlJCYmYtasWQAKG11B\nEODm5oZ169ahTZs2an/9pKSkCuUnIiIiInHpRVNrbGyMZs2aISoqCv7+/gAKV16joqIQGBhY7HxL\nS0vs27dP5dimTZsQHR2NH374Afb29mX6+g0aNOCjaomIiIj0UFZWlloLkHrR1AJAUFAQpkyZAjc3\nN+WWXq9fv8Znn30GAAgNDcXjx4+xcOFCKBQKNGrUSOXjbWxsYGpqCicnpzJ/bXNzc1hYWGjk70FE\nREREuqc3TW1AQADS09OxfPlypKamwtXVFT///LNyj9rU1FQkJyeLnJKIiIiI9JFCqMgdVhKXmZmJ\nhIQEuLq6cqWWiIiISA+p26/pzUqt3D179gzJyclQKBSws7ODlZWV2JGIiIiIZINNrZY9fvwYR44c\nwY0bN5TbjikUCjg7O6Nz586wsbEROSERERGR9LGp1aLk5GSEh4cjOztb5bggCEhMTMTdu3cRFBSE\nWrVqiZSQiIiISB74KC4t+v3334s1tG/KzMzE7t27dZiIiIiISJ7Y1GrJ7du3iz1MoiQPHjzAw4cP\ndZCIiIiISL7Y1GrJzZs3tXIuERERERXHplZL8vLytHIuERERERXHplZLyrKrAXdAICIiIqoYeluY\njgAAIABJREFUNrVa4u7uDmNj4/eeZ25ujqZNm+ogEREREZF8sanVEjMzM3z44YfvPc/HxwdGRtxZ\njYiIiKgi2NRqka+vLz788EMoFIpirykUCnz00Udo27atCMmIiIiI5IVLhFrWuXNntG7dGvHx8UhO\nTgYA2Nvbw9PTk4/KJSIiItIQNrU6UKNGDXTu3FnsGERERESyxfEDIiIiIpI8NrVEREREJHlsaomI\niIhI8tjUEhEREZHksaklIiIiIsljU0tEREREksemloiIiIgkj00tEREREUkem1oiIiIikjw2tURE\nREQkeWxqiYiIiEjy2NQSERERkeSxqSUiIiIiyWNTS0RERESSx6aWiIiIiCSPTS0RERERSR6bWiIi\nIiKSPDa1RERERCR5bGqJiIiISPLY1BIRERGR5BmJHaAySE1NRVxcHB4+fAiFQgF7e3t4enrC2tpa\n7GhEREREssCmVosEQcChQ4cQHR2tcvzu3buIiopChw4d4O/vL1I6IiIiIvng+IEW/fnnn8Ua2jed\nOHECJ0+e1GEiIiIiInliU6slWVlZiIqKeu95J06cQG5urg4SEREREckXm1otuXjxIvLy8t573uvX\nr3HlyhUdJCIiIiKSLza1WvL06VOtnEtERERExbGp1RIjI/XvwSvLuURERERUHJtaLWncuLFWziUi\nIiKi4tjUakn9+vVRu3bt955Xt25d2Nra6iARERERkXyxqdWizz77DObm5qW+XqVKFfTq1UuHiYiI\niIjkiU2tFn3wwQcYPnw4mjZtCgOD//tPbWhoCHd3dwQHB/OpYkREREQawDuUtMzGxgb9+vXDy5cv\nkZKSAgCoU6cOqlSpInIyIiIiIvlgU6sjVatWRdWqVcWOQURERCRLHD8gIiIiIsljU0tEREREksem\nloiIiIgkj00tEREREUkem1oiIiIikjw2tUREREQkeWxqiYiIiEjy2NQSERERkeSxqSUiIiIiyWNT\nS0RERESSx6aWiIiIiCSPTS0RERERSR6bWiIiIiKSPDa1RERERCR5bGqJiIiISPLY1BIRERGR5LGp\nJSIiIiLJY1NLRERERJLHppaIiIiIJI9NLRERERFJHptaIiIiIpI8vWpqN23aBD8/PzRv3hz9+/fH\nhQsXSj03Pj4eAwcORJs2bdCiRQt07doVYWFhugtLRERERHrDSOwARfbv348FCxZg9uzZcHd3R3h4\nOIKDg3Hw4EFYW1sXO9/CwgKBgYFwdnaGubk54uPjMX36dFSpUgX9+vUT4W9ARERERGLRm5XasLAw\nDBgwAL169YKTkxNmzpwJMzMz7Nixo8TzXV1dERAQACcnJ9jZ2aFHjx7o0KED4uLidJyciIiIiMSm\nF01tbm4uLl++jHbt2imPKRQKtG/fHufOnVPrc1y5cgVnz56Ft7e3tmISERERkZ7Si/GD9PR05Ofn\no2bNmirHbWxscPv27Xd+rK+vL54+fYqCggKEhISgT58+an/dgoICAMCzZ8+QlZVV9uBEREREpFXZ\n2dkA/q9vK41eNLUVsXnzZmRmZuLcuXNYvHgx6tevj4CAALU+tug/UnJysjYjEhEREVEFZWdnw9LS\nstTX9aKprVGjBgwNDZGamqpyPC0trdjq7dvs7e0BAI0bN0Zqaip++OEHtZvaatWqoUGDBjA1NYWB\ngV5MYhARERHRGwoKCpCdnY1q1aq98zy9aGqNjY3RrFkzREVFwd/fHwAgCAKioqIQGBio9ufJz89H\nTk6O2ucbGRnBxsamzHmJiIiISHfetUJbRC+aWgAICgrClClT4ObmptzS6/Xr1/jss88AAKGhoXj8\n+DEWLlwIoHBPWzs7Ozg6OgIAYmJisGHDBgwdOlS0vwMRERERiUNvmtqAgACkp6dj+fLlSE1Nhaur\nK37++WflHrWpqakqs6+CIGDJkiW4f/8+jIyMULduXUycOBEDBgwQ669ARERERCJRCIIgiB2CiIiI\niKgieHcUEREREUkem1oiIiIikjw2tUREREQkeWxqiYiIiEjy2NQSERERkeSxqSWqxGJjY5GXl1fs\neF5eHmJjY0VIRKSKNUr67uHDhyhpIylBEPDw4UMRElVebGqp3NLT05W/T05OxrJly7Bw4ULExcWJ\nmEqzoqKikJ2dLXYMrRkyZAieP39e7PjLly8xZMgQERJpR05ODh49eoSHDx+q/JID1qh8yLVO7927\nJ3YErfL398fTp0+LHX/27JnyKamkG3rz8AW5OX36NK5cuYIWLVqgdevW2LJlC1avXo3Xr1+jc+fO\n+Oabb2BmZiZ2zHK5evUqRo8ejeTkZNSvXx9Lly5FcHAwMjMzoVAoEB4ejuXLl6Nz585iR62wL7/8\nEnl5eXB3d4e3tze8vb3RqlUryf6/e5sgCFAoFMWOP3v2DObm5iIk0qykpCRMnToVZ8+eVTle9PdO\nSEgQKZnmsEalT+512qVLF9ja2sLLy0tZo/Xr1xc7lsaUVqOZmZkwNTUVIZHmpaamYuHChYiKisLT\np0+LrUzrS43y4QtasG3bNsyYMQMODg5ITk5GSEgIVq9ejZ49e0KhUGDPnj0YOHAgJkyYIHbUcgkO\nDoaRkRFGjBiB3bt346+//kKHDh0wZ84cAMDs2bNx+fJlbNu2TeSkFZebm4sLFy4gNjYWsbGxOHPm\nDHJzc+Hm5oY2bdpg/PjxYkcsl5CQEABAZGQkOnbsCBMTE+Vr+fn5uHr1Kho2bIh169aJFVEj/v73\nvytrtXbt2sV+8Li4uIiUTHNYo9KuUUD+dZqSkoLo6GjExsYiJiYGd+7cQe3ateHl5YW2bduiX79+\nYkcsl/nz5wMANm7ciH79+qm8ycrPz8eFCxdgYGCALVu2iBVRY4KDg5GcnIzBgwejdu3axV7Xl0Us\nNrVa0L17dwwYMACBgYE4duwYRo8ejTlz5qB3794AgAMHDmDJkiU4fPiwyEnLp02bNggPD4eLiwsy\nMjLQunVrbN++HW5ubgCAmzdvYsCAAbIaQyhy/fp1rFu3Dnv37kVBQYHevDstqylTpgAAdu7cia5d\nu6qs6hkbG8Pe3h79+vVTPqZaqjw8PLBjxw44OTmJHUVnWKPSU9nqNCkpCatXr5Z8jQYGBgIonPv2\n8PCAsbGx8jUTExPY29tj2LBhaNCggUgJNadly5bYvHkzXF1dxY7yThw/0IJ79+7Bz88PAODj4wOF\nQoHmzZsrX2/RogWSk5PFildhz58/R61atQAAVapUgbm5OapVq6Z8vVq1asjIyBArnkbdvn0bMTEx\nyl85OTnw9PTExIkT0aZNG7HjlVvRCkPRN10LCwuRE2mHk5OTyuy3HLFGpU/udZqVlYX4+HhljV65\ncgWOjo4YPHgwvL29xY5Xbr/88guAwjdg06ZNg6WlpciJtKdOnTol3gynb7hSqwUuLi44efIkbGxs\nABS+w9mzZw/q1q0LoHA2pWPHjpJ9d+ri4oJTp04pV0jk9vd7k4uLC6ytrTFkyBB06tQJzs7OJc5O\nSV1aWhpu374NAGjYsKGydqXo1atXyt9fvHgRy5Ytw/jx49GkSROVlRQAsvghxBqVpspUp25ubrCy\nskKPHj3g7e0NT09PlYUQOSlasKpTp47ISTTrxIkT2LBhA2bOnAkHBwex45SKK7VaoFAokJGRAVNT\nU+UAeUZGhvKb2JvfzKRq8uTJyhm3nJwczJgxQzlPlJOTI2Y0jQoMDERcXBxWrlyJv/76S3mTQ+vW\nrWVxk8qrV68wc+ZM7N+/H/n5+QAAQ0NDdO3aFd9++y2qVq0qcsKy8/T0VGnqBEFAUFCQyjlyuQEH\nYI1KsUaBylWnPj4+iI+PR0REBFJTU5Gamgpvb280bNhQ7GgakZeXhxUrVuCXX35BZmYmAMDCwgKf\nf/45QkJCir1JkQovLy+VGs3MzESXLl1gZmZW7O8UExOj63gl4kqtFri4uBT7ZlXSn6X6japo1u19\nii4fysGLFy8QFxenvNHhxo0bcHV1lfwNAF9//TUSEhLwzTffoGXLlgCAs2fPYu7cuXB1dcXSpUtF\nTlh2ZfnmKuVLn29jjUpLZazTxMRE5Q2NcXFxMDQ0hLe3N0JDQ8WOViHffvstDh8+jLFjx8LDwwMA\ncO7cOaxYsQL+/v6YOXOmyAnLZ+fOnWqfW3TPkNjY1GqBut+s5PKNqjJIT09HbGwsoqOjlQ2DlZUV\noqOjxY5WIR4eHvj555/h6empcjwuLg7BwcE4d+6cSMmorFijpO8EQcCVK1cQHR2N6OhonDhxQnlM\nylq3bo0lS5bA19dX5fj//vc//POf/0R8fLxIySofjh9oAZtV+ZgzZw6io6Nx8+ZNWFlZwcvLC/36\n9YO3tzecnZ3Fjldh1atXL/HyraWlJaysrERIpFmJiYklHlcoFDA1NYWdnZ3KVlFSxBqVPrnX6YYN\nGxAdHY0zZ84gIyMDzs7O8PLyQv/+/Yu9WZEiExOTEudMHRwcJDt68LZ3jU2amJjoTX1ypZbKTJ3x\nA4VCgXnz5ukgjXaNHTtWOaPYpEkTseNo3NatW3Hw4EF89913yh0tnjx5gsmTJ6NLly74+9//LnLC\ninl7FOhtRkZGCAgIwKxZsyS7STprVNo1Csi/Tvv06aOsUU9PT8nOQZdmxYoVuH37NubPn69yr8nU\nqVPRoEED5Z7LUva+GrW1tUXv3r0REhICAwPxHlbLplYL3vc/Hyhs+qR6yWXMmDGlvpafn4+oqCjk\n5ORIdma4MunVqxfu3LmD3Nxc5d26ycnJMDY2Lra3Ylnmq/TF0aNHsWjRIgwbNky5rd6FCxewYcMG\nhISEIC8vD6GhoQgICMCkSZNETkslkXuNAqxTqRszZgyioqJgYmKifFBGYmIicnNz0a5dO5VzV6xY\nIUbECtu1axeWLl2K3r17q9Torl27MGrUKKSnp2P9+vUYPnw4Ro0aJVpOjh9owbuK9ty5c/jll19Q\nUFCgw0SatXLlyhKPHzlyBEuXLoWJick7G1+puXv3LsLDw3Hz5k0AQKNGjTBkyBDUq1dP5GQVpy9P\ngdGW1atXY+rUqejYsaPymLOzM2xtbbFs2TJs374dFhYWWLBggaSbBdaotFWGOn3x4gW2b9+uUqN9\n+/aVxaqtlZUV/va3v6kck9uWXnv27MGkSZMQEBCgPObn54cmTZpg69atCA8PR506dbB69Wo2tXJT\n0jfhW7duITQ0FH/++Sd69OiBsWPHipBMO+Lj4xEaGoorV65g8ODBGDlypGz2IDx+/DhGjx4NV1dX\ntGrVCgBw5swZdOvWDatXr8aHH34ocsKKkcNlsXdJTEyEnZ1dseN2dna4du0agMIrK0+ePNF1NI1h\njUqf3Ov04sWLCA4OhqmpqXKVLywsDKtXr8b69evRrFkzkRNWjJx2+ilNfHw8pk+fXux406ZNlTdr\ntm7dWvQHS7Gp1bKUlBT88MMP2LVrFzp06IBdu3bJZu7txo0bWLx4MY4fP46ePXtiyZIlsLW1FTuW\nRoWGhiIoKAgTJkxQOb548WIsXrxY8g3D69evcfLkSSQlJQEo3NS+ffv2Ko8klTJHR0esXbsWs2bN\nUs665ebmYu3atXB0dARQ+G9Uyhv5s0alT+51On/+fPj5+WH27NkwMipsO/Ly8vDNN99g3rx52LRp\nk8gJKy4xMVGlRuVwk+abbG1tsX379mLfZ7Zv3678uf/s2TPRb95kU6slL1++xOrVq/Hrr7/C1dUV\nYWFhsrjLEyicZ1u+fDn27NmDTp06Yc+ePbJ9ZvnNmzfx/fffFzvep08fhIeHi5BIcyIjI/HNN98U\nezxnjRo1MHfuXOWjnqVs+vTpGD16NHx9fZU/ZK5du4b8/Hz89NNPAAofaz1o0CAxY1YIa1T65F6n\nly5dUmlogcKb34KDg9GnTx8Rk1XchQsXMG3aNNy4cUP5GFmFQoFGjRph7ty5ypVpqZs4cSLGjRuH\nY8eOwd3dHUDh/9dbt25h+fLlAApX5N8cTxADm1otWLt2LX7++WfUrFkToaGhspsJ++STT6BQKBAU\nFIRWrVohKSlJ+Q71Tf7+/roPp2HW1tZISEgodkNKQkKCZFdNgMLL0+PGjYOfnx/+8Y9/KN+U3Lhx\nAxs2bMDYsWPx66+/KjcSl6pWrVohMjISe/fuVdboJ598gu7duysfPdqrVy8RE1Yca1TaNQrIv04t\nLS2RnJxcbPEjOTkZVapUESlVxd24cQNDhw6Fk5MTFi1apFKjYWFhCAoKwrZt29CoUSORk1acv78/\nDhw4gG3btikfV+3j44OVK1cqtzPThzdd3P1AC1xcXGBmZoZ27drB0NCw1POkehdk0d2d7yLlJ6a9\nacWKFQgPD8eIESNU5hXXrl2LoKAgyd4QN2LECNSpUwezZs0q8fXp06cjOTkZa9eu1XEyKivWKGtU\n382ZMweHDx/GpEmTlE+FO3PmDL777jt8/PHHmDZtmsgJy2fcuHHIz8/HDz/8UGzHI0EQEBISAiMj\nIyxbtkykhJUPm1otmDx58nu39AIqx3C51AmCgPDwcKxfvx6PHz8GANSuXRvDhw/HkCFD1Pr/rI+8\nvb3xyy+/lDr3lZiYiMDAQMTGxuo4WcVFRkbCx8cHxsbGiIyMfOe5criawBqVXo0ClatOc3Jy8N13\n32HLli3Iz88HUDh+MHDgQEyYMEFvNu4vq7Zt22Lt2rXKy/Fvu3DhAkaOHInTp0/rOJlmJCYmokmT\nJjAwMCj1ASFF1Fns0gU2tURqKnqiStHlQClr3rw5Dhw4AHt7+xJff/DgAbp27YoLFy7oOFnFubi4\n4OTJk7CxsXnnN1q5XE14E2tUOipjnWZlZeHu3bsAgHr16sHc3FzkRBXj7u6OP/74o9Ttu5KTk/Hx\nxx/j4sWLOk6mGW/XqEKhQEktoz7VKGdqidT0ZqOQmJiIvn374tKlSyImKr/69evj9OnTpd6kERUV\nhfr16+s4lWa8uaLwvtUFuWGNSkdlrFNzc3OVlfebN2/iyy+/xKFDh0RMVX52dna4cOFCqU3t+fPn\nS9yqTSoiIyNhbW2t/L0UsKklKqeiy2hS1KdPH3z33XeoWbMmfH19VV7766+/sGjRIlE30CbNYI2S\nPsvNzVWu3EpRt27dsGDBAjRs2LDYVp1Xr17Fd999h549e4qUruLevEpS2hUTfcOmlqgSGjJkCM6c\nOYMvvvgCDRs2hJOTEwRBwM2bN3Hnzh107twZQ4cOFTtmuW3cuFGt84YMGaLlJFRecq9RgHUqdV98\n8QVOnTqFXr16oX379io1GhUVhebNm0v+jZe6K7T6MvfNmVqickhMTETv3r31Zo6ovPbv3499+/Yp\ntxFq0KABunXrhm7duokbrILe3r/00aNHqFWrlspuJAqFQjKX1MqDNar/KnudyqFGc3JyEBYWhoiI\niGI1GhQUJNmb4Iq8Pe9d0lytPs3UsqklKkHRDTelKbrzWl/+IdO7tWzZEnv27EHdunXFjqIxrFH5\nkWOdvoscmtrKRt9rlOMHWpaUlITo6GikpaWhoKBA5TUpPtPcy8tL7S2CYmJitJxGezw9Pd/59xQE\nQbJbJZVm5MiRmDNnDmrXri12FFIDa5T03ft+XuTl5ekwjW7MmDEDY8eOVd5gRbrFplaLtm3bhhkz\nZqBGjRqoWbOmyj9uhUIhyaZ26tSpYkfQCXVn3eQkNjYW2dnZYscgNbFGSd9Vlp8Xb9qzZw+GDx/O\nplYkbGq1aNWqVfj6668xcuRIsaNoTO/evcWOoBPe3t5iRyB6J9Yo6bvK8vPiTZzoFJeB2AHk7Pnz\n5+jatavYMXQiOzsbr169UvklNyNHjlQ+sUmO7O3tYWQkj/e5b9eiQqFARkYGa1Ti5FSjQOWs0xkz\nZuDp06dix6By0veRJt4opkVTp06Fu7s7Bg4cKHYUrcjMzMTixYtx4MABPHv2rNjrchv+1/cBefo/\nRU+/KfL2fGnRn1mjJKbKWKetWrXC7t27WaMS8fZc9IsXL2BpaQkDA9U1UX25h0Y+b3n1UP369bFs\n2TKcP38eTZo0KbbCIPW9BxctWoTo6GjMmDEDEydOxPTp05GSkoKtW7fiX//6l9jxSA2lPclIoVDA\n1NQUdnZ2ktySpjLOm8qVXGsUqJx1Ksd1tHetppuYmEi2PgHpzUWzqdWirVu3wsLCAjExMcXexSgU\nCsk3tX/++ScWLlyINm3aYMqUKfD09ET9+vVhZ2eHvXv34tNPPxU7okbJ7dInAPTq1Uv5Lryku+WN\njIwQEBCAWbNmwdTUVIyI5VJZ501Zo9KpUaDy1qncvG8nEltbW/Tu3RshISHFVjj1ndTmojl+QOXW\nsmVLREREwM7ODj4+PlixYgWaN2+Oe/fu4dNPP8XZs2fFjkjvcfToUSxatAjDhg1D8+bNAQAXLlzA\nhg0bEBISgry8PISGhiIgIACTJk0SOW3FcDsoaapMNQqwTqVo165dWLp0KXr37q1So7t27cKoUaOQ\nnp6O9evXY/jw4ZJ/whig39uWyestPemUg4MD7t+/Dzs7Ozg6OuLAgQNo3rw5/vzzT1StWlXseBoh\n50ufALB69WpMnToVHTt2VB5zdnaGra0tli1bhu3bt8PCwgILFiyQfMMg1+2gWKPyqVFAnnUq58vz\nQOE2XpMmTUJAQIDymJ+fH5o0aYKtW7ciPDwcderUwerVq2XR1OrztmVsarXs0aNHiIyMRHJyMnJz\nc1VemzJlikipNKNPnz5ITEyEt7c3Ro4ciVGjRuHXX39FXl4eJk+eLHY8jZDzpU+gsCGys7MrdtzO\nzg7Xrl0DUHgzy5MnT3QdjdTEGmWN6js5X54HgPj4eEyfPr3Y8aZNm+LcuXMAgNatWyM5OVnX0bRC\nny/ws6nVoqioKIwePRp169bFrVu30LhxYzx48ACCIKBp06Zix6uwoKAg5e/bt2+PAwcO4PLly6hX\nr16x50VL1Y8//qjWpc/vv/9ekqtEjo6OWLt2LWbNmqVcLcnNzcXatWvh6OgIAEhJSYGNjY2YMTVC\njvOmAGsUkE+NAvKs0wULFqh1ed7ExESSK5m2trbYvn07JkyYoHJ8+/btsLW1BQA8e/YMVlZWYsSr\nVDhTq0V9+/aFj48Pxo4dq9xqx9raGhMmTEDHjh0xaNAgsSPSe/Tv3x9fffWVyqVPADh+/Ljy0ueR\nI0ewYMECHDlyRKSU5XfmzBmMHj0aBgYGcHZ2BgBcu3YN+fn5+Omnn+Dh4YFdu3YhNTUVwcHBIqel\nkrBGWaP6btiwYejbt6/K5XkA2L9/v/Ly/K5du7B69WocPHhQpJTlFxkZiXHjxsHR0RHu7u4AgEuX\nLuHWrVtYvnw5PvroI2zevBl37tyR/BVafSevt4N65ubNm1iyZAmAwkuAr1+/RpUqVTBu3Dh8+eWX\nkmxqN27ciAEDBsDU1PS929FIfXcHQP6XPlu1aoXIyEjs3bsXSUlJAIBPPvkE3bt3h6WlJYDCy9tS\nJfd5U4A1Cki7RgH516ncL8/7+/vjwIED2Lp1q7JGfXx8sHLlSjg4OACAJH/ev0kqc9FsarXIwsJC\nOUdbq1Yt3L17F40bNwYApKenixmt3MLCwtCjRw+YmpoiLCys1PPksGUZUDkufVpaWsr2ASFynzcF\nWKNyIPc6rQyX5+vWrVvs7ycnUpmLZlOrRS1atEB8fDycnJzg6+uLhQsX4tq1azh8+DBatGghdrxy\nOXr0aIm/l6vp06dj9OjR8PX1LfHSJwDcu3dP0u/Cd+3aha1bt+LevXvYunUr7O3tERYWBgcHB3Tu\n3FnseBUi93lTgDUq9RoF5F+nEydOxLhx43Ds2LESL88DwMWLF4uNJ0hJXFwctmzZgvv372PZsmX4\n4IMPsGvXLjg4OMDT01PseBUmmblogbTm7t27QkJCgiAIgpCRkSH85z//Ebp37y6EhIQI9+/fFzkd\nqevly5fC5s2bhXnz5gnz5s0T/vvf/wovX74UO5ZGbNq0SWjTpo3w448/Cu7u7sLdu3cFQRCEHTt2\nCJ9//rnI6SquX79+wrFjx4odP3bsmNCnTx9BEATh8OHDgr+/v66jaRRrVNoqQ53evXtXWLRokTBm\nzBhhzJgxwuLFi4V79+6JHUsjDh48KDRv3lyYNm2a4ObmpqzRX375RQgODhY5nWb84x//ECIiIood\nj4iIEIYMGSIIgiDs3LlT+Nvf/qbraCq4UqtFbz7b2sLCArNmzRIxjeYJgoCDBw8iOjoaT58+RUFB\ngcrrK1asECmZZsn50uevv/6KOXPmoHPnzlizZo3yuJubGxYuXChiMs2Q+7xpEdaotFWGOpXz5flV\nq1Zh5syZ6NWrFyIiIpTHW7VqhVWrVomYTHOkMhctvQ3hSG/MnTsXEydOxP3792FhYYGqVauq/JKL\nXbt2YeDAgejQoQMePHgAoHC2WIp3kr/t/v37cHV1LXbcxMQEWVlZIiTSrKJ505ycHOUxuc2bAqxR\nqasMdRoXF4cJEybg73//O1JSUgAU1m1cXJzIySru9u3bJY4YVK1aFS9evBAhkeYVzUW/Td/morlS\nq2He3t44ePAgrK2t4eXl9c7B6piYGB0m07w9e/ZgxYoV8PX1FTuK1mzevBnLly/H0KFDsWrVKuVq\ntJWVFcLDwyU/z+fg4ICEhATY29urHD9+/DicnJxESqU5lWHelDUqfXKv00OHDmHixIno0aMHLl++\nrGzeX716hZ9++knyM6c1a9bE3bt3lTsdFImPj1e5YitlUpmLZlOrYVOmTFFuMzNlypR3NrVSZ2lp\nWewfsdzI/dLnP/7xD8yaNUv5Q+bChQvYt28f1qxZgzlz5oicruIqw3ZQrFHpk3udyv3yfP/+/TF3\n7lzMmzcPCoUCKSkpOHv2LBYuXIgvv/xS7HgaIZVty9jUaljv3r2Vv//ss89ETKJ9X331FVauXIl5\n8+bBzMxM7DhaIfdLn/369YOpqSm+//57ZGVl4V//+hdq166NqVOnolu3bmLH0wg5z5tq/nq5AAAg\nAElEQVQCrFG5kHOdyv3y/MiRI1FQUICgoCBkZWXh888/h4mJCYYNG4bAwECx42mMFOai2dRq0eXL\nl2FkZKS8nHTkyBH8/vvvaNSoEUJCQvRms+Ly6tq1K/bt24d27drBwcGh2KMdd+7cKVIyzakMlz4/\n/fRTfPrpp8jKykJmZqak5/ZKIvftoFij8iDnOpX75XmFQoHRo0dj+PDhuHv3LjIzM+Hk5IQqVaqI\nHU2jpLBtGW8U06Lp06crl+nv3buH8ePHw9zcHAcPHsSiRYvEDacBkyZNwuXLl/Hpp5/i448/hr+/\nv8ovOSi69Ll//34AhZc+V61ahSVLlsjukZzm5ubKZiE7Oxvr1q0TOVHFbd68GQsWLICPjw9evHhR\nbN5UDlij0if3Oi26PH/+/Hnl5fk9e/Zg4cKFslqdNjExQaNGjdC8eXNlQyvFx/6W5NChQxg+fDjM\nzMxKnIvWG6JuKCZzrVq1Eu7cuSMIgiD89NNPwrBhwwRBEIS4uDjBx8dHzGga0aJFCyE2NlbsGFq3\ne/duoUuXLoKzs7Pg7OwsdOzYUdi2bZvYsSosLS1NOHr0qHD8+HEhLy9PEARByMnJEcLCwoT27dsL\n3t7eIiesuK5duwqHDx8WBEEQPDw8lPtHXr16VRZ/vyKsUWmTe50WFBQIP/74o+Dh4aGsUXd3d2Hp\n0qViR6uw3Nxc4erVq8KtW7dUjh8+fFjo0aOH0KxZM5GSaVbPnj2FnTt3CoKgWqOXL18W2rdvL2Y0\nFRw/0CJBEJTvuKOiotCpUycAQJ06dST7mNw32draKm9ikDM5XvqMi4vDqFGj8OrVKygUCri5uWH+\n/PkYM2YMDA0NERISojIfLlVynzctwhqVNrnXqVwvz1+7dg2jRo1S7s3q7++PGTNm4Ouvv8b169fR\nr18/lZs3pUwqc9EcP9AiNzc3rFq1Crt27UJsbKyyqb1//z5q1qwpbjgNmDx5MhYtWoT79++LHUUn\n5HTpc9myZfD19cXevXsRFBSEixcvYsyYMRg/fjz279+PgQMHyuLmv6J507fJad70TaxRaaosdSq3\ny/OLFy9GvXr1sGrVKgQEBODIkSMIDAzERx99hP/973+YMGGCcg9XqSuai36b3s1Fi71ULGcJCQlC\n9+7dhVatWgk//PCD8visWbOEf/7znyIm0wxPT0+hWbNmgouLi+Dh4SF4eXmp/JI6OV/69Pb2Fq5f\nvy4IgiBkZWUJLi4uysufcrJt2zahY8eOQkREhODh4SHs27dPeRl03759YserMNaoPMi5TuV8eb5t\n27bClStXBEEQhBcvXgjOzs7KS/Rys3r1aiEgIEA4d+6c0LJlSyE2NlbYvXu30LZtW2Hjxo1ix1Pi\n+IEWubi4YO/evcWOT5w4EQYG0l8knzp1qtgRtEbulz6fP3+OGjVqAADMzMxgZmaGJk2aiJxK8+S8\nHRRrVD7kWqdyvzyfnp6O2rVrAyi8DG9ubg4PDw+RU2mHVLYtUwiCIIgdQq6Sk5OhUCiUlx8uXLiA\nvXv3olGjRhgwYIDI6ehdAgMDUbt2bYwaNQq///47NmzYgPr162P8+PH45JNPxI5XYS4uLggPD0e1\natUAAAMHDsT333+PDz74oNh5ciGneVOANfrmeXIipzodOXIkcnJyEBQUhL179yIiIgINGzZE3759\nMXjwYMmPj7i6uuLQoUOwtraGIAjw9fXF5s2bi21dJqd7T3JycvR6LppNrRYNGjQI/fv3R69evfDk\nyRN88sknaNy4MZKSkvD5558jJCRE7IgVlp+fjyNHjuDmzZsAgMaNG8PPzw+GhoYiJ6uYNm3aYNOm\nTWjUqBFev36Nli1b4ocffpD8fpFFXFxcoFAoUNI//6LjCoWixDk/OcjOzsavv/6K4cOHix2l3Fij\n8q5RQPp12q5dO6xfvx6urq54+fIlvLy8sGDBAkk/He1NRTVapKgm3/6znGsUKJyL1pc30hw/0KLr\n16+jefPmAIADBw6gcePG2LJlC06cOIFvv/1W8k3tnTt3MHLkSKSkpKBhw4YAgDVr1sDW1hZr1qxB\nvXr1RE5YfnK/9BkZGSl2BK17+vQpzp8/D2NjY7Rr1w6GhobIzc3F5s2bsWbNGuTl5Um2WQBYo3Ih\n5zqV++X5jRs3ih1BJ/Ly8nDr1i0YGxsrf9YDhQ+UWr58OW7dusWmtjLIy8tTPjXs1KlT8PPzAwA4\nOjriyZMnYkbTiDlz5qBu3brYunUrqlevDqDwm9i///1vzJkzR9KzUgBw48YNlf9Pt2/fRmZmpso5\nUr30+fbTp+RG7vOmRVij0ib3OlUoFMjIyICpqaly1fL169d49eqVynlSvTzv7e0tdgStk9pcNMcP\ntKhfv35o06YNOnXqhGHDhmHbtm1wcXHBuXPnMHbsWBw7dkzsiBXi4eGBrVu3Kh8DXCQxMREDBw7E\n2bNnRUpWcbz0KW1ynzcFWKNyIPc65eV56ZPaXDRXarVowoQJCAkJwbp169CrVy/lisnRo0eVYwlS\nZmJigoyMjGLHMzIyYGxsLEIizakslz7l6tq1a/j222/RqFEjjBs3DmFhYfj3v/8tm3lTgDUqB3Kv\n08pyeV7OLl68qJyLbt26NSIiIvDFF1/o7Vw0m1otatOmDU6fPo1Xr14p7+AFCp+DbW5uLmIyzejU\nqROmT5+OuXPnKpv08+fPY8aMGcpRC6mqDJc+5Uzu86YAa1QO5F6nleHyvNxJbS6aTa2WGRoaqjS0\nAIpt9yFV33zzDSZNmoQBAwbAyKiwlPLz8+Hn54dp06aJnI4qOznPm5J8sE5Jn0ltLpoztVrk5+en\nMj/0NrlcPkxKSsKtW7cAAE5OTqhfv77IiUhd9+7dQ35+Pho0aKByPCkpCUZGRpJ9A8Z5U/mQa40C\nrFM5EwQBx44dw44dO7B8+XKx45Sb1OaiuVKrRUOHDlX5c15eHq5cuYITJ05IdouWkjRo0KDYDxyS\nhilTpqBfv37F/v+dP38e27dvxy+//CJOsAqSyxtGkm+NAqxTObp37x527NiBnTt34unTp2jfvr3Y\nkSpEanPRbGq16O2mtsimTZtw6dIlHafRvPz8fPz+++84ffo00tLSUFBQoPK61P4xVEZXrlxBy5Yt\nix338PDA7NmzRUikGZw3lQ+51ijAOpWLnJwcHDx4ENu3b8eZM2eQn5+PSZMmoW/fvnpzWb68pDYX\nbSB2gMrIx8cHhw4dEjtGhc2dOxfz5s1Dfn4+GjduDBcXF5VfcnDv3j0kJSUVO56UlIT79+/rPpCG\nKRSKYrNRAPDy5Uvk5+eLkIjKijVKUiQIAv73v/9h7NixYkcpt0uXLmHGjBn48MMPER4ejs6dO+Ov\nv/6CgYEBOnToIPmGVoq4UiuCgwcPKh9WIGURERH4/vvv4evrK3YUrZHzpU/8v/buPCiqKwsD+NcI\n4gYYlwLBJagY1IgkLggqKMQdVIImOiIqmXJAyagTY3SqBnASi8QAcVCiGaNRM45LWBRcg+g4AdSg\nY2nEaEaDmhElyCJqChXo+cOii5ZFhe5+fe/7flWpat57NqerTroP95y+D8CQIUPwxRdfID4+Xndr\n46qqKvz973/HoEGDFI6OngdzlEQiU3v+rbfeQnBwMHbt2oWePXsqHQ6BRa1RTZ06tc5A9Z07d1BS\nUoKoqCgFIzMMKysroW+F+zxkbn0CT/ZSnjVrFsaPH4/BgwcDeHKXo/v372Pr1q0KR0fPgzlK5k7W\n9rynpyeSkpJQXFyMKVOmYOTIkY1+OZyMj0WtET29gbZGo0GHDh0wdOhQ9OrVS6GoDCc0NBTbtm1D\nZGSktP8jy9767N27N9LS0rB9+3ZcunQJrVq1wpQpUxAcHCxFN0ENmKNkri5cuICkpCTs378f3bt3\nx5QpUxAfHw8fHx8p2vObNm3CrVu3kJycjOjoaDx8+BATJkwAAGk/E80dt/SiJlu4cCFOnToFOzs7\nuLi46PaqrbFu3TqFIjOcsLAwWFtb12l9LlmyBL/99hu+/PJLhSOkxsi8HVQN5qj4ZM3Tfv36ITg4\nGDNmzNBrz/fv3x979+5F7969FYzO8LKzs5GSkoKMjAx06dIF48aNw7hx49C/f3+lQzMKc9y2jCu1\nJvLw4UM8fvxY75jof6Xa2tpizJgxSodhVDK2Pi9duoQ+ffrAwsICly5davRa0b/wJ/u8KcAcFT1H\nAXnzVG3t+eHDh2P48OG4e/cu0tLSkJycjI0bN5rNHq6GYs5z0VypNaLffvsNsbGxOHjwIMrKyuqc\nly3RZVVYWKjX+uzTp4/QrU9XV1dkZ2ejY8eOz9z8XfQcff3117Fnz546s9/Xr19HUFAQTp8+rVBk\nhsUcFZvMeVrTnk9JSdG153fs2IG0tDQpxvCeJS8vT4qVWlHmorlSa0SffvopTp06hejoaCxbtgyR\nkZEoLCzErl278N577ykdHj0ne3t7/OlPf1I6DIPJzMxEhw4ddI9lJvu8aQ3mqNhkztMuXbogIiIC\nERERuvZ8ixYtsGDBAmna89euXUNmZiZu3rwJjUaDrl274o033kC3bt2Ef22izUVzpdaIRo0ahU8+\n+QQeHh54/fXXkZqaih49emDPnj3Yv38/Nm7cqHSILywwMBBbtmyBnZ1dnd0dnpaammrCyAxHTa3P\n3NxcvPbaa3XmoSsrK3H27FkMGTJEocgMQ9Z5U+aoPDkKyJunDandnr98+bLQq+1ffPEFEhISUF1d\njY4dO0Kr1aKkpAQtWrTAkiVLhL97qGhz0VypNaK7d++iW7duAJ7Mz969excAMGjQIKxcuVLJ0JrM\nz88PLVu21D2WcT5q6tSputZnTeEua+szJCQEWVlZ6Nixo97xe/fuISQkRPjXJ+O8KcAcBeTJUUDe\nPG2InZ0dZs+ejdmzZyMvL0/pcJrs5MmTWLNmDRYsWICQkBDY2dkBAMrKyrB161bExcXBzc1N6D+8\nRJuLZlFrRF27dsX//vc/ODo6omfPnjh48CDc3Nxw7Ngx2NjYKB1ek0REROgev/vuuwpGYjxqan1q\ntdp636DKysrQunVrBSIyLFm3g2KOypOjgLx5WkPW9vzOnTsxffr0Op+F7du3x6JFi3Dnzh3s2LFD\n6KJWtG3LOH5gRFu2bIGFhQVCQkKQk5ODsLAwaLVaVFZWYvny5ZgzZ47SITaLn58fkpKS8NJLL+kd\nLy8vR2BgoBQftrK2Pmv+OMnMzMTIkSN1q+/Ak7bn5cuX4ezsjE2bNikVIj0n5ihz1JzJ3J739fXF\n6tWrdavrTzt9+jSWLVuGo0ePmjgy4zH3bcu4UmtEc+fO1T328vLCwYMHkZeXh+7duws/5wYAN2/e\nRHV1dZ3jjx49QmFhoQIRGZ6src+aToFWq0Xbtm3RqlUr3TkrKyu4u7tj+vTpSoXXLGqaNwWYo6JS\nQ57K3p4vLi5udA/hrl274s6dOyaMyPjMfdsyFrUm5OTkBCcnJ6XDaLbaK7Dfffed3ihFdXU1Tpw4\nIcXrBORtfcbExAB4kpOhoaFo06aNwhEZjprmTQHmqKjUkKeyt+cfPnwIKyurBs9bWlrW2Z9eFuY6\nF82i1ggqKipw4sQJjB49GgAQFxeHR48e6c5bWFhg8eLFsLa2VirEZlm4cCGAJ2+2y5cv1ztnaWkJ\nJyenOsdFU9P6rHmN9bU+X3vtNaXCM5jf//73eh+kN2/eREZGBnr37o0RI0YoGFnTqWXelDkqbo4C\n6sjT8+fPY/Xq1Q2enzJlCpYtW2bCiAzvm2++afAPrgcPHpg4GuMRZS6aRa0RpKam4vjx47qi9h//\n+AdcXFx0RWx+fj7s7e31xhNEUtMq8/X1RVJSku6NWSaytz5rLFiwAGPGjMHMmTNRXl6O6dOnw8rK\nCqWlpVi+fDl+97vfKR3iC6vdJSgoKGh03lTkjgJzVNwcBdSRp7K35x0dHbF79+5Gr+nSpYuJojGe\nhuai4+LizG8uWksGN3PmTG1mZqbuZ3d3d+2NGzd0P+/Zs0f71ltvKREavaC1a9dqHzx4oHQYRjN0\n6FDtTz/9pNVqtdrdu3drAwICtFVVVdoDBw5ox48fr3B0zefq6qq9c+dOneMlJSVaV1dXBSIyPOao\n+GTN01deeaXe11WjqKhI6NenBidOnNC6urpqExIStGVlZbrjpaWl2jVr1mj79u2r/f777xWMUB9X\nao3gxo0b6NOnj+5na2trvZk3Nzc3/PWvf1UitGbbtm3bc18bEhJixEhMQ9bWZ42Kigq0bdsWAJCV\nlYWxY8fCwsIC7u7uKCgoUDi65tNKOm9aG3NUfDLnqVra8/W5ffs2EhMT8eGHHyodSpOJNhfNotYI\nysvL9WZoT548qXe+urpa77xItmzZ8lzXaTQaKYpaWVufNbp3744jR45gzJgxyMrK0o3EFBcXm93t\nD1+EWuZNAeaoyGTPU7W05xtSVlaGpKQkoYta0eaiWdQagYODA/773//q3VKutsuXL8PBwcHEURmG\nTPvtPY+8vDysWLECAHD48GF06tQJe/bsweHDh5GQkCB8wbBw4UIsXboUMTEx8PT01H2AZmdno2/f\nvgpH13RqmTcFmKMikz1P1fZ5ISPR5qJZ1BqBt7c3EhISMGrUqDo7HFRUVCAxMRE+Pj4KRUcvQvbW\n5/jx4zFo0CAUFRXp7YXp6emJN954Q8HImkf27aBqY46KS015Wh8Z2vOyE23bMha1RhAWFoZDhw5h\n/PjxmDVrFl5++WUAT3Y92L59OyorKxEWFqZskE0UExODRYsWoU2bNro35IbUrB6JTObWZ43OnTuj\nc+fOesfc3NwUisawZJ83BZijMlBDntZHhva8Gog0F82i1gg6deqEHTt2IDo6GnFxcbo3K41GAy8v\nL0RHR6NTp04KR9k0Fy9eRGVlpe5xQ8zxntBNIWPrMyIiAh9//DHatWunm+lryLp160wUlXHIPm8K\nMEdFz1FAHXkqo2flZnl5uYkiMR7R5qJZ1BpJt27dsGnTJpSVleHGjRsAnqyotG/fXuHImufrr7+u\n97GsZGx91r4DXO3HMpJ93hRgjspADXkqo2flpo2NjbB7DNcQbS5ao9XWc18+IiIJDBw4EAcPHoSj\noyMWLVoEFxcXRERE4NatWxg/fjzOnTundIhEqs3TS5cuITAwUNjbAJP5zUVzpZZe2PPOyj5r5tZc\nqa31KTNZ502Zo3KROU8bI0N7Xu3MbS6aRS29sNTUVDg6OqJfv36QcaFfTa3PqVOn1jv/rNFo0LJl\nS/To0QOBgYEYNmyYAtE1n4zzpgBzFJAnRwF15GlD50Vvz5N54fgBvbCVK1di//79cHR0xJtvvonJ\nkycLPyusVvHx8fjnP/+JPn366L5N/sMPP+Dy5csIDAzE1atXceLECaxdu1bY+cyioiLdvKmFhQWA\nJxuKt23bFr169VI4OnoWNeQowDwlMZnbCAmLWmqSR48e4dtvv0VycjLOnj0LHx8fTJs2DSNGjJBm\n5wM1iIyMhL29PRYuXKh3/PPPP0dBQQE++ugjJCQk4F//+hdSUlIUipLUjDlKZL5Y1JJ0bt68idTU\nVOzZswdVVVXYt2+fbjN40cne+hw8eDCSk5PRo0cPvePXr1/Hm2++iTNnzuDq1auYNm0azp49q1CU\nL0Zt86bMUfFyFFBfnpKYnmcuOjc312yKWgulAyDx1bTKtFotqqqqFI7GsLy9vfHLL7+gdevW8PDw\ngIeHB9q0aYMbN25gwIABKCoqwrx583DkyBGlQ22Sli1b1lsInD17Vnc3PK1WW+fOeObs6XnTxv6T\nAXNUvBwF1JenJKZn5aaTkxOmTp2qdJg6/KIYNUnt8YMzZ85g1KhRiIyMxMiRI3VFrgzKysowb968\nBlufmzdvRkJCAj7//HMh5/mCg4MRFRWFCxcuYMCAAQCezCsmJSXhD3/4A4Ant14V6csqtXfdEHUH\njhfBHBUvRwH15SmJSbTc5PgBvbDo6GgcOHAADg4OCAoKQkBAADp06KB0WEYha+uztrS0NGzfvh35\n+fkAAGdnZwQHByMgIAAAUFFRAY1GI9xKmFowR5mjRPQEV2rphe3cuROOjo7o1q0bcnNzkZubW+91\nMsyB1bQ+ny4YRG991jZ58mRMnjy5wfOtWrUyYTSGJfu8KcAcBcTOUUAdeUpkCixq6YU19AYsI1lb\nn0+7cOECrl69CgBwcXFBv379FI7IMLy9vZ+5HdS8efOE3g6KOSo+NeQpkSlw/IDoGWRufRYXF2PJ\nkiX4/vvvYWtrC+DJt1k9PDzw2WefCT9WopbtoJijYlNLnhIZG4taIhVbvHgxfvnlF6xevVq3wfuV\nK1fwwQcfoEePHoiPj1c4wuZRw7yp7GTPUYB5SmQoHD8geg6ytj6/++47fPXVV3p3LOrduzeioqIQ\nGhqqYGSGoYZ50xrMUXGpKU+JjIlFLVEjZG99VldXw8rKqs5xS0tLVFdXKxCRYalh3pQ5Kj415CmR\nKXD8gKgRsrc+w8PDce/ePcTFxcHe3h4AUFhYiKVLl8LW1haJiYkKR9h8Ms+bAsxRGXIUkD9PiUyB\nRS1RIwYNGoSvvvpK943kGufPn0doaChOnz6tUGSGcevWLYSHh+PKlStwcHAAANy+fRsuLi5Yv369\n7hiZL+Yoc5SInuD4AVEjZG99dunSBampqcjJycHPP/8MAOjVqxe8vLwUjsywZJ03BZijMpE5T4lM\ngSu1RI1QS+vzabdv30ZiYiI+/PBDpUNpFtnnTQHmqOg5CqgjT4lMgUUtUSPU2vq8dOkSAgMD8eOP\nPyodSrPIPm8KMEdFz1FAHXlKZAosaomeQavVqqL1WZssBYPs86Y1mKNiU0ueEhkbZ2qJnkGj0WD4\n8OEYPny47phMrU+ZyT5vWoM5Kja15CmRsVkoHQCRiMrKypCUlKR0GPQMw4YNw6pVq1BYWKg7VlhY\niJiYGHh6eioYmfExR8Wh5jwlMiSu1BKpUERERKPny8vLTRSJcUVGRiI8PBx+fn515k0//fRThaOj\nxqglRwHmKZGhsKglUiEbG5tnnndycjJRNMajpu2gZKOWHAWYp0SGwi+KETWBTF9SUSM1zJsyR8Wn\nhjwlMiSu1BLVQ02tTzWqmTcVuVhgjspPhjwlMiUWtUT1UFPrk8TEHCUi0seilqgeMTExSodA1Cjm\nKBGRPm7pRURERETC40otEUmH86byq66uxvHjxzF69GilQ2ky5imRYbGoJSLpcN5UXtevX0dycjJS\nUlJQWlqKvLw8pUNqMuYpkWFxSy8iIjJrFRUVOHToEL755hv85z//weDBgzFx4kSMGTMGnTp1Ujo8\nIjITXKklIpKQDO358+fPIykpCfv370f37t0REBCAs2fPIioqCr1791Y6PCIyMyxqiYgkIkt7PiAg\nAA8ePIC/vz927twJFxcXAEBcXJzCkRGRuWJRS0QkuPra8wsXLsSYMWOUDq3J8vPzMXHiRHh4eHBV\nloieC4taIiJBydyez8zMREpKCqKjo1FRUQF/f38EBARAo9EoHRoRmSl+UYyISEC12/MBAQG69nz/\n/v2xd+9e4Yva2k6cOIHk5GRkZGTg4cOHCA0NxfTp0+Hs7Kx0aEYlw1w0kSlxpZaISEBqas97enrC\n09MT9+7dQ1paGpKTk7F582a4uLggPT1d6fAMTpa5aCJTY1FLRCQgNbbnbWxsMGvWLMyaNQs//vgj\nkpOTlQ7JYGSciyYyNY4fEBEJTsb2fEVFBbKzs+Hh4YF27drpnbt//z5OnTqFESNGwNraWqEIDaO+\nuejY2FikpaVJvwJPZGgsaomIJFG7PX/x4kWh2/Nbt27F0aNHsXXr1nrPz507F15eXpg/f76JIzMc\nNc1FE5mChdIBEBGRYdS051NSUpCamgoPDw+lQ2qy9PR0zJkzp8Hzc+bMwbfffmvCiAwvPz8fgwcP\nVsVcNJEpsKglIhJQRUUFMjMzcf/+/Trn7t+/j4KCArz//vsKRGYY169fh6ura4PnX3nlFVy/ft2E\nERleZmYmnJ2dER0dDW9vb3zyySe4ePGi1HPRRMbEopaISEC7du3Ctm3b6sybAkC7du3w9ddfN9i6\nF0FlZSVKSkoaPF9SUoLKykoTRmR49vb2CA8PR0ZGBlavXo2ioiLMnDkTlZWVSElJQX5+vtIhEgmF\nRS0RkYBkb8+7uLggJyenwfPZ2dm6GVQZeHp6IjY2FllZWfjLX/6CkydPYsKECQgICFA6NCJhsKgl\nIhKQ7O35oKAgrF+/HseOHatz7ujRo9iwYQOCgoIUiMy4ZJqLJjI17lNLRCSgmva8o6NjvedFb8+/\n/fbbyM3NRXh4OHr27Knbnuznn3/GtWvXMGHCBLz99tsKR9k8z9q2TPS5aCJT40otEZGA1NCej42N\nRXx8PHr06IFr164hPz8fzs7OiIuLQ3x8vNLhNZvsc9FEpsaVWiIiAQUFBeHjjz+Gi4sLRo8erXeu\npj2/fPlyhaIznIkTJ2LixIlKh2EU6enpWLBgQYPn58yZg8TERKH34iUyJRa1REQCkr09X11djU2b\nNiEzMxOPHz+Gp6cnIiIi0KpVK6VDMxjZ56KJTI1FLRGRoGJjY+Hr64v09HRcu3YNWq0Wzs7OePfd\nd4Vf3Vy/fj0SExPh6ekJa2trbNu2DcXFxYiJiVE6NIORfS6ayNRY1BIRCUzW9vzevXsRFRWlW23O\nycnB/PnzsWrVKlhYyPF1kJq56FdffbXe8zLMRROZkhzvDEREKlNdXY2NGzdixowZCAoKQmxsLCoq\nKpQOy2AKCgrg7e2t+9nLywsajQa//vqrglEZllq3LSMyFq7UEhEJSPb2fFVVFaytrfWOWVpa4vHj\nxwpFZHiyz0UTmZpGq9VqlQ6CiIhezNixY/HOO+/Uac+fP39eiva8q6srvL290bJlS92xY8eOYdiw\nYWjdurXu2Lp165QIz6AOHDiA9PR03LhxA1qtFi+//DL8/f2lHCshMiau1BIRCQXvyWwAAAVeSURB\nVKix9ryDg4OCkRlGYGBgnWOTJ09WIBLjk3UumsjUWNQSEQlI9va8LGMUjVHDtmVEpsTxAyIiAamp\nPS+rxMREvbnorKwsTJo0SRUFPZExsKglIhLQihUrnus6FkjmS/a5aCJTY1FLRESkgFdffRUZGRno\n0qWL7tiAAQOQkZEhxVw0kanxT0EiIiIFyD4XTWRqXKklIiJSAOeiiQyLux8QEREpQE3blhGZAldq\niYiIiEh4nKklIiIiIuGxqCUiIiIi4bGoJSIiIiLhsaglIiIiIuGxqCUiIiIi4bGoJSIiIiLhsagl\nIlLIunXr4OrqCh8fn3rPz5gxA66urlixYkWzf9eqVavg6+v7wv/O19cXH330UbN/PxGRsbGoJSJS\nkKWlJUpLS5Gbm6t3vKCgAOfOnUPbtm0N8ns0Gg00Go1BnouIyByxqCUiUpCVlRW8vb2xb98+veP7\n9++Hi4sLunfvrlBkRERiYVFLRKQgjUaDSZMm4dChQ6iqqtId37dvH/z9/fH0TR9zc3MxY8YMDBw4\nEMOGDcOf//xn3L17V++aX3/9FWFhYXB3d4ePjw++/PLLen93YWEhli5dimHDhmHgwIEIDg5GXl6e\n4V8kEZEJsKglIlKYr68vHj16hKysLADAlStX8NNPP2HSpEl61124cAGhoaGwsbFBQkIC3n//fRw7\ndgzz58/XK37Dw8ORl5eHlStXIioqCkeOHMHhw4f1nqu8vBwzZ87E5cuXERkZibVr16J169aYO3cu\nSkpKjP+iiYgMzFLpAIiI1M7a2hp+fn44cOAAfHx8sG/fPri7u8PJyUnvug0bNqBz587YsGEDWrRo\nAQBwcHDAO++8g+PHj2PUqFH497//jYsXL2Lr1q0YOnQoAGDo0KHw8fFB+/btdc+1ZcsW3L9/H8nJ\nyXjppZcAAJ6enhg3bhw2b96MpUuXmujVExEZBldqiYjMgL+/PzIzM/Hw4UMcPHgQ/v7+da45c+YM\n/Pz8dAUtAAwfPhy2trY4c+YMAOD8+fOwsbHRFbQA0K5dO3h5eek9V05ODjw8PGBra4uqqipUVVVB\no9FgyJAh+OGHH4z0KomIjIcrtUREZmDEiBFo0aIF/va3v+HmzZuYMGFCnWvKy8vRqVOnOsc7duyo\nm6stKirSrbw+fU1tpaWlOHfuHPr37693XKPR8MtpRCQkFrVERGbA0tIS48aNw5YtW+Dl5YUOHTrU\nucbOzg7FxcV1jhcXF8POzg4A0LlzZ5SWltZ7zdPPNXLkSCxevLjOl9FatmzZnJdCRKQIFrVERGZi\n2rRpKCkpwfTp0+s9P2jQIBw5cgTLly+HhcWT6bHs7GyUl5dj8ODBAAA3Nzfcu3cPp06dgoeHBwDg\n3r17yMnJ0Zup9fT0RHp6Onr27IlWrVoZ+ZURERkfi1oiIjPh5uaGdevWNXg+LCwMM2fOxPz58zF7\n9mwUFRUhPj4e7u7u8Pb2BgB4e3ujb9++WLp0Kd577z3Y2Nhg48aNsLGx0XuuefPmYd++fZg1axZC\nQkLg6OiIkpISnDt3Dvb29pgzZ45RXysRkaGxqCUiUtCz7vJV+05g/fv3x+bNmxEXF4c//vGPaN26\nNfz8/PDBBx/oPc/69esRFRWF6Oho2NraIjg4GMXFxThy5Ijumvbt22P37t1Ys2YN4uLiUFZWho4d\nO2LgwIEYO3bsc8dHRGQuNNqnh6mIiIiIiATDLb2IiIiISHgsaomIiIhIeCxqiYiIiEh4LGqJiIiI\nSHgsaomIiIhIeCxqiYiIiEh4LGqJiIiISHgsaomIiIhIeCxqiYiIiEh4LGqJiIiISHgsaomIiIhI\neP8Hn0UI7PjEMq4AAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8,6))\n", + "sns.set_style(\"whitegrid\")\n", + "g = sns.stripplot(x=\"Model\",\n", + " y=\"Matthews Correlation\",\n", + " data=mcc_df,\n", + " size=8,\n", + " color=\"gray\")\n", + "for item in g.get_xticklabels():\n", + " item.set_rotation(90)\n", + "\n", + "plt.title(\"Matthews Correlation Coefficient - All Models\")\n", + "plt.xlabel(\"Model\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "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.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/notebooks/Project 1 Results - Gaussian NB.ipynb b/notebooks/Project 1 Results - Gaussian NB.ipynb new file mode 100644 index 0000000..f37300a --- /dev/null +++ b/notebooks/Project 1 Results - Gaussian NB.ipynb @@ -0,0 +1,691 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Results for Gaussian Naive Bayes" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import os\n", + "import pickle\n", + "import numpy as np\n", + "from scipy import sparse\n", + "from functools import partial\n", + "from sklearn.externals import joblib\n", + "from sklearn.cross_validation import KFold\n", + "from sklearn.metrics import confusion_matrix\n", + "from sklearn.cross_validation import train_test_split\n", + "# from midi_ml.models.linear_decision_rules import NaiveBayesClassifier" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "labels = joblib.load(\"/home/jovyan/persistent_data/data/dumps/labeled_corpus_labels.pkl\")\n", + "features = joblib.load(\"/home/jovyan/persistent_data/data/dumps/labeled_corpus_matrix.pkl\")\n", + "features = features.todense()\n", + "bach_labels = [k for k in range(len(labels)) if labels[k] == \"bach-js\"]\n", + "mozart_labels = [k for k in range(len(labels)) if labels[k] == \"mozart\"]\n", + "X = features[bach_labels + mozart_labels].A\n", + "y = np.array([1 for i in range(len(bach_labels))] + [0 for i in range(len(mozart_labels))])\n", + "y = y.reshape((y.shape[0],))\n", + "del features" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(3027, 16384)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class NaiveBayesClassifier(object):\n", + " \"\"\"\n", + " Classifiers of the Naive Bayes family. All input features are assumed to be drawn from\n", + " a distribution of the same parametric form\n", + " http://people.csail.mit.edu/jrennie/papers/icml03-nb.pdf\n", + " \"\"\"\n", + "\n", + " def __init__(self,\n", + " X: np.array,\n", + " y: np.array,\n", + " parametric_form: str = \"multinomial\",\n", + " keep_copy_of_X: bool = True,\n", + " smoothing: int = 1):\n", + " \"\"\"\n", + " :param X: (N * M)-dimensional array containing the input data in matrix form\n", + " :param y: (N * 1)-dimensional array containing the binary target variable, encoded as 0 and 1\n", + " :param parametric_form: the parametric form that the features are assumed to take (used to define PDF)\n", + " :param keep_copy_of_X: Whether to keep a copy of X in memory (to be used for making predictions on the training set)\n", + " :param smoothing: Smoothing parameter for dirichlet prior in multinomial model (sets to None if \"bernoulli\" or \"gaussian\" or chosen)\n", + " \"\"\"\n", + " parametric_forms = [\"bernoulli\", \"multinomial\", \"gaussian\"]\n", + " if parametric_form not in parametric_forms:\n", + " raise ValueError(\"Please select a distribution in %s\" % str(parametric_forms))\n", + " self.X = X\n", + " self.y = y\n", + " self.classes_ = set(self.y)\n", + " self.parametric_form_ = parametric_form\n", + " self.keep_copy_of_X = keep_copy_of_X\n", + " if parametric_form is \"multinomial\":\n", + " self.smoothing_ = smoothing\n", + " else:\n", + " self.smoothing_ = None\n", + " self.num_records_ = None # type: int\n", + " self.X_given_class_ = {}\n", + " self.thetas_ = {}\n", + " self.priors_ = {}\n", + " self.log_pdf_given_class_ = {}\n", + "\n", + " @staticmethod\n", + " def log_gaussian_pdf(x: float, mu: float, sigma: float) -> np.array:\n", + " \"\"\"\n", + " Log of the Gaussian probability density function\n", + " :param x: value (or np.array of values) at which we compute the relative log-likelihood of drawing that point\n", + " :param mu: mean of the Gaussian\n", + " :param sigma: standard deviation of the Gaussian\n", + " :return: Array with the log-probability of each x\n", + " \"\"\"\n", + " return np.array(np.log(1. / np.sqrt(2 * np.pi * sigma ** 2)) - (x - mu) ** 2 / (2 * sigma ** 2))\n", + "\n", + " def _get_class_conditional_data(self):\n", + " \"\"\"\n", + " Separate the data by class\n", + " :return:\n", + " \"\"\"\n", + " self.num_records_ = self.X.shape[0]\n", + " for c in self.classes_:\n", + " self.X_given_class_[c] = self.X[np.where(self.y == c)]\n", + " self.priors_[c] = float(self.X_given_class_[c].shape[0]) / self.num_records_\n", + " if not self.keep_copy_of_X:\n", + " self.X = None\n", + "\n", + " def _make_predictions(self, X: np.array = None):\n", + " \"\"\"\n", + " Predict the class of the input values X\n", + " :param X: matrix to make predictions with\n", + " :return:\n", + " \"\"\"\n", + " predictions = np.zeros((X.shape[0], len(self.classes_)))\n", + " for c in self.classes_:\n", + " if self.parametric_form_ in (\"multinomial\", \"bernoulli\"):\n", + " class_conditional_log_probabilities = np.dot(X, self.thetas_[c])\n", + " elif self.parametric_form_ == \"gaussian\":\n", + " class_conditional_log_probabilities = np.nan_to_num(self.log_pdf_given_class_[c](X)).sum(axis=1)\n", + " else:\n", + " raise ValueError(\"Must select proper feature family to make predictions\")\n", + " # we add the log of the prior probability of the class as an \"intercept\"\n", + " predictions[:, c] = class_conditional_log_probabilities + np.log(self.priors_[c])\n", + " return predictions.argmax(axis=1)\n", + "\n", + " def predict(self, new_X: np.array = None) -> np.array:\n", + " \"\"\"\n", + " Exposed API to make predictions\n", + " :param new_X: New set of X values to make predictions with (optional)\n", + " :return:\n", + " \"\"\"\n", + " if new_X is None:\n", + " if not self.keep_copy_of_X:\n", + " raise ValueError(\"Must keep copy of X in order to make predictions\")\n", + " return self._make_predictions(self.X)\n", + " else:\n", + " return self._make_predictions(new_X)\n", + "\n", + " def _train_bernoulli_model(self):\n", + " \"\"\"\n", + " Train a Bernoulli Naive Bayes\n", + " :return:\n", + " \"\"\"\n", + " # We use the log of the probability that a document is drawn from this parametric\n", + " # form of the distribution to ease the computation (by avoiding multiplying very small numbers)\n", + " for c in self.classes_:\n", + " class_size = self.X_given_class_[c].shape[0]\n", + " feature_counts = self.X_given_class_[c].sum(axis=0)\n", + " self.thetas_[c] = np.log(feature_counts + 1) - np.log(class_size + 2)\n", + "\n", + " def _train_multinomial_model(self):\n", + " \"\"\"\n", + " Train a Multinomial Naive Bayes\n", + " :return:\n", + " \"\"\"\n", + " # We use the log of the probability that a document is drawn from this parametric\n", + " # form of the distribution to ease the computation (by avoiding multiplying very small numbers)\n", + " for c in self.classes_:\n", + " # get values of n\n", + " feature_sums = self.X_given_class_[c].sum(axis=0)\n", + " alpha_i = float(self.smoothing_) / self.X_given_class_[c].shape[1]\n", + " alpha = self.smoothing_\n", + " self.thetas_[c] = np.log(feature_sums + alpha_i) - np.log(feature_sums.sum() + alpha)\n", + "\n", + " # TODO: in high dimensions we'll be storing 10s of thousands of functions which could be inefficient\n", + " def _train_gaussian_model(self):\n", + " \"\"\"\n", + " Train a Gaussain Naive Bayes\n", + " :return:\n", + " \"\"\"\n", + " for c in self.classes_:\n", + " means = self.X_given_class_[c].mean(axis=0)\n", + " variances = self.X_given_class_[c].var(axis=0)\n", + " self.log_pdf_given_class_[c] = partial(self.log_gaussian_pdf,\n", + " mu=means,\n", + " sigma=np.sqrt(variances))\n", + "\n", + " def _get_parametric_probability_estimates(self, parametric_form: str):\n", + " \"\"\"\n", + " Estimate the parameters of the parametric probability distributions\n", + " :param parametric_form: the form we assume for estimating PDFs/PMFs\n", + " :return:\n", + " \"\"\"\n", + " if parametric_form == \"bernoulli\":\n", + " self._train_bernoulli_model()\n", + " elif parametric_form == \"multinomial\":\n", + " self._train_multinomial_model()\n", + " elif parametric_form == \"gaussian\":\n", + " self._train_gaussian_model()\n", + " else:\n", + " raise ValueError(\"Please select a valid family of probability distributions\")\n", + "\n", + " def fit(self):\n", + " \"\"\"\n", + " Exposed API for training model\n", + " :return:\n", + " \"\"\"\n", + " self._get_class_conditional_data()\n", + " self._get_parametric_probability_estimates(parametric_form=self.parametric_form_)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Train Models" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.5/site-packages/ipykernel/__main__.py:48: RuntimeWarning: divide by zero encountered in true_divide\n", + "/opt/conda/lib/python3.5/site-packages/ipykernel/__main__.py:48: RuntimeWarning: invalid value encountered in true_divide\n", + "/opt/conda/lib/python3.5/site-packages/ipykernel/__main__.py:48: RuntimeWarning: invalid value encountered in subtract\n" + ] + } + ], + "source": [ + "predicted = []\n", + "actuals = []\n", + "nb_models = []\n", + "i = 0\n", + "for train_idx, test_idx in KFold(n=X.shape[0], n_folds=5, shuffle=True):\n", + " X_train = X[train_idx]\n", + " X_test = X[test_idx]\n", + " y_train = y[train_idx]\n", + " y_test = y[test_idx]\n", + " nb = NaiveBayesClassifier(X_train, y_train,\n", + " parametric_form=\"gaussian\", keep_copy_of_X=False)\n", + " \n", + " nb.fit()\n", + " \n", + " preds = nb.predict(X_test)\n", + " predicted.append(preds)\n", + " actuals.append(y_test)\n", + " nb_models.append(nb)\n", + " pickle.dump(nb_models, open(\"./dumps/gaussian_nb/nb_model_fold_{fold}.pkl\"\n", + " .format(fold=str(i)), 'wb'))\n", + " pickle.dump(predicted, open(\"./dumps/gaussian_nb/predicted_fold_{fold}.pkl\"\n", + " .format(fold=str(i)), 'wb'))\n", + " pickle.dump(actuals, open(\"./dumps/gaussian_nb/actuals_fold_{fold}.pkl\"\n", + " .format(fold=str(i)), 'wb'))\n", + " i += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn.metrics import precision_score, recall_score, f1_score, accuracy_score" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['predicted_fold_0.pkl',\n", + " 'actuals_fold_2.pkl',\n", + " 'predicted_fold_1.pkl',\n", + " 'nb_model_fold_1.pkl',\n", + " 'actuals_fold_4.pkl',\n", + " 'predicted_fold_3.pkl',\n", + " 'predicted_fold_4.pkl',\n", + " 'predicted_fold_2.pkl',\n", + " 'actuals_fold_0.pkl',\n", + " 'nb_model_fold_2.pkl',\n", + " 'nb_model_fold_4.pkl',\n", + " 'actuals_fold_3.pkl',\n", + " 'nb_model_fold_3.pkl',\n", + " 'actuals_fold_1.pkl',\n", + " 'nb_model_fold_0.pkl']" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_folder = \"./dumps/gaussian_nb/\"\n", + "os.listdir(model_folder)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "predicted = pickle.load(open(model_folder + \"predicted_fold_4.pkl\", 'rb'))\n", + "actuals = pickle.load(open(model_folder + \"actuals_fold_4.pkl\", 'rb'))" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "confusion matrix\n", + "[[ 41 87]\n", + " [ 19 459]]\n", + "\taccuracy\n", + "\t\t 0.825082508251\n", + "\tf1\n", + "\t\t 0.896484375\n", + "\trecall\n", + "\t\t 0.960251046025\n", + "\tprecision\n", + "\t\t 0.840659340659\n", + "confusion matrix\n", + "[[ 47 96]\n", + " [ 18 445]]\n", + "\taccuracy\n", + "\t\t 0.811881188119\n", + "\tf1\n", + "\t\t 0.886454183267\n", + "\trecall\n", + "\t\t 0.961123110151\n", + "\tprecision\n", + "\t\t 0.822550831793\n", + "confusion matrix\n", + "[[ 37 105]\n", + " [ 9 454]]\n", + "\taccuracy\n", + "\t\t 0.811570247934\n", + "\tf1\n", + "\t\t 0.888454011742\n", + "\trecall\n", + "\t\t 0.980561555076\n", + "\tprecision\n", + "\t\t 0.812164579606\n", + "confusion matrix\n", + "[[ 50 108]\n", + " [ 13 434]]\n", + "\taccuracy\n", + "\t\t 0.8\n", + "\tf1\n", + "\t\t 0.877654196158\n", + "\trecall\n", + "\t\t 0.970917225951\n", + "\tprecision\n", + "\t\t 0.80073800738\n", + "confusion matrix\n", + "[[ 45 95]\n", + " [ 27 438]]\n", + "\taccuracy\n", + "\t\t 0.798347107438\n", + "\tf1\n", + "\t\t 0.877755511022\n", + "\trecall\n", + "\t\t 0.941935483871\n", + "\tprecision\n", + "\t\t 0.821763602251\n" + ] + } + ], + "source": [ + "for pred, actual in zip(predicted, actuals):\n", + " print(\"confusion matrix\")\n", + " print(confusion_matrix(actual, pred))\n", + " print(\"\\taccuracy\")\n", + " print(\"\\t\\t\", accuracy_score(actual, pred))\n", + " print(\"\\tf1\")\n", + " print(\"\\t\\t\", f1_score(actual, pred))\n", + " print(\"\\trecall\")\n", + " print(\"\\t\\t\", recall_score(actual, pred))\n", + " print(\"\\tprecision\")\n", + " print(\"\\t\\t\", precision_score(actual, pred))" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn.metrics import matthews_corrcoef" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "confusion matrix\n", + "[[ 41 87]\n", + " [ 19 459]]\n", + "\taccuracy\n", + "\t\t 0.825082508251\n", + "\tf1\n", + "\t\t 0.896484375\n", + "\trecall\n", + "\t\t 0.960251046025\n", + "\tprecision\n", + "\t\t 0.840659340659\n", + "\tmcc\n", + "\t\t 0.383423059696\n", + "confusion matrix\n", + "[[ 47 96]\n", + " [ 18 445]]\n", + "\taccuracy\n", + "\t\t 0.811881188119\n", + "\tf1\n", + "\t\t 0.886454183267\n", + "\trecall\n", + "\t\t 0.961123110151\n", + "\tprecision\n", + "\t\t 0.822550831793\n", + "\tmcc\n", + "\t\t 0.397642916482\n", + "confusion matrix\n", + "[[ 37 105]\n", + " [ 9 454]]\n", + "\taccuracy\n", + "\t\t 0.811570247934\n", + "\tf1\n", + "\t\t 0.888454011742\n", + "\trecall\n", + "\t\t 0.980561555076\n", + "\tprecision\n", + "\t\t 0.812164579606\n", + "\tmcc\n", + "\t\t 0.38556000048\n", + "confusion matrix\n", + "[[ 50 108]\n", + " [ 13 434]]\n", + "\taccuracy\n", + "\t\t 0.8\n", + "\tf1\n", + "\t\t 0.877654196158\n", + "\trecall\n", + "\t\t 0.970917225951\n", + "\tprecision\n", + "\t\t 0.80073800738\n", + "\tmcc\n", + "\t\t 0.413293172757\n", + "confusion matrix\n", + "[[ 45 95]\n", + " [ 27 438]]\n", + "\taccuracy\n", + "\t\t 0.798347107438\n", + "\tf1\n", + "\t\t 0.877755511022\n", + "\trecall\n", + "\t\t 0.941935483871\n", + "\tprecision\n", + "\t\t 0.821763602251\n", + "\tmcc\n", + "\t\t 0.343018183263\n" + ] + } + ], + "source": [ + "accuracy = []\n", + "precision = []\n", + "recall = []\n", + "f1 = []\n", + "mcc = []\n", + "predicted = pickle.load(open(model_folder + \"predicted_fold_4.pkl\", 'rb'))\n", + "actuals = pickle.load(open(model_folder + \"actuals_fold_4.pkl\", 'rb'))\n", + "for pred, actual in zip(predicted, actuals):\n", + " print(\"confusion matrix\")\n", + " print(confusion_matrix(actual, pred))\n", + " print(\"\\taccuracy\")\n", + " acc = accuracy_score(actual, pred)\n", + " accuracy.append(acc)\n", + " print(\"\\t\\t\", acc)\n", + " print(\"\\tf1\")\n", + " f = f1_score(actual, pred)\n", + " f1.append(f)\n", + " print(\"\\t\\t\", f)\n", + " print(\"\\trecall\")\n", + " r = recall_score(actual, pred)\n", + " recall.append(r)\n", + " print(\"\\t\\t\", r)\n", + " print(\"\\tprecision\")\n", + " p = precision_score(actual, pred)\n", + " precision.append(p)\n", + " print(\"\\t\\t\", p)\n", + " print(\"\\tmcc\")\n", + " m = matthews_corrcoef(actual, pred)\n", + " mcc.append(m)\n", + " print(\"\\t\\t\", m)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.80937621034830765" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.mean(accuracy)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.343018183263\n", + "0.384587466536\n", + "0.413293172757\n" + ] + } + ], + "source": [ + "print(np.min(mcc))\n", + "print(np.mean(mcc))\n", + "print(np.max(mcc))" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.798347107438\n", + "0.809376210348\n", + "0.825082508251\n" + ] + } + ], + "source": [ + "print(np.min(accuracy))\n", + "print(np.mean(accuracy))\n", + "print(np.max(accuracy))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "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.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/notebooks/Project 1 Results - LDA.ipynb b/notebooks/Project 1 Results - LDA.ipynb new file mode 100644 index 0000000..24e99a3 --- /dev/null +++ b/notebooks/Project 1 Results - LDA.ipynb @@ -0,0 +1,797 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Results for Linear Discriminant Analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import os\n", + "import pickle\n", + "import numpy as np\n", + "from scipy import sparse\n", + "from sklearn.externals import joblib\n", + "from sklearn.cross_validation import KFold\n", + "from sklearn.metrics import confusion_matrix\n", + "from sklearn.cross_validation import train_test_split\n", + "from midi_ml.models.linear_decision_rules import LinearDiscriminantAnalysis" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "labels = joblib.load(\"/home/jovyan/persistent_data/data/dumps/labeled_corpus_labels.pkl\")\n", + "features = joblib.load(\"/home/jovyan/persistent_data/data/dumps/labeled_corpus_matrix.pkl\")\n", + "features = features.todense()\n", + "bach_labels = [k for k in range(len(labels)) if labels[k] == \"bach-js\"]\n", + "mozart_labels = [k for k in range(len(labels)) if labels[k] == \"mozart\"]\n", + "X = features[bach_labels + mozart_labels].A\n", + "y = np.array([1 for i in range(len(bach_labels))] + [0 for i in range(len(mozart_labels))])\n", + "y = y.reshape((y.shape[0],))\n", + "del features" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As an example, plot the single dimension that the LDA projects on to" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "regularization_parameter = 0.01\n", + "predicted = []\n", + "actuals = []\n", + "i = 0\n", + "for train_idx, test_idx in KFold(n=X.shape[0], n_folds=5, shuffle=True):\n", + " X_train = X[train_idx]\n", + " X_test = X[test_idx]\n", + " y_train = y[train_idx]\n", + " y_test = y[test_idx]\n", + " lda = LinearDiscriminantAnalysis(X_train, y_train, regularization=regularization_parameter, keep_copy_of_X=False)\n", + " lda.fit()\n", + " preds = lda.predict(X_test)\n", + " predicted.append(preds)\n", + " actuals.append(y_test)\n", + " del lda\n", + " pickle.dump(predicted, open(\"./dumps/lda/predicted_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(actuals, open(\"./dumps/lda/actuals_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " i += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "regularization_parameter = 0.1\n", + "predicted = []\n", + "actuals = []\n", + "i = 0\n", + "for train_idx, test_idx in KFold(n=X.shape[0], n_folds=5, shuffle=True):\n", + " X_train = X[train_idx]\n", + " X_test = X[test_idx]\n", + " y_train = y[train_idx]\n", + " y_test = y[test_idx]\n", + " lda = LinearDiscriminantAnalysis(X_train, y_train, regularization=regularization_parameter, keep_copy_of_X=False)\n", + " lda.fit()\n", + " preds = lda.predict(X_test)\n", + " predicted.append(preds)\n", + " actuals.append(y_test)\n", + " del lda\n", + " pickle.dump(predicted, open(\"./dumps/lda/predicted_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(actuals, open(\"./dumps/lda/actuals_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " i += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "regularization_parameter = 0.3\n", + "predicted = []\n", + "actuals = []\n", + "i = 0\n", + "for train_idx, test_idx in KFold(n=X.shape[0], n_folds=5, shuffle=True):\n", + " X_train = X[train_idx]\n", + " X_test = X[test_idx]\n", + " y_train = y[train_idx]\n", + " y_test = y[test_idx]\n", + " lda = LinearDiscriminantAnalysis(X_train, y_train, regularization=regularization_parameter, keep_copy_of_X=False)\n", + " lda.fit()\n", + " preds = lda.predict(X_test)\n", + " predicted.append(preds)\n", + " actuals.append(y_test)\n", + " del lda\n", + " pickle.dump(predicted, open(\"./dumps/lda/predicted_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(actuals, open(\"./dumps/lda/actuals_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " i += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "regularization_parameter = 0.001\n", + "predicted = []\n", + "actuals = []\n", + "i = 0\n", + "for train_idx, test_idx in KFold(n=X.shape[0], n_folds=5, shuffle=True):\n", + " X_train = X[train_idx]\n", + " X_test = X[test_idx]\n", + " y_train = y[train_idx]\n", + " y_test = y[test_idx]\n", + " lda = LinearDiscriminantAnalysis(X_train, y_train, regularization=regularization_parameter, keep_copy_of_X=False)\n", + " lda.fit()\n", + " preds = lda.predict(X_test)\n", + " predicted.append(preds)\n", + " actuals.append(y_test)\n", + " del lda\n", + " pickle.dump(predicted, open(\"./dumps/lda/predicted_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(actuals, open(\"./dumps/lda/actuals_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " i += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Results" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn.metrics import precision_score, recall_score, f1_score, accuracy_score, matthews_corrcoef" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "regularizations = [0.001, 0.01, 0.1, 0.3, 0.5]" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model_folder = \"./dumps/lda/\"" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Regularization: 0.001\n", + "confusion matrix\n", + "[[ 67 75]\n", + " [ 16 448]]\n", + "\taccuracy\n", + "\t\t 0.849834983498\n", + "\tf1\n", + "\t\t 0.90780141844\n", + "\trecall\n", + "\t\t 0.965517241379\n", + "\tprecision\n", + "\t\t 0.856596558317\n", + "\tmcc\n", + "\t\t 0.538816197119\n", + "confusion matrix\n", + "[[ 78 61]\n", + " [ 16 451]]\n", + "\taccuracy\n", + "\t\t 0.872937293729\n", + "\tf1\n", + "\t\t 0.921348314607\n", + "\trecall\n", + "\t\t 0.96573875803\n", + "\tprecision\n", + "\t\t 0.880859375\n", + "\tmcc\n", + "\t\t 0.611908878937\n", + "confusion matrix\n", + "[[ 75 65]\n", + " [ 17 448]]\n", + "\taccuracy\n", + "\t\t 0.864462809917\n", + "\tf1\n", + "\t\t 0.916155419223\n", + "\trecall\n", + "\t\t 0.963440860215\n", + "\tprecision\n", + "\t\t 0.873294346979\n", + "\tmcc\n", + "\t\t 0.586237304508\n", + "confusion matrix\n", + "[[ 91 60]\n", + " [ 13 441]]\n", + "\taccuracy\n", + "\t\t 0.879338842975\n", + "\tf1\n", + "\t\t 0.923560209424\n", + "\trecall\n", + "\t\t 0.971365638767\n", + "\tprecision\n", + "\t\t 0.880239520958\n", + "\tmcc\n", + "\t\t 0.658421252548\n", + "confusion matrix\n", + "[[ 80 59]\n", + " [ 15 451]]\n", + "\taccuracy\n", + "\t\t 0.877685950413\n", + "\tf1\n", + "\t\t 0.924180327869\n", + "\trecall\n", + "\t\t 0.967811158798\n", + "\tprecision\n", + "\t\t 0.88431372549\n", + "\tmcc\n", + "\t\t 0.628251769351\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Regularization: 0.01\n", + "confusion matrix\n", + "[[ 76 59]\n", + " [ 12 459]]\n", + "\taccuracy\n", + "\t\t 0.882838283828\n", + "\tf1\n", + "\t\t 0.928210313448\n", + "\trecall\n", + "\t\t 0.974522292994\n", + "\tprecision\n", + "\t\t 0.8861003861\n", + "\tmcc\n", + "\t\t 0.634801109665\n", + "confusion matrix\n", + "[[ 95 68]\n", + " [ 5 438]]\n", + "\taccuracy\n", + "\t\t 0.879537953795\n", + "\tf1\n", + "\t\t 0.923076923077\n", + "\trecall\n", + "\t\t 0.988713318284\n", + "\tprecision\n", + "\t\t 0.865612648221\n", + "\tmcc\n", + "\t\t 0.682752886886\n", + "confusion matrix\n", + "[[ 78 66]\n", + " [ 8 453]]\n", + "\taccuracy\n", + "\t\t 0.877685950413\n", + "\tf1\n", + "\t\t 0.924489795918\n", + "\trecall\n", + "\t\t 0.982646420824\n", + "\tprecision\n", + "\t\t 0.872832369942\n", + "\tmcc\n", + "\t\t 0.63942483865\n", + "confusion matrix\n", + "[[ 83 57]\n", + " [ 11 454]]\n", + "\taccuracy\n", + "\t\t 0.887603305785\n", + "\tf1\n", + "\t\t 0.930327868852\n", + "\trecall\n", + "\t\t 0.976344086022\n", + "\tprecision\n", + "\t\t 0.888454011742\n", + "\tmcc\n", + "\t\t 0.66264655801\n", + "confusion matrix\n", + "[[ 87 42]\n", + " [ 10 466]]\n", + "\taccuracy\n", + "\t\t 0.914049586777\n", + "\tf1\n", + "\t\t 0.947154471545\n", + "\trecall\n", + "\t\t 0.978991596639\n", + "\tprecision\n", + "\t\t 0.917322834646\n", + "\tmcc\n", + "\t\t 0.729401276124\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Regularization: 0.1\n", + "confusion matrix\n", + "[[ 83 58]\n", + " [ 15 450]]\n", + "\taccuracy\n", + "\t\t 0.879537953795\n", + "\tf1\n", + "\t\t 0.924974306269\n", + "\trecall\n", + "\t\t 0.967741935484\n", + "\tprecision\n", + "\t\t 0.885826771654\n", + "\tmcc\n", + "\t\t 0.638519114799\n", + "confusion matrix\n", + "[[ 80 59]\n", + " [ 8 459]]\n", + "\taccuracy\n", + "\t\t 0.889438943894\n", + "\tf1\n", + "\t\t 0.931979695431\n", + "\trecall\n", + "\t\t 0.982869379015\n", + "\tprecision\n", + "\t\t 0.8861003861\n", + "\tmcc\n", + "\t\t 0.666364715526\n", + "confusion matrix\n", + "[[100 49]\n", + " [ 7 449]]\n", + "\taccuracy\n", + "\t\t 0.907438016529\n", + "\tf1\n", + "\t\t 0.941299790356\n", + "\trecall\n", + "\t\t 0.984649122807\n", + "\tprecision\n", + "\t\t 0.901606425703\n", + "\tmcc\n", + "\t\t 0.740514942834\n", + "confusion matrix\n", + "[[ 78 58]\n", + " [ 13 456]]\n", + "\taccuracy\n", + "\t\t 0.882644628099\n", + "\tf1\n", + "\t\t 0.927772126144\n", + "\trecall\n", + "\t\t 0.972281449893\n", + "\tprecision\n", + "\t\t 0.887159533074\n", + "\tmcc\n", + "\t\t 0.637376128309\n", + "confusion matrix\n", + "[[ 82 64]\n", + " [ 11 448]]\n", + "\taccuracy\n", + "\t\t 0.876033057851\n", + "\tf1\n", + "\t\t 0.922760041195\n", + "\trecall\n", + "\t\t 0.976034858388\n", + "\tprecision\n", + "\t\t 0.875\n", + "\tmcc\n", + "\t\t 0.637865544285\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Regularization: 0.3\n", + "confusion matrix\n", + "[[ 79 53]\n", + " [ 15 459]]\n", + "\taccuracy\n", + "\t\t 0.887788778878\n", + "\tf1\n", + "\t\t 0.931034482759\n", + "\trecall\n", + "\t\t 0.96835443038\n", + "\tprecision\n", + "\t\t 0.896484375\n", + "\tmcc\n", + "\t\t 0.646304479502\n", + "confusion matrix\n", + "[[ 81 63]\n", + " [ 13 449]]\n", + "\taccuracy\n", + "\t\t 0.874587458746\n", + "\tf1\n", + "\t\t 0.921971252567\n", + "\trecall\n", + "\t\t 0.971861471861\n", + "\tprecision\n", + "\t\t 0.876953125\n", + "\tmcc\n", + "\t\t 0.628258631464\n", + "confusion matrix\n", + "[[ 84 66]\n", + " [ 13 442]]\n", + "\taccuracy\n", + "\t\t 0.869421487603\n", + "\tf1\n", + "\t\t 0.917964693666\n", + "\trecall\n", + "\t\t 0.971428571429\n", + "\tprecision\n", + "\t\t 0.870078740157\n", + "\tmcc\n", + "\t\t 0.625429705123\n", + "confusion matrix\n", + "[[ 76 71]\n", + " [ 18 440]]\n", + "\taccuracy\n", + "\t\t 0.852892561983\n", + "\tf1\n", + "\t\t 0.908152734778\n", + "\trecall\n", + "\t\t 0.960698689956\n", + "\tprecision\n", + "\t\t 0.861056751468\n", + "\tmcc\n", + "\t\t 0.565558148919\n", + "confusion matrix\n", + "[[ 74 64]\n", + " [ 17 450]]\n", + "\taccuracy\n", + "\t\t 0.866115702479\n", + "\tf1\n", + "\t\t 0.917431192661\n", + "\trecall\n", + "\t\t 0.963597430407\n", + "\tprecision\n", + "\t\t 0.875486381323\n", + "\tmcc\n", + "\t\t 0.5867018414\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Regularization: 0.5\n", + "confusion matrix\n", + "[[ 79 60]\n", + " [ 13 454]]\n", + "\taccuracy\n", + "\t\t 0.879537953795\n", + "\tf1\n", + "\t\t 0.925586136595\n", + "\trecall\n", + "\t\t 0.972162740899\n", + "\tprecision\n", + "\t\t 0.88326848249\n", + "\tmcc\n", + "\t\t 0.63327529437\n", + "confusion matrix\n", + "[[ 85 60]\n", + " [ 13 448]]\n", + "\taccuracy\n", + "\t\t 0.879537953795\n", + "\tf1\n", + "\t\t 0.924664602683\n", + "\trecall\n", + "\t\t 0.971800433839\n", + "\tprecision\n", + "\t\t 0.88188976378\n", + "\tmcc\n", + "\t\t 0.646590730079\n", + "confusion matrix\n", + "[[ 85 54]\n", + " [ 17 449]]\n", + "\taccuracy\n", + "\t\t 0.882644628099\n", + "\tf1\n", + "\t\t 0.926728586171\n", + "\trecall\n", + "\t\t 0.963519313305\n", + "\tprecision\n", + "\t\t 0.892644135189\n", + "\tmcc\n", + "\t\t 0.646110594027\n", + "confusion matrix\n", + "[[ 86 58]\n", + " [ 15 446]]\n", + "\taccuracy\n", + "\t\t 0.879338842975\n", + "\tf1\n", + "\t\t 0.924352331606\n", + "\trecall\n", + "\t\t 0.967462039046\n", + "\tprecision\n", + "\t\t 0.884920634921\n", + "\tmcc\n", + "\t\t 0.644854057762\n", + "confusion matrix\n", + "[[ 72 72]\n", + " [ 21 440]]\n", + "\taccuracy\n", + "\t\t 0.846280991736\n", + "\tf1\n", + "\t\t 0.904419321686\n", + "\trecall\n", + "\t\t 0.954446854664\n", + "\tprecision\n", + "\t\t 0.859375\n", + "\tmcc\n", + "\t\t 0.536584787362\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "accuracy = {reg: [] for reg in regularizations}\n", + "precision = {reg: [] for reg in regularizations}\n", + "recall = {reg: [] for reg in regularizations}\n", + "f1 = {reg: [] for reg in regularizations}\n", + "mcc = {reg: [] for reg in regularizations}\n", + "for reg in regularizations:\n", + " print(\"Regularization: %s\" % reg)\n", + " predicted = pickle.load(open(model_folder + \"predicted_fold_4_reg_%s.pkl\" % reg, 'rb'))\n", + " actuals = pickle.load(open(model_folder + \"actuals_fold_4_reg_%s.pkl\" % reg, 'rb'))\n", + " for pred, actual in zip(predicted, actuals):\n", + " print(\"confusion matrix\")\n", + " print(confusion_matrix(actual, pred))\n", + " print(\"\\taccuracy\")\n", + " acc = accuracy_score(actual, pred)\n", + " accuracy[reg].append(acc)\n", + " print(\"\\t\\t\", acc)\n", + " print(\"\\tf1\")\n", + " f = f1_score(actual, pred)\n", + " f1[reg].append(f)\n", + " print(\"\\t\\t\", f)\n", + " print(\"\\trecall\")\n", + " r = recall_score(actual, pred)\n", + " recall[reg].append(r)\n", + " print(\"\\t\\t\", r)\n", + " print(\"\\tprecision\")\n", + " p = precision_score(actual, pred)\n", + " precision[reg].append(p)\n", + " print(\"\\t\\t\", p)\n", + " print(\"\\tmcc\")\n", + " m = matthews_corrcoef(actual, pred)\n", + " mcc[reg].append(m)\n", + " print(\"\\t\\t\", m)\n", + "\n", + "\n", + " print(\"\\n\\n\\n\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.538816197119\n", + "0.604727080493\n", + "0.658421252548\n" + ] + } + ], + "source": [ + "reg = 0.001\n", + "print(np.min(mcc[reg]))\n", + "print(np.mean(mcc[reg]))\n", + "print(np.max(mcc[reg]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.852892561983\n", + "0.870161197938\n", + "0.887788778878\n" + ] + } + ], + "source": [ + "reg = 0.3\n", + "print(np.min(accuracy[reg]))\n", + "print(np.mean(accuracy[reg]))\n", + "print(np.max(accuracy[reg]))" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.876033057851\n", + "0.887018520034\n", + "0.907438016529\n" + ] + } + ], + "source": [ + "reg = 0.1\n", + "print(np.min(accuracy[reg]))\n", + "print(np.mean(accuracy[reg]))\n", + "print(np.max(accuracy[reg]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "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.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/notebooks/Project 1 Results - Logistic Regression - Normal.ipynb b/notebooks/Project 1 Results - Logistic Regression - Normal.ipynb new file mode 100644 index 0000000..1914de5 --- /dev/null +++ b/notebooks/Project 1 Results - Logistic Regression - Normal.ipynb @@ -0,0 +1,2914 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Results for Logistic Regression" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import os\n", + "import pickle\n", + "import numpy as np\n", + "from scipy import sparse\n", + "from sklearn.externals import joblib\n", + "from sklearn.cross_validation import KFold\n", + "from sklearn.metrics import confusion_matrix\n", + "from sklearn.cross_validation import train_test_split\n", + "from midi_ml.models.linear_decision_rules import PenalizedLogisticRegression" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "labels = joblib.load(\"/home/jovyan/persistent_data/data/dumps/labeled_corpus_labels.pkl\")\n", + "features = joblib.load(\"/home/jovyan/persistent_data/data/dumps/labeled_corpus_matrix.pkl\")\n", + "features = features.todense()\n", + "bach_labels = [k for k in range(len(labels)) if labels[k] == \"bach-js\"]\n", + "mozart_labels = [k for k in range(len(labels)) if labels[k] == \"mozart\"]\n", + "X = features[bach_labels + mozart_labels].A\n", + "y = np.array([1 for i in range(len(bach_labels))] + [0 for i in range(len(mozart_labels))])\n", + "y = y.reshape((y.shape[0],))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Without Undersampling and Probability Corrections" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "regularization_parameter = 1\n", + "predicted = []\n", + "actuals = []\n", + "lr_models = []\n", + "i = 0\n", + "for train_idx, test_idx in KFold(n=X.shape[0], n_folds=5, shuffle=True):\n", + " X_train = X[train_idx]\n", + " y_train = y[train_idx]\n", + " X_test = X[test_idx]\n", + " y_test = y[test_idx]\n", + " lr = PenalizedLogisticRegression(X_train, y_train,\n", + " l2_penalty=regularization_parameter,\n", + " num_iter=5)\n", + " try:\n", + " lr.fit()\n", + " except:\n", + " continue\n", + " lr.X = None\n", + " preds = (lr.predict_probabilities(X_test) > 0.5).astype(int)\n", + " predicted.append(preds)\n", + " actuals.append(y_test)\n", + " lr_models.append(lr)\n", + " pickle.dump(lr_models, open(\"./dumps/logistic/normal/model_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(predicted, open(\"./dumps/logistic/normal/predicted_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(actuals, open(\"./dumps/logistic/normal/actuals_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " i += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "regularization_parameter = 10\n", + "predicted = []\n", + "actuals = []\n", + "lr_models = []\n", + "i = 0\n", + "for train_idx, test_idx in KFold(n=X.shape[0], n_folds=5, shuffle=True):\n", + " X_train = X[train_idx]\n", + " y_train = y[train_idx]\n", + " X_test = X[test_idx]\n", + " y_test = y[test_idx]\n", + " lr = PenalizedLogisticRegression(X_train, y_train,\n", + " l2_penalty=regularization_parameter,\n", + " num_iter=5)\n", + " try:\n", + " lr.fit()\n", + " except:\n", + " continue\n", + " lr.X = None\n", + " preds = (lr.predict_probabilities(X_test) > 0.5).astype(int)\n", + " predicted.append(preds)\n", + " actuals.append(y_test)\n", + " lr_models.append(lr)\n", + " pickle.dump(lr_models, open(\"./dumps/logistic/normal/model_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(predicted, open(\"./dumps/logistic/normal/predicted_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(actuals, open(\"./dumps/logistic/normal/actuals_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " i += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "regularization_parameter = 100\n", + "predicted = []\n", + "actuals = []\n", + "lr_models = []\n", + "i = 0\n", + "for train_idx, test_idx in KFold(n=X.shape[0], n_folds=5, shuffle=True):\n", + " X_train = X[train_idx]\n", + " y_train = y[train_idx]\n", + " X_test = X[test_idx]\n", + " y_test = y[test_idx]\n", + " lr = PenalizedLogisticRegression(X_train, y_train,\n", + " l2_penalty=regularization_parameter,\n", + " num_iter=5)\n", + " try:\n", + " lr.fit()\n", + " except:\n", + " continue\n", + " lr.X = None\n", + " preds = (lr.predict_probabilities(X_test) > 0.5).astype(int)\n", + " predicted.append(preds)\n", + " actuals.append(y_test)\n", + " lr_models.append(lr)\n", + " pickle.dump(lr_models, open(\"./dumps/logistic/normal/model_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(predicted, open(\"./dumps/logistic/normal/predicted_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(actuals, open(\"./dumps/logistic/normal/actuals_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " i += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "regularization_parameter = 1000\n", + "predicted = []\n", + "actuals = []\n", + "lr_models = []\n", + "i = 0\n", + "for train_idx, test_idx in KFold(n=X.shape[0], n_folds=5, shuffle=True):\n", + " X_train = X[train_idx]\n", + " y_train = y[train_idx]\n", + " X_test = X[test_idx]\n", + " y_test = y[test_idx]\n", + " lr = PenalizedLogisticRegression(X_train, y_train,\n", + " l2_penalty=regularization_parameter,\n", + " num_iter=5)\n", + " try:\n", + " lr.fit()\n", + " except:\n", + " continue\n", + " lr.X = None\n", + " preds = (lr.predict_probabilities(X_test) > 0.5).astype(int)\n", + " predicted.append(preds)\n", + " actuals.append(y_test)\n", + " lr_models.append(lr)\n", + " pickle.dump(lr_models, open(\"./dumps/logistic/normal/model_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(predicted, open(\"./dumps/logistic/normal/predicted_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(actuals, open(\"./dumps/logistic/normal/actuals_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " i += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model-fitting complete\n", + "Model-fitting complete\n", + "Model-fitting complete\n", + "Model-fitting complete\n", + "Model-fitting complete\n" + ] + } + ], + "source": [ + "regularization_parameter = 5000\n", + "predicted = []\n", + "actuals = []\n", + "lr_models = []\n", + "i = 0\n", + "for train_idx, test_idx in KFold(n=X.shape[0], n_folds=5, shuffle=True):\n", + " X_train = X[train_idx]\n", + " y_train = y[train_idx]\n", + " X_test = X[test_idx]\n", + " y_test = y[test_idx]\n", + " lr = PenalizedLogisticRegression(X_train, y_train,\n", + " l2_penalty=regularization_parameter,\n", + " num_iter=5)\n", + " try:\n", + " lr.fit()\n", + " except:\n", + " continue\n", + " lr.X = None\n", + " preds = (lr.predict_probabilities(X_test) > 0.5).astype(int)\n", + " predicted.append(preds)\n", + " actuals.append(y_test)\n", + " lr_models.append(lr)\n", + " pickle.dump(lr_models, open(\"./dumps/logistic/normal/model_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(predicted, open(\"./dumps/logistic/normal/predicted_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(actuals, open(\"./dumps/logistic/normal/actuals_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " i += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model-fitting complete\n", + "Model-fitting complete\n" + ] + } + ], + "source": [ + "regularization_parameter = 10000\n", + "predicted = []\n", + "actuals = []\n", + "lr_models = []\n", + "i = 0\n", + "for train_idx, test_idx in KFold(n=X.shape[0], n_folds=5, shuffle=True):\n", + " X_train = X[train_idx]\n", + " y_train = y[train_idx]\n", + " X_test = X[test_idx]\n", + " y_test = y[test_idx]\n", + " lr = PenalizedLogisticRegression(X_train, y_train,\n", + " l2_penalty=regularization_parameter,\n", + " num_iter=5)\n", + " try:\n", + " lr.fit()\n", + " except:\n", + " continue\n", + " lr.X = None\n", + " preds = (lr.predict_probabilities(X_test) > 0.5).astype(int)\n", + " predicted.append(preds)\n", + " actuals.append(y_test)\n", + " lr_models.append(lr)\n", + " pickle.dump(lr_models, open(\"./dumps/logistic/normal/model_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(predicted, open(\"./dumps/logistic/normal/predicted_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(actuals, open(\"./dumps/logistic/normal/actuals_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " i += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "regularization_parameter = 100000\n", + "predicted = []\n", + "actuals = []\n", + "lr_models = []\n", + "i = 0\n", + "for train_idx, test_idx in KFold(n=X.shape[0], n_folds=5, shuffle=True):\n", + " X_train = X[train_idx]\n", + " y_train = y[train_idx]\n", + " X_test = X[test_idx]\n", + " y_test = y[test_idx]\n", + " lr = PenalizedLogisticRegression(X_train, y_train,\n", + " l2_penalty=regularization_parameter,\n", + " num_iter=5)\n", + " try:\n", + " lr.fit()\n", + " except:\n", + " continue\n", + " lr.X = None\n", + " preds = (lr.predict_probabilities(X_test) > 0.5).astype(int)\n", + " predicted.append(preds)\n", + " actuals.append(y_test)\n", + " lr_models.append(lr)\n", + " pickle.dump(lr_models, open(\"./dumps/logistic/normal/model_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(predicted, open(\"./dumps/logistic/normal/predicted_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(actuals, open(\"./dumps/logistic/normal/actuals_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " i += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Results" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn.metrics import precision_score, recall_score, f1_score, accuracy_score, matthews_corrcoef" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "regularizations = [1, 10, 100, 1000, 5000, 10000, 100000]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['predicted_fold_4_reg_100000.pkl',\n", + " 'actuals_fold_3_reg_10000.pkl',\n", + " 'predicted_fold_1_reg_1.pkl',\n", + " 'actuals_fold_2_reg_5000.pkl',\n", + " 'predicted_fold_0_reg_5000.pkl',\n", + " 'predicted_fold_2_reg_10000.pkl',\n", + " 'model_fold_2_reg_10.pkl',\n", + " 'predicted_fold_4_reg_5000.pkl',\n", + " 'actuals_fold_4_reg_100.pkl',\n", + " 'actuals_fold_0_reg_5000.pkl',\n", + " 'model_fold_4_reg_1000.pkl',\n", + " 'predicted_fold_4_reg_1.pkl',\n", + " 'actuals_fold_4_reg_1000.pkl',\n", + " 'actuals_fold_3_reg_5000.pkl',\n", + " 'actuals_fold_3_reg_1000.pkl',\n", + " 'actuals_fold_0_reg_100000.pkl',\n", + " 'model_fold_1_reg_1.pkl',\n", + " 'predicted_fold_4_reg_10000.pkl',\n", + " 'predicted_fold_2_reg_100000.pkl',\n", + " 'model_fold_2_reg_1000.pkl',\n", + " 'model_fold_0_reg_1000.pkl',\n", + " 'actuals_fold_4_reg_10.pkl',\n", + " 'predicted_fold_0_reg_100.pkl',\n", + " 'model_fold_4_reg_10000.pkl',\n", + " 'model_fold_0_reg_1.pkl',\n", + " 'model_fold_3_reg_1.pkl',\n", + " 'actuals_fold_1_reg_10000.pkl',\n", + " 'model_fold_3_reg_5000.pkl',\n", + " 'actuals_fold_4_reg_1.pkl',\n", + " 'model_fold_2_reg_100.pkl',\n", + " 'model_fold_4_reg_100000.pkl',\n", + " 'actuals_fold_2_reg_1000.pkl',\n", + " 'predicted_fold_2_reg_5000.pkl',\n", + " 'model_fold_1_reg_100.pkl',\n", + " 'actuals_fold_3_reg_100.pkl',\n", + " 'actuals_fold_2_reg_10.pkl',\n", + " 'model_fold_1_reg_5000.pkl',\n", + " 'predicted_fold_1_reg_10.pkl',\n", + " 'model_fold_2_reg_5000.pkl',\n", + " 'predicted_fold_3_reg_100000.pkl',\n", + " 'actuals_fold_2_reg_1.pkl',\n", + " 'predicted_fold_0_reg_10000.pkl',\n", + " 'predicted_fold_4_reg_10.pkl',\n", + " 'predicted_fold_2_reg_1000.pkl',\n", + " 'model_fold_0_reg_10000.pkl',\n", + " 'model_fold_1_reg_10.pkl',\n", + " 'model_fold_2_reg_10000.pkl',\n", + " 'predicted_fold_2_reg_100.pkl',\n", + " 'model_fold_2_reg_100000.pkl',\n", + " 'actuals_fold_1_reg_1.pkl',\n", + " 'model_fold_4_reg_10.pkl',\n", + " 'predicted_fold_3_reg_1000.pkl',\n", + " 'model_fold_4_reg_1.pkl',\n", + " 'model_fold_0_reg_10.pkl',\n", + " 'predicted_fold_0_reg_1.pkl',\n", + " 'model_fold_1_reg_1000.pkl',\n", + " 'actuals_fold_1_reg_10.pkl',\n", + " 'actuals_fold_2_reg_100.pkl',\n", + " 'actuals_fold_2_reg_100000.pkl',\n", + " 'predicted_fold_3_reg_10000.pkl',\n", + " 'predicted_fold_3_reg_100.pkl',\n", + " 'model_fold_3_reg_1000.pkl',\n", + " 'model_fold_0_reg_5000.pkl',\n", + " 'actuals_fold_0_reg_10000.pkl',\n", + " 'predicted_fold_1_reg_100000.pkl',\n", + " 'predicted_fold_4_reg_100.pkl',\n", + " 'model_fold_0_reg_100.pkl',\n", + " 'predicted_fold_2_reg_10.pkl',\n", + " 'actuals_fold_2_reg_10000.pkl',\n", + " 'model_fold_3_reg_100000.pkl',\n", + " 'model_fold_1_reg_100000.pkl',\n", + " 'actuals_fold_3_reg_10.pkl',\n", + " 'predicted_fold_0_reg_1000.pkl',\n", + " 'predicted_fold_1_reg_5000.pkl',\n", + " 'actuals_fold_4_reg_10000.pkl',\n", + " 'predicted_fold_0_reg_10.pkl',\n", + " 'predicted_fold_3_reg_1.pkl',\n", + " 'actuals_fold_1_reg_5000.pkl',\n", + " 'actuals_fold_0_reg_10.pkl',\n", + " 'model_fold_3_reg_100.pkl',\n", + " 'actuals_fold_3_reg_100000.pkl',\n", + " 'model_fold_4_reg_5000.pkl',\n", + " 'actuals_fold_0_reg_1000.pkl',\n", + " 'actuals_fold_0_reg_100.pkl',\n", + " 'model_fold_2_reg_1.pkl',\n", + " 'predicted_fold_1_reg_100.pkl',\n", + " 'actuals_fold_1_reg_100000.pkl',\n", + " 'predicted_fold_1_reg_1000.pkl',\n", + " 'model_fold_4_reg_100.pkl',\n", + " 'predicted_fold_2_reg_1.pkl',\n", + " 'actuals_fold_3_reg_1.pkl',\n", + " 'model_fold_1_reg_10000.pkl',\n", + " 'predicted_fold_4_reg_1000.pkl',\n", + " 'predicted_fold_1_reg_10000.pkl',\n", + " 'predicted_fold_0_reg_100000.pkl',\n", + " 'actuals_fold_4_reg_100000.pkl',\n", + " 'actuals_fold_0_reg_1.pkl',\n", + " 'model_fold_0_reg_100000.pkl',\n", + " 'model_fold_3_reg_10000.pkl',\n", + " 'actuals_fold_1_reg_100.pkl',\n", + " 'predicted_fold_3_reg_10.pkl',\n", + " 'predicted_fold_3_reg_5000.pkl',\n", + " 'model_fold_3_reg_10.pkl',\n", + " 'actuals_fold_4_reg_5000.pkl',\n", + " 'actuals_fold_1_reg_1000.pkl']" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_folder = \"./dumps/logistic/normal/\"\n", + "os.listdir(model_folder)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Regularization: 1\n", + "confusion matrix\n", + "[[ 91 48]\n", + " [ 55 412]]\n", + "\taccuracy\n", + "\t\t 0.8300330033\n", + "\tf1\n", + "\t\t 0.888888888889\n", + "\trecall\n", + "\t\t 0.882226980728\n", + "\tprecision\n", + "\t\t 0.895652173913\n", + "\tmcc\n", + "\t\t 0.527845132666\n", + "confusion matrix\n", + "[[ 85 46]\n", + " [ 50 425]]\n", + "\taccuracy\n", + "\t\t 0.841584158416\n", + "\tf1\n", + "\t\t 0.898520084567\n", + "\trecall\n", + "\t\t 0.894736842105\n", + "\tprecision\n", + "\t\t 0.902335456476\n", + "\tmcc\n", + "\t\t 0.537747023039\n", + "confusion matrix\n", + "[[ 91 50]\n", + " [ 66 398]]\n", + "\taccuracy\n", + "\t\t 0.80826446281\n", + "\tf1\n", + "\t\t 0.872807017544\n", + "\trecall\n", + "\t\t 0.85775862069\n", + "\tprecision\n", + "\t\t 0.888392857143\n", + "\tmcc\n", + "\t\t 0.485261751128\n", + "confusion matrix\n", + "[[ 90 46]\n", + " [ 56 413]]\n", + "\taccuracy\n", + "\t\t 0.831404958678\n", + "\tf1\n", + "\t\t 0.890086206897\n", + "\trecall\n", + "\t\t 0.880597014925\n", + "\tprecision\n", + "\t\t 0.899782135076\n", + "\tmcc\n", + "\t\t 0.529129694825\n", + "confusion matrix\n", + "[[104 60]\n", + " [ 59 382]]\n", + "\taccuracy\n", + "\t\t 0.803305785124\n", + "\tf1\n", + "\t\t 0.86523216308\n", + "\trecall\n", + "\t\t 0.866213151927\n", + "\tprecision\n", + "\t\t 0.864253393665\n", + "\tmcc\n", + "\t\t 0.501323918988\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Regularization: 10\n", + "confusion matrix\n", + "[[ 96 57]\n", + " [ 30 423]]\n", + "\taccuracy\n", + "\t\t 0.856435643564\n", + "\tf1\n", + "\t\t 0.906752411576\n", + "\trecall\n", + "\t\t 0.933774834437\n", + "\tprecision\n", + "\t\t 0.88125\n", + "\tmcc\n", + "\t\t 0.600795352272\n", + "confusion matrix\n", + "[[106 43]\n", + " [ 27 430]]\n", + "\taccuracy\n", + "\t\t 0.884488448845\n", + "\tf1\n", + "\t\t 0.924731182796\n", + "\trecall\n", + "\t\t 0.940919037199\n", + "\tprecision\n", + "\t\t 0.909090909091\n", + "\tmcc\n", + "\t\t 0.678673906732\n", + "confusion matrix\n", + "[[ 93 42]\n", + " [ 28 442]]\n", + "\taccuracy\n", + "\t\t 0.884297520661\n", + "\tf1\n", + "\t\t 0.926624737945\n", + "\trecall\n", + "\t\t 0.940425531915\n", + "\tprecision\n", + "\t\t 0.913223140496\n", + "\tmcc\n", + "\t\t 0.655040467593\n", + "confusion matrix\n", + "[[ 96 40]\n", + " [ 26 443]]\n", + "\taccuracy\n", + "\t\t 0.890909090909\n", + "\tf1\n", + "\t\t 0.930672268908\n", + "\trecall\n", + "\t\t 0.944562899787\n", + "\tprecision\n", + "\t\t 0.91718426501\n", + "\tmcc\n", + "\t\t 0.676726437317\n", + "confusion matrix\n", + "[[ 86 52]\n", + " [ 37 430]]\n", + "\taccuracy\n", + "\t\t 0.852892561983\n", + "\tf1\n", + "\t\t 0.906217070601\n", + "\trecall\n", + "\t\t 0.920770877944\n", + "\tprecision\n", + "\t\t 0.892116182573\n", + "\tmcc\n", + "\t\t 0.567137418307\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Regularization: 100\n", + "confusion matrix\n", + "[[ 96 50]\n", + " [ 16 444]]\n", + "\taccuracy\n", + "\t\t 0.891089108911\n", + "\tf1\n", + "\t\t 0.930817610063\n", + "\trecall\n", + "\t\t 0.965217391304\n", + "\tprecision\n", + "\t\t 0.898785425101\n", + "\tmcc\n", + "\t\t 0.686116299097\n", + "confusion matrix\n", + "[[108 38]\n", + " [ 22 438]]\n", + "\taccuracy\n", + "\t\t 0.90099009901\n", + "\tf1\n", + "\t\t 0.935897435897\n", + "\trecall\n", + "\t\t 0.952173913043\n", + "\tprecision\n", + "\t\t 0.920168067227\n", + "\tmcc\n", + "\t\t 0.720814450298\n", + "confusion matrix\n", + "[[ 92 31]\n", + " [ 12 470]]\n", + "\taccuracy\n", + "\t\t 0.928925619835\n", + "\tf1\n", + "\t\t 0.956256358087\n", + "\trecall\n", + "\t\t 0.97510373444\n", + "\tprecision\n", + "\t\t 0.938123752495\n", + "\tmcc\n", + "\t\t 0.771296951096\n", + "confusion matrix\n", + "[[ 92 37]\n", + " [ 21 455]]\n", + "\taccuracy\n", + "\t\t 0.904132231405\n", + "\tf1\n", + "\t\t 0.940082644628\n", + "\trecall\n", + "\t\t 0.955882352941\n", + "\tprecision\n", + "\t\t 0.924796747967\n", + "\tmcc\n", + "\t\t 0.703140388976\n", + "confusion matrix\n", + "[[128 39]\n", + " [ 23 415]]\n", + "\taccuracy\n", + "\t\t 0.897520661157\n", + "\tf1\n", + "\t\t 0.930493273543\n", + "\trecall\n", + "\t\t 0.947488584475\n", + "\tprecision\n", + "\t\t 0.9140969163\n", + "\tmcc\n", + "\t\t 0.737479794104\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Regularization: 1000\n", + "confusion matrix\n", + "[[108 28]\n", + " [ 11 459]]\n", + "\taccuracy\n", + "\t\t 0.935643564356\n", + "\tf1\n", + "\t\t 0.959247648903\n", + "\trecall\n", + "\t\t 0.976595744681\n", + "\tprecision\n", + "\t\t 0.94250513347\n", + "\tmcc\n", + "\t\t 0.809418874123\n", + "confusion matrix\n", + "[[107 37]\n", + " [ 13 449]]\n", + "\taccuracy\n", + "\t\t 0.917491749175\n", + "\tf1\n", + "\t\t 0.947257383966\n", + "\trecall\n", + "\t\t 0.971861471861\n", + "\tprecision\n", + "\t\t 0.923868312757\n", + "\tmcc\n", + "\t\t 0.763570457289\n", + "confusion matrix\n", + "[[ 90 32]\n", + " [ 15 468]]\n", + "\taccuracy\n", + "\t\t 0.922314049587\n", + "\tf1\n", + "\t\t 0.952187182096\n", + "\trecall\n", + "\t\t 0.968944099379\n", + "\tprecision\n", + "\t\t 0.936\n", + "\tmcc\n", + "\t\t 0.748647861593\n", + "confusion matrix\n", + "[[115 40]\n", + " [ 12 438]]\n", + "\taccuracy\n", + "\t\t 0.914049586777\n", + "\tf1\n", + "\t\t 0.943965517241\n", + "\trecall\n", + "\t\t 0.973333333333\n", + "\tprecision\n", + "\t\t 0.916317991632\n", + "\tmcc\n", + "\t\t 0.766700222309\n", + "confusion matrix\n", + "[[115 39]\n", + " [ 15 436]]\n", + "\taccuracy\n", + "\t\t 0.910743801653\n", + "\tf1\n", + "\t\t 0.941684665227\n", + "\trecall\n", + "\t\t 0.966740576497\n", + "\tprecision\n", + "\t\t 0.917894736842\n", + "\tmcc\n", + "\t\t 0.756694135537\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Regularization: 5000\n", + "confusion matrix\n", + "[[108 32]\n", + " [ 13 453]]\n", + "\taccuracy\n", + "\t\t 0.925742574257\n", + "\tf1\n", + "\t\t 0.952681388013\n", + "\trecall\n", + "\t\t 0.972103004292\n", + "\tprecision\n", + "\t\t 0.934020618557\n", + "\tmcc\n", + "\t\t 0.78395807576\n", + "confusion matrix\n", + "[[113 38]\n", + " [ 10 445]]\n", + "\taccuracy\n", + "\t\t 0.920792079208\n", + "\tf1\n", + "\t\t 0.948827292111\n", + "\trecall\n", + "\t\t 0.978021978022\n", + "\tprecision\n", + "\t\t 0.92132505176\n", + "\tmcc\n", + "\t\t 0.781130808044\n", + "confusion matrix\n", + "[[109 44]\n", + " [ 7 445]]\n", + "\taccuracy\n", + "\t\t 0.915702479339\n", + "\tf1\n", + "\t\t 0.945802337938\n", + "\trecall\n", + "\t\t 0.984513274336\n", + "\tprecision\n", + "\t\t 0.910020449898\n", + "\tmcc\n", + "\t\t 0.769523079373\n", + "confusion matrix\n", + "[[ 89 28]\n", + " [ 18 470]]\n", + "\taccuracy\n", + "\t\t 0.923966942149\n", + "\tf1\n", + "\t\t 0.953346855984\n", + "\trecall\n", + "\t\t 0.963114754098\n", + "\tprecision\n", + "\t\t 0.943775100402\n", + "\tmcc\n", + "\t\t 0.749227948054\n", + "confusion matrix\n", + "[[114 36]\n", + " [ 22 433]]\n", + "\taccuracy\n", + "\t\t 0.904132231405\n", + "\tf1\n", + "\t\t 0.937229437229\n", + "\trecall\n", + "\t\t 0.951648351648\n", + "\tprecision\n", + "\t\t 0.923240938166\n", + "\tmcc\n", + "\t\t 0.736140819086\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Regularization: 10000\n", + "confusion matrix\n", + "[[102 40]\n", + " [ 16 448]]\n", + "\taccuracy\n", + "\t\t 0.907590759076\n", + "\tf1\n", + "\t\t 0.941176470588\n", + "\trecall\n", + "\t\t 0.965517241379\n", + "\tprecision\n", + "\t\t 0.918032786885\n", + "\tmcc\n", + "\t\t 0.731473430915\n", + "confusion matrix\n", + "[[103 35]\n", + " [ 11 457]]\n", + "\taccuracy\n", + "\t\t 0.924092409241\n", + "\tf1\n", + "\t\t 0.952083333333\n", + "\trecall\n", + "\t\t 0.976495726496\n", + "\tprecision\n", + "\t\t 0.928861788618\n", + "\tmcc\n", + "\t\t 0.775691832969\n", + "confusion matrix\n", + "[[ 96 42]\n", + " [ 17 450]]\n", + "\taccuracy\n", + "\t\t 0.902479338843\n", + "\tf1\n", + "\t\t 0.938477580813\n", + "\trecall\n", + "\t\t 0.963597430407\n", + "\tprecision\n", + "\t\t 0.914634146341\n", + "\tmcc\n", + "\t\t 0.709783808677\n", + "confusion matrix\n", + "[[111 38]\n", + " [ 9 447]]\n", + "\taccuracy\n", + "\t\t 0.922314049587\n", + "\tf1\n", + "\t\t 0.950053134963\n", + "\trecall\n", + "\t\t 0.980263157895\n", + "\tprecision\n", + "\t\t 0.921649484536\n", + "\tmcc\n", + "\t\t 0.783591263177\n", + "confusion matrix\n", + "[[ 98 46]\n", + " [ 17 444]]\n", + "\taccuracy\n", + "\t\t 0.895867768595\n", + "\tf1\n", + "\t\t 0.933753943218\n", + "\trecall\n", + "\t\t 0.963123644252\n", + "\tprecision\n", + "\t\t 0.90612244898\n", + "\tmcc\n", + "\t\t 0.698641249515\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Regularization: 100000\n", + "confusion matrix\n", + "[[104 50]\n", + " [ 11 441]]\n", + "\taccuracy\n", + "\t\t 0.899339933993\n", + "\tf1\n", + "\t\t 0.935312831389\n", + "\trecall\n", + "\t\t 0.975663716814\n", + "\tprecision\n", + "\t\t 0.89816700611\n", + "\tmcc\n", + "\t\t 0.722791699094\n", + "confusion matrix\n", + "[[ 90 43]\n", + " [ 16 457]]\n", + "\taccuracy\n", + "\t\t 0.902640264026\n", + "\tf1\n", + "\t\t 0.939362795478\n", + "\trecall\n", + "\t\t 0.966173361522\n", + "\tprecision\n", + "\t\t 0.914\n", + "\tmcc\n", + "\t\t 0.700387359184\n", + "confusion matrix\n", + "[[ 94 49]\n", + " [ 16 446]]\n", + "\taccuracy\n", + "\t\t 0.892561983471\n", + "\tf1\n", + "\t\t 0.932079414838\n", + "\trecall\n", + "\t\t 0.965367965368\n", + "\tprecision\n", + "\t\t 0.90101010101\n", + "\tmcc\n", + "\t\t 0.685924537025\n", + "confusion matrix\n", + "[[ 90 41]\n", + " [ 28 446]]\n", + "\taccuracy\n", + "\t\t 0.885950413223\n", + "\tf1\n", + "\t\t 0.928199791883\n", + "\trecall\n", + "\t\t 0.940928270042\n", + "\tprecision\n", + "\t\t 0.915811088296\n", + "\tmcc\n", + "\t\t 0.6527474876\n", + "confusion matrix\n", + "[[ 97 53]\n", + " [ 13 442]]\n", + "\taccuracy\n", + "\t\t 0.890909090909\n", + "\tf1\n", + "\t\t 0.930526315789\n", + "\trecall\n", + "\t\t 0.971428571429\n", + "\tprecision\n", + "\t\t 0.892929292929\n", + "\tmcc\n", + "\t\t 0.692002691373\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "accuracy = {reg: [] for reg in regularizations}\n", + "precision = {reg: [] for reg in regularizations}\n", + "recall = {reg: [] for reg in regularizations}\n", + "f1 = {reg: [] for reg in regularizations}\n", + "mcc = {reg: [] for reg in regularizations}\n", + "for reg in regularizations:\n", + " print(\"Regularization: %s\" % reg)\n", + " predicted = pickle.load(open(model_folder + \"predicted_fold_4_reg_%s.pkl\" % reg, 'rb'))\n", + " actuals = pickle.load(open(model_folder + \"actuals_fold_4_reg_%s.pkl\" % reg, 'rb'))\n", + " for pred, actual in zip(predicted, actuals):\n", + " print(\"confusion matrix\")\n", + " print(confusion_matrix(actual, pred))\n", + " print(\"\\taccuracy\")\n", + " acc = accuracy_score(actual, pred)\n", + " accuracy[reg].append(acc)\n", + " print(\"\\t\\t\", acc)\n", + " print(\"\\tf1\")\n", + " f = f1_score(actual, pred)\n", + " f1[reg].append(f)\n", + " print(\"\\t\\t\", f)\n", + " print(\"\\trecall\")\n", + " r = recall_score(actual, pred)\n", + " recall[reg].append(r)\n", + " print(\"\\t\\t\", r)\n", + " print(\"\\tprecision\")\n", + " p = precision_score(actual, pred)\n", + " precision[reg].append(p)\n", + " print(\"\\t\\t\", p)\n", + " print(\"\\tmcc\")\n", + " m = matthews_corrcoef(actual, pred)\n", + " mcc[reg].append(m)\n", + " print(\"\\t\\t\", m)\n", + "\n", + "\n", + " print(\"\\n\\n\\n\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 0.890083203255\n", + "10 0.902572899434\n", + "100 0.919194181818\n", + "1000 0.92731723494\n", + "5000 0.926476431756\n", + "10000 0.917860131072\n", + "100000 0.904383497669\n" + ] + } + ], + "source": [ + "for reg in regularizations:\n", + " print(reg, \" \", np.mean(precision[reg]))" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.6527474876\n", + "0.690770754855\n", + "0.722791699094\n" + ] + } + ], + "source": [ + "reg = 100000\n", + "print(np.min(mcc[reg]))\n", + "print(np.mean(mcc[reg]))\n", + "print(np.max(mcc[reg]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.852892561983\n", + "0.873804653193\n", + "0.890909090909\n" + ] + } + ], + "source": [ + "reg = 10\n", + "print(np.min(accuracy[reg]))\n", + "print(np.mean(accuracy[reg]))\n", + "print(np.max(accuracy[reg]))" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 0.822918473666\n", + "10 0.873804653193\n", + "100 0.904531544063\n", + "1000 0.92004855031\n", + "5000 0.918067261272\n", + "10000 0.910468865068\n", + "100000 0.894280337125\n" + ] + } + ], + "source": [ + "for reg in regularizations:\n", + " print(reg, \" \", np.mean(accuracy[reg]))" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 0.876306522075\n", + "10 0.936090636256\n", + "100 0.959173195241\n", + "1000 0.97149504515\n", + "5000 0.969880272479\n", + "10000 0.969799440086\n", + "100000 0.963912377035\n" + ] + } + ], + "source": [ + "for reg in regularizations:\n", + " print(reg, \" \", np.mean(recall[reg]))" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 0.883106872195\n", + "10 0.918999534365\n", + "100 0.938709464444\n", + "1000 0.948868479487\n", + "5000 0.947577462255\n", + "10000 0.943108892583\n", + "100000 0.933096229876\n" + ] + } + ], + "source": [ + "for reg in regularizations:\n", + " print(reg, \" \", np.mean(f1[reg]))" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 0.516261504129\n", + "10 0.635674716444\n", + "100 0.723769576714\n", + "1000 0.76900631017\n", + "5000 0.763996146063\n", + "10000 0.739836317051\n", + "100000 0.690770754855\n" + ] + } + ], + "source": [ + "for reg in regularizations:\n", + " print(reg, \" \", np.mean(mcc[reg]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "predicted = pickle.load(open(model_folder + \"predicted_fold_4_reg_%s.pkl\" % 1000, 'rb'))\n", + "actuals = pickle.load(open(model_folder + \"actuals_fold_4_reg_%s.pkl\" % 1000, 'rb'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[108, 28],\n", + " [ 11, 459]])" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "confusion_matrix(actuals[0], predicted[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0.9356435643564357,\n", + " 0.91749174917491749,\n", + " 0.92231404958677687,\n", + " 0.91404958677685955,\n", + " 0.91074380165289259]" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "accuracy[1000]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "lr_model = pickle.load(open(model_folder + \"model_fold_4_reg_%s.pkl\" % 1000, 'rb'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "lr = lr_model[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "betas = lr.beta_[0][:-1].copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[2342,\n", + " 2343,\n", + " 2344,\n", + " 2345,\n", + " 2346,\n", + " 2347,\n", + " 2348,\n", + " 2349,\n", + " 2350,\n", + " 2351,\n", + " 2352,\n", + " 2353,\n", + " 2354,\n", + " 2355,\n", + " 2356,\n", + " 2357,\n", + " 2358,\n", + " 2359,\n", + " 2360,\n", + " 2361,\n", + " 2362,\n", + " 2363,\n", + " 2364,\n", + " 2365,\n", + " 2366,\n", + " 2367,\n", + " 2368,\n", + " 2369,\n", + " 2370,\n", + " 2371,\n", + " 2372,\n", + " 2373,\n", + " 2374,\n", + " 2375,\n", + " 2376,\n", + " 2377,\n", + " 2378,\n", + " 2379,\n", + " 2380,\n", + " 2381,\n", + " 2382,\n", + " 2383,\n", + " 2384,\n", + " 2385,\n", + " 2386,\n", + " 2387,\n", + " 2388,\n", + " 2389,\n", + " 2390,\n", + " 2391,\n", + " 2392,\n", + " 2393,\n", + " 2394,\n", + " 2395,\n", + " 2396,\n", + " 2397,\n", + " 2398,\n", + " 2399,\n", + " 2400,\n", + " 2401,\n", + " 2402,\n", + " 2403,\n", + " 2404,\n", + " 2405,\n", + " 2406,\n", + " 2407,\n", + " 2408,\n", + " 2409,\n", + " 2410,\n", + " 2411,\n", + " 2412,\n", + " 2413,\n", + " 2414,\n", + " 2415,\n", + " 2416,\n", + " 2417,\n", + " 2418,\n", + " 2419,\n", + " 2420,\n", + " 2421,\n", + " 2422,\n", + " 2423,\n", + " 2424,\n", + " 2425,\n", + " 2426,\n", + " 2427,\n", + " 2428,\n", + " 2429,\n", + " 2430,\n", + " 2431,\n", + " 2432,\n", + " 2433,\n", + " 2434,\n", + " 2435,\n", + " 2436,\n", + " 2437,\n", + " 2438,\n", + " 2439,\n", + " 2440,\n", + " 2441,\n", + " 2442,\n", + " 2443,\n", + " 2444,\n", + " 2445,\n", + " 2446,\n", + " 2447,\n", + " 2448,\n", + " 2449,\n", + " 2450,\n", + " 2451,\n", + " 2452,\n", + " 2453,\n", + " 2454,\n", + " 2455,\n", + " 2456,\n", + " 2457,\n", + " 2458,\n", + " 2459,\n", + " 2460,\n", + " 2461,\n", + " 2462,\n", + " 2463,\n", + " 2464,\n", + " 2465,\n", + " 2466,\n", + " 2467,\n", + " 2468,\n", + " 2469,\n", + " 2470,\n", + " 2471,\n", + " 2472,\n", + " 2473,\n", + " 2474,\n", + " 2475,\n", + " 2476,\n", + " 2477,\n", + " 2478,\n", + " 2479,\n", + " 2480,\n", + " 2481,\n", + " 2482,\n", + " 2483,\n", + " 2484,\n", + " 2485,\n", + " 2486,\n", + " 2487,\n", + " 2488,\n", + " 2489,\n", + " 2490,\n", + " 2491,\n", + " 2492,\n", + " 2493,\n", + " 2494,\n", + " 2495,\n", + " 2496,\n", + " 2497,\n", + " 2498,\n", + " 2499,\n", + " 2500,\n", + " 2501,\n", + " 2502,\n", + " 2503,\n", + " 2504,\n", + " 2505,\n", + " 2506,\n", + " 2507,\n", + " 2508,\n", + " 2509,\n", + " 2510,\n", + " 2511,\n", + " 2512,\n", + " 2513,\n", + " 2514,\n", + " 2515,\n", + " 2516,\n", + " 2517,\n", + " 2518,\n", + " 2519,\n", + " 2520,\n", + " 2521,\n", + " 2522,\n", + " 2523,\n", + " 2524,\n", + " 2525,\n", + " 2526,\n", + " 2527,\n", + " 2528,\n", + " 2529,\n", + " 2530,\n", + " 2531,\n", + " 2532,\n", + " 2533,\n", + " 2534,\n", + " 2535,\n", + " 2536,\n", + " 2537,\n", + " 2538,\n", + " 2539,\n", + " 2540,\n", + " 2541,\n", + " 2542,\n", + " 2543,\n", + " 2544,\n", + " 2545,\n", + " 2546,\n", + " 2547,\n", + " 2548,\n", + " 2549,\n", + " 2550,\n", + " 2551,\n", + " 2552,\n", + " 2553,\n", + " 2554,\n", + " 2555,\n", + " 2556,\n", + " 2557,\n", + " 2558,\n", + " 2559,\n", + " 2560,\n", + " 2561,\n", + " 2562,\n", + " 2563,\n", + " 2564,\n", + " 2565,\n", + " 2566,\n", + " 2567,\n", + " 2568,\n", + " 2569,\n", + " 2570,\n", + " 2571,\n", + " 2572,\n", + " 2573,\n", + " 2574,\n", + " 2575,\n", + " 2576,\n", + " 2577,\n", + " 2578,\n", + " 2579,\n", + " 2580,\n", + " 2581,\n", + " 2582,\n", + " 2583,\n", + " 2584,\n", + " 2585,\n", + " 2586,\n", + " 2587,\n", + " 2588,\n", + " 2589,\n", + " 2590,\n", + " 2591,\n", + " 2592,\n", + " 2593,\n", + " 2594,\n", + " 2595,\n", + " 2596,\n", + " 2597,\n", + " 2598,\n", + " 2599,\n", + " 2600,\n", + " 2601,\n", + " 2602,\n", + " 2603,\n", + " 2604,\n", + " 2605,\n", + " 2606,\n", + " 2607,\n", + " 2608,\n", + " 2609,\n", + " 2610,\n", + " 2611,\n", + " 2612,\n", + " 2613,\n", + " 2614,\n", + " 2615,\n", + " 2616,\n", + " 2617,\n", + " 2618,\n", + " 2619,\n", + " 2620,\n", + " 2621,\n", + " 2622,\n", + " 2623,\n", + " 2624,\n", + " 2625,\n", + " 2626,\n", + " 2627,\n", + " 2628,\n", + " 2629,\n", + " 2630,\n", + " 2631,\n", + " 2632,\n", + " 2633,\n", + " 2634,\n", + " 2635,\n", + " 2636,\n", + " 2637,\n", + " 2638,\n", + " 2639,\n", + " 2640,\n", + " 2641,\n", + " 2642,\n", + " 2643,\n", + " 2644,\n", + " 2645,\n", + " 2646,\n", + " 2647,\n", + " 2648,\n", + " 2649,\n", + " 2650,\n", + " 2651,\n", + " 2652,\n", + " 2653,\n", + " 2654,\n", + " 2655,\n", + " 2656,\n", + " 2657,\n", + " 2658,\n", + " 2659,\n", + " 2660,\n", + " 2661,\n", + " 2662,\n", + " 2663,\n", + " 2664,\n", + " 2665,\n", + " 2666,\n", + " 2667,\n", + " 2668,\n", + " 2669,\n", + " 2670,\n", + " 2671,\n", + " 2672,\n", + " 2673,\n", + " 2674,\n", + " 2675,\n", + " 2676,\n", + " 2677,\n", + " 2678,\n", + " 2679,\n", + " 2680,\n", + " 2681,\n", + " 2682,\n", + " 2683,\n", + " 2684,\n", + " 2685,\n", + " 2686,\n", + " 2687,\n", + " 2688,\n", + " 2689,\n", + " 2690,\n", + " 2691,\n", + " 2692,\n", + " 2693,\n", + " 2694,\n", + " 2695,\n", + " 2696,\n", + " 2697,\n", + " 2698,\n", + " 2699,\n", + " 2700,\n", + " 2701,\n", + " 2702,\n", + " 2703,\n", + " 2704,\n", + " 2705,\n", + " 2706,\n", + " 2707,\n", + " 2708,\n", + " 2709,\n", + " 2710,\n", + " 2711,\n", + " 2712,\n", + " 2713,\n", + " 2714,\n", + " 2715,\n", + " 2716,\n", + " 2717,\n", + " 2718,\n", + " 2719,\n", + " 2720,\n", + " 2721,\n", + " 2722,\n", + " 2723,\n", + " 2724,\n", + " 2725,\n", + " 2726,\n", + " 2727,\n", + " 2728,\n", + " 2729,\n", + " 2730,\n", + " 2731,\n", + " 2732,\n", + " 2733,\n", + " 2734,\n", + " 2735,\n", + " 2736,\n", + " 2737,\n", + " 2738,\n", + " 2739,\n", + " 2740,\n", + " 2741,\n", + " 2742,\n", + " 2743,\n", + " 2744,\n", + " 2745,\n", + " 2746,\n", + " 2747,\n", + " 2748,\n", + " 2749,\n", + " 2750,\n", + " 2751,\n", + " 2752,\n", + " 2753,\n", + " 2754,\n", + " 2755,\n", + " 2756,\n", + " 2757,\n", + " 2758,\n", + " 2759,\n", + " 2760,\n", + " 2761,\n", + " 2762,\n", + " 2763,\n", + " 2764,\n", + " 2765,\n", + " 2766,\n", + " 2767,\n", + " 2768,\n", + " 2769,\n", + " 2770,\n", + " 2771,\n", + " 2772,\n", + " 2773,\n", + " 2774,\n", + " 2775,\n", + " 2776,\n", + " 2777,\n", + " 2778,\n", + " 2779,\n", + " 2780,\n", + " 2781,\n", + " 2782,\n", + " 2783,\n", + " 2784,\n", + " 2785,\n", + " 2786,\n", + " 2787,\n", + " 2788,\n", + " 2789,\n", + " 2790,\n", + " 2791,\n", + " 2792,\n", + " 2793,\n", + " 2794,\n", + " 2795,\n", + " 2796,\n", + " 2797,\n", + " 2798,\n", + " 2799,\n", + " 2800,\n", + " 2801,\n", + " 2802,\n", + " 2803,\n", + " 2804,\n", + " 2805,\n", + " 2806,\n", + " 2807,\n", + " 2808,\n", + " 2809,\n", + " 2810,\n", + " 2811,\n", + " 2812,\n", + " 2813,\n", + " 2814,\n", + " 2815,\n", + " 2816,\n", + " 2817,\n", + " 2818,\n", + " 2819,\n", + " 2820,\n", + " 2821,\n", + " 2822,\n", + " 2823,\n", + " 2824,\n", + " 2825,\n", + " 2826,\n", + " 2827,\n", + " 2828,\n", + " 2829,\n", + " 2830,\n", + " 2831,\n", + " 2832,\n", + " 2833,\n", + " 2834,\n", + " 2835,\n", + " 2836,\n", + " 2837,\n", + " 2838,\n", + " 2839,\n", + " 2840,\n", + " 2841,\n", + " 2842,\n", + " 2843,\n", + " 2844,\n", + " 2845,\n", + " 2846,\n", + " 2847,\n", + " 2848,\n", + " 2849,\n", + " 2850,\n", + " 2851,\n", + " 2852,\n", + " 2853,\n", + " 2854,\n", + " 2855,\n", + " 2856,\n", + " 2857,\n", + " 2858,\n", + " 2859,\n", + " 2860,\n", + " 2861,\n", + " 2862,\n", + " 2863,\n", + " 2864,\n", + " 2865,\n", + " 2866,\n", + " 2867,\n", + " 2868,\n", + " 2869,\n", + " 2870,\n", + " 2871,\n", + " 2872,\n", + " 2873,\n", + " 2874,\n", + " 2875,\n", + " 2876,\n", + " 2877,\n", + " 2878,\n", + " 2879,\n", + " 2880,\n", + " 2881,\n", + " 2882,\n", + " 2883,\n", + " 2884,\n", + " 2885,\n", + " 2886,\n", + " 2887,\n", + " 2888,\n", + " 2889,\n", + " 2890,\n", + " 2891,\n", + " 2892,\n", + " 2893,\n", + " 2894,\n", + " 2895,\n", + " 2896,\n", + " 2897,\n", + " 2898,\n", + " 2899,\n", + " 2900,\n", + " 2901,\n", + " 2902,\n", + " 2903,\n", + " 2904,\n", + " 2905,\n", + " 2906,\n", + " 2907,\n", + " 2908,\n", + " 2909,\n", + " 2910,\n", + " 2911,\n", + " 2912,\n", + " 2913,\n", + " 2914,\n", + " 2915,\n", + " 2916,\n", + " 2917,\n", + " 2918,\n", + " 2919,\n", + " 2920,\n", + " 2921,\n", + " 2922,\n", + " 2923,\n", + " 2924,\n", + " 2925,\n", + " 2926,\n", + " 2927,\n", + " 2928,\n", + " 2929,\n", + " 2930,\n", + " 2931,\n", + " 2932,\n", + " 2933,\n", + " 2934,\n", + " 2935,\n", + " 2936,\n", + " 2937,\n", + " 2938,\n", + " 2939,\n", + " 2940,\n", + " 2941,\n", + " 2942,\n", + " 2943,\n", + " 2944,\n", + " 2945,\n", + " 2946,\n", + " 2947,\n", + " 2948,\n", + " 2949,\n", + " 2950,\n", + " 2951,\n", + " 2952,\n", + " 2953,\n", + " 2954,\n", + " 2955,\n", + " 2956,\n", + " 2957,\n", + " 2958,\n", + " 2959,\n", + " 2960,\n", + " 2961,\n", + " 2962,\n", + " 2963,\n", + " 2964,\n", + " 2965,\n", + " 2966,\n", + " 2967,\n", + " 2968,\n", + " 2969,\n", + " 2970,\n", + " 2971,\n", + " 2972,\n", + " 2973,\n", + " 2974,\n", + " 2975,\n", + " 2976,\n", + " 2977,\n", + " 2978,\n", + " 2979,\n", + " 2980,\n", + " 2981,\n", + " 2982,\n", + " 2983,\n", + " 2984,\n", + " 2985,\n", + " 2986,\n", + " 2987,\n", + " 2988,\n", + " 2989,\n", + " 2990,\n", + " 2991,\n", + " 2992,\n", + " 2993,\n", + " 2994,\n", + " 2995,\n", + " 2996,\n", + " 2997,\n", + " 2998,\n", + " 2999,\n", + " 3000,\n", + " 3001,\n", + " 3002,\n", + " 3003,\n", + " 3004,\n", + " 3005,\n", + " 3006,\n", + " 3007,\n", + " 3008,\n", + " 3009,\n", + " 3010,\n", + " 3011,\n", + " 3012,\n", + " 3013,\n", + " 3014,\n", + " 3015,\n", + " 3016,\n", + " 3017,\n", + " 3018,\n", + " 3019,\n", + " 3020,\n", + " 3021,\n", + " 3022,\n", + " 3023,\n", + " 3024,\n", + " 3025,\n", + " 3026,\n", + " 3027,\n", + " 3028,\n", + " 3029,\n", + " 3030,\n", + " 3031,\n", + " 3032,\n", + " 3033,\n", + " 3034,\n", + " 3035,\n", + " 3036,\n", + " 3037,\n", + " 3038,\n", + " 3039,\n", + " 3040,\n", + " 3041,\n", + " 3042,\n", + " 3043,\n", + " 3044,\n", + " 3045,\n", + " 3046,\n", + " 3047,\n", + " 3048,\n", + " 3049,\n", + " 3050,\n", + " 3051,\n", + " 3052,\n", + " 3053,\n", + " 3054,\n", + " 3055,\n", + " 3056,\n", + " 3057,\n", + " 3058,\n", + " 3059,\n", + " 3060,\n", + " 3061,\n", + " 3062,\n", + " 3063,\n", + " 3064,\n", + " 3065,\n", + " 3066,\n", + " 3067,\n", + " 3068,\n", + " 3069,\n", + " 3070,\n", + " 3071,\n", + " 3072,\n", + " 3073,\n", + " 3074,\n", + " 3075,\n", + " 3076,\n", + " 3077,\n", + " 3078,\n", + " 3079,\n", + " 3080,\n", + " 3081,\n", + " 3082,\n", + " 3083,\n", + " 3084,\n", + " 3085,\n", + " 3086,\n", + " 3087,\n", + " 3088,\n", + " 3089,\n", + " 3090,\n", + " 3091,\n", + " 3092,\n", + " 3093,\n", + " 3094,\n", + " 3095,\n", + " 3096,\n", + " 3097,\n", + " 3098,\n", + " 3099,\n", + " 3100,\n", + " 3101,\n", + " 3102,\n", + " 3103,\n", + " 3104,\n", + " 3105,\n", + " 3106,\n", + " 3107,\n", + " 3108,\n", + " 3109,\n", + " 3110,\n", + " 3111,\n", + " 3112,\n", + " 3113,\n", + " 3114,\n", + " 3115,\n", + " 3116,\n", + " 3117,\n", + " 3118,\n", + " 3119,\n", + " 3120,\n", + " 3121,\n", + " 3122,\n", + " 3123,\n", + " 3124,\n", + " 3125,\n", + " 3126,\n", + " 3127,\n", + " 3128,\n", + " 3129,\n", + " 3130,\n", + " 3131,\n", + " 3132,\n", + " 3133,\n", + " 3134,\n", + " 3135,\n", + " 3136,\n", + " 3137,\n", + " 3138,\n", + " 3139,\n", + " 3140,\n", + " 3141,\n", + " 3142,\n", + " 3143,\n", + " 3144,\n", + " 3145,\n", + " 3146,\n", + " 3147,\n", + " 3148,\n", + " 3149,\n", + " 3150,\n", + " 3151,\n", + " 3152,\n", + " 3153,\n", + " 3154,\n", + " 3155,\n", + " 3156,\n", + " 3157,\n", + " 3158,\n", + " 3159,\n", + " 3160,\n", + " 3161,\n", + " 3162,\n", + " 3163,\n", + " 3164,\n", + " 3165,\n", + " 3166,\n", + " 3167,\n", + " 3168,\n", + " 3169,\n", + " 3170,\n", + " 3171,\n", + " 3172,\n", + " 3173,\n", + " 3174,\n", + " 3175,\n", + " 3176,\n", + " 3177,\n", + " 3178,\n", + " 3179,\n", + " 3180,\n", + " 3181,\n", + " 3182,\n", + " 3183,\n", + " 3184,\n", + " 3185,\n", + " 3186,\n", + " 3187,\n", + " 3188,\n", + " 3189,\n", + " 3190,\n", + " 3191,\n", + " 3192,\n", + " 3193,\n", + " 3194,\n", + " 3195,\n", + " 3196,\n", + " 3197,\n", + " 3198,\n", + " 3199,\n", + " 3200,\n", + " 3201,\n", + " 3202,\n", + " 3203,\n", + " 3204,\n", + " 3205,\n", + " 3206,\n", + " 3207,\n", + " 3208,\n", + " 3209,\n", + " 3210,\n", + " 3211,\n", + " 3212,\n", + " 3213,\n", + " 3214,\n", + " 3215,\n", + " 3216,\n", + " 3217,\n", + " 3218,\n", + " 3219,\n", + " 3220,\n", + " 3221,\n", + " 3222,\n", + " 3223,\n", + " 3224,\n", + " 3225,\n", + " 3226,\n", + " 3227,\n", + " 3228,\n", + " 3229,\n", + " 3230,\n", + " 3231,\n", + " 3232,\n", + " 3233,\n", + " 3234,\n", + " 3235,\n", + " 3236,\n", + " 3237,\n", + " 3238,\n", + " 3239,\n", + " 3240,\n", + " 3241,\n", + " 3242,\n", + " 3243,\n", + " 3244,\n", + " 3245,\n", + " 3246,\n", + " 3247,\n", + " 3248,\n", + " 3249,\n", + " 3250,\n", + " 3251,\n", + " 3252,\n", + " 3253,\n", + " 3254,\n", + " 3255,\n", + " 3256,\n", + " 3257,\n", + " 3258,\n", + " 3259,\n", + " 3260,\n", + " 3261,\n", + " 3262,\n", + " 3263,\n", + " 3264,\n", + " 3265,\n", + " 3266,\n", + " 3267,\n", + " 3268,\n", + " 3269,\n", + " 3270,\n", + " 3271,\n", + " 3272,\n", + " 3273,\n", + " 3274,\n", + " 3275,\n", + " 3276,\n", + " 3277,\n", + " 3278,\n", + " 3279,\n", + " 3280,\n", + " 3281,\n", + " 3282,\n", + " 3283,\n", + " 3284,\n", + " 3285,\n", + " 3286,\n", + " 3287,\n", + " 3288,\n", + " 3289,\n", + " 3290,\n", + " 3291,\n", + " 3292,\n", + " 3293,\n", + " 3294,\n", + " 3295,\n", + " 3296,\n", + " 3297,\n", + " 3298,\n", + " 3299,\n", + " 3300,\n", + " 3301,\n", + " 3302,\n", + " 3303,\n", + " 3304,\n", + " 3305,\n", + " 3306,\n", + " 3307,\n", + " 3308,\n", + " 3309,\n", + " 3310,\n", + " 3311,\n", + " 3312,\n", + " 3313,\n", + " 3314,\n", + " 3315,\n", + " 3316,\n", + " 3317,\n", + " 3318,\n", + " 3319,\n", + " 3320,\n", + " 3321,\n", + " 3322,\n", + " 3323,\n", + " 3324,\n", + " 3325,\n", + " 3326,\n", + " 3327,\n", + " 3328,\n", + " 3329,\n", + " 3330,\n", + " 3331,\n", + " 3332,\n", + " 3333,\n", + " 3334,\n", + " 3335,\n", + " 3336,\n", + " 3337,\n", + " 3338,\n", + " 3339,\n", + " 3340,\n", + " 3341,\n", + " ...]" + ] + }, + "execution_count": 153, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 157, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 40., 0., 6., ..., 2., 8., 2.], dtype=float32)" + ] + }, + "execution_count": 157, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X[np.where(y == 1),betas.argmax()][0]" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "sorted_b = np.argsort(betas)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "sorted_b[1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 197, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAscAAAI8CAYAAAAdowb0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3X1cjff/B/DX6UZK5aZsRETotJQklBAhczuVVUNmbuZ2\nzPClsDHM3djQMGyYud2sDLkJG2PNbG5HmJSbanEq3Z10c7p+f3CuX6dzqnPSzbG9no+Hx3Y+1+f6\nXJ/rfM45vc/nvK/PJREEQQAREREREcGgpjtARERERKQvGBwTERERET3H4JiIiIiI6DkGx0RERERE\nzzE4JiIiIiJ6jsExEREREdFzDI6JiIiIiJ5jcExERERE9ByDYyIiIiKi5xgcU4X4+PggNDS0prvx\nnyeXyzF37lx07doVUqkUS5curekuERHpZN26dZBKpTXdjTJdu3YNwcHBaN++PRwdHXHz5s2a7pKa\nkJAQDBo0qKa78a/A4JgQEREBqVSK69eva9yu6Q0nkUggkUh0Os7p06cRHh5e4X6Suo0bN+LAgQMY\nNmwYVq5ciTfeeENjvadPn2Lnzp0YM2YMunbtCjc3N/j5+WH37t0oKirS6ljK10m7du3w6NEjte0v\n8sG8a9cuREREVGjfsgiCgMjISAQGBqJz585wc3ND3759MXv2bFy5cqXSj/dfEhoaCqlUCnd3d+Tn\n56ttv3fvHqRSKaRSKbZu3Volfbh06RLCw8ORnZ2tVX1ln5X/nJ2d0bdvX6xdu1bjOdD/O3ToELZv\n317h/Z8+fYrw8HBcuHBBbZtEIoGBgf6GI4WFhZg2bRoyMzMRFhaGFStWoEmTJhrr/v777yqvMalU\nis6dOyMoKAgHDx6s5p5TRRnVdAdIP+ga6B49elTnD7MzZ85g165dmDJlik77UenOnz+Pdu3aYdKk\nSWXWe/DgARYvXowuXbpg9OjRMDc3x9mzZ7Fw4UJcvXpVpxnn/Px8bNq0CfPmzXvR7ot2796N+vXr\nw8/Pr9LaBIBFixZh165d6N27NwYPHgxDQ0PEx8fjzJkzsLW1Rbt27Sr1eP81RkZGePr0KU6dOoXX\nX39dZdvBgwdhYmJSpUHnpUuX8MUXX8Df3x/m5uZa7WNiYoIlS5ZAEARkZWXh5MmTWL9+PR48eICV\nK1dWWV9fdocOHcLff/+Nt99+u0L75+bmipMjHTt2VNk2adIkvPvuuy/cx6py//59JCUlYcmSJQgI\nCNBqn7fffhtt27YFADx58gRRUVGYNWsWsrKyMGzYsKrsLlUCBsdUIcbGxjrvIwhCFfREe7m5uTA1\nNa3RPlS21NRUtGrVqtx61tbWOHToEOzt7cWywMBAhIWFISIiApMmTYKtra1Wx3R0dMR3332H8ePH\no2HDhhXue1VLTU3F7t27ERQUhIULF6psCwsLQ1paWg317N+jVq1acHNzw+HDhzUGxz169MDx48er\n7PgV+UwxNDTEwIEDxcfDhg1DcHAwDh8+jNDQUDRo0KAyu1iuf+PnkiZljZWBgQFq1apVjb3RTWpq\nKgDAwsJC6306dOgAX19f8XFwcDB69+6NQ4cOMTh+Cejv7xik10rmHBcWFiI8PBx9+/aFi4sLOnfu\njGHDhiEmJgbAs58zd+3aBQDiT02Ojo7i/rm5uVi2bBl69OgBZ2dnvP766/j666/VjpuXl4fFixfD\nw8MDbm5umDRpElJSUiCVSlVSNpQ5bHFxcZgxYwY6deqE4cOHAwBu3bqF0NBQ9O7dGy4uLujatSvC\nwsLw5MkTlWMp20hISMDMmTPh7u4OT09PrFmzBgCQnJyMSZMmoUOHDujatavGn4537NiBgQMHwtXV\nFZ06dUJAQAAOHz5c7vOblpaGsLAweHl5wcXFBW+88QYiIyPF7cqf7hITE/Hzzz+Lz2dSUpLG9urX\nr68SGCv16dMHABAXF1dun4BnvzCMHz8eCoUCmzZtKre+QqHAF198gT59+sDZ2Rk+Pj747LPPVGYT\nfXx88Pfff6v8HDly5Ehxe1ZWFpYsWSK+Nnx9fbF58+ZyA6OHDx9CEAS0b99e4/aSQZC2x8nKysKc\nOXPg7u6Ojh07IjQ0FDdv3oRUKlUZo5CQEJXzUJozZw58fHxUygRBwLZt2zBw4EC4uLjAy8sLH374\nITIzM1Xq+fj4YMKECfjzzz/x5ptvwsXFBb1791Y5bvF+fvLJJ/Dx8YGzszO8vb0xe/Zsldd5fn4+\n1q5dC19fXzg7O6NHjx5YuXKlTrO9AwcOxOnTp1VSG65evYr79+9j0KBBGsfpwYMHmDp1Kjp37gxX\nV1cEBQXh9OnTavXKev+Eh4eLM70+Pj7lvgfK4ubmBkEQ8ODBA5VyXcfl3LlzGDJkCFxcXDBgwABE\nR0er1FOmJl24cAELFixAly5d0KNHD3F7SkoKQkND4eXlBWdnZwwcOBD79+/X6XnRpS3le+7IkSPY\nsGEDvL294eLiglGjRuH+/ftivZCQEPz8889ISkoS36O9evUCABQUFGDNmjXw9/eHu7s72rdvj+HD\nh+P8+fPi/omJiejSpQskEgnCw8PFNpSf2SVzjgcNGqRxhloQBHTr1g3Tpk3TeYxKExMTg2HDhqF9\n+/bo2LEjJk2apPJ5GBoaipCQEEgkEkydOlXt80lbxsbGsLS0hKGhoUr5/v378fbbb6NLly5wdnbG\ngAEDsHv3bo1tnD59GiNGjICbmxs6dOiAoUOH4tChQ2r14uLiEBISAldXV3Tv3h1btmzRub//dZw5\nJlFWVhbS09NVygRBQGFhYbn7rlu3Dps2bUJgYCCcnZ2RnZ2Nv/76C9evX4enpyeCg4Px6NEj/Prr\nr/j000/V/mBOmDABFy5cwNChQyGVSnH27FmsWLECjx49wpw5c8R6s2fPxrFjx8Q/QBcuXMD48ePV\n0kKUj6dNmwY7Ozt88MEH4jF//fVXPHz4EAEBAbC2tsadO3ewd+9exMXFYe/evWptTJ8+Hfb29pg5\ncyZ+/vlnbNy4EXXr1sXevXvh6emJWbNm4eDBg1ixYgWcnZ3h7u4OANi3bx+WLFmCfv364e2330Ze\nXh5u3bqFK1euYMCAAaU+l3l5eRgxYgQePHiAESNGoGnTpjh69CjmzJmDrKwshISEoFWrVli5ciU+\n+eQTNG7cGO+88w4A9YCvPI8fPwbwLHjWVtOmTfHGG2/gu+++w7vvvlvm7PHcuXMRGRmJfv36YfTo\n0bh69Sq+/PJL3L17F+vWrRPrLFq0CHXq1MHEiRMhCAKsra0BPMtTHD58OB4/fozg4GA0btwYly5d\nwurVqyGTycq8KNTGxgbAsxSg119/HbVr1y61ri7HmThxIi5duoS33noLLVq0wIkTJzB79mytU5M0\n5evPnz8fkZGRCAgIwMiRI/Hw4UPs2LEDN2/exO7du1X+oN67dw/Tpk3D0KFD4efnh/379yMsLAzO\nzs7iFyC5XI5hw4YhPj4eAQEBeO2115Ceno5Tp07hn3/+Qb169SAIAiZOnIiLFy8iODgYLVu2xK1b\nt7B9+3bcu3dP6+sDfH198dFHH+H48ePw9/cH8Own+JYtW6p8AVZKTU1FcHAw8vLyMHLkSNStWxeR\nkZGYOHEi1q5di969ewMo//3Tp08fxMfHIyoqCnPnzkW9evUA6P4eAJ59kQIAS0tLlXJdxiUhIQEf\nfPABgoOD4efnhx9++AHTpk3DV199BU9PT5V2Fy5ciAYNGmDy5MnIzc0Vn5fAwEAYGhoiJCQE9evX\nx5kzZzB37lzk5OSIAZk2nyvatqW0efNmGBgYYMyYMcjKysKWLVswa9Ys8fNw0qRJWLFiBVJSUhAW\nFgZBEGBmZgYAyM7Oxv79+zFgwAAEBQUhJycH33//PcaOHYvvvvsOUqkUDRo0wMKFC/HRRx/B19dX\n/FLu4OAAQP090a9fP3zxxRdITU2FlZWVWP7HH3/g8ePHKjP/uoxRSb/++iveffdd2Nra4r333sPT\np0+xY8cODBs2DBEREbCxsUFwcDBeffVVbNy4ESNHjoSzs7P4+VSWnJwc8e9pRkYGDh48iDt37uCT\nTz5Rqbdnzx60bt0avXr1gqGhIX766ScsXLgQgiCozDD/8MMPmDt3Llq3bo0JEybAwsICsbGxOHv2\nrMrzkZGRgXHjxqFPnz4YMGAAjh07hlWrVsHBwQHdunUrt9/0nED/eT/88IPg4OBQ5r+BAweq7NOz\nZ09hzpw54uM33nhDGD9+fJnH+fjjjwWpVKpWHh0dLTg4OAhffvmlSvnUqVMFR0dH4f79+4IgCML1\n69cFBwcHYdmyZSr15syZI0ilUmHdunVi2bp16wQHBwdh5syZasfLy8tTKzt8+LAglUqFP/74Q62N\njz76SCxTKBSCt7e34OjoKGzZskUsz8zMFNq1a6fynEyaNEntedPGtm3bBKlUKhw6dEgsKywsFIKC\nggQ3NzchJydHLO/Zs2e5z3tp8vPzhf79+wt9+vQRFApFufV/+OEHQSqVCn/99Zdw//59wcnJSViy\nZIm4fcSIESrnGxsbKzg4OAjz589XaWf58uWCVCoVzp8/L5YNHDhQCAkJUTvmF198IbRv3158DSit\nWrVKcHJyEv75558y+zx79mxBKpUKnTp1EqZMmSJ8/fXXQlxcXIWPo3ytfv3112KdoqIiYfjw4YJU\nKhUiIiJUng9N5zRnzhzBx8dHfHzhwgXBwcFBOHz4sEq9s2fPCg4ODiqvg549ewpSqVT4888/xbLU\n1FTB2dlZWL58uVi2Zs0aQSqVCidOnCj1uYmMjBRee+014eLFiyrle/bsEaRSqXDp0qVS91WeR/v2\n7QVBePZefeedd8Tnw8vLS1i/fr3w8OFDtedryZIlglQqVTluTk6O0KtXL6FXr15imTbvn6+++kqQ\nSqVCYmJimfVK9jktLU1IS0sT7t+/L7YxePBglboVGZfo6GixLCsrS+jatavg5+cnlik/a0eMGCEU\nFRWptBsWFiZ069ZNyMjIUCn/4IMPhI4dO4qfW9o8L9q2df78ecHBwUEYMGCAUFhYKNb75ptvBKlU\nKvz9999i2fjx41Vet0pFRUVCQUGBSllWVpbg5eUlzJ07VyxLS0sTHBwcVD6nldatW6fytyE+Pl5w\ncHAQvv32W5V6CxYsENzc3MT+6zJGmrzxxhuCl5eXkJmZKZbdvHlTcHR0VPksVz5Px44dK7O94nWl\nUqnK39DXXntN7W+cIGj+ezRmzBihT58+4uOsrCzBzc1NCAoK0lhfacSIEYJUKhV+/PFHsSw/P1/w\n8vISpk6dWm7f6f8xrYIAPPvmvmDBAmzdulXtn/LbfVksLCxw584d3Lt3T+djnzlzBkZGRhgxYoRK\n+ejRo1FUVIQzZ86I9SQSCd566y2VeiEhIRp/upVIJAgKClIrL57blp+fj/T0dLi4uEAQBNy4cUOt\njaFDh4qPDQwM0LZtWwiCoHJhhoWFBVq0aCHOQAHPZqFSUlJw7do1bZ4G0ZkzZ2Btba0yu2xoaIiR\nI0dCLpdrvNq7Ij7++GPcvXsX8+fP1/niSltbWwwePBj79u2DTCbTWEc5XqNGjVIpHz16NARBwM8/\n/1zucY4dOwZ3d3eYm5sjPT1d/Ofp6YnCwsJyn4tly5Zh/vz5aNq0KU6cOIEVK1agf//+GDVqFFJS\nUnQ+jvK1GhwcLO4rkUgwYsSICufUHzt2DJaWlvDw8FA5tqOjI8zMzFR+ngaAVq1awc3NTXzcoEED\ntddedHS0yk/fpR23ZcuWsLOzUzlu586dIQiC2nHLMmjQIPz+++9ITU1FTEwMUlNTVWazijtz5gxc\nXFxU0l3MzMwQGBiIxMRE3LlzB0DF3z/lkcvl8PT0hKenJ/r06YMVK1agQ4cO+OKLL1Tq6Tour7zy\nijjrDQDm5uYYMmQIYmNjxZxV4Nnr5c0331T79SA6Oho9e/aEQqFQOZ6XlxcyMzPF1YS0eV7Kaisr\nK0ttZaKAgACVGVZ3d3eNaSaaSCQSGBk9+xFaEARkZGQgPz8fbdu2Vfs81ZadnR0cHR1x5MgRsayo\nqAjHjx+Hj4+P+Bmu6xgV9/jxY9y8eRP+/v4qucQODg7o0qWLxjQfXUyePFn8G/r5559jwIABWL16\nNXbs2KFSr/jfo+zsbKSnp6Njx4548OCBmKp07tw5yOVyvPvuu+XmZpuZmamsGmRsbAwXFxetxpL+\nH9MqSOTs7AwnJye1cktLS7V83JKmTZuGyZMno2/fvmjdujW6deuGN954Q6vAOikpCa+88or4M52S\n8idiZQ5hUlISDAwM0LRpU5V6zZo1K7VtTReZZWRkYN26dThy5IjaH62srCy1+sqf55UsLCxgYmIi\n/oyrZG5ujoyMDPHx2LFjERMTgzfffBPNmzeHl5cXBg4cqBLYaJKUlAQ7Ozu18pYtW0IQBCQmJpa5\nvza2bNmC7777DtOnT1f5qa2oqEjtQrW6detqvABz4sSJ+PHHH7Fp0yaEhYWpbU9MTISBgQGaN2+u\nUm5tbQ1LS0utckPv3buH27dvq/0sDTwbr+LjV5phw4Zh2LBhyMjIwMWLF7Fnzx6cPn0aM2bMwLff\nfqvTcZSv1ZIXULVo0aLcfpTm3r17yMzMRJcuXco8tlLjxo3V6llaWqq89u7fv4++ffuWe9y7d+++\n0HOr1L17d9SpUweHDx9GbGwsnJ2dYWtrq/G1mpSUBFdXV7Vy5fs9MTERrVq1qvD7pzy1a9fGxo0b\nIQgCUlJSsGXLFqSmpqql3eg6Lpo+h5Tv48TERJX0gJLLgKWlpSEzMxP79u1TSe3SdLzynhdd2lJq\n1KiRymNleknx11RZIiIisHXrVty9e1clDU/bi3w16devHz7//HM8evQIr7zyCs6fP4/U1FT0799f\nrKPrGBWn/PzR9Flrb2+Pc+fO4enTp2WmY5WlTZs2Ku+t119/HZmZmVi1ahUGDhwoprL9+eefWLdu\nHa5cuSKm2Cj7n52dDXNzczH/u3Xr1uUet+RYAs8+w2/fvl2h8/ivYnBMlcLd3R3R0dE4efIkzp49\ni/3792P79u1YuHChysxrdTMxMVErmzZtGq5cuYIxY8ZAKpWiTp06KCoqwpgxYzSu+atpVrW0mdbi\ns4f29vY4evQofvrpJ/zyyy84fvy4uJRdTS5n98MPP2DVqlUYNmwYxo8fr7ItOTkZvXr1gkQigSAI\nkEgk+Oabb9SWXgKe/eEbNGgQ9u3bh3HjxpV6PF2XCSyuqKgIXbp0wbhx4zTOzOoSlNatWxc9e/ZE\nz549ERISgj/++APJyclo3LhxpR5HqbTzVigUKo+LiopgbW2tMRcfUM+h1ea1p42ioiK0adMGoaGh\nGvfVFISXplatWuKFgQ8ePMB7772nU180qar3j4GBATw8PMTHXl5e6NevHz788EOsX79eLNd1XHRR\nMuBSfu4MHjwYQ4YM0biPcqKhvOdFl7aUysrLLc+BAwcQGhoKX19fjB07FlZWVjAwMMCXX375QrOV\n/fv3x+rVq3H06FGMHDkSR44cgaWlJbp27SrWqcoxqgqenp44ffo0rl69Cm9vbzx48ADvvPMO7O3t\nERoaikaNGsHY2BinT5/G9u3btV6DvrjK+nz4r2NwTJXG0tISfn5+8PPzQ25uLoYPH47w8HAxOC4t\nWLCxscFvv/0GuVyuMnusvGJYOcvSpEkTFBUV4eHDhyqzNLqkcmRmZuK3337DtGnTMHHixAq1oYva\ntWujX79+6NevHwoLCzFlyhRs3LixzJ/HbGxsNH7Lv3v3LgD1WSddnDhxAvPnz0ffvn3x4Ycfqm1v\n2LCh2qobZd25atKkSTh48CA2b96stk05XgkJCWjZsqVYnpqaiszMTLUZeU2aNWsGuVyuEsxUhrZt\n24oX9zRu3Fjr4yhfqyWX31KOTXF169ZVSXVQKjlj3qxZM/z2229wc3OrtOWsmjVrhr///rvcOrdu\n3aq051a5GoKhoWGZF5za2NggPj5erbzk+x0o//3zIl+8lBo2bIhRo0bhiy++wNWrV+Hi4gJA93Ep\nvrqDkvI8y3vPNmjQAHXq1IFCodA4k19SWc+Lrm29qOPHj6NZs2ZYu3atSnnJx7qOVdOmTeHi4oKo\nqCgMHz4c0dHR6N27t8qvWC/y3lF+/mh6Ld69exf169ev8KxxaZRfjOVyOQDg5MmTKCgowMaNG/Hq\nq6+K9X777TeV/Zo1awZBEHD79u0Xmo0n7THnmCpFybQLU1NTNGvWTGVJKGUwUfJuVt7e3igsLBR/\n4lbatm0bDAwMxJ/9u3btCkEQxCXhlL799lutP3iV36pLfiPftm1bpfyhLa7kc2JkZCSmRpS1Aoi3\ntzdkMhmioqLEMoVCgR07dqBOnToaZ3G1ceHCBXFZu9JudlCrVi0xH1P5r6y1PZWzx3v37lXLPe7e\nvTsEQVC7q9bXX38NiUSisoSVmZmZxpSW119/HZcvX8bZs2fVtmVlZanNwhYnk8k0LlFXUFCAmJgY\nGBgYiF+yyjuO8vWifK0WX2qpqKhI42vQ1tYWd+/eVVkB5ubNm7h48aJKPWWAUzLnFXg27pqel/L4\n+vri5s2bOHHiRKl1+vXrh3/++Qf79u1T25aXl6fyE682PDw88P7772P+/PkqKQQleXt74+rVqyp3\nKJTL5di3bx+aNm0qrtutzftH+Zmi7bJdpRkxYgRq166tsjyhruPy6NEjlaXbsrOzceDAATg6Opb5\nfADPPpd8fX1x/PhxjV9qiqc6lfe86NKWLszMzDTeiVDTrPOVK1dw+fJllTLlWOnyeu7fvz+uXLmC\n/fv3Iz09XSWlAnix907Dhg3h6OiIiIgIlfO6ffs2zp07B29vb637qa2ffvoJwP9POChztYv/PcrK\nysIPP/ygsp+Xlxfq1KmDTZs28U6O1YQzxwTgxX9yGTBgADp16gQnJyfUrVsX165dw7FjxxASEiLW\ncXJygiAIWLRoEbp27QpDQ0P0798fPj4+6Ny5Mz7//HM8fPhQXMrtp59+wqhRo8Rvyk5OTvD19cX2\n7duRnp6Odu3a4cKFC+KsrzbBrbm5OTp27IgtW7agoKAAr776Ks6dO4fExMRK/9lp9OjRaNiwIdzc\n3GBlZYW4uDjs3LkTPXr0UMuvLi4oKAh79+7FnDlzcO3aNXEpt8uXL2Pu3Lll7luapKQkTJw4EQYG\nBujTp4/KhS7As59ZtckP1/QcKXOP4+PjVXLipFIp/Pz8sG/fPmRmZqJjx464evUqIiMj4evri06d\nOol1nZycsGfPHmzYsAHNmzdHgwYN4OHhgbFjx+LUqVOYMGEC/Pz84OTkhNzcXNy6dQvHjx/HqVOn\n1HK/lf755x+8+eab8PDwgKenJ6ytrZGamorDhw/j1q1bGDVqlLivtsfx8fGBm5sbVq1ahYcPH8Le\n3h7R0dHIyclRO35AQAC2bduGMWPGICAgAKmpqdi7dy9at26t8se4Y8eOCAoKwqZNmxAbGwsvLy8Y\nGRkhISEBx44dw7x581RuJqCNMWPG4NixY3j//ffh7+8PJycnPHnyRFwmysHBAW+88QaOHDmCBQsW\n4Pz583Bzc4NCoUBcXByOHj2Kr7/+WuM1CKWRSCSYMGFCufXeffddHD58GGPHjkVISAjq1q2LiIgI\nJCUlicv7Adq9f5SfKZ999hn69+8PY2Nj+Pj46DzjV69ePfj7+2P37t24e/cuWrZsqfO42NnZYd68\nebh27RqsrKzw/fffIy0tDcuXL1c5VmmfMzNnzsTvv/+OwMBAvPnmm2jVqhWePHmC69ev47fffhMv\nLtPmedG2LV04OTnhyJEjWLZsGZydnWFmZoaePXuKN3qZNGkSevTogQcPHmDv3r1o1aqVOEMKPEtx\na9WqFaKiotC8eXPUq1cPrVu3LjOPtl+/fli+fDmWL1+OevXqqc2Ev+h753//+x/GjRuHwMBADB06\nFLm5udi5cycsLS1fOPXtwoULePr0KYBnudsnT57EH3/8gQEDBohpWsr+jh8/XmUZPGtra5XJBnNz\nc4SGhmL+/PkICAjAoEGDYGlpiZs3byIvL0+nO5ySdhgcE4DyA0tN6wgXLxs5ciROnTqFX3/9Ffn5\n+bCxscH06dMxZswYsY6vry9CQkIQFRWFgwcPQhAE9O/fHxKJBBs3bsTatWsRFRWFiIgINGnSBLNn\nz1Zb6WDlypVYuXIlDh06hOjoaHh6emL16tV4/fXXNeYXa7Jq1SosXrwYu3fvhiAI6Nq1KzZv3oxu\n3brptFZteeVvvfUWfvzxR2zbtg1yuRyNGjXC22+/XW4AYWJigh07dmDVqlU4cOAAsrOz0aJFCyxd\nulQth1DTmrmaPHz4UAzgFi1apLZ98uTJWgXHmo7VrFkzDB48GJGRkWrblyxZAltbW0RERODEiRNo\n2LAhJkyYgMmTJ6sdPykpCV999RVycnLQsWNHeHh4oHbt2ti5cyc2btyIo0eP4sCBAzA3N4ednR2m\nTp1a5qx2ixYtMHfuXJw+fRq7d++GTCaDiYkJWrdujcWLF6usNqLtcZSv1U8++QQHDx6ERCJBr169\nMGfOHLWxsbe3x4oVK7B27VosX75cXJv64MGDaqtsLFy4EG3btsXevXvx+eefw9DQEE2aNMGQIUNU\nLkAra7yLl5uZmWHXrl1Yu3YtTpw4gcjISFhZWcHT01O8YEcikWD9+vXYtm0bIiMjceLECdSuXRu2\ntrYYNWqUxguVyjpmWXWK17OyssKePXvw6aefYufOncjLy4ODgwM2btyI7t27i/W0ef84Ozvj/fff\nx549e3D27FkUFRXh5MmTZabslNbnUaNGYe/evdi8ebMYbGg7LgDQvHlzzJ8/H8uXL0dCQgKaNm2K\nzz//XO1isdKOb2Vlhe+++w7r16/HiRMnsHv3bjGAnDVrlk7Pi7ZtldWfkuXDhg3DzZs3ERERge3b\nt8PGxgY9e/aEv78/ZDIZ9u7di3PnzsHe3h4rV67E0aNH1V7nS5YswaJFi7Bs2TIUFBRg8uTJYnCs\nqR+vvvoq2rdvj0uXLuHNN9/UOEutyxiV5OnpiS1btmDdunVYt24djIyM0KlTJ8yYMUMtFUaXXxYl\nEonKL6GOHFD4AAAgAElEQVTGxsawtbVV+5vYokULrFu3Dp9//jlWrlwJa2trDBs2DPXq1cPcuXNV\n2hw6dCisra2xadMmbNiwQfzFoOTNUrQdTyqbRGCWNr3kYmNj4efnh08//bTU5aOIqlJiYiJ69eqF\nZcuWlXoRFP17+fj4oE2bNti4cWNNd4WIKgFzjumlkpeXp1a2fft2GBoaVjgXl4iIiEiJaRX0Utm8\neTOuX7+Ozp07w8jICKdPn8bZs2cRFBSkcrUvERERUUUwOKaXipubG2JiYrBhwwbI5XLY2Njgvffe\n0+pCIKKqxJy+/y5tc/+J6OXAnGMiIiIioueYc0xERERE9ByDYyIiIiKi5xgcExERERE9x+CYiKiS\nRUREQCqVavy3evXqUvebPHkyZsyYIT7u1KkTIiMj1ep98skn8Pf3R+fOneHq6or+/fsjPDxc5Y5k\npXn06BHCw8Nx8+bNip1cKX7//Xe1c+3cuTOCgoJw8ODBMvfNysqCp6cnpFIpjh8/Xqn9IiLSFVer\nICKqAhKJBNOmTVO701ZZt8u9du0axo0bBwC4c+cOsrKy0K5dO7V6169fh7u7OwICAlCrVi3ExsZi\n06ZNiImJwc6dO8vslzI4btq0KaRSaQXOrGxvv/022rZtCwB48uQJoqKiMGvWLGRlZWHYsGEa91mz\nZg3y8vK44gMR6QUGx0REVaRbt25wcnLSqm5KSgoePXoEV1dXAMDly5dhYWGBFi1aqNXVFADb2tpi\nxYoVuHr1KlxcXEo9TlUvUNShQwf4+vqKj4ODg9G7d28cOnRIY3B8+/Zt7NmzB5MnT8batWurtG9E\nRNpgWgURUQ3Jz89Heno60tPTERMTA2NjYzRq1AhpaWn4448/4ODgIG4vL6i1sbGBIAjIzMwstc7v\nv/+ON998ExKJBHPmzIFUKoWjo6NK6saRI0fg7++Pdu3awcPDA7NmzUJKSkqFz9HY2BiWlpYwNDTU\nuH3JkiXw9fVFhw4dqjxwJyLSBmeOiYiqSFZWFtLT01XK6tevL/7/4cOHERoaKj6WSCTo1q2bymNP\nT09IJBKcPHkSNjY24jaFQoHMzEwUFBTg9u3bWLNmDSwsLMqcNba3t8fUqVOxdu1aBAUFwd3dHQDQ\nvn17AMAPP/yAsLAwtGvXDjNmzEBqaiq2b9+OS5cuITIyEubm5uWec05OjnjOGRkZOHjwIO7cuYNP\nPvlEre6RI0dw5coVHDlyBA8ePCi3bSKi6sDgmIioCgiCgFGjRqmUSSQSxMbGio+7deuGrVu3AgDm\nzp2Lzp07Y/DgwUhPT8cHH3yAefPmoWXLlgAAa2trlbb++usvBAUFiY9btmyJDRs2wNLSstQ+WVlZ\noXv37li7di3at2+PQYMGidsKCwuxatUqODg4YMeOHahVqxaAZ3elHD9+PLZt24YpU6aUe95hYWEq\nM8CGhoaYPn06/Pz8VOrl5eVh5cqVGDVqFBo3bszgmIj0BoNjIqIqIJFI8NFHH6F58+al1rG2toa1\ntTWysrLwzz//YPDgwfD09MSxY8dQu3ZtBAYGwtjYWOO+9vb22Lp1K3Jzc3Hp0iX8+uuvyM7OrnB/\n//rrL6SmpmLq1KliYAwA3t7eaNmyJX7++WetguPJkyejQ4cOAJ7NHJ86dQqrV6+GqakpQkJCxHpf\nfvklCgsLMX78+Ar3mYioKjA4JiKqIs7OzqVekFdYWIisrCwAwC+//AIDAwO0aNECaWlpOHv2LBwd\nHcVg18LCAkZGqh/X5ubm8PT0BAD4+PjAwcEBkyZNQkREBBwcHHTua1JSEiQSCezs7NS2tWzZEhcv\nXtSqnTZt2oj9AoDXX38dmZmZWLVqFQYOHIj69evj4cOH+Prrr7FgwQKYmprq3FcioqrE4JiIqAZc\nvHgRI0eOFB9LJBL06NFD5bEy3/ibb75Bx44dy2zP19cX//vf/xAVFVWh4LgqeXp64vTp07h69Sq8\nvb2xdu1avPrqq3B3d0diYiIA4PHjxwCAtLQ0JCYmwsbGhku7EVGNYHBMRFQDpFKpmG+8YMECuLq6\nws/PD5mZmZg6dapKvrE26xHn5+ejqKhInI0uTWkBp3K1i/j4eHTu3FllW3x8vMrFgLpSKBQAIN6k\nJDk5Gffv30fv3r3V+rZgwQJIJBJcuHBBqwsAiYgqG4NjIqIaYGlpCU9PT+Tn5yMpKQmzZ8+Gh4cH\nfvnlFxgZGSEgIAC1a9dW2y8rKwumpqZqaRb79u2DRCKBs7NzmcdVpjGUXPKtbdu2sLKywp49exAQ\nECDmOp8+fRpxcXFa5RuX5qeffgLw/0H+9OnT1Vbx+Pvvv7FmzRqMGzcOrq6uTLcgohrD4JiIqApo\nu2bv1atXUVhYKN784+LFi2jTpo3GwBgAzp8/jyVLlqBv375o3rw5CgoK8McffyA6OhrOzs4qK1Bo\n0qxZM1haWmLPnj0wMzODmZkZXFxc0LRpU8ycORNhYWEYMWIEBgwYAJlMhh07dsDW1lZt5Y3SXLhw\nAU+fPgXw7IK8kydP4o8//sCAAQPEG5q4ubmp7WdhYQFBEODs7IxevXppdSwioqrA4JiIqApomy97\n6dIlNGvWDA0aNAAAXLlyRWPwqOTg4AAPDw+cOnUKjx8/hiAIsLW1xZQpUzBmzBi1GeWSjIyMsHz5\ncqxevRoLFiyAQqHA0qVL0bRpU/j5+cHU1BSbNm3CqlWrYGpqCl9fX8yYMUOrFAeJRIJvv/1WfGxs\nbAxbW1tMnz4dY8aM0Wp/IqKaJhF4SyIiIiIiIgB6dvvonTt3wsfHBy4uLggMDMTVq1dLrfvnn3/i\nrbfeQufOndGuXTv069cP27ZtU6t35MgR9OvXDy4uLhg8eDBOnz5dhWdARERERC8zvQmOo6KisGzZ\nMkydOhURERGQSqUYO3Ys0tLSNNY3MzNDSEgIdu3ahSNHjmDSpElYs2YNvvvuO7HOxYsXMXPmTAQG\nBiIyMhK9evXC5MmTcefOneo6LSIiIiJ6iehNWkVgYCBcXFwwb948AM8uZvH29kZISAjGjRunVRvv\nvfcezMzMsHz5cgDProjOzc3Fxo0bxTpBQUFwdHTEggULKv0ciIiIiOjlphczxwUFBbh+/brKXZUk\nEgm6dOmCy5cva9XGjRs3cOnSJXTq1Eksu3z5Mrp06aJSr2vXrlq3SURERET/LXqxWkV6ejoUCgWs\nra1Vyq2srBAfH1/mvt7e3khLS0NRURGmTJmCgIAAcdvjx481timTybTuW2FhITIyMmBiYgIDA734\nLkFERERExRQVFSEvLw9169Ytd9We8uhFcPwidu3aBblcjsuXL+PTTz9F8+bN0b9//0prPyMjAwkJ\nCZXWHhERERFVDTs7O1hZWb1QG3oRHNevXx+GhoZqM7qpqalqM78lNWnSBADQunVryGQyrFu3TgyO\nGzZsWKE2izMxMQEAWFtb81ameiYvLw/Jyclo3LixOE6kHzg2+o3jo784NvqLY6PfsrOzIZPJKmVs\n9CI4NjY2hpOTE2JiYsQ7IwmCgJiYGISEhGjdjkKhQH5+vvjY1dUVMTExGDlypFh27tw58U5U2lCm\nUpibm7/wNxGqXHK5HMnJyahXrx7MzMxqujtUDMdGv3F89BfHRn9xbPSfTCarlBRYvQiOAWDUqFEI\nDQ1F27Zt4ezsjO3bt+Pp06fw9/cHAKxatQqPHj0SV6LYuXMnbGxs0LJlSwDA77//jq1bt+Ltt98W\n2xw5ciRCQkKwdetWeHt74/Dhw7h+/ToWL15c/SdIRERERHpPb4Lj/v37Iz09HWvXroVMJoOjoyO2\nbNki3lJVJpMhOTlZrC8IAlavXo2HDx/CyMgItra2+N///oegoCCxTvv27bFq1Sp89tln+Oyzz9C8\neXOsX78erVq1qvbzIyIiIiL9pzfBMQAMHz4cw4cP17ht6dKlKo9HjBiBESNGlNtm37590bdv30rp\nHxERERH9u3FtMiIiIiKi5xgcExERERE9x+CYiIiIiOg5BsdERERERM8xOCYiIiIieo7BMRERERHR\ncwyOiYiIiIie06t1jomIiIheFkVFRUhNTa2241lZWVXK7ZErm4+PD0aNGoWRI0fWdFcqBYNjIiIi\nogpITU3FL7/8AktLS63qy2QyXLx4EW5ubrC2ttbpWJmZmejWrRsaNmyo036hoaGIiIgQH9etWxfO\nzs6YNWsWHBwcdGrrv4LBMREREVEFWVpaon79+uXWe/z4MW7dugUfHx+dA9wX1b17dyxbtgyCIODx\n48f4/PPPMXHiRJw6dapa+/Gy0L+5eSIiIqJ/kcePH+P8+fPo3LlztQfGAFCrVi00aNAAVlZWkEql\nGDduHJKTk5Geng4A+PTTT9G3b1+4urqid+/eWLNmDRQKhUobp06dwtChQ+Hi4gIPDw+89957Kttz\nc3MRFhYGNzc39OzZE/v27au286tsDI6JiIiIqkhNB8Yl5eTk4MCBA2jevLk4421ubo4VK1YgKioK\n8+bNw3fffYdt27aJ+/z8889477330KNHD0RGRmLHjh1o166dSrtbt26Fs7MzDhw4gLfeegsLFixA\nQkJCNZ5Z5WFaBREREVEV0JfA+KeffkL79u0BPJvhfeWVV/Dll1+K2ydMmCD+v42NDUaPHo2oqCiM\nGTMGALBx40YMHDgQU6ZMEeu1bt1a5Rg9evTAW2+9BQB49913sX37dpw/fx52dnZVdVpVhsGxlrKz\ns2FkVDNPl6mpKWrVqlUjxyYiIiLd6UtgDAAeHh5YsGABACAjIwO7du3C2LFj8f3336Nx48aIiorC\njh078ODBA+Tk5EChUMDCwkLc/+bNmwgKCirzGG3atFF5bG1tXa0reVQmBsdaio2NhUQiAQDExcUB\nAOzt7bXa90XrW1pawtPTU6f+EhERUc3Qp8AYeDbJZmtrCwCwtbXF4sWL0aFDB+zbtw/e3t6YNWsW\npk2bBi8vL1hYWODQoUMqaRUmJiblHqPkBKJEIkFRUVGlnkd1YXCspXr16sHY2BjAsxc9AK2XYXnR\n+gUFBTr1lYiIiGqGvgXGpZFIJHj69CkuXbqEJk2a4N133xW3JSYmqtR1cHBATEwM/Pz8qrubNYLB\nMREREVEl0NfAOD8/HzKZDMCztIpvv/0WT58+hY+PD7KyspCUlISoqCg4Ozvjp59+wokTJ1T2nzJl\nCt555x3Y2tqif//+KCwsxJkzZzBu3LiaOJ0qx+CYiIiIqIIyMzMBqN7gw8jISFwmrbIkJCSorRCh\nrV9++QXdunUDANSpUwctW7bE2rVr0bFjRwDAqFGjsGjRIuTn56NHjx6YPHkywsPDxf07deqENWvW\nYP369di8eTPMzc3h7u4ublemnRanqexlIREEQajpTugzuVyO2NhYFBQUiGkVsbGxAABHR0et2njR\n+gUFBfDw8NCp3/8FyrFxdHSEmZlZTXeHiuHY6DeOj/7i2OgvTWPD20frj9TUVCQkJFTKe4czx0RE\nREQVYGBgoFfpE1Q5GBxrKSEhAYWFhQD+f2ZXWy9av1GjRjrtT0REREQVw7l5IiIiIqLnOHOsJTs7\nOzHnWEnbHOIXrc+l3IiIiIiqB2eOiYiIiIieY3BMRERERPQcg2MiIiIioucYHBMRERERPcfgmIiI\niIjoOa5WQURERFQBvEPevxODYyIiIqIKSE1NxbZt29C+fXut6t++fRsA0KZNG53rZ2Zmolu3bjrf\nkW/OnDmIjIxEcHAwFixYoLJt4cKF2L17N/z8/LB06VKd2q1M4eHhOHHiBCIjI2usD8UxOCYiIiKq\noDp16qB+/fpa1bW0tASAKquviUQigY2NDaKiohAWFoZatWoBAPLz83H48GHY2NhUuO3KoFAoADzr\np77g3DwRERHRv5ijoyMaNWqE48ePi2XHjx+HjY0NXnvtNbEsPz8fixcvRpcuXeDi4oJhw4bh2rVr\n4vbQ0FBIpVJIpVI4OjqK/3/hwgUAwIEDBxAQEAA3Nzd07doVM2bMQFpamrj/77//DqlUijNnzsDf\n3x/Ozs748ccfER4ejps3b4rt1vQMMmeOtZSQkIDCwkIAQGxsrE77vmj9Ro0a6bQ/ERERVY/bt2+L\nM7zleZF4IDMzE+3atdNpfyWJRIKAgADs378fAwcOBADs378f/v7+OH/+vFhvxYoViI6OxooVK9C4\ncWNs2bIFY8eORXR0NCwtLTF37lzMnDlTrP/ll18iKioKLVu2BPBsFvj9999HixYtkJaWhqVLlyI0\nNBRffvmlSn9Wr16N2bNno2nTpjAxMcE777yDs2fPYvv27RAEARYWFhU6z8rCmWMiIiKif7lBgwbh\nzz//RHJyMhITE3Hp0iUMHjxY3J6bm4s9e/Zg9uzZ6Nq1K+zt7bFo0SKYmJjg+++/BwCYm5vDysoK\nVlZW+PPPP7Fv3z6Eh4fDysoKAODv749u3bqhadOmcHFxQVhYGM6cOYPc3FyVvkybNg2enp6wtbXF\nK6+8gjp16sDIyAgNGjSAlZWVmPpRUzhzrCU7OzsYGxurlDk6OurURkXrFxQU6LQfERERVY82bdpU\nSzyQnp6u0z4lNWjQAD169MD+/fsBAN7e3qhXr564/f79+1AoFCoXFxoZGcHFxQVxcXEqbd24cQOz\nZ8/Ghx9+CFdXV7H8r7/+Qnh4OG7duoWMjAwIggAASEpKgr29PYBns9hOTk4vdC5VjTPHRERERP8B\nAQEBiIiIQGRkJIYOHaq2XRnMluXx48eYNGkSAgMD4e/vL5bn5uZi7NixsLS0xKeffor9+/cjPDwc\ngPokn5mZ2QueSdVicExERET0H9CtWzcUFBRAoVCga9euKtuaNWsGY2NjXLx4USwrLCzEtWvX0KpV\nKwDPLtibPHky7O3tMWfOHJX97969i4yMDMyYMQMdOnRAixYtIJPJtOqXsbGxuGqFPmBaBREREdF/\ngIGBAY4cOQJAfek0U1NTvPXWW1ixYgUsLS3FC/KePn0qzjLPnz8f//zzD5YtW6Zy85O6deuicePG\nMDY2xjfffIPg4GDcvn0bGzZsUOuDptnpJk2a4OHDh7h58yZeffVV1KlTp0bzjhkcExEREVVQTk6O\n1vnAmZmZAFCh+sr/f1F16tQpddvMmTMhCAJmz56NnJwctG3bFl999ZW4esSFCxfw+PFjDBgwAMCz\nQFcikeCbb75Bx44dsWzZMqxevRrffvstXnvtNcyZMwcTJ05UOYam9Yx9fX0RHR2NkSNHIisrC0uX\nLsWQIUMq5XwrQiJok2DyHyaXyxEbG4uCggLxgjzl0iraJtS/aP2CggJ4eHjo1O//AuXYODo66n3+\n0n8Nx0a/cXz0F8dGf2kaG94+Wn+kpqYiISGhUt47nDkmIiIiqgADAwOdb+dM+o9fP4iIiIiInmNw\nTERERET0HINjIiIiIqLnmHOspYSEBBQWFgJ4sXujV6R+o0aNdNqfiIiIiCqGM8dERERERM9x5lhL\ndnZ24lJuStVxL3VA/baLRERERFQ1OHNMRERERPQcg2MiIiIioucYHBMRERERPcfgmIiIiIjoOQbH\nRERERETPMTgmIiIiInqOwTERERER0XMMjomIiIiInmNwTERERET0HO+Qp6WEhAQUFhYCAGJjY3Xa\n90XrN2rUSKf9iYiIiKhiOHNMRERERPQcZ461ZGpqCoVCgfz8fNSrVw8GBgYwNzfXat8GDRoAQLn1\ni4qKNLavnLEmIiIioqrF4FhL2dnZuH37Nlq0aIGioiIUFRVpHbQq65VVPzs7G/Hx8RrbT0pKevET\nICIiIqJyMa1CSykpKbC3t4elpSUMDAwq9Z9cLse9e/dKbZ+IiIiIqgdnjrXUuHFjmJiYVHq7xWeM\ntU3TICIiIqKqwWlJLZmZmVV6mwyMiYiIiPQLg+MawsCYiIiISP8wOK4BDIyJiIiI9BOD42rGwJiI\niIhIf+lVcLxz5074+PjAxcUFgYGBuHr1aql1o6OjMXr0aHh6eqJDhw4IDg7G2bNnVepERERAKpXC\n0dERUqkUUqkU7dq1q+rTKBUDYyIiIiL9pjerVURFRWHZsmVYtGgRnJ2dsX37dowdOxZHjx4Vb6JR\n3IULF+Dl5YUPPvgAlpaW2L9/PyZMmIDvv/8eUqlUrGdhYYFjx45BEAQAgEQiqbZzKk4ulzMwJiIi\nItJzehMcb9u2DUFBQRgyZAgAYOHChfj555+xf/9+jBs3Tq1+WFiYyuPp06fj5MmTOHXqlEpwLJFI\nNAbXukpMTEROTg4AIC4uTqd9b9y4AZlMBnd3d6SkpCAlJaXM+iXbr4qVMoiIiIhInV6kVRQUFOD6\n9evw9PQUyyQSCbp06YLLly9r1YYgCMjJyUHdunVVyuVyOXx8fNCjRw9MmjQJd+7cqdS+l0cul0Mm\nk8Ha2ppBLhEREZGe04uZ4/T0dCgUClhbW6uUW1lZIT4+Xqs2tmzZArlcjn79+ollLVq0wJIlS+Dg\n4IDs7Gxs2bIFwcHBOHz4MF599VWd+tikSRMoFAqVMnt7+zL3UeYYu7u7w8zMrNz6JSnrP3nyRKf9\niIiIiKhi9CI4flEHDx7E+vXrsWHDBpUUCldXV7i6uqo87t+/P/bu3YupU6fqdAyFQiEGx0VFRWJZ\nabKysnDv3j00b94cjx8/RlFRUZn1iyvZfkFBAeRyuU79/S/Izc1V+S/pD46NfuP46C+Ojf7i2Oi3\nvLy8SmtLL4Lj+vXrw9DQEDKZTKU8NTVVbTa5pMOHD+PDDz/EmjVr4OHhUWZdIyMjODo64t69ezr3\nMTc3V3xDZGdnAwAyMjI01s3JycHDhw/RtGlTFBUVlVu/pJL1Hz9+jNjYWJ37/F+RkJBQ012gUnBs\n9BvHR39xbPQXx+bfTy+CY2NjYzg5OSEmJga9evUC8CyHOCYmBiEhIaXud+jQIcybNw+fffYZunfv\nXu5xioqKcPv2bfTo0UPnPpqamqJWrVoAIK42UTK/GXg2Y5yWlgZHR0dYWFiUW1+TkvUVCgUcHR11\n7vO/XW5uLhISEmBnZwdTU9Oa7g4Vw7HRbxwf/cWx0V8cG/325MkTJCcnV0pbehEcA8CoUaMQGhqK\ntm3biku5PX36FP7+/gCAVatW4dGjR1i+fDmAZ6kUoaGhmDt3LpydncVZ59q1a4vB5RdffAFXV1c0\na9YMWVlZ2LJlC5KTkzF06FCd+2doaCj+v4GBgVoZ8GzG98GDB7C3t1dZrq20+qUpWd/Y2JgX85XB\n1NSUz4+e4tjoN46P/uLY6C+OjX6qzHQXvQmO+/fvj/T0dKxduxYymQyOjo7YsmWLmEMsk8lUvhHs\n27cPCoUCH3/8MT7++GOxfMiQIVi6dCkAIDMzE/Pnz4dMJoOlpSXatm2LPXv26HxhnDZ4gw8iIiKi\nl5/eBMcAMHz4cAwfPlzjNmXAq7Rjx45y2wsNDUVoaGil9K0sVR0YFxQUVHqbRERERKROL9Y5fplV\ndWCcnZ3NlSqIiIiIqgmD4xdQHYFxfHw8c5uIiIiIqolepVW8TORyeZUGxsXbLywsrPT2iYiIiEgd\ng2MtJSYmIicnBwBw48YNyGQyuLu7IyUlBSkpKWXuGxcXp9OxSrbPmWMiIiKi6sG0Ch3J5XLIZDJY\nW1tXSdBa1e0TERERUek4c6ylJk2aICMjA/Hx8XB3d4eZmZnOS8KVV1+ZY1yy/SdPnlS430RERESk\nPc4ca6l4DnBVzOgWv7iPM8ZERERENYPBsZaSk5OrfFUK3kCEiIiIqGYxrUJLjRs3homJSaW3y8CY\niIiISH9w5lhLVZ1KwcCYiIiIqOYxOK4hDIyJiIiI9A+D4xrAwJiIiIhIPzE4rmYMjImIiIj0F4Pj\nasTAmIiIiEi/MTiuJsXXSWZgTERERKSfuJSblhITE5GTkwMAiIuL02nfGzduQCaTwd3dHSkpKUhJ\nSSmzfsn2eVMQIiIiourBmeMqJpfLIZPJYG1tzSCXiIiISM9x5lhLTZo0gUKhUCmzt7cvcx9ljrG7\nuzvMzMzKrV+Ssv6TJ0906ywRERERVQhnjqtI8YvvOGNMRERE9HJgcFwFuCoFERER0cuJwXElY2BM\nRERE9PJicFyJGBgTERERvdwYHFcSBsZERERELz8Gx5WgqgPjgoKCSm+TiIiIiNQxOH5BVR0YZ2dn\nQy6XV3q7RERERKSOwfELqI7AOD4+nkvBEREREVUT3gSkguRyeZUGxsXbLywsrPT2iYiIiEgdg2Mt\nJSYmIicnBwBw48YNyGQyuLu7IyUlBSkpKWXuGxcXp9OxSrbPmWMiIiKi6sG0Ch3J5XLIZDJYW1tX\nSdBa1e0TERERUek4c6ylJk2aICMjA/Hx8XB3d4eZmRns7e11aqO8+soc45LtP3nypML9JiIiIiLt\nceZYS8VzgKtiRrf4xX2cMSYiIiKqGQyOtZScnFzlq1LwBiJERERENYtpFVpq3LgxTExMKr1dBsZE\nRERE+oMzx1qq6lQKBsZERERENY/BcQ1hYExERESkfxgc1wAGxkRERET6icFxNWNgTERERKS/GBxX\nIwbGRERERPqNwXE1Kb5OMgNjIiIiIv3Epdy0lJiYiJycHABAXFycTvveuHEDMpkM7u7uSElJQUpK\nSpn1S7bPm4IQERERVQ/OHFcxuVwOmUwGa2trBrlEREREeo4zx1pq0qQJFAqFSpm9vX2Z+yhzjN3d\n3WFmZlZu/ZKU9Z88eaJbZ4mIiIioQjhzXEWKX3zHGWMiIiKilwOD4yrAVSmIiIiIXk4MjisZA2Mi\nIiKilxeD40rEwJiIiIjo5cbguJIwMCYiIiJ6+TE4rgRVHRgXFBRUeptEREREpI7B8Quq6sA4Ozsb\ncrm80tslIiIiInUMjl9AdQTG8fHxXAqOiIiIqJrwJiAVJJfLqzQwLt5+YWFhpbdPREREROoYHGsp\nMTEROTk5AIAbN25AJpPB3d0dKSkpSElJKXPfuLg4nY5Vsn3OHBMRERFVD6ZV6Egul0Mmk8Ha2rpK\ngkFOmy0AACAASURBVNaqbp+IiIiISseZYy01adIEGRkZiI+Ph7u7O8zMzGBvb69TG+XVV+YYl2z/\nyZMnFe43EREREWmPM8daKp4DXBUzusUv7uOMMREREVHNYHCspeTk5CpflYI3ECEiIiKqWUyr0FLj\nxo1hYmJS6e0yMCYiIiLSH5w51lJVp1IwMCYiIiKqeQyOawgDYyIiIiL9w+C4BjAwJiIiItJPDI6r\nGQNjIiIiIv3F4LgaMTAmIiIi0m8MjqtJ8XWSGRgTERER6Scu5aalxMRE5OTkAADi4uJ02vfGjRuQ\nyWRwd3dHSkoKUlJSyqxfsn3eFISIiIioenDmuIrJ5XLIZDJYW1szyCUiIiLSc5w51lKTJk2gUChU\nyuzt7cvcR5lj7O7uDjMzs3Lrl6Ss/+TJE906S0REREQVwpnjKlL84jvOGBMRERG9HPQqON65cyd8\nfHzg4uKCwMBAXL16tdS60dHRGD16NDw9PdGhQwcEBwfj7NmzavWOHDmCfv36wcXFBYMHD8bp06er\n8hQAcFUKIiIiopeV3gTHUVFRWLZsGaZOnYqIiAhIpVKMHTsWaWlpGutfuHABXl5e2Lx5MyIiItC5\nc2dMmDABN2/eFOtcvHgRM2fORGBgICIjI9GrVy9MnjwZd+7cqbLzYGBMRERE9PLSm+B427ZtCAoK\nwpAhQ2Bvb4+FCxeidu3a2L9/v8b6YWFhGDNmDNq2bYtmzZph+vTpsLOzw6lTp8Q6O3bsQLdu3fDO\nO++gZcuWmDZtGpycnPDtt99WyTkwMCYiIiJ6uelFcFxQUIDr16/D09NTLJNIJOjSpQsuX76sVRuC\nICAnJwd169YVyy5fvowuXbqo1OvatavWbeqCgTERERHRy08vVqtIT0+HQqGAtbW1SrmVlRXi4+O1\namPLli2Qy+Xo16+fWPb48WONbcpkMp37qFAoxNUqioqKxDIAyMrKwr1799C8eXOYmpqqrWpRsn55\nStbPzc2FXC7Xuc//drm5uSr/Jf3BsdFvHB/9xbHRXxwb/ZaXl1dpbelFcPyiDh48iPXr12PDhg1o\n0KBBlRwjNzdXfENkZ2cDADIyMpCTk4OHDx+iadOmKCoqQkZGhtq+xetro2T7iYmJiI2NrYzT+FdK\nSEio6S5QKTg2+o3jo784NvqLY/PvpxfBcf369WFoaKg2o5uamqo281vS4cOH8eGHH2LNmjXw8PBQ\n2dawYcMKtamJqakpatWqBQBi2oSBgQHS0tLg6OgICwuLUvdV1i+e8lGWku03b94cjo6OOvf53y43\nNxcJCQmws7ODqalpTXeHiuHY6DeOj/7i2Ogvjo1+e/LkCZKTkyulLb0Ijo2NjeHk5ISYmBj06tUL\nwLMc4piYGISEhJS636FDhzBv3jx89tln6N69u9p2V1dXxMTEYOTIkWLZuXPn4OrqqnMfDQ0Nxf83\nMDCAXC7HgwcPYG9vX26OsYGBgVob5dUv3n5hYeH/sXfv4VFV9/7HP0MIIQFEyAQNQUAHNBEIAUbB\nKEVBi2LlALWiBUG8FVGxXirFK14qcARRbq0eFBSpIEVoRZTzaOvlB9GiFFTCNQSIYxyzc4PMJOQ2\nvz80c3LPTDKT2QPv1/P4CHvW/s43WaAfFmvW5qzkRkRHR/P9MSnmxtyYH/NibsyLuTGnQG53MUU4\nlqRbbrlFs2fPVv/+/TVgwAC9/vrrKikp0YQJEyRJCxcu1I8//qj58+dL+mkrxezZs/Xoo49qwIAB\n3hXi9u3be8PqlClTdPPNN2vlypUaMWKE3nvvPe3Zs0fPPvus3/05HA65XC5JUnp6ugzDkN1ul9Pp\nlNPpbPTejIwMv96rdn1+EwIAALQO04TjMWPGKD8/X4sXL5ZhGEpKStKKFSu8e4gNw6ixXP7222+r\noqJCTz/9tJ5++mnv9XHjxmnu3LmSpEGDBmnhwoVatGiRFi1apF69emn58uXq06dPs/t0u90yDENW\nqzUooTXY9QEAANAw04RjSZo0aZImTZpU72tVgbfK6tWrfao5evRojR49usW9JSQkqLCwUJmZmbLb\n7YqJiZHNZvOrRlPjq46Dq12/oKCg2X0DAADAd6Y45zgcuN1u7znGwVjRrX5OMivGAAAAoUE49lF2\ndnbQHvDBA0QAAADMwVTbKswsPj5eUVFRAa9LMAYAADAPVo59FOytFARjAACA0CMchwjBGAAAwHwI\nxyFAMAYAADCngITj4uJiHT16VB6PJxDlTmkEYwAAAPPyOxy/+uqrWrp0qffnX375pX7xi1/o6quv\n1i9/+UsdO3YsoA2eSgjGAAAA5uZ3OF6/fr3OOuss78/nzp2rPn36aPny5erSpYteeOGFgDZ4qqh+\nTjLBGAAAwJz8Psrthx9+UK9evSRJTqdTe/bs0Ztvvim73a6KigrNmTMn0D2agsPhkMvlkiRlZGT4\ndW96eroMw5DdbpfT6ZTT6Wx0fO36PBQEAACgdfi9chwVFaWioiJJUlpammJiYjRo0CBJUqdOnXTi\nxInAdhjm3G63DMOQ1Wol5AIAAJic3yvHycnJeuWVV9SmTRu9+uqr+sUvfqGIiAhJ0rFjx2psuTiV\nJCQkqKKiosY1m83W6D1Ve4ztdrtiYmKaHF9b1fiCggL/mgUAAECz+L1yPGvWLOXk5Gj69OlyuVy6\n//77va+9//773lXk0131D9+xYgwAABAe/F457tOnjz766CPl5+erS5cuNV6bNWuW4uLiAtZcuKp9\nKkVTe4wBAABgDs0+57hLly7yeDxyOp0qLy+XJF1wwQXq2rVrwJoLRxzXBgAAEL6aFY4/++wz3XDD\nDRowYICuuOIK7d+/X5L0+OOP6x//+EdAGwwnBGMAAIDw5nc43rx5s+6880716NFDTz75pCorK72v\nnXPOOXrnnXcC2mC4IBgDAACEP7/D8fLlyzV16lS98MILmjBhQo3X+vbtq4MHDwasuXAR7GBcVlYW\n8JoAAACoy+9wnJWVpREjRtT7WnR09Gl3znGwg3FRUZHcbnfA6wIAAKAuv8NxXFycDh8+XO9r+/fv\nV/fu3VvcVLhojWCcmZnJUXAAAACtxO9w/Ktf/UpLlixRWlqa95rFYtGBAwe0YsUKjR07NqANmpXb\n7Q5qMK5ePzIyMuD1AQAAUJff5xzfc889OnjwoKZNm6YzzzxTknTHHXcoLy9Pl19+ue68886AN2kG\nDodDLpdLkpSeni7DMGS32+V0Ops8xzgjI8Ov96pdn5VjAACA1uF3OG7Xrp3+/Oc/6/PPP9f27duV\nn5+vzp07KzU1VampqcHo0VTcbrcMw5DVag1KaA12fQAAADTM73BcZdiwYRo2bFggezG1hIQEFRYW\nKjMzU3a7XTExMbLZbH7VaGp81R7j2vULCgqa3TcAAAB85/ee47S0NG3YsKHe19555x19/vnnLW7K\njKrvAQ7Gim71D/exYgwAABAafofjF198Ubm5ufW+lpeXpxdffLHFTZlRdnZ20E+l4AEiAAAAoeV3\nOD548KD69+9f72v9+vXToUOHWtyUGcXHxxOMAQAATnF+h2OLxdLggz4KCwtVUVHR4qbMKNhbKQjG\nAAAAoed3OB44cKDWrFkjj8dT47rH49Ff//pXDRw4MGDNncoIxgAAAObj92kV9957r6ZMmaKxY8dq\n/PjxiouL048//qhNmzbpyJEjWr16dTD6PKUQjAEAAMzJ73A8aNAgrVq1Ss8//7wWLFigyspKtWnT\nRikpKVq1apVSUlKC0ecpg2AMAABgXs0653jIkCFau3atSkpKVFhYqDPOOEPR0dGB7u2UQzAGAAAw\nN7/3HFcXFRUlSYqMjAxIM6ey6uckE4wBAADMqVkrx5999pmWLFmi9PR0VVZWav369erXr58ef/xx\nXXTRRRo7dmyg+ww5h8Mhl8slScrIyPDr3vT0dBmGIbvdLqfTKafT2ej42vV5KAgAAEDr8HvlePPm\nzbrzzjvVo0cPPfnkk6qsrPS+ds455+idd94JaIPhzu12yzAMWa1WQi4AAIDJ+b1yvHz5ck2dOlV/\n/OMfVVFRoccff9z7Wt++ffX6668HtEGzSEhIqHOGs81ma/Seqj3GdrtdMTExTY6vrWp8QUGBf80C\nAACgWfxeOc7KytKIESPqfS06OrrBB4Scbqp/+I4VYwAAgPDgdziOi4vT4cOH631t//796t69e4ub\nCnecSgEAABCe/A7Hv/rVr7RkyRKlpaV5r1ksFh04cEArVqw4JT+M5w+CMQAAQPjye8/xPffco4MH\nD2ratGk688wzJUl33HGH8vLydPnll+vOO+8MeJPhgmAMAAAQ3vwOx+3atdOf//xnff7559q+fbvy\n8/PVuXNnpaamKjU1NRg9hgWCMQAAQPhr1jnHkjRs2DANGzYskL2ErWAH47KysoDXBAAAQF0+heOC\nggKdccYZatOmjU/HilVttzgdBDsYFxUVye12B7wuAAAA6vIpHF9yySVat26dkpOTNWzYMFkslkbH\n7927NyDNmV1rBOPMzEydffbZAa8NAACAunwKx88995zOOecc74+bCsenA7fbHdRgXL1+eXl5wOsD\nAACgLp/C8fjx470/njBhQtCaMTOHwyGXyyVJSk9Pl2EYstvtcjqdcjqdjd6bkZHh13vVrs9DRAAA\nAFqHzx/IO3TokNauXavvvvtO3bp109VXX31ank7hdrtlGIasVmtQQmuw6wMAAKBhPoXjL7/8Urfc\ncosqKirUpUsXFRYWav369XriiSd00003BbtHU0hISFBhYaEyMzNlt9sVExMjm83mV42mxlftMa5d\n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\nk5JU46+Se/To0eD4888/v861xsbXp/r4Hj16KCUlxa/7Ay3U72+GHkL9/jCP7t27hzScX3755Q2+\ndskllwT1vYNdH1JkZGSLt04hOJgbc6v6A8vJkydb/DfHpgjHXbp0UURERJ0V3dzc3AZXU+Li4rwr\nUtXHd+zY0bvHMS4uzq+a9encubN69+6tqKgo/goRAADAhCorK3Xy5El17ty5xbVMEY4jIyPVr18/\npaWladSoUZJ+emRxWlqabr755nrvSUlJ0aefflrj2rZt22qs8KWkpCgtLU1TpkxpcExT2rZtW2f7\nBgAAAMwlUJ81Ms1S6C233KL169dr06ZNysjI0JNPPqmSkhJNmDBBkrRw4ULNmjXLO/7GG29UVlaW\nnn/+eR0+fFhr1qzR1q1ba3wAb8qUKfrss8+0cuVKHT58WEuWLNGePXs0efLkVv/6AAAAYH4Wj8fj\nCXUTVao/BCQpKUmPPfaYBgwYIEmaPXu2HA6H3njjDe/4HTt2aO7cuTp06JDOPvtszZgxw3sUXJWt\nW7dq0aJF+v7779WrVy89/PDDGj58eKt+XQAAAAgPpgrHAAAAQCiZZlsFAAAAEGqEYwAAAOBnhGMA\nAADgZ4RjAAAA4GeEYwAAAOBnhONGrFmzRiNHjlRycrJuuOEGff3116Fu6bT05Zdfavr06Ro+fLgS\nExP10Ucf1Rnz0ksv6bLLLtPAgQM1bdo0HT16NASdnl5efvllXX/99Ro8eLBSU1N19913KzMzs844\n5iY03nrrLY0dO1ZDhgzRkCFDdOONN9Z5cBJzYw6vvPKKEhMTNXfu3BrXmZ/QWLp0qRITE2v8M2bM\nmBpjmJvQcTqd+sMf/qChQ4dq4MCBGjt2rPbs2VNjTEvnh3DcgC1btmjevHmaOXOmNm7cqMTERN1+\n++3Ky8sLdWunHbfbraSkJD355JOyWCx1Xn/llVe0Zs0aPfPMM1q/fr2io6N12223qbS0NATdnj6+\n/PJLTZ48WevXr9fKlStVXl6u2267TSUlJd4xzE3oxMfH66GHHtLGjRv1zjvvaOjQoZoxY4YyMjIk\nMTdm8fXXX2vdunVKTEyscZ35Ca2+fftq+/bt2rZtm7Zt26a//vWv3teYm9A5fvy4brrpJrVr106v\nvvqqtmzZoj/+8Y8644wzvGMCMj8e1Os3v/mN55lnnvH+vLKy0jN8+HDPK6+8EsKucMEFF3g+/PDD\nGtcuvfRSz8qVK70/P3HihGfAgAGe9957r5W7O73l5uZ6LrjgAs+OHTu815gbc7n44os9f/vb3zwe\nD3NjBkVFRZ5f/vKXnu3bt3smT57see6557yvMT+hs2TJEs+4ceMafJ25CZ3nn3/eM2nSpEbHBGJ+\nWDmuR1lZmfbs2aNLLrnEe81isSg1NVW7du0KYWeoLSsrS4ZhaNiwYd5rHTt21MCBA5mrVnbixAlZ\nLBadeeaZkpgbM6msrNR7772n4uJiDRo0iLkxiaefflojR46s8f8aid87ZnDkyBENHz5cV155pR56\n6CFlZ2dLYm5C7V//+pf69++v++67T6mpqRo/frzWr1/vfT1Q89M2oF2fIvLz81VRUSGr1Vrjemxs\nbL17KhE6hmHIYrHUO1eGYYSoq9OPx+PRc889pyFDhqhPnz6SmBszOHDggCZOnKjS0lJ16NBBS5cu\n1Xnnnaf//Oc/zE2Ivffee9q7d682bNhQ5zV+74TWwIEDNW/ePJ177rnKycnRkiVLNGnSJG3evJm5\nCbGsrCy99dZbmjZtmu666y59/fXXevbZZxUZGalx48YFbH4IxwBabM6cOTp06JDeeuutULeCas47\n7zz94x//0IkTJ7R161bNmjVLb775ZqjbOu398MMPeu6557Ry5UpFRkaGuh3UMnz4cO+Pzz//fCUn\nJ+uKK67Q+++/r/POOy+EnaGyslLJycn6/e9/L0lKTEzUgQMHtHbtWo0bNy5g78O2inp06dJFERER\ndf6UkZubW+dPIwgtq9Uqj8fDXIXQ008/rU8//VSrV69Wt27dvNeZm9Br27atzjnnHF144YW6//77\nlZiYqDfeeIO5CbFvv/1WeXl5mjBhgvr166d+/fppx44deuONN9S/f3/mx2Q6deqk3r1769ixY8xN\niHXr1k02m63GNZvN5t32Eqj5IRzXIzIyUv369VNaWpr3msfjUVpamgYNGhTCzlDbOeecI6vVqs8/\n/9x7raioSLt372auWsHTTz+tjz76SG+88Ya6d+9e4zXmxnwqKytVWlrK3IRYamqq3n33XW3atEl/\n//vf9fe//139+/fX2LFj9fe//535MRmXy6Vjx46pW7duzE2IDRo0qM721szMTO//fwI1PxFz5syZ\nE5COTzEdOnTQ4sWLFR8fr8jISL344ovav3+//vSnPyk6OjrU7Z1W3G63MjIylJOTo3Xr1ik5OVnt\n27dXWVmZOnXqpIqKCr3yyiuy2WwqLS3Vs88+q9LSUj322GOKiIgIdfunrDlz5mjz5s1WOKL3AAAX\neklEQVRavHix4uLi5Ha75Xa7FRERobZtf9qxxdyEzgsvvKDIyEh5PB798MMPWrVqlTZv3qyHH35Y\n55xzDnMTQpGRkeratWuNf959912dc845Gjt2rCR+74TS/PnzFRUVJUk6dOiQ5syZo/z8fM2ZM0fR\n0dHMTQh1795dy5YtU0REhLp166ZPP/1Uy5Yt0+9//3udf/75kgLze4c9xw0YM2aM8vPztXjxYhmG\noaSkJK1YsUJdu3YNdWunnW+//VZTpkyRxWKRxWLR/PnzJUnjxo3T3Llzdccdd6ikpERPPPGETpw4\nIbvdrv/5n/9Ru3btQtz5qW3t2rWyWCy6+eaba1yfO3eud+8XcxM6ubm5mjVrlnJyctSpUyddcMEF\nevXVV70nIzA35lL7DHfmJ3ScTqcefPBBFRQUqGvXrhoyZIjWrVunLl26SGJuQmnAgAFatmyZFixY\noOXLl6tHjx569NFHde2113rHBGJ+LB6PxxOMLwAAAAAIN+w5BgAAAH5GOAYAAAB+RjgGAAAAfkY4\nBgAAAH5GOAYAAAB+RjgGAAAAfkY4BgAAAH5GOAYAAAB+RjgGAAAAfkY4Bkzio48+0m233aahQ4eq\nf//+GjVqlJ544gkdOXIkZD3t27dPS5cu1cmTJwNW87vvvtPUqVM1ePBgJSUlad++fQ2OPXnypJYv\nX65rr71WycnJGjp0qKZPn67du3cHrB8037vvvqvRo0erf//+Gj9+fL1jMjMzNWfOHF199dVKSUnR\nqFGjNGfOHOXn5/v0HiNHjlRiYqLeeeedOq9ddNFFWrp0qV89OxwOLV26VDk5OX7d15iSkhItXbpU\n1157rVJSUjR06FBdf/31WrRoUcDeA0DraRvqBgBICxYs0IoVK3TNNdfo2WefVZcuXZSVlaUNGzbo\ngQceqDcYtIa9e/dq2bJlmjx5sqKiogJS86WXXvIGlI4dO+rcc8+td1xxcbGmTp2qQ4cO6c4779SQ\nIUNUUFCgN998U7/97W+1cOFCXX311QHpCf5zu9169NFHdd1112n+/Pnq0KFDveO2b9+uXbt2afLk\nybrgggvkcDi0ePFi7dixQ5s2bVJkZGST72WxWPTyyy9r/PjxslgsLeq76tfeFVdcobi4uBbVqnLv\nvffqm2++0fTp05WUlKTjx4/rm2++0T//+U/df//9AXkPAK2HcAyE2CeffKIVK1bonnvu0T333OO9\nbrfbNX78eH3yySch683j8dT4dyAcPnxYdrtdqampjY578cUX9c033+iNN97QRRdd5L1+5ZVXatq0\naXr00Udlt9tltVoD1ltznTx5MmB/eAgX3333ncrKyjR27FilpKQ0OO5Xv/qVJk2a5P35RRddpF69\neummm27Sxx9/rKuuuqrJ97r44ou1Y8cOvfvuuxo7dmyL+vZ4PC0O2NUdO3ZMn332mf77v/+7Rm9X\nXXWVHnjggYC9D4DWw7YKIMRee+01Wa1W3XXXXfW+PmLECO+PS0tLNXfuXA0fPlzJyckaN26cPvzw\nwxrjb775Zk2fPr3GtX379ikxMVE7duzwXktMTNSKFSu0dOlSXXrppRo2bJhmz56tkpISSdLGjRv1\nyCOPSJIuueQSJSYmatSoUY1+LTt27NCNN96ogQMHatiwYXrkkUdUWFgo6acVu8TERKWnp2vTpk2N\n1jt58qTefvttXXrppTWCsfTTKuLMmTPlcrm0fv36Gq9t2rRJ48ePV3JysoYNG6bf/e53ys7O9r7u\ndDr18MMP69JLL9XAgQN1zTXXaPXq1TW+JytXrqxRc9WqVUpMTPT+/N///rcSExP1ySefaObMmRoy\nZIjuu+8+7+vvvPOOxo4dq+TkZP3iF7/QokWLVFlZWeP1xMRE7d27V3fccYcGDRqk0aNHa9OmTXW+\nDx9//LFuuukmpaSk6OKLL9aUKVNqbEM5ceKE5syZo8suu0wDBgzQhAkTtG3btho1vvrqK02ePFl2\nu12DBw/WddddV+97VefxeLR8+XKNHDlSAwYM0DXXXKN169Z5X1+6dKk3CE6dOlVJSUkNbm/o3Llz\nnWsXXnihJOnHH39stI8qffv21VVXXaW//OUvTY793//9X40bN07JyckaPny45s2bp9LSUkk/zd3U\nqVMlSb/+9a+VmJiopKQk772+fD9rq/r17csqdGlpqV544QXv93XMmDHavHlznXFvv/22Ro4cqZSU\nFE2bNk3ffvutEhMTa8ybL79Wff2aqv6bsXXrVl199dUaNGiQpk6dqqysrDr9L1q0SFdeeaUGDBig\nESNGaPbs2TXG/Oc//9HUqVM1aNAg2e12Pfjgg8rLy2vyewOYCSvHQAhVVFToP//5j0aPHq2IiIgm\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8,6))\n", + "sns.set_style(\"whitegrid\")\n", + "plt.hist(X[np.where(y == 1), sorted_b[-2]][0], bins=np.linspace(0,60,20),\n", + " color='gray', hatch='/',\n", + " alpha=0.4, label=\"Bach\", normed=True)\n", + "plt.hist(X[np.where(y == 0), sorted_b[-2]][0], bins=np.linspace(0,60,20),\n", + " color='gray', hatch='+',\n", + " alpha=0.4, label=\"Mozart\", normed=True)\n", + "plt.legend()\n", + "plt.title(\"Histograms of 2-Note Sequence Most Representative of Bach\\nF#3 to B4\")\n", + "plt.xlabel(\"Count of Occurences of 2-Note Sequence\")\n", + "plt.ylabel(\"Number of Pieces\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 191, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nzpzJ/fffz0477dSk3HvuuYcdd9yRRx99lIkTJzJ58mQWLlzYgY8sd9StQkRERCQPCiUYP/fcc+yy\nyy5AaOE+3gGPAAAgAElEQVTddNNNmTp1auP8U089tfHvESNGcMIJJzBr1ixOPPFEAO68806+/e1v\nc+aZZzYut8022zTZxv7778/EiRMBOOWUU7j33nuZPXs2o0ePztfDyhuFYxEREZEcK5RgDLDHHnsw\nefJkAFasWMH06dM56aSTePjhhxk+fDizZs3i/vvv58MPP6Smpob6+no22mijxvXfffddjjrqqFa3\nse222zb5v6SkpENH8sgldasQERERyaFCCsYA/fr1Y9SoUYwaNYoddtiBa665htraWh566CHeeOMN\nLrroIg444ACmTp3Ko48+yqmnnkpdXV3j+n379m1zG717N21vLSoqYv369Tl/LB1B4VhEREQkRwot\nGLekqKiI1atX8/rrrzNy5EhOOeUUtt9+e7bYYgsWLVrUZFkz4+WXX+6kmnY8dasQERERyYFCDcZr\n166luroaCN0qHnjgAVavXs2BBx7I559/zscff8ysWbPYcccdee6553jmmWearH/mmWdy/PHHM2rU\nKA455BDWrVvHCy+8wMknn9wZDyfvFI5FREREsvTZZ58BTW/w0bt378Zh0nJl4cKFzUaISNeLL77I\nPvvsA0D//v3Zeuutue222/jKV74CwHHHHcfVV1/N2rVr2X///TnjjDOYMmVK4/q77747t956K7ff\nfjt33303AwYMoKysrHF+UVFRs22mmtZVFDU0NHR2HQra3LlzdwXmjh49mqFDh3Z2dSSmtraWefPm\nMWbMGIqLizu7OhKjfVPYtH8Kl/ZN4Uq1b3T76MKxZMmSxNBxu+22226vtacstRyLiIiIZKFXr14F\n1X1CckNfP0REREREIgrHIiIiIiIRhWMRERERkYjCsYiIiIhIROFYRERERCSicCwiIiIiElE4FhER\nERGJKByLiIiIiER0ExARERGRLOgOed2TwrGIiIhIFpYsWcK0adPYZZdd0lp+/vz5AGy77bYZL//Z\nZ5+xzz77ZHxHvkmTJjFz5kyOPvpoJk+e3GTeVVddxR/+8AcOO+wwrrvuuozKzaUpU6bwzDPPMHPm\nzE6rQ5zCsYiIiEiW+vfvz+DBg9NaduDAgQB5Wz6VoqIiRowYwaxZs7jsssvYcMMNAVi7di2PP/44\nI0aMyLrsXKivrwdCPQuF2uZFREREurExY8YwbNgwnnrqqcZpTz31FCNGjGDs2LGN09auXcs111zD\nXnvtxbhx4zjmmGN4++23G+dfeumlbLfddmy33XaMGTOm8e9XX30VgEcffZTDDz+cXXfdlb333psL\nLriApUuXNq4/Z84ctttuO1544QUmTJjAjjvuyGOPPcaUKVN49913G8vt7BZktRyLiIiIZGn+/PmN\nLbxtmTdvXkZlx5f/7LPP2GmnnTJaP6GoqIjDDz+cGTNm8O1vfxuAGTNmMGHCBGbPnt243A033MDT\nTz/NDTfcwPDhw/ntb3/LSSedxNNPP83AgQO5/PLLufDCCxuXnzp1KrNmzWLrrbcGQivwueeey1Zb\nbcXSpUu57rrruPTSS5k6dWqT+tx8881ccsklbL755vTt25fjjz+ef/zjH9x77700NDSw0UYbZfU4\nc0UtxyIiIiLd3He+8x3mzp3L4sWLWbRoEa+//jqHHnpo4/xVq1bxxz/+kUsuuYS9996b0tJSrr76\navr27cvDDz8MwIABAxg6dChDhw5l7ty5PPTQQ0yZMoWhQ4cCMGHCBPbZZx8233xzxo0bx2WXXcYL\nL7zAqlWrmtTlnHPOYc8992TUqFFsuumm9O/fn969ezNkyBCGDh3a2PWjs6jlWERERCRL2267LWPG\njMlonWyWX7ZsWUbrJBsyZAj7778/M2bMAGC//fZj4403bpz/wQcfUF9f3+Tiwt69ezNu3DgqKiqa\nlFVeXs4ll1zClVdeyc4779w4/Z133mHKlCm4OytWrKChoQGAjz/+mNLSUiC0Ym+//fbteiz5ppZj\nERERkR7g8MMP55FHHmHmzJkcccQRzeYnwmxrqqqqOP300/n+97/PhAkTGqevWrWKk046iYEDB3Lj\njTcyY8YMpkyZAkBdXV2TMoqLi9v5SPJL4VhERESkB9hnn32oq6ujvr6evffeu8m8LbbYgj59+vDa\na681Tlu3bh1vv/02X/7yl4Fwwd4ZZ5xBaWkpkyZNarL+f//7X1asWMEFF1zAbrvtxlZbbUV1dXVa\n9erTp0/jqBWFQN0qRERERHqAXr168cQTTwDNh07r168fEydO5IYbbmDgwIGNF+StXr26sZX5iiuu\n4JNPPuH6669vcvOTQYMGMXz4cPr06cN9993H0Ucfzfz587njjjua1SFV6/TIkSP56KOPePfdd9ls\ns83o379/p/Y7VjgWERERyVJNTU3a/YE/++wzgKyWT/zdXv37929x3oUXXkhDQwOXXHIJNTU17LDD\nDvzud79rHD3i1Vdfpaqqim9961tACLpFRUXcd999fOUrX+H666/n5ptv5oEHHmDs2LFMmjSJ0047\nrck2Uo1n/I1vfIOnn36aH/7wh3z++edcd911fO9738vJ481GUTr9S3qyuXPn7grMHT16dOPVmFIY\namtrmTdvHmPGjCn4/ks9jfZNYdP+KVzaN4Ur1b7R7aMLx5IlS1i4cCHAbrvttttrbSzeKrUci4iI\niGShV69eGd/OWQqfvn6IiIiIiEQUjkVEREREIgrHIiIiIiIRhWMRERERkYjCsYiIiIhIROFYRERE\nRCSicCwiIiIiElE4FhERERGJKByLiIiIiEQUjkVEREREIgrHIiIiIiIRhWMRERERkYjCsYiIiIhI\nROFYRERERCSicCwiIiIiElE4FhERERGJKByLiIiIiEQUjkVEREREIgrHIiIiIiIRhWMRERERkYjC\nsYiIiIhIROFYRERERCSicCwiIiIiElE4FhERERGJKByLiIiIiEQUjkVEREREIgrHIiIiIiIRhWMR\nERERkYjCsYiIiIhIROFYRERERCSicCwiIiIiElE4FhERERGJKByLiIiIiEQUjkVEREREIgrHIiIi\nIiIRhWMRERERkYjCsYiIiIhIROFYRERERCSicCwiIiIiElE4FhERERGJ9O7sCnQVdXV1rFmzplO2\n3adPH3r10vcYERERkXwrqHBsZmcAFwLDgDeBs9z91RaWPQw4DdgZ6Av8G5js7k8lLXck8DNgNDAf\nmOTuT2Rat7lz57J8+XLmzZvHmDFjGDx4cKZFtGnZsmUpyx8yZAh77LFHzrcnIiIiIk0VTDg2s6OA\nm4BTgDnAecCTZratu1enWGVf4CngUmA5cALwFzPb3d3fjMrcC5gOXAI8DhwLzDSzXdy9PJP69erV\ni/fee4+9996bTTbZJLsH2YqqqqoWy6+rq8v59kRERESkuYIJx4QwPNXd7wMws1OBbxFC7w3JC7v7\neUmTLjez7wLfIbQ6A5wNPOHuN0f/X2lmXwfOBE7PpHLl5eWMHz8+b8F49uzZeStfRERERNJTEB1Z\nzawPsBvw98Q0d28AngH2TLOMImAjYGls8p5RGXFPpltm3NixYxWMRURERLq5Qmk5LgE2ACqTplcC\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8,6))\n", + "sns.set_style(\"whitegrid\")\n", + "plt.hist(X[np.where(y == 1), sorted_b[2]][0], bins=np.linspace(0,60,20),\n", + " color='gray', hatch='/',\n", + " alpha=0.4, label=\"Bach\", normed=True)\n", + "plt.hist(X[np.where(y == 0), sorted_b[2]][0], bins=np.linspace(0,60,20),\n", + " color='gray', hatch='+',\n", + " alpha=0.4, label=\"Mozart\", normed=True)\n", + "plt.legend()\n", + "plt.title(\"Histograms of 2-Note Sequence Most Representative of Mozart\\nE5 to D5\")\n", + "plt.xlabel(\"Count of Occurences of 2-Note Sequence\")\n", + "plt.ylabel(\"Number of Pieces\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 181, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from midi_ml.pipelines.midi_reads import MidiFeatureCorpus" + ] + }, + { + "cell_type": "code", + "execution_count": 182, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "m = MidiFeatureCorpus.initialize_note_sequence_set(2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "midi_locz" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "for seq in seqs:\n", + " midi_locs = m[seq].split(\"|\")\n", + " for note in midi_locs:\n", + " n = music21.note.Note(0)\n", + " n.pitch.midi = int(note)\n", + " n.duration = music21.duration.Duration(0.5)\n", + " mozart_s.append([n])" + ] + }, + { + "cell_type": "code", + "execution_count": 213, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'55|69'" + ] + }, + "execution_count": 213, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m[sorted_b[-4]]" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import music21" + ] + }, + { + "cell_type": "code", + "execution_count": 200, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "s = music21.stream.Stream()\n", + "for i in [76, 74]:\n", + " n = music21.note.Note(0)\n", + " n.pitch.midi = int(i)\n", + " s.append([n])" + ] + }, + { + "cell_type": "code", + "execution_count": 201, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "s.show('midi')" + ] + }, + { + "cell_type": "code", + "execution_count": 203, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 203, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s.analyze(\"key\")" + ] + }, + { + "cell_type": "code", + "execution_count": 205, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s = music21.stream.Stream()\n", + "for i in [54, 71]:\n", + " n = music21.note.Note(0)\n", + " n.pitch.midi = int(i)\n", + " s.append([n])" + ] + }, + { + "cell_type": "code", + "execution_count": 206, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 206, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 207, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "s.show(\"midi\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "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.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/notebooks/Project 1 Results - Multinomial NB.ipynb b/notebooks/Project 1 Results - Multinomial NB.ipynb new file mode 100644 index 0000000..0af7f43 --- /dev/null +++ b/notebooks/Project 1 Results - Multinomial NB.ipynb @@ -0,0 +1,418 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Results for Multinomial Naive Bayes" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import os\n", + "import pickle\n", + "import numpy as np\n", + "from scipy import sparse\n", + "from sklearn.externals import joblib\n", + "from sklearn.cross_validation import KFold\n", + "from sklearn.metrics import confusion_matrix\n", + "from sklearn.cross_validation import train_test_split\n", + "from midi_ml.models.linear_decision_rules import NaiveBayesClassifier" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "labels = joblib.load(\"/home/jovyan/persistent_data/data/dumps/labeled_corpus_labels.pkl\")\n", + "features = joblib.load(\"/home/jovyan/persistent_data/data/dumps/labeled_corpus_matrix.pkl\")\n", + "features = features.todense()\n", + "bach_labels = [k for k in range(len(labels)) if labels[k] == \"bach-js\"]\n", + "mozart_labels = [k for k in range(len(labels)) if labels[k] == \"mozart\"]\n", + "X = features[bach_labels + mozart_labels].A\n", + "y = np.array([1 for i in range(len(bach_labels))] + [0 for i in range(len(mozart_labels))])\n", + "y = y.reshape((y.shape[0],))\n", + "del features" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(3027, 16384)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Train Models" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "predicted = []\n", + "actuals = []\n", + "nb_models = []\n", + "i = 0\n", + "for train_idx, test_idx in KFold(n=X.shape[0], n_folds=5, shuffle=True):\n", + " X_train = X[train_idx]\n", + " X_test = X[test_idx]\n", + " y_train = y[train_idx]\n", + " y_test = y[test_idx]\n", + " nb = NaiveBayesClassifier(X_train, y_train,\n", + " parametric_form=\"multinomial\", keep_copy_of_X=False)\n", + " try:\n", + " nb.fit()\n", + " except:\n", + " continue\n", + " \n", + " preds = nb.predict(X_test)\n", + " predicted.append(preds)\n", + " actuals.append(y_test)\n", + " nb_models.append(nb)\n", + " pickle.dump(nb_models, open(\"./dumps/multinomial_nb/nb_model_fold_{fold}.pkl\"\n", + " .format(fold=str(i)), 'wb'))\n", + " pickle.dump(predicted, open(\"./dumps/multinomial_nb/predicted_fold_{fold}.pkl\"\n", + " .format(fold=str(i)), 'wb'))\n", + " pickle.dump(actuals, open(\"./dumps/multinomial_nb/actuals_fold_{fold}.pkl\"\n", + " .format(fold=str(i)), 'wb'))\n", + " i += 1" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn.metrics import precision_score, recall_score, f1_score, accuracy_score" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['predicted_fold_0.pkl',\n", + " 'actuals_fold_2.pkl',\n", + " 'predicted_fold_1.pkl',\n", + " 'nb_model_fold_1.pkl',\n", + " 'actuals_fold_4.pkl',\n", + " 'predicted_fold_3.pkl',\n", + " 'predicted_fold_4.pkl',\n", + " 'predicted_fold_2.pkl',\n", + " 'actuals_fold_0.pkl',\n", + " 'nb_model_fold_2.pkl',\n", + " 'nb_model_fold_4.pkl',\n", + " 'actuals_fold_3.pkl',\n", + " 'nb_model_fold_3.pkl',\n", + " 'actuals_fold_1.pkl',\n", + " 'nb_model_fold_0.pkl']" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_folder = \"./dumps/multinomial_nb/\"\n", + "os.listdir(model_folder)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "predicted = pickle.load(open(model_folder + \"predicted_fold_4.pkl\", 'rb'))\n", + "actuals = pickle.load(open(model_folder + \"actuals_fold_4.pkl\", 'rb'))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "confusion matrix\n", + "[[100 44]\n", + " [ 78 384]]\n", + "\taccuracy\n", + "\t\t 0.798679867987\n", + "\tf1\n", + "\t\t 0.862921348315\n", + "\trecall\n", + "\t\t 0.831168831169\n", + "\tprecision\n", + "\t\t 0.897196261682\n", + "\tmcc\n", + "\t\t 0.491175475206\n", + "confusion matrix\n", + "[[108 35]\n", + " [ 95 368]]\n", + "\taccuracy\n", + "\t\t 0.785478547855\n", + "\tf1\n", + "\t\t 0.849884526559\n", + "\trecall\n", + "\t\t 0.794816414687\n", + "\tprecision\n", + "\t\t 0.913151364764\n", + "\tmcc\n", + "\t\t 0.494844742462\n", + "confusion matrix\n", + "[[ 80 48]\n", + " [ 81 396]]\n", + "\taccuracy\n", + "\t\t 0.786776859504\n", + "\tf1\n", + "\t\t 0.85993485342\n", + "\trecall\n", + "\t\t 0.830188679245\n", + "\tprecision\n", + "\t\t 0.891891891892\n", + "\tmcc\n", + "\t\t 0.420679359178\n", + "confusion matrix\n", + "[[114 33]\n", + " [ 81 377]]\n", + "\taccuracy\n", + "\t\t 0.811570247934\n", + "\tf1\n", + "\t\t 0.86866359447\n", + "\trecall\n", + "\t\t 0.823144104803\n", + "\tprecision\n", + "\t\t 0.919512195122\n", + "\tmcc\n", + "\t\t 0.549361582055\n", + "confusion matrix\n", + "[[104 45]\n", + " [ 72 384]]\n", + "\taccuracy\n", + "\t\t 0.806611570248\n", + "\tf1\n", + "\t\t 0.867796610169\n", + "\trecall\n", + "\t\t 0.842105263158\n", + "\tprecision\n", + "\t\t 0.895104895105\n", + "\tmcc\n", + "\t\t 0.512339914643\n" + ] + } + ], + "source": [ + "accuracy = []\n", + "precision = []\n", + "recall = []\n", + "f1 = []\n", + "mcc = []\n", + "predicted = pickle.load(open(model_folder + \"predicted_fold_4.pkl\", 'rb'))\n", + "actuals = pickle.load(open(model_folder + \"actuals_fold_4.pkl\", 'rb'))\n", + "for pred, actual in zip(predicted, actuals):\n", + " print(\"confusion matrix\")\n", + " print(confusion_matrix(actual, pred))\n", + " print(\"\\taccuracy\")\n", + " acc = accuracy_score(actual, pred)\n", + " accuracy.append(acc)\n", + " print(\"\\t\\t\", acc)\n", + " print(\"\\tf1\")\n", + " f = f1_score(actual, pred)\n", + " f1.append(f)\n", + " print(\"\\t\\t\", f)\n", + " print(\"\\trecall\")\n", + " r = recall_score(actual, pred)\n", + " recall.append(r)\n", + " print(\"\\t\\t\", r)\n", + " print(\"\\tprecision\")\n", + " p = precision_score(actual, pred)\n", + " precision.append(p)\n", + " print(\"\\t\\t\", p)\n", + " print(\"\\tmcc\")\n", + " m = matthews_corrcoef(actual, pred)\n", + " mcc.append(m)\n", + " print(\"\\t\\t\", m)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn.metrics import matthews_corrcoef" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.79782341870550688" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.mean(accuracy)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.420679359178\n", + "0.493680214709\n", + "0.549361582055\n" + ] + } + ], + "source": [ + "print(np.min(mcc))\n", + "print(np.mean(mcc))\n", + "print(np.max(mcc))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.785478547855\n", + "0.797823418706\n", + "0.811570247934\n" + ] + } + ], + "source": [ + "print(np.min(accuracy))\n", + "print(np.mean(accuracy))\n", + "print(np.max(accuracy))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "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.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/notebooks/Project 1 Results - PCA - Logistic Regression - Normal.ipynb b/notebooks/Project 1 Results - PCA - Logistic Regression - Normal.ipynb new file mode 100644 index 0000000..8a9b19c --- /dev/null +++ b/notebooks/Project 1 Results - PCA - Logistic Regression - Normal.ipynb @@ -0,0 +1,924 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Results for Logistic Regression on Principal Components" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import os\n", + "import pickle\n", + "import numpy as np\n", + "from scipy import sparse\n", + "from sklearn.externals import joblib\n", + "from sklearn.cross_validation import KFold\n", + "from sklearn.metrics import confusion_matrix\n", + "from sklearn.cross_validation import train_test_split\n", + "from midi_ml.models.decomposition import PrincipalComponents\n", + "from midi_ml.models.linear_decision_rules import PenalizedLogisticRegression" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "labels = joblib.load(\"/home/jovyan/persistent_data/data/dumps/labeled_corpus_labels.pkl\")\n", + "features = joblib.load(\"/home/jovyan/persistent_data/data/dumps/labeled_corpus_matrix.pkl\")\n", + "features = features.todense()\n", + "bach_labels = [k for k in range(len(labels)) if labels[k] == \"bach-js\"]\n", + "mozart_labels = [k for k in range(len(labels)) if labels[k] == \"mozart\"]\n", + "X = features[bach_labels + mozart_labels].A\n", + "y = np.array([1 for i in range(len(bach_labels))] + [0 for i in range(len(mozart_labels))])\n", + "y = y.reshape((y.shape[0],))\n", + "del features" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# How Many PCs to Keep?" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "pc = PrincipalComponents(X, method=\"svd\")\n", + "pc.fit()" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nQ4caY8aMsd1mvLOHihUrGt98841d2/3G9urVq4afn5/x1Vdf2focP37cqFixonHw4EFT9+9yM8M3\nb97UkSNHFBgYaGuzWCyqW7euDhw4kIWVwRmuXr0qi8Uib29vSdKZM2cUFRWlOnXq2Pp4enqqWrVq\njP9jbMqUKQoKCrJ7X0uMd3bz3XffqUqVKvrnP/+punXr6sUXX9T69ett2xnv7CUgIEARERE6efKk\nJOm3337Tzz//rEaNGklivLOzjIzt4cOHlZSUZPd7/x//+IeKFy+uX375xdT95XRM2Y+PmJgYJSUl\nqXDhwnbtPj4+aa4txePLMAxNnz5dNWrUULly5SRJUVFRslgsaY5/VFRUVpSJh7R161YdPXpUGzZs\nSLWN8c5ezpw5o7Vr16p379567bXXdOjQIU2bNk3u7u5q164d453N9O/fX3FxcXr++efl5uam5ORk\nDR8+XK1atZLE+zs7y8jYXrp0Se7u7vL09Ey3T0a5XBiG65g0aZL++OMPrV27NqtLgZOcO3dO06dP\n18qVK+Xu7p7V5cDJkpOT5e/vr+HDh0uSrFar/ve//+mjjz5Su3btsrg6ONq2bdu0ZcsWzZ07V+XK\nldPRo0f11ltvqUiRIow3HMrllkkULFhQbm5uqf7VcOnSpVT/AsHja8qUKfr++++1Zs0aFSlSxNZe\nuHBhGYbB+GcTv/76q6Kjo9W+fXv5+fnJz89P+/bt0+rVq1WlShXGO5spUqSIypYta9dWtmxZRUZG\nSuL9nd3MmjVLr776qp5//nmVL19ebdu2Va9evRQWFiaJ8c7OMjK2hQsX1s2bNxUXF5dun4xyuTDs\n7u4uPz8/RURE2NoMw1BERIQCAgKysDI4ypQpU7Rjxw6tXr1axYsXt9tWqlQpFS5cWD/++KOtLS4u\nTgcPHmT8H0N169bV559/rk2bNmnz5s3avHmzqlSporZt22rz5s2MdzYTEBCQajnbiRMnbO9zxjt7\niY+Pl5ubm11bjhw5lJycLInxzs4yMrZVqlSRm5ubXZ77888/9ffff5sef7dJkyZNckjlj5F8+fJp\n4cKFKlasmNzd3TV//nz9/vvveuutt+Th4ZHV5eEhTJo0SVu2bNHChQvl6+ur69ev6/r163Jzc1PO\nnLdXBSUlJSksLExly5ZVYmKipk2bpsTERAUHB6f6xYtHm7u7uwoVKmT33+eff65SpUqpbdu2khjv\n7KR48eJavHix3NzcVKRIEX3//fdavHixhg8frgoVKkhivLOTP//8Uxs3btRTTz0ld3d37dmzR/Pm\nzVPbtm1tX5pivB9f169f1/Hjx3Xx4kWtW7dO/v7+ypMnj27evKn8+fPfd2xz5cqlCxcuKDw8XFar\nVbGxsQoJCVHx4sU1aNAgU7VYDMMwnPQ4H2nh4eFavny5oqKiVKlSJQUHB6tq1apZXRYektVqTfN8\nhTNmzLBbY7Zo0SKtW7dOV69e1TPPPKM333xTTz75ZGaWCid55ZVXVKlSJY0fP97WxnhnHzt37tTs\n2bN1+vRplSxZUr1799ZLL71k14fxzh6uX7+uBQsW6Ouvv1Z0dLSKFCmi1q1ba9CgQbbJDYnxflzt\n3btXr7zySqq/2e3atbNdOOl+Y5uYmKi3335bW7ZsUWJioho0aKCQkBD5+PiYqsVlwzAAAADgcmuG\nAQAAgBSEYQAAALgswjAAAABcFmEYAAAALoswDAAAAJdFGAYAAIDLIgwDAADAZRGGAQAA4LIIwwAA\nAHBZhGFkmdDQUFmtVtt/gYGB6tmzp3766acM7W+1WrVy5UqH1zV+/Hi1adPG4ceVbl9+0mq16siR\nI/ftGx0drZkzZ6p58+by9/dXjRo11KNHD33yySdKTk52Sn3ZzW+//abQ0FAlJCRkdSkZcvbsWVmt\nVn311VdOOf5vv/0mq9Wqffv2ZVkNGeWs93dWWLRokQICArK6DA0aNEivvPJKVpfhFO3atbO7BLsz\nf48j+8l5/y6A83h4eOj999+XJJ07d05LlixR7969tXHjRpUrV+6e+3788ccqXry4w2saNGiQ4uPj\nHX7cFHdfhz0tp06d0iuvvCLDMNSnTx9VrlxZiYmJ+vHHHzVz5kwVKlRIQUFBTqsxuzh69KgWL16s\n7t27K3fu3FldziMhI6+/R4Gz3t9ZwWKxPBLP+6NQQ2Zx9u9xZC+EYWQpi8Uif39/SZK/v7+qVq2q\noKAgffTRRwoODk5zn4SEBOXOndu2n6OVKlXKKcc1Y/To0UpOTtann34qX19fW3v9+vXVvXt3Xb16\nNQure3wYhmH3f0dLeS0+Tpz1XDias97fcA2Pwu9xPD5YJoFHSrFixVSwYEH99ddfkqRPP/1UVqtV\nBw4cUJ8+fRQQEKBZs2ZJSv0xao8ePTRw4EBt375dLVq0UEBAgHr27KkzZ87Y3UdiYqLmzZunJk2a\nqGrVqmrUqJHdx2vjxo2z+3gtpYaDBw+qZ8+eql69uoKCgrRhwwa74x44cECvvfaaGjRooICAALVr\n106bN282/Rz89NNPOnz4sAYOHGgXhFMULVpU5cuXt93et2+fOnfurGrVqqlOnTqaMGGCLl++bNue\n8rH35s2bFRISopo1a6pu3bpatWqVJGnr1q1q0aKFatSooaFDhyouLs62b8qyjp07d2ro0KEKCAhQ\n/fr19d5776WqK6N1fPbZZ5o6dapq1aql+vXr6+2330617OP48eN67bXX9MwzzyggIEADBgxINY5W\nq1XLli1TaGio6tWrpzp16mj8+PG6ceOGJGnjxo2aMGGCJCkwMFBWq1WNGzeWJF29elXBwcFq2LCh\n/P399eyzz2rUqFH3HJeUj7oPHTpke5wffvihJGn27Nlq06aNAgIC1LBhQ40aNUoXL1602z+jr8+7\nHTlyRIGBgZo4caKt7erVq5o0aZLq16+vqlWrqn379tq1a1eqfZcsWaL69esrICBAw4YN06VLl+55\nX3e6fv26Jk6cqGeeeUa1a9fWzJkzbeMUExOjqlWrav369an269ixo0aMGHHPY2d0fO9eJhEaGmp7\nPMOHD1dERESayz6WL1+u5s2bq2rVqmrSpInttZ4iZSz/97//qWvXrqpevbratGmjH374wdYnvY/Z\nv/vuO1mtVp08eVKStGnTJnXt2lW1a9dWrVq11KNHDx06dOiejz/ld0psbKxd+90f9UvSL7/8op49\neyogIEDPPPOMRo0apejo6HseX7r9HHfv3l3+/v5q1qyZNm3alG6/+43FJ598otatW6tatWqqXbu2\nunXrpl9//dW23TAMrVy5Ui1btlTVqlVVv359DR8+3O53iSPe0yl+/vlntW/fXv7+/mrTpo2+//77\nVI8rvd/jR48e1auvvqqAgAA1b948zeclo68zZB+EYTxS4uLidPnyZRUpUkTS//9Yb/To0apTp47e\ne+89tW3bNt39jx49qhUrVmj06NF6++23dfr0aY0ZM8auz9ChQ7V69Wp17NhRYWFhGjt2rN3HaXd/\nlJhye+TIkapXr54WL16sOnXqKDg42O6P59mzZxUQEKBp06bpX//6l5o3b67g4OB0/wilZ9++fbJY\nLGrQoMF9+/7666/q06eP8ufPr4ULF2rMmDH67rvv1L9//1QzgAsWLJCHh4cWLlyo559/XjNnztTc\nuXO1Zs0ajR07ViEhIfrxxx/1zjvvpLqfkJAQlS5dWqGhoXrhhRc0b948rVu37oHqmD9/vnLkyKEF\nCxaoS5cuWrlypV2oOnPmjLp06aKrV6/q7bff1pw5cxQdHa1evXrp5s2bdsf68MMPderUKb399tsa\nMmSItmzZoiVLlkiSGjVqpNdee02StGLFCn388cdavHixJGn69OnauXOnRo0apRUrVuj1119Xrly5\n7vlcWywW3bx5U2PGjFHbtm21dOlS1atXT5J06dIlDRgwQGFhYQoODtbZs2fVo0ePVCE/I6/PO+3f\nv1+9evVSmzZt9NZbb0mSbt68qV69eun777/XqFGj9K9//UvlypXTgAEDdOzYMdu+H3zwgRYuXKh2\n7dopNDRUJUuW1MSJEzP8Ufm8efNkGIYWLFigvn376oMPPtD8+fMlSQULFlTTpk1T/YPw2LFjOnz4\nsDp27Jjucc2M751Wr16txYsXq0OHDlq8eLFKly6d5uOZNm2aQkND1aFDB4WFhal9+/aaPXu23evV\nYrHo1q1bGjNmjNq3b6/FixerUKFCGjZsmO0fcK1atdIff/yhP/74w+74W7dulZ+fn8qUKSPp9vu+\nbdu2mj9/vubMmaMSJUqoR48eOnXqVLqPJaPLJn755Re98sorKlCggObPn6+pU6fq119/1aBBg+65\nX2Jiovr06aPo6GjNnj1bo0aNUlhYmA4fPmzXLyNjsW/fPgUHB+vZZ5/V0qVL9c477ygwMNDu06kp\nU6Zozpw5CgoK0nvvvaeQkBDly5dP169fz/D9pLjXe1qSoqKi1K9fP+XJk0cLFy5U3759NWnSJJ0/\nfz7Vc5zW7TFjxqh+/fpasmSJKleurAkTJujPP/+09cvo6wzZjAFkkUWLFhkBAQHGrVu3jFu3bhln\nzpwxhgwZYlitVmPXrl2GYRjGp59+alSsWNFYtmxZqv0rVqxorFixwna7e/fuRkBAgBETE2Nr+/TT\nTw2r1WqcO3fOMAzD+OGHH4yKFSsaW7duTbeucePGGa1bt7Y7RsWKFY1FixbZ9evevbvx8ssvp3uc\nW7duGW+88YbRuXNnW9uePXsMq9Vq/Prrr+nuFxISYlitViMxMTHdPikGDx5sPPfcc8atW7dsbSmP\n8bvvvjMMwzD++usvo2LFisbIkSNtfZKSkox69eoZAQEBxuXLl23tM2fONGrVqmVXb8WKFY1x48bZ\n3e/rr79uNGrU6IHqGDFihN2xunfvbvTu3dvu2E2bNrV7/JcuXTICAgKMDz/80NZWsWLFVM//uHHj\njGbNmtlup4z/na8JwzCM1q1bGzNnzjTMWLRokWG1Wo0vvvjinv2SkpKMc+fOGRUrVrS9jlMe5/1e\nnynP0fbt241du3YZ1atXN+bNm2d3/E8++cTw8/Mzjh8/btfeqVMnY/jw4bYaGjRokOa4Wa1WY+/e\nvenWn1JD9+7d7doXLFhgVK9e3bhy5YphGIaxe/duw2q12tUxY8YM47nnnrvn82NmfFPe30lJSUb9\n+vWN4OBgu2NNnDjR7vGcPn3asFqtxscff2zXb/bs2Ub9+vVtt1PG8vvvv0/1uD/77DPDMG6/fwMD\nA+2e//j4eCMgIMBYuXJlmo8tOTnZuHXrltGiRQtj7ty5dvcXEBBgu53e6/KFF16wG7Nu3boZXbt2\ntevzxx9/GFar1di5c2eaNRiGYXz44YdG5cqVjdOnT9vaTp06ZVSqVMno0aOHrS0jY7F8+XKjdu3a\n6d7XiRMnDKvVaoSFhaXbx5Hv6VmzZhk1atQw4uLibG0RERGpfk+l93t87dq1trbr168b1atXN959\n913DMDL+OkP2w8wwstT169fl5+cnPz8/NWnSRHv37tWbb76punXr2vpYLBY1atQoQ8erVKmSvL29\nbbfLli0rSbZZgx9//FEeHh5q2bKlqTotFouaNGli19asWTMdOXLENvN55coVTZs2TUFBQbbH9PHH\nH9s+TjUrIzMR+/fvV+PGjeXm5mZrq1evnry8vLR//367voGBgbafc+TIoZIlS6pSpUry8vKytT/1\n1FO6cuVKqi+epCwvSNG8eXOdP39e586dM13HnWMrSeXKlbMdR5J27dqloKAg5ciRQ0lJSUpKSpKX\nl5cqV66cambrzsck3R7vO4+VnsqVK2vjxo1asWKF3WxqRqT1Wty5c6c6d+6sZ555RpUrV1ajRo1k\nsVh04sQJu373e32m+O677zRw4EANGjRIw4cPt9u2e/duVahQQU8++aTt+bl165bq1q1re37OnTun\nCxcupDluGXX367158+aKj4/X77//Lun2c1+yZEnb7HBSUpI+//xztW/f/p7HNTO+Kc6dO6eLFy/q\nueees2u/+/Ht2rVLFotFzZo1sx07KSlJgYGBunjxoiIjI219c+TIYff6KVGihPLkyWN7/bi5ualF\nixb64osvbH2+/fZb3bhxQ88//7yt7fjx4xo8eLDq1aunSpUqyc/PTydPnnzg932KGzdu6JdfflHz\n5s3tHsuTTz6pYsWKpftcSdKhQ4dUvnx5u3WzpUuXltVqteuXkbGoXLmyLl++rPHjx2v37t2pliz8\n+OOPkqQOHTqkW48j39OHDh1S7dq1lS9fPltbnTp1VKBAgXTvP4XFYrF9miPd/gJ38eLFbcfP6OsM\n2Q9foEOW8vDwUHh4uKTbH70WK1YszX4+Pj4ZOl7+/PntbufKlUuGYdhOrRUbG2tbgmFWoUKFUtV0\n69YtxcTEqFChQho7dqwOHjyowYMHq1y5cvL09NSHH35o98c0I5544glJUmRk5H2/BHLlyhUVLlw4\nVbuPj4/del1JdqFXktzd3e3+oKS0Sbe/GObh4SHp9h+Qu5//woULyzAMXbhwQUWLFn3oOu489Vls\nbKzef//9VOs8LRZLqqUMaR0rMTExVR13e+ONN+Tt7a2VK1fqnXfeUbFixdS/f3916dLlnvvlyZPH\n9rykOHz4sAYPHqwmTZpowIABtueqU6dOqWq53+szxXfffZfuP9piYmL03//+V35+fqm25cx5+1f6\nxYsX7zluGZHWvinHTtGxY0etXr1ao0aN0nfffaeYmBi9+OKL9zyumfFNkfJ40noP3vl4YmNjlZyc\nrNq1a6c6hsViUWRkpO13TO7cuW3PV4q7X4utWrXShx9+qMOHD6tq1aratm2batSoYXuPXrt2TX36\n9JGPj4/Gjx+v4sWLK3fu3Jo4ceJDn87v8uXLSkpK0owZMzR9+vRUj+Ve/+i7ePFimr8zfXx8TL/X\n6tSpo3feeUerV69Wv379lCtXLjVv3lwTJ06Ul5eXYmNj5ebmlmps7uTI9/TFixdtS1TufmwZcfd7\n8M4xz+jrDNkPYRhZymKxqHLlyhnq5wje3t66cOHCA+0bHR1tF6QvXbqknDlzqmDBgkpMTNTOnTs1\nYcIEdevWzdbnQc4HXKtWLRmGof/85z/q2rXrPfsWKFAgzS9FXbp0KUMzJRlhGEaq+4iKipLFYrGF\nAkfWUaBAAT377LPq1q1bqj9Ad4f3B+Xp6anx48dr/PjxOnbsmFavXq3JkyerQoUKqlGjRrr7pfU6\n/Oabb5Q/f37belpJ+vvvvx+qvnHjxmn9+vXq2bOnwsPDbc+zdPv5sVqtmj59erp/oH19fe85bhmR\n1r4px07Rvn17LVy4UN9++602bNig2rVrq0SJEvc87oOMb8rjufuLY5cuXbJ7PAUKFFDKl2+6AAAI\n00lEQVSOHDm0du3aVEFXuv3Jhxk1atRQsWLFtG3bNj311FP6/vvv7c5yc+DAAV24cEFLly5VhQoV\nbO1Xr15V0aJF0z1uyhlI7l4ve+XKFdvPXl5eslgsGjhwYKpZeun25EF6fH19dfTo0VTtly5dkqen\np+12RseiTZs2atOmjWJjY7Vjxw5Nnz5d7u7umjZtmry9vZWUlKTo6Oh0A7Ej39O+vr7p/q55WBl9\nnSH7YZkEXErdunV148YN07O1hmHo66+/tmvbvn27/Pz8ZLFYlJiYqOTkZLs/wHFxcfr2229N11ij\nRg35+/vrvffeS3VGAun2R3n/+9//bH2/+eYbu9C9a9cuXblyRc8884zp+07PN998Y3f7yy+/VJEi\nRWwhzZF1BAYG6tixY7aPnO/8L60ZoXu5c6Y7PeXLl9e4ceMkye6LNBl148aNVMHrs88+e6g/nnnz\n5lVYWJi8vb3Vs2dPuz/OdevW1ZkzZ+Tr65vq+UmZLS5atKh8fX3THLeMSmtfDw8PVaxY0dZWuHBh\nPfvss1q2bJn+85//6KWXXrrvcR9kfIsWLarChQtrx44ddu13vydTPmKPiYlJ87nJmzdvRh66nZYt\nW+qLL77Q9u3blZycrGbNmtm2pSwZuHP8f/75Z509e/aex3ziiSdkGIaOHz9uazt+/LjdMg4PDw9V\nr15dx48fT/Ox3OsczP7+/jp27Jjd2RpOnTql3377za6f2bHw9vZWhw4dVK9ePVvtderUkXT7bA3p\nceR72t/fX3v27LE7U0VERESqT6AeREZfZ8h+mBmGSwkMDFTDhg01YcIEnT59Wv7+/oqNjdVXX32l\nefPm3XPfTZs2KXfu3KpcubK2bt2q/fv3KywsTNLtmcaqVasqLCxMBQsWlJubm5YuXSovL69UMxYZ\n+bht9uzZeuWVV9ShQwf17t1bfn5+SkxM1N69e/Xhhx/qnXfeUYUKFTRw4EB16dJF/fv3V48ePXTx\n4kXNnTtX1atXV8OGDR/8ibpLylkm6tWrpx9++EGff/65QkJCbNsdWcewYcPUsWNH9enTR506dVLh\nwoV18eJF7du3TzVr1jS13jtlTW54eLiaNGmiPHnyqEKFCurSpYuaNm2q8uXLy83NTRs3blSuXLnu\nOSucnrp162r16tWaOnWqmjRpogMHDjzQKfXuli9fPq1YsUKvvPKKevbsqTVr1sjb21svvPCC1q1b\np+7du6tv374qU6aMrly5oqNHj+rWrVsaMWKEcuTIof79+2v69OkqVKiQbdz27t2b4fs/ffq0xo8f\nr1atWunIkSNaunSpevfunepj5o4dO2rAgAEqUKCAmjZtet/jPsj45siRQwMGDND06dPl4+Oj2rVr\na8+ePbb1qin/8ChTpoy6du2qMWPGqG/fvqpWrZpu3rypEydOaO/evbaziZjRunVrLV++XAsWLFD9\n+vXt1nxXr15dHh4emjx5svr3769z584pNDT0nrPCklStWjUVK1ZMM2bM0MiRI3X16lUtXbo01Wzv\n66+/rl69emnEiBFq1aqVvLy8FBkZqYiICHXo0EE1a9ZM8/jt27fXu+++q/79++uf//ynDMPQokWL\nUp2qMSNjsWjRIsXGxqpWrVry8fHR77//rv/85z/q06eP7Tnv3Lmz5s+fr9jYWAUGBio+Pt52OsYi\nRYo49D2d8mlJv3791L9/f12+fFmLFi2650x5RmX0dYbshzCMLPUwv1zSOj1RWse7u23RokVavHix\n1q1bp9DQUBUuXFj169e/5z4Wi0Vz587V7NmztWTJEhUqVEhTp061O/3Z3Llz9eabb2rcuHEqWLCg\nevTooWvXrmnFihX3rfFupUuX1qeffqqlS5fqo48+UmRkpHLlyqVKlSopODjY9gUPPz8/rVixQnPm\nzNGwYcPk4eGhxo0ba+zYsXb3k959ZqQWi8WiyZMna926dVq7dq3y5cun4cOHq3PnzrY+jqyjdOnS\nWr9+vebPn68pU6bo+vXr8vX1Vc2aNe1mJTNyeqpKlSppyJAh+uSTT7R8+XIVLVpUO3bs0NNPP63N\nmzfrr7/+Uo4cOVShQgW99957+sc//nHf5+JujRo10ujRo/XBBx/o008/VY0aNRQWFpbml9Uy8vq8\n87aXl5ctEPft21fvv/++PD099f7/tXf3LI1EYRiGn0VFYqWIjI0hUypYqCBIsLfIP9BBCLFRiygo\nKEKCIUWwEb8IGJRRSEwIFlZpUoex8g8I2mrnR5VitxADwyZZEd3Cc19tmDmZM2/gyfCeM66rg4MD\nZbNZPT4+qq+vTyMjI76eZ8dx9Pz8rHw+r0KhoHA4rHQ6rVgs1vYa37/DysqKPM9TPB5XR0eH5ubm\n/lrMJ0nT09MKBAKKRCL/3J5O+vz9dRxHT09PKhQKOj8/Vzgc1tramlZXV30BfWtrS7Ztq1gs6ujo\nSD09PbJtWzMzMy3nudWY0lsN2batu7s7RSIR32f9/f3a29tTJpPR0tKSQqGQtre3dXx83PTc7zo7\nO3V4eKhkMql4PK5gMKiNjQ1lMhnfMWNjY8rn89rf39fm5qbq9bosy9LU1JSCwWDLOe7u7tbp6amS\nyaTW19dlWZYWFxdVrVZ9rRgfuRejo6M6OztTpVLRy8uLBgcHFYvFGtsWSm9bLw4NDalUKsl1XfX2\n9mpycrLRAvGVv+mBgQHlcjml0+nG3CUSCV+bUrM5b+WzdYaf5ddvusKBtt5f3lCr1XxPhUxwfX2t\n+fl5lcvlpgu2gFqtpmg0qsvLSw0PD//XsXd3d+W6rjzP+1AQBz6DOvv5eDIMoC3+L6OZh4cH3d/f\na2dnRxMTE98ehG9vb3V1daXx8XF1dXXJ8zydnJxodnaWgIIvQ52ZiTAMoC365NBMqVRqvMUrlUp9\n+3iBQEA3Nze6uLjQ6+urLMvSwsKClpeXv31smIM6MxNtEgAAADAWW6sBAADAWIRhAAAAGIswDAAA\nAGMRhgEAAGAswjAAAACMRRgGAACAsQjDAAAAMBZhGAAAAMb6A+81oIC+Rm7kAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8,6))\n", + "sns.set_style(\"whitegrid\")\n", + "plt.plot((pc.eigenvalues_.cumsum() / pc.eigenvalues_.sum())[:100],\n", + " color=\"gray\")\n", + "plt.ylim(0,1)\n", + "plt.ylabel(\"Cumulative percentage of variance explained\")\n", + "plt.xlabel(\"Principal Components ranked by eigenvalue descending\")\n", + "plt.title(\"Principal Components - Variance Explained\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "NUM_COMPONENTS=100" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Train Models" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model-fitting complete\n", + "Model-fitting complete\n", + "Model-fitting complete\n", + "Model-fitting complete\n", + "Model-fitting complete\n" + ] + } + ], + "source": [ + "regularization_parameter = 10\n", + "predicted = []\n", + "actuals = []\n", + "pc_models = []\n", + "lr_models = []\n", + "i = 0\n", + "for train_idx, test_idx in KFold(n=X.shape[0], n_folds=5, shuffle=True):\n", + " X_train = X[train_idx]\n", + " X_test = X[test_idx]\n", + " y_train = y[train_idx]\n", + " y_test = y[test_idx]\n", + " pc = PrincipalComponents(X_train, method=\"svd\", keep_copy_of_X=False, num_components=NUM_COMPONENTS)\n", + " \n", + " try:\n", + " pc.fit()\n", + " except:\n", + " continue\n", + "\n", + " lr = PenalizedLogisticRegression(pc.transform(X_train), y_train, l2_penalty=regularization_parameter)\n", + " \n", + " try:\n", + " lr.fit()\n", + " except:\n", + " continue\n", + " \n", + " preds = (lr.predict_probabilities(pc.transform(X_test)) > 0.5).astype(int)\n", + " predicted.append(preds)\n", + " actuals.append(y_test)\n", + " pc_models.append(pc)\n", + " lr_models.append(lr)\n", + " pickle.dump(pc_models, open(\"./dumps/pca/logistic/pc_model_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(lr_models, open(\"./dumps/pca/logistic/lr_model_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(predicted, open(\"./dumps/pca/logistic/predicted_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(actuals, open(\"./dumps/pca/logistic/actuals_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " i += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model-fitting complete\n", + "Model-fitting complete\n", + "Model-fitting complete\n", + "Model-fitting complete\n", + "Model-fitting complete\n" + ] + } + ], + "source": [ + "regularization_parameter = 1\n", + "predicted = []\n", + "actuals = []\n", + "pc_models = []\n", + "lr_models = []\n", + "i = 0\n", + "for train_idx, test_idx in KFold(n=X.shape[0], n_folds=5, shuffle=True):\n", + " X_train = X[train_idx]\n", + " X_test = X[test_idx]\n", + " y_train = y[train_idx]\n", + " y_test = y[test_idx]\n", + " pc = PrincipalComponents(X_train, method=\"svd\", keep_copy_of_X=False, num_components=NUM_COMPONENTS)\n", + " \n", + " try:\n", + " pc.fit()\n", + " except:\n", + " continue\n", + "\n", + " lr = PenalizedLogisticRegression(pc.transform(X_train), y_train, l2_penalty=regularization_parameter)\n", + " \n", + " try:\n", + " lr.fit()\n", + " except:\n", + " continue\n", + " \n", + " preds = (lr.predict_probabilities(pc.transform(X_test)) > 0.5).astype(int)\n", + " predicted.append(preds)\n", + " actuals.append(y_test)\n", + " pc_models.append(pc)\n", + " lr_models.append(lr)\n", + " pickle.dump(pc_models, open(\"./dumps/pca/logistic/pc_model_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(lr_models, open(\"./dumps/pca/logistic/lr_model_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(predicted, open(\"./dumps/pca/logistic/predicted_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(actuals, open(\"./dumps/pca/logistic/actuals_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " i += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model-fitting complete\n", + "Model-fitting complete\n", + "Model-fitting complete\n", + "Model-fitting complete\n", + "Model-fitting complete\n" + ] + } + ], + "source": [ + "regularization_parameter = 0.1\n", + "predicted = []\n", + "actuals = []\n", + "pc_models = []\n", + "lr_models = []\n", + "i = 0\n", + "for train_idx, test_idx in KFold(n=X.shape[0], n_folds=5, shuffle=True):\n", + " X_train = X[train_idx]\n", + " X_test = X[test_idx]\n", + " y_train = y[train_idx]\n", + " y_test = y[test_idx]\n", + " pc = PrincipalComponents(X_train, method=\"svd\", keep_copy_of_X=False, num_components=NUM_COMPONENTS)\n", + " \n", + " try:\n", + " pc.fit()\n", + " except:\n", + " continue\n", + "\n", + " lr = PenalizedLogisticRegression(pc.transform(X_train), y_train, l2_penalty=regularization_parameter)\n", + " \n", + " try:\n", + " lr.fit()\n", + " except:\n", + " continue\n", + " \n", + " preds = (lr.predict_probabilities(pc.transform(X_test)) > 0.5).astype(int)\n", + " predicted.append(preds)\n", + " actuals.append(y_test)\n", + " pc_models.append(pc)\n", + " lr_models.append(lr)\n", + " pickle.dump(pc_models, open(\"./dumps/pca/logistic/pc_model_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(lr_models, open(\"./dumps/pca/logistic/lr_model_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(predicted, open(\"./dumps/pca/logistic/predicted_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " pickle.dump(actuals, open(\"./dumps/pca/logistic/actuals_fold_{fold}_reg_{reg}.pkl\"\n", + " .format(fold=str(i), reg=str(regularization_parameter)), 'wb'))\n", + " i += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn.metrics import precision_score, recall_score, f1_score, accuracy_score, matthews_corrcoef" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['actuals_fold_4_reg_100.pkl',\n", + " 'pc_model_fold_0_reg_10.pkl',\n", + " 'pc_model_fold_3_reg_1000.pkl',\n", + " 'lr_model_fold_2.pkl',\n", + " 'lr_model_fold_1_reg_1000.pkl',\n", + " 'predicted_fold_0.pkl',\n", + " 'actuals_fold_4_reg_1000.pkl',\n", + " 'actuals_fold_3_reg_1000.pkl',\n", + " 'pc_model_fold_1_reg_1000.pkl',\n", + " 'pc_model_fold_1.pkl',\n", + " 'pc_model_fold_2_reg_100.pkl',\n", + " 'actuals_fold_4_reg_10.pkl',\n", + " 'predicted_fold_0_reg_100.pkl',\n", + " 'actuals_fold_2.pkl',\n", + " 'lr_model_fold_3_reg_1000.pkl',\n", + " 'actuals_fold_2_reg_1000.pkl',\n", + " 'predicted_fold_1.pkl',\n", + " 'actuals_fold_3_reg_100.pkl',\n", + " 'actuals_fold_2_reg_10.pkl',\n", + " 'pc_model_fold_3_reg_100.pkl',\n", + " 'predicted_fold_1_reg_10.pkl',\n", + " 'pc_model_fold_4.pkl',\n", + " 'lr_model_fold_3.pkl',\n", + " 'predicted_fold_4_reg_10.pkl',\n", + " 'lr_model_fold_4_reg_100.pkl',\n", + " 'lr_model_fold_2_reg_1000.pkl',\n", + " 'lr_model_fold_4_reg_10.pkl',\n", + " 'predicted_fold_2_reg_1000.pkl',\n", + " 'pc_model_fold_1_reg_100.pkl',\n", + " 'predicted_fold_2_reg_100.pkl',\n", + " 'pc_model_fold_3.pkl',\n", + " 'actuals_fold_4.pkl',\n", + " 'lr_model_fold_1.pkl',\n", + " 'predicted_fold_3_reg_1000.pkl',\n", + " 'lr_model_fold_2_reg_100.pkl',\n", + " 'lr_model_fold_3_reg_10.pkl',\n", + " 'actuals_fold_1_reg_10.pkl',\n", + " 'actuals_fold_2_reg_100.pkl',\n", + " 'pc_model_fold_2_reg_1000.pkl',\n", + " 'predicted_fold_3.pkl',\n", + " 'predicted_fold_4.pkl',\n", + " 'pc_model_fold_3_reg_10.pkl',\n", + " 'pc_model_fold_2_reg_10.pkl',\n", + " 'lr_model_fold_4.pkl',\n", + " 'predicted_fold_3_reg_100.pkl',\n", + " 'lr_model_fold_0_reg_100.pkl',\n", + " 'predicted_fold_2.pkl',\n", + " 'actuals_fold_0.pkl',\n", + " 'pc_model_fold_0_reg_1000.pkl',\n", + " 'lr_model_fold_2_reg_10.pkl',\n", + " 'lr_model_fold_3_reg_100.pkl',\n", + " 'predicted_fold_4_reg_100.pkl',\n", + " 'pc_model_fold_4_reg_100.pkl',\n", + " 'pc_model_fold_0.pkl',\n", + " 'lr_model_fold_1_reg_10.pkl',\n", + " 'lr_model_fold_1_reg_100.pkl',\n", + " 'predicted_fold_2_reg_10.pkl',\n", + " 'pc_model_fold_4_reg_10.pkl',\n", + " 'actuals_fold_3_reg_10.pkl',\n", + " 'predicted_fold_0_reg_1000.pkl',\n", + " 'pc_model_fold_0_reg_100.pkl',\n", + " 'predicted_fold_0_reg_10.pkl',\n", + " 'pc_model_fold_4_reg_1000.pkl',\n", + " 'lr_model_fold_0.pkl',\n", + " 'actuals_fold_0_reg_10.pkl',\n", + " 'actuals_fold_0_reg_1000.pkl',\n", + " 'actuals_fold_0_reg_100.pkl',\n", + " 'actuals_fold_3.pkl',\n", + " 'predicted_fold_1_reg_100.pkl',\n", + " 'pc_model_fold_2.pkl',\n", + " 'predicted_fold_1_reg_1000.pkl',\n", + " 'lr_model_fold_4_reg_1000.pkl',\n", + " 'predicted_fold_4_reg_1000.pkl',\n", + " 'actuals_fold_1.pkl',\n", + " 'lr_model_fold_0_reg_1000.pkl',\n", + " 'actuals_fold_1_reg_100.pkl',\n", + " 'predicted_fold_3_reg_10.pkl',\n", + " 'lr_model_fold_0_reg_10.pkl',\n", + " 'actuals_fold_1_reg_1000.pkl',\n", + " 'pc_model_fold_1_reg_10.pkl']" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_folder = \"./dumps/pca/logistic/\"\n", + "os.listdir(model_folder)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "regularizations = [0.1, 1, 10]" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, matthews_corrcoef" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Regularization: 0.1\n", + "confusion matrix\n", + "[[ 96 36]\n", + " [ 15 459]]\n", + "\taccuracy\n", + "\t\t 0.915841584158\n", + "\tf1\n", + "\t\t 0.947368421053\n", + "\trecall\n", + "\t\t 0.96835443038\n", + "\tprecision\n", + "\t\t 0.927272727273\n", + "\tmcc\n", + "\t\t 0.742315580928\n", + "confusion matrix\n", + "[[109 38]\n", + " [ 12 447]]\n", + "\taccuracy\n", + "\t\t 0.917491749175\n", + "\tf1\n", + "\t\t 0.947033898305\n", + "\trecall\n", + "\t\t 0.97385620915\n", + "\tprecision\n", + "\t\t 0.921649484536\n", + "\tmcc\n", + "\t\t 0.767046586883\n", + "confusion matrix\n", + "[[110 38]\n", + " [ 11 446]]\n", + "\taccuracy\n", + "\t\t 0.919008264463\n", + "\tf1\n", + "\t\t 0.947927736451\n", + "\trecall\n", + "\t\t 0.975929978118\n", + "\tprecision\n", + "\t\t 0.921487603306\n", + "\tmcc\n", + "\t\t 0.772871156373\n", + "confusion matrix\n", + "[[105 39]\n", + " [ 9 452]]\n", + "\taccuracy\n", + "\t\t 0.920661157025\n", + "\tf1\n", + "\t\t 0.949579831933\n", + "\trecall\n", + "\t\t 0.980477223427\n", + "\tprecision\n", + "\t\t 0.920570264766\n", + "\tmcc\n", + "\t\t 0.772821160524\n", + "confusion matrix\n", + "[[ 93 47]\n", + " [ 11 454]]\n", + "\taccuracy\n", + "\t\t 0.904132231405\n", + "\tf1\n", + "\t\t 0.939958592133\n", + "\trecall\n", + "\t\t 0.976344086022\n", + "\tprecision\n", + "\t\t 0.90618762475\n", + "\tmcc\n", + "\t\t 0.716080914351\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Regularization: 1\n", + "confusion matrix\n", + "[[ 95 38]\n", + " [ 11 462]]\n", + "\taccuracy\n", + "\t\t 0.919141914191\n", + "\tf1\n", + "\t\t 0.94964028777\n", + "\trecall\n", + "\t\t 0.976744186047\n", + "\tprecision\n", + "\t\t 0.924\n", + "\tmcc\n", + "\t\t 0.752861858426\n", + "confusion matrix\n", + "[[101 43]\n", + " [ 13 449]]\n", + "\taccuracy\n", + "\t\t 0.907590759076\n", + "\tf1\n", + "\t\t 0.941299790356\n", + "\trecall\n", + "\t\t 0.971861471861\n", + "\tprecision\n", + "\t\t 0.912601626016\n", + "\tmcc\n", + "\t\t 0.733236121581\n", + "confusion matrix\n", + "[[100 40]\n", + " [ 9 456]]\n", + "\taccuracy\n", + "\t\t 0.919008264463\n", + "\tf1\n", + "\t\t 0.94901144641\n", + "\trecall\n", + "\t\t 0.98064516129\n", + "\tprecision\n", + "\t\t 0.91935483871\n", + "\tmcc\n", + "\t\t 0.762567013088\n", + "confusion matrix\n", + "[[108 41]\n", + " [ 9 447]]\n", + "\taccuracy\n", + "\t\t 0.917355371901\n", + "\tf1\n", + "\t\t 0.947033898305\n", + "\trecall\n", + "\t\t 0.980263157895\n", + "\tprecision\n", + "\t\t 0.915983606557\n", + "\tmcc\n", + "\t\t 0.7691668849\n", + "confusion matrix\n", + "[[114 31]\n", + " [ 18 442]]\n", + "\taccuracy\n", + "\t\t 0.919008264463\n", + "\tf1\n", + "\t\t 0.947481243301\n", + "\trecall\n", + "\t\t 0.960869565217\n", + "\tprecision\n", + "\t\t 0.934460887949\n", + "\tmcc\n", + "\t\t 0.772165572181\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Regularization: 10\n", + "confusion matrix\n", + "[[103 39]\n", + " [ 10 454]]\n", + "\taccuracy\n", + "\t\t 0.919141914191\n", + "\tf1\n", + "\t\t 0.948798328109\n", + "\trecall\n", + "\t\t 0.978448275862\n", + "\tprecision\n", + "\t\t 0.920892494929\n", + "\tmcc\n", + "\t\t 0.765402688464\n", + "confusion matrix\n", + "[[102 47]\n", + " [ 9 448]]\n", + "\taccuracy\n", + "\t\t 0.907590759076\n", + "\tf1\n", + "\t\t 0.941176470588\n", + "\trecall\n", + "\t\t 0.980306345733\n", + "\tprecision\n", + "\t\t 0.905050505051\n", + "\tmcc\n", + "\t\t 0.740157170274\n", + "confusion matrix\n", + "[[108 39]\n", + " [ 11 447]]\n", + "\taccuracy\n", + "\t\t 0.917355371901\n", + "\tf1\n", + "\t\t 0.947033898305\n", + "\trecall\n", + "\t\t 0.975982532751\n", + "\tprecision\n", + "\t\t 0.91975308642\n", + "\tmcc\n", + "\t\t 0.766781614541\n", + "confusion matrix\n", + "[[ 96 45]\n", + " [ 5 459]]\n", + "\taccuracy\n", + "\t\t 0.917355371901\n", + "\tf1\n", + "\t\t 0.948347107438\n", + "\trecall\n", + "\t\t 0.989224137931\n", + "\tprecision\n", + "\t\t 0.910714285714\n", + "\tmcc\n", + "\t\t 0.759654539284\n", + "confusion matrix\n", + "[[ 83 49]\n", + " [ 15 458]]\n", + "\taccuracy\n", + "\t\t 0.894214876033\n", + "\tf1\n", + "\t\t 0.934693877551\n", + "\trecall\n", + "\t\t 0.968287526427\n", + "\tprecision\n", + "\t\t 0.903353057199\n", + "\tmcc\n", + "\t\t 0.669313678363\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "accuracy = {reg: [] for reg in regularizations}\n", + "precision = {reg: [] for reg in regularizations}\n", + "recall = {reg: [] for reg in regularizations}\n", + "f1 = {reg: [] for reg in regularizations}\n", + "mcc = {reg: [] for reg in regularizations}\n", + "for reg in regularizations:\n", + " print(\"Regularization: %s\" % reg)\n", + " predicted = pickle.load(open(model_folder + \"predicted_fold_4_reg_%s.pkl\" % reg, 'rb'))\n", + " actuals = pickle.load(open(model_folder + \"actuals_fold_4_reg_%s.pkl\" % reg, 'rb'))\n", + " for pred, actual in zip(predicted, actuals):\n", + " print(\"confusion matrix\")\n", + " print(confusion_matrix(actual, pred))\n", + " print(\"\\taccuracy\")\n", + " acc = accuracy_score(actual, pred)\n", + " accuracy[reg].append(acc)\n", + " print(\"\\t\\t\", acc)\n", + " print(\"\\tf1\")\n", + " f = f1_score(actual, pred)\n", + " f1[reg].append(f)\n", + " print(\"\\t\\t\", f)\n", + " print(\"\\trecall\")\n", + " r = recall_score(actual, pred)\n", + " recall[reg].append(r)\n", + " print(\"\\t\\t\", r)\n", + " print(\"\\tprecision\")\n", + " p = precision_score(actual, pred)\n", + " precision[reg].append(p)\n", + " print(\"\\t\\t\", p)\n", + " print(\"\\tmcc\")\n", + " m = matthews_corrcoef(actual, pred)\n", + " mcc[reg].append(m)\n", + " print(\"\\t\\t\", m)\n", + "\n", + "\n", + " print(\"\\n\\n\\n\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.894214876033\n", + "0.91113165862\n", + "0.919141914191\n" + ] + } + ], + "source": [ + "reg = 10\n", + "print(np.min(accuracy[reg]))\n", + "print(np.mean(accuracy[reg]))\n", + "print(np.max(accuracy[reg]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "KeyError", + "evalue": "10", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mreg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maccuracy\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mreg\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmean\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maccuracy\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mreg\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maccuracy\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mreg\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyError\u001b[0m: 10" + ] + } + ], + "source": [ + "reg = 10\n", + "print(np.min(accuracy[reg]))\n", + "print(np.mean(accuracy[reg]))\n", + "print(np.max(accuracy[reg]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "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.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/notebooks/Project 1 Results - PCA.ipynb b/notebooks/Project 1 Results - PCA.ipynb new file mode 100644 index 0000000..0553a82 --- /dev/null +++ b/notebooks/Project 1 Results - PCA.ipynb @@ -0,0 +1,636 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Results for Logistic Regression on Principal Components" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import os\n", + "import pickle\n", + "import numpy as np\n", + "from scipy import sparse\n", + "from sklearn.externals import joblib\n", + "from sklearn.cross_validation import KFold\n", + "from sklearn.metrics import confusion_matrix\n", + "from sklearn.cross_validation import train_test_split\n", + "from midi_ml.models.decomposition import PrincipalComponents\n", + "from midi_ml.models.linear_decision_rules import PenalizedLogisticRegression\n", + "from midi_ml.pipelines.midi_reads import MidiFeatureCorpus" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "labels = joblib.load(\"/home/jovyan/persistent_data/data/dumps/labeled_corpus_labels.pkl\")\n", + "features = joblib.load(\"/home/jovyan/persistent_data/data/dumps/labeled_corpus_matrix.pkl\")\n", + "features = features.todense()\n", + "bach_labels = [k for k in range(len(labels)) if labels[k] == \"bach-js\"]\n", + "mozart_labels = [k for k in range(len(labels)) if labels[k] == \"mozart\"]\n", + "X = features[bach_labels + mozart_labels].A\n", + "y = np.array([1 for i in range(len(bach_labels))] + [0 for i in range(len(mozart_labels))])\n", + "y = y.reshape((y.shape[0],))\n", + "del features" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# How Many PCs to Keep?" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "bach_pc = PrincipalComponents(X[np.where(y == 1)[0], :], method=\"svd\")\n", + "bach_pc.fit()\n", + "mozart_pc = PrincipalComponents(X[np.where(y == 0)[0], :], method=\"svd\")\n", + "mozart_pc.fit()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nXBERERERKWg8TGLjxo2QSqXYt28fBEHAp59+ir1792Ly5Mlwd3fH119/rYs6262UlBSUl5cDYK8w\nERERUVujcRg+e/YsXnrpJQQGBgIAunTpgoEDB+Kdd97BqFGj8MUXX2i9yPZM0YPu4OAALy8vPVdD\nRERERA1pHIYLCwvh6uoKY2NjWFpaori4WFwXGRmJs2fParXA9iw7OxuZmZkAgAEDBsDIiMcrEhER\nEbUlGqczFxcXSKVSAEDPnj2Vplr766+/YG5urr3q2jnFPMwmJiYIDg7WczVERERE1JjGB9BFRETg\n3LlzGDNmDJ555hksX74cly9fhqmpKS5fvoznnntOF3W2O7W1tfj7778BAH5+frC0tNRzRURERETU\nmMZheOnSpaiqqgIAjB8/HtbW1jh27Bhqamrw9ttvY9q0aVovsj1KSUlBbW0tgLtzCxMRERFR26Nx\nGLa0tFTq5XzkkUfwyCOPaLWojuDSpUsAAEdHR/To0UPP1RARERGROjyiSweKioqQnp4OAAgMDFSa\ng5mIiIiI2o5m9QyHhIRgz5498PPzQ3Bw8D3DnUQiEU8yYaiSkpLE64op6IiIiIio7WlWGH7++efh\n7OwsXmdPZ9MEQRCHSHh6esLe3l7PFRERERFRU5oVhhcuXAjgbtCbNWsWrKysYGZmptPC2qv09HSU\nlJQA4IFzRERERG2dRmOG6+rqMHjwYCQkJOikmH379mHkyJEICAjAlClTcPny5XtuX1tbi48++ggj\nR46Ev78/Ro0ahUOHDumktuZS9ApbWFjAx8dHr7UQERER0b1pNJuEmZkZXFxcIJPJtF5IXFwc3n//\nfbzzzjvw9/fH7t278cILL+DYsWNwdHRUe59XX30VRUVFeO+999CjRw/k5+dDLpdrvbbmqq6uxn//\n+18Ad+cWNjHReLIOIiIiImpFGs8mMX36dMTExKCmpkarhcTExGDq1KkYP348PD09sXbtWlhYWODg\nwYNqtz9z5gwSExMRHR2NsLAwdOvWDYGBgXo909uVK1dQX18PgEMkiIiIiNoDjbsus7OzkZaWhuHD\nhyM0NBSdO3dWOaBu5cqVGj1mXV0drly5gnnz5oltEokEgwcPFocdNHby5En4+flh586d+O6772Bp\naYmRI0di8eLFejsltKJWZ2dndOvWTS81EBEREVHzaRyGT548KR48l5ycrLJeIpFoHIaLioogk8nQ\nuXNnpXYnJyekpaWpvU9mZib++OMPmJmZYdu2bSgqKsKaNWtQUlKC9957T6Pnr6mpQWVlpUb3aayg\noPsVZ+IAACAASURBVAC3b98GAPTt21c8Sx+1HYp9wn1jGLi/DQv3t2Hh/jYs2h6N0JjGYfjEiRO6\nqENjgiDAyMgImzdvhrW1NQBgxYoVePXVV7FmzRqNZrvIzs5Gdnb2A9WTkpIC4O4fA6ampuJtansU\nJ0Qhw8D9bVi4vw0L9zdpQ5s4wsvBwQHGxsaQSqVK7QUFBSq9xQrOzs7o2rWrGIQBoHfv3hAEATk5\nORqdAtnV1RWdOnVqWfEA5HI5Tp06Jdagz3HL1LSqqiqkp6ejZ8+eSqcUp46J+9uwcH8bFu5vw1Jc\nXPzAnZb30uIwnJGRgfT0dLVd16NHj9bosUxNTdGvXz+cO3cOo0aNAnC35/fcuXOYNWuW2vuEhIQg\nPj4eVVVV4hchLS0NRkZGcHFx0ej5zc3NYWVlpdF9Grp+/TrKy8sBAP3793+gxyLds7S05D4yINzf\nhoX727BwfxsGXQ+H0TgMl5eXY8GCBbhw4QKAu6EVgNJBdC0ZIvDss89ixYoV8PPzE6dWq66uxsSJ\nEwEAmzdvRl5eHjZs2AAAGDt2LD777DOsWLECixYtQmFhITZu3IhJkya1+glBFKdftrKyQp8+fVr1\nuYmIiIio5TQOwxs3boRUKsW+ffswffp0fPrpp7C3t8f333+P33//HZs3b25RIY899hiKioqwZcsW\nSKVS+Pr6YteuXeIcw1KpVKmL3MrKCv/+97/x7rvvYvLkyejUqRMeffRRLF68uEXP31J1dXW4du0a\ngLtzCxsbG7fq8xMRERFRy2kchs+ePYslS5YgMDAQANClSxcEBARg4MCBeP/99/HFF1/go48+alEx\nM2bMwIwZM9SuW79+vUpbr1698Pnnn7foubQlLS0NdXV1AABfX1+91kJEREREmtH4pBuFhYVwdXWF\nsbExLC0tUVxcLK6LjIzE2bNntVpgW3f16lUAd0+/rMlBe0RERESkfxqHYRcXF3HWh549eypNtfbX\nX3/p7YQX+iAIgjhEok+fPjAy0vjtJCIiIiI90niYREREBM6dO4cxY8bgmWeewfLly3H58mWYmpri\n8uXLeO6553RRZ5t0584dcRYJHjhHRERE1P5oHIaXLl0qTnExfvx4WFtb49ixY6ipqcHbb7+NadOm\nab3ItkoxRMLIyAheXl56roaIiIiINKVxGLa0tFSa4PqRRx7BI488otWi2gtFGO7Vq5dBDQ8hIiIi\n6ig0HuQ6bdo07Nu3D4WFhbqop90oKipCXl4eAA6RICIiImqvNA7DXbp0wQcffIBhw4Zhzpw5OHLk\niDhu1pAoDpwDAG9vbz1WQkREREQtpXEY3rJlCxISEvDuu+/C2NgYK1euREREBBYtWoT4+HjU1tbq\nos425/+zd99hTZ39/8DfMYKg7GHdxeIIMpRaBziwoOIuxWpVQHAv9Ousi4qrjroFbUVxo3VPUFvH\no08RZ+t8sHXhRGUPWRLO7w8v8jMCmgMJCHm/rqtXyTn3OfkkdwJv79y5T/4UiRo1asDY2LiMqyEi\nIiKi4hA9ZxgAqlWrBg8PD3h4eCApKQknTpxAeHg4Jk6cCH19fVy5ckXddX5SMjMzERMTA4CjwkRE\nRETlWYkXxjU1NcWXX34JR0dHmJqa4vXr1+qo65N27949CIIAgGGYiIiIqDwr1sgwADx+/Bjh4eGI\niIjAvXv3YG5ujq5du6JHjx7qrO+TlD9f2MjICDVq1CjjaoiIiIiouESH4U2bNiE8PBy3b9+GoaEh\nOnfujBkzZqBVq1ZacQU2uVyOu3fvAni7ioREIinjioiIiIiouESH4dWrV8PV1RWjR49Gu3btoKOj\no4m6PlmPHj1CdnY2AE6RICIiIirvRIfh8+fPK110Q9vkryKhq6sLKyursi2GiIiIiEpE9LwGbQ7C\ngiAownCDBg1QuXKxp1wTERER0Seg4k/yVaNXr14hJSUFAK86R0RERFQRMAyLkD8qLJFIGIaJiIiI\nKgCGYRHyw3C9evW0eroIERERUUWhUhj+9ttvFcuJBQcH4+XLlxot6lOUnp6O58+fA+AUCSIiIqKK\nQqUwfPfuXcWV5dasWaOVYfjBgweKnxs0aFCGlRARERGRuqi0HELt2rWxZ88eZGdnQxAE/O9//1Os\ntVuYFi1aqK3AT0V+GDY0NISlpWUZV0NERERE6qBSGPb398fMmTOxf/9+SCQSzJ49u8i2EokE0dHR\n6qrvkyAIgiIMf/HFF7zqHBEREVEFoVIY7tmzJ9zc3PD06VP06tULixcv1qqrr8XHxyMtLQ3A2zBM\nRERERBWDyleNqFq1Kho1agR/f3+0bt0an332mSbr+qTcv39f8TPDMBEREVHFIfoSav7+/gDeTh14\n+PAhUlJSYGxsjPr161fY6QP5UyQ+++wzGBgYlHE1RERERKQuxbqecFhYGNauXYvExETFNnNzc4we\nPRoDBgxQW3GfArlcjpiYGAAcFSYiIiKqaESH4V27dmHevHno3r07unXrBgsLC8THxyMiIgLz5s2D\njo4O+vTpo4lay8STJ0/w5s0bAAzDRERERBWN6DC8efNm+Pj4YObMmUrb3dzcYGZmhtDQ0AoVhvOn\nSEilUnz++edlXA0RERERqZPoyzE/ffoUX3/9daH7OnTogGfPnpW4qE9JfhiuV68edHR0yrgaIiIi\nIlIn0WHY0tISf//9d6H7rl27VqEuSJGZmam4BDOnSBARERFVPKKnSXz33XdYu3YtcnJy0KVLF5ib\nmyMxMRHHjh1DaGgoxowZo4k6y8TDhw8hCAIAwNrauoyrISIiIiJ1Ex2GR40ahdTUVISGhiIkJESx\nXSqVwsfHB6NGjVJrgWUpf4pE1apVUaNGjTKuhoiIiIjUTXQYlkgkmDZtGkaMGIEbN24o1hl2cHCA\nqampJmosM/lhuCKvoUxERESkzYq1zjAAmJqawsXFRZ21fFKSkpKQlJQEgPOFiYiIiCoq0V+g0xbv\nXoKZ84WJiIiIKiaG4SLkT5EwNzeHsbFxGVdDRERERJrAMFyIvLw8PHz4EACnSBARERFVZAzDhXj+\n/DmysrIAcIoEERERUUXGMFyI/CkSEokEVlZWZVsMEREREWlMscLw3bt3MWHCBHTs2BF2dna4ffs2\nAGDFihU4e/asWgssC/lhuE6dOqhSpUoZV0NEREREmiI6DEdGRuLbb7/F8+fP0bNnT+Tm5ir2Va5c\nGTt37lRrgaUtJycHT548AcD5wkREREQVnegwvGzZMnTr1g27du0qcOllGxsb/O9//1NbcWXh+fPn\nyMvLA/D2YhtEREREVHGJDsN3797FN998AwAFrspmZGSkuFBFeZWcnKz42dLSsgwrISIiIiJNEx2G\njY2N8erVq0L3xcTElPsAmR+GdXR0oK+vX8bVEBEREZEmiQ7DHTt2RFBQkOJLZsDbEeK4uDiEhobC\n3d1drQWWtvwwbGpqWmDkm4iIiIgqlspiD5g0aRJu3ryJXr16oVGjRgCAGTNm4MmTJ6hfvz78/f3V\nXmRpyg/DJiYmZVwJEREREWma6DBsaGiI3377DYcPH8b58+dhYmICY2NjeHl54ZtvvoGurq4m6iw1\n+WGYl2AmIiIiqvhEh2Hg7Xza3r17o3fv3uqup0zJ5XKkpqYC4MgwERERkTbgFejekZqaCkEQALyd\nM0xEREREFZvokWGZTFbkF8skEgkMDQ0hk8ng6+sLV1fXEhdYmt5dVo0jw0REREQVn+iR4R9++AE1\natRAvXr14Ofnh4kTJ8LX1xf16tVD9erVMWDAAOTm5mLMmDEIDw/XRM0awzBMREREpF1EjwynpKTA\nzs4Oq1evVhohnjp1KsaOHYusrCyEhYVhwoQJWL9+Pbp3767WgjUpPwxXqVIFenp6ZVwNEREREWma\n6JHhvXv3ok+fPgWmSkgkEvTt2xcHDx4EAPTo0UNpLeLy4N1l1bjGMBEREVHFJzoMZ2ZmIjY2ttB9\nz58/R3Z2NgCgatWq0NHRKVl1pYxrDBMRERFpF9HTJFxdXbFs2TJUrVoVX3/9NQwMDJCeno5Tp05h\n2bJl6NixIwDgn3/+weeff672gjWJawwTERERaRfRYXj27NmYNm0apkyZAolEgsqVKyM3NxeCIKBT\np06YNWsWAKBWrVqYOHGi2gvWlHfXGOayakRERETaQXQYNjAwQHBwMO7fv4+bN2/i1atXqF69Ouzs\n7NCgQQNFu86dO6u1UE1LSUlR/MxpEkRERETaoVhXoAMAa2trWFtbq7OWMsVl1YiIiIi0T7HDcHZ2\nNp48eaL4wty7bG1tS1RUWWAYJiIiItI+osNwTk4OZs+ejcOHD0MulxfaJjo6usSFlbb8MKynp8c1\nhomIiIi0hOil1dasWYPIyEgsWrQIgiDgxx9/xMKFC+Hk5ITatWvj119/1USdGsdl1YiIiIi0j+gw\nfPz4cfj7+6Nr164AAAcHB3h4eGDjxo1o3rw5Tp8+rfYiSwPDMBEREZH2ER2GX7x4gfr160MqlaJK\nlSqK5cgAoFevXjh+/LhaCywtDMNERERE2kd0GLa0tFQExzp16uDixYuKfTExMWorrDTJ5XKkpaUB\nYBgmIiIi0iaiv0DXsmVLXL16FR07dkSfPn3w888/48GDB9DR0cHJkyfRo0cPTdSpUa9fv1b8zDBM\nREREpD1Eh+EJEyYgKSkJAODn5wfg7Tzi7Oxs+Pj4YMyYMWotsDSkp6crfmYYJiIiItIeosOwpaUl\nLC0tFbf9/PwUobi84sgwERERkXYSPWfYzc0Nd+7cKXTfv//+Czc3txIXVdryR4b19fVRpUqVMq6G\niIiIiEqL6DD87Nkz5OTkFLovKysLL168KHFRpS0/DHNUmIiIiEi7qDRNIjs7G5mZmRAEAcDb8Pju\n5Yvz25w8eRLVq1dXf5UaxpUkiIiIiLSTSmF4/fr1WLNmDQBAIpFgyJAhRbb19/dXT2WlKH/OMMMw\nERERkXZRKQx37NgRtWvXhiAImDFjBkaNGoV69eoptdHR0YG1tTVsbGw0UqgmZWZmAmAYJiIiItI2\nKoVhmUwGmUwG4O3IsIuLC8zMzDRaWFlgGCYiIiLSLqKXVvv22281UccngWGYiIiISLuIDsNZWVlY\nu3YtTpw4gRcvXhS6skR0dLRaiittDMNERERE2kV0GJ4zZw6OHj2KHj16wNraGjo6Opqoq9RVrVoV\nurq6ZV0GEREREZUi0WH4zJkzmDp1Kry9vTVRT5nhqDARERGR9hF90Q2pVAorKysNlFK2GIaJiIiI\ntI/oMNy/f38cOnRIE7WUKYZhIiIiIu0jepqEnp4erl69in79+sHJyQlGRkZK+yUSCfz8/NRVX6lh\nGCYiIiLSPqLD8NKlSwEAz58/x7Vr1wrsZxgmIiIiovJCdBi+c+eOJuoocwzDRERERNpH9JxhTQoL\nC4OrqyscHBzQt29f3LhxQ6Xjrl69Cltb2xJdEIRhmIiIiEj7FCsMv3nzBjt37sSMGTMwePBgxMTE\nAAAiIiJw//79YhUSERGBRYsWYdy4cThw4ABkMhmGDh2KxMTEDx6XlpaGadOmwcnJqVj3C7ydB11R\n1ksmIiIiItWJDsNPnjxBly5dsGTJEjx+/BhRUVF4/fo1AODy5cvYsGFDsQrZvHkzvv/+e3h4eMDa\n2hpz5syBnp4e9u3b98HjAgMD0bNnTzRr1qxY9wsABgYGxT6WiIiIiMov0WF4/vz5MDMzw8mTJ7F5\n82YIgqDY16JFC1y+fFl0EW/evMHt27eVRnclEgmcnZ0L/ZJevn379uHp06fw9/cXfZ/vMjQ0LNHx\nRERERFQ+if4C3aVLl7Bs2TKYmZlBLpcr7bO0tERcXJzoIpKSkiCXy2FhYaG03dzcHA8fPiz0mJiY\nGKxYsQI7duxApUolm/qsp6eHjIyMEp2DPn2ZmZlK/6eKjf2tXdjf2oX9rV2ys7M1en7RYVgqlSqN\nBr8rPj4eVatWLXFRH5OXl4fJkydj7NixqFevHgAUWZMqcnNzER0dra7y6BOXP8edtAP7W7uwv7UL\n+5vUQXQYbtGiBTZt2oT27dsrRmQlEgkEQcDu3buL9UU2U1NTSKVSxMfHK21PSEgoMFoMAK9fv8at\nW7dw584dzJ07F8DbgCwIAuzs7BAaGopWrVqpfP81a9aEjY2N6LqpfMnMzERMTAysrKygr69f1uWQ\nhrG/tQv7W7uwv7VLcnIyYmNjNXZ+0WF48uTJ6N+/P7p37w5XV1dIJBKEhYXh7t27ePToEfbs2SO6\nCB0dHdja2iIqKgpubm4A3o70RkVFwcfHp0B7AwMDHD16VGlbWFgYLl68iKCgINSuXVvU/ZuZmZXK\niDZ9GvT19dnfWoT9rV3Y39qF/a0dND0dRvRkW2tra+zbtw+Ojo44evQopFIp/vOf/6BevXrYs2eP\nYtqCWH5+ftizZw8OHjyI+/fvIzAwEFlZWfD09AQALFu2DFOnTgXwdiS6QYMGSv+Zm5ujSpUqsLa2\nhp6enqj7rlatWrFqJiIiIqLyTfTIMADUrVsXixcvVmsh3bp1Q1JSElavXo34+HjY2Nhgw4YNMDMz\nA/B2PrKmhsilUqlGzktEREREnzbRYTg9PR0ZGRmoXr16gX2vXr1CtWrVij3S6uXlBS8vr0L3LVy4\n8IPH+vv7l3iJNSIiIiLSLqKnSQQEBGDVqlWF7gsKCsKsWbNKXBQRERERUWkQHYavXLmCDh06FLrP\nxcUFly5dKmlNRERERESlQnQYTklJKXIahL6+PpKTk0tcFBERERFRaRAdhuvWrYvz588Xui8qKkr0\nsmZERERERGVFdBju06cPNm/ejPXr1yMxMREAkJiYiA0bNmDz5s3o27ev2oskIiIiItIE0atJ+Pn5\n4fHjx1i+fDmWL18OqVQKuVwOAOjXrx8GDx6s9iKJiIiIiDRBdBiWSCQIDAyEr68vLly4gOTkZJiY\nmKB169awsrLSQIlERERERJohKgxnZ2djyZIl6NWrFxwcHBh+iYiIiKhcEzVnuEqVKti3bx+ysrI0\nVQ8RERERUakR/QU6R0dHXLt2TRO1EBERERGVKtFzhseNG4fJkydDKpXCxcUF5ubmkEgkSm1MTEzU\nViARERERkaaIDsP9+vUDACxZsgRLly4ttE10dHTJqiIiIiIiKgWiw/CCBQsKjAQTEREREZVHosOw\np6enJuogIiIiIip1or9Aly8lJQVXrlzBkSNHkJKSAuDt0mt5eXlqK46IiIiISJNEjwzn5eVh5cqV\n2LZtGzIzMyGRSLB3714YGxvD398fTZs2hb+/vyZqJSIiIiJSK9Ejw6tWrcL27dsxdepUnDhxAoIg\nKPa5urri9OnTai2QiIiIiEhTRI8MHzhwABMnTkS/fv0gl8uV9tWrVw9PnjxRW3FERERERJokemQ4\nOTkZ1tbWhe6Ty+XIzc0tcVFERERERKVBdBi2srJCZGRkofsuXbqEhg0blrgoIiIiIqLSIHqahJ+f\nH3788UdUrlwZXbp0AQC8ePEC165dw7Zt27Bw4UK1F0lEREREpAnFWmc4JSUFQUFBWLduHQBgzJgx\n0NfXx/jx49GtWze1F0lEREREpAmiwzAADBo0CH379sVff/2F5ORkGBsbw9HREYaGhuquj4iIiIhI\nY4oVhgGgWrVqaNeunTprISIiIiIqVcUKw4mJidiyZQuuX7+OuLg4WFpaomnTpvD19YWZmZm6ayQi\nIiIi0gjRq0lcv34d7u7u2L59OwwNDdGiRQsYGhpi+/bt6NSpE65fv66JOomIiIiI1E70yPCcOXPQ\noEEDrF+/HgYGBortaWlpGDZsGObOnYt9+/aptUgiIiIiIk0QPTJ87949DB8+XCkIA4ChoSGGDRuG\nu3fvqq04IiIiIiJNEh2GP//8c6Smpha6Ly0tDXXr1i1xUUREREREpUF0GJ4yZQqCgoJw6dIlpe0X\nL15EcHAwfvjhB7UVR0RERESkSaLnDC9ZsgRpaWnw9fWFoaEhTE1NkZSUhLS0NBgZGWHp0qVYunQp\nAEAikeDw4cNqL5qIiIiISB1Eh2FbW1vY2dlpohYiIiIiolIlOgwvWrRIE3UQEREREZU60XOGiYiI\niIgqCoZhIiIiItJaDMNEREREpLUYhomIiIhIazEMExEREZHWKlEYjo2NxV9//YWMjAx11UNERERE\nVGqKFYZ37dqFdu3awdXVFV5eXnj48CEAYMyYMdiyZYtaCyQiIiIi0hTRYXjz5s2YN28ePDw8EBoa\nCkEQFPtatmyJ48ePq7VAIiIiIiJNEX3Rje3bt2P06NEYPXo05HK50r769esrRomJiIiIiD51okeG\nX758CUdHx0L36ejocP4wEREREZUbosNwrVq1cPPmzUL3Xb9+HVZWViWtiYiIiIioVIgOw3379sUv\nv/yCPXv2ID09HQCQm5uL//znPwgNDcX333+v9iKJiIiIiDRB9JzhIUOGIDY2FrNmzUJgYCAAoH//\n/gCAAQMGwMvLS70VEhERERFpiOgwDAABAQHw9fXF+fPnkZSUBGNjYzg5OXGKBBERERGVK6LDcHp6\nOgwMDFC3bl1OiSAiIiKick30nOE2bdrg//7v//DHH38gJydHEzUREREREZUK0WF4ypQpePXqFcaN\nGwdnZ2dMnz4dkZGRyMvL00R9REREREQaI3qahLe3N7y9vfH8+XOEh4cjIiICBw4cgLm5Obp06YLu\n3bvjyy+/1EStRERERERqJXpkOF+tWrUwbNgwHDhwAMeOHUP//v3x+++/w9vbW531ERERERFpTLHD\ncL6EhARERkbizz//RFxcHKpVq6aOuoiIiIiINK5YS6ulpqbixIkTiIiIwKVLl6Cjo4MOHTogODgY\n7du3V3eNREREREQaIToMjxw5EpGRkRAEAW3atMHChQvh5ubGEWEiIiIiKndEh+HXr18jICAA7u7u\nMDEx0URNRERERESlQnQY3rZtmybqICIiIiIqdSqF4du3b8Pa2hp6enq4ffv2R9vb2tqWuDAiIiIi\nIk1TKQz37t0bu3fvhoODA3r37g2JRFJoO0EQIJFIEB0drdYiiYiIiIg0QaUwvHXrVlhbWwMAtmzZ\nUmQYJiIiIiIqT1QKwy1btlT83KpVK40VQ0RERERUmkRfdMPGxgY3btwodN+tW7dgY2NT4qKIiIiI\niEqD6DAsCEKR++RyOaRSaYkKIiIiIiIqLSpNk4iLi8OrV68Utx88eFAg9GZnZ2Pfvn2oVauWeisk\nIiIiItIQlcLwrl27EBwcDIlEAolEgunTpxdoIwgCpFIpAgMD1V4kEREREZEmqBSGv/32W7Rs2RKC\nIMDX1xezZs1CgwYNlNro6OjAysoKpqamGimUiIiIiEjdVArDtWvXRu3atQG8XWatSZMmMDAw0Ghh\nRERERESaJvpyzO8us0ZEREREVJ6JDsMAcPDgQezatQsxMTHIzs4usP+vv/4qcWFERERERJomemm1\nQ4cO4ccff0TDhg2RlJSErl27wt3dHTo6OjA3N8fgwYM1UScRERERkdqJDsObNm3C6NGjFatGDBgw\nAAsXLsSpU6dgZmaGatWqqb1IIiIiIiJNEB2GHz16hC+//BJSqRRSqRTp6ekAAAMDAwwbNgzbtm1T\ne5FERERERJogOgwbGBggKysLAPDZZ5/h3r17in1yuRxJSUnqq46IiIiISINEf4HOzs4O//zzD1xc\n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\nQxEcHIzffvsNTk5OqFWrFgAgNjYWUVFRiI+Px5AhQ+Dq6qrRgomIiIiI1EXli25MnjwZLVq0wMaN\nG3HixAnk5OQAeHv1uS+//BLz58//4NJrRERERESfGlFXoHNxcYGLiwvkcjmSk5MBACYmJpBKpRop\njoiIiIhIk0RfjhkApFIpzM3N1V0LEREREVGpUukLdEREREREFRHDMBERERFpLYZhIiIiItJaDMNE\nREREpLUYhomIiIhIazEMExEREZHWYhgmIiIiIq3FMExEREREWothmIiIiIi0FsMwEREREWkthmEi\nIiIi0loMw0RERESktRiGiYiIiEhrMQwTERERkdZiGCYiIiIircUwTERERERai2GYiIiIiLQWwzAR\nERERaS2GYSIiIiLSWgzDRERERKS1GIaJiIiISGsxDBMRERGR1mIYJiIiIiKtxTBMRERERFqLYZiI\niIiItBbDMBERERFpLYZhIiIiItJaDMNEREREpLUYhomIiIhIazEMExEREZHWYhgmIiIiIq3FMExE\nREREWothmIiIiIi0FsMwEREREWkthmEiIiIi0loMw0RERESktRiGiYiIiEhrMQwTERERkdZiGCYi\nIiIircUwTERERERai2GYiIiIiLQWwzARERERaS2GYSIiIiLSWgzDRERERKS1GIaJiIiISGsxDBMR\nERGR1mIYJiIiIiKtxTBMRERERFqLYZiIiIiItNYnFYbDwsLg6uoKBwcH9O3bFzdu3Phg+4sXL8LT\n0xP29vZwd3fHgQMHSqlSIiIiIqoIPpkwHBERgUWLFmHcuHE4cOAAZDIZhg4disTExELbP336FCNH\njkTr1q1x6NAhDBw4EAEBAYiMjCzlyomIiIiovPpkwvDmzZvx/fffw8PDA9bW1pgzZw709PSwb9++\nQtvv3LkTderUwQ8//IAvvvgCXl5ecHd3x+bNm0u3cCIiIiIqtz6JMPzmzRvcvn0bTk5Oim0SiQTO\nzs64du1aocdcv34dzs7OStvatm1bZHsiIiIiovdVLusCACApKQlyuRwWFhZK283NzfHw4cNCj4mL\ni4O5uXmB9unp6cjJyYGuru5H7zcvLw8AkJ6eXszKqTzJzs4GACQnJyMzM7OMqyFNY39rF/a3dmF/\na5f8nJaf29TtkwjDZSX/zRQfH4/4+PgyroZKS2xsbFmXQKWI/a1d2N/ahf2tXbKzs2FgYKD2834S\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8,6))\n", + "sns.set_style(\"whitegrid\")\n", + "plt.plot((pc.eigenvalues_.cumsum() / pc.eigenvalues_.sum())[:100],\n", + " color=\"gray\")\n", + "plt.ylim(0,1)\n", + "plt.ylabel(\"Cumulative percentage of variance explained\")\n", + "plt.xlabel(\"Principal Components ranked by eigenvalue descending\")\n", + "plt.title(\"Principal Components - Variance Explained\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import mido, music21" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "m = MidiFeatureCorpus.initialize_note_sequence_set(2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Mozart" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "mozart_X = X[np.where(y==0)[0], :]" + ] + }, + { + "cell_type": "code", + "execution_count": 185, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "mozart_sampling_distribution = mozart_X.sum(axis=0) / mozart_X.sum()\n", + "mozart_sampling_distribution *= 0.99999\n", + "seqs = np.random.multinomial(1,\n", + " mozart_sampling_distribution, 16).argmax(axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "mozart_s = music21.stream.Stream()\n", + "for seq in seqs:\n", + " midi_locs = m[seq].split(\"|\")\n", + " for note in midi_locs:\n", + " n = music21.note.Note(0)\n", + " n.pitch.midi = int(note)\n", + " n.duration = music21.duration.Duration(0.5)\n", + " mozart_s.append([n])" + ] + }, + { + "cell_type": "code", + "execution_count": 193, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['C',\n", + " 'C',\n", + " 'G#',\n", + " 'G#',\n", + " 'D',\n", + " 'E',\n", + " 'F',\n", + " 'D',\n", + " 'E-',\n", + " 'E-',\n", + " 'C',\n", + " 'G',\n", + " 'E',\n", + " 'E',\n", + " 'D',\n", + " 'C',\n", + " 'G',\n", + " 'F',\n", + " 'B-',\n", + " 'B-',\n", + " 'C',\n", + " 'G#',\n", + " 'A',\n", + " 'A',\n", + " 'G',\n", + " 'B-',\n", + " 'G',\n", + " 'C#',\n", + " 'G',\n", + " 'F',\n", + " 'G',\n", + " 'A']" + ] + }, + "execution_count": 193, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[mozart_s[i].pitch.name for i in range(len(mozart_s))]" + ] + }, + { + "cell_type": "code", + "execution_count": 187, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "mozart_s.show(\"midi\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Bach" + ] + }, + { + "cell_type": "code", + "execution_count": 178, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "bach_X = X[np.where(y==1)[0], :]" + ] + }, + { + "cell_type": "code", + "execution_count": 194, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "bach_sampling_distribution = bach_X.sum(axis=0) / bach_X.sum()\n", + "bach_sampling_distribution *= 0.99999\n", + "seqs = np.random.multinomial(1,\n", + " bach_sampling_distribution, 16).argmax(axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 204, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "bach_s = music21.stream.Stream()\n", + "for seq in seqs:\n", + " midi_locs = m[seq].split(\"|\")\n", + " for note in midi_locs:\n", + " n = music21.note.Note(0)\n", + " n.pitch.midi = int(note)\n", + " n.duration = music21.duration.Duration(0.5)\n", + " bach_s.append([n])" + ] + }, + { + "cell_type": "code", + "execution_count": 205, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "bach_s.show(\"midi\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Bach to Mozart" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "bach_to_mozart = mozart_pc.transform(X[np.where(y == 1)[0], :])\n", + "bach_to_mozart = bach_to_mozart.dot(mozart_pc.projection_matrix_.T + mozart_pc.means_)\n", + "bach_to_mozart_sampling_distribution = bach_to_mozart.sum(axis=0) / bach_to_mozart.sum()\n", + "seqs = np.random.multinomial(1,\n", + " bach_to_mozart_sampling_distribution, 10).argmax(axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 217, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "bach_to_mozart_s = music21.stream.Stream()\n", + "for seq in seqs:\n", + " midi_locs = m[seq].split(\"|\")\n", + " for note in midi_locs:\n", + " n = music21.note.Note(0)\n", + " n.pitch.midi = int(note)\n", + " n.duration = music21.duration.Duration(0.25)\n", + " bach_to_mozart_s.append([n])" + ] + }, + { + "cell_type": "code", + "execution_count": 218, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "bach_to_mozart_s.show(\"midi\")" + ] + }, + { + "cell_type": "code", + "execution_count": 216, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{0.0} \n", + "{0.25} \n", + "{0.5} \n", + "{0.75} \n", + "{1.0} \n", + "{1.25} \n", + "{1.5} \n", + "{1.75} \n", + "{2.0} \n", + "{2.25} \n", + "{2.5} \n", + "{2.75} \n", + "{3.0} \n", + "{3.25} \n", + "{3.5} \n", + "{3.75} \n", + "{4.0} \n", + "{4.25} \n", + "{4.5} \n", + "{4.75} \n", + "{5.0} \n", + "{5.25} \n", + "{5.5} \n", + "{5.75} \n", + "{6.0} \n", + "{6.25} \n", + "{6.5} \n", + "{6.75} \n", + "{7.0} \n", + "{7.25} \n", + "{7.5} \n", + "{7.75} \n" + ] + } + ], + "source": [ + "bach_to_mozart_s.show(\"midi\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 220, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 220, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bach_to_mozart_s.analyze(\"key\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "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.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +}