-
Notifications
You must be signed in to change notification settings - Fork 54
/
Exercise5.01.ipynb
375 lines (375 loc) · 65.2 KB
/
Exercise5.01.ipynb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Exercise 5.01: Ordinary Least Squares (OLS) as a Classifier"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import matplotlib.lines as mlines\n",
"import numpy as np\n",
"import pandas as pd\n",
"from sklearn.linear_model import LinearRegression\n",
"from sklearn.model_selection import train_test_split"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>x</th>\n",
" <th>y</th>\n",
" <th>labels</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>13</td>\n",
" <td>x</td>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>8</td>\n",
" <td>18</td>\n",
" <td>o</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>9</td>\n",
" <td>25</td>\n",
" <td>x</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>5</td>\n",
" <td>25</td>\n",
" <td>x</td>\n",
" </tr>\n",
" <tr>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>17</td>\n",
" <td>x</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" x y labels\n",
"0 1 13 x\n",
"1 8 18 o\n",
"2 9 25 x\n",
"3 5 25 x\n",
"4 4 17 x"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv('../Datasets/linear_classifier.csv')\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10, 7))\n",
"for label, label_class in df.groupby('labels'):\n",
" plt.scatter(label_class.values[:,0], label_class.values[:,1],\n",
" label=f'Class {label}', marker=label, c='k')\n",
"plt.legend()\n",
"plt.title(\"Linear Classifier\");"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"df_train, df_test = train_test_split(df.copy(), test_size=0.4, random_state=12)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"y = 1.2718120805369124x + 8.865771812080538\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/ashish.jha/opt/anaconda3/lib/python3.7/site-packages/sklearn/linear_model/base.py:503: RuntimeWarning: internal gelsd driver lwork query error, required iwork dimension not returned. This is likely the result of LAPACK bug 0038, fixed in LAPACK 3.2.2 (released July 21, 2010). Falling back to 'gelss' driver.\n",
" linalg.lstsq(X, y)\n"
]
}
],
"source": [
"# Fit a linear regression model\n",
"model = LinearRegression()\n",
"model.fit(df_train.x.values.reshape((-1, 1)), df_train.y.values.reshape((-1, 1)))\n",
"\n",
"# Print out the parameters\n",
"print(f'y = {model.coef_[0][0]}x + {model.intercept_[0]}')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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HR2tnTt36vXXX9fPf/5zRUdHa+TIkTpy5IikEzNLSUlJuvLKK9WzZ09t2rRJkvTtt9+qf//+io6O1i9/+UtZa886TlRUlCTJcRwNHz5cAwYM0MUXX6w//OEPp877sbHPBzNQAADUAg899NCp2aCKEhUVpb///e/leuyGDRuUnp6u5557Tnv27NGTTz6pt99+W2FhYUpOTlZqaqomTpwoSWrTpo0++eQTPfPMM/rb3/6m5557To899phuuukmTZw4US+//LKee+65c465bt06rVmzRvXq1dMll1yiBx98UPXq1fvJscuLAgUAACpcly5ddPXVV0uSVq1apQ0bNqhXr16SpGPHjumGG244de5dd90lSbrqqqu0ePFiSdKKFStOfT148GA1btz4nGP269fv1HmXXXaZ8vLytGvXrp8cu7woUAAAnIW19rS3t595u7op70xRZWnUqNGpr621uvXWWzV9+vSzntugQQNJUnBwsI4fP37qeKDf75PPU/q5zjV2ebEGCgCAMyQlJSkxMfHUuhtrrRITE5WUlORusBqqV69eWr58ubZs2SJJOnLkiDZv3vyTj+nTp4+ysrIkSa+88ooOHTpUZWOXBQUKAIBSrLXKz89XamrqqRKVmJio1NRU5efnn3UxM35amzZt5PP5NHLkSF1xxRXq1avXqcXiP+bPf/6zli5dqujoaC1btkzt27evsrHLwlTlfwgxMTE2Ozu7ysYDAKA8SpemkxISEpSSklKtLuNt3LhRXbt2dTtGrXC276UxZrW1NuZs5zMDBQDAGYwxSklJOe1YdStPcBcFCgCAM5ycgSqt9JoogAIFAEAppS/fJSQkyO/3KyEh4bQ1UQDbGAAAUIoxRuHh4aeteTp5OS88PJzLeJBEgQIA4AeSkpJO2/fpZImiPOEkLuEBAHAWZ5YlyhNKo0ABAIBy27Vrl+655x516dJFl19+uQYOHKhNmzYpJydH3bt3dztepeESHgAAKBdrrYYOHaqxY8dq9uzZkqS1a9dq9+7d6tixo8vpKhczUAAA1BFZWVmKjIxUUFCQIiMjT31USnm9++67CgkJ0f3333/qWFRUlHr37n3aeTk5Oerdu7eio6MVHR2tVatWSZJ27typPn36KCoqSt27d9fKlStVXFyscePGqXv37urRo8cP9uOSpNzcXN1yyy3q2bOnbrnlFuXl5Z3X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vV717dtXQUF8RjtQF1CgAOAcrLVatWqVHMfR3LlzVVBQoB49euiZZ55RbGysmjdv7nZEAFWMAgUAP2LPnj2aPn26HMfRF198ocaNG+u+++6T1+tVTEwMm10CdRgFCgBKKS4u1pIlS+Q4jhYtWqSioiJdf/31Sk9P14gRI9SoUSO3IwKoBihQACApNzdX6enpSktL09atW9WyZUv95je/kcfjUdeuXd2OB6CaoUABqLOOHTumRYsWyXEcvfXWW5KkX/ziF/rb3/6mQYMGqX79+i4nBFBdUaAA1DkbNmyQz+dTZmam9u7dq4iICD322GMaP368IiIi3I4HoAagQAGoEw4fPqx58+bJcRytWrVKISEhGjx4sDwej/r376/g4GC3IwKoQShQAGota60+/vhjOY6jWbNm6fDhw7rsssv09NNPa/To0WrdurXbEQHUUBQoALXOd999pxkzZshxHH322WcKCwvTyJEj5fV69fOf/5ztBwCcNwoUgFrB7/dr2bJlchxHCxYsUGFhoa6++mo9//zzuueee9SkSRO3IwKoRShQAGq0HTt2KCMjQz6fT1u2bFF4eLji4+Pl8Xh0xRVXuB0PQC1FgQJQ4xQVFWnx4sVyHEeLFy+W3+/XTTfdpMmTJ2vo0KFq2LCh2xEB1HLnLFDGmDRJd0jaY63tXnIsSdIESd+WnDbRWru4skICgCRt3rxZaWlpysjI0K5du9S2bVs98sgjiouLU5cuXdyOB6AOKcsMVIakf0rKPON4irX26QpPBAClfP/995o/f74cx9Hy5csVHBys22+/XV6vV7fddpvq1WMiHUDVO+efPNbaFcaYyMqPAgD/Z+3atXIcRzNmzNCBAwfUpUsXPfHEExo7dqzatm3rdjwAddz5/NPtAWPMGEnZkn5nrd1/tpOMMfGS4iWxwy+An3TgwAHNnDlTjuNozZo1atCggYYPHy6v16s+ffooKCjI7YgAIEkq759G/5bURVKUpJ2SpvzYidbaqdbaGGttTKtWrco5HIDaylqrlStXnppZ+tWvfqXi4mL94x//0M6dOzVjxgz17duX8gSgWinXDJS1dvfJr40xL0h6tcISAagTdu/erczMTDmOo02bNqlx48YaO3asvF6voqOj2ewSQLVWrgJljGlrrd1ZcnOopPUVFwlAbVVcXKw333xTjuPolVde0fHjx3XDDTdo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\n",
"text/plain": [
"<Figure size 720x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Plot the trendline\n",
"trend = model.predict(np.linspace(0, 10).reshape((-1, 1)))\n",
"\n",
"plt.figure(figsize=(10, 7))\n",
"for label, label_class in df_test.groupby('labels'):\n",
" plt.scatter(label_class.values[:,0], label_class.values[:,1],\n",
" label=f'Class {label}', marker=label, c='k')\n",
"plt.plot(np.linspace(0, 10), trend, c='k', label='Trendline')\n",
"plt.legend()\n",
"plt.title(\"Linear Classifier\");"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>x</th>\n",
" <th>y</th>\n",
" <th>labels</th>\n",
" <th>Pred Labels</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>7</td>\n",
" <td>4</td>\n",
" <td>8</td>\n",
" <td>o</td>\n",
" <td>o</td>\n",
" </tr>\n",
" <tr>\n",
" <td>10</td>\n",
" <td>5</td>\n",
" <td>17</td>\n",
" <td>x</td>\n",
" <td>x</td>\n",
" </tr>\n",
" <tr>\n",
" <td>21</td>\n",
" <td>3</td>\n",
" <td>8</td>\n",
" <td>x</td>\n",
" <td>o</td>\n",
" </tr>\n",
" <tr>\n",
" <td>15</td>\n",
" <td>1</td>\n",
" <td>5</td>\n",
" <td>x</td>\n",
" <td>o</td>\n",
" </tr>\n",
" <tr>\n",
" <td>14</td>\n",
" <td>9</td>\n",
" <td>14</td>\n",
" <td>o</td>\n",
" <td>o</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" x y labels Pred Labels\n",
"7 4 8 o o\n",
"10 5 17 x x\n",
"21 3 8 x o\n",
"15 1 5 x o\n",
"14 9 14 o o"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Make predictions\n",
"y_pred = model.predict(df_test.x.values.reshape((-1, 1)))\n",
"pred_labels = []\n",
"\n",
"for _y, _y_pred in zip(df_test.y, y_pred):\n",
" if _y < _y_pred:\n",
" pred_labels.append('o')\n",
" else:\n",
" pred_labels.append('x')\n",
"df_test['Pred Labels'] = pred_labels\n",
"df_test.head()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlAAAAGrCAYAAAAPX6kCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdeXxU1eH+8eeEnSSALCL7IlFQNiPiFhVFQKMie0SQJTPYzUq1tbXab7WtWnfEVn9WTkLYCbKLcS+guAOlqCAGMGgIyg5DIEAy5/dHQhoxQAaS3Enyeb9eeZnce+feJzMBHs89c2KccwIAAEDJRXgdAAAAoKKhQAEAAISIAgUAABAiChQAAECIKFAAAAAhokABAACEiAIF4KSMMVcZYzZ4naMkjDFtjTHOGFO9jM7/gDHGFvl6oDHmO2PMAWPMRcaYL40xvcri2gDCi2EdKACSZIzJkOR3zr3jdZaTMcacJ+lRSddKqiFpi6QUSRMltZL0jaQazrnccsiySdK9zrlFZX0tAOGFESgAYam4USRjzLmSPpH0naQuzrn6koZK6iEpunwTSpLaSPryTE9SViNmAMoOBQrASRljehljMot8nWGM+Z0xZq0xZp8xJtUYU7vI/puNMWuMMXuNMR8aY7oW2Xe/MWaTMSZgjFlnjBlYZN8YY8wHxpgJxpjdkh4uJs5fJH3onLvXObdNkpxzG5xztzvn9haTfawxZn3B9TYbY35WZF9jY8ySgpy7jTHvG2MiCvb9wRizteBxG4wxvQu2P2yMmW6MqWWMOSCpmqT/FoxEHXturi/4PKLI97vLGDPHGNOwYN+xW40+Y8y3kv59Gi8NAA9RoACcjmGSbpDUTlJXSWMkyRgTKylZ0s8kNZL0L0mLjTG1Ch63SdJVkuorvwxNN8Y0K3LeSyVtlnS28m/THe96SXNDyLld0s2S6kkaK2lCQUZJ+q2kTElNJDWV9IAkZ4w5X9Jdki5xzkVL6icpo+hJnXOHnXNRBV92c86dW8y175Y0QNI1kppL2iPpheOOuUZSp4JrAKhAKFAATsfzzrks59xuSa9K6l6wfZykfznnPnHO5Tnnpkg6LOkySXLOvVLwuKBzLlVSuqSeRc6b5Zz7h3Mu1zl3qJjrNpK0raQhnXOvOec2uXzLJb2l/AInSUclNZPUxjl31Dn3vsufFJonqZakC4wxNZxzGc65TSW9ZhE/k/Sgcy7TOXdY+SNqQ467Xfewcy77BN8rgDBGgQJwOr4v8vlBScdGY9pI+m3BbbG9xpi9yp/Y3VySjDGjitze2yups6TGRc713Smuu0v5padEjDE3GmM+LrhFt1dSfJHrPSVpo6S3Cm7v3S9JzrmNkn6j/MKz3Rgz2xjTvKTXLKKNpAVFvtf1yi9nTYscc6rvF0CYokABKE3fSXrUOdegyEdd59wsY0wbSZOUf3uskXOugaQvJJkijz/V24LfkTS4JEEKbhvOk/S0pKYF10s7dj3nXMA591vnXHtJt0i699hcJ+fcTOdcnPJLkJP0RIm++x/7TtKNxz0XtZ1zW4scw9uggQqKAgWgqBrGmNpFPkJ9d9gkST83xlxq8kUaY24yxkRLilR+Ydgh5U/wVv4IVCgeknSFMeYpY8w5BefpUDCxu8Fxx9ZU/q24HZJyjTE3Sup7bGfBZPcOxhgjab/yR4fyjDHnG2OuKyhgOZIOFewL1UuSHi0ojjLGNDHG3Hoa5wEQhihQAIpKU35hOPbxcCgPds6tVP48qH8qf9L0RhVMMHfOrZP0jKSPJP0gqYukD0I8/yZJl0tqK+lLY8w+5Y8yrZQUOO7YgPIncs8pyHK7pMVFDolR/ojWgYJMLzrnlim/dD0uaafyb1WerfwJ5qGaWHC9t4wxAUkfK3+SPIBKgIU0AQAAQsQIFAAAQIgoUAAAACGiQAEAAISIAgUAABCicv0Flo0bN3Zt27Ytz0sCAACcllWrVu10zjUpbl+5Fqi2bdtq5cqV5XlJAACA02KM2XKifdzCAwAACBEFCgAAIEQUKAAAgBCV6xyo4hw9elSZmZnKycnxOgoqidq1a6tly5aqUaOG11EAAJWU5wUqMzNT0dHRatu2rfJ/pydw+pxz2rVrlzIzM9WuXTuv4wAAKinPb+Hl5OSoUaNGIZWnpUuXqm3btlq6dGkZJkNFZIxRo0aNGNEEAJQpzwuUpJDL080336wtW7bo5ptvpkThJxjJBACUtbAoUCV1rDwdPHhQknTw4EFKFAAAKHcVpkAdX56OKY0SFRUVdabxytSyZcv04YcfnnD/66+/rh49eqhTp07q2LGjfve730mSHn74YT399NOlluOKK64o/Py+++7ThRdeqPvuu08vvfSSpk6dGvL59u7dqxdffLHw66ysLA0ZMqRUsgIAUJY8n0ReEicqT8ccK1FLlizRtddeW87pTi43N1fVq//vac7Ly1O1atVCOseyZcsUFRX1owJzzBdffKG77rpLr732mjp27Kjc3Fy9/PLLZ5y7OEVL3L/+9S/t2LFDtWrVOu3zHStQv/zlLyVJzZs319y5c884JwAAZS3sR6BOVZ6OKY2RqGXLlqlXr14aMmSIOnbsqBEjRsg5J0n67LPPdMUVV6hbt27q2bOnAoGAcnJyNHbsWHXp0kUXXXRR4bVTUlI0dOhQ3XLLLerbt6+WLVuma6+9Vrfffru6dOkiSZo+fbp69uyp7t2762c/+5ny8vIkSW+88YZiY2PVrVs39e7dWxkZGXrppZc0YcIEde/eXe+///6PMj/55JN68MEH1bFjR0lS9erVCwtJUZMmTdIll1yibt26afDgwYXP5yuvvKLOnTurW7duuvrqqyVJX375ZWG2rl27Kj09XdL/Rur69++v7OxsXXrppUpNTf3RSNfGjRt1/fXXq1u3boqNjdWmTZt04MAB9e7dW7GxserSpYsWLVokSbr//vu1adMmde/eXffdd58yMjLUuXNnSTrpczto0CDdcMMNiomJ0e9///vTfr0BADhtzrly+7j44ovd8datW1f4+fjx490111xT+NG1a1cXERHhJJX4IyIiwnXt2rXwHOPHj//JNY8XGRnpnHNu6dKlrl69eu67775zeXl57rLLLnPvv/++O3z4sGvXrp379NNPnXPO7du3zx09etQ9/fTTbsyYMc4559avX+9atWrlDh065CZPnuxatGjhdu3aVXjeunXrus2bNxd+zzfffLM7cuSIc865X/ziF27KlClu+/btrmXLloXHHXv8Qw895J566qlis1900UVuzZo1xe4r+ridO3cWbn/wwQfd888/75xzrnPnzi4zM9M559yePXucc87dddddbvr06c455w4fPuwOHjz4o+fp+M+LXqdnz55u/vz5zjnnDh065LKzs93Ro0fdvn37nHPO7dixw5177rkuGAy6b775xl144YWF5yn69cme23bt2rm9e/e6Q4cOudatW7tvv/32J9970Z8rAABOh6SV7gSdJqxv4W3YsEHBYDCkxwSDQW3YsEGXXXbZaV2zZ8+eatmypSSpe/fuysjIUP369dWsWTNdcsklkqR69epJklasWKFf//rXkqSOHTuqTZs2+vrrryVJffr0UcOGDX903mPrEr377rtatWpV4fkOHTqks88+Wx9//LGuvvrqwuOKPv5MffHFF/rTn/6kvXv36sCBA+rXr58k6corr9SYMWM0bNgwDRo0SJJ0+eWX69FHH1VmZqYGDRqkmJiYEl0jEAho69atGjhwoKT8BS2l/MVSH3jgAb333nuKiIjQ1q1b9cMPP5z0XCd7bnv37q369etLki644AJt2bJFrVq1CvEZAQDg9IVVgXruued+9HVJb98VVbdu3TOaC1V0Tk+1atWUm5sr51yxb413Bbf3ihMZGXnCr51zGj16tP7+97//6JjFixeH/Bb8Cy+8UKtWrVK3bt1OetyYMWO0cOFCdevWTSkpKVq2bJkk6aWXXtInn3yi1157Td27d9eaNWt0++2369JLL9Vrr72mfv36yVqr66677pRZTvR8zJgxQzt27NCqVatUo0YNtW3b9pTrNJ3suS3uNQIAoDyF9Ryoa6+9VkuWLFHdunVLdPyZlqcT6dixo7KysvTZZ59Jyh9pyc3N1dVXX60ZM2ZIkr7++mt9++23Ov/88095vt69e2vu3Lnavn27JGn37t3asmWLLr/8ci1fvlzffPNN4XZJio6OViAQKPZc9913nx577LHC0ZlgMKhnn332J8cFAgE1a9ZMR48eLcwsSZs2bdKll16qv/71r2rcuLG+++47bd68We3bt9fdd9+t/v37a+3atSV6nurVq6eWLVtq4cKFkqTDhw/r4MGD2rdvn84++2zVqFFDS5cu1ZYtW075fZ3ucwsAp8s5pwULFvzkf+BOtB1VW1gXKKnkJaqsypMk1axZU6mpqfr1r3+tbt26qU+fPsrJydEvf/lL5eXlqUuXLkpISFBKSkqJ3pV2wQUX6JFHHlHfvn3VtWtX9enTR9u2bVOTJk308ssva9CgQerWrZsSEhIkSbfccosWLFhQ7CTyrl276rnnntPw4cPVqVMnde7cWdu2bfvJNf/2t7/p0ksvVZ8+fQonnEv5BaxLly7q3Lmzrr76anXr1k2pqanq3Lmzunfvrq+++kqjRo0q8XM1bdo0Pf/88+ratauuuOIKff/99xoxYoRWrlypHj16aMaMGYXXb9Soka688kp17txZ991334/Oc7rPLQCcroULF2rQoEG65557CsuSc0733HOPBg0aVPg/h4AkmfJs1D169HArV6780bb169erU6dOp3zsyW7nlWV5QsVU0p8rADjmWFmaOHGixo8frwkTJvzka37TQdVijFnlnOtR3L6wmgN1MsdGoo4vUZQnAEBpMMZowoQJkqSJEydq4sSJkkR5QrHC/hZeUcffzqM8AQBKU9ESdQzlCcUJiwIVym3EYyWqTZs2lCcUi4meAE7Xsdt4RRWdEwUc43mBql27tnbt2hVyicrIyKA84Secc9q1a1fhGlQAUFLHz4EKBoMaP368Jk6cSInCT3g+B6ply5bKzMzUjh07vI6CSqJ27dqFi6ECQEktXLjwJxPGi86JuuaaawoXCgY8fxceAADhwDmnhQsXasCAAT+a83Si7aj8TvYuPAoUAABAMU5WoDyfAwUAAFDRUKAAAABCRIECAAAIEQUKAAAgRBQoAACAEFGgAAAAQkSBAgAACBEFCgAAIEQUKAAAgBBRoAAAAEJEgQIAAAgRBQoAACBEFCgAAIAQUaAAAABCRIECAAAIEQUKAAAgRBQoAACAEFGgAAAAQkSBAgAACBEFCgAAIEQUKAAAgBBRoAAAAEJ0ygJljGlljFlqjFlvjPnSGDO+YPvDxpitxpg1BR/xZR8XAADAe9VLcEyupN8651YbY6IlrTLGvF2wb4Jz7umyiwcAABB+TlmgnHPbJG0r+DxgjFkvqUVZBwMAAAhXIc2BMsa0lXSRpE8KNt1ljFlrjEk2xpx1gsfcaYxZaYxZuWPHjjMKCwAAEA5KXKCMMVGS5kn6jXNuv6T/J+lcSd2VP0L1THGPc8697Jzr4Zzr0aRJk1KIDAAA4K0SFShjTA3ll6cZzrn5kuSc+8E5l+ecC0qaJKln2cUEAAAIHyV5F56RlCRpvXPu2SLbmxU5bKCkL0o/HgAAQPgpybvwrpR0h6TPjTFrCrY9IGm4Maa7JCcpQ9LPyiQhAABAmCnJu/BWSDLF7Eor/TgAAADhj5XIAQAAQkSBAgAACBEFCgAAIEQUKAAAgBBRoAAAAEJEgQIAAAgRBQoAACBEFCgAAIAQUaAAAABCRIECAAAIEQUKAAAgRBQoAACAEFGgAAAAQkSBAgAACBEFCgAAIEQUKAAAgBBRoAAAAEJEgQIAAAgRBQoAACBEFCgAAIAQUaAAAABCRIECAAAIEQUKAAAgRBQoAACAEFGgAAAAQkSBAgAACBEFCgAAIEQUKAAAgBBRoAAAAEJEgQIAAAgRBQoAACBEFCgAAIAQUaAAAABCRIECAAAIEQUKAAAgRBQoAACAEFGgAAAAQkSBAgAACBEFCgAAIEQUKAAAgBBRoAAAAEJEgQIAAAgRBQoAACBEFCgAAIAQUaAAAABCRIECAAAVgnPO6wiFKFAAACBs5eTkaObMmbruuus0depUr+MUqu51AAAAgOOtXbtW1lpNnz5de/bsUfv27VW9evjUlvBJAgAAqrRAIKDZs2fLWqtPP/1UNWvW1ODBg+X3+9WrVy9FRITPjTMKFAAA8IxzTh9//LGstUpNTVV2drY6d+6s5557TiNHjlSjRo28jlgsChQAACh3O3fu1LRp02St1bp16xQZGanhw4fL7/erZ8+eMsZ4HfGkKFAAAKBcBINBvfvuu7LWasGCBTp69KguvfRSWWs1bNgwRUdHex2xxChQAACgTGVmZiolJUVJSUnKyMhQw4YN9atf/Uo+n0+dO3f2Ot5poUABAIBSd/ToUb322muy1ur1119XMBjU9ddfr8cff1wDBgxQrVq1vI54RihQAACg1KSnpyspKUkpKSn64Ycf1Lx5c/3xj39UYmKi2rdv73W8UkOBAgAAZ+TQoUOaN2+erLVavny5qlWrpptuuknjxo3TDTfcEFbrN5WWyvcdAQCAcrFmzZrCxS737dunc889V3//+981evRoNWvWzOt4ZYoCBQAASmzfvn2aNWuWrLVatWqVatWqpSFDhsjv9+vqq68Oq8UuyxIFCgAAnJRzTh988IGstZozZ44OHTqkLl266Pnnn9eIESPUsGFDryOWOwoUAAAo1vbt2zV16lRZa7VhwwZFRUVp5MiRGjdunHr06BH2i12WJQoUAAAolJeXp7ffflvWWi1atEi5ubm64oorlJycrKFDhyoqKsrriGGBAgUAAPTtt98qOTlZycnJ+u6779SoUSPdfffd8vl8uuCCC7yOF3YoUAAAVFFHjhzRq6++Kmut3nzzTUlSnz599Mwzz6h///4VfrHLskSBAgCgivnqq6+UlJSkKVOmaMeOHWrRooX+9Kc/KTExUW3btvU6XoVAgQIAoArIzs7W3LlzZa3VihUrVL16dfXv319+v199+/ZVtWrVvI5YoVCgAACopJxzWr16tay1mjlzpvbv36+YmBg98cQTGjVqlM455xyvI1ZYFCgAACqZPXv2aObMmbLWas2aNapdu7aGDh0qv9+vq666qkovP1BaKFAAAFQCzjm9//77mjRpkubOnaucnBx1795dL7zwgm6//XY1aNDA64iVyikLlDGmlaSpks6RFJT0snNuojGmoaRUSW0lZUga5pzbU3ZRAQDA8X744QdNmTJF1lqlp6erXr16Gjt2rPx+v2JjY72OVyoCgYBSU1OVnp6umJgYJSQkKDo62tNMxjl38gOMaSapmXNutTEmWtIqSQMkjZG02zn3uDHmfklnOef+cLJz9ejRw61cubJ0kgMAUEXl5eXpzTfflLVWr776qnJzc3XVVVfJ7/dryJAhqlu3rtcRS82KFSsUHx+vYDCo7OxsRUZGKiIiQmlpaYqLiyvTaxtjVjnnehS771QFqpiTLZL0z4KPXs65bQUla5lz7vyTPZYCBQDA6cvIyNDkyZOVnJyszMxMNWnSRGPGjFFiYqI6duzodbxSFwgE1KJFCwUCgZ/si46OVlZWVpmujH6yAhXSHChjTFtJF0n6RFJT59w2SSooUWefYU4AAHCcw4cPa/HixbLW6u2335Yk9e3bV88995xuueUW1axZ0+OEZSc1NVXBYLDYfcFgUKmpqfL5fOWcKl+JC5QxJkrSPEm/cc7tL+kMfmPMnZLulKTWrVufTkYAAKqcdevWKSkpSVOnTtXOnTvVunVrPfTQQxo7dmyV+fc0PT1d2dnZxe7Lzs7Wxo0byznR/5SoQBljaii/PM1wzs0v2PyDMaZZkVt424t7rHPuZUkvS/m38EohMwAAlVJ2drbmzJkja60+/PBD1ahRQ7feeqv8fr+uv/76KrfYZUxMjCIjI4stUZGRkerQoYMHqfJFnOoAkz/UlCRpvXPu2SK7FksaXfD5aEmLSj8eAACVm3NOn332mX72s5+pWbNmSkxM1O7du/X0008rMzNTr7zyivr161flypMkJSQkKCKi+KoSERGhhISEck70PyUZgbpS0h2SPjfGrCnY9oCkxyXNMcb4JH0raWjZRAQAoPLZvXu3ZsyYIWut1q5dqzp16ighIUF+v19XXHEFi10qf6J4WlraCd+FV5YTyE/llAXKObdC0olexd6lGwcAgMorGAxq+fLlstZq3rx5Onz4sHr06KGXXnpJt912m+rXr+91xLATFxenrKwspaamauPGjerQoYMSEhI8LU8SK5EDAFDmtm3bppSUFCUlJWnTpk1q0KCBxo0bJ5/Pp+7du3sdL+xFRUV59m67E6FAAQBQBnJzc/XGG2/IWqslS5YoLy9PvXr10l/+8hcNGjRIderU8ToizgAFCgCAUrR582YlJydr8uTJysrKUtOmTfW73/1OPp9PMTExXsdDKaFAAQBwhnJycrRw4UJZa/Xuu+8qIiJCN954o1544QXddNNNqlGjhtcRUcooUAAAnKYvvvhC1lpNmzZNu3fvVtu2bfW3v/1NY8aMUcuWLb2OhzJEgQIAIASBQECpqamy1uqTTz5RzZo1NXDgQPn9fl133XUnXLcIlQsFCgCAU3DO6ZNPPpG1VrNnz1Z2drY6deqkZ599VnfccYcaN27sdUSUMwoUAAAnsGvXLk2bNk3WWn355ZeqW7eubrvtNvn9fl122WUsdlmFUaAAACgiGAxq6dKlstZq/vz5OnLkiHr27KmXX35ZCQkJqlevntcREQYoUAAASNq6dWvhYpfffPONzjrrLP385z+Xz+dT165dvY6HMEOBAgBUWUePHlVaWpqstUpLS1MwGFSvXr30yCOPaNCgQapdu7bXERGmKFAAgCpn48aNSkpKUkpKir7//nudc845+sMf/qDExER16NDB63ioAChQAIAqIScnR/Pnz5e1VkuXLlVERIRuuukm+f1+xcfHq3p1/klEyfHTAgCo1NauXStrraZPn649e/aoffv2evTRRzV69Gi1aNHC63iooChQAIBKZ//+/Zo9e7astfrss89Us2ZNDR48WD6fT9deey2LXeKMUaAAAJWCc04fffSRrLVKTU3VwYMH1blzZ02cOFEjRoxQo0aNvI6ISoQCBQCo0Hbs2FG42OX69esVFRWlESNGyO/365JLLmGxS5QJChQAoMIJBoN69913Za3VggULdPToUV166aWy1iohIUFRUVFeR0QlR4ECAFQYmZmZmjx5spKSkrRlyxY1bNhQv/rVr+Tz+dS5c2ev46EKoUABAMLa0aNHtWTJEllr9cYbbygYDOr666/XE088oQEDBqhWrVpeR0QVRIECAISlr7/+unCxy+3bt6t58+Z64IEHlJiYqHbt2nkdD1UcBQoAEDYOHTqkefPmyVqr5cuXq1q1arrlllvk9/vVr18/FrtE2OAnEQDguTVr1hQudrlv3z516NBBjz/+uEaPHq1zzjnH63jAT1CgAACe2Ldvn2bNmiVrrVatWqXatWtryJAh8vv9uvrqq1l+AGGNAgUAKDfOOX3wwQey1mrOnDk6dOiQunXrpn/+85+6/fbbddZZZ3kdESgRChQAoMxt375dU6dOlbVWGzZsUHR0tEaPHi2/36/Y2FhGm1DhUKAAAGUiLy9Pb7/9tqy1WrRokXJzc3XllVfq/vvv19ChQxUZGel1ROC0UaAAAKVqy5Ytmjx5spKTk/Xdd9+pcePGGj9+vHw+nzp16uR1PKBUUKAAAGfsyJEjWrx4say1euuttyRJffv21bPPPqv+/furZs2aHicEShcFCgBw2r766itZazV16lTt2LFDrVq10p///GeNHTtWbdq08ToeUGYoUACAkGRnZ+uVV16RtVYffPCBqlevrltvvVV+v199+vRRtWrVvI4IlDkKFADglJxzWr16tay1mjlzpvbv36/zzz9fTz31lO644w41bdrU64hAuaJAAQBOaM+ePZo5c6astVqzZo3q1KmjoUOHyu/3Ky4ujuUHUGVRoAAAP+Kc03vvvSdrrebOnaucnBzFxsbqxRdf1PDhw9WgQQOvIwKeo0ABACRJ33//vaZMmaKkpCSlp6erXr16Gjt2bOFilwD+hwIFAFVYbm6u3nzzTVlr9eqrryovL09XXXWV/vSnP2nIkCGqW7eu1xGBsESBAoAq6JtvvlFycrImT56srVu3qkmTJrr33nvl8/l0/vnnex0PCHsRXgcAgFA457RgwQI550q0Hf9z+PBhzZkzR3369FH79u316KOPqmvXrpo3b54yMzP15JNPUp6AEqJAAahQFi5cqEGDBumee+4pLEvOOd1zzz0aNGiQFi5c6HHC8PPll1/q3nvvVYsWLZSQkKCvv/5af/nLX5SRkaG0tDQNGjSIlcKBEHELD0CFMmDAAI0fP14TJ06UJE2YMEH33HOPJk6cqPHjx2vAgAEeJwwPBw4c0Jw5c2St1UcffaQaNWpowIAB8vv96t27N4tdAmeIAgWgQjHGaMKECZKkiRMnFhap8ePHa8KECVV6XSLnnD777DNZazVr1iwdOHBAHTt21DPPPKM77rhDTZo08ToiUGmY8pwv0KNHD7dy5cpyux6Ayss5p4iI/81CCAaDVbY87d69W9OnT5e1Vp9//rnq1q2rYcOGye/364orrqiyzwtwpowxq5xzPYrbxxwoABXOsTlPRRWdE1UVBINB/fvf/9btt9+u5s2ba/z48apdu7ZeeuklZWVlafLkybryyispT0AZ4RYegArlWHk6Nuep6BwoSZX+Nl5WVpZSUlKUlJSkzZs3q0GDBho3bpx8Pp+6d+/udTygyqBAAahQFi5c+KPydPycqGuuuUYDBw70OGXpys3NVVpamqy1SktLU15ennr16qW//vWvGjRokOrUqeN1RKDKYQ4UgArFOaeFCxdqwIABPxppOtH2imzTpk2Fi11u27ZNTZs21dixY5WYmKiYmBiv4wGV3snmQFGgACCM5OTkaMGCBbLW6o81ovoAAB9sSURBVN///rciIiIUHx8vv9+v+Ph41ahRw+uIQJVxsgLFLTwACAOff/65rLWaNm2a9uzZo3bt2umRRx7R6NGj1bJlS6/jATgOBQoAPBIIBDR79mxZa/Xpp5+qZs2aGjhwoPx+v6677rofLdMAILxQoACgHDnn9Mknn8haq9mzZys7O1sXXnihJkyYoJEjR6px48ZeRwRQAhQoACgHO3fuLFzs8ssvv1RkZKSGDx8uv9+vnj17VpqJ70BVQYECgDJybLFLa60WLFigI0eO6NJLL9WkSZOUkJCg6OhoryMCOE0UKAAoZZmZmYWLXWZkZKhhw4b6xS9+IZ/Ppy5dungdD0ApoEABQCk4evTojxa7DAaD6t27t/7+979rwIABql27ttcRAZQiChQAnIH09HQlJycrJSVF33//vZo3b64//vGPSkxMVPv27b2OB6CMUKAAIESHDh3S/PnzZa3VsmXLVK1aNd10003y+/268cYbVb06f7UClR1/ygGghP773//KWqvp06dr7969Ovfcc/XYY49p9OjRat68udfxAJQjChQAnMT+/fs1a9YsWWu1cuVK1apVS4MHD5bf79c111zDYpdAFUWBAoDjOOf04YcfylqrOXPm6ODBg+rSpYuef/55jRgxQg0bNvQ6IgCPUaAAoMCOHTs0depUWWv11VdfKSoqSiNGjJDf79cll1zCYpcAClGgAFRpwWBQ77zzjiZNmqRFixbp6NGjuvzyy5WUlKRhw4YpKirK64gAwhAFCkCV9N1332ny5MlKTk7Wli1b1KhRI911113y+Xy68MILvY4HIMxRoABUGUeOHNGSJUtkrdUbb7wh55z69OmjJ598Urfeeqtq1arldUQAFQQFCkClt2HDBiUlJWnKlCnavn27WrRooQcffFCJiYlq166d1/EAVEAUKACV0sGDBzV37lxZa/X++++revXquuWWW+T3+9WvXz9Vq1bN64gAKjAKFIBKZfXq1bLWasaMGdq/f79iYmL0xBNPaNSoUTrnnHO8jgegkqBAAajw9u7dq5kzZ8paq//85z+qXbu2hgwZonHjxumqq65i+QEApY4CBaBCcs5pxYoVmjRpkl555RXl5OSoW7du+sc//qERI0borLPO8joigEqMAgWgQvnhhx8KF7v8+uuvVa9ePY0ZM0Z+v1+xsbGMNgEoF6csUMaYZEk3S9runOtcsO1hSeMk7Sg47AHnXFpZhQRQteXl5emtt96StVaLFy9Wbm6u4uLi9MADD2jIkCGKjIz0OiKAKqYkI1Apkv4paepx2yc4554u9UQAUCAjI6NwscvMzEw1adJEv/nNb+Tz+dSxY0ev4wGowk5ZoJxz7xlj2pZ9FACQDh8+rMWLF8taq7fffluS1LdvX02YMEH9+/dXzZo1PU4IAGc2B+ouY8woSSsl/dY5t6e4g4wxd0q6U5Jat259BpcDUJmtW7dOSUlJmjp1qnbu3KlWrVrpz3/+s8aOHas2bdp4HQ8AfsQ45059UP4I1JIic6CaStopyUn6m6RmzrnEU52nR48ebuXKlWeSF0Alkp2drTlz5shaqw8//FDVq1fXrbfeKr/frz59+rDYJQBPGWNWOed6FLfvtEagnHM/FDn5JElLTjMbgCrGOaeVK1fKWqtZs2YpEAjo/PPP11NPPaVRo0bp7LPP9joiAJzSaRUoY0wz59y2gi8HSvqi9CIBqIz27NmjGTNmyFqr//73v6pTp46GDRsmn8+nuLg4lh8AUKGUZBmDWZJ6SWpsjMmU9JCkXsaY7sq/hZch6WdlmBFABeWc0/Lly2Wt1dy5c3X48GFdfPHF+n//7/9p+PDhql+/vtcRAeC0lORdeMOL2ZxUBlkAVBLff/+9UlJSlJSUpI0bN6p+/fry+/3y+Xy66KKLvI4HAGeMlcgBlIrc3Fy9+eabstbq1VdfVV5enq655ho99NBDGjx4sOrUqeN1RAAoNRQoAGfkm2++UXJysiZPnqytW7eqadOm+u1vfyufz6fzzjvP63gAUCYoUABCdvjwYS1cuFDWWr3zzjuKiIjQjTfeqH/+85+66aabVKNGDa8jAkCZokABKLEvv/xS1lpNmzZNu3btUps2bfTXv/5VY8aMUatWrbyOBwDlhgIF4KQOHDig1NRUWWv18ccfq0aNGho4cKD8fr969+6tiIgIryMCQLmjQAH4CeecPvvsM02aNEmzZ8/WgQMH1KlTJz3zzDO644471KRJE68jAoCnKFAACu3evVvTp0+XtVaff/656tatq9tuu01+v1+XXXYZi10CFUggEFBqaqrS09MVExOjhIQERUdHex2r0qBAAVVcMBjUsmXLZK3V/PnzdfjwYV1yySX617/+pdtuu0316tXzOiKAEK1YsULx8fEKBoPKzs5WZGSk7r33XqWlpSkuLs7reJUCBQqoorKysgoXu9y8ebMaNGigO++8Uz6fT926dfM6HoDTFAgEFB8fr0AgULgtOztbkhQfH6+srCxFRUV5Fa/SYPYnUIXk5uZq8eLF6t+/v1q1aqUHH3xQrVu31vTp05WVlaXnn3+e8gRUcKmpqQoGg8XuCwaDSk1NLedElRMjUEAVsGnTJiUlJSklJUXbtm3TOeeco9///vdKTExUTEyM1/EAlKL09PTCEafjZWdna+PGjeWcqHKiQAGVVE5OjubPny9rrZYuXaqIiAjFx8fL7/crPj6exS6BSiomJkaRkZHFlqjIyEh16NDBg1SVj3HOldvFevTo4VauXFlu1wOqorVr18paq+nTp2vPnj1q166dfD6fxowZoxYtWngdD0AZCwQCatGixY/mQB0THR3NHKgQGGNWOed6FLePESigEggEApo9e7astfr0009Vs2ZNDRo0SD6fT9dddx2LXQJVSHR0tNLS0n7yLryIiAilpaVRnkoJBQqooJxz+vjjj2WtVWpqqrKzs3XhhRfqueee08iRI9WoUSOvIwLwSFxcnLKyspSamqqNGzeqQ4cOSkhIoDyVIgoUUMHs3LlT06ZNk7VW69atU2RkpIYPHy6/36+ePXuy2CUASVJUVJR8Pp/XMSotChRQAQSDQb377ruy1mrBggU6evSoLrvsMllrNWzYMFYXBoByRoECwlhmZqYmT56s5ORkZWRkqGHDhvrlL38pn8+nLl26eB0PAKosChQQZo4ePaolS5bIWqs33nhDwWBQvXv31uOPP65bb71VtWvX9joiAFR5FCggTKSnp8taqylTpuiHH35Q8+bN9cc//lGJiYlq37691/EAAEVQoAAPHTp0SPPmzZO1VsuXL1e1atV08803y+/364YbblD16vwRBYBwxN/OgAfWrFlTuNjlvn37dO655+qxxx7TmDFj1KxZM6/jAQBOgQIFlJN9+/Zp1qxZstZq1apVqlWrloYMGSK/36+rr76axS4BoAKhQAFlyDmnDz74QNZazZkzR4cOHVLXrl31j3/8QyNGjNBZZ53ldUQAwGmgQAFlYPv27Zo6daqstdqwYYOio6M1atQo+f1+XXzxxSx2CQAVHAUKKCV5eXl65513NGnSJC1atEi5ubm64oorlJycrGHDhikyMtLriACAUkKBAs7Qt99+W7jY5bfffqvGjRvr7rvvls/n0wUXXOB1PABAGaBAAafhyJEjevXVV2Wt1ZtvvilJ6tOnj55++mn1799ftWrV8jghAKAsUaCAEGzYsEFJSUmaMmWKtm/frpYtW+r//u//NHbsWLVt29breACAckKBAk7h4MGDmjt3rqy1ev/991W9enX1799fPp9P/fr1U7Vq1byOCAAoZxQo4ARWr14ta61mzJih/fv367zzztOTTz6pUaNGqWnTpl7HAwB4iAIFFLF3717NnDlT1lr95z//Ue3atTVs2DD5/X7FxcWx/AAAQBIFCpBzTu+//76stXrllVeUk5Oj7t2764UXXtDtt9+uBg0aeB0RABBmKFCosn744QdNmTJFSUlJ+vrrr1WvXj2NGTNG48aNU2xsrNfxAABhjAKFKiUvL09vvvmmrLV69dVXlZubq6uuukoPPvighgwZorp163odEQBQAVCgUCVkZGQoOTlZkydPVmZmppo0aaLf/OY38vl86tixo9fxAAAVDAUKldbhw4e1ePFiWWv19ttvS5L69eun5557Trfccotq1qzpcUIAQEVFgUKls27dOiUlJWnq1KnauXOnWrVqpT//+c9KTExU69atvY4HAKgEKFCoFLKzszVnzhxZa/Xhhx+qevXqGjBggPx+v66//noWuwQAlCoKFCos55xWrlwpa61mzZqlQCCg888/X0899ZRGjRqls88+2+uIAIBKigKFCmf37t2aMWOGrLVau3at6tSpU7jY5ZVXXslilwCAMkeBQoUQDAa1fPlyWWs1b948HT58WBdffLFefPFF3X777apfv77XEQEAVQgFCmFt27ZtSklJUVJSkjZt2qT69evL7/fL5/Ppoosu8joeAKCKokAh7OTm5ur111+XtVavvfaa8vLydM011+jhhx/W4MGDVadOHa8jAgCqOAoUwsbmzZsLF7vMyspS06ZN9bvf/U6JiYk677zzvI4HAEAhChQ8lZOTo4ULF2rSpEn697//rYiICN1www164YUXdNNNN6lGjRpeRwQA4CcoUPDE559/rqSkJE2bNk27d+9W27Zt9be//U1jxoxRy5YtvY4HAMBJUaBQbgKBgFJTU2Wt1SeffKKaNWtq4MCB8vv9uu666xQREeF1RAAASoQChTLlnNMnn3wia61mz56t7OxsXXDBBZowYYJGjhypxo0bex0RAICQUaBQJnbt2qVp06bJWqsvv/xSdevWVUJCgsaNG6fLLruMxS4BABUaBQqlJhgMaunSpbLWav78+Tpy5Ih69uypl19+WQkJCapXr57XEQEAKBUUKJyxrVu3Fi52+c033+iss87Sz3/+c/l8PnXt2tXreAAAlDoKFE5Lbm6u0tLSNGnSJKWlpSkYDOq6667To48+qoEDB6p27dpeRwQAoMxQoBCSjRs3Kjk5WSkpKdq2bZuaNWumP/zhD/L5fDr33HO9jgcAQLmgQOGUcnJyNH/+fFlrtXTpUlWrVk033XST/H6/brzxRlWvzo8RAKBq4V8+nNDatWtlrdX06dO1Z88etW/fXo899phGjx6t5s2bex0PAADPUKDwI/v379fs2bNlrdVnn32mmjVravDgwfL7/erVqxeLXQIAIAoUlL/Y5UcffSRrrVJTU3Xw4EF17txZEydO1IgRI9SoUSOvIwIAEFYoUFXYzp07Cxe7XLdunaKiojRixAj5/X5dcsklLHYJAMAJUKCqmGAwqHfffVfWWi1YsEBHjx7V5ZdfrqSkJA0bNkxRUVFeRwQAIOxRoKqIzMxMTZ48WcnJycrIyFCjRo101113yefz6cILL/Q6HgAAFQoFqhI7evSolixZImut3njjDQWDQV1//fV64okndOutt6pWrVpeRwQAoEKiQFVCX3/9tZKSkpSSkqLt27erefPmeuCBB5SYmKh27dp5HQ8AgAqPAlVJHDx4UPPmzZO1Vu+9956qVaumW265RX6/X/369WOxSwAAShH/qlZw//nPf2St1YwZM7Rv3z516NBBjz/+uEaPHq1zzjnH63gAAFRKFKgKaN++fZo1a5YmTZqk1atXq1atWho8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\n",
"text/plain": [
"<Figure size 720x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10, 7))\n",
"for idx, label_class in df_test.iterrows():\n",
" if label_class.labels != label_class['Pred Labels']:\n",
" label = 'D'\n",
" s=70\n",
" else:\n",
" label = label_class.labels\n",
" s=50\n",
" plt.scatter(label_class.values[0], label_class.values[1],\n",
" label=f'Class {label}', marker=label, c='k', s=s)\n",
" \n",
"plt.plot(np.linspace(0, 10), trend, c='k', label='Trendline')\n",
"plt.title(\"Linear Classifier\");\n",
"\n",
"incorrect_class = mlines.Line2D([], [], color='k', marker='D',\n",
" markersize=10, label='Incorrect Classification');\n",
"plt.legend(handles=[incorrect_class]);"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}