Files
FYS-STK4155/doc/LectureNotes/_build/jupyter_execute/chapter6.ipynb
T
Morten Hjorth-Jensen 3b9f0dbb29 update
2023-11-08 15:57:33 +01:00

1542 lines
219 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Decision trees, overarching aims\n",
"\n",
"\n",
"We start here with the most basic algorithm, the so-called decision\n",
"tree. With this basic algorithm we can in turn build more complex\n",
"networks, spanning from homogeneous and heterogenous forests (bagging,\n",
"random forests and more) to one of the most popular supervised\n",
"algorithms nowadays, the extreme gradient boosting, or just\n",
"XGBoost. But let us start with the simplest possible ingredient.\n",
"\n",
"Decision trees are supervised learning algorithms used for both,\n",
"classification and regression tasks.\n",
"\n",
"\n",
"The main idea of decision trees\n",
"is to find those descriptive features which contain the most\n",
"**information** regarding the target feature and then split the dataset\n",
"along the values of these features such that the target feature values\n",
"for the resulting underlying datasets are as pure as possible.\n",
"\n",
"The descriptive features which reproduce best the target/output features are normally said\n",
"to be the most informative ones. The process of finding the **most\n",
"informative** feature is done until we accomplish a stopping criteria\n",
"where we then finally end up in so called **leaf nodes**. \n",
"\n",
"## Basics of a tree\n",
"\n",
"A decision tree is typically divided into a **root node**, the **interior nodes**,\n",
"and the final **leaf nodes** or just **leaves**. These entities are then connected by so-called **branches**.\n",
"\n",
"The leaf nodes\n",
"contain the predictions we will make for new query instances presented\n",
"to our trained model. This is possible since the model has \n",
"learned the underlying structure of the training data and hence can,\n",
"given some assumptions, make predictions about the target feature value\n",
"(class) of unseen query instances.\n",
"\n",
"\n",
"## General Features\n",
"\n",
"The overarching approach to decision trees is a top-down approach.\n",
"\n",
"* A leaf provides the classification of a given instance.\n",
"\n",
"* A node specifies a test of some attribute of the instance.\n",
"\n",
"* A branch corresponds to a possible values of an attribute.\n",
"\n",
"* An instance is classified by starting at the root node of the tree, testing the attribute specified by this node, then moving down the tree branch corresponding to the value of the attribute in the given example.\n",
"\n",
"This process is then repeated for the subtree rooted at the new\n",
"node.\n",
"\n",
"\n",
"\n",
"In simplified terms, the process of training a decision tree and\n",
"predicting the target features of query instances is as follows:\n",
"\n",
"1. Present a dataset containing of a number of training instances characterized by a number of descriptive features and a target feature\n",
"\n",
"2. Train the decision tree model by continuously splitting the target feature along the values of the descriptive features using a measure of information gain during the training process\n",
"\n",
"3. Grow the tree until we accomplish a stopping criteria create leaf nodes which represent the *predictions* we want to make for new query instances\n",
"\n",
"4. Show query instances to the tree and run down the tree until we arrive at leaf nodes\n",
"\n",
"Then we are essentially done!"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2nd degree coefficients:\n",
"zero power: 0.9887034589972739\n",
"first power: -0.10518426027535331\n",
"second power: 0.0005840075008020406\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAj4AAAHFCAYAAADyj/PrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAAC+aElEQVR4nOzdd3hTZRvA4V+6dwuli7ZQ9pQlG6WgHyAbVEAQBERRQEWGIIqAoCAIqIiioDIUBBQFZe+9t6wyBFqgLVC6d5Pz/XFMmnTv0va5rysXyZnvSTnJk3c8r0ZRFAUhhBBCiDLArLgLIIQQQghRVCTwEUIIIUSZIYGPEEIIIcoMCXyEEEIIUWZI4COEEEKIMkMCHyGEEEKUGRL4CCGEEKLMkMBHCCGEEGWGBD5CCCGEKDMk8BGiGC1btgyNRmN4WFhY4OPjw9ChQ7l7926uj9euXTvatWtX8AUtBnv37kWj0bB3795C21e/nf5hbm6Om5sb3bt35+TJk3kreAmk/39469at4i6KEIXOorgLIISApUuXUrt2beLj49m/fz+zZs1i3759/PPPP9jb2xd38YpFkyZNOHLkCHXr1i30c82cOZP27duTnJzMmTNn+Pjjj/H39+fs2bPUqFGj0M9f3Lp27cqRI0fw8vIq7qIIUegk8BHiMVC/fn2aNm0KQPv27dFqtcyYMYP169fz8ssvF3PpioeTkxMtW7YsknPVqFHDcK6nn34aFxcXBg8ezC+//MLHH39cJGXQi4uLw87OrkjP6ebmhpubW5GeU4jiIk1dQjyG9F/Ct2/fBiAhIYFJkyZRpUoVrKys8Pb2ZtSoUURERGR6DEVRqFGjBp06dUq3LiYmBmdnZ0aNGgWkNvn8+uuvfPjhh1SsWBEnJyf+97//ERAQkG7/n376iYYNG2JjY0P58uXp3bs3ly9fNtlmyJAhODg4cOXKFTp16oS9vT1eXl589tlnABw9epSnnnoKe3t7atasyfLly032z6i56uTJk7z00kv4+flha2uLn58f/fv3N7xPBUUfhIaGhposv3btGgMGDMDd3R1ra2vq1KnDN998k27/ixcv0rFjR+zs7HBzc2PUqFFs2rQp3fW0a9eO+vXrs3//flq3bo2dnR2vvvoqAFFRUYwfP97kb/7uu+8SGxtrcq7ffvuNFi1a4OzsjJ2dHVWrVjUcA0Cn0/HJJ59Qq1YtbG1tcXFxoUGDBnz11VeGbTJr6srN3/n69et06dIFBwcHfH19GTduHImJiTl/04UoIhL4CPEYun79OqD+ElcUhV69ejF37lwGDRrEpk2bGDt2LMuXL+eZZ57J9MtFo9Hw9ttvs2PHDq5du2aybsWKFURFRRkCH70PPviA27dv88MPP7B48WKuXbtG9+7d0Wq1hm1mzZrFsGHDqFevHn/88QdfffUV58+fp1WrVunOk5yczPPPP0/Xrl3ZsGEDnTt3ZtKkSXzwwQcMHjyYV199lT///JNatWoxZMgQTp06leX7cuvWLWrVqsWXX37Jtm3bmD17NsHBwTRr1oyHDx/m+P3Nzs2bNwGoWbOmYdmlS5do1qwZFy5cYN68eWzcuJGuXbvyzjvvmNQKBQcH4+/vT0BAAIsWLWLFihVER0fz1ltvZXiu4OBgBg4cyIABA9i8eTMjR44kLi4Of39/li9fzjvvvMOWLVuYOHEiy5Yto0ePHiiKAsCRI0fo168fVatWZfXq1WzatIkpU6aQkpJiOP6cOXOYNm0a/fv3Z9OmTaxZs4Zhw4ZlGTRD7v/OPXr04Nlnn2XDhg28+uqrfPHFF8yePTtX77sQRUIRQhSbpUuXKoBy9OhRJTk5WYmOjlY2btyouLm5KY6OjkpISIiydetWBVDmzJljsu+aNWsUQFm8eLFhmb+/v+Lv7294HRUVpTg6OiqjR4822bdu3bpK+/btDa/37NmjAEqXLl1Mtlu7dq0CKEeOHFEURVHCw8MVW1vbdNsFBgYq1tbWyoABAwzLBg8erADKunXrDMuSk5MVNzc3BVBOnz5tWB4WFqaYm5srY8eOTVemPXv2ZPr+paSkKDExMYq9vb3y1Vdf5Wpf4+3WrFmjJCcnK3FxccqhQ4eUWrVqKXXr1lXCw8MN23bq1Enx8fFRIiMjTY7x1ltvKTY2NsqjR48URVGU9957T9FoNMrFixdNtuvUqVO6Mvn7+yuAsmvXLpNtZ82apZiZmSknTpwwWf77778rgLJ582ZFURRl7ty5CqBERERkeo3dunVTGjVqlOX7oP9/ePPmTUVR8vZ3Xrt2rcm2Xbp0UWrVqpXleYUoDlLjI8RjoGXLllhaWuLo6Ei3bt3w9PRky5YteHh4sHv3bkBtUjDWp08f7O3t2bVrV6bHdXR0ZOjQoSxbtszQRLJ7924uXbqUYQ1Ejx49TF43aNAASG1yO3LkCPHx8enK4uvryzPPPJOuLBqNhi5duhheW1hYUL16dby8vGjcuLFhefny5XF3d8+2ySomJoaJEydSvXp1LCwssLCwwMHBgdjY2HRNMLnRr18/LC0tsbOzo02bNkRFRbFp0yZcXFwAtalx165d9O7dGzs7O1JSUgyPLl26kJCQwNGjRwHYt28f9evXT9cpu3///hmeu1y5cjzzzDMmyzZu3Ej9+vVp1KiRybk6depk0lzWrFkzAPr27cvatWszHAnYvHlzzp07x8iRI9m2bRtRUVHZvh95+Tt3797dZFmDBg0KvAlSiIIggY8Qj4EVK1Zw4sQJzpw5w7179zh//jxt2rQBICwsDAsLi3SdTzUaDZ6enoSFhWV57Lfffpvo6GhWrlwJwMKFC/Hx8aFnz57ptnV1dTV5bW1tDUB8fLyhLECGo38qVqyYrix2dnbY2NiYLLOysqJ8+fLp9reysiIhISHLaxkwYAALFy7ktddeY9u2bRw/fpwTJ07g5uZmKGNezJ49mxMnTrBv3z4+/PBDQkND6dWrl6EZMSwsjJSUFL7++mssLS1NHvrATt/UFhYWhoeHR7pzZLQMMn4vQ0NDOX/+fLpzOTo6oiiK4Vxt27Zl/fr1pKSk8Morr+Dj40P9+vX59ddfDceaNGkSc+fO5ejRo3Tu3BlXV1eeffbZLIfrF8Tf2draOtu/pxDFQUZ1CfEYqFOnjqFDbVqurq6kpKTw4MEDk+BHURRCQkIMv/ozU716dTp37sw333xD586d+euvv/j4448xNzfPdTn1gVFwcHC6dffu3aNChQq5PmZORUZGsnHjRqZOncr7779vWJ6YmMijR4/ydeyqVasa3v+2bdtia2vL5MmT+frrrxk/fjzlypXD3NycQYMGpesXpVelShVAfY/SdooGCAkJyXA/jUaTblmFChWwtbXlp59+ynAf4/e5Z8+e9OzZk8TERI4ePcqsWbMYMGAAfn5+tGrVCgsLC8aOHcvYsWOJiIhg586dfPDBB3Tq1ImgoKAMR5AV599ZiMImNT5CPOaeffZZAH755ReT5evWrSM2NtawPiujR4/m/PnzDB48GHNzc15//fU8laVVq1bY2tqmK8udO3fYvXt3jsqSVxqNBkVRDLVQej/88INJ5+uCMGHCBKpXr85nn31GdHQ0dnZ2tG/fnjNnztCgQQOaNm2a7qEPFvz9/blw4QKXLl0yOebq1atzfP5u3bpx48YNXF1dMzyXn59fun2sra3x9/c3dCg+c+ZMum1cXFx48cUXGTVqFI8ePco0YWFx/p2FKGxS4yPEY65Dhw506tSJiRMnEhUVRZs2bTh//jxTp06lcePGDBo0KEfHqFu3Lnv27GHgwIG4u7vnqSwuLi589NFHfPDBB7zyyiv079+fsLAwPv74Y2xsbJg6dWqejpsTTk5OtG3bls8//5wKFSrg5+fHvn37+PHHHw19cQqKpaUlM2fOpG/fvnz11VdMnjyZr776iqeeeoqnn36aESNG4OfnR3R0NNevX+fvv/829MV69913+emnn+jcuTPTp0/Hw8ODVatWceXKFQDMzLL/vfnuu++ybt062rZty5gxY2jQoAE6nY7AwEC2b9/OuHHjaNGiBVOmTOHOnTs8++yz+Pj4EBERwVdffYWlpSX+/v4AdO/e3ZAnys3Njdu3b/Pll19SuXLlTJMzFuffWYjCJjU+QjzmNBoN69evZ+zYsSxdupQuXboYhrbv3r07XQ1IZvr27QuQ6bDqnJo0aRI//PAD586do1evXrz11lvUq1ePw4cPF3qW41WrVtG+fXsmTJjA888/z8mTJ9mxYwfOzs4Ffq4+ffrQokUL5s+fT2RkJHXr1uX06dPUr1+fyZMn07FjR4YNG8bvv/9uUgNSsWJF9u3bR82aNXnzzTd5+eWXsbKyYvr06QA5CtLs7e05cOAAQ4YMYfHixXTt2pW+ffuyYMECfHx8DDU+LVq0ICQkhIkTJ9KxY0eGDx+Ora0tu3fvpl69eoCaEHP//v28+eabdOjQgcmTJ/Pss8+yb98+LC0tMy1Dcf6dhShMGkX5LyGEEKJUa9q0KRqNhhMnThR3Ucqk4cOH8+uvvxIWFoaVlVVxF0eIMkuauoQoxaKiorhw4QIbN27k1KlT/Pnnn8VdpDJh+vTpVKxYkapVqxITE8PGjRv54YcfmDx5sgQ9QhQzCXyEKMVOnz5N+/btcXV1ZerUqfTq1au4i1QmWFpa8vnnn3Pnzh1SUlKoUaMG8+fPZ/To0cVdNCHKPGnqEkIIIUSZIZ2bhRBCCFFmSOAjhBBCiDJDAh8hhBBClBnSuTkNnU7HvXv3cHR0zDCVvBBCCCEeP4qiEB0dTcWKFbNMFCqBTxr37t3D19e3uIshhBBCiDwICgrCx8cn0/US+KTh6OgIqG+ck5NTMZdGCCGEEDkRFRWFr6+v4Xs8MxL4pKFv3nJycpLARwghhChhsuumIp2bhRBCCFFmSOAjhBBCiDJDAh8hhBBClBnSxycPdDodSUlJxV0MIQqEpaUl5ubmxV0MIYQoEhL45FJSUhI3b95Ep9MVd1GEKDAuLi54enpK7iohRKkngU8uKIpCcHAw5ubm+Pr6ZpkgSYiSQFEU4uLiuH//PgBeXl7FXCIhhChcEvjkQkpKCnFxcVSsWBE7O7viLo4QBcLW1haA+/fv4+7uLs1eQohSTaosckGr1QJgZWVVzCURomDpA/nk5ORiLokQQhQuCXzyQPpBiNJG/k8LIcoKCXyEEEIIUWZI4CMKnZ+fH19++WVxF6NA3Lp1C41Gw9mzZwHYu3cvGo2GiIiIYi2XEEKInJHApwwYMmQIGo0GjUaDhYUFlSpVYsSIEYSHhxd30QrN1q1b0Wg0hISEmCz39PTE19fXZNmdO3fQaDRs3769SMpm/PewtLTEw8ODDh068NNPP+U6TcKyZctwcXEpnIIKIUQpJIFPGfHcc88RHBzMrVu3+OGHH/j7778ZOXJkcRer0Dz11FNYWFiwd+9ew7LLly+TkJBAVFQU169fNyzfs2cPlpaWtGnTpsjKZ/z32LJlC+3bt2f06NF069aNlJSUIiuHEEIUpYCAAEJDQ4s1F54EPmWEtbU1np6e+Pj40LFjR/r162dSw6HVahk2bBhVqlTB1taWWrVq8dVXX5kcY8iQIfTq1Yu5c+fi5eWFq6sro0aNMhkJdP/+fbp3746trS1VqlRh5cqV6coSGBhIz549cXBwwMnJib59+xIaGmpYP23aNBo1asRPP/1EpUqVcHBwYMSIEWi1WubMmYOnpyfu7u58+umnmV6vg4MDzZo1Mwl89u7dy1NPPcVTTz2Vbnnz5s2xt7dn69atPPXUU7i4uODq6kq3bt24ceNGjt/n+Ph4unbtSsuWLXn06FGm2+n/Ht7e3jRp0oQPPviADRs2sGXLFpYtW2bYbv78+TzxxBPY29vj6+vLyJEjiYmJMZR76NChREZGGmqQpk2bBsAvv/xC06ZNcXR0xNPTkwEDBhhy9QghRHFp164dnp6enDt3rtjKIHl88kFRFOKS44rl3HaWdnkeifPvv/+ydetWLC0tDct0Oh0+Pj6sXbuWChUqcPjwYYYPH46Xlxd9+/Y1bLdnzx68vLzYs2cP169fp1+/fjRq1IjXX38dUIOjoKAgdu/ejZWVFe+8847JF66iKPTq1Qt7e3v27dtHSkoKI0eOpF+/fibByI0bN9iyZQtbt27lxo0bvPjii9y8eZOaNWuyb98+Dh8+zKuvvsqzzz5Ly5YtM7zO9u3b8/vvv5uUvV27duh0Ovbs2cNrr71mWP7yyy8DEBsby9ixY3niiSeIjY1lypQp9O7dm7Nnz2absDIyMpJu3bphY2PDrl27sLe3z+FfRPXMM8/QsGFD/vjjD0PZzMzMWLBgAX5+fty8eZORI0cyYcIEvv32W1q3bs2XX37JlClTCAgIANSAD9QM4zNmzKBWrVrcv3+fMWPGMGTIEDZv3pyrMgkhREHRarWG7wNPT89iK4cEPvkQlxyHwyyHYjl3zKQY7K1y/sW6ceNGHBwc0Gq1JCQkAGptgp6lpSUff/yx4XWVKlU4fPgwa9euNQl8ypUrx8KFCzE3N6d27dp07dqVXbt28frrr3P16lW2bNnC0aNHadGiBQA//vgjderUMey/c+dOzp8/z82bNw19bX7++Wfq1avHiRMnaNasGaAGYj/99BOOjo7UrVuX9u3bExAQwObNmzEzM6NWrVrMnj2bvXv3Zhr4tGvXjpkzZxIcHIyXlxf79u3jvffeQ6fTGWqzgoKCuHnzJu3btwfghRdeMDnGjz/+iLu7O5cuXaJ+/fqZvr+hoaH069ePatWq8euvv+Y511Pt2rU5f/684fW7775reF6lShVmzJjBiBEj+Pbbb7GyssLZ2RmNRpPuQ+TVV181PK9atSoLFiygefPmxMTEGIIjIYQoSg8ePECn02FmZoa7u3uxlUOausqI9u3bc/bsWY4dO8bbb79Np06dePvtt022+e6772jatClubm44ODiwZMkSAgMDTbapV6+eSWZfLy8vQwR/+fJlLCwsaNq0qWF97dq1TTrfXr58GV9fX5MOxnXr1sXFxYXLly8blvn5+eHo6Gh47eHhQd26dU1qXTw8PLJsvmnTpg1WVlbs3buXS5cuER8fT5MmTXjyySeJiori2rVr7NmzB2tra1q3bg2oNU0DBgygatWqODk5UaVKFYB070Na//vf/6hatSpr167NV4JLRVFMavL27NlDhw4d8Pb2xtHRkVdeeYWwsDBiY2OzPM6ZM2fo2bMnlStXxtHRkXbt2uXoOoQQorAEBwcD4ObmVqwZ4qXGJx/sLO2ImRRTbOfODXt7e6pXrw7AggULaN++PR9//DEzZswAYO3atYwZM4Z58+bRqlUrHB0d+fzzzzl27JjJcYybx0BNfKfvpKYoimFZZtJ+sWe2PKPzZHXujNjZ2dG8eXP27NnDo0ePeOqppww3W+vWrdmzZw9HjhyhVatW2NjYANC9e3d8fX1ZsmQJFStWRKfTUb9+fZKSkjI9D0DXrl1Zt24dly5d4oknnshy26xcvnzZEGzdvn2bLl268OabbzJjxgzKly/PwYMHGTZsWJYZlmNjY+nYsSMdO3bkl19+wc3NjcDAQDp16pTtdQghRGHRj7It7jkBJfDJB41Gk6vmpsfJ1KlT6dy5MyNGjKBixYocOHCA1q1bm4z0yk2nXoA6deqQkpLCyZMnad68OaD24DfOcVO3bl0CAwMJCgoy1PpcunSJyMhIkyaxgtK+fXtWr15NeHi4odYDwN/fn71793LkyBGGDh0KQFhYGJcvX+b777/n6aefBuDgwYM5Os9nn32Gg4MDzz77LHv37qVu3bq5Luvu3bv5559/GDNmDAAnT54kJSWFefPmGWq61q5da7KPlZWVYSoVvStXrvDw4UM+++wzw3t88uTJXJdHCCEKkr7Gpzj794A0dZVZ7dq1o169esycOROA6tWrc/LkSbZt28bVq1f56KOPOHHiRK6OWatWLZ577jlef/11jh07xqlTp3jttdcMk2CC2iTUoEEDXn75ZU6fPs3x48d55ZVX8Pf3N2kiKyjt27fn2rVrbN26FX9/f8Nyf39/Nm7cyK1btwz9e8qVK4erqyuLFy/m+vXr7N69m7Fjx+b4XHPnzuXll1/mmWee4cqVK1lum5iYSEhICHfv3uX06dPMnDmTnj170q1bN1555RUAqlWrRkpKCl9//TX//vsvP//8M999953Jcfz8/IiJiWHXrl08fPiQuLg4KlWqhJWVlWG/v/76y1CzJ4QQxeVxqfGRwKcMGzt2LEuWLCEoKIg333yT559/nn79+tGiRQvCwsLylOdn6dKl+Pr64u/vz/PPP8/w4cNNOrFpNBrWr19PuXLlaNu2raFvzJo1awry0gxatWqFtbU1AE8++aRhebNmzdBqtdja2ho6YpuZmbF69WpOnTpF/fr1GTNmDJ9//nmuzvfFF1/Qt29fnnnmGa5evZrpdlu3bsXLyws/Pz+ee+459uzZw4IFC9iwYYOhOa5Ro0bMnz+f2bNnU79+fVauXMmsWbNMjtO6dWvefPNN+vXrh5ubG3PmzMHNzY1ly5bx22+/UbduXT777DPmzp2bq+sQQoiC9rjU+GgUfccMAUBUVBTOzs5ERkbi5ORksi4hIYGbN29SpUoVQ58QIUoD+b8thChsffr04ffff2fBggXpBtcUhKy+v41JjY8QQgghCt3jUuMjgY8QQgghCp308RFCCCFEmaEPfKTGRwghhBClWnR0tCHxqqdRctriIIGPEEIIIQqVvrbHwcwMh+bN4fjxYiuLBD5CCCGEKFT6js1eOh1EREClSsVWFgl8hBBCCFGoQv7La+YJMGMGFGM/Hwl8hBBCCFGogpcsAcDLxQXykBy3IEngI4QQQojCc/AgIf/16fHs0AEsineaUAl8RJ7dunULjUbD2bNni7sojx0/Pz++/PLL4i6GEEIUr+RkePNNgv976dWkSbEWByTwKRNmzZpFs2bNcHR0xN3dnV69ehEQEFAk527Xrh0ajQaNRoO1tTXe3t50796dP/74o0jOX5iMr834kZKSwokTJxg+fLhhW/0cZUIIUaZ88QVcvEiwpSVQ/Dl8QAKfMmHfvn2MGjWKo0ePsmPHDlJSUujYsaMhp0Jhe/311wkODub69eusW7eOunXr8tJLL5kEBoUlKSmpUI+vvzbjh4WFBW5ubtjZ2RXquYUQ4rF26xZMmwbAHTc3AHx8fIqvPP+RwKcM2Lp1K0OGDKFevXo0bNiQpUuXEhgYyKlTpwzb+Pn5MXPmTF599VUcHR2pVKkSixcvNjnO8ePHady4MTY2NjRt2pQzZ87k6Px2dnZ4enri6+tLy5YtmT17Nt9//z1Llixh586dhu3u3r1Lv379KFeuHK6urvTs2ZNbt24Z1qekpPDOO+/g4uKCq6srEydOZPDgwfTq1cuwTbt27XjrrbcYO3YsFSpUoEOHDgBcunSJLl264ODggIeHB4MGDeLhw4eG/RRFYc6cOVStWhVbW1saNmzI77//nuNrM37o3099U5efnx8AvXv3RqPRGF4LIUSppSjw9tsQHw/+/gRFRwPg6+tbzAWTwCd/FAViY4vnoSh5LnZkZCQA5cuXN1k+b948Q0AzcuRIRowYwZUrVwCIjY2lW7du1KpVi1OnTjFt2jTGjx+f5zIMHjyYcuXKGZq84uLiaN++PQ4ODuzfv5+DBw/i4ODAc889Z6i1mT17NitXrmTp0qUcOnSIqKioDJuPli9fjoWFBYcOHeL7778nODgYf39/GjVqxMmTJ9m6dSuhoaH07dvXsM/kyZNZunQpixYt4uLFi4wZM4aBAweyb9++PF+j3okTJwBYunQpwcHBhtdCCFFqbdgAGzeCpSWRc+YQ/V/g8zjU+KAIE5GRkQqgREZGplsXHx+vXLp0SYmPj1cXxMQoihqCFP0jJiZP16fT6ZTu3bsrTz31lMnyypUrKwMHDjTZzt3dXVm0aJGiKIry/fffK+XLl1diY2MN2yxatEgBlDNnzmR6Pn9/f2X06NEZrmvRooXSuXNnRVEU5ccff1Rq1aql6HQ6w/rExETF1tZW2bZtm6IoiuLh4aF8/vnnhvUpKSlKpUqVlJ49e5qcr1GjRibn+eijj5SOHTuaLAsKClIAJSAgQImJiVFsbGyUw4cPm2wzbNgwpX///llem6WlpWJvb294jB07VlEU9f384osvDNsCyp9//pnpsYpbuv/bQgiRV9HRiuLjo35XffCB8s8//yiAUq5cuUI9bVbf38aKd0yZKHJvvfUW58+f5+DBg+nWNWjQwPBco9Hg6enJ/fv3Abh8+TINGzY06bfSqlWrfJVFURQ0Gg0Ap06d4vr16zimmcMlISGBGzduEBkZSWhoKM2bNzesMzc358knn0Sn05ns07RpU5PXp06dYs+ePTg4OKQrg/7YCQkJhmYxvaSkJBo3bpzlNbz88st8+OGHhtcuLi5Zbi+EEKXetGlw5w5UqQIffkjQfzXnj0MzF4AEPvlhZwcxMcV37lx6++23+euvv9i/f3+G1Y2W//W619NoNIagQslH01pGtFot165do1mzZgDodDqefPJJVq5cmW5bt/86xenLZCyjctnb25u81ul0dO/endmzZ6fb1svLiwsXLgCwadMmvL29TdZbW1tneR3Ozs5Ur149y22EEKLMOHcO9Kk8Fi4EOzuCgoIACXxKB40G0nzJPo4UReHtt9/mzz//ZO/evVSpUiXXx6hbty4///wz8fHx2NraAnD06NE8l2n58uWEh4fzwgsvANCkSRPWrFmDu7s7Tk5OGe7j4eHB8ePHefrppwE1eDpz5gyNGjXK8lxNmjRh3bp1+Pn5YZFB4qy6detibW1NYGAg/v7+eb6mrFhaWqLVagvl2EII8VjQ6eDNN0GrhRdfhC5dAB67wEc6N5cBo0aN4pdffmHVqlU4OjoSEhJCSEgI8fHxOT7GgAEDMDMzY9iwYVy6dInNmzczd+7cHO0bFxdHSEgId+7c4dixY0ycOJE333yTESNG0L59e0BtMqpQoQI9e/bkwIED3Lx5k3379jF69Gju3LkDqDVWs2bNYsOGDQQEBDB69GjCw8PT1QJldP2PHj2if//+HD9+nH///Zft27fz6quvotVqcXR0ZPz48YwZM4bly5dz48YNzpw5wzfffMPy5ctz/B5lxc/Pj127dhESEkJ4eHiBHFMIIR4rP/wAR4+Co2NqrQ8S+IhisGjRIiIjI2nXrh1eXl6Gx5o1a3J8DAcHB/7++28uXbpE48aN+fDDDzNsOsrIkiVL8PLyolq1avTu3ZtLly6xZs0avv32W8M2dnZ27N+/n0qVKvH8889Tp04dXn31VeLj4w01QBMnTqR///688sortGrVCgcHBzp16oSNjU2W569YsSKHDh1Cq9XSqVMn6tevz+jRo3F2dsbMTL0FZsyYwZQpU5g1axZ16tShU6dO/P3333mqHcvIvHnz2LFjB76+vtn2GxJCiBLn/n2YOFF9/sknYNRt4HELfErUqK59+/Yp3bp1U7y8vDIcJaPT6ZSpU6cqXl5eio2NjeLv769cuHAhV+fI1aguUay0Wq1Ss2ZNZfLkycVdlBJP/m8LIfJl0CB1FFeTJoqSnGyyqkaNGgqg7Nmzp1CLkNNRXSWqxic2NpaGDRuycOHCDNfPmTOH+fPns3DhQk6cOIGnpycdOnQw5A8QJdvt27dZsmQJV69e5Z9//mHEiBHcvHmTAQMGFHfRhBCi7NqzB37+We33+t13JpOQKory2NX4lKjOzZ07d6Zz584ZrlMUhS+//JIPP/yQ559/HlA70Hp4eLBq1SreeOONoiyqKARmZmYsW7aM8ePHoygK9evXZ+fOndSpU6e4iyaEEGVTfDzov19HjID/RurqhYWFkZCQADwmyQspYYFPVm7evElISAgdO3Y0LLO2tsbf35/Dhw9nGvgkJiaSmJhoeB0VFVXoZRV54+vry6FDh4q7GEIIIYDtN7ZzY2R/Rlx7BBUrwsyZ6bbR1/a4u7tnmx6kqJSopq6shISEAOqQZ2MeHh6GdRmZNWsWzs7OhsfjUhUnhBBCPM4ObvyW13Y+Ul8sXAjOzum2edyauaAUBT56GSW4y2q486RJk4iMjDQ89H8kIYQQQmRCq6X/gj1Y6uBIMy/o3TvDzR7HwKfUNHXpZ8UOCQnBy8vLsPz+/fvpaoGMWVtbPzbVb0IIIUSJ8M031Pk3ikhrmPaiK9sy2exxDHxKTY1PlSpV8PT0ZMeOHYZlSUlJ7Nu3j9atWxdjyYQQQohSJDAQ5YMPAJj4Pzhrdj/TTf/991+AAsuJVhBKVI1PTEwM169fN7y+efMmZ8+epXz58lSqVIl3332XmTNnUqNGDWrUqMHMmTOxs7OT4c5CCCFEQVAUGDkSTWwsByrB4idBib1PYkoi1hbpW0/0gU/VqlWLuqSZKlGBz8mTJw1THACMHTsWgMGDB7Ns2TImTJhAfHw8I0eOJDw8nBYtWrB9+/Z0M34LIYQQIg/WroVNm9BZWTK8ezL6bIB3ou5QrXy1dJvfuHEDgGrV0q8rLiWqqatdu3YoipLusWzZMkDt2Dxt2jSCg4NJSEhg37591K9fv3gLXcpNmzYt20lChWrZsmW4uLgUdzGEECJvHj2Cd94B4PobfbjilroqKCr9wKDw8HAiIiKAx6upq0QFPiJv9u/fT/fu3alYsSIajYb169en20ZRFKZNm0bFihWxtbWlXbt2XLx40WSbzPbNrb1796LRaNBoNJiZmeHs7Ezjxo2ZMGECwcHB+T5+cTK+NuPH5MmT6devH1evXjVsK0GjEKJEee89dU6uOnXY+1JLk1VBkekDH31tj6enJ/b29kVSxJyQwKcMyG6qDyie6T4CAgK4d+8eJ06cYOLEiezcuZP69evzzz//FNo5QQ3yUlJSCvUcAQEBBAcHGx7vv/8+tra2uLu7F+p5hRCiUOzZAz/9pD5fsoTb8ab58TKq8Xkc+/eABD5lQufOnfnkk08MU3mklXa6j/r167N8+XLi4uJYtWoVAH5+fgD07t0bjUZjeK33888/4+fnh7OzMy+99FKOAiZ3d3c8PT2pWbMmL730EocOHcLNzY0RI0aYbLd06VLq1KmDjY0NtWvXNpnVHeDw4cM0atQIGxsbmjZtyvr169FoNJw9exZIrYXZtm0bTZs2xdramgMHDqAoCnPmzKFq1arY2trSsGFDfv/9d5NjX7p0iS5duuDg4ICHhweDBg3i4cOHOb42/cPBwcGkqWvZsmV8/PHHnDt3zlArpG+yFUKIx0p8PAwfrj4fMQLatDEEOrYWtkDWNT6PU/8eKGGdmx83iqIQFxdXLOe2s7PLMjFjbuRkuo8TJ07g7u7O0qVLee655zA3Nzdse+PGDdavX8/GjRsJDw+nb9++fPbZZ3z66ae5KoetrS1vvvkmY8aM4f79+7i7u7NkyRKmTp3KwoULady4MWfOnOH111/H3t6ewYMHEx0dTffu3enSpQurVq3i9u3bvPvuuxkef8KECcydO5eqVavi4uLC5MmT+eOPP1i0aBE1atRg//79DBw4EDc3N/z9/QkODsbf35/XX3+d+fPnEx8fz8SJE+nbty+7d+/O03ut169fPy5cuMDWrVvZuXMnAM4ZZD0VQohiN2MGXL+uTksxaxaQWsPT3Ls5+27vK1E1PhL45ENcXBwODg7Fcu6YmJgCazPNarqP27dvA+DmpvZic3FxMSSL1NPpdCxbtswwem7QoEHs2rUr14EPQO3atQG4desW7u7uzJgxg3nz5hlqq6pUqcKlS5f4/vvvGTx4MCtXrkSj0bBkyRJsbGyoW7cud+/e5fXXX0937OnTp9OhQwdAbf6bP38+u3fvplWrVoB6cx48eJDvv/8ef39/Fi1aRJMmTZhpNP/MTz/9hK+vL1evXqVmzZqZXkfayfj076Oera0tDg4OWFhYpHs/hRDisXH2LHz+ufr8m28M01LciboDQCufVuy7vc/w2pjU+IjHXm6n+9Dz8/MzSRng5eXF/fuZJ7TKiqIohrI8ePCAoKAghg0bZhLIpKSkGGpHAgICaNCgATY2Nob1zZs3z/DYTZs2NTy/dOkSCQkJhkBILykpicaNGwNw6tQp9uzZk2Fwe+PGjSwDnwMHDpi8J+XKlct0WyGEeCwlJ8PQoZCSAi+8AL16AerntD7Qae2rJgiWGp8yws7OjpiYmGI7d0HJ63QfepaWliavNRoNOp0uT2W5fPkyoAZT+mMsWbKEFi1amGynb2rLKDjTB09pGdeQ6Y+9adMmvL29TbbTT2Gi0+no3r07s2fPTncs4/cpI1WqVJGh60KIkm3OHLXGp3x5tbbnPw/jHpKQkgBASx91dNej+EfEJcdhZ6l+NyUlJRmmq5Aan1JEo9E8VkP08sp4ug99bYd+ug/jL31LS0u0Wm2hlSM+Pp7FixfTtm1bQ9Oat7c3//77Ly+//HKG+9SuXZuVK1eSmJhoCFhOnjyZ7bnq1q2LtbU1gYGB+Pv7Z7hNkyZNWLduHX5+flhYFPytYmVlVajvpxBC5NnFizB9uvp8wQIw+hGsr93xsPfAzd4NRytHopOiCYoMolaFWoDavK/T6bCzs8vRD+iiJIFPGZDdVB8ajSZH0334+fmxa9cu2rRpg7W1db6bb+7fv09CQgLR0dGcOnWKOXPm8PDhQ/744w/DNtOmTeOdd97BycmJzp07k5iYyMmTJwkPD2fs2LEMGDCADz/8kOHDh/P+++8TGBjI3LlzgfRNd8YcHR0ZP348Y8aMQafT8dRTTxEVFcXhw4dxcHBg8ODBjBo1iiVLltC/f3/ee+89KlSowPXr11m9ejVLliwx6eCdF35+foa/hY+PD46OjjJhrhCi+KWkwKuvQlISdOsGAwYwZP0Q1l1ep67WqelAfJ19Df9eenCJxt83xtxM/VxMuapu4+zljEaj4Zvj3zB5z2TDvqeHn6aGa42ivjJAAp8yIbupPoAcTfcxb948xo4dy5IlS/D29ubWrVv5KletWrXQaDQ4ODhQtWpVOnbsyNixY006+7722mvY2dnx+eefM2HCBOzt7XniiScMI7ecnJz4+++/GTFiBI0aNeKJJ55gypQpDBgwwKTfT0ZmzJiBu7s7s2bN4t9//8XFxYUmTZrwwX+T71WsWJFDhw4xceJEOnXqRGJiIpUrV+a5557DzCz/mSBeeOEF/vjjD9q3b09ERARLly5lyJAh+T6uEELky5dfwvHj4OQE331HgjaR5eeWp9usvV97w7+XHlwiPiU+deV/aX7iHdVly84tIyIhwrBaIeMuCUVBo2TWIaKMioqKwtnZmcjISJycnEzWJSQkcPPmTapUqZLtl6ooPitXrmTo0KFERkZia2tb3MUpEeT/thACgKtXoWFDSEiAH36AYcO4/ug6Nb6ugZ2lHf+MUBPMWppZ4uPkg0ajQVEUAiMD0SqpTfdvjXyLLau3YP+MPTG7YvCc60lobCgb+2+kjlsdfJx8sDK3KtCiZ/X9bUxqfESJt2LFCqpWrYq3tzfnzp0z5NqRoEcIIXJBp4Nhw9Sgp0MHtbmL1OSEvk6+VC2XfoSWRqOhsktlk2URQREAxDrHEpMUQ2hsKAAtfFpQwa5CIV5E9iTwESVeSEgIU6ZMMYxK69OnT55yCAkhRJn27bdw8CA4OMCSJfBfP0l9Z2YfJ5+s9jZx/ep//Urd4Pjd4wDYWNjgautasGXOAwl8RIk3YcIEJkyYUNzFEEKIkuvmTXj/ffX57NlQObUGx1Dj819n5uw8fPiQBw8eqC8qwOGgwwCGprHiJnN1CSGEEGWZosDrr0NsLLRtC2++abJan6zQ1ylngY8+H5u1qzVYpQY+Od2/sEngkwfSH1yUNvJ/Wogy7IcfYNcusLWFH3+ENKNW9U1dOQ1cLl26BIBrZbVZ68idI+r+OawxKmwS+OSCPm9LUlJSMZdEiIKln2w3bRZuIUQpd+cOjBunPv/kE6hePd0mhsAnh4GLvsbHp6raJ0g/jP1xqfGRPj65YGFhgZ2dHQ8ePMDS0rJAcrkIUZwURSEuLo779+/j4uKS76SMQogSRFHUUVzR0dCiBYweneFmxqO6ckIf+NSoVYPjHDcsl8CnBNJoNHh5eXHz5s10s20LUZK5uLjILPFClDVLlsD27WBjA8uWQQY/fGKTYglPCAdyXuOjb+pqVL8RKwNWGpY/Lk1dEvjkkpWVFTVq1JDmLlFqWFpaSk2PEGXNzZvwXxZ/Zs6E2rUz3EzfzOVk7YSTdeZJAfWioqK4c0ftDN2ycUsISF0nNT4lmJmZmWS3FUIIUTLpdDB0qDqK6+mnM23igtRmrpzm8Llw4QIAXl5e1K1U12RdbvIAFSbppCKEEEKUJV9/Dfv2gb09LF2abhSXsdyO6Dp9+jQATZo0oZxNOews7QCwt7THxcYlf+UuIBL4CCGEEGVFQEBqosK5c6FatSw3z20OH+PAR6PRGPbzdfZ9LJIXggQ+QgghRNmQkgJDhqTOxfXGG9nuktuszadOnQLgySefNNnvcenfAxL4CCGEEGXD3Llw9Cg4OamJCnNQA5Obpq6EhAQuXrwIqDU+xvtJ4COEEEKIovPPPzB1qvp8wQLwzVkgkpvkhefPn0er1eLm5oaPj9qR+Zkqz2CmMaN9lfZ5K3chkFFdQgghRGmWnAyDB0NSEnTvDq+8kuNdc5O8MG3/HoCBDQbSu3Zv7K3s81DwwiE1PkIIIURp9umncOYMlC8PixfnqIkLIDIhkuikaCBnQ9H1gY++f4/e4xT0gAQ+QgghROl16pQ6BxfAokWQiwzt+maucjblchS86Ds26/v3PK4k8BFCCCFKo/h4GDQItFro21d95EJuRnTFxcXxzz//AOlrfB43EvgIIYQQpdHEiXD5Mnh5wTff5Hr33OTwOXbsGMnJyXh7e1O5cuVcn6soSeAjhBBClDbbtqkZmkHNzlyhQq4PkZuh7Pv37wegbdu2j02iwsxI4COEEEKUJmFh6lxcAG+9BZ065ekwuRnKbhz4PO4k8BFCCCFKC0VRMzIHB6szrs+enedD5XQoe1JSEkeOHAEk8BFCCCFEUVqxAtatAwsLWLkS7OzyfKic1vicOnWK+Ph4KlSoQJ06dfJ8vqIigY8QQghRGty8CW+/rT6fPh3yMaxcURRDjU92OXxKUv8ekMBHCCGEKPm0WnXoenQ0PPUUTJiQr8M9in9EfEo8kH3gs3fvXqBkNHOBBD5CCCFEyTdnDhw6BI6OanOXuXm+Dqdv5nKzc8PGwibT7WJjY9mzZw8Azz77bL7OWVQk8BFCCCFKslOnYMoU9fnXX0OVKvk+pCGHTzb9e3bs2EFiYiJVqlShXr16+T5vUZDARwghhCip4uJg4EBISYEXXsjVBKRZyemIrr///huAHj16lIj+PSCBjxBCiDIgMDKQ6guqM//IfAAWHl9ItQXVuPHoRp6OdzDwIO6fu2PziQ0+83249OBSQRY35yZOhCtX1OzM33/Pb5d+x+UzF2w+saHm1zV5EPsgT4fNSfJCrVZrCHy6d++ep/MUBwl8hBBClHrbb2znRvgNfj7/MwA/n/+Zf8P/ZduNbXk63p+X/+RB3AMStYncjb7L5mubC7K4OfP337Bwofp86VJwdWX1xdVEJkaSqE3k2qNr7Lu9L0+HzslQ9uPHj/PgwQOcnZ1LTMdmkMBHCCFEGaDvs6JvwtG/1v+bW/rAQN/xV3/cInPvXmp25jFjDNmZ9dejL1eery8HTV1//vknAM899xyWlpZ5Ok9xkMBHCCFEqaf/Ig+LDyMqMYrg6GB1eVTeAhZ9QNHSp6X6OjpvAUae6Ieuh4VB48Ywa5Zhlf469eXKa0Cmf18yG8qekpLCzz+rtWd9cznre3GTwEcIIUSpZxzgnLh7AgVFXZ7PwKC1T+t8HSdPPv8cdu9WszL/+itYWwOQpE0iJCbEtFx5COx0ii7bUV2bN28mJCQEd3d3unXrlperKDYS+AghhCj1jAOAw0GHM1yeUym6FO5F3wOgtW/eA4w8OXYMJk9Wn3/9NdSqZVh1L/oeCgpW5lY08WqS53I9iH1AkjYJDRq8Hb0z3ObHH38E4JVXXsHKyirX5yhOEvgIIYQo1YynXwA4fCc18LkTdQedosvV8YKjg9EpOizMLHiy4pMAhMaEkqRNKpgCZyYyEvr3V5u6+vVL7ePzH+MpJio5VzJZlhv62h5PB08szdP33QkODmbTpk0ADBs2LNfHL24S+AghhCjVIhIiiE2ONbw+eueo4XmSNinXQ771tSjejt542HtgbW6NgsLdqLsFU+CMKAqMHKnOx1W5Mnz3HaTJm2M8BF3fRBUcE0yKLiVXp8puRNfXX3+NVquldevW1K5dO7dXUuwk8BFCCFGqpW3uiUiIyHJ9tseLTA0MNBqNoQNwoTZ3/fwzrFqlTkWxahW4uGRaLh8nH9zt3bE0s0Sn6AzNcjmV1YiuBw8esGDBAgDef//9XF7E40ECHyGEEKVads09uW0OSpvczxD4FFYH52vXYNQo9fm0adC6dbblMtOY4e3knadyZZW88PPPPyc2NpamTZuWuE7NehL4CCGEKNX0fVbsLO1Mlutf5zbXTdoaEX2TUKHU+CQlqf16YmLA3x8mTcp007QjsfTly/X1ZdLUFRgYyML/EiZ+/PHHJWaKirQk8BFCCFGq6b/IW3i3MFne3Lu5yfqc0ufsyW+AkSOTJ6uTkJYvD7/8kuWs62lravIakBk3menpdDqGDh1KfHw8Tz31FJ07d87VMR8nEvgIIYQo1fRf/K18Wpksz2uum3Q1Pk6FVOOzebOaswfgxx/BJ+NkgunKlSYgK4imroULF7J7927s7Oz46aefSmxtD4BFcRdACCGEKEz6L/66bnVxtnYmMjESGwsbGnk2Mlmf4+OlaQoy1KwUZB+foKDUmdZHjULXowfnz57lwIEDnD9/nhs3bnD//n1iY9XRavb29jyIewCusKv8LuKbxuNu4W5S3pzQ6rSG0Wn66/r7778ZP348oPbxqVGjRkFdZbGQwEcIIUSpZhyo+Dr7Enk/0mTId24CgyRtEqExoUBqU1CB1/gkJ6v9esLCOF6rFiu0Wn7z8uL+/fvZ73sTxp9UgxRzC3OoCMebHOdU9VM0btwYM7OsG3pCY0PRKlrMNeZ4OXixYcMG+vbtS3JyMv3792fEiBEFcYXFSgIfIYQQpZaiKIa+Nz5OPvg4+XDh/gV8nX0NgcvdqLtodVrMzTLvP6N3N+ouCgrW5ta42bkBqTUjD+MeEp8cj62lbf7K/NFHbDh0iNnm5hwNCICAAECt1Wnbti1PPvkktWvXxtPTE3t7ewD2X93PxD8nUi6mHC0sWnDu3DmCg4MhEO4G3qXp+qa4ubnRsWNHnn32Wdq1a4efn1+6Jit9rZUHHrz5xpv88MMPALzwwgusWLGiRDdx6UngI4QQokT7N/xf/rfif4xuMZrRLUcblr+64VV+Of8LybpkQE04aNwvx8vBC3ONOVpFi82nNvSp24dVL6zK8lzGk3fqg4ByNuWws7QjLjmOO1F3qOGa96agg3PnMn72bI4BaLVYWVnRp08fBg4cyDPPPIOVlRUf7vqQGZdncKj3ISzMLGj1Yyuuhl2FRtC4SmO2vLIFgJMXT9JsYjO4DtxUc/CsXLmSlStXAuDh7cEzbZ/hXMo5kmySGN9mPLvO74IdcO/GPX7QqUHP6NGjmTNnDhYWpSNkkM7NQgghSrRt17dxM+ImK/9ZaVim1WlZcW6FIehp59cOawtr/lf1f1iYWfC/qv/D3MycDtU6AOr8W79e+JXElMQsz5W2AzFQIEkMHz16xLCXXuLp997jGGBnYcGkSZO4ffs2v/zyC88995xhTqzl55YTEBbAwcCDHLlzhMsPL6NVtAB0rNrRcMwn6z5Jkx5NoD8wAexft+eDDz7AtZYrmEHo3VB+/fVXLv12ies/X+fNN9/kt29/g2uADlq2bMnevXv58ssvS9x8XFkpHeGbEEKIMksfbBgHHcExwYa+KrfevUVFx4oA9K3Xlx61emBjYQPApgGbCI4OpsbXNYhPiedO1B2qla+W7bnSJvfzdfLlatjVPHVw3r59O0OGDFGbpoDXXF2ZcfIknn5+6bZN0aUQHBNsKIu1uToz+7NVnuXXF37Fzd7NsK1Go+H4a8e5EX6DWgtrEesdy/vvv8/eans5fOMw/mb+NKEJX2z6AuKhlXcrosyjuKhcZPCLg1k2fFmur6UkkBofIYQQJZo+GDGeKFQfgHg7eePj5IOZJvXrTh/0AIYMxzmtsclsOoe8dJTWarV8+OGHdOrUieDgYGoBB+3sWHLsWIZBD6gzsOsnVQ2KDDKcr3r56iZBj565mTk1XWviZO0EqLmGgiKDwAqSqyTz3JDnoCfwEgyfO5w6r9WBNtC4QeMcX0dJI4GPEEKIEk3feVlBMcxLZchinMG0CxnRBy7ZJSFMm7zQsH8ukxhGRETQs2dPZs6cCcBI4DTQZtkyqJZ5jZPx8YOigrKcXiKj8t2KuGV4j4Iig0xqqIxfZzZBaWkggY8QQogSLe2XN2Q/w3haOU32l1FWY5P9c1Djc/nyZVq0aMGmTZuwsbbmZwcHvgHsRo6EPn1ydH79uXIaqOjXn7h3wtAf6F70PW5F3DI9Xg4DqZJM+vgIIYQosYyHq4NRf58sZhjPSE4Dl0z7+OQwieGBAwfo3r07kZGR+Pr68qerK0+ePQuNG8O8edmW07h8d6LuGPr45LTG53DQYcMyraLlZPBJw+ubETcJjg42uZ7SSGp8hBBClFgP4h6QqE0diZWuxieXTV1ZBT7xyfE8jHtosr1h/xwETps2baJjx45ERkbSpk0bTnbrpgY9jo6wdi3Y2GS6r55xYHUn6k6Oa7b05Tt656jJcuPXJ+6eQEHB0swSd3v3bMtSUkmNjxBCiBIrbQ1L2hFeBdnUZTzLezmbcqb7/3eeiIQIYpJicLByMFm/cuVKhgwZQkpKCt26dWPtSy9hO3CgunL5cqhePUflNA6sUnQppOhSgPRNb2npyxeZGGmyPCIhwvBcvy5tZ/DSpvRemRBCiFIvbQ1Lnpu6clDjY1yLlDaDsZO1E45Wjibn1vvuu+8YOHAgKSkpDBw4kD9mzsT2zTfVle+9B71756iMmZXPzc7NZKRaRnLTZ6c0N3OBBD5CCCFKMONaGFCDjiRtEiExIUD2NSF6+u0exT8iLjkuw22y60icUfC0ePFiw/xWb7/9Nsu/+QbLl16CmBjw94f/RnXllL4M+us1LntW0m5jvH9ejleSSeAjhBCixNIHAi28W6ivo4K4F30PBQUrc6sMc9tkxNna2dA8lVlzl/F0FRlJ21z2008/8cYbbwAwbtw4vvryS8zeeAMuXQIvL1i9GnIxDURiSiKhseoEqfrrhZzV0KTdxnj/8rblqVYudQh9aR7RBRL4CCGEKMH0wUhr39aAOlHotbBrQO76qmg0mmw7KGfXfGa8//Lly3nttdcAda6rzz//HM3ChanBzm+/gadnjsqmdzf6LgDW5tY08myU7rxZsbO0o7xtecNr/ful3984MJLApwSZNm0aGo3G5OGZy/9YQgghSg59kNLAo4GhuUY/Uim3X+DZJTE0JC/MLPD5b/8DWw4wdOhQFEVh5MiRfPHFF2iOHIFx49QNP/8c2rTJVdmMy+Xj5EMl50qp583lkH1IE/g4++Lj6GPyujQrVYEPQL169QgODjY8/vnnn+IukhBCiEJiXAuj/2I/cueIuiyXX+DZjezKto+Pky/8C3vm70FRFF5//XW+/vprNPfvq4kJU1Kgb18YPTrD/bNjfH7jICbHI9f+287K3IomXk1Myl2WanxK3XB2CwsLqeURQogyQKvTGpp/fJx88HX2JSAswJCkL9c1Ptk1dWWTGyjxTiKsBiVF4fnnn2fRokWY6XTw0ktw7x7Urg0//ABpRoTllPH58xKo6LfzcfLB3d4dK3MrkrRJ+Dr5GiZxhdJf41PqAp9r165RsWJFrK2tadGiBTNnzqRq1aqZbp+YmEhiYmryq6ioqKIoZrHZcGUDIzeP5OfeP/NMlWfo93s/fr/0OwBDGg7hx54/FnMJhRAiZ0JjQ0nRpWCmMcPL0cvwxa7PR5PXpq4lp5fw45n0n4X6yUEzCgxu3LjB5GGTIQnwgw31NjBt3zRmbEuCvXvBwQH++ENNVphDj+If0XxJc25G3DQ9v1Mea3z+28fXyRczjRk+Tj78G/4vvs6pgY+NhQ2utq45LmNJVKqaulq0aMGKFSvYtm0bS5YsISQkhNatWxMWFpbpPrNmzcLZ2dnw8PUt3ZHuusvruBd9jw1XNpCQksDai2vRKTp0io5f/vnFcGMJIcTjTt/npaJjRSzMLOhQtQMa1NoUGwsb2lZum6vjPV3paUM/If3novEDoKVPS8NM53ohISF07NiRsAdhWHlbwUugNdcS8fNimDNH3ejHH6FOnVyV51DgIW6E3zA5v4WZBc9UeQYPBw8aeTaiToU6OR5+3r5Ke6zMrehUrRMAz1V7DntLe9r4tqGxZ2Pc7d3pVK1TuhxFpY1GURSluAtRWGJjY6lWrRoTJkxg7NixGW6TUY2Pr68vkZGRODk5ZbhPSdZ+eXv23tpL79q9mdNhDjW+roG1uTVJ2iQUFELGheDh4FHcxRRCiGytu7SOF397kVY+rTg8TG3eikiIID45HidrJ+yt7HN9zLjkOCITIjNd7+HgYTJSLCoqCn9/f86ePUvVqlXZu38voZpQhs1oxuEfwT4ZNUmhPgDKhW9PfMuozaN4rvpz/NTjJwDsrewNgZdWp0VBwcIsd0PirS2sM3ydpE3C0syyxAY+UVFRODs7Z/v9XeqauozZ29vzxBNPcO3atUy3sba2xtraOtP1pY3xPDb6534ufkQnRXMv+h5BUUES+AghSoSMpqVwsXHBxcYlz8e0s7RLl9wvMwkJCfTq1YuzZ8/i7u7Otm3b8PX2xfO+JX+uVoOexGfbYT1rVp7Kov+Mrl6uOl6OXunWm5uZ5/qYxkFP2tdW5la5Pl5JVKqautJKTEzk8uXLeHml/w9TFhnPYmw8uZ2Pk4+hqjS7mYWFEOJxkdtpKQqSVqtl4MCB7NmzB0dHR7Zs2UL16tUhJQXLlwdRNQJulINLX00G89wHKJB9wkSRN6Uq8Bk/fjz79u3j5s2bHDt2jBdffJGoqCgGDx5c3EV7LBjPYhwaE8qNRzcA06GRWc1TI4QQj5PczsBeUBRF4a233mLdunVYWVmxfv16mjT5b3j4++/Dzp3EWZvR6yW4ZZb3ATO5nWhV5Eypauq6c+cO/fv35+HDh7i5udGyZUuOHj1K5cqVi7tojwXj2hwFhWN3jwHqh0Z0YnS6bYQQ4nFWXDUi06dP57vvvkOj0fDLL7/wzDPPqCtWrYJ58wD4dmQzLjgfy9ePyeKs0SrNSlXgs3r16uIuwmMtbTZS4+ym0Ulq4KPPTCqEEI+77BIKFobvvvuOadOmAbBw4UL69Omjrjh9GoYNU59/8AF3n46DY8cyzQKdHZ2iM+QokhqfglWqmrpE1tL+8jDkujBu6pIaHyFECZCiSyE4JhgouhqRdevWMXLkSACmTJlieM6DB9C7NyQkQJcuMH16hjO158aD2AckaZPQoMHb0btAyi9UparGR2Qts6DGuMZH+vgIIUqC4OhgdIoOSzPLIhmJumvXLgYMGICiKLzxxhuGWh+Sk9VpKAIDoUYNWLkSzM3z/WNS/1ns6eCJpbllQVyC+I8EPmWI/kayt7QnNjnWsNzXObWPz92ou2h12jwNkxRCiKKi/zzzdvLO8QzseXXixAl69epFUlISzz//PN98801qrptx49TMzI6OsGEDuLgA5LvGpzia8coKaeoqQ/Q3YHPv5oZlTtZOOFk74engibnGHK2iJSQmpLiKKIQQOVJUHX8vX75M586diYmJ4dlnn2XVqlWY64enf/cdfP21+vznn00yM+s7XOt/TOZWcY1YKwsk8ClD9B8UrX1bG5bpb05zM3PDXC3S3CWEeNwVxVDvwMBAdSqKsDCaNWvGn3/+mZrwdvdueOst9fnMmdCzp8m+Xg5e+foxqf+8lhw+BU8CnzLCeBZj48Ano4nupIOzEOJxZwgMHAsnMLh//z4dOnTgzp071KlThy1btuCon2D02jV48UXQamHgQDV3Txr5/TEpNT6FRwKfMsJ4FuNmFZsZlpsEPpLEUAhRQhRmjU9UVBSdO3fm6tWrVKpUie3bt+Pq+t+M5RER0L07hIdDy5awZAlkMrdVfn5MSvLCwiOBTxlhPItxBbsKhrlojG8qfeCT17wTQghRVPSfUwVdIxIdHU3nzp05ffo0bm5u7NixAx+f/2qVUlLUEVwBAeDrC+vXg41NpsfKz4/Jwro+IYFPmWHcEVCj0Rhupoyaur44+gWajzVoPtbgNc+Lm+E3i77AQgjuRt3FZ76P4X7UfKzB7XM3Lty/UNxFKzazDszCYroFJ+6dAAq2RiQ2NpauXbty+PBhXFxc2LZtGzVr1kzdYMwY2LED7O3h77/BI+th9Hn5MTlu2zjMPjYjMDJQPYbU+BQ4CXzKiLTVpl1rdMXe0p6nKz9t2KadXztsLWxN9guJCWH3zd1FV1AhhMGeW3sMffP0HsY9ZNv1bcVUouL364Vf0SrqKKnKzpWpU6FONnvkTFxcHN27d+fAgQM4OTmxfft2GjdunLrBokWwcKH6/JdfoGHDbI9pmPw5FzU+K/9ZiYICQEOPhng5yCTbBU0CnzIibUfAeZ3mET4xnOrlqxu2aeDRgIcTHhI6PpTQ8aG80vAVdV/p8yNEsdDft/3q9SN0fChvN39bXV6G70n9tR8YeoBrb1/D1tI2mz2yFxcXR8+ePQ0zrW/bto1mzVL7QrJrF7ytvvfMmgW9euXouLnt45OYkkhobCgAV0Zd4dTwU5JTrRBIAsMyIqOOchllA7WztDP0/6lRvoa6r4zyEqJY6O/b6uWr427vTk3XmibLy5qYpBgiEiIAtTakIDIaR0ZG0q1bNw4ePIi9vT1btmyhZcuWqRtcvQp9+qgjuAYNgokTc3zs3Pbx0dfu2VjYUNO1ZmqSRFGgpManjMjL0EgZ5SVE8Up735b1OfX01+1s7YyjtWO+j/fw4UOeeeYZDh48iLOzM9u3b6dNmzapGzx4oM69pR/BtXhxpiO4MqL/oRkcHUyyNjnb7dP2xRSFQwKfMiIv6c/zm3JdCJE/ae/bsn5PFuQQ73v37uHv78/p06epUKECe/bsoXXr1BxnxMerSQlv3IAqVdTpKLIYwZURd3t3LM0sUVC4F30v2+1lCHvRkMCnDMjrLMaGjnmRQSiKUihlE0JkLrMan9CYUJK0ScVWruJSUNmML1y4QKtWrbh06RLe3t4cOHDAtCOzTgevvAJHjkC5crB5M7i75/o8ZhqzXHVwlmzNRUMCnzIgr7MY62++2ORYQ7u6EKJoxCXH8Sj+EZB6L1awq4C1uTUKCnej7ma1e6lUENmM9c1ZgYGB1KxZkwMHDlC7dm3TjSZNgt9/B0tL+PNPSLs+F3LTwVmyNRcNCXzKgLzOYmxnaYerravJMYQQRUP/RWlvaY+LjQsAGo0mT0OkS4v8Tky6ZMkSunTpQlRUFG3btuXIkSNUqVLFdKPvvoM5c9TnS5eCv39+ipyrv5ckLSwaEviUAfn5sND/WpFszkIULcOXoLNpR9eyfE/eiU59T3IjMTGRkSNHMnz4cLRaLYMGDWL79u2UL1/edMPNm2HUKPX59Onw8sv5LnNukhhKH5+iIYFPGaC/mfLSblzWR5EIUVwya/Yoy/dkXn7E3bp1i6eeeopFixYB8PHHH7N8+fLUWdb1zp6Ffv3U/j1DhsDkyQVS5tyMjs1vjZbIGcnjUwbkq8ZHhrQLUSwyu2/L6j2pKEqua0T+/vtvBg8eTHh4OOXLl+eXX36hc+fO6Te8cwe6doWYGHj2Wfj++1wNW89KTvv4xCXHERYfZrKPKBxS41MG5Kf6tKwPnxWiuGR235bVezIyMZKYpBgg+9rr8PBwhgwZQo8ePQgPD6d58+acOXMm46AnMlINeu7dg7p11U7NVlYFVu6cBqr6pjAHKwecrZ0L7PwiPQl8yoD8jBQoy9XqQhQnaeoypb/e8rblDdnlM7Jx40bq1avH8uXL0Wg0jBs3jgMHDlCpUqX0GycmqtNPnD+vTji6eTO4uBRoufWB6v3Y+ySmJGa6nSQvLDr5DnwSEhIKohyiEOUleaFeWR5BIkRxyiynS1m9J7P7AXf9+nVeeOEFunfvTnBwMDVr1uTgwYPMnTsXq4xqcHQ6dQqKvXvB0RG2bIHKlQu83K62rthYqIkPs+rgnJ++mCJ38hT46HQ6ZsyYgbe3Nw4ODvz7778AfPTRR/z4448FWkCRXm6SCSZpkwyT3uV3VJckMRSicOkUneGRXVPXw7iHxCbFFnkZM2P8+ZCfzwr99ac9RmY/4MLDwxk3bhx169bljz/+wMzMjHHjxnH27FnTTMymhYV334XffkvN1WOcwLAAGacguB15O9P3Rjo2F508BT6ffPIJy5YtY86cOSaR9BNPPMEPP/xQYIUT6U3aOYnKX1YmJCYkR9vrk5zZWNhQwa5Crs/n7egNQEJKAg/jHuZ6fyFEznx59EusZlhhPt0c8+nmRCVGAem/CMvZlDM09TjMcqDrqq5FXta03t/5PpW/rExoTCiRCZHUXFiTERtH5Po4H+/9GIvpFphPN6fZkmYm81ulrfEJDQ3lww8/pGrVqsyfP5/k5GSee+45zp8/z9y5c7G1zWLW9tmz4euv1ecrVqgdmguRvszPrniWaguqZZgQ1jh9gShceQp8VqxYweLFi3n55ZcxNzc3LG/QoAFXrlwpsMKJ9FZfXE1QVBD7b+/P0fbG1ad5aTe2trDGw17N9lwW84YIUVTWXlyLVtGaLHu60tPpJuPUaDR0q9nN8Hrztc1EJkQWSRkz8+uFXwmKCuJA4AGO3z3O9UfX+fXCr7k+zuqLq1FQa0ROBZ/iathVwzr9Z5nlQ0veeOMNKleuzMyZM4mIiKBevXps2bKFLVu2UK9evaxPsmyZmpkZ4Isv4KWXcl3O3OpaIzU4vRlxk2N3jqXbRrI2F508BT53796levXq6ZbrdDqSk7OfgVbkjU7RGWpwctqxsSDmfimro0iEKEr6+2vbwG08eO8BD957wN4hezPcdvULq3n43kPK2ZQz2bc4aHVak88lfVkiEyOJTozO8XEURTF8XtlaqLU1+mOFhoZy5Lcj8B0sGLKAxYsXk5iYSIsWLfjjjz84f/48zz33XPYn2bIFXntNff7ee2pzVxEY13ocERMj6FC1A5Dx30uSFxadPAU+9erV48CBA+mW//bbb6YTvYkCdT/2Psk6NbDM6QddQfyKKKujSIQoKim6FIKj1YmE67vXp4JdBSrYVch0ihmNRoOrnWuu5oEqLKGxoYaaqqCoIJOy5KaWOCIhgthktc9Sc6/mEAjfzPmGli1bUrFiRa6tugYhYGFpQa9evdi/fz9Hjhyhd+/emJnl4Kvs+HF48UXQatVOzZ99lrsLzSdnG2equKjTY2T095I+PkUnTwkMp06dyqBBg7h79y46nY4//viDgIAAVqxYwcaNGwu6jOI/eflAKYibqawmTBOiqITEhKBVtFiYWRialnPC18mX86Hni7UZOu3nUrR1ai1PUFQQddzqZLqvoijcv3+fGzdusPvEbtgMFiEWHAo5BEmwkdTvE42PBqWBwpGvjtC0etPcFfLqVTVXT1wcdOoEP/4IOQmWClhm041EJ0YTmag2V8qorsKXp8Cne/furFmzhpkzZ6LRaJgyZQpNmjTh77//pkOHDgVdRvEf48Aj1zU++ag+laYuIQqXPnjwdvTG3Mw8m61TFcePkpSUFGJiYoiNjSUmJoa95/dCIJAM5x+exwYbuAOkwNLopZyucJqEhATi4+OJjo7mwYMHPHjwgPv37xMYGEhsrOnItBRS1Cc24PekHx+9+hFNn25Kw1UNAXjC74ncFTgoCDp0gIcPoWnT1FnXi0Fmfy/9a2dr53R9ukTBy/OUFZ06daJTp04FWRaRDeNfVjnu41MATV2GvCHS1CVEocjrD5SC/lESERFBQEAA165d49q1a9y8eZOQkBBCQ0MJDQ0lIiKCxMTMk/AFEGDyevXG1axmdZbn1Gg0+Pr6YutuS4BFAI2fbEy/Dv14//T7VK9enVcHvcqZ4DMAuNu7Y21hneXxTNy/rwY9gYFQsyZs2gQODjnfv4Bl9vfKT641kXt5CnxOnDiBTqejRYsWJsuPHTuGubk5TZvmshpS5IjxzRISE0KSNgkr86xTqxfEEElp6hKicOW1STo//e8UReHixYvs3buX48ePc+zYMa5evZr9jv+xsLDAwcGBFIsUYnQx6reJJZhZmqEz14EFVHGvgn81f2xtbbGxscHe3h53d3fc3Nxwc3PD19eXypUrY21tzeTdk/n0wKe0atqK5nWbw9nU68rTD7jISHjuOQgIAF9f2LED3N1z8Q4VPOO/l6IohpG2MqKraOUp8Bk1ahQTJkxIF/jcvXuX2bNnc+xY+qF6Iv+MAw8FhXvR9/Bz8ct0+/jkeEPunXz18fkvaLobdRedosu0w6UQIm/ymrU3tzU+ycnJ7Ny5k40bN7Jx40YCAwPTbVOxYkVq1KhBjRo1qFatGl5eXnh6euLh4UH58uVxcHDAwcHBkMOtz299+P3S74b9degMz6tXrc7SQUtzVDbjWi/j7NTGo71y/AMuLg66dYMzZ8DNDXbuhIymrChi+uuKTY4lIiGCcrbqqDzDD1QJfIpEngKfS5cu0aRJk3TLGzduzKVLl/JdKJGxtL/qgiKDsgx89DeTvaU9LjYueT5vRceKmGnMSNYlExoTipejV56PJYRIL6+/+I2boY1rENIKCAjgxx9/ZMWKFYSGhhqW29jY4O/vT6tWrWjevDnNmzfH1dU1d2XPorYpN7XExqk39NcVlxxHeEJ47t6fpCR44QU4eBCcnWH7drWZ6zFga2mLq60rYfFhBEUFGQIfaeoqWnkKfKytrQkNDaVq1aomy4ODg7GwyHO3IZEN/c3vYOVATFJMth8qxr+g8jPpnYWZBV4OXtyNvsudqDsS+AhRwPL6xacPEOJT4nkU/whXu9SgRVEUdu/ezSeffMLevXsNyz08POjduzfdunWjffv22NllPuFnjsqe5nPJ+Hl2AVlGx/F18sXW0pYKdhV4GPfQJDdQtjViWi0MHAhbt4Ktrdqnp1GjvF9cIfB19lUDn8ggGng0AKSpq6jlqc2iQ4cOTJo0icjI1GyhERERfPDBBzKqq5AY5/lo4a02MWbXrl8QyQv1ZGSXEIUnr00dNhY2uNm5Aan3pqIobN26lTZt2vC///2PvXv3YmZmRrdu3Vi/fj1BQUEsWrSIrl275jvoSdYmp/tcAmju3RxQm3T0w7SzoihKuv6I+vfiTtSdnL0/igJvvGE6/1abNrm/qEKWUZ9JSV5YtPIU+MybN4+goCAqV65M+/btad++PVWqVCEkJIR58+YVdBkFpnk+mlZUO49nl7ujIH9FSBJDIQpHkjbJMPdeXr74jJMYXrx4kWeeeYbOnTtz5MgRbGxseOedd7h16xZ///03PXv2xLIAh3IHxwSjoGBpZsmTXk8altcsXxNXW1dDubLzMO4hCSkJQOr8gMY/trKtEVMUNROzPj/PqlVqvp7HUNrPUpM+TFLjUyTy1C7l7e3N+fPnWblyJefOncPW1pahQ4fSv3//Ar2pRCrjPB+VnSury7Jr6irAm8m4s6EQouDci76HgoK1ubWh9iY3fJ18OX3rNF/N+Ip9a/aRkpKCra0tI0eOZPz48Xh6ehZCqVXGtcqVnFM7D/s6+6Y26UQF8YRH1rl39J8rHvYehuHq+s+twMjA7Gt8pk4F/Y/uJUvUDM2PqbS158YZq72dvIutXGVJnjvk2NvbM3z48IIsi8iCcVVoTpudCrL6VIa0C1E4jIOHvPTFU24osBB2Re8CoHfv3nzxxRdUrly5QMuZkYw+l0D9vPB18uVsyNkc1fhklHZD/5lzKvgUybpkNGio6Fgx/c6ffAIzZqjPv/wSXn01j1dTNIyb8CD1PXS1dcXOMn9NjyJn8hz4XL16lb1793L//n10Op3JuilTpuS7YEKtAtXPgXM74jaQ+oECGVchG3ckLMghko/DnEBClCQ6RYdO0aFBky4bs8m9HfnfvZ3LHyhJSUl8+OGH/DX3LwAcPB1Y+9NaOnfujFanJUWXgrnGPF8DG4zLm9FxjIM248+ZtEPSsztmRrXT+vfjcNBhALwcvbA0T9OiMGcOfPRR6vPRo3N7aUUu7Q9XGdFV9PIU+CxZsoQRI0ZQoUIFPD09TW4I/RQWIn/C48NpsrgJtyJumSw3Hur5IO4BCSkJ2FjYALDmwhpGbR7F2j5reabKM1LjI0QxufHoBi1/bMnDuIfYWNiw+oXV9KzdE1D79DRf0pxzoedM9snNIISrV6/Sv39/Tp8+rS5oCo1ea0Tnzp1ZdGIR72x9hxRdCn4ufpx540y+0lmM3TaW3y/9zqnhp3CzN22KM+5HaFx+40Aoo8+M6MRomixuQttKbfmx548Z9kfUH08/Uizd+/PllzBxovr8k0/UPj4lgHGNj0mnbunfU2Ty1Ln5k08+4dNPPyUkJISzZ89y5swZw8NwI4p8OXb3WLqgx8rcig5VO1Detjy2FraAaQfnP6/8SVh8GJuubiImKYaIhAigYGt87kXfI0WXku/jCVGa7bq5y5A8NCElgb8C/jKsu/zgcrqgx1xjTufqnXN07K1bt9KsWTNOnz6Nq6srM5fMhG5wL/EeAOsurzPco7cibnH87vF8Xcuai2sIigriUNChdOuMA5YKdhVo6dOS+u718XPxy7KW+OS9k1x/dJ01F9eonXsz+JHWyLORSbDTrUa31AN88w2MGaM+nzIFPvwwX9dYlPT9eBJSEtTh+jKUvcjlqcYnPDycPn36FHRZhBH9h0XHah1Z/YI6142NhQ22lmrA4+vsy9WwqwRFBlG9fHV1H33VqdEoiIKa9M7D3gMLMwtSdCmExITIDMJCZEF//9lZ2hGXHJfh0OWGHg3ZM3gPoP6osbeyz/a4CxcuZPTo0eh0Op5++mlWr15Nkl0SH3z1AXei7qBTdIbj21rYEp8Sn6/maePh6hkdx7hvjkaj4dCranBkpjFL15fFmL6M+gzGGaXecLJ24ubom0QnRmNhZpH6ObZkCbz1lvp84kSYNi3P11ccrMyt8LD3IDQ2VP2slqHsRS5PNT59+vRh+/btBV0WYUR/M1RxqUI523KUsy1nCHogk1wQRvPa5DUFfmbMzcwNw0yln48QWdPff618Wpm8htT7p7JLZcO9nV3Qk5KSwqhRo3j77bfR6XQMHTqUnTt3UrFiRbwdvdGgIUmbxIPYB4bjt/JNf+7c0o84y+w4afvmmGnMDFPaGPdlURQlw/306zOr9bAws6CcbbnUoGf5cjVXD6g1PrNmQQH0YSpqxrVhMpS96OWpxqd69ep89NFHHD16lCeeeCLdEPZ33nmnQApXlmVX/am/cfS/prQ6Lfei1apuk5upAH9F+Dr7cjvyNkFRQbSiVYEdV4jSRn//tvZtza6bu0wyGOe2aSMxMZGXXnqJ9evXo9FomD17NuPHjzf0rbQ0t8TTwZPgmGDOhZ4jPiUegJbeLdl9c3e+fqhkVFNlKFdKIqGx6vQXGX3O6H8oJaQkEBYfRgW7Chke63bEbe5G3c30OAYrV6ojthQFRo1Sh6+XwKAH1L/9yXsnC+VHqshengKfxYsX4+DgwL59+9i3b5/JOo1GI4FPAchuVvW0I7v0CQ5BTSp2M+KmyXYFwXheICFE5vT3r77GR5/B2MXGJVedWePj43n++efZunUr1tbW/Prrr/Tu3Tvddr7OvgTHBBtGQLnZuVHDtYZaluisE51mxfheT9tkdTdaDVZsLGwMyQqNWVtYpzbpRAaZBD7Gx9IPVzfTmGU8XB3Ump6hQ9Wg5/XXYcGCEhv0QCY5iqSpq8jkKfC5efNmQZdDpJFd9Wfapi7jX1A6RWfo0FiQgY+M7BIie8aZeGu61kydlDIyCBcblxz36YiJiaFHjx7s2bMHOzs7NmzYwP/+978Mt/V18uX43eOGwMfXOeu0FzllHKBkNEkyZJ1/yMfJx9CXpbFX49R9jT5DDMPVHbywMMvgK+nHH9VgR1Fg+HBYtEjNzlyC6f/2Z0POpstYLQpfyf7fU0plNsrBWGa5IPSO3jma5f55IYGPENl7FP/I0Nzk4+STed6WLH6UxMTE0KlTJ/bs2YOjoyNbt27NNOgxPpbhvnfyzbKPTU4Z3+t3o++i1WnTrcvqOjIb2WX8OsvPqsWL4bXX1KBn5MhSEfRA+r+XccZqUfjynMDwzp07/PXXXwQGBpKUlGSybv78+fkuWFkWnhBOXHIckHm7b9pfc2mDkeikaJPtCoIkMRQie/p70d3eHWsLa5MMxhlNxplWYmIizz//PIcPH8bFxYVt27bRvHnzLM+pP5bxfW+cB0ffzJbXawF1ouTQ2FBDc1RO+hFm9GMpNimW8IRww+tMP6u+/VbtywNqYsIvvijRzVvG0v29pJmrSOUp8Nm1axc9evSgSpUqBAQEUL9+fW7duoWiKDRp0qSgy1jm6D9Q3OzcDMkJ09J/qIUnhBObFJtpMCI1PkIUrbQ1Osb3zYO4ByRqE9GgybBpQ6vV8sorr7Bjxw7s7e3ZunVrtkGP8TkMr519sbO0S9fMltdrMX5tCHxyUuOTxUzkWV7DggWpWZjHjoW5c0tN0AMZ/L1kRFeRylOd4aRJkxg3bhwXLlzAxsaGdevWERQUhL+/v+T3KQA56QPgbOOMo5WjYXv9Pg5WDibbFeRIAX15QmNCSdImZbO1EGVT2vs3o1nGPR08002/oCgKo0aNYu3atVhaWvLHH3/QokWLHJ0z7X1uCLpyOK9fdtei/1wxPk5OOmmnHX0KqcFUpp9V8+enBj0TJ5a6oAfU6Tf0w/5BAp+ilqfA5/LlywwePBgACwsL4uPjcXBwYPr06cyePbtAC1gWZZTMKyMmuSD++0Bq4Z36QVnetnyBTnrnZueGlbkVCoph6LwQwpTh/nVU71/j0ZBZDV3++OOP+f7779FoNPzyyy907Ngxx+dM+yNJf/z8jMRMTEnkfux9IPVzxSSAycEPtIw6WOuP0axis/TXMHs2jBunLvjwwxKbpyc7FmYWeDl4GV7LUPailafAx97ensTERAAqVqzIjRs3DOsePnxYMCUrw3Ka58O4Gln/wdLat3W69QVFo9HIkHYhspGuxieD+zRtsLBmzRo+/vhjAL755hv69u2bq3N6OXhhrkmdCDWjc+eWPkCxsbChkWcj9TjGiQdz0EnbuMZHp+hMylKtXDU87D3UDRVotWgjvP+++nrqVHXG9VIY9OiZzEQvfXyKVJ4Cn5YtW3LokJqavGvXrowbN45PP/2UV199lZYtWxZoAcuinOb50K+/GX6TkJgQIE3gUwg3k/TzESJrae9f4y//jH7UnDx5kiFDhgAwbtw4RowYketzmpuZG/reGPcfymraiOwYlzXtfR+XHEdYfJi6PovPGS8HtUknWZdsqD0yDv58nX3R6GDBFvBeuFzdadYsdRqKUhz0QJqZ6KWpq0jlqXPz/PnziYlRZ8ydNm0aMTExrFmzhurVq/PFF18UaAHLopzm+dCvP37vOAoKVuZWNPFK7VxeGDeTjOwSImtp71/jDMb6yUn19+bdu3fp2bMnCQkJdOnSJV9dBXydfQmKCjLpP5SfPj5pAxTj4+gDKXtLe5ytnTM9hj6r9L3oewRFqmUzDqgq23vz1oaTDD4HikaD5ptvIA+BX0lkEvhIjU+RylPgU7VqVcNzOzs7vv322wIrUKml1aJERJDskjphqJW5leF5ii4ltSo4h3O36NfrE4D5OPkYRoIlpCQUTuAjNT5CZEqn6NLV+BhnMDZOMBgfH0+vXr24d+8edevW5ddff8Xc3DzTY2cnbQ2T8bLAyECStcnpOlRnxfg60qXPMAqKMkteaFyGe9H3CIoKopl3M8NnRyUbDz765gINz0GKGVis+BlefjnH5Svp9H+nLDNWi0KRp6auqlWrEhYWlm55RESESVAk/qMoMHo0SsuW1BpnjfUn6uOtzeoMw0vPLMX2U1vD8hvhap+pnNb4xCSptW++Tr4m/XCkqUuIovUg9gFJ2iQ0aEy+zDK6V9955x1OnjxJ+fLl+euvv3BycsrXudMOnzc+7/VH17H6xIqx28bm+HjGNTP6z5TgmGBSdCm5mm8sbS1xUGQQdknQcuSnNDx8gwRzmDyqTpkKeiD1vcs0Y7UoNHkKfG7duoVWq023PDExkbt37+a7UKVOWBhs2oTZ9esc+hGeULvj8Pul3wFYH7CeFF2KyS6NPBtl+6HStGJTk3b9bjW7AdCzVk/K2ZTj6UpPF/CFSFOXEFnRBwRejl4mtSs9avYwPPdz8ePCzgv88MMPaDQa1qxZQ7Vq1fJ97k7VO2FvaU/XGl0Nyyo5V6KhR0PDa/1nTk4YN9l5OHhgaWaJTtEZmq0gh4GP0Y+lyIRIzCKj2f4z2O89jNbOlj6DbSnfb0iOy1VatPZtTQW7CvSs1bO4i1Lm5CrM/OuvvwzPt23bhrNzatuuVqtl165d+Pn5FVjhSo0KFeDQIZTnnqPiP/9wZpUj7V6I5mDlUBJTEg0fImtfXEvHauoQVkdrR5M8DxlxsXHh9ru3iU2KxcLMAnsrewDmdpzL7P/Nxtws79XmmZEaHyEyl1lA8JH/R4xpNQatTkvg9UBatlAHgUydOjXLqShy439V/0fk+5Em972FmQWn3zjN1bCr1PmmDvei76HVaXP02WCcVsNMY4a3kze3Im5xJ+pOribWNO5gHXL9LHuWQ+MQwMUF8y1bWN+8WaF8Vj3uvBy9CBkXUiavvbjlKvDp1asXoA5r1ufx0bO0tMTPz4958+YVWOFKlYoV0ezfD927Y37wINt/hn4vqvPf6IOIWhVq4WyTeUfBjFiYWWS4T2HdTPoPuodxD0lIScg0s7QQZVFWeXocrByIjY3lpX4vERcXx//+9z8mT55coOfP6L4305hRo3wNLMwsSNGlEBwTnKO8MWmbs3ydfLkVccskH1FumrqUa1fxHfMSdiEQ5miB67590KABZflrX4Ke4pGrpi6dTodOp6NSpUrcv3/f8Fqn05GYmEhAQADdunUrrLKWfC4usH07dO+ObQr8uQbivlvIwzg191FJGNJYzqYctha2QN6GyApRmmXXBDRq1CguXbqEl5cXK1euzFdn5twwHu6ek2bquOQ4HsU/AjLJQJ3DkaegvhdN78K3n57D7k4I18vBxI+fggYN8nQtQuRXnvr43Lx5kwoVKpgsi4iIKIjylH62tvDHH2x52hNzBep/8AUTDoKdhW2e5tIpahqNRvr5CJGJO9GZNwGtWbOG5cuXY2ZmxurVq3F3dy/SshmSj+agmdp4Wgn9cHXjkV05zS4PUO34NfYuA9dYHXdretJ6GFjWqJ2XSxCiQOQp8Jk9ezZr1qwxvO7Tpw/ly5fH29ubc+fOFVjhSi0LC1aP6cBnbdSXs3fCN7ts0ChK8ZYrh6SfjxAZy6zG586dO7z55psAfPjhh7Rt27bIy5bR9BGZMW7K0g9X1+9/6eElIhMjTZZl6uefce03FPtk2FYNRo6rwwMHyVsjileeAp/vv/8eX1/1P+6OHTvYuXMnW7dupXPnzrz33nsFWsDSyte5EpM6wKQu1gAM2RMOAwZAQkIxlyx7UuMjRMYyagLS6XQMGTKEiIgImjVrxkcffVQsZcvND5aMOi/ra3eO3TkGgLO1M47Wjul3BjWFx5w58MoraFJS+PNJO7r3hz1hJ02OJURxyFPygODgYEPgs3HjRvr27UvHjh3x8/PL8WzCZZ3+Q+iz5okEWcOyvzRYrFkDd+/C+vXg6lq8BcyC1PgIkZ5Wp+VulJrOw7gmZMGCBezatQtbW1t+/vlnLC1znkSwIGU0U3pmMqq50u8fnRRt8jodnU6daPTLL9XX48Yxv/YRku8eJlm/bwnozyhKrzzV+JQrV46gIPXG2Lp1q2E4pqIoGeb3EekZf2isbAi/zB4Izs5w8CC0bg3//luMpcuaBD5CpBcSE4JW0WKuMcfTwROAixcv8v5/E2/OmzePWrVqFVv5cnPfZjRqK22wkmHwEhcHL76YGvTMnQtz5+JTrpLpvtLUJYpRngKf559/ngEDBtChQwfCwsLo3LkzAGfPnqV69eoFWsDSKu2HRkr7tnDoEFSqBFevQsuWcOxYMZUua9LUJUR6+mChomNFzM3MSUlJYciQISQmJtKlSxdDH5/ikpv7NqMmuwp2FUzSV6QLfEJCoF07+PNPsLKCVavUmp8MtpWmLlGc8hT4fPHFF7z11lvUrVuXHTt24ODgAKhNYCNHjizQApZWaX/x+Dr5Qr16cPQoNGkCDx5A+/bqh8hjRv+hJcPZhUhlPH8VqJ+TJ0+exNnZmSVLlmQ7p1Vh0wcfITEhJGmTstw2o1FbxtPhQJrPsAsXoEULOHFCbabftQv69093bsAwn6AQxSVPfXwsLS0ZP358uuXvvvtufstTZjhbO+Ng5ZA6d4/+Q8TLC/btg5degk2b4IUXYP58eIzeW/2HWHhCOLFJsYaM0UKUZcbNQ1evXmXKlCkAzJ8/n4oVi38SSjd7N6zMrUjSJnEv+h5+Ln6ZbptZgkJfJ1+uP7puum7HDrV5KyoKatRQP7dq1DDdzzl9XyEhikuOa3z++usvkpOTDc+zehS3b7/9lipVqmBjY8OTTz7JgQMHirtI6aT99WRS9evgoHZwHjFCHR0xZgy8/TakpKQ/UDFwtnHG0UodzSH9fIRQGWpJHHx47bXXSEhIoEOHDgwdOrSYS6Yy05jh7egNZN3cFZUYRVRiFJA+SEn3mbVkCXTurAY9Tz8NR46kC3oy3E+IYpTjGp9evXoREhKCu7u7YeqKjGg0mmLt4LxmzRreffddvv32W9q0acP3339P586duXTpEpUqVcr+AEXI18mXKw+v4GTthJN1mpmZLSzgm2+gShWYMAEWLoQrV2DtWihXrngKbMTX2ZdLDy4RFBlE7QqSjEwIffLC27tuc+DAAezt7Vm8eHGxN3EZ83X25WbEzSx/sOiDIhcbFxysHEz3/6+WR6ODxl+tgQVL1BUvvww//gjW1hmfN4tO0kIUtRzX+Oh0OkOmUeOpKtI+intU1/z58xk2bBivvfYaderU4csvv8TX15dFixYVa7kyYjwHToY0GnjvPbWfj7097NyptqMHBBRhKTMmI7tEaaEoCkoBJA8NigyCSNj47UYAZs2a9dhN2qy/b2+G3yRFl3ENclbzcPk6++KQCH+sgfL6oGfqVPj550yDHkhtZsvsuEIUpVx3btbpdPz0009069aN+vXr88QTT9CzZ09WrFhRIB8e+ZGUlMSpU6fo2LGjyfKOHTty+PDhDPdJTEwkKirK5FFU0s6Bk6levVJHfF27po742rGj8AuYhdxkgRXicdZlVRcaftcw2w6/2QmKCoItkBCXQOvWrRk1alQBlbDg6O/byXsmU252OUMyQmNZzbxeM9KSIz9ArwDUkVsrVsC0aeqPtCyYacwMTVzSx0cUt1wFPoqi0KNHD1577TXu3r3LE088Qb169bh16xZDhgyhd+/ehVXOHHn48CFarRYPDw+T5R4eHoSEhGS4z6xZs3B2djY89IkZi0LHah1xtHKke83u2W/csKE6YqJNG4iIUNvVv/5a7QNUDIwnLBSipIpJimHr9a38c/8froVdy/NxkrXJ3Dt5D66Aubk53333HWZmeRo0W6ieq/6cYZLhmKQYtt3Ylm6bTCda3b2bdn3fo/4DiChnqw7CGDQox+fuVasXrrauPF3p6bxfgBAFIFejupYtW8b+/fvZtWsX7du3N1m3e/duevXqxYoVK3jllVcKtJC5lbZNXVGUTNvZJ02axNixYw2vo6KiCi340Wq17N27F41GY3hsaLUB83hzDhw4YFhmZmZmso3JY+5cNDNnovn7b8zeeQfN/v1YTZmCjZMTtra22NjYYGNjg6WlZaH2LZCmLlEaGKdkuBN1h3ru9fJ0nBuhN2Cz+nzMmDE88cQTBVG8Aufv50/4xHCm75vOzIMzM0xJka6pS1HU/obvvouZVovSrBkuf/4J3t65Ove8TvP4vOPnmGkev4BQlC25Cnx+/fVXPvjgg3RBD8AzzzzD+++/z8qVK4st8KlQoQLm5ubpanfu37+frhZIz9raGuss2qYLUkJCgiHLdYH5/Xf1kYaZmRk2NjY4ODhQvnx5w6NcuXK4urri4+NDpUqVDA8PD49c/UKVXD6iNDBuqs1PEP/Jp59AJJiXM2fatGkFULLCY21hTbXy1YCMr9kkeWFSEowaBT/8oK4cOBDN4sVga5unc0vQIx4HuQp8zp8/z5w5czJd37lzZxYsWJDvQuWVlZUVTz75JDt27DBpdtuxYwc9e/YstnLpaTQa6tevb+hMmdVDp9Nlv11CArqICJIVhXjAeHpTnU5HXFwccXFx3L9/P9uyWVpaUq1aNerVq0e9evWoX78+zZo1o3LlyhnWHEn2ZlEaGH/x5/X/8sWLF1m9eDUAtQbWwt7+8c9rlVUfPf2yqon28Oyz6jQ6Gg3Mng3jx2fbn0eIx12uAp9Hjx5lWnMCal+a8PDwfBcqP8aOHcugQYNo2rQprVq1YvHixQQGBhZ7ungAOzs7/vnnn4I9aEAAPP88XLqEYmFB0vz5xA8cSEJiIgkJCURFRREeHs6jR48MjwcPHnDnzh0CAwO5ffs29+7dIzk5mStXrnDlyhXWrVtnOLyHhwctW7akdevWdOzYkQYNGmBmZmb44IxOiiYyIRJnG+eCvS4hikB+a3wURWHUqFFoU7RQCxq3a1yQxSs0mfXRUxSFoKggWgdCyx4jIfQ+ODnBr79Cly7FUVQhClyuAh+tVouFRea7mJur89MUp379+hEWFsb06dMJDg6mfv36bN68mcqVKxdruQpNrVrqNBevvorm99+xfucdrM+cUdvkPT1zdIjk5GTu3r1LQEAAFy9e5OLFi5w/f56zZ88SGhrKhg0b2LBhAxMnTsTDw4MOHTrQo0cPXMxciNBFEBQVJIGPKJFManzyEPj8/vvv7Nu3D3Mrc7SdtSVmqLa+qVqfrFCfRyw8/hGvHYhj7naw0N2HOnXUdBrFOLmqEAVNo+RiDLqZmRmdO3fOtE9MYmIiW7duLfZcPvkRFRWFs7MzkZGRODk5Zb/D40JR1JmQ338fdDp1vq8//oB8BHzx8fGcOXOGI0eOsHfvXvbs2UNsbKxhvcZKg1JDYfKIyUwZPgVLS8uCuBIhikynXzqx/cZ2AGq51uLKW1dyvG9cXBx16tQhMDCQWi/UIuCJAL7p8g0jm5WM+QrLzS5HREIEF0ZcUDt1x8QQPqgP5dZvVTfo10/t2+PgkPWBhHhM5PT7O1c9zQYPHoy7u7vJ8G/jh7u7e7GP6Cqz9MkOt2+HChXg9Gl48sl85fuxtbWldevWjBs3jr///ptHjx6xZ88e3nvvPfz8/FCSFLgIn7z1CZUqVWLy5Mncvn27AC9KiMKVtqkrN7nI5s6dS2BgIL6+vti1swNKVnI+k5GZAQHQogXl1m8l2Qw+7+OtNm9J0CNKoVzV+JQFJbbGx1hgoDq56cmTakA0ebKaXdXcvMBOoSgKL37xIn/8/gcOAQ7EPFInWzUzM6NHjx5MmjSJ5s2bF9j5hChoiqLg9JmTYaJggLAJYZS3LZ/tvoGBgdSuXZv4+HhWr17NO0HvcD/2PmfeOEMjz0aFWOqC03VVVzZf28x22zfo8MkqiI4mtoIznbpH4tqxBxte2lDcRRQiVwqlxkeUEJUqwYEDMHy42gQ2Y4Y6OuPevQI7hUajoUnTJtAJen/fm99++41nn30WnU7H+vXradGiBR06dGDv3r3FntFbiIxEJUYZgh79nFQ5Tc8wYcIE4uPjefrpp+n5fE/ux6ojJ0vSBJxVbCvyxRboMPF7iI6Gtm1Z8O1gDlUuWTVXQuSWBD6llY0NfP89rFqlVlfv2weNGqlNYQVEPzLkXtw9XnzxRXbu3Mnly5cZMmQI5ubm7Ny5k/bt29OpU6eCH80mRD7pOzOXty1PjfLqjOI5GdK+f/9+1qxZg0aj4auvvuJu9F0AbCxscLV1LbwCF6Tr1/lw0mbe1c9YMW4c7NzJZQt1VK4EPqI0k8CntOvfH06dUqe8ePAAnntObfoqgNF3GWVvrl27NkuXLuX69euMGDECS0tLduzYQaNGjRg+fHimU4cIUdT0QY6Pk0+Op2DRarWMHj0agNdff53GjRubZDp+nGZiz9Tq1dCkCV4B9wizhY/GNFQHRlhamiYvFKKUksCnLKhZE44cgTfeUJu+Pv0UnnkG7t7N12GNkximbc7y8/Pj22+/5cqVK/Tp0wedTseSJUuoWbMm3377LTqdLl/nFiK/jAMWH0e1iSq7Gp8ff/yRs2fP4uzszCeffGKyz2MfLMTFweuvqz+GoqOJaPoEjd6E36qmpj7NdJ4uIUoRCXzKCltb+O671JEaBw5AgwZqjo480vdniE+J51H8owy3qVq1KmvXruXgwYM0b96c6OhoRo0aRdu2bblyJedDh4UoaMZf8jmp8YmMjOTDDz8EYNq0abi5uQFGs5k/zsHCxYvQvLk6PP2/AQ8PN63ljnPqaDZFUbKcmV2I0kICn7LmpZfUoe6NG8OjR2rW59deg5iY7PdNw8bCBjc79cM/uyaCNm3acOTIERYuXIiDgwOHDh2iYcOGfPbZZ1L7I4pcYkoityJvAeqXfE4m3Z0zZw4PHz6kVq1ajBg5wrA83aSejxNFgW+/hWbN1ODH01NNcTFjBt7l1Bxfcclx3I2+S2BkIInaRDRoqOhYsZgLLkThkcCnLKpRQ832PHGi+uvvxx/VQOj48VwfKjdzdpmZmTFq1CguXrxIly5dSEpKYtKkSXTo0IF7BTjiTIisrPpnFQ6zHPjl/C9Amj4+mfw/Dg4O5osvvgBg1KRReH3hxaf7P1X3eVz7xQQHq9NMjBoF8fHQqROcPauO8ARsLW2pYFcBAN8vfPH7yg8ADwcPrMytiqnQQhQ+CXzKKisr+Owz2L0bfHzg+nVo3Vrt/5OLzNs5+aWcVqVKldi4cSM//fQTdnZ27N69mwYNGrBx48ZcX4YQufX31b9J0amd+11tXfGv7G/4f3wn6k6G6Rc+/vhj4uPjadWqFdSG8IRw1gesBx7TfjF//AFPPAFbt6ojPL/6CjZvhjRzLb5Y58V0uz5f+/miKqUQxUICn7KuXTs4f15NT6/VqiO+2rWDW7dytLu+n09uZ7bWaDQMHTqU06dP06hRI8LCwujevTuTJk0q0VOeiMef/v/qz71/JmR8CJVdKuPt5I0GDYnaRB7GPTTZ/urVq/zwww8AfPbZZ4Z+MPrj6IP+xyKHT1QUDB2qJjANC1Nrck+dgnfeAbP0H/eLui0i7oM4Yj+IJfaDWOI+iOObrt8UQ8GFKDoS+AgoV07t9LxiBTg6wsGD6q/F779X+whkIS81PsZq1arF0aNHDUOEP/vsM3r06EFkZGSejidEdvT/V6uVq4aFmTrpspW5FR4OHibr9SZPnoxWq6Vr1660bduWO9Fq4BMaG0p4fLihY3+xN3UdPKimrVi2TG3CnjRJbdKuWzfL3WwtbbGztMPO0g5bS9uiKasQxUgCH6HSaGDQIDh3Dp56Su3s/Oab0LEjZDH/lv7DPqcZbzNibW3Nl19+yS+//IKNjQ2bN2+mRYsWBAQE5PmYQmREq9NyL1rtT5Y2UDEE8Ua1lydOnOC3335Do9Ewa9asdOuP3VUzADpYOeBs7VyoZc9UXByMGQNt26o1tX5+sH8/zJypNmkLIUxI4CNMVamiZnn+4gt1CPzOnWrtz+LFGdb+5LfGx9jLL7/MwYMH8fHxISAggJYtW3LgwIF8H1cIvdDYUFJ0KZhrzPFy8DJZZ2i2/e//sqIovP/++wAMGjSIJ554wmQ9wOGgw0AxJi/ct09NS/Hll+r9OXRo6o8XIUSGJPAR6ZmZwbvvqh+gbdqo8/i88YY6KiQw0GRT4xofnZL/YelPPvkkJ0+epFWrVkRERNChQwf++OOPfB9XCEitranoWBFzM9NJe9PW+OzYsYPdu3djZWXF9OnTAdApOu5GpSb+PHLniLpvUTdzxcSoo7XatYMbN9QBCps3w08/QUmdXFmIIiKBj8hcjRrqL8r589WRITt2QP36aiLE/3LveDuqnUKTtEk8iH1QIKf18PBg586d9OjRg8TERF588UUWLVpUIMcWZVtWQ8+NkxjqdDomTpwIwMiRI6lcWc15ExoTSrIu2bDPsTtqU1eRjujauVO9D7/9Vn39+utw4QJ07lx0ZRCiBJPAR2TN3FztP3DunDrcPToaRoyAp5+GCxewNLfE08ETKJjmLj07OzvWrVvH8OHDURSFkSNHMn36dJnpXeRLVkPPjZtt16xZw9mzZ3F0dDRka9avMxadFJ3p8Qrco0dqkNOhg9rvrnJl9cfI4sXgXEz9i4QogSTwETlTs6baYfKrr9QpLw4fVofKfvgh1W29gdwPac+OhYUF3333HR9//DEAU6dO5aOPPpLgR+RZVlmW9TU+gWGBTJ48GYAJEyZQoUKF1P0z+T9eqEPZFQV+/hlq11annAAYORL++Qf+97/CO68QpZQEPiLnzM3VfCCXLkHPnuoM7zNnsmbGZZ75t2BrfPQ0Gg1Tpkxh/vz5AHz66adMnDhRgh+RJ1nl3DEkMdx7h3///RcPDw/GjBmT4f6OVo6m+xZWH5+rV9Xg5pVX4MEDqFNH/QHyzTdq6gkhRK5J4CNyz9cX1q9Xs8NWrIhXSCy7VkCbD7+H+/cL5ZRjxoxhwYIFAHz++eeMGTNGgh+Ra1nNpO7l6IUmSYNur9p/berUqdjb25tso0/b0NKnpcnyAm/qSkiAadPUEZW7d6t97GbOVKecePrpgj2XEGWMBD4i73r3hkuXOPN8a3TAk7suqU1iX32l1gYVsLffftvQyfmrr77i/fffl+BH5EpWM6lbmFngeMoRYsHHz4fXXnst3Tb6Gp/Wvq1Nlhdojc+OHWoiwo8/hqQkeO45dYLRSZMkL48QBUACH5E/zs5cmz6a1sMgoLI9REaqQ+EbN4a9ewv8dG+++Sbff/89oM6WPXPmzAI/hyidUnQpBMcEAxkHKvfv3ydmbwwAfd/ui6WlZbpt9DVGT7g/gb2lWhvkYuOCg5VD/gt44wb06qUmDb16VZ1Jfc0adZh61ar5P74QApDARxQAXydfjvnCc++UV4e6ly+vDq9t316dAyyoYPv+DB8+nHnz5gHqdAL6JjAhsnIv+h46RYelmSXu9u7p1n/66afoEnXgBd4tvTM8hvFweH3wlO9mrpgY+OADdWqJDRvUvnSjR8OVK9C3r5pVXQhRYCTwEflmyH8Sc4/wV/oSdeEUSW+8hmJmBmvXotSuTcLHHxEVEYpWlzoBaX4SHo4dO5apU6cCMHr0aJYtW5avaxCln762xsfJBzON6Uffv//+m5or6n9wN/pu2t1J0aUYprvwcfIxBDx5buZSFPjlF6hVC2bNUpu1OnRQJw3+8ksZoi5EIZHAR+Sbl4MX5hpztIqW8nPK47y4CtZeP9D4dR0HKoEmLg6baZ8QWdmT9wZ5EB0fyc3wm1SYU4GJOybm+bxTp041jLp57bXX2LJlS0FdkiiFskpeOGXKFJKTk6nZvCZUy3iEYnB0MDpFh4WZBR72HqmBT15qfI4cUbOiDxoE9+6pTVnr18O2bdlOKiqEyB8JfES+mZuZ83yd59MtP+cFbYfCgOfhtjP4RsH8VWFomjbj2ppFhCeEsyFgQ57Pq9FomDdvHq+88gparZY+ffpw8uTJ/FyKKMUyS1549uxZVq5cCcBr76kdmjMKfPTLvB29MTczp3ut7rjYuNC1RtecFyIgAF54QU0GeuQI2Nuro7UuXlRTREizlhCFzqK4CyBKh7V91pKQkpD5BvHxfPdqE/r/fQvnS9foOOJzNlWHqV1uoyhKnid41Gg0LFmyhHv37rFz5066du3KkSNHqCqdQUUameXwmTRpEgAvvfQS/q384WLq6C+T/dMMhe9Vuxc9a/XM2f/dkBB1lNaSJaDVqvPhDR2qLvPOuD+REKJwSI2PKDA2FjaZPxzLcbB/G6q9AydfbIPWXEOX63D06wSSBg+EW7fyfF4rKyvWrVtHw4YNuX//Pp07dyYsLKzgLkyUChllbd6zZw9bt27FwsKCGTNmGNbdi75His40JUNGQ+GzDXpiYtR8PNWrqx3/tVro3l3tx/PDDxL0CFEMJPARRcbXyZcwe1g+tDHDZz/Nb3XBXAHrn1ep+X9GjIA76X9p54STkxObN2+mUqVKXL16lRdffJHk5OTsdxRlRtoaG0VReP/99wF1pGD16tXxcPDAwswCnaIjODrYdP8sprtIJy4O5s6FKlXUWp3YWGjeXJ3096+/oF69ArwyIURuSOAjiozx7NfH7R7Rty+0eA0etGkEycnqL+Lq1dU8QCEhuT5+xYoV2bRpEw4ODuzdu5fRo0cX7AWIEi1tjc0ff/zB8ePHsbe356OPPgLATGOGt+N/c8+l6eeTVedog/h4+OILtbPye+/Bw4fq/+m1a+HoUWjbtqAvSwiRSxL4iCJjPPu1/tf3cR9Y9+Ub6i/hp5+GxEQ183PVqjBxYq6nwKhfvz6rVq1Co9GwaNGi1CHKokxLTEkkNDYUUAOXlJQUPvjgA0BNjeDp6WnY1hCgp5mQ1Hg4fDoJCfD111CtGowdC6Gham3P0qVw+TL06SMdl4V4TEjgI4qM/gvlathVIhMjDcuDIoPUX8L79sH27dCihfrLec4c8PNTk7nlIgli9+7dDRmd3377bfbs2VOg1yFKHn1eHhsLG1xtXfnpp5+4evUqFSpUYPz48SbbGgfoxjJs6oqJUXPuVK+uTuAbHAyVK6v9dwICYMgQsJAxJEI8TiTwEUVG/4URkxRjstzwBaPRqAncjhyBv/+Gpk3VAGjBAvWX9LBhair/HJg4cSIvv/wyWq2WF198kRs3bhTotYiSxXgoe3x8PNOmTQPUzN9OTk4m2xoCH6ManyRtEqExqTVGhIWpnZYrV4YxY+DuXXXy3u++U/+PDhsGGUx5IYQofhL4iCJT3rY8tha26Zany5mi0UC3bnD8uDphY/v2ah+gn36C2rXVaTDOnMnyXPph7s2aNePRo0f06NGDqKiogrwcUYIY989ZsGABwcHB+Pn58eabb6bb1rgvmt7dqLsoKFSLscLtg0+hUiW10/KjR2ptz+LFcO0avPGGTCQqxGNOAh9RZDQajUnHUEcrRyB9XwqjHeB//4Pdu+HwYXUYsKKoHUWbNIF27dRst1pthrvb2tqyfv16KlasyKVLlxg0aBA6Xd6nyRAll/7/mJvGjc8++wyAGTNmYG1tnW5bfY2PcS6f8MO7WPYnXJ6fhGbBAnXUVuPG6iSiV67A669DBscSQjx+JPARRcq4Y2hLn5aA+gWjKErWO7ZqpQ4DPncOBgxQ+03s2we9e0ONGmo/iwxqdCpWrMj69euxtrbmr7/+Ys6cOQV5OaKE0Nfe3N54m8jISBo0aMCAAQMy3FYfnN8LD4TffoOnnqJJt9cZfA4sdag1kNu2walT6iSi5uZFdRlCiAIggY8oUsYdQ1t4t0CDhkRtIg/iHuTsAA0awMqVcPMmvP8+lCunPh8zBnx81H/T9ANq1qwZCxcuBODDDz+Uzs5lUFBUEETAyfXqlCazZs3CzCzjj79KyfZMPABHPg1VA5tDh9Cam7HyCZg2u7NaA9mxo4zSEqKEksBHFCnjwKda+Wp4OHgAWTR3ZcbHR53R+s4dtUNp7doQHa3W/NSqBc88A6tXq8PjgWHDhjF06FB0Oh0vvfQSd++mn31blF53ou7AXkhJSsHf35/OnTubbqAocOAAvPIKrrUa8dkudW45bQVX+Ogjpix9hYEvQPKTjYul/EKIgiOBjyhSxn18fJ18DU1fGc2NlCN2dmqH0osXYetW6NpV/SW+Zw/0768GSBMmoLlxg2+++cYwrUXfvn0ls3MZcjPgJpxTn3/22WepU008fAjz5qkzordtCz//jCYhgQs+VrzSCw4f/BWmT+eC5SMgkxw+QogSRQIfUaSMa3x8nX0Nr6+GXSUxJTHT/bQ6bZavMTODTp1g40Z13q8pU6BiRfWL7fPPoUYNbLt04feXXsLZ2ZnDhw8zYcKEfF+PcTkURSEiIYLIhMjs+yyJ9H/DXFIUBZ2SfWf1uOQ4IjdHggLde3anZdOmar6ol15S/4+MH692ULa3V4ehHz3K2zNa8XMjCExUE2imne5CCFFySeAjipTxF4ePk48h8JmwcwLl55TnTHD6Yerbb2zH6TMnlp1dBsCgPwfh+4Uvj+IfZXwS/VDj27fVUV9duqi1QHv3Un3SJJbHxwPw5Zdf8tvq1Xm+lp/O/ITTZ07s/HcniqLQdllbys0uh8tsFwb+OTDPxy0LQmJC8JznyRt/v5Gn/RVFoc1PbWj8feN0k4mmtWHHBggANDDbuZyab6dTJ3VEVnKymi/q++/h3j018WCLFvg6VwJSO0Xnap4uIcRjTQIfUaRqutakkWcjutfsjp2lHd1qdsPO0g5Qf5nvvrk73T7brm8jLjmOzdc2A7DhygaCY4I5de9U1iezsICePWHTJrUW6NNPoVYteiYlMfG/TV4dMICrQ4ao8yjlcqj7pmubiEuOY/uN7UQkRHAw8KBh3V8Bf0mtTxaOBB3hYdxD/r76d572fxj3kCN3jnA+9DyBkYGZbqf8+y/zh48B4DUF6qxYoc4D5+oKI0fC6dNw4gQMHw5GiQyNkxjGJ8fzMO6hulxqfIQo8STwEUXKytyK08NP81f/vwDoUK0DUe9HMb6VOm1AumSGmP7qjkyIJDopOtNtM1WpEnzwgTpv0vHjfDJqFP4WFsQoCi8tX05iq1ZqFt5331U7uWaSG8ikXJGp5dKXxd7SHlCzUxtPyyFM6d+vkJgQkrRJed4fMugYf+WKGuQ++SQbq1Xj5N1QbIBJFho1+eVff6m1O998o+biyYA+wLkTfcfQ/8zO0o5yNuVyXVYhxONFAh9R5DRphgGbm5lT2aUykE3gExmU9Rdezk4OzZphsXAhq65fp4KTE2eAiZaW6gixr75SO7n6+MCoUWrm6MSM+x6ZlOu/stR0rYmrrWvey1dG6N8bBYV70ffyvL/6PFDN5D15stpJuU4dmDwZ7enTTPpvm2o1YN6Kl9WRft27Z5td2bjGx3hW97T/d4UQJY8EPuKxkNH8SHr6ZcExwdwMv5m6PDc1PhmoWLkyy1atAuCr5GT++uADeOUVcHZWm0O+/VbN1+LqCr16qdMS3FG/BI3nbjKu8fF19s1wygNhKr8BbOi9qzx/CZZsgB4d3lIzeX/6qVqjZ2kJXbrw89ChXASsHay5+Dy4eVXL8fGN/4bGf1shRMkn0waLx4J+mHDaYCFFl0JwTDAAOkXH8bvHDesKIrDo2rUrY8aM4YsvvmDod99x7tw5fJYsgV27YN06tX9QSAhs2KA+ABo0IK59K/4XpnCokjqP0+2I24AawCmKwtmQs1LjkwWTwCcnf0etVs3avW0bbNnCsEMHGW7okhWlpjXo3Bmefx66diXB2popNWsC4NfNjwDbgFx1TNZv+zDuIdfCrpksE0KUbBL4iMeC/td0aEwoSdokrMzVpoh70fdMhiwfuXPE8LygAotZs2axf/9+Tp06xcsvv8zu3bsx79xZ/SLV6eDsWdi8WX0cPQrnz+Ny/jzbgSQzOO6t5dap1bR3Ab+nPNA5qeWVGp/MmTZVZfA+paSo7/veverUJAcOQGRqnylz4IorbKkB4e1aMH3qXrCxMaz/dv58goKC8PHxwbylOUTkrsbGxcYFO0s74pLjDP/nJIePEKWDBD7iseBm54a1uTWJ2kTuRd/Dz8UPSP+leOzuMcPzoKggFEXJd78La2trVq9eTePGjdm/fz+ffPIJU6dOVVeamanNKE2aqH1IHj6ErVu58dtiLPYdoHIkPBUETwXdYiCgXT2D4BpeVHcE65gDUD1QHT4tfUMMtDqtSb+eoKggCAtTR1cdO6Y+Dh1KP/eakxP4+0PnzvSN/onf4tXpJxp6JDDdKOgJDw/nk08+AWDatGmMezAOyF2NjUajwdfJl4CwAMP/OanxEaJ0kMBHPBY0Gg0+Tj7cCL9BUGRQauCTptYkJinG5HlkYiQuNi75Pn/16tX57rvvGDhwINOnT6ddu3b4+/un37BCBRg4kN/97v6/vTsPb6pM1AD+njRpuqRp6UKbLhSQRZFNisimoA44KLghm+LA9YqDUhjUGQSHTR1kEXQYFRVkBBUE3LiuDIugMCyCgiwKglQaSlugLU1pm7RJz/3jcA5Jm7bplpyk7+958tAmZ/nyEc3Lt2L6DTvRtgC4NQO49Xfpz8TL5Ug+lomnAGDvd8DiVCAhAejdG0hLA7p1k/Yba9Wq2Yah3Mxf0C/DgW45wE1ZwK1vrgJyXq96YGSkNNB8wABg4ECge3dlQ9D9SxcB0nJMVVb9XrBgAQoKCnD99dfj/tH349HFjwKo+xidlEgp+MifOY7xIQoMDD6kGimRKVLwqcPA17OWs40SfADgoYcewtatW7Fq1So89NBDOHToEGJjY90ea7aYAQE4HS09VqYBEIHModtweec2bPvgRQzI0aNLtkMaI7Rxo/SQRUZKAahbN6BzZ2mH+Q4dpJWEq9k80+8UFACnTkkDjo8cUR6J587hW5cDi6U/OnQAevWSHv36SXXjZufzCrECWZare63lleahpLwEYbowZGZmYunSpQCAhQsXIrtEGh8WFRIFQ7ChTsWv3MLDFh+iwMDgQ6rhbmaX/K95o94Ii+1q10dEcASKyopgLjSjc8vOjVaGV199FXv27MGJEyfwyCOP4P/+7//cdqXJ4cy5XIIgIP6G/ii/pjUmW15EiFZAyZOFEA4elMYGHToEHD4sBYHCQmncys6drhcODQXatZNCQLt2UjdZcrL0SEmRWpzUEIxEEbh0CcjKktbEycqSFok8derqI7+albUBZEQBP5u02Jtgx4lrIrFh4WkgOtqjW+dezkV5RTk0ggYh2hCUlJfgrOUsOsR0wKxZs2Cz2TBw4EDceeed2PzbZgD1G59TJfiwxYcoIDD4kGoowcfNjJ+bkm7CltNblOd7JfXCtoxtjT6A2GAwYN26dejduzc+//xzvPrqq5gyZUqV4+Rw5lyueEM8goOCkRSRBACw2q3IQwli+/WTWjBkZWXSInuHD0szlX75Bfj1VyAjAygtvdo64k5wsNQqFBcnTbOv/DAapRlOoaHSn/JDp5O61uQQJ/9cUQFYrdKjtPTqn6WlUotNfv7VP/PzpbE4OTlS0Lmy9UeNTCapNatLF6mFq0sXvFq8HVP++3cManvrlborhNUYhpBaL3al7q/8nSdGJMIQbMDxi8dhLjSjxFyC9957DwCwaNEiCILQoK0mnIOOUW+EUW+s4Wgi8hcMPqQa7qa0yz/3TemrBIy4sDi0j24vBZ8mmDLevXt3LF68GJMnT8bf/vY3DBgwAN26dXM5xl255C9XvVaP+PB45BbnwlxoRmxYpe6y4GApBHTtCox12tOrvFzaX+zXX4GTJ4HffpPWDZIfOTlSaPr9d+mhBtHRQFKSFMZatZJCTrt20qNtW2njz0pOb9oAAOgW3w27Mneh1F6Ks5azaBfdzqNbyn/nycZkRARHSMHHYsaiZxZBFEWMHj0aN954o8ux9Qo+zhvqspuLKGAw+JBqKIvGuZnq3Delr8txTb1I4KRJk7B582Z8/vnnGD16NA4cOIDwK1/izns3VS6X88+5xbkwW8y4weR+W4QqdLqrocGdsjIgO1tqbbl4UWp9kR9ya8zly0BJSdVHWZnUPQVIf8o/C4I0DTw0VHo4/xwVJQWb6GigRYurfyYkXA07oaF1qlcAVRZ7/DXvV5gLzZ4HH6dWnIjgCADA9q3bsXnzZuh0OsybN8/tveqq8t8nEQUGBh9SDflf1fK4HpvdhtxiaXXk7gndEaINgdVuRYoxxW23WGMSBAH//ve/0a1bNxw/fhxPPvkkli9f7lK+MF0YusZ3Vc5Jjrg6jiTFmIID5w40botUcLC0n1hqauNd0wecg0uK8UrwqcPfo3MrToQ+AqgAvlj2BQApsLZt21Y51nm7ibpyHhfk/HdLRP5NBaMkiSTyv6ovlFyA1W5FVpE0cydEG4K4sDjliyjZmOy2daixxcbG4r333oMgCFixYgU++ugjlDvK8cvFX5RytAxvCZ1G51J++TXA+4sYFpcVI780H1a71av3rQsljDi13J3MO4n80nzkl+a73bS0tLxUef30pdNXzzemAEeA/Ix8REZGYubMmS7nNaTFx3lcD1t8iAIHgw+pRouQFgjThQGQvhydx3LIC8oBqNLiI8rdNk3gtttuwzPPPAMAeHTCozDNNuGedfco5dAIGiXkuBsT4s3g8/HPHyNyQSRiFsUgdlEsjp4/6rV7e6rcUY7sImmKufPf4z92/gMxi2IQsygGpiUm5RgA+G/mf9FiYQvl9Y3HNyrnx4fEA99Ix82YMQMxMTHKeaIoNmiMj/N5HONDFDgYfEg1nMON807s8nMPdHoALcNb4o52dyhhw2q3Ir+0+mnTjeH5559Hr169UHipEHnv5wEOQKvR4oFODwAARncejWRjMm5JvUU5xxstUpVtOrUJDtEBACguL8aO33d47d6eOld0DiJEBAcFIy48Dne2v7PKbKn80nzsPbtX+X3r6a2wOWwuxyRFJKF/q/7YumYrUAgIkUKV2XeXrJdQXC6tEVTf7SZGXT8KJoMJt7a5tV7nE5H6MPiQqrjsil3o2k3xxI1PIOfpHHRP6A69Vo+W4S2VY5uSTqfDBx98gJDwECATaH+sPWwzbZjYcyIA4MXbX0Tm1EyYIkxX34cPWnzke8kL9alxk1S5jMnGZGgEDXon90bBMwWwz7LDPsuO+6+73+U455/nDJijHGd+0gyHxYG3l74NABBvF2HX2N3eKyY0BqG6ug/CBoBZA2Yh66ksZSVxIvJ/DD6kKsrYGDctPgBcFhN0t+BhU2nbti3++Jc/AgBObTyF3f/d7fJ65UUO5bCWZcly2WS1KcljZ+SZZmeLztZ0uE84d1/KNIIGQZogBGmCqgxwd/45NTJVOU4QBDz77LMoLi5GUEoQ0KVqyKwcnOuroXvBEZG6MPiQqji3lNQ2I8fbA4ijekUBXQGxQsRDDz2EgoKCao9NjEiERtCgvKIc54vPe6V8ytpCyVLwUXOLT3V/pzUtYukcYPbv34/Vq1cDAFLHpAJC1ffbkMULiShwMfiQqjj/i9+5W6SmY731BW8uNAN3AfEp8cjMzMRjjz1W7cBqrUYLk8HktfJZbBZl64w+KX2k+3p5RpknahtsXNNaTvI5oihi6tSpAICHH34YHbt2lI6rrsWHwYeInDD4kKrUNManpmO9wWwxA3pg7qtzodVq8dFHH2HlypXVHu/N8sl11SKkBa6NvRaAd7vZPCV3v1X7d1qpxafQWoiisiKXc9atW4fdu3cjLCwM8+fPrzYA13YvImqeGHxIVeQvsd/yf0NeaZ7Lc9Ud641g4Tw1etDNg5TVgf/yl7/g+PHjNZfPCy0+zt1BJoNJ6WbLvZzb5PeuC09bfLIsWXBUOJT3FR0ajTBdGEpKSjBt2jQA0vT1pKQk5RzncUGe3IuImicGH1IV+UtMnoYcrgtHVEhUjcd6I1jkl+aj1C5typlkTMJf//pX/OEPf0BJSQlGjx4Nq7XqgoHeHIPkPGhYF6RDgiHBa/eui9oWFEwwJEAjaOAQHci5nFNlMPRLL72Es2fPIjU1FU8//bR0rWoCcEMWLySiwMXgQ6pi1BuV/ZcA6Uurulk1zuOBmrpLR/4SjQuLQ4g2BBqNBu+++y5iY2Px008/Yfr06dWWzyvBp9JAXm+Pf/KEzW5TBnpX1wqj1WiRGJEI4Ep3p9P7MpvNWLhwIQBp9/XQK/uEuetSFEWxQdtVEFHgYvAh1XHZHLKGL63EiEQIEFBeUY4LxReatEzuxhuZTCasWrUKALB06VJ89dVXLud4s0WqSvCppvvHl+SyhGpDER0aXe1xLotYOnVXTZs2DaWlpbj55psxYsQIt8fLg80vllxUtu2QgxQREcDgQyrkbusHd3RBOmXRwKZuVamu9eCuu+5SVgweP348srOvbrXgzRYf5/2vvH1vTznP0qtpbRzn0CYPULadtGHdunXQaDRYunSpy/lJxiQAUvfoJesll3vFh8dDr9U3+nshIv/F4EOq4xJ8ahmf4bzgYVOqaU2YhQsXolu3brhw4QL+9Kc/oaJC6naTy36u6BzsFfYq5zVq+Qqr6epSU/DxcEFB57KbC82AHfh66dcAgPT0dNxwww0ux4fpwhATGqOcU5d7EVHzE1DBp3Xr1hAEweXhbuwFqZunXV3Orzf1F3xNA2VDQkLwwQcfIDQ0FFu3bsWSJUsASK0NWo0WFWIFci7nNFnZRFGsUj5f7BVWG08XFHQJPhYzsBvIOZODhIQEPP/88+7PqfR+uXghEVUnoIIPIG0omZ2drTxmzpzp6yJRHdWlxcdbg3hrmxp93XXXYenSpQCAZ599FgcOHECQJghJEUlNXr4CawFKyksAoMpO8Wpq8fF0sLFziDmTcQb4Tnp+yZIliIyMdH9OpffLgc1EVJ2ACz4RERFISEhQHgaDwddFojpyDju17ardFIsEljvKqzznydToRx99FMOHD4fdbseYMWNQVFRUpXwVYgUuFF/AheIL1a76XNeyHsk9AgCIDYtFiDbEpZze6GbzlKfTy+Wwcjj3MGxf2AA7MGDgAIwZM6bWc+TAw6nsRFSdgAs+CxcuRExMDLp374558+ahrKysxuNtNhssFovLg3zLOex4u6tr55mdMC4w4p97/6k8VyFWeNSCIAgCVqxYgZSUFJw6dQrp6elVWqQGrhqIlotbouXilrh/w/0NKmtxWTHavdoOA1cPrFI252627KJs9xfwMk8XFJT//ksPlwK/AggC3lj2hkcDoquM8WGLDxFVElDB5y9/+QvWrVuH7du3Iz09Hf/85z/xxBNP1HjO/PnzERkZqTxSUvg/Sl9rF90ONyXdhGEdhiFCH1HjsY09lmVbxjZY7VZ8fepr5bkLxRdQ5iiDAKHWqdEtWrTAmjVrlHV+LPulIG22mGGxWbAzc6dy7Ncnv25Qq8/R80eRWZgJAAgSgjDq+lHKa0GaIJf1cNTA01aYBEMCBsQPAK6sDnDjiBtx3XXX1XhO5YDJFh8iqo7qg8/cuXOrDFiu/Dhw4AAA4Mknn8SAAQPQtWtXPProo3jzzTexcuVK5OXlVXv9GTNmoLCwUHmYzer4kmjOtBot9j66F5+N+azWY+UvvHNF5+CocDT43soXp/MmmVe+RBMMCdAF6Wq9xs0334xZs2YBALb8awtw3nXvsTBdGAQIsDlsuFBS//WH5HL1Tu4N+2w7nun/jMvrlbt/fKmkvAT5pfkAam+FEQQB1+y/BrgMXHvttfjune9qvb5zi0+FWIEsSxaA2rtKiaj50fq6ALVJT0/H6NGjazymdevWbp/v3bs3AODUqVOIiYlxe4xer4dez3U+/FWCIQFajRb2CjtyLucoa7rUl9JVYpEWwxMEoV5To2fNmoVdu3Zh27ZtwHrg946/KwGkbYu2uFhyUdmSoWV4y/qV1ZN9r8zqmNkll8EQbIBRb6zx2K1bt+Lf//43BEHA22+/jZCQkFqvLwecs5azyLmcg/KKcmgEDRcvJKIqVB98YmNjERsbW69zDx48CEBaYZcCk9ylk1mYCbPF3ODgI4eTy2WXUWgrRFRIVL1mCAUFBWHt2rXo0q0Lzuecx7GVx5DZL1O5Tqg2VAo+FjPSEtMaVFY1bOJaG+fp5TWN1SkuLsZjjz0GAJg0aRL69evn0fXl2XNWuxWHcg4BAEwGE7Qa1f8vjoi8TPVdXZ7as2cPXnnlFRw6dAgZGRnYsGED/vznP+Puu+9Gq1atfF08akKNtYih83o4gJsZQnUcKNuyZUu8s/YdQAPYDtuwbsU65TqNsaVEbeNY1BR8Kq8sXZ2ZM2ciIyMDKSkpePHFFz2+vl6rR3x4PABgt3m3R/ciouYpYIKPXq/H+vXrMXDgQHTq1AmzZ8/GhAkT8MEHH/i6aNTEGusLvtBWiMtll5XfG2Og7JCBQ6AdIrU6bF+xHTgjXacx1h+qLZCpaRFDT2ZZbd++XVkL6a233kJERM0D2yuT368SfDiji4jcCJh24B49emDv3r2+Lgb5QGMtYlj5/MaYGi0IAloNaoXTmachHhGBD4GIMREINYa63KMh5fWHFp/aQlphYSHGjRsHURQxYcIEDBkypM73SDGm4MC5A/g+6/sa70VEzVvAtPhQ89VYixhWPr+xpka3imoFDAMQB+AysPLvK2EKa9jmqvYKO7IvS+vz1Nbik3s5F2WOmtezamq11eHkyZNhNpvRtm1bvPzyy/W6h1wPxeXFNd6LiJo3Bh/ye43VsuGuxcdR4VCmRte3BSHZmAwEAxgFIBg4sv8IPlrykdt7eupc0TlUiBXQaXSIN8S7PSYuLA7BQcEQIeJc0bl63aex1NRq9uGHH+K9996DRqPBe++9V+/V1isHHbb4EJE7DD7k9xprLIscnCL1kcrvOZdz4BAdCBKCkGBIqF/55C/gWADDpe6vT9//FPgeyCrKqtf6Q/J7TTImQSO4/89YEASv7V5fG7luK6+rc+7cOUycOBGAtKZW3759632PytfmGj5E5A6DD/k9OVjkXM5xu8+Wp5wXBASksCA/lxiRiCBNUIPKBwAx3WMwf/586ZdNgP2UHbnFuXW+pjxLqta9zFQwzsdis8Bik1awdm6Vkfc0y8/PR48ePTB79uwG3adyCw+7uojIHQYf8ntx4Y3TpSOHib4pfZXf67N4YWXO56ZEpmDatGkYO3YsUAFgA7Dnpz11vqanU+zVMLNLrteokCgYgq92Y82ePRvfffcdDAYD1q5di+Dg4Abdx7metRqtMr2diMgZgw/5PY2gURawa4xZUnKLT6m9FIdzDwNo2HgR53PlBfxWrFgBQ1sDYAUmj52Mixcv1qus3t7EtT7clfWrr75SWr7efvttdOzYscH3SYxIVLr9kiKS6t1CR0SBjcGHAkJDWzacFy9sF91O2UZi99mGrwnj0uJz5TohISG4dfqtQCSQfSYbw4YNQ0lJicfX9HSmmSqCT6WyZmZm4uGHHwYgrc48atSoas+tC61GC5PB5HIvIqLKGHwoINT1C955erejwoETeSdgtVsBSK0F8vX2mKVuqIZ8kbYIaYEwXViV63RI7QCMBfQGPfbu3YuHHnoIDodnA50b0tVlsVmQezkXxWXF1Z7XWNPfi2xFOHHxhFQWYwqsVitGjhyJ/Px89OzZE0uWLGmU+8jk98sZXURUHQYfCgh1WcRw6d6liJgfgR2/74CjwoG05Wm47vXrAADx4fHQa/XKF2ipvdTl+vUhCIJyfuVuL8QBthE2QAts3LgRU6ZMgSiKtV7T07FHlQPhp798iuiF0UhYkoDYl2JxMPtglXM+P/E5DC8a8M7Bdzx7g9XY8tsWRC+KxuI9iwEAyRHJePTRR7Fv3z5ERUVhw4YNjb5BsLt6JiJyxuBDAaEuixhu+m0Tyhxl+CbjG2RfzsZPuT8BkMYKPdTlIQDAiE4jEKoNhQABraNao3+r/g0q34NdHkRqZCoGth6oPHdHuzukAbipAO4HIADLli3DnDlzarxWmaNMmQnmaYvPxZKLsNqt2HJ6Cxyi1KpktVvx7Zlvq5yz5fQWlFeUY/PpzZ6/QTe2ZWyDvcIOAIgJjUHWl1lYs2YNtFotPvroI7Rp06ZB13fngU4PIDEiEUM7DG30axNRYAiYLSuoeatLV5fziszyz60iW+HM1DPKMQ92eRAPdnmw0co3e8BszB7gOl372thrkfPXHLx54E08jsfR+U+dcXT1UbzwwgsIDQ3FjBkz3F5LXlBRH6RHbFhsjfeVu9lKykukWWpX6seoN8Jis7htIau8VUd9ydd5adBLSDGnYPQzowFI4e72229v0LWrM/L6kRh5/cgmuTYRBQa2+FBAqMtu585f7PXdeb0xyffW9tFi4cKFAIBnn30Wr7zyitvjnRcDFAShxmtXXsRQDjN9kvu4XMvl+pW26qgv+TrWDCvGjx8PAHjqqacwYcKEBl2XiKghGHwoIMjh4XzxedjstmqPc15Mz2wxe7wQYFNyDibTpk3D3LlzAUghYdmyZVWOr+vaQs6tYXKYqTH4XHkuy1K/VaVdrpMDLJq0CFarFcOGDcOiRYvqfT0iosbA4EMBITo0GqFaacfzmlp9nLtvnFtAfNricyXA5JXmoaS8BLNnz8YzzzwDQJruXTks1LWVSr7+iYsnkF+aD+DqIo2Vu7NsdhvOF58HADhEB3Iu59TnLaFCrMDZ384C7wJFhUXo06cP1q5di6Agrq1DRL7F4EMBwaVLp4YuGufXSu2lysBmX6774jzd/azlLARBwPz58zF9+nQAwDPPPIPp06crs73qGtaUqflnpan5hmADOrfsDADIvpytDECW7++svt1d+w7vg32VHSgBbuhxA77++ut6bz5KRNSYGHwoYHiyiGHlL/Z9Wfukc33Y4uM83V0unxx+5DE/CxcuxMSJE+FwODxevFAmX9v5vcYb4qHT6FAhViC7KFs5tkrwqccA51OnTmH40OFAEaBN0GLL5i2IjIys83WIiJoCgw8FDE9mdlX+Ii8pl1ZL9vVKv9WFtmnTpmH58uUQBAHLly/HvffeizO50uyzunZ1Ob9XjaBBkrHqNh+V686TweLO9u/fj759+yL7bDYQDXT9W1fExMTU6RpERE2JwYcChieLGFYXiny94F1NoW3ChAnYsGEDQkJC8MUXX+DY/GPAxbq3+FT+3V19Va67unR1ff311xg4cCAuXLiA5I7JwP8A16Rc4/H5RETewOBDAcOTRQzl1yL1V7tegoOCERce17SFq0Vtoe2BBx7Azp07kZScBMd5B7ACOL7nuGfXjqwm+Lipr8r142nwefvtt5X9xgYPHoz7FtwHRPg+UBIRVcbgQwGjLl1d8g7sgDSdXN7V21c8CW09e/bEhv9sAFIA2IBR943C1KlTUVpaWuO1jXojIoIjqtzLbYuPxbV+ahvjY7Va8dhjj2HChAlwOBx4+OGH8fnnnyPXnutyLyIitWDwoYBR2yKGzjuwy9O5Ad+u4SPzdOVpa6gVGAdE9Y8CACxduhQ33HADvv/++5qv7xRA5PfrbhacHHSU6e41lOfw4cPo1asXVqxYAUEQ8MILL2D16tUIDg5WxTIBRETuMPhQwJC/ZPNL85WBvM4KrAXK8/ICfs7n+ZLzIoY1MReaAS3Q87Ge+Oqrr2AymXDixAn07dsX06ZNg8VicXtelc1R4T5sVQ6G2UXZKHeUu1zLarXiueeew4033ogjR44gLi4OmzZtwsyZM5WVpJ1XlyYiUhMGHwoYRr0RhmBprRi3e1BdeS42LBbtY9orz6sh+MgtMoW2QhTZiqo9znnxwiFDhuDo0aN48MEH4XA48NJLL6FDhw5YtmwZbDbX1atdgk9kpTE+V+qlpLxEWeAwzZQGnUYHESLOFZ0DILWYffTRR+jSpQvmzp2LsrIy3H333Th69CgGDx6sXN9eYVfOYVcXEakNgw8FDOf1cNx10chdYCnGFCRFJEGA1Dqhhi9no94Io94IoPquuoLSAvya9yuAq0EmOjoaa9aswZdffon27dsjNzcXkyZNQvv27bF48WIUFBRIx195j1EhUUo4lK+RW5yLM5fO4GD2QQDSAodRIVFKa01GfgbWrVuHnj17YsSIETh16hRMJhPWr1+PjRs3IjLadY2e7KJsVIgV0Gq00u7zREQqwuBDAaWmRQydF/7TBemQYEiQfldBiw9Q8zifNYfXIGZRDN47/J50bKWwduedd+Lo0aN47bXXYDKZYDab8be//Q2JiYkYPXo0zu8/D1hd32tsWCxCtCEAgNZLW6P/O/2VclRUVCDyQiSwGbiv930YM2YMfvzxRxgMBsyZMwfHjx/HyJEjsWDXAhgXGLHbvFu5rhzckiKSEKThFhVEpC5aXxeAqDHVFB7kMJQcIbVkPNz1YWw8sRH9WvXzXgFrkBKZgmMXjrkNbVtOb4EIEQIEJEYk4g9t/1DlmODgYEyaNAmPPPII1q5di6VLl+LIkSNYv349sB6ABijoUICJP01E+/btkZycjIFlA7E5YzNQDoiXRQiFAuw2O+JmxSmtRZdwCXFxcUhPT8fjjz+OuLirU/83n96MMkcZdvy+o8qAaDW0pBERVcbgQwGlpvVwKn8hLxy0EAsHLfRe4WpRY2i78ty7972LsV3H1nid0NBQ/O///i8eeeQR/Pjjj1i7di2++OIL/Prrrzh7/CzeOv5WteeKEHESJwEA+nA9bK1tuOv+u/DJzE8QHBxctVxX6tndIohqaUkjInLG4EMBpab1cOq6q7m31Rja6hEmBEFAWloa0tLSsGTJEpw5cwb79u3DwYMH8fvvvyMrKwvFxcVwOBwIDQ1FbGwsUlNTcf311yMtLQ37HPswZfMU6K7VuQ09oigq3VruZoaptZ6JqHlj8KGAUnmzT2dKeFBpF0x1oc15/aGGlD01NRWpqakYOXKkR8fnnMiRylPNFPsLJRdgc0izx9wGH5XWMxE1bxzcTAGlpvDgPKtLjarr6sorzYPVbgUgDRj2dXlk1e3xxa4uIlIzBh8KKPIUbIvNAovt6mJ+F0suwuawQYCg7EquNs6LGIqiqDwvB4mW4S2h1+q9Vh45RJ4vPg+b3VbldedAVGAtQHFZscvzXLyQiNSIwYcCirwGDeB+D6p4QzyCg6qOV1EDOWgUlxej0FaoPO+rMTMxoTHKdPeaug6V3y1mlDnKkHuZ+3QRkXox+FDAcbsVgx90v4TpwhAdGg3ANVQoXXReDhLOC0K6DT6VusDMhWacKzoHESL0QXrEhfl2x3siIncYfCjguFvE0F+6X9QW2jyZJSc7azl7da0kY7KybxcRkZow+FDAUVt4qIuaQptPgo8HU+yVrkWLmTO6iEj1GHwo4NS067jav5DVVnZP9j7rndxbOqbQ7DcBk4iaLwYfCjhqazWpi5paq3zRTVddV5ejwoGsoiwAQJ/kPsox/lLPRNR8cQFDCjjuBuSqffFCWeXQViFW+HT9oeq6unKLc2GvsEMjaNArqZd0jMWsTLdXez0TUfPF4EMBx7mVQhRFiBCV1gm1t0RUDm3ni8+jvKJc2ZzU25S1hdzM4AKAxIhEtI5qrTynD9K7nEdEpDbs6qKAI69uXFJeggJrAXIvX22dMEWYfFy6mjkHDefVpk0RJuiCdF4vjxwi80vzcSr/FBwVDqV8gBTU5DIXlRXhl4u/KM8TEakRgw8FnFBdKGLDYgFcGXBrudo6odWou5FTDhFWuxV5pXk+HywcqY+EIdgAAGj/anv0Xtlb2jvMqevQedFIeWsNdnURkVox+FBAch4k7MvBwXWl1+rRMrwlANfQ5qsgIQgC/qf7/yhdWAfOHcAl66Uqg5jlY4KDgnFPx3vQIqSFT8pLRFQbBh8KSM6DhP1tppG70ObLsv9ryL9gnWlFTGjM1XJVqtOX73gZ1plW2GbasHH0Ri5eSESqxeBDAUlt4aEu3IU2NbRWuZTLT2bJERFVxuBDAckl+PjJ4oUyt2VXQWhznnGmpnIREdWFukd6EtWTHHLOWs7CZrdJz/nJl7RzwPDVBqXuyOXKuJSB7KJs6TkVlIuIqC4YfCggOS+8Z3NcCT5+8iUtl/NM4RlkWdSz/pBcru+zvocIETqNThmITUTkLxh8KCA5L2Jor7BLz6kgPHhCLueP2T/CITqg1WiRYEjwcamulmtf1j4AQJIxCRqBveVE5F8YfCggJUYkQoCAMkcZAECr0SLeEO/jUnlGHshcUl4CQHovQZogXxYJwNUwKZfLX4IkEZEz/nONAlJwULBL0EmK8J/WCTm0ydQSMCrPLPOXrkMiImf+8U1AVA/OgcGfvqR1QTqXrTXUMJUduLoViEwtgYyIqC4YfChgOYcdf/uSdgltKim7XqtHfPjVVjS1lIuIqC4YfChgqTE8eMoltKmotUqt5SIi8hSDDwUsf+3qAtQb2tRaLiIiTzH4UMAKmK4uFYU2tZaLiMhTDD4UsPz5S1qtoU0uV4g2RNm0lIjInzD4UMByng2lpvDgCbnswUHBiAuP83FprpLrMdmYzB3YicgvcQFDClhJxiT8sd0fERwUjNiwWF8Xp066J3THjYk3ooeph6rWH7q1za3oGNMRY7uO9XVRiIjqRRBFUfR1IdTEYrEgMjIShYWFMBqNvi4OERERecDT72/1/FOSiIiIqIkx+BAREVGzweBDREREzQaDDxERETUbDD5ERETUbDD4EBERUbPB4ENERETNBoMPERERNRsMPkRERNRsMPgQERFRs+E3wWfevHno27cvwsLCEBUV5faYzMxMDBs2DOHh4YiNjcWUKVNQVlbm3YISERGRavnNJqVlZWUYMWIE+vTpg5UrV1Z53eFw4K677kJcXBx27dqFvLw8jBs3DqIo4tVXX/VBiYmIiEht/Cb4PPfccwCAVatWuX198+bN+Pnnn2E2m5GYmAgAWLJkCcaPH4958+Zxw1EiIiLyn66u2uzZswedO3dWQg8A3HHHHbDZbPjhhx+qPc9ms8Fisbg8iIiIKDD5TYtPbXJychAfH+/yXIsWLRAcHIycnJxqz5s/f77SmuSMAYiIiMh/yN/boijWeJxPg8/cuXPdhg5n+/fvR8+ePT26niAIVZ4TRdHt87IZM2bgqaeeUn7PyspCp06dkJKS4tE9iYiISD2KiooQGRlZ7es+DT7p6ekYPXp0jce0bt3ao2slJCRg3759Ls8VFBSgvLy8SkuQM71eD71er/xuMBhgNpsRERFRY2CqK4vFgpSUFJjNZo43akKsZ+9hXXsH69k7WM/e0ZT1LIoiioqKXIa8uOPT4BMbG4vY2NhGuVafPn0wb948ZGdnw2QyAZAGPOv1eqSlpXl8HY1Gg+Tk5EYpkztGo5H/UXkB69l7WNfewXr2DtazdzRVPdfU0iPzmzE+mZmZyM/PR2ZmJhwOBw4dOgQAaNeuHQwGAwYPHoxOnTrh4YcfxksvvYT8/Hz89a9/xYQJE/ghJiIiIgB+FHxmz56N1atXK7/fcMMNAIDt27dj4MCBCAoKwpdffoknnngC/fr1Q2hoKB588EEsXrzYV0UmIiIilfGb4LNq1apq1/CRtWrVCl988YV3ClRHer0ec+bMcRlPRI2P9ew9rGvvYD17B+vZO9RQz4JY27wvIiIiogARMAsYEhEREdWGwYeIiIiaDQYfIiIiajYYfIiIiKjZYPDxkmXLlqFNmzYICQlBWloadu7c6esi+bW5c+dCEASXR0JCgvK6KIqYO3cuEhMTERoaioEDB+LYsWM+LLF/+O677zBs2DAkJiZCEARs3LjR5XVP6tVms2Hy5MmIjY1FeHg47r77bpw9e9aL70L9aqvn8ePHV/l89+7d2+UY1nPt5s+fjxtvvBERERFo2bIl7r33Xpw4ccLlGH6mG86TelbTZ5rBxwvWr1+PqVOn4u9//zsOHjyIm2++GUOGDEFmZqavi+bXrr/+emRnZyuPI0eOKK8tWrQIL7/8Ml577TXs378fCQkJGDRoEIqKinxYYvUrLi5Gt27d8Nprr7l93ZN6nTp1Kj799FOsW7cOu3btwuXLlzF06FA4HA5vvQ3Vq62eAeCPf/yjy+f7q6++cnmd9Vy7b7/9FpMmTcLevXuxZcsW2O12DB48GMXFxcox/Ew3nCf1DKjoMy1Sk+vVq5c4ceJEl+euvfZacfr06T4qkf+bM2eO2K1bN7evVVRUiAkJCeKCBQuU56xWqxgZGSm++eabXiqh/wMgfvrpp8rvntTrpUuXRJ1OJ65bt045JisrS9RoNOKmTZu8VnZ/UrmeRVEUx40bJ95zzz3VnsN6rp/z58+LAMRvv/1WFEV+pptK5XoWRXV9ptni08TKysrwww8/YPDgwS7PDx48GLt37/ZRqQLDyZMnkZiYiDZt2mD06NE4ffo0ACAjIwM5OTkuda7X6zFgwADWeQN4Uq8//PADysvLXY5JTExE586dWfd1tGPHDrRs2RIdOnTAhAkTcP78eeU11nP9FBYWAgCio6MB8DPdVCrXs0wtn2kGnyZ28eJFOByOKjvEx8fHIycnx0el8n833XQT3n33XfznP//BihUrkJOTg759+yIvL0+pV9Z54/KkXnNychAcHIwWLVpUewzVbsiQIVizZg2++eYbLFmyBPv378dtt90Gm80GgPVcH6Io4qmnnkL//v3RuXNnAPxMNwV39Qyo6zPtN1tW+DtBEFx+F0WxynPkuSFDhig/d+nSBX369ME111yD1atXKwPmWOdNoz71yrqvm1GjRik/d+7cGT179kRqaiq+/PJL3H///dWex3quXnp6Og4fPoxdu3ZVeY2f6cZTXT2r6TPNFp8mFhsbi6CgoCqJ9fz581X+lUH1Fx4eji5duuDkyZPK7C7WeePypF4TEhJQVlaGgoKCao+hujOZTEhNTcXJkycBsJ7ravLkyfjss8+wfft2JCcnK8/zM924qqtnd3z5mWbwaWLBwcFIS0vDli1bXJ7fsmUL+vbt66NSBR6bzYZffvkFJpMJbdq0QUJCgkudl5WV4dtvv2WdN4An9ZqWlgadTudyTHZ2No4ePcq6b4C8vDyYzWaYTCYArGdPiaKI9PR0fPLJJ/jmm2/Qpk0bl9f5mW4ctdWzOz79TDfqUGlya926daJOpxNXrlwp/vzzz+LUqVPF8PBw8ffff/d10fzW008/Le7YsUM8ffq0uHfvXnHo0KFiRESEUqcLFiwQIyMjxU8++UQ8cuSIOGbMGNFkMokWi8XHJVe3oqIi8eDBg+LBgwdFAOLLL78sHjx4UDxz5owoip7V68SJE8Xk5GRx69at4o8//ijedtttYrdu3US73e6rt6U6NdVzUVGR+PTTT4u7d+8WMzIyxO3bt4t9+vQRk5KSWM919Pjjj4uRkZHijh07xOzsbOVRUlKiHMPPdMPVVs9q+0wz+HjJ66+/LqamporBwcFijx49XKb5Ud2NGjVKNJlMok6nExMTE8X7779fPHbsmPJ6RUWFOGfOHDEhIUHU6/XiLbfcIh45csSHJfYP27dvFwFUeYwbN04URc/qtbS0VExPTxejo6PF0NBQcejQoWJmZqYP3o161VTPJSUl4uDBg8W4uDhRp9OJrVq1EseNG1elDlnPtXNXxwDEd955RzmGn+mGq62e1faZFq4UmoiIiCjgcYwPERERNRsMPkRERNRsMPgQERFRs8HgQ0RERM0Ggw8RERE1Gww+RERE1Gww+BAREVGzweBDREREzQaDDxH5hfPnz+PPf/4zWrVqBb1ej4SEBNxxxx3Ys2cPAGmH7Y0bN/q2kESkelpfF4CIyBPDhw9HeXk5Vq9ejbZt2yI3Nxfbtm1Dfn6+r4tGRH6ELT5EpHqXLl3Crl27sHDhQtx6661ITU1Fr169MGPGDNx1111o3bo1AOC+++6DIAjK7wDw+eefIy0tDSEhIWjbti2ee+452O125XVBEPDGG29gyJAhCA0NRZs2bfDhhx8qr5eVlSE9PR0mkwkhISFo3bo15s+f7623TkSNjMGHiFTPYDDAYDBg48aNsNlsVV7fv38/AOCdd95Bdna28vt//vMfjB07FlOmTMHPP/+Mt956C6tWrcK8efNczp81axaGDx+On376CWPHjsWYMWPwyy+/AAD+9a9/4bPPPsOGDRtw4sQJvP/++y7Bioj8CzcpJSK/8PHHH2PChAkoLS1Fjx49MGDAAIwePRpdu3YFILXcfPrpp7j33nuVc2655RYMGTIEM2bMUJ57//33MW3aNJw7d045b+LEiXjjjTeUY3r37o0ePXpg2bJlmDJlCo4dO4atW7dCEATvvFkiajJs8SEivzB8+HCcO3cOn332Ge644w7s2LEDPXr0wKpVq6o954cffsDzzz+vtBgZDAZMmDAB2dnZKCkpUY7r06ePy3l9+vRRWnzGjx+PQ4cOoWPHjpgyZQo2b97cJO+PiLyDwYeI/EZISAgGDRqE2bNnY/fu3Rg/fjzmzJlT7fEVFRV47rnncOjQIeVx5MgRnDx5EiEhITXeS27d6dGjBzIyMvDCCy+gtLQUI0eOxAMPPNCo74uIvIfBh4j8VqdOnVBcXAwA0Ol0cDgcLq/36NEDJ06cQLt27ao8NJqr//vbu3evy3l79+7Ftddeq/xuNBoxatQorFixAuvXr8fHH3/M2WREforT2YlI9fLy8jBixAg88sgj6Nq1KyIiInDgwAEsWrQI99xzDwCgdevW2LZtG/r16we9Xo8WLVpg9uzZGDp0KFJSUjBixAhoNBocPnwYR44cwT/+8Q/l+h9++CF69uyJ/v37Y82aNfj++++xcuVKAMArr7wCk8mE7t27Q6PR4MMPP0RCQgKioqJ8URVE1FAiEZHKWa1Wcfr06WKPHj3EyMhIMSwsTOzYsaM4c+ZMsaSkRBRFUfzss8/Edu3aiVqtVkxNTVXO3bRpk9i3b18xNDRUNBqNYq9evcTly5crrwMQX3/9dXHQoEGiXq8XU1NTxQ8++EB5ffny5WL37t3F8PBw0Wg0irfffrv4448/eu29E1Hj4qwuImrW3M0GI6LAxTE+RERE1Gww+BAREVGzwcHNRNSssbefqHlhiw8RERE1Gww+RERE1Gww+BAREVGzweBDREREzQaDDxERETUbDD5ERETUbDD4EBERUbPB4ENERETNBoMPERERNRv/D6efUhI1G+rtAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {
"filenames": {
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter6_1_1.png"
}
},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkMAAAHFCAYAAADxOP3DAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAACgq0lEQVR4nOzdd3wU1drA8d9sekgIm4Q0akITAggJKkUFRATsolhQEfWq2EERxWvDAldEX9QrKoIUUUFUsCAIKKByqQk19BD6hkBY0kjfef8Imcwmu6mbZDd5vnz2w87MmTNnNruzz55z5hxFVVUVIYQQQohGylDfBRBCCCGEqE8SDAkhhBCiUZNgSAghhBCNmgRDQgghhGjUJBgSQgghRKMmwZAQQgghGjUJhoQQQgjRqEkwJIQQQohGTYIhIYQQQjRqEgwJUQfmzp2Loijaw9vbm7CwMAYOHMiUKVNISUmp1eMfOXIERVGYO3dulfYbPXo0bdu2rZUylXdM/Wtl7zF69Og6LVdppcvTtGlT+vbty7fffluv5apL1X1fCeFsFJmOQ4jaN3fuXB588EHmzJnDJZdcQn5+PikpKfzzzz/MmTMHNzc3Fi1axLXXXlsrx8/NzWXbtm20a9eO5s2bV3q/xMRE0tPT6dmzZ62Uy94xz5w5oy3Hx8fz5JNPMnnyZAYOHKitb968Oe3atauzcpWmKAp33HEHzz//PKqqkpSUxOTJk0lISODrr79m5MiR9Va2ulLd95UQzkaCISHqQHEwtGXLFnr16mW17dixY1x55ZWcP3+egwcPEhoaWk+ldE5r165l4MCBLF68mDvuuMNuuuzsbLy9vVEUpU7KpSgKTz75JP/973+1dUePHqVt27ZcffXVrFu3rk7KUezChQv4+vrW6TGFaCikmUyIeta6dWvef/99MjIy+Pzzz622bd26lZtvvpnAwEC8vb3p2bMn3333XZk8Tp48yaOPPkqrVq3w9PQkIiKCO+64g9OnTwO2mzPOnDmj7ePl5UXz5s3p168fq1ev1tLYaibLyclh4sSJREZG4unpSYsWLXjyySc5f/68Vbq2bdty4403smLFCmJiYvDx8eGSSy7hyy+/rNkLRkmz48qVK3nooYdo3rw5vr6+5ObmArBo0SL69OlDkyZN8PPzY8iQIWzbtq1MPpV9fSurTZs2NG/eXHvdi6WnpzN+/Hir12zs2LFkZWVZpTt//jwPP/wwgYGB+Pn5ccMNN3D48GEUReGNN97Q0r3xxhsoikJ8fDx33HEHRqNRqyVTVZUZM2bQo0cPfHx8MBqN3HHHHRw+fNjqWNu2bePGG28kJCQELy8vIiIiuOGGGzhx4oSWZvHixVxxxRUEBATg6+tLVFQUDz30kLbdXjPZP//8w6BBg/D398fX15e+ffuybNkyqzTFf8M1a9bw+OOPExwcTFBQEMOHD+fUqVNVfu2FqAkJhoRwAtdffz1ubm789ddf2ro1a9bQr18/zp8/z2effcZPP/1Ejx49uOuuu6y+fE6ePMlll13GkiVLeO6551i+fDnTp08nICAAs9ls95j3338/S5cu5bXXXmPlypXMmjWLa6+9ltTUVLv7qKrKrbfeyrRp07j//vtZtmwZzz33HPPmzeOaa67RgpFiO3bs4Pnnn2fcuHH89NNPdO/enYcfftjqPGvioYcewsPDg6+++orvv/8eDw8PJk+ezD333EOXLl347rvv+Oqrr8jIyOCqq65iz5492r6VfX2rIi0tjXPnztGxY0dt3YULF+jfvz/z5s3jmWeeYfny5bz44ovMnTuXm2++meLKeYvFwk033cQ333zDiy++yJIlS7jiiisYOnSo3eMNHz6c9u3bs3jxYj777DMAHnvsMcaOHcu1117L0qVLmTFjBgkJCfTt21cL0rKyshg8eDCnT5/mk08+YdWqVUyfPp3WrVuTkZEBwIYNG7jrrruIiopi4cKFLFu2jNdee42CgoJyX4N169ZxzTXXkJaWxuzZs/n222/x9/fnpptuYtGiRWXS/+tf/8LDw4NvvvmGqVOnsnbtWu67776qvfBC1JQqhKh1c+bMUQF1y5YtdtOEhoaqnTt31pYvueQStWfPnmp+fr5VuhtvvFENDw9XCwsLVVVV1Yceekj18PBQ9+zZYzfvpKQkFVDnzJmjrfPz81PHjh1bbrkfeOABtU2bNtryihUrVECdOnWqVbpFixapgDpz5kxtXZs2bVRvb2/16NGj2rrs7Gw1MDBQfeyxx8o9rt6aNWtUQF28eLG2rvj1HDVqlFXaY8eOqe7u7urTTz9ttT4jI0MNCwtT77zzTm1dZV9fewD1iSeeUPPz89W8vDz1wIED6s0336z6+/urW7du1dJNmTJFNRgMZf7233//vQqov/32m6qqqrps2TIVUD/99FOrdFOmTFEB9fXXX9fWvf766yqgvvbaa1ZpN2zYoALq+++/b7X++PHjqo+PjzphwgRVVVV169atKqAuXbrU7vlNmzZNBdTz58/bTWPrfdW7d281JCREzcjI0NYVFBSoXbt2VVu2bKlaLBZVVUv+hk888YRVnlOnTlUB1WQy2T2uEI4mNUNCOAlV133v0KFD7Nu3j3vvvReAgoIC7XH99ddjMpnYv38/AMuXL2fgwIF07ty5Sse7/PLLmTt3Lm+//TYbN24kPz+/wn3+/PNPgDJ3co0YMYImTZrwxx9/WK3v0aMHrVu31pa9vb3p2LEjR48erVJZ7bn99tutln///XcKCgoYNWqU1Wvm7e1N//79Wbt2LVC117c8M2bMwMPDA09PTzp27Mjy5cv59ttviY2N1dL8+uuvdO3alR49elgdZ8iQISiKopWpuI/RnXfeaXWMe+65p9Ln/+uvv6IoCvfdd5/VscLCwrj00ku1Y7Vv3x6j0ciLL77IZ599ZlVjVuyyyy7TyvPdd99x8uTJCl+PrKwsNm3axB133IGfn5+23s3Njfvvv58TJ06UeV1vvvlmq+Xu3bsDOOw9IkRlSDAkhBPIysoiNTWViIgIAK05Y/z48Xh4eFg9nnjiCQDOnj0LFPX9admyZZWPuWjRIh544AFmzZpFnz59CAwMZNSoUSQnJ9vdJzU1FXd39zJ3DimKQlhYWJkmtqCgoDJ5eHl5kZ2dXeXy2hIeHm61XPy6XXbZZWVet0WLFmmvWVVe3/LceeedbNmyhf/97398/vnn+Pv7c/fdd3Pw4EGrMu3cubPMcfz9/VFVVTtO8WsbGBhodYzyOtTbOn9VVQkNDS1zvI0bN2rHCggIYN26dfTo0YOXX36Z6OhoIiIieP3117Wg+Oqrr2bp0qVacNmyZUu6du1a7tABZrMZVVXLlAvQ3tsVvUe8vLwAHPYeEaIy3Ou7AEIIWLZsGYWFhQwYMACA4OBgACZOnMjw4cNt7tOpUyeg6BZzfafXygoODmb69OlMnz6dY8eO8fPPP/PSSy+RkpLCihUrbO4TFBREQUEBZ86csQqIVFUlOTlZq02oK6XvHCt+3b7//nvatGljd7+qvL7lad68uXZ3YJ8+fejcuTP9+/dn3Lhx/Prrr9qxfHx87HYcLy5L8Wt77tw5q4CovODU1vkrisLff/+tBRV6+nXdunVj4cKFqKrKzp07mTt3Lm+++SY+Pj689NJLANxyyy3ccsst5ObmsnHjRqZMmcLIkSNp27Ytffr0KZO/0WjEYDBgMpnKbCvuFF18vkI4EwmGhKhnx44dY/z48QQEBPDYY48BRV/EHTp0YMeOHUyePLnc/YcNG8ZXX33F/v37K/UFbkvr1q156qmn+OOPP1i/fr3ddIMGDWLq1KksWLCAcePGaet/+OEHsrKyGDRoULWO7yhDhgzB3d2dxMTEMk1IelV5faviqquuYtSoUcybN48NGzbQp08fbrzxRiZPnkxQUBCRkZF29+3fvz9Tp05l0aJFPP7449r6hQsXVvr4N954I//5z384efJkmeY2exRF4dJLL+X//u//mDt3LvHx8WXSeHl50b9/f5o1a8bvv//Otm3bbAZDTZo04YorruDHH39k2rRp+Pj4AEWdwxcsWEDLli2tOpcL4SwkGBKiDu3evVvrx5GSksLff/+tDbq4ZMkSq9qWzz//nGHDhjFkyBBGjx5NixYtOHfuHHv37iU+Pp7FixcD8Oabb7J8+XKuvvpqXn75Zbp168b58+dZsWIFzz33HJdcckmZcqSlpTFw4EBGjhzJJZdcgr+/P1u2bGHFihV2a0oABg8ezJAhQ3jxxRdJT0+nX79+7Ny5k9dff52ePXty//33O/5Fq4K2bdvy5ptv8u9//5vDhw8zdOhQjEYjp0+fZvPmzTRp0oRJkyYBlX99q+qtt95i0aJFvPrqq6xevZqxY8fyww8/cPXVVzNu3Di6d++OxWLh2LFjrFy5kueff167a6xfv348//zzpKenExsby4YNG5g/fz4ABkPFvRr69evHo48+yoMPPsjWrVu5+uqradKkCSaTiX/++Ydu3brx+OOP8+uvvzJjxgxuvfVWoqKiUFWVH3/8kfPnzzN48GAAXnvtNU6cOMGgQYNo2bIl58+f58MPP8TDw4P+/fvbLcOUKVMYPHgwAwcOZPz48Xh6ejJjxgx2797Nt99+W2fjQAlRJfXYeVuIRqP4zpnih6enpxoSEqL2799fnTx5spqSkmJzvx07dqh33nmnGhISonp4eKhhYWHqNddco3722WdW6Y4fP64+9NBDalhYmOrh4aFGRESod955p3r69GlVVcve9ZOTk6OOGTNG7d69u9q0aVPVx8dH7dSpk/r666+rWVlZWr6l7yZT1aI7wl588UW1TZs2qoeHhxoeHq4+/vjjqtlstkrXpk0b9YYbbihzTv3791f79+9f6deuvLvJ7N2dt3TpUnXgwIFq06ZNVS8vL7VNmzbqHXfcoa5evdoqXWVfX1sA9cknn7S57YUXXlABdd26daqqqmpmZqb6yiuvqJ06dVI9PT3VgIAAtVu3buq4cePU5ORkbb9z586pDz74oNqsWTPV19dXHTx4sLpx40YVUD/88EMtXfHdZGfOnLF5/C+//FK94oor1CZNmqg+Pj5qu3bt1FGjRml3ue3bt0+955571Hbt2qk+Pj5qQECAevnll6tz587V8vj111/VYcOGqS1atNDer9dff736999/a2ls3U2mqqr6999/q9dcc412/N69e6u//PKLVRp7f8Piv/eaNWvsvPJCOJ6MQC2EEE7sm2++4d5772X9+vX07du3vosjRIMkwZAQQjiJb7/9lpMnT9KtWzcMBgMbN27kvffeo2fPnnU+vYcQjYn0GRJCCCfh7+/PwoULefvtt8nKyiI8PJzRo0fz9ttv13fRhGjQpGZICCGEEI2aDLoohBBCiEZNgiEhhBBCNGoSDAkhhBCiUZMO1BWwWCycOnUKf39/GSxMCCGEcBGqqpKRkUFERESFg5ZKMFSBU6dO0apVq/ouhhBCCCGq4fjx4xVOZi3BUAX8/f2BohezadOm9VwaIYQQQlRGeno6rVq10r7HyyPBUAWKm8aaNm0qwZAQQgjhYirTxUU6UAshhBCiUZNgSAghhBCNmgRDQgghhGjUpM+QgxQWFpKfn1/fxRAuzNPTs8LbP4UQQjieBEM1pKoqycnJnD9/vr6LIlycwWAgMjIST0/P+i6KEEI0KhIM1VBxIBQSEoKvr68MzCiqpXhwT5PJROvWreV9JIQQdUiCoRooLCzUAqGgoKD6Lo5wcc2bN+fUqVMUFBTg4eFR38URQohGQzoo1EBxHyFfX996LoloCIqbxwoLC+u5JEII0bhIMOQA0qQhHEHeR0IIUT8kGBJCCCFEo+Y0wdBff/3FTTfdREREBIqisHTpUqvtqqryxhtvEBERgY+PDwMGDCAhIaHCfH/44Qe6dOmCl5cXXbp0YcmSJbV0Bq5vwIABjB07tr6LIYQQQtQppwmGsrKyuPTSS/nvf/9rc/vUqVP54IMP+O9//8uWLVsICwtj8ODBZGRk2M1zw4YN3HXXXdx///3s2LGD+++/nzvvvJNNmzbV1mk0GmvXrkVRFBlSQAghhMtzmrvJhg0bxrBhw2xuU1WV6dOn8+9//5vhw4cDMG/ePEJDQ/nmm2947LHHbO43ffp0Bg8ezMSJEwGYOHEi69atY/r06Xz77be1cyJCCCFEI5T2vzSSVyZzwnSCLg92Ibx3eH0XqdKcpmaoPElJSSQnJ3Pddddp67y8vOjfvz//+9//7O63YcMGq30AhgwZUu4+ubm5pKenWz0aoqysLEaNGoWfnx/h4eG8//77VtsXLFhAr1698Pf3JywsjJEjR5KSkgLAkSNHGDhwIABGoxFFURg9ejQAK1as4Morr6RZs2YEBQVx4403kpiYWKfnJoQQom5dOHSBbf22YZpkwm2mG/F940k9mVrfxao0lwiGkpOTAQgNDbVaHxoaqm2zt19V95kyZQoBAQHao1WrVjUoufN64YUXWLNmDUuWLGHlypWsXbuWuLg4bXteXh5vvfUWO3bsYOnSpSQlJWkBT6tWrfjhhx8A2L9/PyaTiQ8//BAoCrKee+45tmzZwh9//IHBYOC2227DYrHU+TkKIYSoG1m7sqyWm6hN2L5qe/0UphqcppmsMkrfeqyqaoW3I1d1n4kTJ/Lcc89py+np6XUSEJnNZuLi4oiNjcVoNNbqsTIzM5k9ezbz589n8ODBQFGzY8uWLbU0Dz30kPY8KiqKjz76iMsvv5zMzEz8/PwIDAwEICQkhGbNmmlpb7/9dqtjzZ49m5CQEPbs2UPXrl1r8ayEEELUG7Xsqi6du9R9OarJJWqGwsLCAMrU6KSkpJSp+Sm9X1X38fLyomnTplaP2mY2m4mOjmbw4MFER0djNptr9XiJiYnk5eXRp08fbV1gYCCdOnXSlrdt28Ytt9xCmzZt8Pf3Z8CAAQAcO3aswrxHjhxJVFQUTZs2JTIyslL7CSGEcF2qpWw01NS/9r8/HcUlgqHIyEjCwsJYtWqVti4vL49169bRt29fu/v16dPHah+AlStXlrtPfYiLi8NkMgFgMpmIj4+v1eOpqo0QXicrK4vrrrsOPz8/FixYwJYtW7QhCfLy8srd96abbiI1NZUvvviCTZs2aXfuVbSfEEIIF2ajJ4StAMlZOU0zWWZmJocOHdKWk5KS2L59O4GBgbRu3ZqxY8cyefJkOnToQIcOHZg8eTK+vr6MHDlS22fUqFG0aNGCKVOmAPDss89y9dVX8+6773LLLbfw008/sXr1av755586P7/yxMbGEh4ejslkIiIigpiYmFo9Xvv27fHw8GDjxo20bt0aKKqdOnDgAP3792ffvn2cPXuW//znP1oT4datW63ysDV1RGpqKnv37uXzzz/nqquuAnC611oIIYTj2Qx8XKirqNMEQ1u3btXuUAK0fjsPPPAAc+fOZcKECWRnZ/PEE09gNpu54oorWLlyJf7+/to+x44dw2Aoqezq27cvCxcu5JVXXuHVV1+lXbt2LFq0iCuuuKLuTqwSjEYjCQkJxMfHExMTU+t9hvz8/Hj44Yd54YUXCAoKIjQ0lH//+9/aa9e6dWs8PT35+OOPGTNmDLt37+att96yyqNNmzYoisKvv/7K9ddfj4+PD0ajkaCgIGbOnEl4eDjHjh3jpZdeqtVzEUII4QRcvGYIVZQrLS1NBdS0tLQy27Kzs9U9e/ao2dnZ9VCymsnIyFDvu+8+1dfXVw0NDVWnTp2q9u/fX3322WdVVVXVb775Rm3btq3q5eWl9unTR/35559VQN22bZuWx5tvvqmGhYWpiqKoDzzwgKqqqrpq1Sq1c+fOqpeXl9q9e3d17dq1KqAuWbKkzs/R1bjy+0kI0biZvjKpa1hj9UiPS6/XMpX3/V2aoqoVdCBp5NLT0wkICCAtLa1MZ+qcnBySkpKIjIzE29u7nkooGgp5PwkhXFXy/GT2PbDPal3Mlhia9qq/TtTlfX+X5hIdqIUQQgjhxGxVq7hQVYsEQ0IIIYSoEVfvQC3BkBBCCCFqxsU7UEswJIQQQogakZohIYQQQjRuUjMkhBBCiMbM1WuGnGbQRSGEEEI4v98P/c7on0ZzOvO0tu7mzTczlrFW6QbOGciOtTvK7H9FyytYed9K/L38y2yrL1IzJIQQQohKm7F1BsmZyai6f4qqlEmnqIpVmuJ/G09sZPmh5fVQcvukZkgIIYQQldYkqQlvf/s2xkwjPh4+YIGAzIAy6V5Y/gLZ3tkY3AyoFpVCCskrzONY8DF8tvqw2bSZ9PR0AII6B9Hzp551fSoaCYaE05o7dy5jx47l/PnztX6s0aNHc/78eZYuXVrrxxJCCFfW56c+dNvfrcJ04WfCba7vcrIL7IALXMD9Yhiy7/A+2prb1vrcnPZIM5loVI4cOYKiKGzfvr3Wj/Pwww8TGRmJj48P7dq14/XXXycvL69WjyuEELXN0+xpd1sqqeQac6ucZ0FhAfHx8TUpVo1IzZAQtWDfvn1YLBY+//xz2rdvz+7du3nkkUfIyspi2rRp9V08IYSoNne3ktDhevfryS7IxmAwYLFYiIiI4J9//qFPnz6cPl3Uwbp4280tbmbcyXFWeU1gAlvYQlhYGHti9tTpeehJzVAjNWDAAJ5++mnGjh2L0WgkNDSUmTNnkpWVxYMPPoi/vz/t2rVj+fKiTm6FhYVWNR2dOnXiww8/1PLLyckhOjqaRx99VFuXlJREQEAAX3zxRaXKNHfuXFq3bo2vry+33XYbqampZdL88ssvxMbG4u3tTVRUFJMmTaKgoEDbrigKn376KcOGDcPHx4fIyEgWL16sbY+MjASgZ8+eKIrCgAEDrPKfNm0a4eHhBAUF8eSTT5Kfn1+pspc2dOhQ5syZw3XXXUdUVBQ333wz48eP58cff6xWfkII4Sz0naXj4uNYvXo1hw4dYvXq1ezevZvIyEj27t3LkiVLWLJkibZtxJ0jyuT12uuvsWTJEvbs2VNvTWQAVDivfSOXlpamAmpaWlqZbdnZ2eqePXvU7OzseihZzfTv31/19/dX33rrLfXAgQPqW2+9pRoMBnXYsGHqzJkz1QMHDqiPP/64GhQUpGZlZal5eXnqa6+9pm7evFk9fPiwumDBAtXX11ddtGiRlue2bdtUT09PdcmSJWpBQYHar18/9ZZbbqlUeTZu3KgqiqJOmTJF3b9/v/rhhx+qzZo1UwMCArQ0K1asUJs2barOnTtXTUxMVFeuXKm2bdtWfeONN7Q0gBoUFKR+8cUX6v79+9VXXnlFdXNzU/fs2aOqqqpu3rxZBdTVq1erJpNJTU1NVVVVVR944AG1adOm6pgxY9S9e/eqv/zyi+rr66vOnDlTy/uxxx5TmzRpUu7j6NGjds/x3//+txobG2t3uyu/n4QQjceXnb5U17BGXcMaNSczp9L7/TLpF22/4se51edqrZzlfX+Xpqiq6jpDRNaD9PR0AgICSEtLo2nTplbbcnJySEpKIjIyEm9v75INvXpBcnLdFjQsDLZurXTyAQMGUFhYyN9//w0U1fwEBAQwfPhw5s+fD0BycjLh4eFs2LCB3r17l8njySef5PTp03z//ffauvfee4+pU6dyzz33sHjxYnbt2kVwcHCF5Rk5ciRms1mriQK4++67WbFihdaB+uqrr2bYsGFMnDhRS7NgwQImTJjAqVOngKKaoTFjxvDpp59qaXr37k1MTAwzZszgyJEjREZGsm3bNnr06KGlGT16NGvXriUxMRE3NzcA7rzzTgwGAwsXLgQgJSVFu/PBnrZt2+LuXrb1OTExkZiYGN5//33+9a9/2dzX7vtJCCGcyJxOc4g8UFTL3i+7Hx7eHpXa77d3fsP3FV+rdZMfn8zeDnuJbBbJXw/+5dBylvf9XZr0GaoNyclw8mR9l6JC3bt31567ubkRFBREt24ldwiEhoYCRUEAwGeffcasWbM4evQo2dnZ5OXlWQUUAM8//zw//fQTH3/8McuXL69UIASwd+9ebrvtNqt1ffr0YcWKFdpyXFwcW7Zs4Z133tHWFRYWkpOTw4ULF/D19dX2K51PZTpMR0dHa4EQQHh4OLt27dKWQ0JCCAkJqdT56J06dYqhQ4cyYsQIu4GQEEK4Cn0zmcGt8r1tfL18y6xLyU7hRPoJfNx9HFK26pJgqDaEhbnEMT08rKN5RVGs1ilK0RveYrHw3XffMW7cON5//3369OmDv78/7733Hps2bbLKIyUlhf379+Pm5sbBgwcZOnRopcpSmQpKi8XCpEmTGD58eJltFdWkFJ9LeWy9HhZLyXjyY8aMYcGCBeXmsWfPHlq3bq0tnzp1ioEDB9KnTx9mzpxZYRmEEMLp6abZUAwVX1uLdQzuyAEOWK0LahJEC/8WhPqFOqp01SLBUG2oQnOVq/j777/p27cvTzzxhLYuMTGxTLqHHnqIrl278sgjj/Dwww8zaNAgunTpUmH+Xbp0YePGjVbrSi/HxMSwf/9+2rdvX25eGzduZNSoUVbLPXsWDebl6Vl0S2hhYWGFZSrtzTffZPz48eWmiYiI0J6fPHmSgQMHEhsby5w5czAY5H4FIYTr09cMVSUYslWL9MPdP9DsymaOKFaNSDAkKqV9+/bMnz+f33//ncjISL766iu2bNmi3Z0F8Mknn7BhwwZ27txJq1atWL58Offeey+bNm3SghB7nnnmGfr27cvUqVO59dZbWblypVUTGcBrr73GjTfeSKtWrRgxYgQGg4GdO3eya9cu3n77bS3d4sWL6dWrF1deeSVff/01mzdvZvbs2UBRU5ePjw8rVqygZcuWeHt7ExBQduRUW6rSTHbq1CkGDBhA69atmTZtGmfOnNG2hdVHzaEQQjiIYtEFQ5WoddfS2gicqhJM1Sb5qSoqZcyYMQwfPpy77rqLK664gtTUVKtaon379vHCCy8wY8YMWrVqBRQFR+fPn+fVV1+tMP/evXsza9YsPv74Y3r06MHKlSt55ZVXrNIMGTKEX3/9lVWrVnHZZZfRu3dvPvjgA9q0aWOVbtKkSSxcuJDu3bszb948vv76a612yt3dnY8++ojPP/+ciIgIbrnllpq+NDatXLmSQ4cO8eeff9KyZUvCw8O1hxBCuLLimqFCpYo17LYiDieJQuRusgpU624yUW8URWHJkiXceuut9V2UKpP3kxDCFXzV5itaHWtFgaGAawuvrfR+KYtS2HO39cCKMZtiaHp5+Xd6VVdV7iZzkphMCCGEEK6guGbIolgqSFmKE9cMOUkxREM3bNgw/Pz8bD4mT55c38UTQghRWRfbk1Slag1LztxnSDpQizoxa9YssrOzbW4LDAx02HGk1VcIIWpXcQfqqgZD2Ip7nCMWkmBI1I0WLVrUdxGEEEI4QHEzWZWDIRttUc5SMyTNZEIIIYSolOysbPzP+wOOaSZzlijESYohhBBCCGcW90ccq0JW4Z9dFAxZsGA2myufgY2IIyMjw0GlqxkJhoQQQghRoZ1zd9L0Qskt6md9zxIfH1/p/b1aelktF1DAHtMeO6nrlgRDQgghhKiQmlfSLJbsn8zM4JnExMRUen//Hv60mNqCzV6bWcc6PjV+Ssw1ld+/NkkwJIQQQogKqZaSYChjQgbLNi3DaDRWKY8OL3TgEdMjXLn6SmYlzqry/rVFgiHhtObOnUuzZs3q5FijR492yVGrhRCizuj6S1/S+ZJqBzJGo5FBgwY5TSAEEgyJRubIkSMoisL27dtr/Vht27ZFURSrx0svvVTrxxVCiFqhG3Da1gz0rsxlzsbWF4uiKDz55JM2069du9Zm+n379tVxyUVj9uabb2IymbRH6clnhRDCZUgwVP+2bNli9aWyatUqAEaMGFHufvv377far0OHDnVRXKc3YMAAnn76acaOHYvRaCQ0NJSZM2eSlZXFgw8+iL+/P+3atWP58uUAFBYW8vDDDxMZGYmPjw+dOnXiww8/1PLLyckhOjqaRx99VFuXlJREQEAAX3zxRaXKNHfuXFq3bo2vry+33XYbqampZdL88ssvxMbG4u3tTVRUFJMmTaKgoEDbrigKn376KcOGDcPHx4fIyEgWL16sbY+MjASgZ8+eKIrCgAEDrPKfNm0a4eHhBAUF8eSTT5Kfn1+pstvj7+9PWFiY9vDz86tRfkIIUV/0I/w7y2CJDqO6qGeffVZt166darFYbG5fs2aNCqhms7lGx0lLS1MBNS0trcy27Oxsdc+ePWp2dnaNjlEf+vfvr/r7+6tvvfWWeuDAAfWtt95SDQaDOmzYMHXmzJnqgQMH1Mcff1wNCgpSs7Ky1Ly8PPW1115TN2/erB4+fFhdsGCB6uvrqy5atEjLc9u2baqnp6e6ZMkStaCgQO3Xr596yy23VKo8GzduVBVFUadMmaLu379f/fDDD9VmzZqpAQEBWpoVK1aoTZs2VefOnasmJiaqK1euVNu2bau+8cYbWhpADQoKUr/44gt1//796iuvvKK6ubmpe/bsUVVVVTdv3qwC6urVq1WTyaSmpqaqqqqqDzzwgNq0aVN1zJgx6t69e9VffvlF9fX1VWfOnKnl/dhjj6lNmjQp93H06FEtfZs2bdSwsDA1MDBQvfTSS9W3335bzc3NtfsauPL7SQjR8H1x4xfqGtaoa1ijbvxtY30Xp0LlfX+Xpqiq603mlJeXR0REBM899xwvv/yyzTRr165l4MCBtG3blpycHLp06cIrr7zCwIEDy807NzeX3NxcbTk9PZ1WrVqRlpZG06ZNrdLm5OSQlJREZGQk3t7e2vpeM3uRnJlcgzOsujC/MLY+urXS6QcMGEBhYSF///03UFTzExAQwPDhw5k/fz4AycnJhIeHs2HDBnr37l0mjyeffJLTp0/z/fffa+vee+89pk6dyj333MPixYvZtWsXwcHBFZZn5MiRmM1mrSYK4O6772bFihWcP38egKuvvpphw4YxceJELc2CBQuYMGECp06dAopqhsaMGcOnn36qpenduzcxMTHMmDGDI0eOEBkZybZt2+jRo4eWZvTo0axdu5bExETc3NwAuPPOOzEYDCxcuBCAlJQU0tPTyz2Ptm3b4u5eNMvN//3f/xETE4PRaGTz5s1MnDiRW265hVmzZtnc1977SQghnMGsG2fRfll7AJqsaMJlQy6r5xKVLz09nYCAAJvf36W55NxkS5cu5fz584wePdpumvDwcGbOnElsbCy5ubl89dVXDBo0iLVr13L11Vfb3W/KlClMmjSpRuVLzkzmZMbJGuVRF7p37649d3NzIygoiG7dumnrQkNDgaIgAOCzzz5j1qxZHD16lOzsbPLy8qwCCoDnn3+en376iY8//pjly5dXKhAC2Lt3L7fddpvVuj59+rBixQptOS4uji1btvDOO+9o6woLC8nJyeHChQv4+vpq+5XOpzIdpqOjo7VACIreQ7t27dKWQ0JCCAkJqdT5AIwbN0573r17d4xGI3fccQfvvvsuQUFBlc5HCCGcgq7PkOLWsJrJXDIYmj17NsOGDSMiIsJumk6dOtGpUydtuU+fPhw/fpxp06aVGwxNnDiR5557TlsurhmqijC/sCqld4TqHNPDw8NqWVEUq3WKUvRmt1gsfPfdd4wbN47333+fPn364O/vz3vvvcemTZus8khJSWH//v24ublx8OBBhg4dWqmyVKaC0mKxMGnSJIYPH15mW0U1KcXnUh5br4fFUvLpHzNmDAsWLCg3jz179tC6dWub24pr1w4dOiTBkBDC9TTgDtQuFwwdPXqU1atX8+OPP1Z53969e1f4Zebl5YWXl1e5aSpSleYqV/H333/Tt29fnnjiCW1dYmJimXQPPfQQXbt25ZFHHuHhhx9m0KBBdOnSpcL8u3TpwsaNG63WlV6OiYlh//79tG/fvty8Nm7cyKhRo6yWe/bsCYCnpydQVKNUVW+++Sbjx48vN015Afq2bduAohonIYRwOfpgyCDBUL2aM2cOISEh3HDDDVXed9u2bfJFVE3t27dn/vz5/P7770RGRvLVV1+xZcsW7e4sgE8++YQNGzawc+dOWrVqxfLly7n33nvZtGmTFoTY88wzz9C3b1+mTp3KrbfeysqVK62ayABee+01brzxRlq1asWIESMwGAzs3LmTXbt28fbbb2vpFi9eTK9evbjyyiv5+uuv2bx5M7NnzwaKmrp8fHxYsWIFLVu2xNvbm4CAgEq9BlVpJtuwYQMbN25k4MCBBAQEsGXLFsaNG8fNN99st+ZICCGcmr6ZrBK17a7EpUI7i8XCnDlzeOCBB7ROqsUmTpxoVRswffp0li5dysGDB0lISGDixIn88MMPPPXUU3Vd7AZhzJgxDB8+nLvuuosrrriC1NRUq1qiffv28cILLzBjxgytWfGTTz7h/PnzvPrqqxXm37t3b2bNmsXHH39Mjx49WLlyZZkxeYYMGcKvv/7KqlWruOyyy+jduzcffPABbdq0sUo3adIkFi5cSPfu3Zk3bx5ff/21Vjvl7u7ORx99xOeff05ERAS33HJLTV8am7y8vFi0aBEDBgygS5cuvPbaazzyyCN8++23tXI8IYSodbreDA2tmcyl7iZbuXIlQ4YMYf/+/XTs2NFq2+jRozly5Ahr164FYOrUqcycOZOTJ0/i4+NDdHQ0EydO5Prrr6/SMcvrjS53/zgfRVFYsmSJS06tIe8nIYQzm3XNLNqvKeqm0HxDc6J7R9dzicrXYO8mu+666+x2tJ07d67V8oQJE5gwYUIdlEoIIYRoBBpwn6GGdTbCaQ0bNgw/Pz+bj8mTJ9d38YQQjZDZbGb16tWYzWaby9XNLykpqUb5OFL61nQOTjvIH8/8wc43d/LHi39w9ujZKucT90cc7deV3LzS0JrJXKpmSLiuWbNmkZ2dbXNbYGCgw47jQq2+Qoh6ZDabiY6OxmQyER4ezvr16+nXr5+2nJCQUKVZ1fX5GQwGLBZLtfJxpMzdmcRfFg+AG26c4xxuuDH/w/k8aHqw0uXat3UfGddmWOedlenw8tYnCYZEnWjRokV9F0EIITRxcXGYTCYATCYTixcvtlqOj49n0KBB1cqveHyy6uTjSJlxtgOWNrltqlSu/X/tJ4CSu27PNDlDblZuOXu4noZVzyWEEEJUQmxsrDbUSkREBCNGjLBajomJqXZ+xf1pqpOPI+lrypeznPOcB8DN4Fa1cukq3PcF7+Pl4Je5vPflDiqlc5CaISGEEI2O0WgkISGB+Ph4bQ7B0svVzS8qKorDhw9XKx+H0nV4HjJuCJ4/eFJwrIDgwOAqlUsfVGUPzmbzJ5vr97xqgQRDQgghGiWj0WjVVFR6uSb56QekrS+qpSSIuaTLJRz7+RgFFFjV9FQuo5KnIaEhDS4QAmkmE0IIIRom/YjRBgXFoJRZXxn6oIqGNfC0RoIhIYQQoiHS1wAZKPnGr2LNkD4YamjTcBSTYEg4rblz59KsWbM6Odbo0aNdctRqIYSwxyqI0dUMWdX0VCoj3fMGGjU00NMSwrYjR46gKArbt2+v1eOsXbsWRVFsPrZs2VKrxxZCCMC6OUxfM1TVZjJdB2qlgbaTSQdqIWpB3759tTFHir366qusXr2aXr161VOphBCNidQMVV4DPS1RkQEDBvD0008zduxYjEYjoaGhzJw5k6ysLB588EH8/f1p164dy5cvB6CwsJCHH36YyMhIfHx86NSpEx9++KGWX05ODtHR0Tz66KPauqSkJAICAvjiiy8qVaa5c+fSunVrfH19ue2220hNTS2T5pdffiE2NhZvb2+ioqKYNGkSBQUF2nZFUfj0008ZNmwYPj4+REZGsnjxYm178R0ePXv2RFEUBgwYYJX/tGnTCA8PJygoiCeffJL8/PxKlb00T09PwsLCtEdQUBA///wzDz30UINtcxdCOBl9DZBCSefnGnSg1jphNzASDDVi8+bNIzg4mM2bN/P000/z+OOPM2LECPr27Ut8fDxDhgzh/vvv58KFC1gsFlq2bMl3333Hnj17eO2113j55Zf57rvvAPD29ubrr79m3rx5LF26lMLCQu6//34GDhzII488UmFZNm3axEMPPcQTTzzB9u3bGThwIG+//bZVmt9//5377ruPZ555hj179vD5558zd+5c3nnnHat0r776Krfffjs7duzgvvvu45577mHv3r0AbN68GYDVq1djMpn48ccftf3WrFlDYmIia9asYd68ecydO9dqAuAxY8bYnV+t+HHs2DGb5/fzzz9z9uxZRo8eXeFrIYQQjmDVvKWvGaritEWN4W4yRZXJnMqVnp5OQEAAaWlpNG3a1GpbTk4OSUlJREZG4u3tra3f2msrecl5dVpOzzBPem2tfPPLgAEDKCws5O+//waKan4CAgIYPnw48+fPByA5OZnw8HA2bNhA7969y+Tx5JNPcvr0ab7//ntt3XvvvcfUqVO55557WLx4Mbt27SI4OLjC8owcORKz2azVRAHcfffdrFixgvPnzwNw9dVXM2zYMCZOnKilWbBgARMmTODUqVNAUc3QmDFj+PTTT7U0vXv3JiYmhhkzZnDkyBEiIyPZtm0bPXr00NKMHj2atWvXkpiYiJubGwB33nknBoOBhQsXApCSkkJ6enq559G2bVvc3cu2Pl9//fUA/Pbbb3b3tfd+EkKI6jj+wXESn08EoMt3XTj2n2NkxmeieCj0z+tf6XwWv76Y5m82B+D0y6e56527aqW8jlbe93dp0meoFuQl55F3sm6Doero3r279tzNzY2goCC6deumrQsNDQWKggCAzz77jFmzZnH06FGys7PJy8uzCigAnn/+eX766Sc+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NpR0kI6LiyMzI1NbTjycaLWtuq+Xo15rIRyhWsHQhAkT+PPPP5kxYwZeXl7MmjWLSZMmERERwfz58yvOoBqCg4Nxc3MrUwuUkpJSpvanWFhYmM307u7uBAXZrnGZOHEiaWlp2uP48eOOOYEKKG4Kl268lOeaP8coRjEhfAIxfWPq5Ng1pfgp3PvMvWxvs1231lXa+IQoERsbq9UYR0REEBNTvc+gp5un9jyo2QPck7fFIeVzJIO7gUu3llxz9NMBde/WXXseGxtLU/+S2n79BN01eb0c9VoL4QjV+sb65ZdfmDFjBnfccQfu7u5cddVVvPLKK0yePJmvv/7a0WUEwNPTk9jYWFatWmW1ftWqVfTt29fmPn369CmTfuXKlfTq1ctufyEvLy+aNm1q9agrgUGB/LH/D+asnsPOhJ0uVWVscbNwtPlRbVktvhVO+gwJF2I0GklISGD16tXs3r272p9B/aCDYdnncDM4548D/TWn9zW9tfUBTUs6SBuNRp595llt2c/fz2pbdV8vR73WQjhCtT6h586d0yZhbdq0qXYr/ZVXXslff/3luNKV8txzzzFr1iy+/PJL9u7dy7hx4zh27Jg2btDEiRMZNWqUln7MmDEcPXqU5557jr179/Lll18ye/Zsxo8fX2tlrCmj0cigQYNc6sJge7RZ57z4C1ERR3wGFYuuPw7OPdZW8fn6+ukmTy3Vxclq+JRSp1KT18sVr3eiYapWB+qoqCiOHDlCmzZt6NKlC9999x2XX345v/zyC82aNXNwEUvcddddpKam8uabb2IymejatSu//fYbbdq0AYranY8dO6alj4yM5LfffmPcuHF88sknRERE8NFHHzndbfWurrj/lcXq9mHnvfgLUZfcXKR2VD9ERunxwiozArUQrqxawdCDDz7Ijh076N+/PxMnTuSGG27g448/pqCggA8++MDRZbTyxBNP8MQTT9jcNnfu3DLr+vfvLx3zallxzZB+lF1VgiHRmOl+FxhU5xtjyCa3kqdqYakArhJzkwnhyqoVDI0bN057PnDgQPbt28fWrVtp164dl156qcMKJ1yD7Zqhi81kLvKrWAhHKhl5Ggwu8hkod45BCYZEA1flYMhisTB37lx+/PFHjhw5gqIoREZGcscdd9C9e/eKMxANjq2aoSeuV7jjMNxaT2USojoyd2eS9HISeSl52jrf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VlZWlj755BPt27dPBw4c0JYtWyRJxcXFmjx5shITE5Wamqp33nlHLS0tkqTy8nK9+eabamxsDJ1lWrlypSRp+/btmjJlitxutzwej9544w01NDRYdKQA+hplCMCgNWvWLGVmZmrPnj2SpJiYGK1bt04nT57U1q1bVVpaqo8++kiSlJOToy+//FJJSUny+/3y+/368MMPJUnt7e1atWqVfv/9d+3du1fnz5/XokWLrDosAH3sEasHAID+NGHCBJ04cUKSVFhYGHo8PT1dq1at0pIlS7Rx40bFx8crOTlZLpdLHo8n7Dneeuut0O3HH39c69at09SpU9XS0qKhQ4dG5TgA9B/ODAEY1IwxcrlckqSysjLNnj1bo0ePltvt1sKFC3X9+nW1trbe9zlqa2s1d+5cpaWlye12a8aMGZKkS5cu9ff4AKKAMgRgUDt9+rTS09N18eJFvfTSS8rIyNAPP/yg6upqbdiwQZJ069ate35/a2urcnNzNXToUG3fvl1VVVUqKSmR9O/bZwAGPt4mAzBolZaWqq6uTu+//76OHz+ujo4OrV27VjEx//4c+P3334ftHx8fr9u3b4c99scff+jatWsqKipSamqqJOn48ePROQAAUcGZIQCDQltbmwKBgK5cuaKamhp99tlnmjt3rvLz87Vw4UKNHz9eHR0d+uqrr3Tu3Dl999132rRpU9hzjBs3Ti0tLfrll1907do13bx5U2PHjlV8fHzo+/bv369Vq1ZZdJQA+gNlCMCgcPDgQXm9Xo0bN05z5sxRWVmZ1q1bp3379ik2NlZPPfWUiouL9fnnnysjI0M7duzQ6tWrw54jJydHixcv1oIFCzRy5EitWbNGI0eO1JYtW7R79249+eSTKioq0hdffGHRUQLoDy5jjLF6CAAAAKtwZggAADgaZQgAADgaZQgAADgaZQgAADgaZQgAADgaZQgAADgaZQgAADgaZQgAADgaZQgAADgaZQgAADgaZQgAADgaZQgAADja/wAP8CJaw20s1gAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {
"filenames": {
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter6_1_2.png"
}
},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.preprocessing import PolynomialFeatures\n",
"from sklearn.linear_model import LinearRegression\n",
"\n",
"steps=250\n",
"\n",
"distance=0\n",
"x=0\n",
"distance_list=[]\n",
"steps_list=[]\n",
"while x<steps:\n",
" distance+=np.random.randint(-1,2)\n",
" distance_list.append(distance)\n",
" x+=1\n",
" steps_list.append(x)\n",
"plt.plot(steps_list,distance_list, color='green', label=\"Random Walk Data\")\n",
"\n",
"steps_list=np.asarray(steps_list)\n",
"distance_list=np.asarray(distance_list)\n",
"\n",
"X=steps_list[:,np.newaxis]\n",
"\n",
"#Polynomial fits\n",
"\n",
"#Degree 2\n",
"poly_features=PolynomialFeatures(degree=2, include_bias=False)\n",
"X_poly=poly_features.fit_transform(X)\n",
"\n",
"lin_reg=LinearRegression()\n",
"poly_fit=lin_reg.fit(X_poly,distance_list)\n",
"b=lin_reg.coef_\n",
"c=lin_reg.intercept_\n",
"print (\"2nd degree coefficients:\")\n",
"print (\"zero power: \",c)\n",
"print (\"first power: \", b[0])\n",
"print (\"second power: \",b[1])\n",
"\n",
"z = np.arange(0, steps, .01)\n",
"z_mod=b[1]*z**2+b[0]*z+c\n",
"\n",
"fit_mod=b[1]*X**2+b[0]*X+c\n",
"plt.plot(z, z_mod, color='r', label=\"2nd Degree Fit\")\n",
"plt.title(\"Polynomial Regression\")\n",
"\n",
"plt.xlabel(\"Steps\")\n",
"plt.ylabel(\"Distance\")\n",
"\n",
"#Degree 10\n",
"poly_features10=PolynomialFeatures(degree=10, include_bias=False)\n",
"X_poly10=poly_features10.fit_transform(X)\n",
"\n",
"poly_fit10=lin_reg.fit(X_poly10,distance_list)\n",
"\n",
"y_plot=poly_fit10.predict(X_poly10)\n",
"plt.plot(X, y_plot, color='black', label=\"10th Degree Fit\")\n",
"\n",
"plt.legend()\n",
"plt.show()\n",
"\n",
"\n",
"#Decision Tree Regression\n",
"from sklearn.tree import DecisionTreeRegressor\n",
"regr_1=DecisionTreeRegressor(max_depth=2)\n",
"regr_2=DecisionTreeRegressor(max_depth=5)\n",
"regr_3=DecisionTreeRegressor(max_depth=7)\n",
"regr_1.fit(X, distance_list)\n",
"regr_2.fit(X, distance_list)\n",
"regr_3.fit(X, distance_list)\n",
"\n",
"X_test = np.arange(0.0, steps, 0.01)[:, np.newaxis]\n",
"y_1 = regr_1.predict(X_test)\n",
"y_2 = regr_2.predict(X_test)\n",
"y_3=regr_3.predict(X_test)\n",
"\n",
"# Plot the results\n",
"plt.figure()\n",
"plt.scatter(X, distance_list, s=2.5, c=\"black\", label=\"data\")\n",
"plt.plot(X_test, y_1, color=\"red\",\n",
" label=\"max_depth=2\", linewidth=2)\n",
"plt.plot(X_test, y_2, color=\"green\", label=\"max_depth=5\", linewidth=2)\n",
"plt.plot(X_test, y_3, color=\"m\", label=\"max_depth=7\", linewidth=2)\n",
"\n",
"plt.xlabel(\"Data\")\n",
"plt.ylabel(\"Darget\")\n",
"plt.title(\"Decision Tree Regression\")\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Building a tree, regression\n",
"\n",
"There are mainly two steps\n",
"1. We split the predictor space (the set of possible values $x_1,x_2,\\dots, x_p$) into $J$ distinct and non-non-overlapping regions, $R_1,R_2,\\dots,R_J$. \n",
"\n",
"2. For every observation that falls into the region $R_j$ , we make the same prediction, which is simply the mean of the response values for the training observations in $R_j$.\n",
"\n",
"How do we construct the regions $R_1,\\dots,R_J$? In theory, the\n",
"regions could have any shape. However, we choose to divide the\n",
"predictor space into high-dimensional rectangles, or boxes, for\n",
"simplicity and for ease of interpretation of the resulting predictive\n",
"model. The goal is to find boxes $R_1,\\dots,R_J$ that minimize the\n",
"MSE, given by"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\sum_{j=1}^J\\sum_{i\\in R_j}(y_i-\\overline{y}_{R_j})^2,\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"where $\\overline{y}_{R_j}$ is the mean response for the training observations \n",
"within box $j$. \n",
"\n",
"\n",
"Unfortunately, it is computationally infeasible to consider every\n",
"possible partition of the feature space into $J$ boxes. The common\n",
"strategy is to take a top-down approach\n",
"\n",
"The approach is top-down because it begins at the top of the tree (all\n",
"observations belong to a single region) and then successively splits\n",
"the predictor space; each split is indicated via two new branches\n",
"further down on the tree. It is greedy because at each step of the\n",
"tree-building process, the best split is made at that particular step,\n",
"rather than looking ahead and picking a split that will lead to a\n",
"better tree in some future step.\n",
"\n",
"\n",
"### Making a tree\n",
"\n",
"In order to implement the recursive binary splitting we start by selecting\n",
"the predictor $x_j$ and a cutpoint $s$ that splits the predictor space into two regions $R_1$ and $R_2$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\left\\{X\\vert x_j < s\\right\\},\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"and"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\left\\{X\\vert x_j \\geq s\\right\\},\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"so that we obtain the lowest MSE, that is"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\sum_{i:x_i\\in R_j}(y_i-\\overline{y}_{R_1})^2+\\sum_{i:x_i\\in R_2}(y_i-\\overline{y}_{R_2})^2,\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"which we want to minimize by considering all predictors\n",
"$x_1,x_2,\\dots,x_p$. We consider also all possible values of $s$ for\n",
"each predictor. These values could be determined by randomly assigned\n",
"numbers or by starting at the midpoint and then proceed till we find\n",
"an optimal value.\n",
"\n",
"For any $j$ and $s$, we define the pair of half-planes where\n",
"$\\overline{y}_{R_1}$ is the mean response for the training\n",
"observations in $R_1(j,s)$, and $\\overline{y}_{R_2}$ is the mean\n",
"response for the training observations in $R_2(j,s)$.\n",
"\n",
"Finding the values of $j$ and $s$ that minimize the above equation can be\n",
"done quite quickly, especially when the number of features $p$ is not\n",
"too large.\n",
"\n",
"Next, we repeat the process, looking\n",
"for the best predictor and best cutpoint in order to split the data\n",
"further so as to minimize the MSE within each of the resulting\n",
"regions. However, this time, instead of splitting the entire predictor\n",
"space, we split one of the two previously identified regions. We now\n",
"have three regions. Again, we look to split one of these three regions\n",
"further, so as to minimize the MSE. The process continues until a\n",
"stopping criterion is reached; for instance, we may continue until no\n",
"region contains more than five observations.\n",
"\n",
"\n",
"The above procedure is rather straightforward, but leads often to\n",
"overfitting and unnecessarily large and complicated trees. The basic\n",
"idea is to grow a large tree $T_0$ and then prune it back in order to\n",
"obtain a subtree. A smaller tree with fewer splits (fewer regions) can\n",
"lead to smaller variance and better interpretation at the cost of a\n",
"little more bias.\n",
"\n",
"The so-called Cost complexity pruning algorithm gives us a\n",
"way to do just this. Rather than considering every possible subtree,\n",
"we consider a sequence of trees indexed by a nonnegative tuning\n",
"parameter $\\alpha$.\n",
"\n",
"Read more at the following [Scikit-Learn link on pruning](https://scikit-learn.org/stable/auto_examples/tree/plot_cost_complexity_pruning.html#sphx-glr-auto-examples-tree-plot-cost-complexity-pruning-py).\n",
"\n",
"\n",
"For each value of $\\alpha$ there corresponds a subtree $T \\in T_0$ such that"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\sum_{m=1}^{\\overline{T}}\\sum_{i:x_i\\in R_m}(y_i-\\overline{y}_{R_m})^2+\\alpha\\overline{T},\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"is as small as possible. Here $\\overline{T}$ is \n",
"the number of terminal nodes of the tree $T$ , $R_m$ is the\n",
"rectangle (i.e. the subset of predictor space) corresponding to the $m$-th terminal node.\n",
"\n",
"The tuning parameter $\\alpha$ controls a trade-off between the subtrees\n",
"complexity and its fit to the training data. When $\\alpha = 0$, then the\n",
"subtree $T$ will simply equal $T_0$, \n",
"because then the above equation just measures the\n",
"training error. \n",
"However, as $\\alpha$ increases, there is a price to pay for\n",
"having a tree with many terminal nodes. The above equation will\n",
"tend to be minimized for a smaller subtree. \n",
"\n",
"\n",
"It turns out that as we increase $\\alpha$ from zero\n",
"branches get pruned from the tree in a nested and predictable fashion,\n",
"so obtaining the whole sequence of subtrees as a function of $\\alpha$ is\n",
"easy. We can select a value of $\\alpha$ using a validation set or using\n",
"cross-validation. We then return to the full data set and obtain the\n",
"subtree corresponding to $\\alpha$. \n",
"\n",
"\n",
"### Schematic Regression Procedure\n",
"\n",
"Building a Regression Tree\n",
"\n",
"1. Use recursive binary splitting to grow a large tree on the training data, stopping only when each terminal node has fewer than some minimum number of observations.\n",
"\n",
"2. Apply cost complexity pruning to the large tree in order to obtain a sequence of best subtrees, as a function of $\\alpha$.\n",
"\n",
"3. Use for example $K$-fold cross-validation to choose $\\alpha$. Divide the training observations into $K$ folds. For each $k=1,2,\\dots,K$ we: \n",
"\n",
" * repeat steps 1 and 2 on all but the $k$-th fold of the training data. \n",
"\n",
" * Then we valuate the mean squared prediction error on the data in the left-out $k$-th fold, as a function of $\\alpha$.\n",
"\n",
" * Finally we average the results for each value of $\\alpha$, and pick $\\alpha$ to minimize the average error.\n",
"\n",
"\n",
"4. Return the subtree from Step 2 that corresponds to the chosen value of $\\alpha$. \n",
"\n",
"!eblock\n",
"\n",
"\n",
"\n",
"## A Classification Tree\n",
"\n",
"A classification tree is very similar to a regression tree, except\n",
"that it is used to predict a qualitative response rather than a\n",
"quantitative one. Recall that for a regression tree, the predicted\n",
"response for an observation is given by the mean response of the\n",
"training observations that belong to the same terminal node. In\n",
"contrast, for a classification tree, we predict that each observation\n",
"belongs to the most commonly occurring class of training observations\n",
"in the region to which it belongs. In interpreting the results of a\n",
"classification tree, we are often interested not only in the class\n",
"prediction corresponding to a particular terminal node region, but\n",
"also in the class proportions among the training observations that\n",
"fall into that region. \n",
"\n",
"\n",
"\n",
"The task of growing a\n",
"classification tree is quite similar to the task of growing a\n",
"regression tree. Just as in the regression setting, we use recursive\n",
"binary splitting to grow a classification tree. However, in the\n",
"classification setting, the MSE cannot be used as a criterion for making\n",
"the binary splits. A natural alternative to MSE is the **classification\n",
"error rate**. Since we plan to assign an observation in a given region\n",
"to the most commonly occurring error rate class of training\n",
"observations in that region, the classification error rate is simply\n",
"the fraction of the training observations in that region that do not\n",
"belong to the most common class. \n",
"\n",
"When building a classification tree, either the Gini index or the\n",
"entropy are typically used to evaluate the quality of a particular\n",
"split, since these two approaches are more sensitive to node purity\n",
"than is the classification error rate. \n",
"\n",
"\n",
"\n",
"If our targets are the outcome of a classification process that takes\n",
"for example $k=1,2,\\dots,K$ values, the only thing we need to think of\n",
"is to set up the splitting criteria for each node.\n",
"\n",
"We define a PDF $p_{mk}$ that represents the number of observations of\n",
"a class $k$ in a region $R_m$ with $N_m$ observations. We represent\n",
"this likelihood function in terms of the proportion $I(y_i=k)$ of\n",
"observations of this class in the region $R_m$ as"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"p_{mk} = \\frac{1}{N_m}\\sum_{x_i\\in R_m}I(y_i=k).\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We let $p_{mk}$ represent the majority class of observations in region\n",
"$m$. The three most common ways of splitting a node are given by\n",
"\n",
"* Misclassification error"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"p_{mk} = \\frac{1}{N_m}\\sum_{x_i\\in R_m}I(y_i\\ne k) = 1-p_{mk}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* Gini index $g$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"g = \\sum_{k=1}^K p_{mk}(1-p_{mk}).\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* Information entropy or just entropy $s$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"s = -\\sum_{k=1}^K p_{mk}\\log{p_{mk}}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Visualizing the Tree, Classification"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" mean radius mean texture mean perimeter mean area mean smoothness \\\n",
"0 17.99 10.38 122.80 1001.0 0.11840 \n",
"1 20.57 17.77 132.90 1326.0 0.08474 \n",
"2 19.69 21.25 130.00 1203.0 0.10960 \n",
"3 11.42 20.38 77.58 386.1 0.14250 \n",
"4 20.29 14.34 135.10 1297.0 0.10030 \n",
".. ... ... ... ... ... \n",
"564 21.56 22.39 142.00 1479.0 0.11100 \n",
"565 20.13 28.25 131.20 1261.0 0.09780 \n",
"566 16.60 28.08 108.30 858.1 0.08455 \n",
"567 20.60 29.33 140.10 1265.0 0.11780 \n",
"568 7.76 24.54 47.92 181.0 0.05263 \n",
"\n",
" mean compactness mean concavity mean concave points mean symmetry \\\n",
"0 0.27760 0.30010 0.14710 0.2419 \n",
"1 0.07864 0.08690 0.07017 0.1812 \n",
"2 0.15990 0.19740 0.12790 0.2069 \n",
"3 0.28390 0.24140 0.10520 0.2597 \n",
"4 0.13280 0.19800 0.10430 0.1809 \n",
".. ... ... ... ... \n",
"564 0.11590 0.24390 0.13890 0.1726 \n",
"565 0.10340 0.14400 0.09791 0.1752 \n",
"566 0.10230 0.09251 0.05302 0.1590 \n",
"567 0.27700 0.35140 0.15200 0.2397 \n",
"568 0.04362 0.00000 0.00000 0.1587 \n",
"\n",
" mean fractal dimension ... worst radius worst texture \\\n",
"0 0.07871 ... 25.380 17.33 \n",
"1 0.05667 ... 24.990 23.41 \n",
"2 0.05999 ... 23.570 25.53 \n",
"3 0.09744 ... 14.910 26.50 \n",
"4 0.05883 ... 22.540 16.67 \n",
".. ... ... ... ... \n",
"564 0.05623 ... 25.450 26.40 \n",
"565 0.05533 ... 23.690 38.25 \n",
"566 0.05648 ... 18.980 34.12 \n",
"567 0.07016 ... 25.740 39.42 \n",
"568 0.05884 ... 9.456 30.37 \n",
"\n",
" worst perimeter worst area worst smoothness worst compactness \\\n",
"0 184.60 2019.0 0.16220 0.66560 \n",
"1 158.80 1956.0 0.12380 0.18660 \n",
"2 152.50 1709.0 0.14440 0.42450 \n",
"3 98.87 567.7 0.20980 0.86630 \n",
"4 152.20 1575.0 0.13740 0.20500 \n",
".. ... ... ... ... \n",
"564 166.10 2027.0 0.14100 0.21130 \n",
"565 155.00 1731.0 0.11660 0.19220 \n",
"566 126.70 1124.0 0.11390 0.30940 \n",
"567 184.60 1821.0 0.16500 0.86810 \n",
"568 59.16 268.6 0.08996 0.06444 \n",
"\n",
" worst concavity worst concave points worst symmetry \\\n",
"0 0.7119 0.2654 0.4601 \n",
"1 0.2416 0.1860 0.2750 \n",
"2 0.4504 0.2430 0.3613 \n",
"3 0.6869 0.2575 0.6638 \n",
"4 0.4000 0.1625 0.2364 \n",
".. ... ... ... \n",
"564 0.4107 0.2216 0.2060 \n",
"565 0.3215 0.1628 0.2572 \n",
"566 0.3403 0.1418 0.2218 \n",
"567 0.9387 0.2650 0.4087 \n",
"568 0.0000 0.0000 0.2871 \n",
"\n",
" worst fractal dimension \n",
"0 0.11890 \n",
"1 0.08902 \n",
"2 0.08758 \n",
"3 0.17300 \n",
"4 0.07678 \n",
".. ... \n",
"564 0.07115 \n",
"565 0.06637 \n",
"566 0.07820 \n",
"567 0.12400 \n",
"568 0.07039 \n",
"\n",
"[569 rows x 30 columns]\n",
" malignant benign\n",
"0 1 0\n",
"1 1 0\n",
"2 1 0\n",
"3 1 0\n",
"4 1 0\n",
".. ... ...\n",
"564 1 0\n",
"565 1 0\n",
"566 1 0\n",
"567 1 0\n",
"568 0 1\n",
"\n",
"[569 rows x 2 columns]\n"
]
},
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import os\n",
"from sklearn.datasets import load_breast_cancer\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import confusion_matrix\n",
"from sklearn.tree import export_graphviz\n",
"\n",
"from IPython.display import Image \n",
"from pydot import graph_from_dot_data\n",
"import pandas as pd\n",
"import numpy as np\n",
"\n",
"\n",
"cancer = load_breast_cancer()\n",
"X = pd.DataFrame(cancer.data, columns=cancer.feature_names)\n",
"print(X)\n",
"y = pd.Categorical.from_codes(cancer.target, cancer.target_names)\n",
"y = pd.get_dummies(y)\n",
"print(y)\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)\n",
"tree_clf = DecisionTreeClassifier(max_depth=5)\n",
"tree_clf.fit(X_train, y_train)\n",
"\n",
"export_graphviz(\n",
" tree_clf,\n",
" out_file=\"DataFiles/cancer.dot\",\n",
" feature_names=cancer.feature_names,\n",
" class_names=cancer.target_names,\n",
" rounded=True,\n",
" filled=True\n",
")\n",
"cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'\n",
"os.system(cmd)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Common imports\n",
"import numpy as np\n",
"from sklearn.model_selection import train_test_split \n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.datasets import make_moons\n",
"from sklearn.tree import export_graphviz\n",
"from pydot import graph_from_dot_data\n",
"import pandas as pd\n",
"import os\n",
"\n",
"np.random.seed(42)\n",
"X, y = make_moons(n_samples=100, noise=0.25, random_state=53)\n",
"X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)\n",
"tree_clf = DecisionTreeClassifier(max_depth=5)\n",
"tree_clf.fit(X_train, y_train)\n",
"\n",
"export_graphviz(\n",
" tree_clf,\n",
" out_file=\"DataFiles/moons.dot\",\n",
" rounded=True,\n",
" filled=True\n",
")\n",
"cmd = 'dot -Tpng DataFiles/moons.dot -o DataFiles/moons.png'\n",
"os.system(cmd)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Other ways of visualizing the trees\n",
"\n",
"**Scikit-Learn** has also another way to visualize the trees which is very useful, here with the Iris data."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"data": {
"text/plain": [
"[Text(0.5, 0.9166666666666666, 'X[2] <= 2.45\\ngini = 0.667\\nsamples = 150\\nvalue = [50, 50, 50]'),\n",
" Text(0.4230769230769231, 0.75, 'gini = 0.0\\nsamples = 50\\nvalue = [50, 0, 0]'),\n",
" Text(0.5769230769230769, 0.75, 'X[3] <= 1.75\\ngini = 0.5\\nsamples = 100\\nvalue = [0, 50, 50]'),\n",
" Text(0.3076923076923077, 0.5833333333333334, 'X[2] <= 4.95\\ngini = 0.168\\nsamples = 54\\nvalue = [0, 49, 5]'),\n",
" Text(0.15384615384615385, 0.4166666666666667, 'X[3] <= 1.65\\ngini = 0.041\\nsamples = 48\\nvalue = [0, 47, 1]'),\n",
" Text(0.07692307692307693, 0.25, 'gini = 0.0\\nsamples = 47\\nvalue = [0, 47, 0]'),\n",
" Text(0.23076923076923078, 0.25, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 1]'),\n",
" Text(0.46153846153846156, 0.4166666666666667, 'X[3] <= 1.55\\ngini = 0.444\\nsamples = 6\\nvalue = [0, 2, 4]'),\n",
" Text(0.38461538461538464, 0.25, 'gini = 0.0\\nsamples = 3\\nvalue = [0, 0, 3]'),\n",
" Text(0.5384615384615384, 0.25, 'X[2] <= 5.45\\ngini = 0.444\\nsamples = 3\\nvalue = [0, 2, 1]'),\n",
" Text(0.46153846153846156, 0.08333333333333333, 'gini = 0.0\\nsamples = 2\\nvalue = [0, 2, 0]'),\n",
" Text(0.6153846153846154, 0.08333333333333333, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 1]'),\n",
" Text(0.8461538461538461, 0.5833333333333334, 'X[2] <= 4.85\\ngini = 0.043\\nsamples = 46\\nvalue = [0, 1, 45]'),\n",
" Text(0.7692307692307693, 0.4166666666666667, 'X[1] <= 3.1\\ngini = 0.444\\nsamples = 3\\nvalue = [0, 1, 2]'),\n",
" Text(0.6923076923076923, 0.25, 'gini = 0.0\\nsamples = 2\\nvalue = [0, 0, 2]'),\n",
" Text(0.8461538461538461, 0.25, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 1, 0]'),\n",
" Text(0.9230769230769231, 0.4166666666666667, 'gini = 0.0\\nsamples = 43\\nvalue = [0, 0, 43]')]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {
"filenames": {
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter6_24_1.png"
}
},
"output_type": "display_data"
}
],
"source": [
"from sklearn.datasets import load_iris\n",
"from sklearn import tree\n",
"X, y = load_iris(return_X_y=True)\n",
"tree_clf = tree.DecisionTreeClassifier()\n",
"tree_clf = tree_clf.fit(X, y)\n",
"# and then plot the tree\n",
"tree.plot_tree(tree_clf)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Alternatively, the tree can also be exported in textual format with the function exporttext.\n",
"This method doesnt require the installation of external libraries and is more compact:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"|--- petal width (cm) <= 0.80\n",
"| |--- class: 0\n",
"|--- petal width (cm) > 0.80\n",
"| |--- petal width (cm) <= 1.75\n",
"| | |--- class: 1\n",
"| |--- petal width (cm) > 1.75\n",
"| | |--- class: 2\n",
"\n"
]
}
],
"source": [
"from sklearn.datasets import load_iris\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.tree import export_text\n",
"iris = load_iris()\n",
"decision_tree = DecisionTreeClassifier(random_state=0, max_depth=2)\n",
"decision_tree = decision_tree.fit(iris.data, iris.target)\n",
"r = export_text(decision_tree, feature_names=iris['feature_names'])\n",
"print(r)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Algorithms for Setting up Decision Trees\n",
"\n",
"Two algorithms stand out in the set up of decision trees:\n",
"1. The CART (Classification And Regression Tree) algorithm for both classification and regression\n",
"\n",
"2. The ID3 algorithm based on the computation of the information gain for classification\n",
"\n",
"We discuss both algorithms with applications here. The popular library\n",
"**Scikit-Learn** uses the CART algorithm. For classification problems\n",
"you can use either the **gini** index or the **entropy** to split a tree\n",
"in two branches.\n",
"\n",
"### The CART algorithm for Classification\n",
"\n",
"For classification, the CART algorithm splits the data set in two subsets using a single feature $k$ and a threshold $t_k$.\n",
"This could be for example a threshold set by a number below a certain circumference of a malign tumor.\n",
"\n",
"How do we find these two quantities?\n",
"We search for the pair $(k,t_k)$ that produces the purest subset using for example the **gini** factor $G$.\n",
"The cost function it tries to minimize is then"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"C(k,t_k) = \\frac{m_{\\mathrm{left}}}{m}G_{\\mathrm{left}}+ \\frac{m_{\\mathrm{right}}}{m}G_{\\mathrm{right}},\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"where $G_{\\mathrm{left/right}}$ measures the impurity of the left/right subset and $m_{\\mathrm{left/right}}$\n",
" is the number of instances in the left/right subset\n",
"\n",
"Once it has successfully split the training set in two, it splits the subsets using the same logic, then the subsubsets\n",
"and so on, recursively. It stops recursing once it reaches the maximum depth (defined by the\n",
"$max\\_depth$ hyperparameter), or if it cannot find a split that will reduce impurity. A few other\n",
"hyperparameters control additional stopping conditions such as the $min\\_samples\\_split$,\n",
"$min\\_samples\\_leaf$, $min\\_weight\\_fraction\\_leaf$, and $max\\_leaf\\_nodes$.\n",
"\n",
"\n",
"### The CART algorithm for Regression\n",
"\n",
"The CART algorithm for regression works is similar to the one for classification except that instead of trying to split the\n",
"training set in a way that minimizes say the **gini** or **entropy** impurity, it now tries to split the training set in a way that minimizes our well-known mean-squared error (MSE). The cost function is now"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"C(k,t_k) = \\frac{m_{\\mathrm{left}}}{m}\\mathrm{MSE}_{\\mathrm{left}}+ \\frac{m_{\\mathrm{right}}}{m}\\mathrm{MSE}_{\\mathrm{right}}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here the MSE for a specific node is defined as"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\mathrm{MSE}_{\\mathrm{node}}=\\frac{1}{m_\\mathrm{node}}\\sum_{i\\in \\mathrm{node}}(\\overline{y}_{\\mathrm{node}}-y_i)^2,\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"with"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\overline{y}_{\\mathrm{node}}=\\frac{1}{m_\\mathrm{node}}\\sum_{i\\in \\mathrm{node}}y_i,\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"the mean value of all observations in a specific node.\n",
"\n",
"Without any regularization, the regression task for decision trees, \n",
"just like for classification tasks, is prone to overfitting.\n",
"\n",
"\n",
"\n",
"### Computing the Gini index\n",
"\n",
"The example we will look at is a classical one in many Machine\n",
"Learning applications. Based on various meteorological features, we\n",
"have several so-called attributes which decide whether we at the end\n",
"will do some outdoor activity like skiing, going for a bike ride etc\n",
"etc. The table here contains the feautures **outlook**, **temperature**,\n",
"**humidity** and **wind**. The target or output is whether we ride\n",
"(True=1) or whether we do something else that day (False=0). The\n",
"attributes for each feature are then sunny, overcast and rain for the\n",
"outlook, hot, cold and mild for temperature, high and normal for\n",
"humidity and weak and strong for wind.\n",
"\n",
"The table here summarizes the various attributes and\n",
"<table border=\"1\">\n",
"<thead>\n",
"<tr><th align=\"center\">Day</th> <th align=\"center\">Outlook </th> <th align=\"center\">Temperature</th> <th align=\"center\">Humidity</th> <th align=\"center\"> Wind </th> <th align=\"center\">Ride</th> </tr>\n",
"</thead>\n",
"<tbody>\n",
"<tr><td align=\"center\"> 1 </td> <td align=\"center\"> Sunny </td> <td align=\"center\"> Hot </td> <td align=\"center\"> High </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 0 </td> </tr>\n",
"<tr><td align=\"center\"> 2 </td> <td align=\"center\"> Sunny </td> <td align=\"center\"> Hot </td> <td align=\"center\"> High </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 1 </td> </tr>\n",
"<tr><td align=\"center\"> 3 </td> <td align=\"center\"> Overcast </td> <td align=\"center\"> Hot </td> <td align=\"center\"> High </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
"<tr><td align=\"center\"> 4 </td> <td align=\"center\"> Rain </td> <td align=\"center\"> Mild </td> <td align=\"center\"> High </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
"<tr><td align=\"center\"> 5 </td> <td align=\"center\"> Rain </td> <td align=\"center\"> Cool </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
"<tr><td align=\"center\"> 6 </td> <td align=\"center\"> Rain </td> <td align=\"center\"> Cool </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 0 </td> </tr>\n",
"<tr><td align=\"center\"> 7 </td> <td align=\"center\"> Overcast </td> <td align=\"center\"> Cool </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 1 </td> </tr>\n",
"<tr><td align=\"center\"> 8 </td> <td align=\"center\"> Sunny </td> <td align=\"center\"> Mild </td> <td align=\"center\"> High </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 0 </td> </tr>\n",
"<tr><td align=\"center\"> 9 </td> <td align=\"center\"> Sunny </td> <td align=\"center\"> Cool </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
"<tr><td align=\"center\"> 10 </td> <td align=\"center\"> Rain </td> <td align=\"center\"> Mild </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
"<tr><td align=\"center\"> 11 </td> <td align=\"center\"> Sunny </td> <td align=\"center\"> Mild </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 1 </td> </tr>\n",
"<tr><td align=\"center\"> 12 </td> <td align=\"center\"> Overcast </td> <td align=\"center\"> Mild </td> <td align=\"center\"> High </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 1 </td> </tr>\n",
"<tr><td align=\"center\"> 13 </td> <td align=\"center\"> Overcast </td> <td align=\"center\"> Hot </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
"<tr><td align=\"center\"> 14 </td> <td align=\"center\"> Rain </td> <td align=\"center\"> Mild </td> <td align=\"center\"> High </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 0 </td> </tr>\n",
"</tbody>\n",
"</table>\n",
"\n",
"### Simple Python Code to read in Data and perform Classification"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"ename": "FileNotFoundError",
"evalue": "[Errno 2] No such file or directory: 'DataFiles/rideclass.csv'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)",
"Input \u001b[0;32mIn [6]\u001b[0m, in \u001b[0;36m<cell line: 37>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21msave_fig\u001b[39m(fig_id):\n\u001b[1;32m 35\u001b[0m plt\u001b[38;5;241m.\u001b[39msavefig(image_path(fig_id) \u001b[38;5;241m+\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m.png\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28mformat\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mpng\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m---> 37\u001b[0m infile \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mdata_path\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mrideclass.csv\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mr\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 39\u001b[0m \u001b[38;5;66;03m# Read the experimental data with Pandas\u001b[39;00m\n\u001b[1;32m 40\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mIPython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdisplay\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m display\n",
"\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'DataFiles/rideclass.csv'"
]
}
],
"source": [
"# Common imports\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.tree import export_graphviz\n",
"from sklearn.preprocessing import StandardScaler, OneHotEncoder\n",
"from sklearn.compose import ColumnTransformer\n",
"from IPython.display import Image \n",
"from pydot import graph_from_dot_data\n",
"import os\n",
"\n",
"# Where to save the figures and data files\n",
"PROJECT_ROOT_DIR = \"Results\"\n",
"FIGURE_ID = \"Results/FigureFiles\"\n",
"DATA_ID = \"DataFiles/\"\n",
"\n",
"if not os.path.exists(PROJECT_ROOT_DIR):\n",
" os.mkdir(PROJECT_ROOT_DIR)\n",
"\n",
"if not os.path.exists(FIGURE_ID):\n",
" os.makedirs(FIGURE_ID)\n",
"\n",
"if not os.path.exists(DATA_ID):\n",
" os.makedirs(DATA_ID)\n",
"\n",
"def image_path(fig_id):\n",
" return os.path.join(FIGURE_ID, fig_id)\n",
"\n",
"def data_path(dat_id):\n",
" return os.path.join(DATA_ID, dat_id)\n",
"\n",
"def save_fig(fig_id):\n",
" plt.savefig(image_path(fig_id) + \".png\", format='png')\n",
"\n",
"infile = open(data_path(\"rideclass.csv\"),'r')\n",
"\n",
"# Read the experimental data with Pandas\n",
"from IPython.display import display\n",
"ridedata = pd.read_csv(infile,names = ('Outlook','Temperature','Humidity','Wind','Ride'))\n",
"ridedata = pd.DataFrame(ridedata)\n",
"\n",
"# Features and targets\n",
"X = ridedata.loc[:, ridedata.columns != 'Ride'].values\n",
"y = ridedata.loc[:, ridedata.columns == 'Ride'].values\n",
"\n",
"# Create the encoder.\n",
"encoder = OneHotEncoder(handle_unknown=\"ignore\")\n",
"# Assume for simplicity all features are categorical.\n",
"encoder.fit(X) \n",
"# Apply the encoder.\n",
"X = encoder.transform(X)\n",
"print(X)\n",
"# Then do a Classification tree\n",
"tree_clf = DecisionTreeClassifier(max_depth=2)\n",
"tree_clf.fit(X, y)\n",
"print(\"Train set accuracy with Decision Tree: {:.2f}\".format(tree_clf.score(X,y)))\n",
"#transfer to a decision tree graph\n",
"export_graphviz(\n",
" tree_clf,\n",
" out_file=\"DataFiles/ride.dot\",\n",
" rounded=True,\n",
" filled=True\n",
")\n",
"cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'\n",
"os.system(cmd)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The above functions (gini, entropy and misclassification error) are\n",
"important components of the so-called CART algorithm. We will discuss\n",
"this algorithm below after we have discussed the information gain\n",
"algorithm ID3.\n",
"\n",
"In the example here we have converted all our attributes into numerical values $0,1,2$ etc."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"# Split a dataset based on an attribute and an attribute value\n",
"def test_split(index, value, dataset):\n",
"\tleft, right = list(), list()\n",
"\tfor row in dataset:\n",
"\t\tif row[index] < value:\n",
"\t\t\tleft.append(row)\n",
"\t\telse:\n",
"\t\t\tright.append(row)\n",
"\treturn left, right\n",
" \n",
"# Calculate the Gini index for a split dataset\n",
"def gini_index(groups, classes):\n",
"\t# count all samples at split point\n",
"\tn_instances = float(sum([len(group) for group in groups]))\n",
"\t# sum weighted Gini index for each group\n",
"\tgini = 0.0\n",
"\tfor group in groups:\n",
"\t\tsize = float(len(group))\n",
"\t\t# avoid divide by zero\n",
"\t\tif size == 0:\n",
"\t\t\tcontinue\n",
"\t\tscore = 0.0\n",
"\t\t# score the group based on the score for each class\n",
"\t\tfor class_val in classes:\n",
"\t\t\tp = [row[-1] for row in group].count(class_val) / size\n",
"\t\t\tscore += p * p\n",
"\t\t# weight the group score by its relative size\n",
"\t\tgini += (1.0 - score) * (size / n_instances)\n",
"\treturn gini\n",
"\n",
"# Select the best split point for a dataset\n",
"def get_split(dataset):\n",
"\tclass_values = list(set(row[-1] for row in dataset))\n",
"\tb_index, b_value, b_score, b_groups = 999, 999, 999, None\n",
"\tfor index in range(len(dataset[0])-1):\n",
"\t\tfor row in dataset:\n",
"\t\t\tgroups = test_split(index, row[index], dataset)\n",
"\t\t\tgini = gini_index(groups, class_values)\n",
"\t\t\tprint('X%d < %.3f Gini=%.3f' % ((index+1), row[index], gini))\n",
"\t\t\tif gini < b_score:\n",
"\t\t\t\tb_index, b_value, b_score, b_groups = index, row[index], gini, groups\n",
"\treturn {'index':b_index, 'value':b_value, 'groups':b_groups}\n",
" \n",
"dataset = [[0,0,0,0,0],\n",
" [0,0,0,1,1],\n",
" [1,0,0,0,1],\n",
" [2,1,0,0,1],\n",
" [2,2,1,0,1],\n",
" [2,2,1,1,0],\n",
" [1,2,1,1,1],\n",
" [0,1,0,0,0],\n",
" [0,2,1,0,1],\n",
" [2,1,1,0,1],\n",
" [0,1,1,1,1],\n",
" [1,1,0,1,1],\n",
" [1,0,1,0,1],\n",
" [2,1,0,1,0]]\n",
"\n",
"split = get_split(dataset)\n",
"print('Split: [X%d < %.3f]' % ((split['index']+1), split['value']))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Entropy and the ID3 algorithm\n",
"\n",
"The ID3 algorithm learns decision trees by constructing\n",
"them in a top down way, beginning with the question **which attribute should be tested at the root of the tree**?\n",
"\n",
"1. Each instance attribute is evaluated using a statistical test to determine how well it alone classifies the training examples.\n",
"\n",
"2. The best attribute is selected and used as the test at the root node of the tree.\n",
"\n",
"3. A descendant of the root node is then created for each possible value of this attribute.\n",
"\n",
"4. Training examples are sorted to the appropriate descendant node.\n",
"\n",
"5. The entire process is then repeated using the training examples associated with each descendant node to select the best attribute to test at that point in the tree.\n",
"\n",
"6. This forms a greedy search for an acceptable decision tree, in which the algorithm never backtracks to reconsider earlier choices. \n",
"\n",
"The ID3 algorithm selects which attribute to test at each node in the\n",
"tree.\n",
"\n",
"We would like to select the attribute that is most useful for classifying\n",
"examples.\n",
"\n",
"What is a good quantitative measure of the worth of an attribute?\n",
"\n",
"Information gain measures how well a given attribute separates the\n",
"training examples according to their target classification.\n",
"\n",
"The ID3 algorithm uses this information gain measure to select among the candidate\n",
"attributes at each step while growing the tree.\n",
"\n",
"\n",
"### Cancer Data again now with Decision Trees and other Methods"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from sklearn.model_selection import train_test_split \n",
"from sklearn.datasets import load_breast_cancer\n",
"from sklearn.svm import SVC\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"\n",
"# Load the data\n",
"cancer = load_breast_cancer()\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(cancer.data,cancer.target,random_state=0)\n",
"print(X_train.shape)\n",
"print(X_test.shape)\n",
"# Logistic Regression\n",
"logreg = LogisticRegression(solver='lbfgs')\n",
"logreg.fit(X_train, y_train)\n",
"print(\"Test set accuracy with Logistic Regression: {:.2f}\".format(logreg.score(X_test,y_test)))\n",
"# Support vector machine\n",
"svm = SVC(gamma='auto', C=100)\n",
"svm.fit(X_train, y_train)\n",
"print(\"Test set accuracy with SVM: {:.2f}\".format(svm.score(X_test,y_test)))\n",
"# Decision Trees\n",
"deep_tree_clf = DecisionTreeClassifier(max_depth=None)\n",
"deep_tree_clf.fit(X_train, y_train)\n",
"print(\"Test set accuracy with Decision Trees: {:.2f}\".format(deep_tree_clf.score(X_test,y_test)))\n",
"#now scale the data\n",
"from sklearn.preprocessing import StandardScaler\n",
"scaler = StandardScaler()\n",
"scaler.fit(X_train)\n",
"X_train_scaled = scaler.transform(X_train)\n",
"X_test_scaled = scaler.transform(X_test)\n",
"# Logistic Regression\n",
"logreg.fit(X_train_scaled, y_train)\n",
"print(\"Test set accuracy Logistic Regression with scaled data: {:.2f}\".format(logreg.score(X_test_scaled,y_test)))\n",
"# Support Vector Machine\n",
"svm.fit(X_train_scaled, y_train)\n",
"print(\"Test set accuracy SVM with scaled data: {:.2f}\".format(logreg.score(X_test_scaled,y_test)))\n",
"# Decision Trees\n",
"deep_tree_clf.fit(X_train_scaled, y_train)\n",
"print(\"Test set accuracy with Decision Trees and scaled data: {:.2f}\".format(deep_tree_clf.score(X_test_scaled,y_test)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Another example, the moons again"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"from __future__ import division, print_function, unicode_literals\n",
"\n",
"# Common imports\n",
"import numpy as np\n",
"import os\n",
"\n",
"# to make this notebook's output stable across runs\n",
"np.random.seed(42)\n",
"\n",
"# To plot pretty figures\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib.colors import ListedColormap\n",
"plt.rcParams['axes.labelsize'] = 14\n",
"plt.rcParams['xtick.labelsize'] = 12\n",
"plt.rcParams['ytick.labelsize'] = 12\n",
"\n",
"\n",
"from sklearn.svm import SVC\n",
"from sklearn import datasets\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.datasets import make_moons\n",
"from sklearn.tree import export_graphviz\n",
"\n",
"Xm, ym = make_moons(n_samples=100, noise=0.25, random_state=53)\n",
"\n",
"deep_tree_clf1 = DecisionTreeClassifier(random_state=42)\n",
"deep_tree_clf2 = DecisionTreeClassifier(min_samples_leaf=4, random_state=42)\n",
"deep_tree_clf1.fit(Xm, ym)\n",
"deep_tree_clf2.fit(Xm, ym)\n",
"\n",
"\n",
"def plot_decision_boundary(clf, X, y, axes=[0, 7.5, 0, 3], iris=True, legend=False, plot_training=True):\n",
" x1s = np.linspace(axes[0], axes[1], 100)\n",
" x2s = np.linspace(axes[2], axes[3], 100)\n",
" x1, x2 = np.meshgrid(x1s, x2s)\n",
" X_new = np.c_[x1.ravel(), x2.ravel()]\n",
" y_pred = clf.predict(X_new).reshape(x1.shape)\n",
" custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])\n",
" plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap)\n",
" if not iris:\n",
" custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50'])\n",
" plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8)\n",
" if plot_training:\n",
" plt.plot(X[:, 0][y==0], X[:, 1][y==0], \"yo\", label=\"Iris-Setosa\")\n",
" plt.plot(X[:, 0][y==1], X[:, 1][y==1], \"bs\", label=\"Iris-Versicolor\")\n",
" plt.plot(X[:, 0][y==2], X[:, 1][y==2], \"g^\", label=\"Iris-Virginica\")\n",
" plt.axis(axes)\n",
" if iris:\n",
" plt.xlabel(\"Petal length\", fontsize=14)\n",
" plt.ylabel(\"Petal width\", fontsize=14)\n",
" else:\n",
" plt.xlabel(r\"$x_1$\", fontsize=18)\n",
" plt.ylabel(r\"$x_2$\", fontsize=18, rotation=0)\n",
" if legend:\n",
" plt.legend(loc=\"lower right\", fontsize=14)\n",
"plt.figure(figsize=(11, 4))\n",
"plt.subplot(121)\n",
"plot_decision_boundary(deep_tree_clf1, Xm, ym, axes=[-1.5, 2.5, -1, 1.5], iris=False)\n",
"plt.title(\"No restrictions\", fontsize=16)\n",
"plt.subplot(122)\n",
"plot_decision_boundary(deep_tree_clf2, Xm, ym, axes=[-1.5, 2.5, -1, 1.5], iris=False)\n",
"plt.title(\"min_samples_leaf = {}\".format(deep_tree_clf2.min_samples_leaf), fontsize=14)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"np.random.seed(6)\n",
"Xs = np.random.rand(100, 2) - 0.5\n",
"ys = (Xs[:, 0] > 0).astype(np.float32) * 2\n",
"\n",
"angle = np.pi/4\n",
"rotation_matrix = np.array([[np.cos(angle), -np.sin(angle)], [np.sin(angle), np.cos(angle)]])\n",
"Xsr = Xs.dot(rotation_matrix)\n",
"\n",
"tree_clf_s = DecisionTreeClassifier(random_state=42)\n",
"tree_clf_s.fit(Xs, ys)\n",
"tree_clf_sr = DecisionTreeClassifier(random_state=42)\n",
"tree_clf_sr.fit(Xsr, ys)\n",
"\n",
"plt.figure(figsize=(11, 4))\n",
"plt.subplot(121)\n",
"plot_decision_boundary(tree_clf_s, Xs, ys, axes=[-0.7, 0.7, -0.7, 0.7], iris=False)\n",
"plt.subplot(122)\n",
"plot_decision_boundary(tree_clf_sr, Xsr, ys, axes=[-0.7, 0.7, -0.7, 0.7], iris=False)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"# Quadratic training set + noise\n",
"np.random.seed(42)\n",
"m = 200\n",
"X = np.random.rand(m, 1)\n",
"y = 4 * (X - 0.5) ** 2\n",
"y = y + np.random.randn(m, 1) / 10"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"from sklearn.tree import DecisionTreeRegressor\n",
"\n",
"tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42)\n",
"tree_reg.fit(X, y)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"from sklearn.tree import DecisionTreeRegressor\n",
"\n",
"tree_reg1 = DecisionTreeRegressor(random_state=42, max_depth=2)\n",
"tree_reg2 = DecisionTreeRegressor(random_state=42, max_depth=3)\n",
"tree_reg1.fit(X, y)\n",
"tree_reg2.fit(X, y)\n",
"\n",
"def plot_regression_predictions(tree_reg, X, y, axes=[0, 1, -0.2, 1], ylabel=\"$y$\"):\n",
" x1 = np.linspace(axes[0], axes[1], 500).reshape(-1, 1)\n",
" y_pred = tree_reg.predict(x1)\n",
" plt.axis(axes)\n",
" plt.xlabel(\"$x_1$\", fontsize=18)\n",
" if ylabel:\n",
" plt.ylabel(ylabel, fontsize=18, rotation=0)\n",
" plt.plot(X, y, \"b.\")\n",
" plt.plot(x1, y_pred, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n",
"\n",
"plt.figure(figsize=(11, 4))\n",
"plt.subplot(121)\n",
"plot_regression_predictions(tree_reg1, X, y)\n",
"for split, style in ((0.1973, \"k-\"), (0.0917, \"k--\"), (0.7718, \"k--\")):\n",
" plt.plot([split, split], [-0.2, 1], style, linewidth=2)\n",
"plt.text(0.21, 0.65, \"Depth=0\", fontsize=15)\n",
"plt.text(0.01, 0.2, \"Depth=1\", fontsize=13)\n",
"plt.text(0.65, 0.8, \"Depth=1\", fontsize=13)\n",
"plt.legend(loc=\"upper center\", fontsize=18)\n",
"plt.title(\"max_depth=2\", fontsize=14)\n",
"\n",
"plt.subplot(122)\n",
"plot_regression_predictions(tree_reg2, X, y, ylabel=None)\n",
"for split, style in ((0.1973, \"k-\"), (0.0917, \"k--\"), (0.7718, \"k--\")):\n",
" plt.plot([split, split], [-0.2, 1], style, linewidth=2)\n",
"for split in (0.0458, 0.1298, 0.2873, 0.9040):\n",
" plt.plot([split, split], [-0.2, 1], \"k:\", linewidth=1)\n",
"plt.text(0.3, 0.5, \"Depth=2\", fontsize=13)\n",
"plt.title(\"max_depth=3\", fontsize=14)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"tree_reg1 = DecisionTreeRegressor(random_state=42)\n",
"tree_reg2 = DecisionTreeRegressor(random_state=42, min_samples_leaf=10)\n",
"tree_reg1.fit(X, y)\n",
"tree_reg2.fit(X, y)\n",
"\n",
"x1 = np.linspace(0, 1, 500).reshape(-1, 1)\n",
"y_pred1 = tree_reg1.predict(x1)\n",
"y_pred2 = tree_reg2.predict(x1)\n",
"\n",
"plt.figure(figsize=(11, 4))\n",
"\n",
"plt.subplot(121)\n",
"plt.plot(X, y, \"b.\")\n",
"plt.plot(x1, y_pred1, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n",
"plt.axis([0, 1, -0.2, 1.1])\n",
"plt.xlabel(\"$x_1$\", fontsize=18)\n",
"plt.ylabel(\"$y$\", fontsize=18, rotation=0)\n",
"plt.legend(loc=\"upper center\", fontsize=18)\n",
"plt.title(\"No restrictions\", fontsize=14)\n",
"\n",
"plt.subplot(122)\n",
"plt.plot(X, y, \"b.\")\n",
"plt.plot(x1, y_pred2, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n",
"plt.axis([0, 1, -0.2, 1.1])\n",
"plt.xlabel(\"$x_1$\", fontsize=18)\n",
"plt.title(\"min_samples_leaf={}\".format(tree_reg2.min_samples_leaf), fontsize=14)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pros and cons of trees, pros\n",
"\n",
"* White box, easy to interpret model. Some people believe that decision trees more closely mirror human decision-making than do the regression and classification approaches discussed earlier (think of support vector machines)\n",
"\n",
"* Trees are very easy to explain to people. In fact, they are even easier to explain than linear regression!\n",
"\n",
"* No feature normalization needed\n",
"\n",
"* Tree models can handle both continuous and categorical data (Classification and Regression Trees)\n",
"\n",
"* Can model nonlinear relationships\n",
"\n",
"* Can model interactions between the different descriptive features\n",
"\n",
"* Trees can be displayed graphically, and are easily interpreted even by a non-expert (especially if they are small)\n",
"\n",
"### Disadvantages\n",
"\n",
"* Unfortunately, trees generally do not have the same level of predictive accuracy as some of the other regression and classification approaches\n",
"\n",
"* If continuous features are used the tree may become quite large and hence less interpretable\n",
"\n",
"* Decision trees are prone to overfit the training data and hence do not well generalize the data if no stopping criteria or improvements like pruning, boosting or bagging are implemented\n",
"\n",
"* Small changes in the data may lead to a completely different tree. This issue can be addressed by using ensemble methods like bagging, boosting or random forests\n",
"\n",
"* Unbalanced datasets where some target feature values occur much more frequently than others may lead to biased trees since the frequently occurring feature values are preferred over the less frequently occurring ones. \n",
"\n",
"* If the number of features is relatively large (high dimensional) and the number of instances is relatively low, the tree might overfit the data\n",
"\n",
"* Features with many levels may be preferred over features with less levels since for them it is *more easy* to split the dataset such that the sub datasets only contain pure target feature values. This issue can be addressed by preferring for instance the information gain ratio as splitting criteria over information gain\n",
"\n",
"However, by aggregating many decision trees, using methods like\n",
"bagging, random forests, and boosting, the predictive performance of\n",
"trees can be substantially improved."
]
}
],
"metadata": {
"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.9.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}