Commit 3d77b222 authored by Carsten Eie Frigaard's avatar Carsten Eie Frigaard
Browse files

update

parent 3a90cc65
%% Cell type:markdown id: tags:
# ITMAL Exercise
## The E.T. and Gradient Descent for Linear Regression
<img src="https://itundervisning.ase.au.dk/GITMAL/L05/Figs/et.jpg" alt="WARNING: image could not be fetched" style="height:250px">
The Good News is that aliens are here, yes, really! The Bad News is that You are assigned teacher for one Extra-Terrestial _creature_.
Your task is to create a document (journal) for the _creature_, explaining all about Gradient Descent related to the linear regression model.
The _creature_ needs about four, max. six normal pages of text otherwise it becomes very grumpy like a Gremlin.
However, the _creature_ likes reading code and math and examining beutifull plots, so code sections, math and plots do not count into the max normal-page limit.
As you job of being an E.T.-teacher, You must cover Gradient Decent for a simple Linear Regression model with at least the following concepts:
* Linear Regression model prediction in vectorized form
* MSE cost function for a Linear Regression model
* Closed-form solution (normal equation)
* Numerical gradient decent
* Batch Gradient Descent
* Stochastic Gradient Descent
* Learning rates
Feel free to add additional Gradient Decent concepts, but remember to keep the text You submit below max. six pages (exluding plot, code and math).
Note that you could peek into the other notebooks for this lesson, copying math, code, and plots from these are allowed.
(Once submitted as a hand-in in Brightspace, I will forward it to the E.T., but expect no direct feedback from the _creature_..)
%% Cell type:code id: tags:
``` python
# TODO: Your GD documentation for the E.T.
```
%% Cell type:markdown id: tags:
REVISIONS| |
---------| |
2021-0926| CEF, initial.
......
%% Cell type:markdown id: tags:
# ITMAL Exercise
## Gradient Descent Methods and Training
Finding the optimal solution in one-step, via
$$
\newcommand\rem[1]{}
\rem{ITMAL: CEF def and LaTeX commands, remember: no newlines in defs}
\newcommand\eq[2]{#1 &=& #2\\}
\newcommand\ar[2]{\begin{array}{#1}#2\end{array}}
\newcommand\ac[2]{\left[\ar{#1}{#2}\right]}
\newcommand\st[1]{_{\mbox{\scriptsize #1}}}
\newcommand\norm[1]{{\cal L}_{#1}}
\newcommand\obs[2]{#1_{\mbox{\scriptsize obs}}^{\left(#2\right)}}
\newcommand\diff[1]{\mbox{d}#1}
\newcommand\pown[1]{^{(#1)}}
\def\pownn{\pown{n}}
\def\powni{\pown{i}}
\def\powtest{\pown{\mbox{\scriptsize test}}}
\def\powtrain{\pown{\mbox{\scriptsize train}}}
\def\bX{\mathbf{M}}
\def\bX{\mathbf{X}}
\def\bZ{\mathbf{Z}}
\def\bw{\mathbf{m}}
\def\bx{\mathbf{x}}
\def\by{\mathbf{y}}
\def\bz{\mathbf{z}}
\def\bw{\mathbf{w}}
\def\btheta{{\boldsymbol\theta}}
\def\bSigma{{\boldsymbol\Sigma}}
\def\half{\frac{1}{2}}
\newcommand\pfrac[2]{\frac{\partial~#1}{\partial~#2}}
\newcommand\dfrac[2]{\frac{\mbox{d}~#1}{\mbox{d}#2}}
\bw^* ~=~ \left( \bX^\top \bX \right)^{-1} \bX^\top \by
$$
has its downsides: the scaling problem of the matrix inverse. Now, let us look at a numerical solution to the problem of finding the value of $\bw$ (aka $\btheta$) that minimizes the objective function $J$.
Again, ideally we just want to find places, where the (multi-dimensionally) gradient of $J$ is zero (here using a constant factor $\frac{2}{m}$)
$$
\ar{rl}{
\nabla_\bw J(\bw) &= \frac{2}{m} \bX^\top \left( \bX \bw - \by \right)\\
}
$$
and numerically we calculate $\nabla_{\bw} J$ for a point in $\bw$-space, and then move along in the opposite direction of this gradient, taking a step of size $\eta$
$$
\bw^{(step~N+1)} = \bw^{(step~N)} - \eta \nabla_{\bw} J(\bw)
$$
That's it, pretty simple, right (apart from numerical stability, problem with convergence and regularization, that we will discuss later).
So, we begin with some initial $\bw$, and iterate via the equation above, towards places, where $J$ is smaller, and this can be illustrated as
<img src="Figs/minimization_gd.png" style="height:240px">
<img src="https://itundervisning.ase.au.dk/GITMAL/L05/Figs/minimization.png" alt="WARNING: image could not be fetched" style="height:240px">
If we hit the/a global minimum or just a local minimum (or in extremely rare cases a local saddle point) is another question when not using a simple linear regression model: for non-linear models we will in general not see a nice convex $J$-$\bw$ surface, as in the figure above.
### Qa The Gradient Descent Method (GD)
Explain the gradient descent algorithm using the equations [HOML] p.114-115. and relate it to the code snippet
```python
X_b, y = GenerateData()
eta = 0.1
n_iterations = 1000
m = 100
theta = np.random.randn(2,1)
for iteration in range(n_iterations):
gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)
theta = theta - eta * gradients
```
in the python code below.
As usual, avoid going top much into details of the code that does the plotting.
What role does `eta` play, and what happens if you increase/decrease it (explain the three plots)?
%% Cell type:code id: tags:
``` python
# TODO: Qa...examine the method (without the plotting)
# NOTE: modified code from [GITHOML], 04_training_linear_models.ipynb
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
def GenerateData():
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X] # add x0 = 1 to each instance
return X, X_b, y
X, X_b, y = GenerateData()
eta = 0.1
n_iterations = 1000
m = 100
theta = np.random.randn(2,1)
for iteration in range(n_iterations):
gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)
theta = theta - eta * gradients
print(f'stochastic gradient descent theta={theta.ravel()}')
##########################################################
# rest of the code is just for plotting, needs no review
def plot_gradient_descent(theta, eta, theta_path=None):
m = len(X_b)
plt.plot(X, y, "b.")
n_iterations = 1000
for iteration in range(n_iterations):
if iteration < 10:
y_predict = X_new_b.dot(theta)
style = "b-" if iteration > 0 else "r--"
plt.plot(X_new, y_predict, style)
gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)
theta = theta - eta * gradients
if theta_path is not None:
theta_path.append(theta)
plt.xlabel("$x_1$", fontsize=18)
plt.axis([0, 2, 0, 15])
plt.title(r"$\eta = {}$".format(eta), fontsize=16)
np.random.seed(42)
theta_path_bgd = []
theta = np.random.randn(2,1) # random initialization
X_new = np.array([[0], [2]])
X_new_b = np.c_[np.ones((2, 1)), X_new] # add x0 = 1 to each instance
plt.figure(figsize=(10,4))
plt.subplot(131); plot_gradient_descent(theta, eta=0.02)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.subplot(132); plot_gradient_descent(theta, eta=0.1, theta_path=theta_path_bgd)
plt.subplot(133); plot_gradient_descent(theta, eta=0.5)
plt.show()
print('OK')
```
%%%% Output: stream
stochastic gradient descent theta=[4.15435925 2.94177079]
%%%% Output: display_data
![](data:image/png;base64,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)
%%%% Output: stream
OK
%% Cell type:markdown id: tags:
### Qb The Stochastic Gradient Descent Method (SGD)
Now, introducing the _stochastic_ variant of gradient descent, explain the stochastic nature of the SGD, and comment on the difference to the _normal_ gradient descent method (GD) we just saw.
Also explain the role of the calls to `np.random.randint()` in the code,
HINT: In detail, the important differences are, that the main loop for SGC is
```python
for epoch in range(n_epochs):
for i in range(m):
.
.
.
gradients = 2 * xi.T.dot(xi.dot(theta) - yi)
eta = ...
theta = ...
```
where it for the GD method was just
```python
for iteration in range(n_iterations):
gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)
theta = ..
```
NOTE: the call `np.random.seed(42)` resets the random generator so that it produces the same random-sequence when re-running the code.
%% Cell type:code id: tags:
``` python
# TODO: Qb...run this code
# NOTE: code from [GITHOML], 04_training_linear_models.ipynb
theta_path_sgd = []
m = len(X_b)
np.random.seed(42)
n_epochs = 50
t0, t1 = 5, 50 # learning schedule hyperparameters
def learning_schedule(t):
return t0 / (t + t1)
theta = np.random.randn(2,1) # random initialization
for epoch in range(n_epochs):
for i in range(m):
if epoch == 0 and i < 20:
y_predict = X_new_b.dot(theta)
style = "b-" if i > 0 else "r--"
plt.plot(X_new, y_predict, style)
random_index = np.random.randint(m)
xi = X_b[random_index:random_index+1]
yi = y[random_index:random_index+1]
gradients = 2 * xi.T.dot(xi.dot(theta) - yi)
eta = learning_schedule(epoch * m + i)
theta = theta - eta * gradients
theta_path_sgd.append(theta)
plt.plot(X, y, "b.")
from sklearn.linear_model import SGDRegressor
sgd_reg = SGDRegressor(max_iter=50, tol=-np.infty, penalty=None, eta0=0.1, random_state=42)
sgd_reg.fit(X, y.ravel())
print(f'stochastic gradient descent theta={theta.ravel()}')
print(f'Scikit-learn SGDRegressor "thetas": sgd_reg.intercept_={sgd_reg.intercept_}, sgd_reg.coef_={sgd_reg.coef_}')
##########################################################
# rest of the code is just for plotting, needs no review
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.axis([0, 2, 0, 15])
plt.show()
print('OK')
```
%%%% Output: stream
stochastic gradient descent theta=[3.84208754 3.03831083]
Scikit-learn SGDRegressor "thetas": sgd_reg.intercept_=[3.83534891], sgd_reg.coef_=[2.96948592]
%%%% Output: display_data
![](data:image/png;base64,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)
%%%% Output: stream
OK
%% Cell type:markdown id: tags:
### Qc Adaptive learning rate for $\eta$
There is also an adaptive learning rate method in the demo code for the SGD.
Explain the effects of the `learning_schedule()` functions.
You can set the learning rate parameter (also known as a hyperparameter) in may ML algorithms, say for SGD regression, to a method of your choice
```python
SGDRegressor(max_iter=1,
eta0=0.0005,
learning_rate="constant", # or 'adaptive' etc.
random_state=42)
```
but as usual, there is a bewildering array of possibilities...we will tackle this problem later when searching for the optimal hyperparameters.
NOTE: the `learning_schedule()` method could also have been used in the normal SG algorithm; is not directly part of the stochastic method, but a concept in itself.
%% Cell type:code id: tags:
``` python
# TODO: Qc...in text
```
%% Cell type:markdown id: tags:
### Qd Mini-batch Gradient Descent Method
Finally explain what a __mini-batch__ SG method is, and how it differs from the two others.
Again, take a peek into the demo code below, to extract the algorithm details...and explain the __main differences__, compared with the GD and SGD.
%% Cell type:code id: tags:
``` python
# TODO: Qd...run this code
# NOTE: code from [GITHOML], 04_training_linear_models.ipynb
theta_path_mgd = []
n_iterations = 50
minibatch_size = 20
np.random.seed(42)
theta = np.random.randn(2,1) # random initialization
t0, t1 = 200, 1000
def learning_schedule(t):
return t0 / (t + t1)
t = 0
for epoch in range(n_iterations):
shuffled_indices = np.random.permutation(m)
X_b_shuffled = X_b[shuffled_indices]
y_shuffled = y[shuffled_indices]
for i in range(0, m, minibatch_size):
t += 1
xi = X_b_shuffled[i:i+minibatch_size]
yi = y_shuffled[i:i+minibatch_size]
gradients = 2/minibatch_size * xi.T.dot(xi.dot(theta) - yi)
eta = learning_schedule(t)
theta = theta - eta * gradients
theta_path_mgd.append(theta)
print(f'mini-batch theta={theta.ravel()}')
print('OK')
```
%%%% Output: stream
mini-batch theta=[3.86814831 3.02878845]
OK
%% Cell type:markdown id: tags:
### Qe Choosing a Gradient Descent Method
Explain the $θ_0−θ_1$ plot below, and make a comment on when to use GD/SGD/mini-batch gradient descent (pros and cons for the different methods).
%% Cell type:code id: tags:
``` python
# TODO: Qd...run this code
# NOTE: code from [GITHOML], 04_training_linear_models.ipynb
theta_path_bgd = np.array(theta_path_bgd)
theta_path_sgd = np.array(theta_path_sgd)
theta_path_mgd = np.array(theta_path_mgd)
plt.figure(figsize=(7,4))
plt.plot(theta_path_sgd[:, 0], theta_path_sgd[:, 1], "r-s", linewidth=1, label="Stochastic")
plt.plot(theta_path_mgd[:, 0], theta_path_mgd[:, 1], "g-+", linewidth=2, label="Mini-batch")
plt.plot(theta_path_bgd[:, 0], theta_path_bgd[:, 1], "b-o", linewidth=3, label="Batch")
plt.legend(loc="upper left", fontsize=16)
plt.xlabel(r"$\theta_0$", fontsize=20)
plt.ylabel(r"$\theta_1$ ", fontsize=20, rotation=0)
plt.axis([2.5, 4.5, 2.3, 3.9])
plt.show()
print('OK')
```
%%%% Output: display_data
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAc0AAAEWCAYAAAAEvMzxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzsnXd4k1X7xz+nBVr2LKOUvUSBF6QiigICIiDvKzhBQVABBfcWRWhBERVFRAX1h2xBQYaKAiIyBWQJDvamhVLaMlra0ibn98fddCZp0qZNWs7nunIlefLkPCdp+nyf+z73UFprDAaDwWAw5I6ftydgMBgMBkNRwYimwWAwGAwuYkTTYDAYDAYXMaJpMBgMBoOLGNE0GAwGg8FFjGgaDAaDweAiRjQNBoPBYHARI5oGg8FgMLiIEU2DwWAwGFykhLcn4GmqVaum69ev7+1pGFwlJQX27oV69aBixYI/ntUK+/dD5cpQs2bBHy83zp+HM2fke6hZE6pWBb88XsvGxcGpU3DNNVCypGfn6SskJ0NMjNz8/aFaNahSBUo4OZUlJMChQ/K9BAQU3lwNPsWOHTvOaa2D8jtOsRPN+vXrs337dm9Pw+AKKSnQtSu88QaMGVPwx9MaHnwQmjeHuXNBqYI/pj0SE2H2bPjgAznhT5gAffuKCOSVnTvhjjtg61Zo3dpzc/UFLlyAhQth5kw4eRIeeggGDYL//Cf390ZHQ9u2sGgR3HVXgU/V4LsopY57YpxiJ5qGIsSrr0L58vDmm4VzvHfegcOHYd067whmTAx89hl8+imEhsKXX0LHjvmfy5kz0KcPTJtWfATTYoE1a0Qoly+HLl3glVegZ0/XrejUVOjXDwYONIJp8BhGNA3e4dtvYelS2L497+5Id1i2TARr61YoXbrgj5eZo0fhww/Fuu3bV8Tg2ms9M3Zysoz52GNwzz2eGdObHDgAs2aJJV69OgweDJMnixvWXd58U35bY8d6fJqGqxcjmobC599/4cknYdUqcU8WNH/9BUOGiMVSu3bBH8/Gjh3w/vvwyy8wdCj88w8EB3tufK3h8cflMxWWtV4QnD8vF1EzZ8KRI+J+Xb4cWrXK+5hLl8LXX8tFWX7c3gZDNoxoGgqXixfh7rtFTNq0KfjjnTsnrrmPPoJ27WRbzZoQFZVz3xo1xNWZH7SGFSvk8x08CM89B198ARUq5G9ce3z4IezeDRs3Fo617kksFli9WqzKn36Cbt3g9ddlXTa/QUwHDsCwYfDjjxCU77gPgyELRjQNhYfW8Mgj0LmzuN0KmitX4N574f77xXqxYU8wnW139VgLFohYKgUvvyzraQUVxfrzzxJItGULlC1bMMcoCPbtE6GcMwdq1ZLfwZQpEjXsCRIS5KJs3LiMiySDwYMY0TQUHhMnSvTj118XzvGefVYCjd5+u+COcfGiWJKTJ0PTpvIZu3cv2ECjffskenTJEqhbt+CO4yni4uCbb0Qsjx2DAQPEGm/RwrPH0Vrc4DfcIJamwVAAXJWimZSURHR0NElJSaSmpnp7OlcHSUmSItCjh6xbFTSXLomVWbOmuOsy8/PPjt+3d2+WpyVLlqR69epUyO5ejYgQoZw+XURy2TK4/noPTd4JcXHwv/9JmkqHDgV/vLxischa7syZIpDdu8u6a/fuznMq88Mnn8jf7/ffvZdOZCj2XHWieeHCBaKioggKCqJmzZqUKFECZf7BCpYrV+Rk1r59waztZefiRYlYbdUKAgNlm9aS73fmjPNIzObN0x9qrUlMTCQiIgJAhPOff8SaXLZMUhl27IDCKqaRmiqu5jvvhEcfLZxjusu//2a4X+vUEYv4s88KPuBr0yZ46y3YvLnwo6MNVxVeE02lVCCwHghIm8cirfWYbPvUBWYBlQB/4DWt9U/5Oe65c+cICQmhTJky+RnG4CpWq+RGVq9eOIKZlCSWbMOGIphWK8TGynqlmxdHSinKlClD7eBgIvfvp8Kbb4pIPvWUBPl4ah3OVV56SQJ+3n+/cI+bG3Fxsp5rKz4wcKAE+XgqrSY3zpyBBx6AGTPk724wFCDetDSTgS5a63ilVElgo1LqZ631lkz7jAK+1VpPVUpdC/wE1M/PQa9cuUJpcyVaeJw6JcEwhVGyzmKRcmnBwRIcc+YMnD0rpdNCQiS1IT5e3IP23PLZg3a0hrg4Sp8+TUpMjEThfvddhvVamEyfLm7lLVsKzr3pDqmpkjI0cyasXClFB8LC4PbbC3d+KSkimEOGQK9ehXdcw1WL1/77tNYaiE97WjLtprPvBtjMk4pApCeObdyxhURMjLhEmzf3/BrT7t1ywsyOUuIO/usvCQJq1EhE7sgREcFrrsk9b89ikblHRUHJkqjgYBn39ts9+xlcZeNGGDkSNmyQmrne5J9/RCjnzZMgpMGD4fPPvTevkSPlAmn0aO8c33DV4dVLVqWUP7ADaAx8qrXemm2XMGCVUuppoCzQrXBnaMgzly+Lq65p04KxPOwJJogwWiwijoGBst+BA/K4Xj3n+YwpKWKZRkdDuXLQoIHcQ/7zN/PK8eNw332yRtismXfmEBOT4X6NjISHH5aqRtdc45352Fi4UCz/HTuKXp6qocjiVdHUWluA1kqpSsASpVQLrfXfmXbpD8zUWn+glLoJmJO2jzXzOEqpYcAwgLpFIQS/uJOaKuuYdeqAN9aO69WT+6QkWXusUkVcto6s3aQksSpjY8Visgmut4mPF5fwK69I0n9hkpoqUa8zZ8r6ZM+eEmjTrZtvVNjZuxdGjBDXcGFUlTIY0vCJyzOt9XlgLdAj20uPAd+m7bMZCARyhD5qrb/QWodqrUODrtIKIEuXLqVjx45Ur16d0qVLU69ePfr06cOKFSvS91m7di1hYWFYrVYnI+WPwYMHExISIm2+CipQJjk5/eGf+/cT9sUXxF64kHWf+HhU6dKEzZ4tZebsCWZ8vIj7vn1iDbdoIZGwviCYVqtEnrZpI1WFCou//pKAo5AQGD9eUkSOHYP580W4fUEwL12SAgbvvVc4aT4GQya8JppKqaA0CxOlVGnE9bov224ngK5p+zRHRDO6MOdZFPj444/p27cvTZo0Yfr06SxfvpxRo0YBsGbNmvT91q5dS3h4eIGKJomJch8S4tlxbeuM+/dnyaX888ABwr/8ktiLFzP2jYuDQ4fY/MsvDHn22azjaC0BQfv2yTpnuXLQsqUIqy/1oBw7VlzC06YVfM7huXNSladtWwmmCQiQTjC//y5FAipVKtjju4PWkm5z661SXcpgKGS86Z6tBcxKW9f0Q6Jkf1RKjQW2a62/B14EvlRKPY8EBQ1OCyAyZGLixIn06dOH6dOnp2/r0qULQ4cOLViBzM6FCyKaJUp4Zo1Ja7EGY2JECMuVk1qilSpJ/0hHHD4MQPtKlUR4zpwRQaxdWx77+Umd2SpVfDMJfuFCSZ/444+Ca5qckiLRuLNmwa+/Su7nhAnSgssXrElHfPihWL5z5nh7JoarFa11sbq1bdtWO+Pff/91+rrb1KihtZzes95q1PDscZxQtmxZ/cQTTzjdZ8yYMRq58MhysxEZGakHDhyoq1atqkuVKqVbtmyp58yZk2OcI0eO6AEDBugaNWroUqVK6QYNGuhnnnlG66Qkrf/8Uw968EFdu3ZtvXPnTn3LLbfo0qVL68aNG+upU6dmGefs2bN62LBhukmTJrp06dI6JCRE9+/fX586dUrGiojQes8evf+HH3SfHj10UFCQDggI0HXq1NH33nuvTtmyRc8YPdruZzq6bJnW27ZpQI8ZOlTrbdvktn+//nPjRt2nTx9dpUoVHRgYqJs2barHjx+f63fs8d+NI3bu1LpaNbkvCHbv1vr557WuXl3rDh20/vJLrc+fL5hjeZq1a+X/6tgxb8/EUARBjLF8a4wPJHwVcQqi+LebtGvXjlmzZtGwYUPuuusumjZtmmOfIUOGcOrUKaZPn87GjRvxz2RNJCQk0KlTJ+Li4hg/fjx16tRh7ty5DBw4kMuXLzMsrY7n0aNHadeuHWXKlCE8PJwmTZpw8uRJVq1cKdZdjRpQsiQXL17kwQcf5LnnnmP06NHMmDGD4cOH06xZM2677TYAYmNjCQwM5J133iEoKIjIU6f44P336dCuHfsWLyawVi1o2JDe99xDpUqVmDp1KtWqVSMiIoKfvvsOa0AAdw4fziirlbfeeouFU6YQUq0aJCZSy0HFnz/On6fz7bfTuHFjJk2aREhICAcPHmTPnj0F8FfJA1FR0kz6s8882wEmOlrq/c6aJa7Yhx+WNJYmTTx3jIIke1caWwUmT3SlMRjcxRPK60u3Qrc07VmZtlshsX//ft2yZct0S6tq1aq6X79+euXKlVn2s1mbKSkpWbZPmTJFA/q3337Lsr1r1646KChIp6amaq21HjhwoC5btqyOiIjIOoFjx7Q+dEhrq1UPGjRIA3rNmjXpLyclJemqVavqoUOHZn2f1ar1xYtaHzmiU7dt0yfWrdOAXrxokdZa6+joaA3oZcuWZbwnLk6sxpgYraOj9YyJEzWgDy5eLNaZzaq0Y2neeuutOiQkRCckJLj9HRe4pZmUpPXNN2s9erRnxrtyReulS7Xu00frihW1HjBA69WrtbZYPDN+YeID/2OGog/G0iwAPL2+lZfxtPtLtk2bNmXXrl1s2rSJVatWsWXLFpYsWcKCBQsYN25celCQI9avX0/t2rXp3Llzlu0DBgzgkUce4d9//6Vly5asWrWK3r17E5y5kfK5cxLNmKmAQZkyZbitShVpAIzUSWwSHMyJv/6SogTXXAMxMUz97DOmLVzI4VOnSLh8OX3I/QcOQFISVUuUoGG9erz24otE/fUXnZs3p4ktpchWFs8WANSggZRtc2A1Xk5KYtOmTbz88su+V0JRaxg+XCyqMWNy398Zf/4paSLz50te5+DBYmEWRglDT6G15MsePJiz2L7B4GWMaGYmD4LlVBjzMl4e8ff3p2PHjnTs2BGAyMhIevToQXh4OE8++SSVnVRsiY2NpVatWjm210wrfRcbGwtATEyMpJPYSEiQMnnNmmUJHqlcuXKO4gMBJUuSdOWKbN+7lylLl/LM22/zwogRvH/LLVQuUwZrcjLtH3iApKNH4eBBVEAAv8yZQ9jHHzPyww+JiY2lQd26vPzaawwfNCgjBxMkSKhUKYefMe7iRaxWa9b5+woffSQJ+ps25R5A5aiBdvnyUnc1Lk5SVTZtgsaNC2a+niIuLkMYs9+XKiXu47QLL4PBVzCiWUwJDg5myJAhPPvssxw8eJB2ThryVqlShf379+fYfiZtvahqWr6lbU0RkOT3I0eklJq7tXytVhYsXUrX9u354PnnJUI0IICjp0/L67VqSRoI0LBpU2Z36IA+cIDdx4/zycKFjBgxgvoWCz0fekjyQTNTsqTdakGVq1TBz88vY/6+wsqVkm+4ZUtG9SFnOForv3QJJk2CTp3yHrnsSJDzs3aYkCBCaE8ck5KkYlSTJnLfq1fG8ypVJGf01lslKttg8BGMaOaXGjUcn2gKiZMnT1KnTp0c2/ftk7RXm8UYkJa+kJiYSPny5dP369SpEwsXLmTTpk10yNSj8euvv6Z69eo0T2uX1b17dxYvXszpyEhqxcdL6kdeqrG0bMllpahQqVIWa2jGJ5/Ig+zW+8mTKH9/WnfvzodNmzJ9+nT+Pn+enpUrZ/lMgPTszExwMISGUga45ZZbmDt3LqNHj/aNov3790tHkMWLM6oY5Ye0IKs8k9egtuRkuYCyZzHGxkr9X5sY3nqr5Fk2bSr/I448NRcuSAGDhIT8fSaDwcMY0cwvPhC916JFC2677Tb69u1LgwYNuHjxIj/99BPTpk3j/vvvTy8teG1aq6YPPviAnj174u/vT2hoKIMHD2by5MncfffdvP3224SEhDBv3jx++eUXPv/88/RI2/DwcJYvX87N7dvz+pAhNO7QgYh161ixYgVz5851fcIlS9KjRw/effddxo8fT7t27VizZg2LFi3KstuePXt4dvhwHujalcYdOmDZto2Zc+ZQokQJuvTsmeUzffrppwwaNIiSJUvSqlUrStlx1U6cOJFOnTpx00038eKLLxISEsKRI0f4888/mTJlitvfe76wNZMePx5uuaVwj50XUlOlDq49izEyUjwONmFs00b6fjZpIqUU3bV8bdWQDh2Cm26SyOyzZ3PuV4gXpgZDOp6IJvKlW6FHz/oAU6dO1f/973913bp1dUBAgC5Tpoxu3bq1fvfdd3VycnL6fqmpqXrEiBE6KChIK6Vy5GkOGDAg1zzNQ7t26X49eqTv16BBA/3cc8+lvz5o0CBdu3btLFGsets23en663Wn66+X51rry5cv6yeeeEJXq1ZNlytXTt955536yJEjEvE6ZozWWuuow4f1w7176yaNG+vSgYG6coUKuuOtt+oVK1ZkmVNYWJgODg7Wfn5+kqd59KjWWmcZy8bOnTt17969dcWKFXVgYKBu1qyZnjBhQq7fsUd/NykpWnfvrvUzz7j/3oKMJHU2dkCA1vXqad2tm9YjRmg9aZLWy5drfeCAROp6knfekWNee61ESRsMHgAPRc8qXYjBKoVBaGio3u4keGDv3r3p7kaDmyQnSwm7Ro0k8MQZjlp3lSyZ04Xq6Fj79okFEx0tbryGDb1Wrcajv5sXXoC//4affnKvA8zKldAje3nmTLjyv6y1fJ/2LEZn+aqJiYVTk3f1aqlxW7u2lPHzxcAtQ5FEKbVDax2a33GMe9bgGlaruMlq1cpdMME1YXSErZl01apw+rT0S6xb1zdL3rnLV1/Bjz/C1q25C6ajwBx7ZHdVnj/vOADHz09cqTZ36n33yX3bto7HLwzBPHEC+veXtfKVK41gGnwSI5qG3NFa1rMCA6F69YI/1tGjYlHGxkqt2Zo1i4dgbtoEr70G69e71rTZmWBqLUEyhw5lCOIjj2Q8vnw5a2TqHXfA00/Lc3vdZ/bvl+/YnrVaGGuHyclw773ymX79VfJ+DQYfxIimIXfOnZOT8DXXFLx4RURI5KSfn1iXBdVerLA5cUIsulmzPNO8OSRECtk3bJghjh06SDGDpk3du9C4eFHK940dC6NG5bRwbYUkCrJs3XPPSRH+Zcsk+Mdg8FGMaBqck5AgQnbNNQW/nhgTIydlf39ZNy1KVWyckZAgzaRffFGaOXuCjRslMjW/fxOrVdJeGjeG11+XbZ6up5xb/ufMmdICbeZM6bZiMPgwRjQNjklJkXXMevU8v6blKFAIpMKQr5W6yytWq1h/rVpJAJArWCy5t76yFS3PC45ELDi4YCxJZyKc2Rp+9VVJNTEYfBgjmgb7aC0J61WquLb+5i6OBBOKj2ACvPWWlBr87bfc3aVaw/Llsu5ZUH00nQUXRUXBkCEFc1xXKMTOQAZDXjGiabCPrdxc7drenUdR5rvv4P/+T5pJ52apb94sllZsLLzzjjSi/vdfKTWXnfwE5uQmTM2a5X3szJw/L59761bPjGcw+AhGNA05OX9eTt6ZOpcY3OTPP+GJJyR1Iq2MoV327ZO1xO3bITxcel1+9RXs2iUBWGXLFt6cAW6+2f33pKZK3unWrVJDd8sWsa6vv96UwTMUO/JY2dlQbElKgmPHJCqzZElvz6ZocvasRKN+8okIhz0iI2HYMOjYUYRq/35JGdm9W0R00aK8C6Ytcjb7zZWgob59HbvjbRZuZKTUy331VSkQX7my5Fdu2QLt20tbsv37JVDp3Lm8fQaDwUfxmmgqpQKVUn8opXYrpf5RSoU72O9+pdS/aft8XdjzvKqwWCTwJzjYtY4bhpxcuSKFxgcOhAceyPn6+fMiii1bitjs3w8vvSSdYuLiJC3l00/z5yZ15IK1WnN/79Sp4mWwFdBLSIANG2DiRCm2XqeOBDVNny6/kTfegJMnpVLUjBkwdKi4ZVu3lt/RP/+YGrGGYoU3Lc1koIvW+j9Aa6CHUqp95h2UUk2AkUAHrfV1wHOFP03fZ+bMmSilUEpxwE7T3rVr16a/vnr1agAGDx5M/cwRmLYCBmXKSEEBJ9SvX5/BgwfnOq/Bgwc77l/pyIp1Yt0uXbqUDz/8MNfj2iMsLAylFKmpqXl6v0toDSNGyPcXnu0aMCkJPvxQciijosR9++67GVadrUh5795S7NwbVKggYj57Njz5pFQICgqC558X78Ndd0lAU3S0BCy9+SZ07y4VfEDK8N1yi6SOrF4tLc/KlpWI3MyVbB2JqBFXQxHAa2uaaQV049Oelky7ZS9HMhT4VGsdl/YeO60ODDbKly/PnDlzGDduXJbts2fPpnz58ly6dCl925tvvsmzzz6bsVN0tNQXdaGAwZIlS6iQ3xzKPJTZW7p0KatXr+YFV1M3CpuPPxYr6/ffMzp7WCwwb54ITOvWIjrXXZfzvRMnyt8gW6eXQsXfX0TwxhvFzfrQQ9KxJLc2agkJEBYmhRvefhsee8x5ZxNnaS0F0dPTYPAgXg0EUkr5AzuAxog4Zg+1a5q23ybAHwjTWq8o3FkWHe6++27mzp3L2LFjUWnCl5iYyHfffcc999zDzJkz0/dt1KhRxhvj42WdysUCBm3atPH01Is+q1bBhAkSBVuunFhUK1ZI+ki5ciKcjlqArVsnVui2bWCnpZlHefRRCdzZskXK7dlYskTEslYt98b7/nspz9epkwQD5bXMor+/c/exSUcx+AheDQTSWlu01q2BEKCdUqpFtl1KAE2AzkB/4P+UUpWyj6OUGqaU2q6U2h4dHV3Q03ZI2Nowrx0bYODAgRw/fpyNGzemb1uyZAkWi4V77rkny77p7tm0AgbH/PxQpUvz+eefM3r0aGrVqkWlSpX473//y6lTp7K811X3rI3ff/+dG264gcDAQOrXr5+jd2V0dDSPP/44TZs2pUyZMtSpU4cHH3yQCFvaS9p8Z82aRURERLqrObN7OTo6mhEjRlCnTh0CAgKoU6cOAwcOJDk5Ocuxjh49yp133km5cuWoV68eY8eOxerKWp8zDhyQNcxvvpGiA3/8AV26SDGDsWOleo8jwTxzBh58UKw0O43Ec+AoyMdZhG52brlF1h9DQ2WOVqsELrkjmCdPStDQyy/LWLNn568ucX7/BgZDIeET0bNa6/PAWiB736NTwDKtdYrW+iiwHxHR7O//QmsdqrUODcplPa4gCV9nN5ap0KhXrx4dO3ZkTqZqMrNnz6Zv376UcxTYc+QIVKuWXrLunXfe4dChQ3z11VdMnjyZzZs389BDD+V5ThcvXuSBBx5g0KBBLF26lM6dO/PMM89ksXpjY2MJDAzknXfeYcWKFbz//vscPHiQDh06kJSWp/jmm2/Sq1cvgoKC2Lx5M5s3b2bJkiUAxMXFcfPNN/PNN9/wwgsv8NNPP/Hee++RkpLClStXssynb9++dOnShaVLl9KnTx/GjBnDrFmz8vz5OH9emkm/9ZYI1333SSDQgAHw11+yDujI3Z2aKlGnQ4dKQXVXcFaY4L335NiOXKM1akgAz8CBGe7iiRPdSytKTRWruE0bue3ZIxcI+cFL7d4MhrzgNfesUioISNFan1dKlQa6Ae9m220pYmHOVEpVQ9y1RwpkPuGeyUfM7zh6TP76mz788MO8+OKLfPzxx8TFxbF69Wp+/vln+ztbLHLCDA6WICBEeL/+OiNIOTo6mpdffpnIyEiCg4Pdns+lS5f44osv6NevHwA9evQgIiKCMWPGMGjQIJRSNGvWjMmTJ2ealoUOHTpQt25dfv75Z/r27UujRo0ICgqiVKlStG+fJV6MSZMmceTIEbZv357Fddy/f/8c83nxxRd55JFHAOjWrRtr1qxh/vz56dvcwmIR0WvZUoqNjxwpkbCzZtmvauRovW7vXlkTzI3crLGICOkUMnEiNGgAc+dK3ifIumOZMuJZuP9+CfCZNs09wdy6FR5/XN67ebMUifcExso0FCG8uaZZC5iVtq7pB3yrtf5RKTUW6bD9PbAS6K6U+hewAC9rrWO8N2Xf57777uOpp57ihx9+4Pjx49SsWZOuXbuyfv36rDsmJ8vJqmHDLCfOO7MVzG7ZsiUAJ06ccCia2SNSS2TqE+nv75/DNdyvXz+GDBlCREREenTt1KlTmTZtGocPHyYhU0L8/v37c/3Mq1at4oYbbnBprTX752vRogW7du1y/qbdu6Wv57XX2n9dKXFz7t/vvCuLK4XQExOlNdrhw3I7ciTj8bFjzueZ6cKD7dszBPPAARFMWx1ci0Xcqa5aeLY0maVLRZD79/dc0QuTx2koYngzenYPkOMsp7UenemxBl5IuxXsfPJp4YFYmZ4YJz+UL1+ePn36MGfOHI4dO8ZDDz2EX3Z3XWKiWB4lSuRohFylSpUszwPSaqAm2SvnBhw7dowGDRpk2Xb06NH09cbKlStTMlsaSY201AKbaE6ZMoVnnnmGF154gffff5/KlStjtVpp3769w+NmJiYmhv+4GI1r7/PlegxndXJBgn4mTnTp+A7p2FEE8tw5KZDfqJFc0DRqBN26yeOGDV0reBAVJYE5IOusTZrIHJ98UqzRn3/OGXDkyAquWFEE9667JOfSU3WIExJE5F1NITLpKAYfwZTRK4Y8/PDD3HnnnVitVubPn5/1RVsBgzJlPGItBAcHs23bthzbbMTFxZGSkpJFOKPSTs610+raLliwgK5du/LBBx+k73P06FGX51CtWrUsQUNFkvBwEcWQkPyt8aWkiIv28mVJGbHlfI4cCTt2SP6kvRQSR1bwhQsSBZzNJZ4rzlJHxo6Vz3vLLRLF68zN6+cnv1mDwUcwoulBxnQa4+0pAHD77bdz//33U6lSJa7LnhMYFSXVZjzU6qtUqVKEhoY6fN1isfDdd9+lr2mCiGTdunXTRfPy5cs58j5nzJiRY6yAgAASExNzbO/evTtvvfUWu3fvdtni9Dluu821/WrUcCxGIIUIbNHTtmCrd96BH36A9evz1qPUmWA665pij6goWRcF+PZbuTnDCKbBxzCi6UHCOod5ewqArCPmsDBtpKRA3bqFNpfy5cvzyiuvcO7cOZo0acL8+fNZvXp1ehUjkOCgd999l/Hjx9P0aK4GAAAgAElEQVSuXTvWrFnDIjtJ/tdeey2xsbFMnTqV0NBQAgMDadmyJc8//zxff/013bp1Y9SoUbRs2ZJz586xbNkypk2bRvny5Qvt8xY4zhL8p0+XEnwgebclSsjz//s/KYXnaL01P8JUkPmTzgokGAxewojm1cLly3Jfq1ahnowqVKjAggULePbZZ/nrr7+oUaMGkydPZlCmZsOjR4/m/PnzTJo0iaSkJDp16sTKlStp2LBhlrGGDBnCli1beP311zl//jz16tXj2LFjVKpUiU2bNjFq1CgmTJhATEwMNWrUoEuXLpRyt1iAs+bY+SU3KzE/bNmS0Qvzt9/k7zxnjhRcWL9eIqSzc+CARPrOnp3/4+cX7d1YAIPBVZQuZj/W0NBQvX37doev7927l+bNmxfijHyAK1ckraF+fQnsMDjGwW9n77lzNO/Z0/57vF3iLTJSiqjHxMCoUTBunES6Dh8Ov/6aNer3wgVxic6cKWvbAwZIzdtWrRyPb+8cYbWKOHfr5pnPUMzOQwbfQym1Q2vteC3JRYylWdyxWiUqMyjICGZ+8cUTe3Iy3HOPCGazZhJks3q1tB37+WcRTIsF1qwRoVy+XIRu5EgpqGAL0HJkBUNGwFiNGmLRzpwpN09F0hoMRQgjmsWdU6ckGtPdmqIG30drES5bcNT+/Rmu9ypVoHx5ad01e7YI3uDBUlTe3tpmZkvZUVR1VBTccIPkaS5ZIhWBTJNyw1WGEc3iTEyMuOOaNzcnt+LItGkZgpmd2FjJ/RwwAH76SaoWeYJTpyAgQEoEDhokvytHFnh2t7WzNBSDoYhgRLO4kpgoRbWbNs1RwMBQDNiwQXp3OuPkSaf9SfPE779Ljds//4RnnpELs2wFI9LJLpCmtZehGGDOpsWR1FQ4dEgS5e3VQDU4pmRJ+9GzvpT+cPKkrGPmhqcFEyS46KWXxD3roVxfg6EoYUSzuKG11CitUEG6lxjcw1FxhL17C3cejkhMlJZc7rbA81Rz5y++EBft5Mlw4oTcDIarCCOaxY0zZ8RSypbjaCgGaA1PPCHl8EBSRjI3E3eGs2LxWoub9cQJePVVx2P4+UlT7Tp14McfM3J/DYarCCOaxYmLF+HsWQn88SV3osEzfPxxRiGCZcvkwsgTBRPKlpV6tLGxWbeHhUHXriKSwcFZ3b0msMxwlWJEs7hw5Yq0lGrQIGcHC0PR59df4bnn5PHTT0vja/BMcM0PP0g92NhYyeGcNw+qV3e8f3Kya+OaqFhDMcSIZnHAahVXXfXqeSvIbfBtjh6FBx6QxyEhrrfTsuGoCbmNO+8UIZw+HR59NOtrtjXyrVulsMHWrbBnj/PxfLEIhMHgIYwPrxgw88MPUddeiwoORimFv78/tWvX5v7773epiXOO8WbO5KuvvsrTXAYPHpzeWNrgARISJPAnJq33+rZtrqcQ1aghbtRevZzv17w5vPWWCOalS1I9aPx46aFZsybcfLP05axVSzqmFGSRdoPBxzGWZlHn3DlIa6K8cOFCQkJCsFgsHD58mHHjxtG1a1f++ecfKrpRQm/mzJmkpqbyaHarw1B4OIp2bd3aNZfszp2yvp0b/v6Sc9m2rRRAOHJEKv3ceKMURpgyRdY0zRqmwQAY0SzaXL4s4f9p60+tW7emcePGAHTo0IHg4GBuv/12fv/9d3o6KjZu8E2cRbuC8xSSZ5+FSZOcj9+li1iUFou4ftu0kRzMVq1cy+8syI4tBoMPY9yzHmDePGkg4ucn9/PmFcJBU1NlHbNuXYeBP7bGzilpyfqHDh1i4MCBNGjQgNKlS9OwYUOGDx9OXFxc+ns6d+7MunXr2LRpE0oplFJ07tw5/fWjR48ycOBAatasSUBAAA0bNuTZZ5/Ncexdu3Zx6623UqZMGZo0acK0adM8+OGvcpRyLqoLFkh9WGdUqCA1aM+dk/2ffFKsTVcLIpw5I2uX2W+m6o+hmOM1S1MpFQisBwLS5rFIaz3Gwb73AguBG7TWjvt+eYF586ShhC1l7fhxeQ7w0EMFdFCtJTikYsUsJcwsFgupqalYLBaOHDnC66+/TvXq1dNFLzIykpCQED766CMqV67MkSNHGD9+PL169WLz5s0AfPbZZwwYMACLxcLnn38OZIjv0aNHadeuHWXKlCE8PJwmTZpw8uRJVq1alWV6Fy9e5MEHH+S5555j9OjRzJgxg+HDh9OsWTNuu+22AvpSijApKRJcs2ULbN6c/6uuPXtyD9bZvFlujhpTGwwG+2itvXIDFFAu7XFJYCvQ3s5+5RFx3QKE5jZu27ZttTP+/fdfu9vtXzZ755YrERFa792rtcWitdZ6xowZGshxCw4O1n/88YfDYVJSUvSGDRs0oHfu3Jm+vVOnTrpDhw459h84cKAuW7asjoiIcDjmoEGDNKDXrFmTvi0pKUlXrVpVDx061IUP55s4+t3kidOntV6yROtXXtG6Y0ety5XT+rrrtH7sMa0/+khrpfL3A/rhB60TEpzvs26d5z6PwVAEALZrD2iX1yzNtA8Rn/a0ZNrNXqz6OOA94KVCmppvc+GClFCzU8BgyZIlhISEoLUmMjKSTz75hF69erF+/XqaN2/OlStXmDhxIrNnz+b48eMkpQUQAezfv582bdo4PfSqVavo3bs3wcHBTvcrU6ZMFosyICCAJk2acOJqLLl25Qrs3i1Wnc2SvHBBAm1uukmaRrdrJ14DqxXuvTf/KRu9e8u9o3XHihWlA4rBYHAbrwYCKaX8gR1AY+BTrfXWbK+3AeporX9USjkUTaXUMGAYQN26dQtwxl4mOVncso0a2V3HbNGiRXogEED37t2pU6cOYWFhfPPNN4wcOZIpU6YwevRobr75ZsqXL8+pU6e4++67swioI2JiYlxKJ6lspzlxQECAS8co8kRGZojj5s0SmdqwoQjk7bfD6NHSecZexaa3387oUxkR4Vr0qzMyry8mJsJtt0nj6fDw/I1rMFzFeFU0tdYWoLVSqhKwRCnVQmv9N4BSyg+YBAx2YZwvgC8AQkND83SZnteL++xrmiCNRb74wsNrmrYCBrVqSXNhF7AF++xJW99asGABDz/8MKNGjUrfJz4+3tHbc1CtWjUiIiLcm3dRY/du+11OYmPFus9McrKIok0gt2yRvMr27eUWHi5Nm10pOPH99yKolSvDokVZawenpEiB9Jdfzttnslql92XDhlIaz2Aw5BmfSDnRWp9XSq0FegB/p20uD7QA1irJEasJfK+U+p/2oWAgmzC+8YbUu65bVwwGjwcBnTghzX+dlTfLxuXLlzl8+DDXXXdd+vOS2aIjZ8yYkeN9AQEBXLp0Kcf27t27s3jxYk6fPk2tWrXc/ABFBHuCCSI8p05lFcjdu8VqbN9equq89RY0bux+TuO+fZITqZRchWUWzDVr4KmnoF496Vpz7pzzseylfLz5pliuv/5q8i3Bcx1fDFcl3oyeDQJS0gSzNNANeNf2utb6AlAt0/5rgZd8STBtPPRQAUbKgqxhxseLpePkpPfnn39y7tw5tNacPn2aTz75hNjYWJ5++mkAevTowaxZs2jZsiWNGzdm8eLF/P777znGufbaa/nss8/45ptvaNSoEeXLl6dZs2aEh4ezfPlybr75Zl5//XUaN25MREQEK1asYO7cuQX28X2GNm3EzXrTTVIxJzQUypXL35gXLkjlnUuXxAq05dOeOgUvvihl6z76SPbJi+DNnCkpJVu2XJ39Lx0JpD1MpSODC3jT0qwFzEpb1/QDvk1buxyLRDl978W5+Q4JCWIlNGsm1VuccN9996U/DgoKokWLFqxYsYI77rgDgClTpqC15o033gCgV69ezJ8/n3bt2mUZ59VXX2X//v0MGTKE+Ph4OnXqxNq1a6lfvz5bt25l1KhRjBw5kkuXLlG7dm3uuusuD39oH+XsWc9aalareA6uXJHnYWEZ7lOlxH0xY0beG4mvXSutvtatg6AgD0y4COGOWBoMbqB0fiP1fIzQ0FC9fbtjY3Tv3r00z7425aukpEjz4zp1ZK3LUPA4+O3sPXeO5j16ePZYb74pLl1H5Od/c/9+iZCdP1+q/1xt5PXippidDw0ZKKV2aK1D8zuOT6xpGuyg0woYVKliBLMwsFol8rWw+O4754KZH86dkzXWd965OgXTYChAjGj6KpGRIpy1a3t7JsWf5GQpVF6ihNxSU3Pu48mm3n//LdGsBUFysnRFue++nG2+rgYiI2Ud2GAoIIxo+iLnz0srqFwCfwweIDZWIpNr1ZL1RUff9969njveXXfJWrWn0Roee0zW895+2/Pj+whha8MI6xwmuac7d2b0+bSl/Nx4Y94GNsXmDS5gCrb7GklJ0vS3YUPXi2cb3MdqlULBERHQpElG70lPU7OmjGu7Va0qVi3Ae+959lhjx8LBgzB7tmct48Ig+/dku9WsKa9rDQcPEjFjMuHrwiVyuWpV6ehy9Cj8978iorGxuTfdBvl7Zy8uaNJNDC5gLE1fwmKRAgbBwflPZTA4JjFRhKt0abj22lyjkvOFswjOl1+GDz7wTIutefMk0nbLFvlcRYXcolyjoqBXLy7v2ELZERndeJg8Ga6/Putnffjh3I9ncjEN+aSIXY56Bp+MGNZa3ISlS1996QGFhdaS87p/v5w8GzRwSTAL9PfiiRZbGzfC88/Djz9mWGZFBRfSQp7sqbMKJqBW34J6rwxha8NkQ25/I2NNGjzEVSeapUqVIjEx0dvTyEl0tNTiq1fPrGMWBBaLuPHOnpWc12rVXP6eExMTc1RS8hkOHZIi73PmQIsW3p6NR9HAV23gs9gV6dtG3SolIPVL8ehOvxG2OQD+9z+zHmkoNK460axWrRqnTp0iNjaWlJQU37A64+Ml6q9Ro4J1FV6tJCTAv//Kd9u8ucvuS601ly9fJiIigupulC8sNOLipKPJmDFSiL0okZoKX3/t8OVLpeDhvvBYproZC6qPYNyiGHlSvTqMHCkXmwMHwo4dBTxhg0G46tY0K1asSEBAANHR0cTExJBqL72gMLFY4PRpycc8etS7cyluaC3l6S5ckO/38mVxzbpByZIlqVGjRnojbp/hyhW4+27o1QuGD/f2bByTh8o8f9aErg9DbLZCSP3OfsbeOt0ZU+cxiP1UajEbDIXMVSeaAIGBgdSpU8fb05Cr7e7dpZZpMU4R8ArR0TB4sKTuzJ8v65feoGpVmUN28uNO1BqeeEK6p7z/ft7HKQzcEEwNTAuF53tAcrYzkx7jgkfIUf9Q47o1eJCrzj3rU4waJS7DsWO9PZPixdq1Uly9ZUvYsMF7gnn+vFRzmjPHs+kNEyZIS7Kvv/Ytd769tBEXOR8I998HI3pnFcwXb3rR9eN7IqjKYMiFq9LS9AkWLxYLaMcO3zrxFWVSU2HcOGlmOnOmd9f5rFZJgejRQ9p+eYpvv4WpU6U9WdmynhvXE+SxQPq2YHjgPjhaGQJTICkt5qpTvU5M6DaBcqVM+pXBdzCi6Q327xf32vLlEsVpyD+nTkl/tpIlpUqMt/t9TpggNWAXLfLcmFu2wJNPwi+/FIvyihqYdBO81g1S/KFtJNS6BD82g+CL8M2931DCr4RU//F13Fm7NbmiRRrjni1s4uMlgOOtt+CGG7w9m+LBDz9A27ZiWa5c6X3B/OUXmDJFrMJSpTwz5rFj8ruZMQNat/bMmJ4il0hYe8SUhv/1hxfvEMF8dgs8vVUEs6QFFn0LNcoVgbVIm0vaHSvbtCwr0rgtmkqp0kqp0UqpfUqpJKXUSaXUeKWUjyay+RBaw5AhUhtz6FBvz6bok5wsSf1PPSVdQ15/3fuu7hMnJAVi/nwICfHMmBcuSNeS116TFBNfISFBLg4aN4bPP3f5bRvrQusnRCArJ8LS+XDFH0bcKa9PWgE3nSqgObtLbuX9jABedbjlnlVK1QJ+AZoCS4BlQG9gJFAVeNzTEyxWfPwxHDgAmzaZAgbu4sj9FRAgOa5VqhT+nLKTlAT33AMvvQSdO3tmzJQU6Vhy223w9NOeGdMdHH3vZctKCo8tz/n4cefjlC2LNbQtE7qUYjS/YdEWbjobwIJ5yVRMgj79ZbcBu2HENs9+hDzhSnk/w1WJy5amUqoU8ANQH7hNa/2A1vpV4EbgBDBEKVXEangVIhs2wPjxYhEVpdqgvoKjk1Rysm8IJkjx8Hr14EU3Ij6dobVY0SVKwEcfeedCy9H3npDgesPmypWJOrKHHo8F8IZejUVbeG1HadZ1nkmdwOoM6iu7tToDn/8I6Z8ys0VX2LgiiubC96rEHffsS0Bb4FWt9SbbRq11PGJ1+gG3enZ6xYTTp6FfP4no9Fb6g6FgmTED1q2Dr77y3Mn0ww8lSnbBAhHOokSm+smrK8fxn/cb8cuRXwhKgJ9/b8g7H+7h7aB9+A0/y7JrZL89NaHsGxDWOdM4xqIz+BguiaZSqjTwMnAa+MLOLrbsbZcvC5VSgUqpP5RSu5VS/yilwu3s84JS6l+l1B6l1K9KqXquju8zpKTAAw/AsGHQs6e3Z2PwFNnXuh59VKKimzb1zPhLl4po/vijFDHwBvmx8qKjSfWDN2+D7gMhqhzcdhT+nAY9lv0DjRsT1jkMPUbzSOtHAKiWAAc+hrC1npm+U5ytVc6cWbDHNsUWijSuWpp9gUrA11rrFDuvB6bdX3Hj2MlAF631f4DWQA+lVPts++wCQrXWrYBFgIcbEBYCr74K5cvDm296eyZFE61h2jRvzyInjiwgT1hGO3ZIoNiyZVC3bv7Hc4fMYpKPz3KqAnQZBG91AqUh/Df4ZTYEXwICA7Ps+3lvCSI6VxZ6DICogko/deWzRUVJmzVPEBVF2G9jTLGFYoaropkW10ZtpVRY9hvQLe31k64eWAvxaU9Lpt10tn1+01pfTnu6BfBQOGIh8e23YjHMmVP0mgL7AufPSxCMG5GZRZ6TJ+Guu6RAQ2ho4RzTQ0JpY3kTiY7dUE/yLn+dDaPXgb+DJdCSFy4xcoPkaR6pAr0fhPhS2dy0+cXf3/XP9tdfeTpElvlWrcr21BOErwvHYrXkaTyDj6K1zvUGHEcELbdbfVfGyzSuP/AnEA+8m8u+nwCjHLw2DNgObK9bt672Cf75R+tq1bTeudPbMymabN6sdf36Wj/9tNaJiVrXqGGvQJps9wb2C7bJLa9cvKh1q1Zav/++5+bpCs4+ixu3ZH/0S7ejCZNbj4fQUWVdeK+fn9agz5RFN3xG3tvzIbl39/sc89uYnBsd/XY8cBvTOWOOhKF1SIj+e/5k3WdBn/TvYfeZ3c4n7Wu/7WIKsF27oU+Obq4IW9k0QfzLwevlELfsyUzbOgLfAxFp7x2cyzEqAb8BLRy8PgCxNANym2/btm09+03nhQsXtG7WTOsZM7w9k6KHxaL1hAlaV6+u9dKl3p6NfRISPC+aKSla9+ql9dChWlutnp1vbnhAPI5UQrcbIiLhPxr9bge0Rbk/zoEq6GovZwjvmDvLyhxdFBbC7Hz/BSGSaTebsG+pLY87DUYzJmP+mW85BN0VMTd4DE+JpishebZ6XZEOXr8Dca0uz7StHPA3MDvt5hSt9Xml1FqgR9r70lFKdQPeADpprZNdmK930RoeeUTy9AYP9vZsihZRUVKvNSEBtm0r/PU8V0hIgP/+1/PjPv+8tPv69NMil8rwXXPpe3khEOqehwWL8lacIMUPnukpa5s2wm9IIDxc8cJ/4OHdEF0Wostk3J8tG0V0P0V0GbD4AXUokO8vqQSsrwfhnSVQ6VIpeDYtrk+FZey3rr7c++HH1N5TefzHx+13aMlDyzSDb+CKaNrqgDkSrEfS7r+ybdBa/wT8BKCUmmnvTUqpICAlTTBLI+ui72bbpw3wOdBDa33Whbl6n4kTZV3KzbJiVz2rV8OgQRKFOmaMb6ZYJCRIRZ569TzbhmrKFFizRopelCzkwlqHD+f5rUkl4KXu8Gk7ed5nL0z/HqokZtrJVmfViUhoYG4rePhux8f68Ga5uYJNxMaszT0SN6xz7vu81B021IU/0iIqnr8DPrrJ8f61L8J3z//OjSE38viPduq9GMEs0rhyZrKFeuWIP0+Ldu0F/Ky1/sPNY9cCZiml/JGApG+11j8qpcYiZvT3wPuI1bpQydXjCa31/9w8TuHx22/wwQfwxx+mQa6rpKSISM6aBbNnQ9eu3p6RfWyCWb8+/N//ea5c3/LlUvTi99+hUiXPjOmMvJ6wK1eWfNGePcFq5UBVeOBe+LMWlEqFib8onhq7ArWgu/33R0WRWAIOVYEDVTNui66FeBf/VYISoMVZuQ+6DJvqyPEByifDRyvE4tVhro0XXUYsxzedBCntrgEfZBNrZ4LZ6Rh8sxBqfHAjAGM6jcm5kxHMIk2uoqm1PqeU2gu0VUq10lrvAUjLmVwAXABGuHvgtHHa2Nk+OtPjbtlf91lOnYIHH4S5c33TreiLHD8u31n58rBrF1Sv7u0Z2SchQWq/NmwIX37pOcHcvVtc+N9/X3hFL/J6wt61S2omv/UWXy8czeM9UokPgEYJAXS5VI2nl26HmjWZM9fCayOtRJ4qgZ+fxmpV4GcFLFD2BNzyOrSa7/AwffeKMDaNgXX14P/agiUc/DKJWmxpeKpXhmB2OQJfLYN6F0Q0XWFeSxhwjzz+tSF0t2Nwj+sIo7tkPA//Dcbc5nzcdfVh6g0QlvY8rOs4sOZIQTcUYZSsj+ayk1IPAvOAc8BcJDjofsSzcqfW+ncn740HntJaz/TEhHMjNDRUb9++vTAOlcGVK9CpE/zvfzByZOEeu6jhyNLx1XZJ8fEimI0aiYXpqdShyEho317c+fff75kx7eEpV2BoKAlVK/BMwBq+ul423X+wFLc3783Q1MVcHz2RXTMeQV+uTKZCeHbQUOoS9H4iXTzv+Rem/QjVLufcW4VltRx/bApD/wtnykOZK/DeLzB8O4ztJG7W3NytV/zhxiEZgpsZmzs3sQSUfR20m3/qtTPgtwZpx7edV/Ozvuqr/xNFFKXUDq11vvO4XBLNtAMOAl4BGiHi+RMQrrWOyOV9xV80n3pK1jGXLDH5mLnh7CTi4m+x0IiPh169oEkTsTA99bdNSICOHaW4++uve2ZMR3goKOafILj/Pvi3ujSKfmjpUBaeeZuLMVVFBFPKgXbHAtf4l7jEO4FP8HK8Y8vTJoIXAuCFO0gX7A4nYOZSaBwr+4R3zt0te6Qy3DEADlXNNpOwjGPdfBLuGOjGx8jE6lnQbRDosX7ShDyvGLEsEDwlmi6fBbTWs7TW12mtA7XWIVrrYbkJ5lXB3LnSw3HWLCOYmXFUpqyokFkwly8Xl6yj9lDuYLGIS7plS9/zSmSr1APiSpreBm4YJoLZPBrGrHmLGQemcDEmCPCDKxXdFEwAhSW1Aq/Ez6M8F5hHf7t7ha2F1Q2h5QgRzIBUmLgS1s0QwVx4rQgmQGR5x0eb3wIaPZtVMCM+yHgcFyjjuCuYJVMzHncblPYgTTBtxQ7cKtJgBNPncdnSdGtQpcoBjdOe/g5MQPI2Y7XWJzx+wEwUqqW5Z48ErqxZIydBQwZ5EUhfsTTj4yXgpVkzqczjbA3T3Tm/+KKUyVu1Ku8Nqp25uE+flrXSxYvl9s8/ro+bmpolavlSKbj5Mfg7qj/8Oh4u1CWIs8RRhVTyOHeHaIbzKZ+R0f4svhS82g0+S4vODY2A2Uug+TnYWQu6DYS4MjlHyhw1G18Knu4JMzNFT1ROhN1Toc5FGNNZ1lALykOuw3K6mJ2/wUf+B4ohhW5pukkoUjd2F1AaCE97PLaAjlf4nD8Pd98tLZuMYBYfLl0SwbzmGul/unev58aeNk0KsC9enHfBBOd1Uxs1ErdvYqK4lF2levUsFwe7asL1j6cJ5vdfwoX6gB/R1CwAwQRQTOXJdKvT1qj6s3ZQ0gLj1sD6GfBXDbjlUWj7eO6C+XhvaDssq2DWPQ+7polgnqoAC1p4RjDrXICEt3Nur+BjzgRD/imQZDit9VqcRwMUbaxWScLv2RMeesjbszHkh5QUOHYMDh6EnTszCusfPy5RvflZm8rMypUQFgYbN+a9/6crQT1LlsC114qF6Y7HJW1cjeRdvtgdrpQAvpoEqXmpoK5BWUEr5FTgyulAEU8FBjAPqt8MVZ6m1RmYuAr+qA1NnoGIXBq+hHeWz1AlEb7IZlPUvgh99olgTg2FV2+HSx7KDDtZEaq9nHO7bXyXckfN8k6RwAczyIsAEybAuXOwaJG3Z1J8KMh2SVarpAQdOCDieOAAfPaZRD3bY9w46WMZHw+tWkmfzPzw998wcKA0IG/cOPf9beQl8vXxx6XgeP36UvC9fHmxnl04VtyFKB57AJY0B860glXvQ4Kjv4smixD6JeFfOhFLQkWoeIJGbV5nzqH53HQK5tGfx5lGAuVxVTzZ/iR+Ox+jbNvH+O+D80lOO1NdEw3/iYJvWuR816XxEJgKw++EsZ2zvlbrEvw2E5o+I5/vZEUXpuEmiXYM8F9nQddBubhnjUu2SGFE011WrYJPPpEyb/lxsV3NFMRJQmsRGJsoZr4/fFiS85s2lcCepk0dCyZII+lBg+Tv3KBB/gKYzpyRoggffgi3utij/cIFKZCRl1SR99+H1q1FLEEC1HKZf1hn6HEoin5PwHFVm5LfjSP1r0FoJ6s3VasqypWDEyc0gVWjSez4HJZW86lToQ7vfnWSfmsz5PEh5vMQ890UT4XVWprN2+bBzum0afcY70bNp/0p+M9wB+/QcO0IOFgt52t37YPmT8rjghDM7PTZC0ubQ5ejuexoemsWOQokEMibeDQQyNGVfuXKEBvrmWMUR5KSxAWZmJjztfxGB8bGihDaE8eAgAxRzHzfuDGUK5d1HGdCYrFkdZXlNbf08mW47TZxlSYk2H9/ZKSsm27ZItbtli3iLm7bFtavd/pV2CXz/wnFMqgAACAASURBVPPWrfDGG/Drrw53tyrw79sfVk+Ai3UQCzKzWFpBWUBnlPcrU0bio/bWGsXbG3Iu5OVWvm4EU5jKk7i3gqMJDf6Udq2fTg8MslH2CgzeBdtrw9YQqQ4UmCr1aatehutPwy+N3DhUPiidIpWJhu7IqFPrNHe0mJ1/fZlCz9MsKnhUNItSTmFh40hIqlWD2rUzchvzUhouPh4OHcopigcOyBpkZkHM/LhyZdePUdB/W6sVHnhAvBHO6hBXrCjfWfv2cNNNcmvZEo4ckWAkd9Fa3LOjRkkVn9GjpaG1HZL94cZh77H7i2fAknNxr1atHzjd91U40zo9erZuXcX48Yp+/S30+64fi/5dRHD5YCIvRUph8i+/hOHD5cLDAWGdodHa/jymppGiXXXZAmjwT4K7HstSVajPXvinOhysKoJZ94I8BxHNGDsBQwXBf87A/EUS3esSJr2kUDGi6QAjmoWEs+9m2jQYNsz5PsnJ4ja1J4znz4t1aM9qrF7dM/meBf23HTkSNmyQQvSlSzveLypKPpPVKi7ZpUvldumSWKHu8uCDYlm+9ho88YTkXtq5wAnrDOHXNYNpf4IlZ35mdc5QfXgt/rbjPRzdcTSxibF8su0TKgZUZMMjG2g1rRW681ppGr5xo/y9bGT7rlUY3BAB22oDP06B7e5bnTRYBYN6ZNnaIgq78y0s3lgPb63JZaer/bzhRTwlmmZN0+A6rgamPJ7W2SE1NSMyNbs4nj4t3UJsYti2LfTrJ89r1/ZsJGFhd5X46itYuFDcrXYKBmRhxw4Rye+/h6pV4a67YM4c+T7yUuO2eXO5aCmfKdP/zBkICpLgNSCRQCxrX6fk2ldJcZA+cpbqtLkkIvR8++eZtGVSeourCRsn8Mn6TyjlX4ql/ZbSskZLxrR6RizrefOyCma2AhBzW8n9trSGgxW7Pc3NSb+z+u//I4XSuBwodLQ7hFkh9FPoLbmdKR4qCZxXchVMs35ZLDCWpjOMpZkVVy283r1FHI8fh1q17FuM9esXXvsvdyzT/LrM1qyB/v0l4tbmXnV2/A4doE8fEcsmTfIv8PZ+l/Hx6SL6C90YzlQOk0sUb8Vj8LwUke/SoAtrjq5Bj9H0XdCXpfuXolB8c+833HfdfXDxItx8s1wsPf101nHSPrut1F12Rm6A8WlLrrLWOQLXU1RAUlss0Pdhp4XgC5Msa7rGBeszGPesAzwmmlarZyvBFAdcFZ+lS0UAGjbM3dIqDArr4mffPqkpu2ABdElrj/Hdd3Dvva4f39lcK1aUKNyRI+Gsnfay9k7QVivcfz9nvtvIC3zIfB7M8nLNEgc4a62D1ZrhQi4RcIUydz/HxWZT07cF+gcSUjGEQ7GHAJjcYzLP3PiMrF326QPBwWLh2uYfHw8jRojVnInI8lD7RbCGOZbFbqzgV7rjtsu22h54qrUb7/EM330D9zyQLa3EiKXP4esVgYo2VqtcNTtqCGzcLM656y5JsPcFwSxIstfXbd4coqNlXfHvv6FbN+eCmf13lFshhV9/lfG1lpZiR4/KY9vNzknaOu5tPt95A9ewL6tgBsZB72Gcef0arH0eE8sSK1Q8Ruqdg7MIJkCSJSldMHs07iGCCVJw/tIlaaRtE8xduyR6OptgAgSnpYw6k8PV9GA4nyKRvK6i4FwrCLPAHvt1bAuKex6Q+yw1Zo1gFluMpZkdiwUefVRciz/8kHVt6GrHFUvTF6+wC8rSdOX7GD1aIlkdXYAlJ4tL17au6ey7q1ULbrkFwsNFoO0wb55kmZw4ATUrJVL24mkOWRpm3anlPLjjBSgn1mrjGGjU7g6s2opFW7BYLVi1lQ0nNjj9aLmlljgit/ZdVgWTb4QXgvvD0v8Dq6trnTY0lDsBL9V3f3JucNtRaQWmw+x8pmJ2Xi0OGPesA/IlmikpUh4vJkZOYmUKKVa9qJCbSPjqb8kbolmzplQd6ts352txcfDTT7BsmRTLaNEiY10zcxBNdnbsgOuvd/jyvHkStHzZTl9KAKocpM4tI5izezWdH8nmTsz8PaStq2Zfh+x+CFY1dqP4uAvYxEYjRdjnt5R6sFnK5e3pD4tnAKVwa60T7EbZehq734ev/i9cxZjoWU9z5YpEbyYnyxV/cXct5oUaNRwHqfiyy9rRvAtyzmPHZhXMEyfkd7V0qaSWdO4sIvnJJ5Jy4gpOBBPEwrQvmBr/W8bxhn6H15cnEZA9hTL795D2XQVkant1fSQs+hYqeLj9p02U57eAA3Yq+QAS4NNqPsxaIVGzrkbYQlqUbSqEefZUd2wS1LvgZtsvQ7HAa2uaSqlApdQfSqndSql/lFLhdvYJUEp9o5Q6pJTaqpSqXyCTSUqSjiVaSwcKI5j2OXMm6xpaLutpPoOjeRfknN98U1p0jR0rYnf99VJ68cknJd3m++9F5WrUcK3faC4CHx8vKwr20ez97j7CNyYSkCqffUynMfa/h0wpIhWTMzb/NA/KXxGXrKd44Q65D+8sghmUIJV0MvPz3ExPBvWAux8CUnB9vVMBfpKeEuakdKKb1Lsg93lxTxuKNt4MBEoGumit/wO0Bnoopdpn2+cxIE5r3RiYBLzr8VlcvixX/GXLwrffSik2gyG/REWJyzUuDiZNEmGaNUusz7JlM/ZxhMXissD/9pvz7nR16yqaVM+6BhrWOczxvBEL6sk7MzbXfDmjU0d+CessY026Kev2J7ZDg7is23oOyPbmVvMhrJS4Xd0STgWUkEChPDLiD7m/1eHFieFqwCfWNJVSZYCNwHCt9dZM21cCYVrrzUqpEsAZIEg7mbRba5rx8fC//0ky/YwZhZc3aCge5JZTabU6tx7zudYaHy+Ffz791PE+ZcpovvhCud7Bzs6c3Gqi7AYP3Avf2ulW4jJ7+sPiOci1vztrnRrCXK+EcF0U/DUV6j8HJyrBli/hxggnb/Dzc1pG0OAdikXKiVLKXyn1J3AW+CWzYKZRGzgJoLVOBS4AVe2MM0wptV0ptT06Otq1g1+8CD16SC7hzJlGMA3uk5t71xPl/hywbp10LcsimIGxVGw3kxqlTqLQ1KuHe4JZyAS70LHMKa3my1pltT24b3W6Ru2L0D4CWg0XwQS4IbfqhkYwizVeFU2ttUVr3RoIAdoppbJfd9r7def479Baf6G1DtVahwYFBeV+4Lg4uP12Oet88UXeypUZDF4gIUGK7nTuLGmaNvyafM8rwx4j6uSrnPlqPVatOHbMzR7pDtZNPbmOaSOsM3x0U87tdc/nYbCnWqetdVpxL7czdyIqwPTrs9a09R8j1neOICCbK91QrPEJ80prfV4ptRboAfyd6aVTQB3gVJp7tiKQv55cMTEimJ06SXWVArQGDAZPsn49PPKINEBJJzCOa28ZyRK20XT+Sal727u3ewPn4mYuiGCXsLXQ/lTGmqXN/XuiItR7Pg8D2iJsJx6D+LppG/P3v904BtpFiCu2XQS0PgOlRzlwVXuyVrLBp/GaaCqlgoCUNMEsDXQjZ6DP98AgYDNwL7DG2Xpmrpw9K1Va7rwTxo83gmnIP/lJZ3HxvQkJUnjn44+z7lbymlV8cMuXPDVzCapSZVi0SC4G3aUwi9lnon4mqzKpBPR6EH5r6Hh/l7AVNEgP+Mn+P562ppkLr2yEd1e7cVzjkr1q8KalWQuYpZTyR9zE32qtf1RKjQW2a62/B6YDc5RShxALs1+ejxYZCV27Si7m6NFGMA2eIT9pKy68d8MGsS4PH860MeA8HZ9YzHdNYqn21CLpx7lyZa55nL5GvUyi2WIEHK7iwcHD/B1EyjoPAvK3wuHJGSkl2SkIV7WhaOE10dRa7wHa2Nk+OtPjJOC+fB/s5EkpoP3oo1Ls2mDwcS5ftlmXGq0zLvDKXreOWdMDuCe5sVwE1qkjVYXy0rAaYMUKD83YfUpnKp7gUcG04UaErI13VjsWTDB5mQYfWdMsUI4elZPL00/D83lZLDEYCpeNG+GRRzSHDmWK9Aw4T996z/H13lkEZs5mTkzMu2D+9ZeUjfQCnQfDuvpeObRDguLhuS3enoXB1yneq9cHD0qY4UsvGcE0+DyXL8vPtGNHm2AKVVttZX3pFiw+MIvA7I1Q0hpLu83p0xIwNHly3iecD9bOlICayIny/KaTXplGFqLLQanRpjSewTnF19Lcu1eiZMPCYMgQb8/GYLBL5q4k/v6a1NQM61IFXuSx1/7h8zfb4+fvLJv+/9u78/ioyquB478TTNgVBBI2AaWor7ihWFD6CooVF0CLtrIUpaIRtCqCS2tRAlTFgop1QxBQWV1whRdlV0RBAaEscUFUVBSCKQgBBJLz/vFMMpNhkkySmbkzw/l+Pvlkcu8zM+dmuDnc5z7Pecpp715X1OOGG0r/z2RptYYjpNEe9/3Die57pKoOVUSFCzjEc91lE3HJeaW5bp3rkn3oIUuYJm4Vrkry7bduep9LmE7Ts9axZm0+E4adS0pKBAetFRRA375uabGhQ0tPijE6dzp+475vrxmTtyvy6Duwf2QlXiAlJf7rLpuIi4syepHU9pRTdGVurut2uuYar8MxpkSNG7te0mBH1znIztzU4gO8I7W82T33wPLlbvBQ1aqlv27Nmm6+S5Qp8K8O8LffR/2tily/Gia+5R4XdseWa5BPkv3dPBLY0mAl+fJLV3g91DqGxsSB/HwYM0Z9CfPwpLV7V2p0ZkRNmOBW8Vm+PLyFCWKQMNdmwJkDo/42h5l0Fhz3i0uUNiLWlEfyJc0WLSxhmrj17bdwda+9rPyo5AXOmzULsbGya4IuWOC6Y5cuhXq+8s0FwaOKYueXqtD+BsgOo+plpFW6+LzdwzyiJV/SPOYYryMw5jCqMPmFA9z81wJ+zfMnTJHi8zBr1IAHHgjxApW5b7ZxI/TuDa+8Aiee6A/ottsq/poVNKwT5KXBI+fF9n1P2+bunT7ZrhIvYquXGJIxaRoTZ3JzoUffbbz3f/4rFEnJ5857DnDqydW5/343erZZM5cwI7oqyfbtbmrJmDHFS+xlZcGyZZCe7trEwJxWMKJTTN7qMN0+hwcWQb19FXwBu4dpfCxpGhNFr7y9k+v6Kfty/QmzSfN9vDqzOu3bVweiWF9g3z63wHqfPsXf5PHHYeZM11Wbnu7fHsXSkl/Xga4h/jNQZx/srB61t+XZt+HGVf47xzbYx1RWck45McZje/cqv++9kT91r8O+3LpF26+/IZ/P1lenfftSnhwJBQWuaG2LFjBihH/7iy/CI4+40bOFCbNhw4onzGOPdYsflCKrE5wwKPS+aCZMgMxV5VzrJCPDlvgypbKkaUyEvbboaxq0+oYFM04p2nZs/UO8+SZMnFCFWrViEERhn+/kyf6E+OabcPfdrrh78+b+thUtYFC3LjRqVObzs5a4wTeFA3AWvuC+t69EFaCMMhaw3vFwmMXVCxNk4ZfNuTRlsKRpTITk/bqfzjfO56qLm7B36/FF27t2VTauP4ru3WMUyAsvwPTpLklWq+a2LVniihXMnu0KGxRq2LDi77NhA6xfD2PHlutpF252V3HLj6vY2w7vNJzvHoPpr5bc5ol2NpXERIfd0zQmAqYv/ZD+f0ll/1f+Gfo1aihjxwo33CCxW4luyRK46y547z1o4JvPsXIl/OlPbv5y166RKY2XkeGuMgulpISewhI04nTYkiyGLhpaobc8Lf00zm16LgVaQNr9oduUazqJTR0xFWBJ05hK2L4nhx73vs6yZ3vCgaOLtrdrB1OmCK1axTCYL75wVbBmzPBfTX72GXTr5gob9OpVuYRZ2n2+MKdiDOs4jLPHn13ut77v/PsYev5Q0qqkAZDVKQtVJWVECsM+qUnWnLzQdWttmoiJMOueNaYCVJUnFk+n6bkfseyJzKKEWaWKkpXllveKacLcsQMuv9zNWenc2W3bsgW6dIFRo6BHj6gXXw/H5dMv59OfPg2579QGp4bcfuNZNzLighFFCbOQ+C7fs2bvAVWGdRx2+D1KS5gmwixpGlNOn+34jNPvvIvbunfi4Hr/jcpWrWDZMmHYMDgqln04v/7qqmD16OEvsr59u1vl54474LrrPK3+U2jR14uYu2nuYdt/W6c1X932FVedclXI5zWu3bjE1xzWcVjR46xOWZWO0ZiyJF/B9rZtdeXKlV6HYZLQ/kP7GTF/DA8Pr0vBiluK7bvpJjeTo2aMV+pA1c3B3LvXVfxJSYFdu6B+fTh0KHLvk5FRqZGlOXk5nPzUyeTuyy22fWDjK3j6xjcOay/DBR2WXH+bjLciVbDdsytNETlORBaLSLaIbBCR20O0OUZE3haRtb42f/EiVmMWfb2IE+/tyUPXXlUsYaanw9tvw7hxHiRMgJEj4fPPYcoUlzD37XNrZVY2YaakwKZNEZmKkbUki/Qx6YclTID0VmdWJkpjYs7LgUCHgCGqulpEagOrRGS+qm4MaHMLsFFVu4lIA+BzEZmmqgc8idgccXLychj8zl1MfboxLHkFClKL9nXv7sbXBBbVianp02HSJLdqSY0acPCgGwjUtGn5X6vwSnLDBrjgArcaSsuWlY+xYUOytm0jC/ihNjQd4jbrY8fAzp0lPi2w29WYeOLZlaaq/qiqq32PdwPZQJPgZkBtcXf8awG5uGRrTFSpKpM/nUyrkRcz9Y4bYNGDRQmzZk2XLN94w8OEuWwZDBrkLnMbNnT3LK+/3g18ef758r1WYcLcts1NSXn0Ufjd7yITZ8DgoyaBBQl27Sr1aXZ/0sSruJhyIiItgDbAiqBdTwJvAVuB2sA1qur9iAaT1LJzsrlp9gCWvnkCzH0fDtQu2te+vesJ/c1vYhxUw4ahR7+efnrxn9PTITX18HYlSUlxCXPfPrjySnd/9M9/rng8Zdz7DKtKjzFxzPOkKSK1gFnAIFX9JWh3F2ANcCHQEpgvIkuD24lIJpAJ0CzkYoTGlG3/of08uPRBHnp3AofefAo+61G0r0oVtzDI3/4W45GxhcKdLhLOiiXBg/8C69RmZVUunm3bICfHFVlYuPCw3ValxyQ6T5OmiKTiEuY0VX0tRJO/AKPUDfHdJCJfAycDHwc2UtXxwHhwo2ejG7VJRou+XsSA2QP4ckVLeHM17PFXuznxRJg6Fc45x8MAoykry83pXLQoMiud/OY3cP75cOGFlX8tY+KMZ0nTd59yIpCtqo+W0GwL0BlYKiIZwEnA5hiFaI4AOXk5DJk3hCkrX4X5o+GT4lNJBg6E0aM9GhlbGRkZJXefBpoyxX3l5UH1CC05smOHv4t48ODIvKYxccLLK80OQF9gnYis8W27F2gGoKrjgJHA8yKyDrfCzz2qusOLYE1yUVUyH3yPSWNaUrDzeUiZWGxkbEaGG5h62WXexVgpoe4rFt6HDL6aFInsUliB91TDTd7GJAjPkqaqfkAZS92p6lbg4thEZI4U2TnZ/GHoK3w+eQgc9F1CFvgHkl95JYwf76937rlXS1nOozxKug8ZzQInttSWSTJWRs8cMfYf2s/9i+/njHFn8PmM6/0JM0C9em6KYtwkzBUrXB9xvXrhtS/pCq4yS4CV533sCtIkOUua5oiwcPNCTn/mdEa+P5KD67vB7uApwU5ubmTGwkTEN9+4mrKTJrkRqbfdBmef7e4ZBhcmL6tyT6SLtf/0U/ne35gk4fmUE2OiqWigz3+mwIEa1HnvZXYu+2OJ7eNmxtKuXa7QwN13u9VLBg6EtWthwQKoU8fr6Iw5YlnSNElJVZm8ZjJ3zb+L3H25pG1vx9Gz57Bji7+bM3j8S40abmUtzx086BaN7tgRbr0V+veHr76CefOgdu2ynx9t1gVrjmDWPWuSTnZONp1e6ET/t/qTm/dfTvx8HDrho2IJs2dPePZZaN7cJc/mzd3gnz59PAwcXBa/9VZXqeeRR1yFni1bYO7c6CXMlBL+DGRkWBesMUHsStMkjcKKPqM+GMXBgoPUy29N44XzWfehv1BBrVrw1FPQt69Lljfe6GHAoTz2mKsru2SJK2eXlwezZ0duDmUotlCzMWGzpGmSwsLNCxk4ZyBf5n4JQJf8f7Nq3C2sy/FfRbVtCzNmeFA3NlxvvOGuLpcscWXtRNy2qlUr/9o2X9KYiLCkaRJasYE+wMl1zqT1mjnMer5xURsRuOceGD4c0tK8irQMq1a5y95Zs9wo2Vq1YNq0yAVsXarGRIQlTZOQggf6VDuqGpnHPc6iMTcwa53/6rJxY1clLq7LoH73HVxxhVuSa/hwN6fyhRc8qgxvjCmNnZUm4WTnZDNgzgDe//Z9AC46/vf8bttURt2Uzv79/nZXXAHPPQf163sUaDh274Zu3Vx37IQJru94wgS3rIoxJu7Y6FmTMAIr+rz/7fuk10xn3AWvUmPWu2Td7U+Y1arBM8/A66/HecI8dAh69YJWrWD+fGjd2mV5S5jGxC270jQJYeHmhQyYM4BNuZsAyDwrk0urjOHmnrX58Ud/u9NPd4N9TjnFo0DLY/Bg2LrVjV694AI3cjZuyhEZY0KxK00T13Lycrj29Wu5aMpFbMrdxCkNTmFxn2XU+eBZenQtnjBvv92Vak2IhPnEEzB9Ovz8M1xyiSVMYxKEXWmauFSgBUz+dDJ3L7i7aKDP/effT7f6Q+jXM41Vq/xtGzSA559PoGW85syBQYPcyNhbbnGLQFvCNCYhWNI0cWdjzkYGzB7A0i1LAbi45cU8denTLH2rJe0vdfP9C3Xp4hJmpBfxiJq1a105ooICGDoU/vEPryMyxpSDJU0TN/Yf2s8D7z/Aw8se5mDBQdJrpjO2y1guadqTAQOEl1/2t01Lg4cfdlMaS6oCF3e2bnVF2PfsgTFjYMgQryMyxpSTJU0TFxZsXsDAOQOLDfQZddEoNqyqy5ldXfnVQief7G4HtmnjUbAVkZfnppZ8/727n/nXv3odkTGmAixpGk9tz9vOkHlDmPqfqQC0btCaZ7s+S7vGHRg5Ev75T9eTWSgz09UAqHn4+tHxKz/fVYL/9FNXJT4z0+uIjDEV5FnSFJHjgBeBhkABMF5VHw/RrhMwFkgFdqhqx1jGaaKjcKDPXfPv4r/7/1s00GfIeUPY+l0aHTvChx/629et66Yw9ujhXcxha9gwdJ3Xo4+2hGlMgvPySvMQMERVV4tIbWCViMxX1Y2FDUSkDvA0cImqbhGRdK+CNZETaqDP05c9TctjWzJzJtx0E/zyi799p06uFF7Tpt7EW26hEiYUPyhjTELyLGmq6o/Aj77Hu0UkG2gCbAxo1ht4TVW3+Nptj3mgJmL2HdzHg0sfPGygT89Te7Jnj9Cvnyu5WqhKFRg5Eu6+24rkGGPiQ1zc0xSRFkAbYEXQrhOBVBFZAtQGHlfVF2ManImIkgb61K1el48/ht694auv/O1POMEN9mnXzqOAjTEmBM+TpojUAmYBg1Q1uP/qKOBsoDNQHfhIRJar6hdBr5EJZAI0a9Ys+kGbsJU00KdDsw7k58OoUXDffa4Ma6G+feHJJ90tQGOMiSeeJk0RScUlzGmq+lqIJt/jBv/kAXki8j5wBlAsaarqeGA8QNu2bTW6UZtwlDbQJ61KGj/84JLj4sX+59Su7Qqt9+njXdzGGFMaL0fPCjARyFbVR0to9ibwpIgcBaQB7YDHYhSiqaDSBvoAvPEG9O8Pubn+57Rv79ZcPuEELyKOsIyM0IOBMjJiH4sxJqK8vNLsAPQF1onIGt+2e4FmAKo6TlWzReQd4D+4aSnPqep6T6I1ZQo10OfxSx7nmtbXICLs3euK4Iwb539OSoqrJHfffZCa6l3sEfXTT15HYIyJEi9Hz34AlFmlWlVHA6OjH5GpjNIG+oArudqrF2Rn+5/TtKm7ujz/fC8iNsaY8vN8IJBJbKUN9AFQhX//200bOXDA/7yrr4bx413RAmOMSRSWNE2FDFs8jGbHNCs20GdYx2EMPncwaVXSANi+Hfr1g7lz/c+rUcMl0euvt9WwjDGJx5KmKbeNORsZ8f6Iop8vbnkxz1z+DCfU9Y/ieecdlzADx8O0aQMzZsBJJ8UwWGOMiaBEWVTJxIld+3fR/rn2AGTUzGDGVTN4p887RQnz119h8GC49NLiCfPOO+GjjyxhGmMSmyVNE7asJVnUebgOuw/sBmBb3jZ6zerF8PeGA26QT7t28FjApKCGDWHePBg9GqpW9SJqY4yJHFFNrloAbdu21ZUrV3odRlJTVVJGpKDD1PczTJgAgwbBvn3+dl27wqRJ0KCBR4EaY4yPiKxS1baVfR270jTlJgEjeH7+Ga66yq1MUpgwq1Z16yy/9ZYlTGNMcrGBQKZChnUcxuLFrhTeDz/4t7du7Qb7nHaad7EZY0y02JWmKbeDB+HAvCw6dy6eMG+5BT75xBKmMSZ52ZWmCcu0aa7c3ZYtrtxdYKGCevXcvcvu3b2LzxhjYsGSpinTtGmQmQl797qfAxNm587w4ovQuLE3sRljTCxZ0jRl+vvf/QkzUJ06bjpJinXyG2OOEPbnzpRq5Ur47rvQ+3btsoRpjDmy2J88E1JBATz6KJx3XsltmjWLXTzGGBMPrHvWHCZUofVgNWrAAw/ELCRjjIkLdqVpilm4EM44o3jCbNvWXXU2b+5WJmne3C3r1aePd3EaY4wX7ErTAG7uZVYWPPSQK4tX6M473RVlWhrccYdn4RljTFywpGn49lvo1cutQlKoQQM3leSSS7yLyxhj4o11zx7hZs2CM88snjAvugjWrrWEaYwxwTxLmiJynIgsFpFsEdkgIreX0vYcEckXkatjGWMy27cPBgyAq6+GnTvdtipVXPfsu+9Co0bexmeMMfHIy+7ZQ8AQVV0tIrWBVSIyX1U3BjYSkSrAw8C7XgSZjDZsgJ49Yf16/7bmzV2h9XPP9S4uY4yJd55daarqj6q62vd4N5ANNAnR9FZgFrA9huElJVU36vWc1JOcdAAACsZJREFUc4onzD/+EdassYRpjDFliYt7miLSAmgDrAja3gT4AzCujOdnishKEVmZk5MTrTAT2s6dcM01xde9rFYNnn0WXnrJlcQzxhhTOs+TpojUwl1JDlLVX4J2jwXuUdX80l5DVceraltVbdvAVj0+zPLl0KYNvPKKf1vr1q5EXmamm3tpjDGmbJ5OORGRVFzCnKaqr4Vo0haYKe6ven3gMhE5pKpvxDDMhFVQAP/6FwwdCvkB/+0YMMAVK6he3bvYjDEmEXmWNMVlwolAtqo+GqqNqh4f0P55YLYlzPD89BP07QsLFvi3HXMMTJwIV13lXVzGGJPIvLzS7AD0BdaJyBrftnuBZgCqWup9TFOyd9+Fa691NWQLnXsuTJ8OLVp4FpYxxiQ8z5Kmqn4AhH03TVX7RS+a5HDggOuKHT3av03ErYeZlQWpqZ6FZowxScHK6CWJzZvd3MtPPvFva9gQpk6Fzp29i8sYY5KJ56NnTeXNmOFK4QUmzEsvdaXwLGEaY0zkWNJMYHl50L8/9O4Nu3e7bamp8MgjMHs2pKd7G58xxiQb655NUGvXuu7Yzz7zb2vZEmbOdOtfGmOMiTy70kwwqvDUU9CuXfGE2bs3rF5tCdMYY6LJrjQTSG6u6459I2Cmao0aLoled51V9jHGmGizpJkgli6FPn3gu+/8284803XHnnSSd3EZY8yRJOm6Z+vXr+91CBGVnw8jR0KnTsUT5q23uoWjLWEaY0xYdkTiRURVI/E6cUNE1gP7vY6jkuoToQ/YQ3YM8cGOwXuJHj8kxzFUU9VTK/siydg9u19VE3o4jIistGPwnh1DfEj0Y0j0+CF5jiESr5N03bPGGGNMtFjSNMYYY8KUjElzvNcBRIAdQ3ywY4gPiX4MiR4/2DEUSbqBQMYYY0y0JOOVpjHGGBMVCZM0ReQ4EVksItkiskFEbg/RppOI7BKRNb6v+wP2XSIin4vIJhH5W2yjL4ohnGO4KyD+9SKSLyLH+vZ9IyLrfPsiMhKsvESkmoh8LCJrfccwPESbqiLyku93vUJEWgTs+7tv++ci0iWWsfveP5z4B4vIRhH5j4gsFJHmAfvyAz6ft2IbfVEM4RxDPxHJCYj1hoB914nIl76v62IbfVEM4RzDYwHxfyEiOwP2ef45BMRSRUQ+FZHZIfbF7bkQEEdp8cf1uRAQS2nHENlzQVUT4gtoBJzle1wb+AI4JahNJ2B2iOdWAb4CTgDSgLXBz42XYwhq3w1YFPDzN0B9jz8HAWr5HqcCK4D2QW1uBsb5HvcEXvI9PsX3u68KHO/7TKrEYfwXADV8jwcWxu/7eY+Xv/9yHEM/4MkQzz0W2Oz7Xtf3uG48HkNQ+1uBSfH0OQTEMhiYXsLfnrg9F8KMP67PhTCPIaLnQsJcaarqj6q62vd4N5ANNAnz6b8FNqnqZlU9AMwErohOpCWrwDH0AmbEIrZwqbPH92Oq7yv4xvgVwAu+x68CnUVEfNtnquqvqvo1sAn32cRMOPGr6mJV3ev7cTnQNIYhlinMz6AkXYD5qpqrqv8F5gOXRCHMUlXgGOLuXAAQkabA5cBzJTSJ23MByo4/3s8FCOszKEmFzoWESZqBfF0cbXD/Ow12rq/LZ66ItPZtawIEFKHje8JPuFFRxjEgIjVwH+CsgM0KzBORVSKSGe0YS+LrClkDbMf9ows+hqLft6oeAnYB9YiTzyGM+AP1B+YG/FxNRFaKyHIRuTKqgZYizGO4ytet9qqIHOfbFhefAYT/Ofi6BI8HFgVsjovPARgL3A0UlLA/rs8Fyo4/UFyeC4R3DBE7FxIuaYpILVwiGaSqvwTtXg00V9UzgCeAwvVAQq3/4dmw4TKOoVA3YJmq5gZs66CqZwGXAreIyPlRDjUkVc1X1TNx/+v8rYgEl6Yq6fcdF59DGPEDICJ/BtoCowM2N1NXGaU3MFZEWkY94BDCOIa3gRaqejqwAP/VTlx8BhD+54Dr1nxVVfMDtnn+OYhIV2C7qq4qrVmIbXFxLoQZf2HbuDwXwjyGiJ4LCZU0RSQVl2ymqeprwftV9ZfCLh9V/T8gVUTq4/4HcVxA06bA1hiEfJiyjiFAT4K6o1R1q+/7duB1POjOCYpnJ7CEw7s0in7fInIUcAyQSxx9DlBq/IjIRcA/gO6q+mvAcwo/g82+57aJRawlKekYVPXngLgnAGf7HsfVZwClfw4+pZ0LXn4OHYDuIvIN7pbPhSIyNahNPJ8L4cQf7+dCmccQ8XMhUjdio/2F+1/Bi8DYUto0xD/39LfAFt/zjsLd5D0e/0Cg1vF4DL52hSdWzYBtNYHaAY8/BC7x4BgaAHV8j6sDS4GuQW1uofjgh5d9j1tTfPDDZmI/ECic+NvgBma0CtpeF6jqe1wf+BJvBpSFcwyNAh7/AVjue3ws8LXvWOr6Hh8bj8fg23cSbgCcxNvnEBRnJ0IPQonbcyHM+OP6XAjzGCJ6LiRSwfYOQF9gne8+CMC9QDMAVR0HXA0MFJFDwD6gp7rfziER+SvwLm4k7SRV3RDrAyC8YwD3wc5T1byA52YAr7sxBBwFTFfVd2ISdXGNgBdEpAqup+JlVZ0tIiOAlar6FjARmCIim3DJvyeAqm4QkZeBjcAh4BYt3uUWL/GPBmoBr/h+31tUtTvwP8CzIlLge+4oVd0Y4/jDPYbbRKQ77vecixtBiKrmishI4BPfa43Q4rcAYiWcYwA3AGim7zwuFC+fQ0gJdC6ElGDnQkjRPBesIpAxxhgTpoS6p2mMMcZ4yZKmMcYYEyZLmsYYY0yYLGkaY4wxYbKkaYwxxoTJkqYxxhgTJkuaxiQBEakuIveLyGcisl9EvhORB30VqIwxEWLzNI1JcCLSCLdCw4m48orfAF1xy0+NV9WbvIvOmORiSdOYBCYiabiSiicDXVR1mW97LWADrp5mE1X9ybsojUke1j1rTGK7E1eA+p7ChAmgbuGC13Hn+P96FJsxSceSpjEJSkSqA3cBPwLjQzT52fe9YcyCMibJWdI0JnH9AaiDK95/MMT+ar7vB2IXkjHJLZFWOTHGFHe573sTEckKsf8i3/fvQuwzxlSADQQyJkGJyLf4lpUrw/Gq+k2UwzHmiGDds8YkIBGpiUuY61VVgr+A2sBB4PvAhCkiN4vI1765nKtExAYJGVMOljSNSUxNfN+3lrC/C5AKzCncICLXAI8DDwJtcFNV5opIOFerxhgsaRqTqNJ8338tYf9ffN8nBWwbDDyvqhNUNVtVb8WNvB0YpRiNSTqWNI1JTIXFCg6bTiIi7YHLgLmq+rFvWxpuPue8oObzgPOiGKcxScWSpjEJSFV3ANnA2SJyeuF2EWkOzAR2ATcHPKU+UAXYFvRS27B5nMaEzaacGJO4/glMAxaKyFSgJvAnQIHLSxgxGzxcXkJsM8aUwK40jUlQqjod6Adsx92XvAx4GThVVT8Mar4DyOfwq8p0Dr/6NMaUwOZpGnOEEJEVwFpVzQzY9gUwS1X/7l1kxiQO65415sjxKDBFRD4GlgEDgMbAOE+jMiaBWNI05gihqi+JSD1gKNAIWA9cpqrfehuZMYnDumeNMcaYMNlAIGOMMSZMljSNMcaYMFnSNMYYY8JkSdMYY4wJkyVNY4wxJkyWNI0xxpgwWdI0xhhjwmRJ0xhjjAmTJU1jjDEmTP8P47MaipPtNr0AAAAASUVORK5CYII=)
%%%% Output: stream
OK
%% Cell type:markdown id: tags:
### [OPTIONAL] Qf Extend the MyRegressor
Can you extend the `MyRegressor` class from the previous notebook, adding a numerical train method? Choose one of the gradient descent methods above...perhaps starting with a plain SG method.
You could add a parameter for the class, indicating it what mode it should be operating: analytical closed-form or numerical, like
```python
class MyRegressor(BaseEstimator):
def __init__(self, numerical = False):
self.__w = None
self.__numerical_mode = numerical
.
.
.
```
%% Cell type:code id: tags:
``` python
# TODO: Qf...[OPTIONAL]
```
%% Cell type:markdown id: tags:
REVISIONS| |
---------| |
2018-0214| CEF, initial.
2018-0214| CEF, added optional exe.
2018-0220| CEF, major update.
2018-0220| CEF, fixed revision table malformatting.
2018-0225| CEF, removed =0 in expression.
2018-0225| CEF, minor text updates and made Qc optional.
2018-0225| CEF, minor source code cleanups.
2021-0918| CEF, update to ITMAL E21.
......
%% Cell type:markdown id: tags:
# ITMAL Exercise
REVISIONS|
---------|------------------------------------------------
2018-1218|CEF, initial.
2018-0214|CEF, major update.
2018-0218|CEF, fixed error in nabla expression.
2018-0218|CEF, added minimization plot.
2018-0218|CEF, added note on argmin/max.
2018-0218|CEF, changed concave to convex.
## Training a Linear Regressor I
The goal of the linear regression is to find the argument $w$ that minimizes the sum-of-squares error over all inputs.
Given the usual ML input data matrix $\mathbf X$ of size $(n,d)$ where each row is an input column vector $(\mathbf{x}^{(i)})^\top$ data sample of size $d$
$$
\newcommand\rem[1]{}
\rem{ITMAL: CEF def and LaTeX commands, remember: no newlines in defs}
\newcommand\eq[2]{#1 &=& #2\\}
\newcommand\ar[2]{\begin{array}{#1}#2\end{array}}
\newcommand\ac[2]{\left[\ar{#1}{#2}\right]}
\newcommand\st[1]{_{\mbox{\scriptsize #1}}}
\newcommand\norm[1]{{\cal L}_{#1}}
\newcommand\obs[2]{#1_{\mbox{\scriptsize obs}}^{\left(#2\right)}}
\newcommand\diff[1]{\mbox{d}#1}
\newcommand\pown[1]{^{(#1)}}
\def\pownn{\pown{n}}
\def\powni{\pown{i}}
\def\powtest{\pown{\mbox{\scriptsize test}}}
\def\powtrain{\pown{\mbox{\scriptsize train}}}
\def\bX{\mathbf{M}}
\def\bX{\mathbf{X}}
\def\bZ{\mathbf{Z}}
\def\bw{\mathbf{m}}
\def\bx{\mathbf{x}}
\def\by{\mathbf{y}}
\def\bz{\mathbf{z}}
\def\bw{\mathbf{w}}
\def\btheta{{\boldsymbol\theta}}
\def\bSigma{{\boldsymbol\Sigma}}
\def\half{\frac{1}{2}}
\newcommand\pfrac[2]{\frac{\partial~#1}{\partial~#2}}
\newcommand\dfrac[2]{\frac{\mbox{d}~#1}{\mbox{d}#2}}
\bX =
\ac{cccc}{
x_1\pown{1} & x_2\pown{1} & \cdots & x_d\pown{1} \\
x_1\pown{2} & x_2\pown{2} & \cdots & x_d\pown{2}\\
\vdots & & & \vdots \\
x_1\pownn & x_2\pownn & \cdots & x_d\pownn\\
}
$$
and $\by$ is the target output column vector of size $n$
$$
\by =
\ac{c}{
y\pown{1} \\
y\pown{2} \\
\vdots \\
y\pown{n} \\
}
$$
The linear regression model, via its hypothesis function and for a column vector input $\bx\powni$ of size $d$ and a column weight vector $\bw$ of size $d+1$ (with the additional element $w_0$ being the bias), can now be written as simple as
$$
\ar{rl}{
h(\bx\powni;\bw) &= \bw^\top \ac{c}{1\\\bx\powni} \\
&= w_0 + w_1 x_1\powni + w_2 x_2\powni + \cdots + w_d x_d\powni
}
$$
using the model parameters or weights, $\bw$, aka $\btheta$. To ease notation $\bx$ is assumed to have the 1 element prepended in the following so that $\bx$ is a $d+1$ column vector
$$
\ar{rl}{
\ac{c}{1\\\bx\powni} &\mapsto \bx\powni, ~~~~\mbox{by convention in the following...}\\
h(\bx\powni;\bw) &= \bw^\top \bx\powni
}
$$
This is actually the first fully white-box machine learning algorithm, that we see. All the glory details of the algorithm are clearly visible in the internal vector multiplication...quite simple, right? Now we just need to train the weights...
### Loss or Objective Function - Formulation for Linear Regression
The individual cost (or loss), $L\powni$, for a single input-vector $\bx\powni$ is a measure of how the model is able to fit the data: the higher the $L\powni$ value the worse it is able to fit. A loss of $L=0$ means a perfect fit.
It can be given by, say, the square difference from the calculated output, $h$, to the desired output, $y$
$$
\ar{rl}{
L\powni &= \left( h(\bx\powni;\bw) - y\powni \right)^2\\
&= \left( \bw^\top\bx\powni - y\powni \right)^2
}