{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "***SVM Demo***\n", "\n", "Build a simple SVM classifier using one of two possible approximation procedures:\n", "\n", " * Gradient Descent: compute the gradient of the function you are optimizing based on the entire dataset on each iteration\n", " \n", " * Stochastic Gradient Descent: compute the gradient and modify the weights/plane equation after considering each data point" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from bs4 import BeautifulSoup\n", "import urllib.request\n", "\n", "from pandas import DataFrame\n", "from pandas import read_csv\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn\n", "from functools import reduce\n", "\n", "import numpy as np\n", "\n", "from sklearn.linear_model import LinearRegression\n", "from sklearn.svm import *\n", "\n", "%matplotlib inline " ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": true }, "outputs": [], "source": [ "### this function removes extra whitespace from the data that was read from the CSV files\n", "### kept here to make your life a bit easier\n", "### same function as in the perceptron notebook\n", "\n", "def cleanLabels(frame) :\n", " nf = pd.DataFrame(frame)\n", " vals = nf.values\n", " vals[:,-1] = [x.strip() for x in vals[:,-1]]\n", " corrected = pd.DataFrame(vals, columns = frame.columns)\n", " return corrected" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "collapsed": true }, "outputs": [], "source": [ "## This function helps build column of +1, -1 class labels for the City column\n", "## same function as in the Perceptron notebook\n", "\n", "\n", "def getCityLabel(city):\n", " if city == 'Paso Robles':\n", " return -1\n", " else:\n", " if city == 'San Luis Obispo':\n", " return 1\n", " else: \n", " return 0\n", " \n", " " ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": true }, "outputs": [], "source": [ "### plotW() takes as input the set of SLO data points, the set of Paso Robles data points, and the vector w representing the\n", "### current separating plane. It draws the two sets of the data points and the separating plane.\n", "\n", "### same as in the perceptron notebook\n", "\n", "### extra challenge: modify this function to display, in addition to the points and the hyperplane, \n", "### the \"buffer zone\" (i.e., the planes running through the support vectors parallel to the \n", "### separating hyperplane), and the support vectors\n", "### you many need to modify the set of parameters for this.\n", "\n", "def plotW(slo,paso, w):\n", " \n", " plt.figure(figsize=(10,8))\n", "\n", " plt.plot(slo['Footage'], slo['Price'], 'ro')\n", " plt.plot(paso['Footage'], paso['Price'], 'bs')\n", " \n", " points = list(slo['Footage'])\n", " points.extend(list(paso['Footage']))\n", " points = np.array(sorted(points))\n", " \n", " plt.plot(points, -1*points*w[0]/w[1] - w[2]/w[1])\n", "\n", " plt.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "### This function takes as input the dataset of points, the current values w of the separating plane normal (w.x = 0),\n", "### and the learning rate (Rate), and the Hinge-Loss penalty multiplier C, and produces one round of SVM training:\n", "### either via gradient descent or via stochastic gradient descent\n", "\n", "### One round means the function trains the SVM on each data point from the dataset exactly once\n", "### You can use either the full gradient descent approach or the stochastic gradient descent approach\n", "### A version of stochastic approach (adjust w after visting each data point in turn) is recommended\n", "\n", "def trainSVM(data, w, Rate, C):\n", " \n", " \n", "\n", "\n", " return w\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "### Given the data frame and the current separating plane normal vector w (w.x = 0) (i.e., the current SVM)\n", "### this function should apply the SVM to each data point in the data set,\n", "### determine if the prediction is correct, and output all predictions and the overall accuracy\n", "\n", "def getSVMAccuracy(data, w):" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Records: 38\n" ] } ], "source": [ "### Step 1: Retrieving the data\n", "\n", "masterFileName= 'HousingSmallSet.csv'\n", "masterFile = open(masterFileName, \"r\")\n", "dt = pd.read_csv(masterFile)\n", "\n", "print(\"Records:\", len(dt))\n", " \n", "dt.columns = [s.strip() for s in dt.columns]\n", "\n", "cleaned = cleanLabels(dt)\n" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABnoAAAS2CAYAAAAKiXd7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3V+M3XX95/HXmWn7C1scqb8stNnfJm1j8llMVBAViqvJ\nLhGipZE18UIjXiwowX/8QjR6gfzfZJVo/IMXBHGTHwkm7ppFaxe6ixeSSMGoEC+Uj0soie7ScgFL\nfzQm086cvThnzOn0D506zMwbH4+bZr7f95zzaXyHxD7zPWcwHA4DAAAAAABAPVOrfQAAAAAAAADO\njNADAAAAAABQlNADAAAAAABQlNADAAAAAABQlNADAAAAAABQlNADAAAAAABQlNADAAAAAABQlNAD\nAAAAAABQlNADAAAAAABQ1LrVPsDrwXA4HL744uHMzw9X+yhwSlNTg7zpTRtjX6nCzlKJfaUS+0ol\n9pVK7CvV2Fkqsa9UMjU1yN///dmDFXu/lXqj17PBYJCpqRX73wzO2NTUwL5Sip2lEvtKJfaVSuwr\nldhXqrGzVGJfqWSl91ToAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAA\nKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEro\nAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAA\nAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAA\nKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEro\nAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAA\nAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAA\nKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEro\nAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAA\nAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAA\nKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEroAQAAAAAAKEro\nAQAAAAAAKEroAQAAAAAAKGrdUn+htfbeJF9MclGSLUmu6r3/5CSz9yT5ZJJ/7L1/e+L6piR3J7ky\nyXySHyW5ofd+eGLmbeOZdyV5Icndvfe7Fr3+R5LcnmRrkj8k+XLv/aFFM7cnuTbJOUl+keT63vsz\nSzkLAAAAAADAWnQmT/RsTPJUks8kGZ5sqLV2VZJ3J/k/J7j9QJLzk1yWZGeS9yW5Z+J335Bkb5L9\nSd6RUVi6tbV27cTMjvHr3JvkgiQPJnmwtfaWiZkvJflskuvGZzmcZG9rbcPpngUAAAAAAGCtWvIT\nPb33h5M8nCSttcGJZlpr/yrJt5NckeR/LLr3b8bXL+q9Pzm+9rkke1prX+i9H0jy8STrk1zTez+a\n5PettQuT3Jjke+OXuiHJQ733b4x/vqW1dnlGYefTEzN39N53j9/nE0kOJrkqyQ9ba+efxlkAAAAA\nAADWpGX/jp5x/PmnJF/rvf/+BCM7kry0EFbGHsno6aCLxz9fkuTRceRZsHf08u2NE6/zyKLX3ju+\nntba9iSbk/xs4Wbv/VCSJxZmxu/zamcBAAAAAABYk5b8RM9p+HKS2d773Se5vzmj79z5i977XGvt\nxfG9hZlnF/3ewYl7L4//PHiCmYXXOC+jYHOqmdM5y2mZnl72ZgbLbmFP7StV2Fkqsa9UYl+pxL5S\niX2lGjtLJfaVSlZ6T5c19LTWLkry+SQXnsGvD3KK7/wZ3z+dmVPdX86ZY8zMnLWUcVhV9pVq7CyV\n2Fcqsa9UYl+pxL5SjZ2lEvsKx1vuJ3r+bZJ/meSPrbWFa9NJvtFa+8fe+/YkB5KcO/lLrbXpJJvG\n9zL+87xFr31ujn1C52Qzk/cH45mDi2aenJg52VkWPwl0SocO/Tlzc/NL+RVYcdPTU5mZOcu+Uoad\npRL7SiX2lUrsK5XYV6qxs1RiX6lkYV9XynKHnn9K8r8WXfuf4+v/ZfzzviTntNYunPhunMsyijK/\nnJi5s7U23XufG1+7PEnvvb88MXNZkm9PvNf7x9fTe9/fWjswnvltkrTWZjL67p3vnsZZnljKX3xu\nbj5Hj/oPDDXYV6qxs1RiX6nEvlKJfaUS+0o1dpZK7Cscb8mhp7W2McmbM4ohSbK9tfb2JC/23v+Y\n5KVF80eSHOi9/+8k6b0/3Vrbm+Te1tr1STYk+U6SH/TeF57oeSDJzUm+31r7apK3ZvSRcDdMvPS3\nkvy8tXZjkj1JPprkoiSfnJj5ZpKbWmvPJHkuyR1J/pTkx0s4CwAAAAAAwJp0Jt8I9M6MPvrs1xl9\nlNrXk/wmyW0nmT/Rd918LMnTSR5J8tMkjya5buFm7/1QkiuSbE3yqyR3Jbm1937fxMy+jOLOp5I8\nleTDST7Ue//dxMzXMgo392T0hM5ZST7Qe5893bMAAAAAAACsVYPh8EQdhiUavvTSYY8MsuatWzeV\nTZs2xr5ShZ2lEvtKJfaVSuwrldhXqrGzVGJfqWS8r4NXn1weZ/JEDwAAAAAAAGuA0AMAAAAAAFCU\n0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMA\nAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAA\nAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU\n0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMA\nAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAA\nAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU\n0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMA\nAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAA\nAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU\n0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMA\nAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAA\nAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU\n0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMAAAAAAFCU0AMA\nAAAAAFCU0AMAAAAAAFDUutU+AAAAAABwmobDrH/8sUwdeD7zm7fkyCWXJoPBap8KgFUk9AAAAABA\nARv27M7Zt92U6ef2/+Xa3NZteeWWOzO7c9cqngyA1eSj2wAAAABgjduwZ3dmrrn6mMiTJNPP7c/M\nNVdnw57dq3QyAFab0AMAAAAAa9lwmLNvuymD+fkT3h7Mz2fj7V9JhsMVPhgAa4HQAwAAAABr2PrH\nHzvuSZ7F1u1/Nuuf2LdCJwJgLRF6AAAAAGANmzrw/LLOAfD6IvQAAAAAwBo2v3nLss4B8Poi9AAA\nAADAGnbkkkszt3XbKWeObtueIxfvWKETAbCWCD0AAAAAsJYNBnnlljsznDrxP+UNp6Zy+OY7ksFg\nhQ8GwFog9AAAAADAGje7c1cO3Xd/jm7bfsz1o9u259B992d2565VOhkAq23dah8AAAAAAHh1szt3\nZfaDV2b9449l6uCBzG/eMvq4Nk/yAPxNE3oAAAAAoIrBIEd2vGe1TwHAGuKj2wAAAAAAAIoSegAA\nAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAA\nAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoS\negAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAA\nAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAA\nAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoS\negAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAA\nAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIoSegAAAAAAAIpat9RfaK29\nN8kXk1yUZEuSq3rvPxnfW5fkPyX5QJLtSV5O8kiSL/fen594jU1J7k5yZZL5JD9KckPv/fDEzNvG\nM+9K8kKSu3vvdy06y0eS3J5ka5I/jN/noUUztye5Nsk5SX6R5Pre+zNLOQsAAAAAAMBadCZP9GxM\n8lSSzyQZLrr3L5JckOS2JBcm+Q9JWpIfL5p7IMn5SS5LsjPJ+5Lcs3CztfaGJHuT7E/yjozC0q2t\ntWsnZnaMX+fe8Xs+mOTB1tpbJma+lOSzSa5L8u4kh5Psba1tON2zAAAAAAAArFVLfqKn9/5wkoeT\npLU2WHTvUJIrJq+11j6b5InW2j/03v/UWjt/PHNR7/3J8cznkuxprX2h934gyceTrE9yTe/9aJLf\nt9YuTHJjku+NX/qGJA/13r8x/vmW1trlGYWdT0/M3NF73z1+n08kOZjkqiQ/PM2zAAAAAAAArEkr\n8R0952T05M//G/98SZKXFsLK2CPjmYsnZh4dR54Fe5O01tobxz/vGP9eFs3syGhwe5LNSX62cHMc\nop5YmDnNswAAAAAAAKxJr2noaa39XZL/nOSB3vsr48ubM/rOnb/ovc8leXF8b2Hm4KKXOzhx71Qz\nC/fPyyjYnGrmdM4CAAAAAACwJi35o9tOV2ttXZL/mlFs+fSrjCfJIMd/58/i+6czc6r7yzlzjOnp\nlXg4Cv46C3tqX6nCzlKJfaUS+0ol9pVK7CvV2Fkqsa9UstJ7+pqEnonI86+T/PuJp3mS5ECScxfN\nTyfZNL63MHPeopc9N8c+oXOymcn7g/HMwUUzT07MnOwsi58EOqWZmbOWMg6ryr5SjZ2lEvtKJfaV\nSuwrldhXqrGzVGJf4XjLHnomIs/2JP+u9/7SopF9Sc5prV048d04l2UUZX45MXNna216/FFqSXJ5\nkt57f3li5rIk35547fePr6f3vr+1dmA889vx2WYy+u6d757GWZ5Yyt/70KE/Z25ufim/Aituenoq\nMzNn2VfKsLNUYl+pxL5SiX2lEvtKNXaWSuwrlSzs60pZcuhprW1M8uaMYkiSbG+tvT2j77X5v0l+\nlOSCJFcmWd9aW3jq5sXe+5He+9Ottb1J7m2tXZ9kQ5LvJPlB733hiZ4Hktyc5Putta8meWuSzye5\nYeIo30ry89bajUn2JPlokouSfHJi5ptJbmqtPZPkuSR3JPlTkh8nyWme5bTMzc3n6FH/gaEG+0o1\ndpZK7CuV2Fcqsa9UYl+pxs5SiX2F453JB8W9M6OPPvt1Rh+l9vUkv0lyW5J/SLJr/OdTGYWf58d/\n7ph4jY8leTrJI0l+muTRJNct3Oy9H0pyRZKtSX6V5K4kt/be75uY2ZdR3PnU+L0+nORDvfffTcx8\nLaNwc09GT+icleQDvffZ0z0LAAAAAADAWjUYDoerfYbXg+FLLx1Wklnz1q2byqZNG2NfqcLOUol9\npRL7SiX2lUrsK9XYWSqxr1Qy3tfBq08ujzN5ogcAAAAAAIA1QOgBAAAAAAAoSugBAAAAAAAoSugB\nAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAA\nAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAo\nSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugB\nAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAA\nAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAo\nSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugB\nAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAA\nAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAo\nSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugB\nAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAA\nAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAo\nSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugB\nAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAA\nAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAo\nSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugB\nAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAA\nAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAo\nSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugB\nAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAA\nAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAo\nSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugB\nAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAAAAAoSugBAAAA\nAAAoSugBAAAAAAAoSugBAAAAAAAoat1Sf6G19t4kX0xyUZItSa7qvf9k0cztSa5Nck6SXyS5vvf+\nzMT9TUnuTnJlkvkkP0pyQ+/98MTM28Yz70ryQpK7e+93LXqfjyS5PcnWJH9I8uXe+0PLfRYAAAAA\nAIC16Eye6NmY5Kkkn0kyXHyztfalJJ9Ncl2Sdyc5nGRva23DxNgDSc5PclmSnUnel+Seidd4Q5K9\nSfYneUdGYenW1tq1EzM7xq9zb5ILkjyY5MHW2luW8ywAAAAAAABr1ZKf6Om9P5zk4SRprQ1OMHJD\nkjt677vHM59IcjDJVUl+2Fo7P8kVSS7qvT85nvlckj2ttS/03g8k+XiS9Umu6b0fTfL71tqFSW5M\n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\n3pvkwSTNJL+d5OG6rq911XxDp+blSRaSvLeu63ese853JjmZZH+SP0vy1rquP3E7vQAAAAAAAGxH\nW7Gi561JXp/kjUm+JslPJfmpqqretFZQVdVPJ3lTp+6bk1xL8nhVVWNdn/OhJC9Ocn+SqSSvSPL+\nrs+4O8njSeaSfFOSn0zytqqqHuqqOdT5nA8keUmSjyX5WFVVX3ubvQAAAAAAAGw7m76iJ8mhJL9T\n1/V/7Lz+i6qqXpd2iLLm4SSP1XU9kyRVVX1/kktJvi3Jh6uqenGSVyd5WV3Xn+vU/GiS2aqqfqKu\n6/kk35dkNMnRuq5XknyhqqqXJnlLkg92PecTdV2/s/P6eFVVr0o72HnjRnrZtP8qAAAAAAAAm2wr\nVvScTXJ/VVX/IEmqqvrGJPcl+d3O68m0t3T75Nob6rpeTPJU2iFRkhxMcnkt5Ol4Ikkryb1dNZ/q\nhDxrHm8/onph5/WhzvuyruZQp5cDG+gFAAAAAABgW9qKoOfnk/y7JF+sqmopyWeTvKuu69/q3N+b\ndmBzad37LnXurdUsdN+s63o1yd+sq7nZZ2QDNWv379lALwAAAAAAANvSVmzd9l1JXpfku5N8Pu2z\ncd5dVdVf1XV95hbva6QdutzKc9U0NljzfJ9zg+HhrcjMYHOtzal5pRRmlpKYV0piXimJeaUk5pXS\nmFlKYl4pSa/ndCuCnl9I8q/ruv73ndd/WlXV/iQ/k+RMkvm0g5R7cv1Kmokka1u1zXdeP6OqquEk\nezr31mruWffsiVy/QufZarrvP1cvGzI+ftftlENfmVdKY2YpiXmlJOaVkphXSmJeKY2ZpSTmFW60\nFUHPV+TG1TDNdLaJq+t6rqqq+ST3J/njJKmqajzts3fe16k/l+RFVVW9tOucnvvTDmU+3VVzqqqq\n4c62bknyqvYj6i931dyf5D1dvbyyc32jvWzI4uLfZnW1eTtvgZ4bHh7K+Phd5pVimFlKYl4piXml\nJOaVkphXSmNmKYl5pSRr89orWxH0zCT52aqq/luSP03yTUnenOSDXTXvSnKsqqovJbmQ5LEkf5nk\nd5KkrusvVlX1eJIPVFX1hiRjSX4pyW/Wdb22oudDSR5N8itVVb09ydcn+bEkD3c9591Jfq+qqrck\nmU3yPUleluSHNtrLRq2uNrOy4guGMphXSmNmKYl5pSTmlZKYV0piXimNmaUk5hVutBUbxb0pyUfS\n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\ngEIJegAAAAAAAAol6AEAAAAAACjUSL8bAAAAKF6rldHzZzM0fzHNvfuyfPBw0mj0uysAAGAACHoA\nAACeh7HZmew+cSzDF+aeuba6fzJXj5/K0tR0HzsDbtfCwpV+twAAcNts3QYAAHCHxmZnMn70yHUh\nT5IMX5jL+NEjGZud6VNnAADAoBD0AAAA3IlWK7tPHEuj2bzp7UazmV0nH0larR43BgAADBJBDwAA\nwB0YPX/2hpU8643MPZ3Rp871qCMAAGAQCXoAAADuwND8xU2tAwAAuBMjW/GhVVV9dZK3J3lNkq9I\n8l+T/EBd13/QVXMyyUNJXpTkySRvqOv6S1339yR5b5IHkzST/HaSh+u6vtZV8w2dmpcnWUjy3rqu\n37Gul+9McjLJ/iR/luStdV1/Yl3NLXsBAABYr7l336bWAQAA3IlNX9FTVdVaWPJ/k7w6yYuT/HiS\ny101P53kTUlen+Sbk1xL8nhVVWNdH/WhznvvTzKV5BVJ3t/1GXcneTzJXJJvSvKTSd5WVdVDXTWH\nOp/zgSQvSfKxJB+rquprb7MXAACA6ywfPJzV/ZO3rFmZPJDlew/1qCMAAGAQbcWKnrcm+Yu6rh/q\nuvbn62oeTvJYXdczSVJV1fcnuZTk25J8uKqqF6cdEr2sruvPdWp+NMlsVVU/Udf1fJLvSzKa5Ghd\n1ytJvlBV1UuTvCXJB7ue84m6rt/ZeX28qqpXpR3svHEjvTz//xwAAMCO1Gjk6vFTGT96JI1m84bb\nraGhXHv0saTR6ENzAADAoNiKM3qmk3ymqqoPV1V1qaqqP1i3ymYyyd4kn1y7Vtf1YpKnkqz9U7eD\nSS6vhTwdTyRpJbm3q+ZTnZBnzePtR1Qv7Lw+1Hlf1tUc6vRyYAO9AAAA3NTS1HQWT5/JyuSB666v\nTB7I4ukzWZqa7lNnAADAoNiKFT0HkrwhyS8m+bm0g5n3VFX1f+q6/o20g5VW2qtmul3q3Evn14Xu\nm3Vdr1ZV9Tfrap6+yWes3fty59dbPeeeDfSyIcPDW5GZweZam1PzSinMLCUxr5TEvG6u5mtfmyvf\n+q0ZOfdkGvPzae3bl5WDh5NGY2sORR0w5pWSmFdKY2YpiXmlJL2e0634e8dQkk/Xdf1I5/UfVVX1\ndWmHP79xi/c10g5dbuW5ahobrHm+z7nB+Phdt1MOfWVeKY2ZpSTmlZKY10029ep+d7CjmVdKYl4p\njZmlJOYVbrQVQc/FJF9Yd+0LSb698//n0w5S7sn1K2kmknyuq2ai+wOqqhpOsqdzb63mnnXPmcj1\nK3Serab7/nP1siGLi3+b1dUb9+WG7WR4eCjj43eZV4phZimJeaUk5pWSmFdKYl4pjZmlJOaVkqzN\na69sRdDzZJJq3bUqyZ8nSV3Xc1VVzSe5P8kfJ0lVVeNpb/H2vk79uSQvqqrqpV3n9Nyfdijz6a6a\nU1VVDdd1vdq59qr2I+ovd9Xcn+Q9Xb28snN9o71syOpqMysrvmAog3mlNGaWkphXSmJeKYl5pSTm\nldKYWUpiXuFGWxH0/JskT1ZV9TNJPpx2aPJQkh/qqnlXkmNVVX0pyYUkjyX5yyS/kyR1XX+xqqrH\nk3ygqqo3JBlL8ktJfrOu67UVPR9K8miSX6mq6u1Jvj7JjyV5uOs5707ye1VVvSXJbJLvSfKy2+kF\nAAAAAABgu9r0E4Hquv5Mkn+adqjyJ0l+NsnDdV3/VlfNL6Qd3Lw/yVNJ7krymrqul7o+6nVJvpjk\niSQfT/KpJK/v+ozFJK9Osj/JZ5K8I8nb6ro+3VVzrtPHDyf5w7S3j3ttXdefv81eAAAAAAAAtp1G\nq9Xqdw87Qevy5WuWDLLtjYwMZc+eXTGvlMLMUhLzSknM6xZotTJ6/myG5i+muXdflg8eThqNfne1\nI5hXSmJeKY2ZpSTmlZJ05rVnfyHYiq3bAAAABsbY7Ex2nziW4Qtzz1xb3T+Zq8dPZWlquo+dAQAA\ng2DTt24DAAAYFGOzMxk/euS6kCdJhi/MZfzokYzNzvSpMwAAYFAIegAAAO5Eq5XdJ46l0bz51iGN\nZjO7Tj6S2C4bAADYQoIeAACAOzB6/uwNK3nWG5l7OqNPnetRRwAAwCAS9AAAANyBofmLm1oHAABw\nJwQ9AAAAd+CFr/+BNNJ6zv819+7rd6sAAMAOJugBAADYQsv3Hup3CwAAwA4m6AEAANhKjUa/OwAA\nAHYwQQ8AAAAAAEChRvrdAAAAAJRsYuLuDdUtLFzp62cCALAzWdEDAAAAAABQKEEPAAAAAABAoQQ9\nAAAAAAAAhRL0AAAAAAAAFErQAwAAAAAAUKiRfjcAAABQooWFK/1uAQAAQNADAAAAANBPExN3b6jO\nPzQBbsbWbQAAAAAAAIUS9AAAAAAAABTK1m0AAADwPGzFNjq25gEAYKOs6AEAAAAAACiUoAcAAAAA\nAKBQgh4AAAAAAIBCCXoAAAAAAAAKJegBAAAAAAAolKAHAAAAAACgUCP9bgAAAAAAYJAtLFzpdwtA\nwazoAQAAAAAAKJSgBwAAAAAAoFCCHgAAAAAAgEIJegAAAAAAAAol6AEAAAAAACjUSL8bAAAAdoaJ\nibs3VLewcGWLOwHojWf/3tt13SvfewDAVhL0AABsc354DgAAADwbW7cBAAAAAAAUStADAAAAAABQ\nKFu3AQAAAECP2JYXgM1mRQ8AAAAAAEChrOgBAAAAALgFK7GA7cyKHgAAAAAAgEIJegAAAAAAAAol\n6AEAAAAAACiUM3oAAIBNYU96YNCs/94bGRnKnj27cvnytaysNPvUFQAwaAQ9AADbnB+eAwAAAM/G\n1m0AAAAAAACFEvQAAAAAAAAUytZtAAAAANAjtuUFYLMJegAAAAAAuKWJibs3VCfMhN4T9AAAAAAA\n3ILwAtjOnNEDAAAAAABQKEEPAAAAAABAoQQ9AAAAAAAAhRL0AAAAAAAAFErQAwAAAAAAUChBDwAA\nAAAAQKEEPQAAAAAAAIUS9AAAAAAAABRqpN8NAAAAAACwvS0sXOl3C8CzsKIHAAAAAACgUIIeAAAA\nAACAQgl6AAAAAAAACiXoAQAAAAAAKJSgBwAAAAAAoFCCHgAAAAAAgEIJegAAAAAAAAol6AEAAAAA\nACiUoAcAAAAAAKBQgh4AAAAAAIBCCXoAAAAAAAAKJegBAAAAAAAolKAHAAAAAACgUIIeAAAAAACA\nQgl6AAAAAAAACiXoAQAAAAAAKJSgBwAAAAAAoFAj/W4AAID+mZi4e0N1CwtXtriT3hrU3zcAAAA7\njxU9AAAAAAAAhRL0AAAAAAAAFMrWbQAAAAA9YOtQAGArWNEDAAAAAABQKEEPAAAAAABAoQQ9AAAA\nAAAAhRL0AAAAAAAAFErQAwAAAAAAUChBDwAAAAAAQKFG+t0AAAD9s7Bwpd8t9MWg/r4BAADYeQQ9\nAAAAbBsTE3c/y51d170S2AIAQJut2wAAAAAAAAplRQ8AAABAD1iJBgBsBSt6AAAAAAAACiXoAQAA\nAAAAKJSt2wAACvPsB5Vfz/YwAAAAsPNZ0QMAAAAAAFAoQQ8AAAAAAEChBD0AAAAAAACFEvQAAAAA\nAAAUaqTfDQAAAMCahYUr170eGRnKnj27cvnytaysNPvUFQAAbF9W9AAAAAAAABTKih4AAAAAgG1i\nYuLuDdWtXwULDC4regAAAAAAAAol6AEAAAAAACiUrdsAAApjiwYAAABgjaAHAAAAABhIzsMBdgJb\ntwP3rwoAACAASURBVAEAAAAAABRK0AMAAAAAAFAoQQ8AAAAAAEChBD0AAAAAAACFEvQAAAAAAAAU\naqTfDQAAAAAA0LawcKXfLQCFsaIHAAAAAACgUIIeAAAAAACAQgl6AAAAAAAACuWMHgAAAABgIDkP\nB9gJrOgBAAAAAAAolKAHAAAAAACgUIIeAAAAAACAQgl6AAAAAAAACiXoAQAAAAAAKJSgBwAAAAAA\noFCCHgAAAAAAgEIJegAAAAAAAAol6AEAAAAAACiUoAcAAAAAAKBQgh4AAAAAAIBCCXoAAAAAAAAK\nJegBAAAAAAAolKAHAAAAAACgUIIeAAAAAACAQgl6AAAAAAAACiXoAQAAAAAAKJSgBwAAAAAAoFCC\nHgAAAAAAgEIJegAAAAAAAAol6AEAAAAAACiUoAcAAAAAAKBQgh4AAAAAAIBCCXoAAAAAAAAKJegB\nAAAAAAAolKAHAAAAAACgUIIeAAAAAACAQgl6AAAAAAAACiXoAQAAAAAAKJSgBwAAAAAAoFCCHgAA\nAAAAgEKNbPUDqqr6mSQ/l+RddV2/pXPtBUnemeS7krwgyeNJ3ljX9ULX+/5ekl9O8i1JriT59SRv\nreu62VXzLUl+McnXJfmLJD9X1/WvrXv+jyT5iSR7k/xRkh+t6/r3u+4/Zy8AAAAAAADb0Zau6Kmq\n6uVJfijtgKXbu5JMJfmOJK9I8tVJfrvrfUNJfjftIOpgkn+e5F8kOdlVsz/Jx5N8Msk3Jnl3kg9W\nVfXKrprvSjsIOp7kpZ0+Hq+q6qs22gsAAAAAAMB2tWVBT1VVu5P8RpKHkvyvruvjSX4wyZvruv69\nuq4/l+QHktxXVdU3d8peneRrknxvXdd/Utf140keSfIjVVWtrUJ6Q5Kn67r+qbrtfUk+kuTNXW28\nOcn767r+9bquv5jkXyb5353nb7QXAAAAAACAbWkrV/S8L8lMXdf/ed31f5T2Sp1Prl2o67pOe+u1\nQ51LB5P8SV3Xf931vseTvDDtbdrWap5Y99mPr31GVVWjSV627jmtznvWnrORXgAAAAAAALalLTmj\np6qq707ykrSDlPXuSbJU1/XiuuuX0j5HJ51fL93k/tq9P7pFzXjn3J2vTDL8LDXVbfSyIcPDW7oL\nHmyKtTk1r5TCzFIS80pJzCslMa+UxLxSGjNLScwrJen1nG560FNV1d9N+9ybV9Z1vXwbb20kaW2g\n7lY1jQ3WPNdzNtrLM8bH77qdcugr80ppzCwlMa+UxLxSEvNKScwrpTGzlMS8wo22YkXPy5L8nSSf\nrapqLXgZTvKKqqrelOSfJHlBVVXj61bSTOT/r76ZT/LydZ97T9e9tV/vWVczkWSxruulqqr+Osnq\ns9R0P2fsOXrZkMXFv83qavN23gI9Nzw8lPHxu8wrxTCzlMS8UhLzSknMKyUxr5TGzFIS80pJ1ua1\nV7Yi6Hkiydevu/arSb6Q5OeT/Pcky0nuT/LRJKmq6h8m+ftJznbqzyX5V1VVfVXXOT2vSvLlzues\n1bxm3XNe1bmeuq6Xq6r6bOc5/6HznEbn9Xs69Z9NsvIsvZy7nd/06mozKyu+YCiDeaU0ZpaSmFdK\nYl4piXmlJOaV0phZSmJe4UabHvTUdX0tyee7r1VVdS3J/6zr+gud16eTvLOqqstJrqQdvDxZ1/Xv\nd97ynzqfcaaqqp9Osi/JY0ne27Ud3C8neVNVVW9P8itphzX/LMkDXY9+Z5Jf6wQ+n07y5iRfkXbw\nlLquF2/Ry6c36T8JAAAAAADAlujViUDrz7t5c5KPJ/lIkv+S5K+SfMfazbqum0keTHvrtbNJfj3t\ncOZ4V82FJFNJ/nGSP+x85tG6rp/oqvlwkh9PcjLJ55J8Q5JX13X9PzbaCwAAAAAAwHbVaLXWZzDc\ngdbly9csGWTbGxkZyp49u2JeKYWZpSTmlZKYV0piXimJeaU0ZpaSmFdK0pnXRq+e16sVPQAAAAAA\nAGwyQQ8AAAAAAEChBD0AAAAAAACFEvQAAAAAAAAUStADAAAAAABQKEEPAAAAAABAoQQ9AAAAAAAA\nhRL0AAAAAAAAFErQAwAAAAAAUChBDwAAAAAAQKEEPQAAAAAAAIUS9AAAAAAAABRK0AMAAAAAAFAo\nQQ8AAAAAAEChBD0AAAAAAACFEvQAAAAAAAAUStADAAAAAABQKEEPAAAAAABAoQQ9AAAAAAAAhRL0\nAAAAAAAAFErQAwAAAAAAUChBDwAAAAAAQKEEPQAAAAAAAIUS9AAAAAAAABRK0AMAAAAAAFAoQQ8A\nAAAAAEChBD0AAAAAAACFEvQAAAAAAAAUStADAAAAAABQKEEPAAAAAABAoQQ9AAAAAAAAhRL0AAAA\nAAAAFErQAwAAAAAAUChBDwAAAAAAQKEEPQAAAAAAAIUS9AAAAAAAABRK0AMAAAAAAFAoQQ8AAAAA\nAEChBD0AAAAAAACFEvQAAAAAAAAUStADAAAAAABQKEEPAAAAAABAoQQ9AAAAAAAAhRL0AAAAAAAA\nFErQAwAAAAAAUChBDwAAAAAAQKEEPQAAAAAAAIUS9AAAAAAAABRK0AMAAAAAAFAoQQ8AAAAAAECh\nBD0AAAAAAACFEvQAAAAAAAAUStADAAAAAABQKEEPAAAAAABAoQQ9AAAAAAAAhRL0AAAAAAAAFErQ\nAwAAAAAAUChBDwAAAAAAQKEEPQAAAAAAAIUS9AAAAAAAABRK0AMAAAAAAFAoQQ8AAAAAAEChBD0A\nAAAAAACFEvQAAAAAAAAUStADAAAAAABQKEEPAAAAAABAoQQ9AAAAAP+vvTuO1q2s6wT+vVyQyOkK\nE8GFpS1q1IcscQxNKCEIhBENMx0pqxVhs0IZc66jopUjaWbmgtSIBaYuoaaayUZzEXYJUlsKa0BC\nFyb+nCaLWgRCMlwyDbj3zB97v/Lycs8974Vz3nOfy+ez1lnnnL2fd7/75XzZd+/3++69AQA6pegB\nAAAAAADolKIHAAAAAACgU4oeAAAAAACATil6AAAAAAAAOqXoAQAAAAAA6JSiBwAAAAAAoFOKHgAA\nAAAAgE4pegAAAAAAADql6AEAAAAAAOiUogcAAAAAAKBTih4AAAAAAIBOKXoAAAAAAAA6pegBAAAA\nAADolKIHAAAAAACgU4oeAAAAAACATil6AAAAAAAAOqXoAQAAAAAA6JSiBwAAAAAAoFOKHgAAAAAA\ngE4pegAAAAAAADql6AEAAAAAAOiUogcAAAAAAKBTih4AAAAAAIBOKXoAAAAAAAA6pegBAAAAAADo\nlKIHAAAAAACgU4oeAAAAAACATil6AAAAAAAAOqXoAQAAAAAA6JSiBwAAAAAAoFOKHgAAAAAAgE4p\negAAAAAAADql6AEAAAAAAOiUogcAAAAAAKBTih4AAAAAAIBOKXoAAAAAAAA6pegBAAAAAADolKIH\nAAAAAACgU4oeAAAAAACATil6AAAAAAAAOqXoAQAAAAAA6JSiBwAAAAAAoFOKHgAAAAAAgE4pegAA\nAAAAADql6AEAAAAAAOiUogcAAAAAAKBTih4AAAAAAIBOKXoAAAAAAAA6pegBAAAAAADolKIHAAAA\nAACgU4oeAAAAAACATil6AAAAAAAAOqXoAQAAAAAA6JSiBwAAAAAAoFOKHgAAAAAAgE4pegAAAAAA\nADql6AEAAAAAAOiUogcAAAAAAKBTih4AAAAAAIBOKXoAAAAAAAA6pegBAAAAAADolKIHAAAAAACg\nU4oeAAAAAACATil6AAAAAAAAOqXoAQAAAAAA6JSiBwAAAAAAoFOKHgAAAAAAgE4pegAAAAAAADql\n6AEAAAAAAOiUogcAAAAAAKBTih4AAAAAAIBOKXoAAAAAAAA6pegBAAAAAADolKIHAAAAAACgU4oe\nAAAAAACATil6AAAAAAAAOqXoAQAAAAAA6NS+q73A1tobkrwwyZFJvpbkmiTnVtUXp8bsn+SCJGck\n2T/J1iSvqKovT415QpKLk5yQ5J4klyV5fVXtmBpzQpLzk3x3kluSvLWqLp1Zn3OSvCbJ5iSfTfLK\nqrp+d9YFAAAAAABgT7QWZ/Qcl+Q3kzwryclJ9ktyZWvtgKkx70zyvCQvSnJ8ksOT/NFkZmttnyRX\nZCiijkny00nOTPLmqTFHJLk8ydVJnpbkXUne21p7ztSYMzIUQW9K8vQMRc/W1trB864LAAAAAADA\nnmrVz+ipqtOmf2+tnZnky0mOTvLJ1tqmJGcl+bGq+sQ45meS3Nxa+76qui7JqRnOCDqxqu5MclNr\n7Y1Jfq21dl5V3Z/k5Un+pqpeN3nq1tqzk2xJ8mfjtC1JLqmqy8bnOTtDqXNWkl+fc10AAAAAAAD2\nSIu4R8+BSZaSfGX8/egMBdPVkwFVVRkuvXbsOOmYJDeNJc/E1iSPy3CZtsmYq2aea+tkGa21/cbn\nmn6epfExk+d5xhzrAgAAAAAAsEda9TN6prXWNmS4NNonq+rz4+TNSe6tqm0zw28f503G3L6T+ZN5\nn93FmE3jfXf+bZKNy4xp48+HzrEuc9m4cRGdGTwyk5zKK72QWXoir/REXumJvNITeaU3MktP5JWe\nLDqna1r0JLkoyVOSPHuOsRsynPmzkl2N2TDnmJWeZ951+YZNmw5YeRDsIeSV3sgsPZFXeiKv9ERe\n6Ym80huZpSfyCg+1ZkVPa+3CJKclOa6qbp2adVuSx7TWNs2cSXNIHjj75rYkz5xZ5KFT8ybfD50Z\nc0iSbVV1b2vtziTblxkz/Twrrctctm37WrZv37E7D4GF27hxn2zadIC80g2ZpSfySk/klZ7IKz2R\nV3ojs/REXunJJK+LsiZFz1jyvCDJD1bVLTOzb0hyf5KTknxoHP/kJN+e5JpxzLVJfqG1dvDUfXpO\nSXJ3kpunxjx3ZtmnjNNTVfe11m4Yn+cj4/NsGH9/9xzrcu3uvObt23fk/vttYOiDvNIbmaUn8kpP\n5JWeyCs9kVd6I7P0RF7hoVa96GmtXZTkx5OcnuSrrbXJGTV3V9XXq2pba+19SS5ord2V5J4Mxcun\nqur6ceyVST6f5Hdaa+cmOSzJW5JcWFX3jWMuTvKfW2tvT/L+DGXNizOcRTRxQZJLx8LnuiRbknxz\nkg8kyQrrct2q/ocBAAAAAABYZWtxR6Czk2xK8vEkt059vWRqzJYklyf54NS4F01mVtWOJM/PcOm1\na5JclqGcedPUmL9N8rwkJyf5zLjMl1XVVVNj/meS/5rkzUluTHJUklOr6o551wUAAAAAAGBPtWFp\naWm912FvsHTXXV91yiB7vH333ScHHfTYyCu9kFl6Iq/0RF7pibzSE3mlNzJLT+SVnox53bCo51uL\nM3oAAAAAAABYAEUPAAAAAABApxQ9AAAAAAAAnVL0AAAAAAAAdErRAwAAAAAA0ClFDwAAAAAAQKcU\nPQAAAAAAAJ1S9AAAAAAAAHRK0QMAAAAAANApRQ8AAAAAAECnFD0AAAAAAACdUvQAAAAAAAB0StED\nAAAAAADQKUUPAAAAAABApxQ9AAAAAAAAnVL0AAAAAAAAdErRAwAAAAAA0ClFDwAAAAAAQKcUPQAA\nAAAAAJ1S9AAAAAAAAHRK0QMAAAAAANApRQ8AAAAAAECnFD0AAAAAAACdUvQAAAAAAAB0StEDAAAA\nAADQKUUPAAAAAABApxQ9AAAAAAAAnVL0AAAAAAAAdErRAwAAAAAA0ClFDwAAAAAAQKcUPQAAAAAA\nAJ1S9AAAAAAAAHRK0QMAAAAAANApRQ8AAAAAAECnFD0AAAAAAACdUvQAAAAAAAB0StEDAAAAAADQ\nKUUPAAAAAABApxQ9AAAAAAAAnVL0AAAAAAAAdErRAwAAAAAA0ClFDwAAAAAAQKcUPQAAAAAAAJ1S\n9AAAAAAAAHRK0QMAAAAAANApRQ8AAAAAAECnFD0AAAAAAACdUvQAAAAAAAB0StEDAAAAAADQKUUP\nAAAAAABApxQ9AAAAAAAAnVL0AAAAAAAAdErRAwAAAAAA0ClFDwAAAAAAQKcUPQAAAAAAAJ1S9AAA\nAAAAAHRK0QMAAAAAANApRQ8AAAAAAECnFD0AAAAAAACdUvQAAAAAAAB0StEDAAAAAADQKUUPAAAA\nAABApxQ9AAAAAAAAnVL0AAAAAAAAdErRAwAAAAAA0ClFDwAAAAAAQKcUPQAAAAAAAJ1S9AAAAAAA\nAHRK0QMAAAAAANApRQ8AAAAAAECnFD0AAAAAAACdUvQAAAAAAAB0StEDAAAAAADQKUUPAAAAAABA\npxQ9AAAAAAAAnVL0AAAAAAAAdErRAwAAAAAA0ClFDwAAAAAAQKcUPQAAAAAAAJ1S9AAAAAAAAHRK\n0QMAAAAAANApRQ8AAAAAAECnFD0AAAAAAACdUvQAAAAAAAB0StEDAAAAAADQKUUPAAAAAABApxQ9\nAAAAAAAAnVL0AAAAAAAAdErRAwAAAAAA0ClFDwAAAAAAQKcUPQAAAAAAAJ1S9AAAAAAAAHRK0QMA\nAAAAANApRQ8AAAAAAECnFD0AAAAAAACdUvQAAAAAAAB0StEDAAAAAADQKUUPAAAAAABApxQ9AAAA\nAAAAnVL0AAAAAAAAdErRAwAAAAAA0ClFDwAAAAAAQKcUPQAAAAAAAJ1S9AAAAAAAAHRK0QMAAAAA\nANApRQ8AAAAAAECnFD0AAAAAAACdUvQAAAAAAAB0StEDAAAAAADQKUUPAAAAAABApxQ9AAAAAAAA\nnVL0AAAAAAAAdErRAwAAAAAA0ClFDwAAAAAAQKcUPQAAAAAAAJ1S9AAAAAAAAHRK0QMAAAAAANAp\nRQ8AAAAAAECnFD0AAAAAAACdUvQAAAAAAAB0StEDAAAAAADQKUUPAAAAAABApxQ9AAAAAAAAnVL0\nAAAAAAAAdErRAwAAAAAA0ClFDwAAAAAAQKcUPQAAAAAAAJ1S9AAAAAAAAHRK0QMAAAAAANApRQ8A\nAAAAAECnFD0AAAAAAACdUvQAAAAAAAB0StEDAAAAAADQKUUPAAAAAABApxQ9AAAAAAAAnVL0AAAA\nAAAAdErRAwAAAAAA0ClFDwAAAAAAQKcUPQAAAAAAAJ1S9AAAAAAAAHRK0QMAAAAAANApRQ8AAAAA\nAECnFD0AAAAAAACdUvQAAAAAAAB0at/1XoE9RWvtnCSvSbI5yWeTvLKqrl/ftQIAAAAAAFieM3qS\ntNbOSHJ+kjcleXqGomdra+3gdV0xAAAAAACAXVD0DLYkuaSqLquqLyQ5O8m/JDlrfVcLAAAAAABg\neY/6oqe1tl+So5NcPZlWVUtJrkpy7HqtFwAAAAAAwErcoyc5OMnGJLfPTL89SZt3IRs3Puo7Mzow\nyam80guZpSfySk/klZ7IKz2RV3ojs/REXunJonOq6FnehiRL847dtOmAtVwXWFXySm9klp7IKz2R\nV3oir/REXumNzNITeYWHUn8mdybZnuTQmemH5KFn+QAAAAAAAOwxHvVFT1Xdl+SGJCdNprXWNoy/\nX7Ne6wUAAAAAALASl24bXJDk0tbaDUmuS7IlyTcn+cB6rhQAAAAAAMCubFhamvc2NHu31torkrwu\nwyXcPpPklVX16fVdKwAAAAAAgOUpegAAAAAAADr1qL9HDwAAAAAAQK8UPQAAAAAAAJ1S9AAAAAAA\nAHRK0QMAAAAAANApRQ8AAAAAAECn9l3vFdgTtNaOS/LaJEcnOSzJj1TVR6bm70iylGTDzENfW1Xn\nj2MOSnJhkucn2ZHkj5K8qqq+OrWco8Yxz0zy5SQXVtU71up1sXeaI6+PTfL2JC9I8q1JvpTk3VV1\nydSY/ZNckOSMJPsn2ZrkFVX15akxT0hycZITktyT5LIkr6+qHWv5+ti7zJHXQ5L8epLnJDkwySeS\n/HxV/fXUGHllIVprb0jywiRHJvlakmuSnFtVX5wasyp5bK2dkOT8JN+d5JYkb62qS9fw5bGXmTOv\n/ynJS5N8b5JvSXJgVW2bWY59WBZipcyOWfzlJKckeUKSO5N8OMkbp3NrG8sizLmNvTjJyUkOT/LP\nU2Nqaoy8submyevM+I8mOTUPPTaTV9bcnNvXjyc5fuphS0kuqapXTI2RVxZi3m1sa+3YJL+S5FlJ\ntie5McmpVfWv4/w1P+5yRs/gsUk+k+ScDBuPWZszvEG5efw6K8Mf5INTY34vyXclOSnJ8zJskKbf\nWP+WDG8GfSnDwfZrk5zXWvvZVX4t7P1WyutvZDhAfmmGjdA7k1zYWnv+1Jh3ZsjpizJk9fAMG5gk\nSWttnyRXZCiDj0ny00nOTPLm1X0pPAqslNc/TnJEkh9O8u8z7Hxd1Vo7YGqMvLIoxyX5zQw7Zicn\n2S/Jlaudx9baEUkuT3J1kqcleVeS97bWnrM2L4u91Dx5PSDJR5O8NTvfBif2YVmclTJ7eIZjrlcn\n+Z4M28//kOS9kwXYxrJA82xjP50hf0dmOP7akGRra21DIq8s1Dx5TZK01rZkeANyaWa6vLIo8+R1\nKcl7khyaB96Tfd1kpryyYCtmdix5PprkT5M8Y/y6MEN/MLHmx10blpaWO+Z7dBrP3nnQpxp2MubD\nSR5bVc8Zfz8yyeeTHF1VN47TTk3yJ0keX1W3tdZenuQtSTZX1f3jmLcleUFVPWVNXxR7rZ3ltbV2\nU5I/qKq3Tk37dJIrquq/tdY2JbkjyY9V1YfG+S3JzUmOqarrWmvPTfKRJIdV1Z3jmJ9L8mtJvm2S\nYdgds3ltrT0pSSV5SlV9YZy2IcltSd5QVe+XV9ZTa+3gDJ+iOb6qPrlaeWytvT3Jc6vqqKnn+v0k\nj6uq0xb5Gtl7zOZ1Zt4PJvnzJAfNnBlhH5Z1s6vMTo15cZLfyXDstcM2lvUyZ16fmuEDTk+sqi/J\nK+tluby21p6WIZPPzHDMNX1sJq+si53ltbX2sSQ3VtWrl3mMvLJulsnstUm2VtV5yzxmIcddzujZ\nTW24zNBpmfpkWZJjk9w1+UONrsrQQD9r/P2YJH8x84bj1mGR7XFruMo8+lyT5PTW2uFJ0lo7McmT\nMuQtGS6htW+GTzUkScbLC9ySIcvJkNebJv9gjrYmeVyGU15hNeyfYTv5r5MJVTX5/dnjpGdEXlk/\nB2bI6FfG31dr+3lMhv2EzIw5NvDwzeZ1HvZhWU/zZPbAJNumLsNiG8t62WVe23D57LOS/E2Svx8n\nyyvr5SF5HT95/ntJzpm+5PAUeWW9LLd9/YnW2h2ttZtaa786c8aPvLKeHpTZ1tq3ZTh2urO19qnW\n2m2ttY+31n5g6jELOe5S9Oy+M5NsS/KhqWmbMzR531BV2zP8wTdPjbl9Zlm3T82D1fLKDJ8u/4fW\n2r0ZTmc9p6o+Nc7fnOTe2Wv0Z8ijvLJIX8jwBvnbWmsHttYe01o7N8njM5yanQynassrCzeeXfbO\nJJ+sqs+Pk1dr+7ncmE1tuAcQ7JZl8joP+7Csi3kyO35a8pcydUmL2MayDnaV19bay1tr92S4P8Qp\nSU6ZeoNGXlm4XeT1N8Zply/zUHll4XaR1/+e5Ccz3H/nV5P8VIYzfCfklXWxTGa/c/z+pgz7racm\n+cskV7fW/t04byHHXfvO9zKY8jNJfreq7p1j7IYsfz30yfysMAZ2189naIOfn+FN9OOTXNRau7Wq\n/nwXj1sprxPyyqoYT6f+0STvy/CP2/0ZPtFwxRwPl1fW2kVJnpIHzi7bldXIo30CHolJXn9gpYFz\nsg/LWttlZsdrlP9Jks8l+eU5lymzrJVd5fV3k1yZ4UNKr0nyh62175/j/QJ5Za08JK+ttdOT/FCG\ne6I+HPLKWtnp9rWqpq+i9FettdsyvGn+HVX1pRWWKa+spZ1ldnIizcVVddn486tbaydlONv3F3ex\nvFU97nJGz25orR2X5Ml58GXbkuHapofMjN2Y5KBx3mTMoTOPmzxmtq2Dh6W19k0Zbri8paquqKrP\nVdVFSf5HhgOPZMjiY8Z7TUw7JA9kcWd5nfwur6yaqrqxqr43wynWh43Xyj04w83nEnllHbTWLsxw\nmdYTqurWqVmPNI8r7RNsm/ODJPANM3n9x918uH1YFm6lzLbW/k2Gy1T8vyQ/On7accI2loVaKa9V\ndU9V/d/xGv3/McmRSV44zpZXFmoXeT0xwyfO726t3ddau2+c/r9aa5MPg8orC7Wb+7D/e/z+xPG7\nvLJwu8js5OebZx5yc5JvH39eyHGXomf3vCzJDVX1uZnp1yY5sLX29KlpJ2Vo3a6bGnP8+EecOCXD\n5f3vXqsV5lFnv/Frtundngf+f78hw5kTJ01mttaenGHjc8046dokTx0vmTFxSpK7M9w8DFbVeJD8\nT621J2W4L8+Hx1nyykKNO28vSHJiVd0yM/uR5vHmqTEn5cFOGafD3FbI6zzsw7JQK2V2PJPnyiRf\nS3L6Tt6IsY1lYR7GNnafDNvPySWB5JWFWSGvb0tyVJKnTX0lyasyXLUmkVcW6GFsX5+e4X2uyRvq\n8spC7SqzVfW3SW5N0mYe9uQkfzf+vJDjrg1LS85WG2+c+MQM/3H/Msmrk3wsyVeq6u/HMZsy/NG2\nVNVv72QZV2Ro2V6e5DFJ3p/kuqr6qanHfyHJnyV5e5KnZrhc0auq6n1r+gLZq6yU19bax5J8a4Z7\n9fxdhmuaXpTkv1TVe8ZlXJTkuRl26u5J8u4kO6rquHH+PkluzJD5czNciuCyJO+pqjcu5pWyN5gj\nry9OckeGywweleFap9dX1UumliGvLMSYtR9PcnqSL07Nuruqvj415hHlsbV2RIbLEf1Whv2FkzJk\n/7Sqmr1hKOzUnHk9NMP1nJ+Z5D0ZLud6T5JbququcYx9WBZipcyOZ/JcleSbMpwR8S9TY+6oqh22\nsSzKHHn9jiRnZCgm70jyhCSvz3Cz5e+qqjvllUWZZ59gJ4/ZkeRHquoj4+/yykLMsX39ziQvzXBJ\n93/KUExekGH/9YfGZcgrCzPncderkpyX5GeTfCbJmRne//qeyeUGF3Hc5YyewTMybCBuyNAQEuNK\n0AAAAZxJREFUn5/hDcnp60GfMX7/g2WW8dIMf4yrklye5C+S/Nxk5njj5lOTHJHk00nekeQ8B8g8\nDCvl9Ywk12e4XvRfJXldkjdMSp7Rlgw5/WCSj2f4x/FFk5lVtSPDPX62Z/iU+mVJPpDhxmKwO1bK\n62EZbqp4c4adrkszbE+nySuLcnaSTXkgZ5Ovl0yNecR5HD/x87wkJ2fYCdyS5GUOONhN8+T17Azb\n4EsybIM/kWEb/MNTY+zDsigrZfboDKXkU5P89TjvH8fvj09sY1molfL69STHZbiX1P9J8vsZPkn+\n/VV1ZyKvLNQ8+wSzHvSpb3llgVbK670ZMrY1w/sE70jyhxneZE8iryzcitvYqnpXhrMnL8iQtxOT\nnDxzT6k1P+5yRg8AAAAAAECnnNEDAAAAAADQKUUPAAAAAABApxQ9AAAAAAAAnVL0AAAAAAAAdErR\nAwAAAAAA0ClFDwAAAAAAQKcUPQAAAAAAAJ1S9AAAAAAAAHRK0QMAAAAAANApRQ8AAAAAAECnFD0A\nAAAAAACdUvQAAAAAAAB06v8DvHUmMsa5iPEAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "### Step 2: for the sake of clarity and ease of display, we extract SLO and Paso Robles houses into separate data frames\n", "### This is purely for visualization purposes\n", "### We plot the entire dataset\n", "\n", "slo = cleaned.query(\"City =='San Luis Obispo'\")\n", "paso = cleaned.query(\"City =='Paso Robles'\")\n", "simpleData = cleaned\n", "\n", "plt.figure(figsize=(20,15))\n", "\n", "plt.plot(slo['Footage'], slo['Price'], 'ro')\n", "plt.plot(paso['Footage'], paso['Price'], 'bs')\n", "\n", "plt.xlim(1700, 2600 )\n", "plt.ylim(0,1500000)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "\n", "### Add +1/-1 class label to the dataset\n", "\n", "\n", "### Add the Theta column to the dataset. Weighgts should be set to -1\n", "\n", "\n", "### Change the order of the data points in your data frame, so that SLO and Paso points are interleaved.\n", "\n", "\n", "### output (print) the final state of the data frame you will be using\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "collapsed": true }, "outputs": [], "source": [ "### Step 4: Set up SVM parameters\n", "\n", "## learning rate. Learning rate for this example should be really small, unless you have modified your Price column\n", "\n", "Rate = 0\n", "\n", "## The Hinge-Loss multiplier (C). If you want a large buffer zone, possibly with misclassified data, C should be low\n", "## If you want to lower the number of misclassified data points, C should be high.\n", "## Experiment with C in your work to see the difference it makes.\n", "\n", "C = 0 \n", "\n", "## Starting vector. There is a slight hack here in selecting w[0] to be -1. This ensures that the \"up\" direction for your plane\n", "## points towards higher prices (i.e., towards SLO data points, which have +1 labels).\n", "\n", "w = np.array([-1,0,0])\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [], "source": [ "### SVM simulation\n", "\n", "### Just put your own code running your SVM simulation here and (possibly in a separate frame) computing\n", "### the accuracy\n", "\n", "### Make sure to visualize data as convenient.\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "### Challenge task\n", "\n", "### Investigate how different parameters of the SVM (Rate, C, starting vector) affect conversion to an acceptable soultuion\n", "### try running a grid search" ] }, { "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 }