{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Logistic regression classifier\n", "\n", "In this notebook, we implement logistic regression classifier described in Section 4.3 of the book PRML. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import time\n", "import numpy as np\n", "import matplotlib as mpl\n", "from matplotlib import pyplot as plt\n", "\n", "%matplotlib inline\n", "plt.rcParams['axes.labelsize'] = 14\n", "plt.rcParams['xtick.labelsize'] = 12\n", "plt.rcParams['ytick.labelsize'] = 12" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 1. Setting \n", "\n", "* Let $N \\in \\mathbb{N}$ be the number of training data points, \n", "* $d \\in \\mathbb{N}$ be the dimension of input, \n", "* $\\mathcal{C} = \\left\\{ 0, 1, \\dots, C-1 \\right\\}$ be the set of class labels, \n", "* $x_0, x_1, \\dots , x_{N-1} \\in \\mathbb{R}^d$ be the training input data, $y_0, y_1, \\dots, y_{N-1} \\in \\mathcal{C}$ be the training labels, and\n", "$y := (y_0, \\dots, y_{N-1})^T \\in \\mathcal{C}^N$.\n", "* Let $t_n \\in \\left\\{0,1\\right\\}^{C}$ be the 1-of-$C$ coding of $y_n$, i.e., for $y_n = c$, $t_n$ is a vector with its $c$ th component being 1 and other components being zero. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2. Theory \n", "\n", "## 2.1 Model\n", "\n", "We consider the following discriminative model (equation (4.104) in PRML)\n", "$$\n", "\\begin{align}\n", " p(y|x,\\theta) = \\frac{\\exp\\left[{\\theta^{(y)}}^T \\phi(x)\\right] }{ \\sum_{y'=0}^{C-1} \\exp\\left[{\\theta^{(y')}}^T \\phi(x)\\right] }\n", "\\end{align}\n", "$$\n", "where\n", "* $\\phi : \\mathbb{R}^d \\rightarrow \\mathbb{R}^M $, $\\phi(x) = (\\phi_0(x), \\dots, \\phi_{M-1}(x))^T$ are basis functions, \n", "* $\\theta^{(y)} \\in \\mathbb{R}^M$ are weight parameters, and \n", "* $\\theta = \\left( {\\theta^{(0)}}^T, \\dots, {\\theta^{(C-1)}}^T \\right)^T \\in \\mathbb{R}^{CM}$\n", "\n", "Later, we use \"linear\" basis function\n", "$$\n", "\\begin{align}\n", " \\phi_j(x) = \\begin{cases}\n", " 1 & (j=0)\\\\\n", " x^{(j-1)} & (j = 1.\\dots, d) \n", " \\end{cases}\n", "\\end{align},\n", "$$\n", "where $x^{(j)}$ represents $j$-th element of $x \\in \\mathbb{R}^d$\n", "\n", "\n", "Let $\\Phi$ be a $N \\times M$ matrix defined by\n", "\\begin{equation}\n", " \\Phi = (\\Phi_{i,j}), \\ \\ \\Phi_{i,j} = \\phi_j(x_i)\n", "\\end{equation}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.2 Cost function and its derivatives\n", "\n", "### 2.2.1 Cost function\n", "\n", "In training a logistic classifier, we select the parameter that minimizes the following cost function (See equations (4.107) and (4.108) in PRML) : \n", "$$\n", "\\begin{align}\n", " J(\\theta) := - \\frac{1}{N} \\sum_{n=0}^{N-1} \\sum_{c=0}^{C-1} t_{n,c} \\log p_{n,c} + \\frac{\\lambda}{2N} \\| \\theta \\|^2, \n", "\\end{align}\n", "$$\n", "where \n", "$$\n", "\\begin{align}\n", " p_{n,c} &:= p(c|x_n,\\theta) = \\frac{\\exp\\left[{\\theta^{(c)}}^T \\phi(x_n)\\right] }{ \\sum_{c'=0}^{C-1} \\exp\\left[ {\\theta^{(c')}}^T \\phi(x_n) \\right]} \\\\\n", " t_{n,c} &:= \\delta_{y_n, c}\n", "\\end{align}\n", "$$\n", "the first term is negative log likelihood, and the second term is a $l^2$ regularization term.\n", "\n", "### 2.2.2 Gradient\n", "\n", "To perform the minimization, we need the gradient of the cost function, which is given by (See equation (4.109) in PRML)\n", "$$\n", "\\begin{align}\n", " \\frac{\\partial J}{\\partial \\theta^{(c)}_{j}} = \n", " \\frac{1}{N} \\sum_{n=0}^{N-1} ( p_{n,c} - t_{n,c}) \\phi_j(x_n) + \\frac{\\lambda}{N} \\theta^{(c)}_{j}\n", "\\end{align}\n", "$$\n", "\n", "### 2.2.3 Hessian\n", "\n", "Later, we use the second derivative, or Hessian, of the cost function to perform minimization (Newton-Raphson) method. Here, the Hessian is given by (See equation (4.110) in PRML)\n", "$$\n", "\\begin{align}\n", " H_{(c, j), (c', j')} &:= \\frac{\\partial^2 J}{\\partial \\theta^{(c)}_{j} \\partial \\theta^{(c')}_{j'}} \\\\\n", " &= \\frac{1}{N} \\sum_{n=0}^{N-1} p_{n, c} \\left( \\delta_{c, c'} - p_{n, c'}\\right) \\Phi_{n, j} \\Phi_{n, j'}\n", " {} + \\frac{\\lambda}{N} \\delta_{c, c'} \\delta_{j, j'} \n", "\\end{align}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.3 Minimization of the cost function\n", "\n", "In contrast to the linear regression cases discussed in Chapter 3 of PRML, we now have a cost function which cannot be analytically minimized. Thus, we resort to numerical minimization of the cost function. \n", "\n", "Here we try two methods: gradient descent and Newton-Raphson method. \n", "\n", "### 2.3.1 Gradient Descent\n", "\n", "In gradient descent method, we iteratively update our variable in the direction of gradient, i.e., if we denote the function to be minimized by $f$ and its variable by $x$, then in the $n$-th step of iteration, we have\n", "$$\n", "\\begin{align}\n", " x_{n+1} = x_n - \\alpha \\nabla f(x_n)\n", "\\end{align}\n", "$$\n", "where $\\alpha > 0$ is learning rate, which should be specified by the user.\n", "\n", "### 2.3.2 Newton method\n", "\n", "In Newton-Raphson algorithm, we utilize the information of second derivative. More specifically, if we denote\n", "* the function to be minimized by $f$, \n", "* the Hessian of the function by $H$, and\n", "* the variable by $x$, \n", "\n", "then in $n$-th step, we have\n", "$$\n", "\\begin{align}\n", " x_{n+1} = x_{n} - \\left[H(x_n)\\right]^{-1} \\nabla f(x_n)\n", "\\end{align}\n", "$$\n", "\n", "We can calculate the second term $\\left[H(x_n)\\right]^{-1} \\nabla f(x_n)$ exactly (for example, by LU decomposition or directly inverting $H$) or approximately by iterative method such as conjugate gradient. One advantage of the iterative methods is that it does not require the matrix itself, and only needs the function which gives the product of the matrix and an arbitrary vector. We will come back to this point later in this notebook.\n", "\n", "### 2.3.3 Comparison\n", "\n", "Because Newton-Raphson method requires the information of Hessian and solving the linear equation corresponding it, the computational cost for each iteration is higher than that of gradient descent. \n", "However, it usually converges much faster than gradient descent in the sense that the number of iteration required is much smaller. \n", "\n", "In this noteobook, we implement both methods (especially, for Newton method, we implement both method for solving the linear equation), and compare their behavior.\n", "\n", "For detail, also see a lecture by Prof. Andrew Ng https://www.youtube.com/watch?v=iwO0JPt59YQ" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 3. From math to code\n", "\n", "## 3.1 Matrix representation\n", "\n", "Here we express cost function and its gradient using a matrix notation. \n", "The following matrix will be used:\n", "* $\\Phi$ or `Phi` : `(N, M)` array, where `Phi[n, m]` = $\\phi_m(x_n)$\n", "* $\\Theta$ or `Theta` : `(C, M)` array, where `Theta[c, j]` = $\\theta^{(c)}_{j}$\n", "* $T$ or `T` : `(N,C)` array, where `T[n, c]` = $t_{n, c}$\n", "* $P$ or `P` : `(N, C)` array, where `P[n, c]` = $p_{n, c}$\n", "\n", "Note that $P$ can be expressed by $\\Phi$ and $\\Theta$ as \n", "\n", "$$\n", "\\begin{align}\n", " P_{n,c} &= \\frac{\\exp\\left[\\sum_{j=0}^{M-1} \\theta^{(c)}_{j} \\phi_{j}(x_n)\\right] }{ \\sum_{c'=0}^{C-1} \\exp\\left[ \\sum_{j=0}^{M-1} \\theta^{(c')}_{j} \\phi_{j}(x_n) \\right]} \\\\\n", " &= \\frac{ \\exp \\left[ \\left( \\Phi \\Theta^T \\right)_{n, c'} \\right] }{ \\sum_{c'=0}^{C-1} \\exp\\left[ \\left( \\Phi \\Theta^T \\right)_{n, c'} \\right] }\n", "\\end{align}\n", "$$" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def calcPhimat(X):\n", " '''\n", " This function generates the design matrix Phi from X, the input data\n", " \n", " Parameters\n", " ----------\n", " X : 2-D numpy array\n", " (N,d) numpy array, with X[n, i] = i-th element of x_n\n", " \n", " Returns\n", " ----------\n", " Phi : 2-D numpy array\n", " The design matrix\n", " '''\n", " N = len(X)\n", " if len(np.shape(X)) == 1:\n", " d = 1\n", " else:\n", " d = np.shape(X)[1]\n", " Phi = np.zeros((N,d+1))\n", " Phi[:,0] = np.ones(N)\n", " Phi[:,1:] = np.reshape(X, (N,d))\n", " return Phi\n", "\n", "def calcTmat(y, C):\n", " '''\n", " This function generates the matrix T from the training label y and the number of classes C\n", " \n", " Parameters\n", " ----------\n", " y : 1-D numpy array\n", " The elements of y should be integers in [0, C-1]\n", " C : int\n", " The number of classes\n", " \n", " Returns\n", " ----------\n", " T : (len(y), C) numpy array\n", " T[n, c] = 1 if y[n] == c else 0\n", " '''\n", " N = len(y)\n", " T = np.zeros((N, C))\n", " for c in range(C):\n", " T[:, c] = (y == c)\n", " return T\n", "\n", "def calcPmat(Theta, Phi):\n", " '''\n", " This function generates the matrix P from the weight Theta and the design matrix Phi\n", " \n", " Parameters\n", " ----------\n", " Theta : 2-D numpy array\n", " Matrix representing the weight parameter\n", " Phi : 2-D numpy array\n", " The design matrix\n", " \n", " Returns\n", " ----------\n", " P : 2-D numpy array\n", " '''\n", " P = np.exp( Phi @ (Theta.T) )\n", " P = P/np.reshape( np.sum(P, axis= 1), (len(Phi),1) ) \n", " return P" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3.2 Cost function and its derivatives\n", "\n", "### 3.2.1 Cost function\n", "\n", "With these definitions, for the cost function, we have\n", "$$\n", "\\begin{align}\n", " J(\\Theta) \n", " &= - \\frac{1}{N} \\sum_{n=0}^{N-1} \\sum_{c=0}^{C-1} t_{n,c} \\log p_{n,c} + \\frac{\\lambda}{2N} \\| \\theta \\|^2 \\\\\n", " &= -\\frac{1}{N} sum(T \\ast \\log P) + \\frac{\\lambda}{2N} \\| \\Theta \\|_{2}^{2}\n", "\\end{align}\n", "$$\n", "where $\\log$ means elementwise log, $\\ast$ means elementwise product, and, $sum$ means summing up all elements of a matrix. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def cost_function(thtvec, Phi, T, lam):\n", " '''\n", " This function calculate the loss function and its gradient\n", " \n", " Parameters\n", " ----------\n", " thtvec : 1-D numpy array \n", " (M*C,) array, which represents the weight parameter Theta, in flattened form\n", " Phi : 2-D numpy array\n", " (N, M) array, design matrix\n", " T : 2-D numpy array\n", " (N, C) array, where T[n, c] = 1 if y[n] == c else 0\n", " lam : float\n", " The regularization constant\n", " \n", " Returns\n", " ----------\n", " J : float\n", " The value of cost function \n", " '''\n", " N, M = np.shape(Phi)\n", " C = np.shape(T)[1]\n", " Theta = np.reshape(thtvec, (C, M))\n", " P = calcPmat(Theta, Phi)\n", " J = -1.0/N*np.sum(T*np.log(P)) + lam/(2.0*N)*np.linalg.norm(thtvec)**2\n", " return J" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2.2 Gradient\n", "\n", "If we regard $\\frac{\\partial J(\\Theta)}{\\partial \\Theta}$ as a matrix, then the gradient can be written as\n", "$$\n", "\\begin{align}\n", " \\frac{\\partial J(\\Theta)}{\\partial \\Theta}\n", " &= \\left( \\frac{1}{N} \\sum_{n=0}^{N-1} ( p_{n,c} - t_{n,c}) \\phi_j(x_n) + \\frac{\\lambda}{N} \\theta^{(c)}_{j} \\right)_{c,j} \\\\\n", " &= \\frac{1}{N} (P-T)^T \\Phi + \\frac{\\lambda}{N} \\Theta. \n", "\\end{align}\n", "$$\n", "Because our (and many other) minimization functions assume that gradient is given as a vector (or 1-D array), we convert the matrix (2-D array) by invoking `np.reshape`. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def grad_cost_function(thtvec, Phi, T, lam):\n", " '''\n", " This function calculates the gradient of the cost function \n", " \n", " Parameters\n", " ----------\n", " See the help for cost_function\n", " \n", " Returns\n", " ----------\n", " grad_vec : 2-D array\n", " The gradient of the cost function with respect to the weight parameter Theta, in flattened form\n", " '''\n", " N, M = np.shape(Phi)\n", " C = np.shape(T)[1]\n", " Theta = np.reshape(thtvec, (C, M))\n", " P = calcPmat(Theta, Phi)\n", " grad_mat = 1.0/N*((P - T).T) @ Phi + lam/N*Theta\n", " grad_vec = np.reshape(grad_mat, len(thtvec))\n", " return grad_vec" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2.3 Hessian\n", "\n", "Calculating Hessian is more complicated (Recall that our implementation of Newton-Raphson method assumes that Hessian is a matrix, i.e., it is 2-D array. ) . \n", "Before delving into the calculation, let us recall the analytic expression for the Hessian (We have rewritten indeices here).\n", "$$\n", "\\begin{align}\n", " H_{(i, j), (k, l)} &= \\frac{\\partial^2 J}{\\partial \\theta^{(i)}_{j} \\partial \\theta^{(k)}_{l}} \\\\\n", " &= \\frac{1}{N} \\sum_{n=0}^{N-1} p_{n, i} \\left( \\delta_{i, k} - p_{n, k}\\right) \\Phi_{n, j} \\Phi_{n, l}\n", " {} + \\frac{\\lambda}{N} \\delta_{(i,j), (k,l)}\n", "\\end{align}\n", "$$\n", "Frist, we calculate a $(C, M, C, M)$ array corresponding to the first term, i.e., we treat the regularization term later, because it is just a $CM \\times CM$ identity matrix. We can make use of numpy broadcasting and `np.einsum`. \n", "\n", "Note that the computational complexity of calculating the Hessian matrix is $\\mathcal{O}(NM^2C^2)$, because we have to calculate $(CM)^2$ elements, and for each element we have summation over $N$ terms." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def hess_cost_function(thtvec, Phi, T, lam):\n", " '''\n", " This function calculates the Hessian of the cost function \n", " \n", " Parameters\n", " ----------\n", " See the help for cost_function\n", " \n", " Returns\n", " ----------\n", " H : 2-D array\n", " The hessian\n", " '''\n", " N, M = np.shape(Phi)\n", " C = np.shape(T)[1]\n", " Theta = np.reshape(thtvec, (C, M))\n", " P = calcPmat(Theta, Phi)\n", " tmparr_A = np.reshape(P, (N, C, 1)) * ( np.reshape(np.identity(C), (1, C, C)) - np.reshape(P, (N, 1, C)) )\n", " tmparr_B = np.reshape(Phi, (N, M, 1)) * np.reshape(Phi, (N, 1, M)) \n", " H_tmp = np.einsum('nik,njl->ijkl', tmparr_A, tmparr_B)/N\n", " H = np.reshape(H_tmp, (C*M, C*M)) + lam/N*np.identity(C*M)\n", " return H" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2.4 Product of Hessian and vector\n", "\n", "As was pointed out in Section 2.3.2, we do not need the Hessian matrix itself when we use iterative methods such as conjugate gradient to calculate $H^{-1}(x) \\nabla f(x)$. Instead, it suffices to provide the function which returns the product of the matrix and an arbitrary input vector (for detail, see https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.linalg.cg.html). \n", "Here we give a function which returns such product function. The important point is that, the computational cost required to calculate the product is much less than the cost required for calculating the Hessian itself (We will evaluate the computational complexity of the process in the next paragraph.).\n", "\n", "First, let us denote by `v` the `(C*M,)` input vector, and by $(V_{i,j})_{i= 0, \\dots, C-1, j = 0, \\dots, M-1}$ the matrix expression for the vector. \n", "The product of the input vector and Hessian is given by\n", "$$\n", "\\begin{align}\n", " &{} \\sum_{k,l} H_{(i, j), (k, l)} V_{k, l} \\\\\n", " &= \\sum_{k,l} \\frac{\\partial^2 J}{\\partial \\theta^{(i)}_{j} \\partial \\theta^{(k)}_{l}} V_{k, l} \\\\\n", " &= \\frac{1}{N} \\sum_{n=0}^{N-1}\\sum_{k,l} p_{n, i} \\left( \\delta_{i, k} - p_{n, k}\\right) \\Phi_{n, j} \\Phi_{n, l} V_{k, l}\n", " {} + \\frac{\\lambda}{N} \\sum_{k,l} \\delta_{(i,j), (k,l)} V_{k,l} \\\\\n", " &= \\frac{1}{N} \\sum_{n=0}^{N-1} \\left( \\sum_{l} p_{n, i} \\Phi_{n, j} \\Phi_{n, l} V_{i, l}\n", " {} - \\sum_{k,l} p_{n, i} p_{n, k} \\Phi_{n, j} \\Phi_{n, l} V_{k, l} \\right) + \\frac{\\lambda}{N} V_{i,j} \\\\\n", " &= \\frac{1}{N} \\sum_{n=0}^{N-1} p_{n, i} \\Phi_{n, j} \\left( \\sum_{l} \\Phi_{n, l} V_{i, l}\n", " {} - \\sum_{k,l} p_{n, k} \\Phi_{n, l} V_{k, l} \\right) + \\frac{\\lambda}{N} V_{i,j} \\\\\n", "\\end{align}\n", "$$\n", "\n", "The calculation can be done step by step as follows:\n", "* First, we set `tmp[n, k]` $= \\sum_{l=0}^{M-1} \\Phi_{n, l} V_{k, l}$ = `(Phi @ V.T) [n, k]`. Thus, `tmp = Phi @ V.T`, and since `Phi` and 'V' are (N, M) array and (C, M) array respectively, the process takes $\\mathcal{O}(NMC)$ time.\n", "* Next, we calculate $ \\sum_{l} \\Phi_{n, l} V_{i, l}- \\sum_{k,l} p_{n, k} \\Phi_{n, l} V_{k, l}$ = `tmp[n, i]` $- \\sum_{k=0}^{C-1}$ `P[n, k] * tmp[n, k]`, and set it as `tmp`. The process takes $\\mathcal{O}(NC^2)$ time, if we first calculate all the product and take summation.\n", "* Then, we calculate $\\sum_{n=0}^{N-1} p_{n, i} \\Phi_{n, j} \\left( \\sum_{l} \\Phi_{n, l} V_{i, l}- \\sum_{k,l} p_{n, k} \\Phi_{n, l} V_{k, l} \\right)$ = $\\sum_{n=0}^{N-1} $`P[n, i] * Phi[n, j] * tmp[n, i]` = $\\sum_{n=0}^{N-1}$ `(P*tmp)[n, i] * Phi[n, j]` = `((P*tmp).T @ Phi)[i,j]`. The process takes $\\mathcal{O}(NMC)$ time.\n", "\n", "Thus, the computational complexity of the procedure is $\\mathcal{O}(NC(M+C))$, which is smaller than the computational complexity for the calculation of Hessian matrix." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "from scipy.sparse.linalg import LinearOperator\n", "\n", "def hessp_cost_function(thtvec, Phi, T, lam):\n", " '''\n", " This function returns the function representing the product of Hessian and a given vector\n", " \n", " Parameters\n", " ----------\n", " See the help for cost_function\n", " \n", " Returns\n", " ----------\n", " A : scipy.sparse,linalg.LinearOperator object\n", " A linear operator representing the Hessian of the cost function\n", " '''\n", " N, M = np.shape(Phi)\n", " C = np.shape(T)[1]\n", " Theta = np.reshape(thtvec, (C, M))\n", " P = calcPmat(Theta, Phi)\n", " def hp(v):\n", " V = np.reshape(v, (C, M))\n", " tmp = Phi @ V.T\n", " tmp = tmp - np.reshape(np.sum(P*tmp, axis=1), (N, -1))\n", " product = ((P*tmp).T @ Phi)/N + lam/N*V\n", " product = product.flatten()\n", " return product\n", " A = LinearOperator((C*M, C*M), matvec=hp)\n", " return A" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3.3 Minimization\n", "\n", "Here, we use gradient descent and Newton-Raphson method to numerically minimize the cost function. The functions performing these minimization procedures are given below.\n", "\n", "### 3.3.1 Gradient Descent\n", "\n", "In gradient descent, we obtain an approximate optimal solution by the update\n", "$$\n", "\\begin{align}\n", " x_{n+1} = x_n - \\alpha \\nabla f(x_n).\n", "\\end{align}\n", "$$\n", "\n", "Here, as to the stopping criterion, we examine the change of function value, and if it does not decrease more than the specified value `ftol`, we terminate the iteration." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def minimize_GD(func, x0, grad, alpha=0.01, maxiter=1e4, ftol=1e-5):\n", " '''\n", " This function minimizes the given function using gradient descent method\n", " \n", " Parameters\n", " ----------\n", " func : callable\n", " Function to be minimized (real-valued)\n", " x0 : 1-D array\n", " Initial value of the variable\n", " grad : callable\n", " The gradient of func (returns 1-D array)\n", " alpha : float\n", " Learning rate\n", " maxiter : int\n", " Maximum number of iteration\n", " ftol : float\n", " The threshold for stopping criterion. If the change of the value of function is smaller than this value, the iteration stops.\n", " \n", " Returns\n", " ----------\n", " result : dictionary\n", " result['x'] ... variable, result['nit'] ... the number of iteration, result['func']...the value of the function, result['success']... whether the minimization is successful or not\n", " '''\n", " x = x0\n", " nit = 0\n", " while nit < maxiter:\n", " xold = x\n", " x = x - alpha*grad(x)\n", " nit += 1\n", " if abs(func(x) - func(xold)) < ftol:\n", " break\n", " success = (nit < maxiter)\n", " return {'x': x, 'nit':nit, 'func':func(x), 'success':success}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.3.2 Newton method\n", "\n", "There are two ways for calculating the second term $\\left[H(x_n)\\right]^{-1} \\nabla f(x_n)$: \n", "* One is to calculate the product by solving the linear equation $H(x_n) y = \\nabla f(x_n)$ exactly using `numpy.linalg.solve`( https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.solve.html )\n", "* The other one is to solve the linear equation approximately by conjugate gradient (CG) method using `scipy.sparse.linalg.cg`( https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.linalg.cg.html ), which can be applied to positive definite coefficient matrices.\n", "\n", "While the first one is more conceptually straightforward, the second one is computationally more efficient (For detail, please consult with textbooks on numerical linear algebra.). \n", "\n", "It should be also noted that, `scipy.sparse.linalg.cg` does not require the matrix itself, but only needs a function giving the product of the coefficient matrix and an arbitrary vector. As was pointed out in Section 3.3.4, the computational complexity of this procedure is smaller than that of the calculation of Hessian matrix.\n", "\n", "For comparison, we implement both methods as follows" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def minimize_newton(func, x0, grad, hess, maxiter=1e4, ftol=1e-5):\n", " '''\n", " This function minimizes the given function using Newton method\n", " \n", " Parameters\n", " ----------\n", " func : callable\n", " Function to be minimized (real-valued)\n", " x0 : 1-D array\n", " Initial value of the variable\n", " grad : callable\n", " The gradient of func (returns 1-D array)\n", " hess: callable\n", " The hessian of func (returns 2-D array)\n", " maxiter : int\n", " Maximum number of iteration\n", " ftol : float\n", " The threshold for stopping criterion. If the change of the value of function is smaller than this value, the iteration stops.\n", " \n", " Returns\n", " ----------\n", " result : dictionary\n", " result['x'] ... variable, result['nit'] ... the number of iteration, result['func']...the value of the function, result['success']... whether the minimization is successful or not\n", " '''\n", " x = x0\n", " nit = 0\n", " while nit < maxiter:\n", " xold = x\n", " x = x - np.linalg.solve(hess(x), grad(x))\n", " nit += 1\n", " if abs(func(x) - func(xold)) < ftol:\n", " break\n", " success = (nit < maxiter)\n", " return {'x': x, 'nit':nit, 'func':func(x), 'success':success} " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "from scipy.sparse.linalg import cg\n", "\n", "def minimize_ncg(func, x0, grad, hessp, maxiter=1e4, ftol=1e-5):\n", " '''\n", " This function minimizes the given function using Newton-CG method\n", " \n", " Parameters\n", " ----------\n", " func : callable\n", " Function to be minimized (real-valued)\n", " x0 : 1-D array\n", " Initial value of the variable\n", " grad : callable\n", " The gradient of func (returns 1-D array)\n", " hessp: callable\n", " A function which returns scipy.sparse.linalg.LinearOperator object representing Hessian\n", " maxiter : int\n", " Maximum number of iteration\n", " ftol : float\n", " The threshold for stopping criterion. If the change of the value of function is smaller than this value, the iteration stops.\n", " \n", " Returns\n", " ----------\n", " result : dictionary\n", " result['x'] ... variable, result['nit'] ... the number of iteration, result['func']...the value of the function, result['success']... whether the minimization is successful or not\n", " '''\n", " x = x0\n", " nit = 0\n", " while nit < maxiter:\n", " xold = x\n", " x = x - cg(A=hessp(x), b=grad(x))[0]\n", " nit += 1\n", " if abs(func(x) - func(xold)) < ftol:\n", " break\n", " success = (nit < maxiter)\n", " return {'x': x, 'nit':nit, 'func':func(x), 'success':success} " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.3.3 Minimization (combined)\n", "\n", "We can write a function bundling all the algorithms shown above:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def minimize(func, x0, method, grad, hess=None, hessp=None, alpha=None, maxiter=1e4, ftol=1e-5):\n", " '''\n", " This function minimizes the given function using the method speicified by user.\n", " \n", " Parameters\n", " ----------\n", " func : callable\n", " Function to be minimized (real-valued)\n", " x0 : 1-D array\n", " Initial value of the variable\n", " method : string\n", " One of 'gd', 'newton', 'newton-cg'.\n", " grad : callable\n", " The gradient of func (returns 1-D array)\n", " hess : callable\n", " The hessian of func (returns 2-D array). Required when method='newton'\n", " hessp: callable\n", " A function which returns scipy.sparse.linalg.LinearOperator object representing Hessian. Required when method='newton-cg'\n", " alpha : float\n", " Learning rate\n", " maxiter : int\n", " Maximum number of iteration\n", " ftol : float\n", " The threshold for stopping criterion. If the change of the value of function is smaller than this value, the iteration stops.\n", " \n", " Returns\n", " ----------\n", " result : dictionary\n", " result['x'] ... variable, result['nit'] ... the number of iteration, result['func']...the value of the function, result['success']... whether the minimization is successful or not\n", " '''\n", " if method == 'gd':\n", " if alpha is None:\n", " print(\"Gradient descent needs a learning rate parameter alpha.\")\n", " return\n", " else:\n", " return minimize_GD(func, x0, grad, alpha, maxiter, ftol)\n", " elif method == 'newton':\n", " if hess is None:\n", " print(\"Newton-Raphson method requires the hessian.\")\n", " return\n", " else:\n", " return minimize_newton(func, x0, grad, hess, maxiter, ftol)\n", " elif method == 'newton-cg':\n", " if hessp is None:\n", " print(\"Newton-CG method requires the hessian-product function.\")\n", " return\n", " else:\n", " return minimize_ncg(func, x0, grad, hessp, maxiter, ftol)\n", " else:\n", " print(\"method should be one of gd, newton, newton-cg\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3.4 Classifier " ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "class LogisticClf:\n", " def __init__(self, C, lam):\n", " self.C = C # the number of labels\n", " self.lam = lam #regularization parameter\n", " self.Theta = None\n", " \n", " def fit(self, X, y, method='NR', alpha=None, maxiter=1e4, ftol=1e-5, show_message=False):\n", " '''\n", " Parameters\n", " ----------\n", " X : 1-D or 2-D numpy array\n", " (N,) or (N, d) array, representing the training input data\n", " y : 1-D numpy arra\n", " (N,) array, representing training labels\n", " '''\n", " Phi = calcPhimat(X)\n", " T = calcTmat(y, self.C)\n", " N, M = np.shape(Phi)\n", " \n", " tht0 = np.zeros(M*self.C)\n", " time_start = time.time()\n", " result = minimize(func=lambda x : cost_function(x, Phi, T, self.lam), \n", " x0=tht0, \n", " method=method,\n", " grad=lambda x : grad_cost_function(x, Phi, T, self.lam),\n", " hess=lambda x : hess_cost_function(x, Phi, T, self.lam),\n", " hessp = lambda x : hessp_cost_function(x, Phi, T, self.lam),\n", " alpha=alpha,\n", " maxiter=maxiter,\n", " ftol=ftol\n", " )\n", " time_end = time.time()\n", " if show_message:\n", " print(f\"success : {result['success']}\")\n", " print(f\"nit : {result['nit']}\")\n", " print(f\"calcualtion time : {time_end - time_start}seconds\")\n", " self.Theta = np.reshape(result['x'], (self.C, M))\n", " \n", " def predict_proba(self, X):\n", " '''\n", " Parameters\n", " ----------\n", " X : 1-D or 2-D numpy array\n", " (N,) or (N, d) array, representing the training input data\n", " Returns\n", " ----------\n", " proba : 2-D numpy arra\n", " (len(X), self.C) array, where proba[n, c] represents the probability that the n-th instance belongs to c-th class\n", " '''\n", " return calcPmat(self.Theta, calcPhimat(X))\n", " \n", " def predict(self, X):\n", " '''\n", " Parameters\n", " ----------\n", " X : 1-D or 2-D numpy array\n", " (N,) or (N, d) array, representing the training input data\n", " Returns\n", " ----------\n", " classes : 1-D numpy arra\n", " (len(X), ) array, where classes[n] represents the predicted class to which the n-th instance belongs\n", " '''\n", " tmp = self.predict_proba(X)\n", " return np.argmax(tmp, axis=1 )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 4. Experiment" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "from sklearn import datasets\n", "from sklearn.metrics import accuracy_score\n", "from sklearn.model_selection import train_test_split" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4.1 Toy data" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def get_meshgrid(x, y, nx, ny, margin=0.1):\n", " x_min, x_max = (1 + margin) * x.min() - margin * x.max(), (1 + margin) * x.max() - margin * x.min()\n", " y_min, y_max = (1 + margin) * y.min() - margin * y.max(), (1 + margin) * y.max() - margin * y.min()\n", " xx, yy = np.meshgrid(np.linspace(x_min, x_max, nx),\n", " np.linspace(y_min, y_max, ny))\n", " return xx, yy\n", "\n", "def plot_result(ax, clf, xx, yy, X, t):\n", " Z = (clf.predict(np.c_[xx.ravel(), yy.ravel()])).reshape(xx.shape)\n", " ax.contourf(xx, yy, Z, alpha=0.7)\n", " ax.scatter(X[:,0], X[:,1], c=t, edgecolor='k')" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\nrkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "X, t = datasets.make_blobs(n_samples=200, n_features=2, centers=3, random_state=42)\n", "plt.scatter(X[:,0], X[:,1], c=t, edgecolor='k')\n", "plt.show()\n", "\n", "xx, yy = get_meshgrid(X[:, 0], X[:, 1], nx=100, ny=100, margin=0.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us train our logistic regression classifier by three solvers." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "success : True\n", "nit : 693\n", "calcualtion time : 0.20700621604919434seconds\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "clf = LogisticClf(C = 3, lam = 1.0)\n", "clf.fit(X, t, show_message=True, method='gd', alpha=0.01)\n", "ax = plt.subplot(111)\n", "plot_result(ax, clf, xx, yy, X, t)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "success : True\n", "nit : 8\n", "calcualtion time : 0.015000104904174805seconds\n" ] }, { "data": { "image/png": "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\nKBQVlP8PXXSbeW9Pz64AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "clf = LogisticClf(C = 3, lam = 1.0)\n", "clf.fit(X, t, show_message=True, method='newton')\n", "ax = plt.subplot(111)\n", "plot_result(ax, clf, xx, yy, X, t)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "success : True\n", "nit : 8\n", "calcualtion time : 0.012000799179077148seconds\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD/CAYAAAD4xAEfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3Wd4XMW9+PHvbC/SFvXem2XZlns3\nBtvgAgESIJSQckMgkATyT7lp95Lc9FxSgYQQQriUQOjVgMG94CY3WXKRiySr97ZaabV7dv4vZK8t\njAMJVp/P8/DCZ8+eM+fYzG+n/UZIKVEURVHGH91wF0BRFEUZHioAKIqijFMqACiKooxTKgAoiqKM\nUyoAKIqijFMqACiKooxTKgAoiqKMUyoAKIqijFMqACiKooxThuEuwD9js4RJlz1yuIuhKMog6glo\nBAwCzSTQ6wUWk3G4izTqNZefaJZSRn/YeSM6ALjskXxp1XeHuxiKogyS9ZqX9iSBwaAnLMzMxPS4\n4S7SmPDwTddWfpTzRnQAUBRl7FqvefGkGXCpin/YqDEARVGGjfrVP7xUAFAURRmnVABQFEUZp1QA\nUBRFGafUILCiKEOqtMlDQ4QOT5qBsOEuzDinAoCiKEPiTMXfPlmvpn2OECoAKIoyZMKcVnDpVMU/\nQqgxAEVRlHFKBQBFUQbdme6ferd/uIuinEN1ASmKMqhKmzwcVf3+I5IKAIqiDJrSJg8npplUuocR\nSnUBKWOOlEGklMNdDOUcqvIfmVQLQBkz6lurWbPrBU41HcOoNzElYw5LZ1yL0WAa7qIpyoikWgDK\nmNDZ3caTa/6AtSmMxVzDLG0JVSfLeWHjo8NdNEUZsVQLQBkTdh/dTHQwkSSRAYAeG/naDN5rfJvm\njnqinGe7IGpbKikt30NQBslPnUpyTOZwFVtRhpUKAMqY0NRahyPoBnH2mE7ocOoiaelsCAWAzQfe\nZGfpBuKDqYDg2WN/YUr2bJbN/OTwFHyMOnfVryvMPNzFUS5AdQEpY0JsZCKdupYBxzSp0RFsJsoZ\nD0BLZyPbS9cxQ7uUDPLJYAIztUvZf2w7da1Vw1HsMenMtE9PmgGXy6YGgEcw1QJQRrTO7jYOnNiB\nt9dDWnwu2YkF6HTn/26ZkbuIPUe3YA6UkSDT6KOXE/pDpMfnEemIAeBY9UFiZAJmYQl9zyhMxAaT\nOFp1gPiI5CF7rrGqtMlDd7odl0r3MCqoAKCMWMdrD/HixkeJkYmYgxaOnihmV8QGbl76FfT6gf90\nw21OPr/iG7y7+yW2NbyFSW+mMHseiwtXhc7R6w0EdUHQBt5HExpGvZoppIw/KgAoI5IW1Hh1y+MU\naLNwi2gQkBLIobjlPfYdf48ZuYvO+06UM46blt51wWtOSJnKuj2vkiTbCRcuALplF426aq5J/eyg\nPYuijFQqACgjQktnA5v2raaq8SRhVgfZKZMwSGN/5X+aTuhI0NI5VL5vQADo8/tYt+cVik/uxB/s\nIyN2ApfPuo4oZyxSSkoqithftp2A5icvtZB9lVuIELEIBC2ynuUzr8cdHjUcj60ow0oFAGXYtXY1\n8bc3f01iIJ18OQNvr4eizk34g36klAhxdmqPhoZBN/Cf7XMbHqanuYcZ2qUYMVHTUMH/vf0b7rz6\nv9mw93VOVh4mKZCFHj217RVEOxOYnrsABGQnFmC3hNPlbUcIQZjVOdSPP+bUu/2EoWb+jAYqACjD\nblvxGuICqaSRBwLsOLBrDnbwLnVUkEA6AAHpp9pwgiXZV4e+W99aRX1zNXO0y9GJ/sHhVLLp0brY\nenANhyr2MkdbhkEYAYjS4tnbuRmz0cKE1Kk0tFXz1DsP0NbVDEiinfFcs+hzRDpih/w9jGbvn/ap\nBoBHBzUNVBl2NU0VRMmBFa5NhGE3hFNuOMwBw3sc0e1jh/5dMlLzmJg2PXRec0c9Ll1kqPI/w6FF\nUN1wkigRF6r8AYQQRAXiKa87iq+vhyffuZ+IjlgWBlexILgKe7uLJ97+PQFNpS3+qM7d4lFN+xxd\nVAtAGXbOsEg8XZ04iQwdC0g/vmAPd17939S0VNDd04XFZKOrp53ikzuZkFKIyWghyhlPe7CFoAwO\nCAKd+lYinNHUec6f39+r6yHRlkJJxR4cwQgSRX8LQyBIIYs2rZEjpw5QkD5j8B9+jAhzWiFMTf0c\nbS5qC0AI8VUhRJEQwieE+L/3fbZECHFECOEVQmwQQqRezHsro9fcSUuo0B+hXfYv5OqTPo7q95Gb\nPAVnWAR5yVMorz3KuztfpGx/KTt2ref+F++lrrWKuIgkwsNcHGQnPbKbgPRTIY9SH6zGZg6jmy72\nyS3skZs4LPdSI8tpFNVMyZxDR3cr1oD9vPLYtDCO1ZRwsu4IwaB23ueKMlZc7BZALfBT4ArAeuag\nECIKeAm4DXgd+AnwLDDnIt9fuQh6+7ycqD2MTujITJiAyWj58C99DGmxOayY+2ne3f0i/oAfTQaY\nmDqDFbNvAGDvsW00NdQxK7AEndCDBvXyFC9t/BuLClfS1dVOGE52shaNAFbCyJB51Bw7hS/Yi4so\n4kimg1bKOMClU67CaY8gMSqNEkMRMnB2oDkog9RTRdepNqqry9H0AW5e9hViXAmD+g5Go4GbvPuZ\nna5+0402FzUASClfAhBCzACSzvnok0CplPL505//CGgWQuRJKY9czDIoH0/xyV28ueMZ3LpoJJLX\ngk9x7aLPk5M0aVDvW5A+g/zUaXT1tGM12QYEnYMndpMUyOyv/E+LJZmTvsOs3/caecGpRIhY9shN\nxJES6tJBggUbnbQRKeKIJA67dHDw+C7mTVxGdmIBWx1rKO3YTZKWCUhOcAgbYRRoc6jWTtLor+ax\n1b/h+stuIyN+Quj+R07tZ1vxO3R0t5EQlcIlU68cVyuJB/T7q0HfUWuoBoEnAgfO/EFK2Q2cOH1c\nGSHaPS28teMfTNMWMSkwh8mBuUzW5vLS5sfw+jyDfn+dTofTHhGq/Js66thW8g6enk7EuVneThMI\nOrytuIgiKIO000w8A3+FJpBGC/WhP8eQSFNXPf5AHzqdjlsvv5uc/ALK7YcoNexGj56JzKKIjfTg\nIYsC0oJ5vLjhb+w+sgmAorItrN76DyLb4pncNxdRq+fJNb+nfhzlEzpT+c+elKoq/1FsqAJAGNDx\nvmMdQPj7TxRC3H56HKFoKCod5aySiiJiZBJh4uxceKeIIErEcuTU/kG5p5SS+tZqKhrK6PP7Qsc3\n7l/NY6t/zbEDpQS9GuUcISiDoc+bqMVoMhFhj6adZgQCHXr8+AZcv49eDJydBeSjF4POgF7X35ow\nGc0sLrySr3zyhyRGpRFHCrVU4CSCiWImUSKeZJHJVG0B6/e+Sq/Py8a9r1OgzSJGJGITYSSLLFK0\nHDbtf3NQ3tFIFaayfI56QzULyAM43nfMAXS9/0Qp5V+AvwAkRKaqff2GkD/Qhz5o4P0/tvXSSF+g\n76Lf73h1KW9sfxq/349VZ6M72MnlMz9FXEQyuw9tZJa2hAAB6qhEj4EdvEOMTKKbTlpoYEHmFbR5\nmjlYvhMnkbiJoYwDTJSz0AkdmtQ4ygHi6O+a0WSAY/pipmTMQafTn1ee3NTJ7GzeiBYIkErOgM9s\nIhybLpyKhjKCwWAolcQZkTKO0pZdF/0dKcpgGqoAUAp87swfhBB2IPP0cWWEyE4sYM+hraRpuaG5\n833SRyM1fCLxlot2n2BQ48VNj3Gs+iBp5CDQ0aBVY8DEWzueJzd1MnHBFEzCwmG5nRSySSOPVhpo\npwUJmLGy7eA7mDCTQT5BNCopI0iQbbo3cemjaA82Yzc7qPaW06FrxSs9ZCdM/MDc/w1tNRwq30tb\noAk9BnrwDiyzDNIb9OIOjyKIhk/2YBaheQ546MBpj7ho70hRhsJFDQBCCMPpa+oBvRDCAgSAl4H7\nhBCfAlYD9wLFagB4ZEmMSmNCeiFFFRuJD6QgBdQZKpiZu+iirIxtaq9j28F3qKgrw+frQY+eDtrQ\n0MhiEjr0nKKMY1UlJMg0ENBCHflMRwhBJP0Dud2ykx2sxYKVOSxDL/r/GcfLNHbq3uW6xbcRCAZo\n6Whgc/GbRBii6JN9IGBKzlwM+v7gpgU1jlYd4FhVCaUVe0iVOcxjOccp4SSHiJQx2EQ4QRmkXBwm\nyhVLrDuJqVnzOXx8L3naNCzCSqds5YS+lCsLbqa0Yg/ltUexW8MpzJo7JnMMlTZ5IEKtIR0LLnYL\n4L+AH57z588A/yOl/NHpyv9B4ClgJ3DjRb638jEJIVg550YmpE3lUPledELHgsxlpMRk/VvX8/l7\n2X98O1X1J9AbDJRVFZMczCJHFtJBCyc5RAetLGBlaBGXU85hV3A9tbpyUoJZ6DAQwI+Rs+maa6nE\nTjjRJIQqfwCTMBMRjKWlq5GsxIm8suX/mK5dgl309z62y2Ze3PhX7rnup+iEjifW/IHerh4iArFE\nkcApjuEmmoliBpWyjB28i0MfgU/2EOWK5fpLvwTAshnXIoRg97F1gMBoMHFp4VVsL3mX7g4PUYF4\nWnSN7Dq8cUhmUA2VgdM+9cxWg7+j3sWeBvoj4EcX+GwtkHcx76dcfEIIMuLzyIj/aH9VUkqOnNrP\n7sOb6PF5yUycwNyCpQgEj755H+ZeKxFaDCc4TDr5/Xv2CnARiVWGcZR9A1bwCiGIlYn0ur3sal+H\nTtNxjGImyTkIIZBS0kwdZqwEOD9dg49ezEYLJSd3ExNMohcvnbINF1G4RBRuEcORqgN0etoIdgaZ\nqi0MrQFolDUcZi9z5DJSRQ6t+npmFF5CVmL+gBaQTqfn8pmf4rJpn6DH58VuCWf30U30tveevZ6E\n6GACr297iq9f//PQoPNopaZ9jk0qFYTysWw+8CZ7D28jNZBLFAlUecoprfgV2UkF2Hsc5MmpIKBM\nHiCGxAHfjSaeYrajSQ39OXP8vXoPBekziItI4u/v/BE/frbyJuHSRSetBPCjodFFG4kyPTRrqU02\n0U4zuclTeLfoReplFR20YsVOGQeIl6nog3r8gT4OV+wnScsckGk0mgSOsp8eujFLCx7ZSV7KlPP6\n9qWUSBnEoDcSbuu/95GK/SRoaQOu5xJRGKSR+tYqEqPSLvarH3Iq3cPYowKA8m/r8XWzvXQts4NL\nQwOiLhnF4b49lFbspSA4KzSjyISFHjyYzkkT3EM3OgSnOEaqzEEgaKCKFhow6U20dTZj14UTE0zk\nJKV00IIDFx204acPCxZ2swGHdBMgQDcdCKHjgZfuRdMCpJFDqsgFwC/72MMmeqWXrIQvsL9sB9r7\ntgaTSIIET28nWUJWwsQBlb+Uku2la9leuhZvn4eIsBiWTL+avJRCDHojAQIDryclARnAoFf/mykj\nk/qXqfzb6lqrcOjdmKV1wPFILY5WmgbMyU8ig6PsZ4qch1lY8cs+jur2EWGLplmro8p3DIFAC2oI\nTfDWzueA/kq5nkqiSKCVBszYWMg89rGNPmMv+AUd9OcQSiabFJmF399HGcW00xpaFmYUJtJkLjXW\nctzhUUzJns3uvZtwa9Gh1kc1JwiicVC/g6nZ87ls2icGPNeW4rfYX7qDAm02YThp9TTw+ta/Y1xs\npjBnLmtbXiY6EB+aQVUrKrBYrMS4BrZ8Rpszm7wbDCrP/1ijAoDybwuzOvAGPedt2tIjuol0xVDR\nfhSXFoVBGEkikwaq2cZbmKQFTRdgUvosVsz5NHqdnnZPM395/ZfogpBGLolksIu1pJJHgkjFIzvQ\n8NNIDR20EEsyjboabHo7UVoCPXjIFv2DrWasFMr5bOVNPLIj1EVkwEh3Txdd3nZm5CzkVP1xdtS+\nSxSxeHXd+PU+7lj2fSKdsQOeB0DTAuw4tI6p2iIC+KnhJBbsZGj5bD3wNp9d/nVO1R9n+8l3iBJx\n9AovfXoft1z61fOuNVqE+v2nmVS//xilAoDyb4txJRDhjOFEWwkZMh+d0NMhWynnMIEWPyadmS2s\nJly68eHFiInZLKWdFk5QyuKpV6LX6dl/fDsb9r5Gb8BLOC5SRDYe2UGQIPGk0C072cNm0sgli0l0\n00kZxfT5fORSSBuNRBAzoGw6ocMpI/DQiV06aKeFco5gk2Gs3/saVy/4LNctvo361iqqm8oJtznJ\nSiy44GBtT183waDkGMV000kEMdRS0T8Q3SEQQrBizqeZnX8ppxpPYLOEkZmQP+oHf1W//9imAoDy\nsXz6sjt4afNjbGt5CwNGejUvSWSRRQGeYAeHdEX0BruZxGwcRCCEwI6DTtFGaUURRr2JjUWrydUK\n6aIdz+mMIUGC6NAhhKBCHiWFbFJF/+pcG2HYZDi7WIsePVbsdNJKAmmhckkp6aCFIBplHECPHh16\n+ujlcOV+rl7Qvwl8XEQycR8hiZvVHIYkiEQylytCM5dOyBIaqQmdF+GIIcIRc6HLKMqIolZzKB+L\n3RrOrVfczZ3X3Isj3E0eU8kWkxBCEC5cTArOwU8f4bgHdIUYNRPe3m427X+TCdp03CIaF1G00IAm\nNcJxoaHRIhvoop1IBi5Es4tw9BipFidJII1GaqiWJwlKjT7Zy2H2YMHePyuIQuaLFcwVlzOVBWhB\n/+ktID86vU6PSd+/6vjcaatp5OEL9ODr6/l4L1JRhoFqASgXhcPmosvbQcb7ErzaRBhI6MGLnTAA\nNKnRpK9lQdwytpW+g1P0z7RxCDcuGcU+tpJOLslkUcx7mLDgoQMH7tB1+6QPjQBdsp1SsZtEmU4l\nZRxhHwKBkwj8+LDjJFaczUzuEBEkkM7+49u5dOpVnGo8zoa9b9DQVoXTFsH8yVdccCcwvd6A3j+w\nS0egQ5zOO6Qoo41qASgXTbQrnjaaBhzrlp0AFLOdGllOraxgN+txOiJIi83FZgqjU7aFzp/ITOyE\ncZCdVHAEicSHj+PiYGjHMJ/s5RBFxJPCHJbSSRvGBBMGix4zFlxEYsGGAzcWBs5QArBIGz2+bqoa\nT/CPtQ9hb3IyM7CE+M503tn+AkVlWz7w+fJSplCtO4mUZ3MU1lFJtDMemznsY7+/keTMAHC9W+2N\nPJapAKBcNIsKV3JSf4gGWUVA+mmXzRzgPTLIJ4MJtNJAM3Xo9Xpm51+CEIKCjJkU67ZTJyuRUtJG\nE43U4NJFEm5047BF8NVrf8iq+TdzQGxjo3yV7azBip0cpmARNlz6SCobjyF7JVbsBNFoohaProMW\nGvDLs5lMgzJIk6GWzMR8Nu5bTbqWT4JIRRLEio0J2gw27VtNMBj8wOfrtXVTbNhOpSzjsG4PFcYj\nXDnv5qF8zYNuvebl6GQ9njQDYWr2z5imuoCUiyY1NovrLr2NDXte43DHXuymcPp8PqJkPHYRTixJ\ntMkmSsQukmOyeHT1fXR1teMikjIOcJi9uOyRLMhejsVkxWFzk504EZ1OjysskvKaI7SVt5JBfmju\nflAG6Qi0IpEkkIoRM3VUYsVOWLiDSfGz2Ht8M4mBDAwYqDVUEhEZTXZiAW+893eyKGCrXI2PXgAM\nmAj2afT0dWO3DNyuwmYO4/ZPfI/Sij3UNlWSFp7NlMzZ2Cxj59f/es2r0j2MIyoAKBdVRnweGVee\nzSO0t2wr7xS9SIQupj99g2zn+sVfYm3Ryxg6DMwKLkEIQZAgB3U7cDrdhFud5CZPwWq2Dbj27ImX\n8fip3+LWoomUsQTwc1xXggwGmcVS7KK/wk6SmRSxgfqOar646j9Ji8/hwLEd+AJeFmRczqT0Weh0\nOhxWNyV9u0kjhxRykEAlZVRylO6ezvMCgLfXQ0nFbrq8HWQlF5CVMAEhxk4jurTJQ1i6XU37HEdU\nAFAG1bScBeSlFnKy9ggGvYHMhHyEEPxj/UPMD64IzQzSCR3pwQnsq91Kd2MXa3Y9z7WLvjAgk6bZ\naCHancDB5h2nj0gS3KnYWxyhyv/MtRJkOh4OUNl4jJykSR+YkdPtisbb0U26yA8dyySfVtnA+n2v\nc+NlXw4dr2o8wTPrHiJSxmDWbJQc3YPbHcnNy74SSi+tKKPN2Pn5ooxYNnMYBekzyEspxGgwEQxq\nSCnRv+/3hwEjAsFEbRaTtbm8vPn/8Pn7u2Z8fT089tZvMLaYmcdyprGIaJFEb18PUpy/cVyAPsxY\neGHjXy84RVPKIG6izzvuIpJ2T/M550le3vI4OYEpTAjOIEPkMz1wCd2tngsOGCvKaKACgDLkTEYL\nca4k6qgccLyGcqKIB8ApInGKSI7X9G8aV1y+C3vAQQb5mIUFp4hgopxBb08Pfr2PJlkbuo5P9lDJ\nMXIpxEUkxSd3UVZ9kKqmgTN40uNyaaZuwLH+dNP1JMVkhI41ddTh7+sjmoTQMZ3QkahlUHqi6OK+\nHEUZQqoLSBkWK+fdxFPv3I8n2EGY5qSZOjx0MJ3FoXN0Qkcw2D+/vrG1FkfAPWC/YiEETiJJyc1k\n9+FNWINHMGOhlUbSySNKxFOuHeHdopdwG6LxyR6MFhM3LbmTCEcM07Lns3HfGxzyF5Eu85BABYfp\nEz6WTr1mQDkk588KkgTRidGd6uGMUN4ft0r4Np6oFoAyLOIjkrnz6v8is2ACvlgvHaKV6VyC5XRa\naa/sojXYQGZif/98tDuOLkP7gGtIKemklezEidxw6Zfo0/USRTyTmYsBE+/JNXTJNpBg8puZEphP\nVHc8z65/GCklOp2eu665F1O0iV2sZzfrwCW54xPfx3LOAHSkIxabJYw6ToWOBaVGteEEk7JmDsHb\nGlxq2uf4pVoAyrAJszpZNHkFcpJk9fZn2Fe5lZhAEkFdgHpdFVfMvC60wGpyxhy2Fq+hQjtKksxA\nQ6Ncd5iwcGdoy8rU+BxO1JQg6U8jHUsi6SwEoIKj7GMLM+Vl1PScpL6tmviIZGyWMD63/P/903IK\nIfjU4v/gqXceoDlYiyVoo0VfT0pcFtOy5w/qOxpsoZk/LjXzZzxSAUAZdkIIVs29iclZsymrOojR\nYOLK9JuJPCepmsVk5QsrvsWanc+zuf519MLAxLTpXD7zU+fkGJLEimRcMooqjpHHtNBnubKQIjbS\nQj0mYfmXc/fEupO4+1M/4UjVATw9naTEXDsmdvlSxjcVAJQRQQhBSkwmKTGZFzzHHR7FjUvvDA3a\nnptcrrfPy8m6w8yXKzlFGS6iB3wuhMAto2ijie5gJwmRqedd/8MYDSYmpY/+Lp8zVL+/ogKAMup8\n0AYrfYE+dEKPHj02wqnh5HnntNFEj66bK2Zeh8k4viu8czd5V/3+45cKAMqYEG51YreE0dJdTwyJ\nnOQQx2UJqfTvIVDOEbzCwy3LvvZPWxnjwZktHl0uG7NVxT+uqQCgjAlCCFbOvYnnNzxCQjCNFJkV\nSusAYDeGc8fKHxDhOH/h13hkMOjVr35FBQBl7MiIz+OLq/6T3Uc20d7ZTLa1gEhnLMnRmaTGZo3a\nvXkVZbCoAKCMKVHOWFbMvmG4i6Eoo4JaCKYoijJOqRaAoowTZ2b+tE9+fxo+ZbxS/w4UZRw4d9rn\neNrsJahpVBTtorq0GGu4g9xFl+KIHR/P/lGoAKAoY9yZyp8C+7ia9qn5/az+35/S4enEUjgZrbWe\ng//1bS6742ukzZg13MUbEVQAUJRxIMxpxTPchRhiRzauo9PfS8w9dyF0/cOdtqlT2PjXP3Fr4VT0\nBrWRjxoEVpQxriFCR73bP9zFGHIn9+zCPn9uqPIHsKSlonc4aDpxfBhLNnKoFoCijFHjPd2D3mik\nz9c74JiUkmCfD73JNEylGllUC0BRxqDxXvkDTFh0KZ4Nm9G8ZzO/eor2YtQbiErL+CffHD9UC0BR\nxqgwpxXCxm+e/7QZs6k9coijP/sV1gl5aO3tBFtaWfWf/61WhZ+mAoCiKGOSEIL5t/4HBZevoO5Q\nKZZwB8lq8HeAIQ0AQoiNwBwgcPpQjZQydyjLoCjK+OKMjccZGz/cxRiRhmMM4KtSyrDT/6nKX1EU\nZZioLiBFGWPWa97+dA+GsbXTl7e9jZM7txPw9ZJcOJ3IlH99VzdloOEIAL8QQvwSOAr8QEq58dwP\nhRC3A7cDOO0RQ186RRmlxnK6h/JdO1j/8IPYCvIRVgt733yNvAWLmXvL59SA7scw1AHgO8AhoA+4\nEXhdCFEopTxx5gQp5V+AvwAkRKbKIS6fooxaY3XaZ19PDxsefpCYu76EOTkJAOfyZZT99gFSp04n\nceKkYS7h6DWkYwBSyp1Syi4ppU9K+TiwDVg5lGVQlLFsrFX+ANUH92NJSwlV/gB6mw3b3Fkc37Ft\nGEs2+g33QjAJqPabonxMpU0e2pPG6P9KEj6omlBdPx/fkAUAIYRLCHGFEMIihDAIIW4BFgFrhqoM\nijLWlDZ5WK95Q5u8j7Vf/wBJk6bQW1GJr7omdEzz9tC9fRdZs+cNY8lGv6EcAzACPwXyAA04Alwj\npTw6hGVQlDFjLA/6nstks7H49q+w8U9/xDapACwWevYfIHvuAhJU///HMmQBQErZBMwcqvspyngw\nXtI9ZMyeS2x2Lid3bsPf20vKd64mKi39Y12zp7ODQF8fYZFR47Y7Sa0DUBRlVLBHRDBpxVUf+zrd\nra2sf/gBGo4dRWc0Yg13sPi2O4nPy78IpRxdVABQFGXckMEgb/zqx4gJOSR99tMIgwFvSSlv/eYX\nXP+L3xIeFT3cRRxSwz0LSFEUZcjUHT2MT/PjXHE5OqMRIQT2SQXYp0/l8Ia1w128IadaAIoyCpU2\neTg6BtM9/KuklHTU1yIQOOLiP7Qvv7ulGWNs7Hnn6eNi6apvGsyijkgqACjKKHJm5k/7GJ72+VE1\nnTjO2j//gd7ubpASq8PJsrvuITL1woPD0ZlZ9DzxKMG+PnTn7ArWV3qEuNnzh6LYI4oKAIoyyoQ5\nreAa+zN//hlfdzer//enOK69koiphSAlnt17efl/foDJZsfqcjJpyXJyFy8Z8GvfFZ9I2rSZ1Pz5\nURxXLEFnteJ5bweirZ2cBYuH74GGiQoAiqKMOie2b8WUmU7YtKn9B4QgfPYMuvfuw5KdiTExkV1v\nvEpnczOzrr8RT0szDWVHsTgcLLrtDo6sW8vhNesI+HykFs5g2hfuwmixDO9DDQMVABRFGZEq9xZR\n9MoLdNRW44hPZOa115E6rX+dq5FQAAAgAElEQVQpkbe9DX101HnfMcbHgQTbhFxMCXEU/+LX+Hu9\nHNm4Dlt2FoHWNvSBAKv+878puOJsGrJAn48jG9ZSe/QwdncEExYvwRH777WwOhvqqSrej9FiIW36\nLEw227/3AoaAmgWkKMqga6uu4vC6d6go2oUW8H/o+RVFO1n/yB/RLZxD/Pe/jf6Seaz/60Oc3LUd\ngLicPHwlh5CaFvqODAToKT2EJSMNAIPTiT4sjGN7dpHwX98h8j8+S+y37sE0dxZr7v81UvYnG+7z\nennph99jz+Z1tMa6qeho4oX/+jZVxfv/5efc/eI/eP4H3+bgoX0UbV3PU/fcQXVJ8b98naGiWgCK\nMkqEUj+4R8/MHxkMsvHRhygv2oVtQh6Bllbk43/lyu/eS1hkJC2VFVidLpxx8UgpObZlI6Ub19Jy\nqpKoz9yILX8CAPbJBQiTkV0v/IOMWXNJLJiMOyqGpkceI2zxQpCSjrXrMURH0VNeSceWbZhiY/B3\ndRJ13SfR2+2hMoUvnE/txi2011TjTkqm+K3XCUS6ibr1ptB4gSUvl41/fYjP/P4hhO6j/U6uO3KI\n0g1rSfjeN9GHhwPQc/wE797/a2598BEMppH3d6YCgKKMAmenfepHVcrnsi0bqT5xjIT/+g46c38F\n2LltO6//4kf4e3oxx0TR19pGZEoarrh4yg/uwzq1EO3oEaw52QOuZc3OoqHqEZ742u0kTSxg7k2f\npfbQQcrWbkLz++mtrUGn1yP9fuyTJ9FbXgFaEM3rHXAdodOht9nw9/YAcHLvbmxXXDZgsNiSm02b\nDNJeW4M7KfmjPeu2zdjmzwlV/gDWrExM8XFUHywmbfrIy4SjAoCijGCjfdrn4a0bCVuyOFT5A+hd\nTvr8fcR/826MUZFITaPt9dU0bN2I3m6n9/hxhNGIr7IKS+bZKZ2+qmqExYKpsIDjW7dTXrSL+Z/5\nAtf9+FcAPP7V2zBOyCXq+k8C4Fg4n84du2h/820cixaEKnhf5SmCXV1EpKZR/PYbdNTWEPzzXzHG\nRONafjlh0wohGCTo82Ewf/Rf7VogAAYLXdt30rV9B1q3F0tWJlJKgoHAxXidF50KAIoywo3maZ9B\nv3/AfHsAz/aduK9ciTEqEgCh1+O+ciVdO3YTd9cdGKMiaV+3gcYnnyb2i5/DnJyEr7qG5meew5yc\nhD7cgXPRAvytbWx78m+kz5xDoM+Hz+MhctGCAfcKnzmdludfou7+PxE+awb+1lY6N21h0edvp/Td\ntzmw4R3ivnYnpsQEek+cpOmpZxAGPYGmZlwJiYRHx/zT59MCfir3FuFpbiYiPoHyN19DFx6G+6qV\nGNxuPEV76dy77yO3IoaaCgCKogyajOmzKNmyDWtudqgv3d/SiiHCPeA8YTCgdzkJ9vR3yzgvW0xf\nbR31f3wYGQigs9txLbsMz959GNwuRGwM3mPHMUZHUV60g4ikFJBBWl95DWNUFGGzZ2JOSkT6/Qgh\n8FVXY3A5ESYTAkH2/EU8dfcdhF+1gva31uCrqsYQEUHY9Km0PPsiNoeT5d+994LP1VZTzc7nn6bq\n4AF0JiOm5CQCtfVoXi8J3/56qBsoYtVypNfL0c0bmHPTrYPzkj8GFQAUZYQajYO+7zfx8pUUv/MW\ntb+7n7BpU+mrbyDQ0oJnzz6s2Vmh8/pq69C6utBZLATaOzC4nIRNm4qvto6Eu+9C6PV0bX0Prb0T\nS1YGdQ88hNbeAZERbHnsEcxh4ZgS4rFPmUygo4OGh/+K+8qV+Kqq0Ee4CXZ76S2vRGoBpJT0dHbg\n83TR99KrRFy1ksjrPomvuobWl19F+v3cdN/9Fxz8bauu4pUf/wDbwnnEfeUO+urqaXvjLcJmTIPD\nRwaMAQBYJ06gftuuQX3P/y4VABRlhDm3399g0DN7UupwFynkxI5t7H/rdbpbW4jJzGbmtTcQmZoG\n9FeMRS8/T8PxMuyRkRSuuIr0mXOYee317Fr9Ct0lh5A+H/H3fIXGvz1B0zPPYS+cgr+5mfY31yBM\nJmp/9wAgMUZFIUxG6Oik6r9/jAwGMSXEE3P7f9D42BMYY2NI+OY96IxG2tdtpOfQYeK/ckeo0rZP\nmUTtr/8Aej1h0woJXzCPYE8PbavfQmtpo6O+Dp3ZjOvKFYTPnQ2Awe3C4HJS/+CfkcgL7lW7++Xn\nsF+6CNeSSwEwJyViiomm/q+PgaYhAwGE4WzV6q+tIzLqn3clDRe1DkBRRqAwpxWXyzaiKv+Da95k\nyzNPoFs0j8g7b6MrIZrXfnYvrVWnaKvp/1XcHuXAddvnYO5MNj35N0reeYvsBYswIRBSYoyLxZyY\nSML/uxuCQZqe+DudW7YS9PtxLV9Gyk9/SMpPfkjYrBn4KqsI9PRgSk7EmpWJv66e2l/+mt7ySqKu\n/xQ6oxEA38lyHAvmDfjFboqLwxgbizE2hqhPX4c5MQFrViZxd91BsK+PQJ8PnU6HNS9nwDOak5MQ\nAk7seC80S+j9Go6XYSuYOPB7qSkICcaYGJqefg7N6+1vaRwpo2vjFiZfseoi/21cHKoFoCjKh9IC\nfopeepbor9yOKa5/MNq5eBFoGnteexGBIOyShThP/yo2xcZgjImm6E+PMOGypVzzw5/x3t8f58T2\nrfQtW4IxOorek+VEf/ZmtPYOug+W4Dj9SxzAsWAenr37sWRlELFyOQD+xibqf/cAmt+PzmYNnSss\nZgIez4DySinRuj39M3rOoTMasWRn4evqwpWQSF91LcaIiNDn/pZWggGNnW+9ypa/PczCL9xB9vyF\nA65hd0fgb2zEFHv2V73W2UXQ78fgcGBsbqXmf36OMBiwhIWz9M57PvbuZYNFBQBFUT6Up6UZYTSE\nKv8zrBPyaHzymf50zJ/59IDPTPFxYDTgaWnGGRvPkjvvJim/gK2/fxBzZjrS78eal0vz3/+BKSHh\nvHuak5NDv/IBjDHR2GZOw7e/hJ5Dh0O/wsNnzaDp6WexTy7A4HQC0PXeDoLeHgKe7gHXlFISbG4m\nLCqaqauuYdPjj2BwOjCnpuBvaaHpyWdwXnYJ7pXL6aupZcuf/kJMRibO+LPlK1xxFZuffhxjTAym\n2Bi07m6annkWvdWKuaubT9z7U4TQ4e/pweZ2j+jtJlUAUBTlQ1kdLjRvD5rHgz4sLHS8r7aO8KgY\nQNJXV48p8WxFqXm60bxerOH9lXKgz4crIZGV3/oBmx59COn3E2hto7u4BEOEG/fKK0LdOFLT8JaU\nEHXj9QPKobNYScwvoOofL9C3qA5TYiK+o2XQ56fmZ/+LMSmRYHc3Qa8XGQzSU3IIz9792AsnIwMB\n2t5+FyM64vPyETodfd5udj7+NH3eboKahvPSS3AtXwaAKTEB+6wZHN2ykVk33BwqQ8bseXS3tVH0\nwEMIsxl/VxeuhCTm3fJ50mfPQ3+6/99ktTLSqQCgKCPMSJz5Y7JayV64mKq/P4f7xuswOB30VlTS\n8cZbLP3y3chgkHWP/BFjbAzm5CS0ri5an32RrPmLMNlsHN6wlu1PP4HR7SLQ1UWgtxd9hJuWF17G\nPq2QQHMzjX97Aueli5BS0r5mLVpnF4bos1s0Bn0+PDt3s+iebzP92usoXvMmHTuKSEnLYPJ996PT\n6zm07h3qyg7T3dZGMD8W+9zZtDz/Ei3Pv4TUNAwuJxOmzwkFmtxLLiNn4WJK1qzmYOl+3CuvGPDc\nuvAwfN0Du5cAJi1fRf6Sy+lqbsTqdGG22c87ZzRQAUBRRojQtM80w4hM9zD/1i+w/eknOPrLXyP0\negwmM/Nv+izJk/v72efdcAs7Hn2CgL8PzedDZzLhd0Vycud77Hju78R87Q5McXH9K3/fegdvcQm+\nikpcy5cR+cmr6dy4hZaXXgUhkJqGlJK63/6B8LlzEEYDnZu3kZyXT1zuBIQQLL7tzvPKOP2TNwBQ\n+u7bFB/cgyUtlYRvfR2tswthNNDx1hosDseA7widjrQZs9n14rNonm70Yf2VudQ0evbsJ+Wmz33g\n+9AbjbjiEy/mKx5yKgAoyghwbq6fkTTz51x6g5EFn/0ic278DL7ubqxOJzqdPvR57iWXUVd2hMoT\nZUSuvAJjZAStu4qoeORPOC9fGho/EHo97pVX4Nm+E2tBPp6ivTgWLcB1+RJcly8h6PNR9T8/x+p0\n4uvopP3ddZjsdmZedS2TV109oE9dSknj8TJaTlXijIsnIb8AIQTpM2ez4x9PEV5TiykxAYPTgb+x\nie49B8j45C3nPVt4dAwFl6/g8O8fxL5oPjqTCe+OXUTFxpNSOG3wX+4wUQFAUUaIkVz5n8tgMn9g\nZktPSzMndr5H4r3fQ3d6cxXXquV07duPIfJ9K391OgwuF937ixECGv/2BI4F8wj6fP1ZPd1O8Pow\nRUZgTkmm9+RJKg/sw+J00d3UhDs5mYT8Saz5w3201tdiycqg761qzAYjCXkTqS4txuJ0Uvf7B7Hn\nT0Do9XgPH2HuLZ/HGRv/gc81+4ZbSMybSMn6d2k9VUGg20Ort5eil59j2ic+hf6cAemxQgUARVEu\nipbKCqypKaHK/wxzSjLdu/dgn1QQOuZvaSXQ0kLBZcs4vHk9veXl+Jub0ZnN6MPD6T1+AvOkAiJv\n+TRCCPwtrdT+5g+0e7swZ6Tj37MD7bG/YEhKJP7730bodGg+HzU//RWnWhtw3HAtwd5egmvWYfX5\nyZ03F6bOprXqFPtefZGcRZdid0cMKKe/t4dTxfuoKt4Hej22SRMJmzGNso1baPz9CVZ9+wdD8h6H\nkgoAijKMBmT7DLv4g75+nw+paUOyK5UjJhZfbR1S0xB6Pf7GJtrfXUfvsRPIQID6Bx7CsfRStPYO\nutaux52cQnn5MWLuvJ3e4yfo2rodf2sr8VOmU6lpuK+9KtTd0/b6asLnzSHiyhVAf9dPy3MvEOzx\nhQZ0vXv3Y0pMIOp00AAwp6dR+5NfUrLubXw6gWXSRLRTx9n3n6+w/BvfJWFC/1RSGQzy+i9/TI/N\nQtzX7kQAHRs20fbaauK+did1P7+PphPHic7MOu+5RzMVABRlmJzb7++6yIO+3vY2Nv3tYaoP7AMg\nKjOLRZ+/nciUweticiclE5mcSusLL2OfO5uGhx/FsWg+cXd+CX9jI22vvEH3q28SkZzCpBtuZcvj\nj5D4w++jM5uxpCTjumwxrS++gtMVDcEgwtifRVQGg3QXl5D6sx+F7iWEwLVsKTX3/Q7vocN4Dx3G\nV3GK8DmzBowR6EwmzBnpeFtaiL/n7lCwsEzMZ8PDD3Lzb/+I0OmoKt6Px9tN7Jf/I3RO1C03Uve7\n++k5UoY1J5vmyvIxFwBUKghFGQalTR660+2hdA8Xs/KXwSCv/+J/6HTYSP7JvaT88idok/N5/ec/\npLer86Ld54Nc8fVvE60zU//gn3HMn4P7imX9SdoKpxDz5dvo83Rx+Ve/gSU8HGty8oB9AgDMWZk0\nV50iLr+Arh07P/R+0u+n9bXVGCMi0JlN+KprBn4uJb6aGmzTCgekirBOnIA/4Ke9rv/8lopyzDlZ\nA84RQmDNzaWvupq+6hrCY2I/zqsZkVQAUJQxpqb0ID4ZxHXVSnQWC0KvxzFvDubcbI5u3jio9zbb\n7Cz9ytcJj47Bdk6fP4ApLhaMRuoOl+KMjaO3thb5vo1S+k5V445LYOHnvkj3uo20/P1ZurZtx+By\n0b52feg8KSXt765DmIwkfPMenJctJvozN+M9cJDu4pL+Fb9+Px1r1iK9PRjfv4G8lP1ppk8v2gqP\njiFQW3fe8/iqa+g7VYVZpycxv+C8z0c71QWkKGNMZ2MDpqSE81IQGBIT6WysH5IyhEdF46tvwJyc\nFDqmeXvwezysuf/XTF5xJXE5ebQ8/Ryuq69EH2ane98BvDt3UfCTX+GMjefG//0DRzdtoLWuBl1k\nFC3v7cRXcQpzeiq9x47TV1ePc8lloXQRBreL2Ns+T8Ojj8MzzyEDfsJj45n2iU9Ssn4z1txcdKb+\ncz3v7SAsMio0Iyht5my2P/skHes2EH5697COzVvpPX6cuNx80hfP59i2zSRMnETdoRK87e3E5U0g\nJjN7RKd6+DAqACjKGBOVlk7vK8+FBmPP6Cs7RvT8S4ekDFNWXMXaP9+PKS62f2VwdzfNz72IfVoh\nEVeuoPS3D7D0y3dzfNd2yn7yC9DrMFltFF55DY6Y/u4wS7iDKVdeTZ/Xy5NfvY3E736T3vIK/I1N\nOJdcRvPzL0IwOOC+lswMDFERWNLSsE7IxfPSa0y58mpaqk9R9bNfYp2QR6CpBdnewVXf+2HoewaT\niat/8GM2Pvpnqtf8CIDIjEymXnktxW+/QbdRIP0BPI/8EXNcHJaMdPateYP4rByWffUb6M55z6OJ\nCgCKMkzqByndQ3RGFlFJqTQ/9iSOK5aiM5vp2rIN0dpO5ryFH36BiyB5ciHzPv0Z3nv4UQLBIAQ1\n7FMLibj2anQmI/Z5czixewe9nZ1YExOxLZgLgQDFm9biaWlm4RduD12rp6Mdvd2OweUibOrZ7J5d\nO3bSuWUb4XNmYXC7+s89egx/bR3Rt96C0e2isbkZnU7P0ru+TvXB/ex55UU62tsJi46mubIcZ/zZ\nlpIjNo5PfP9H+Lz9CeR6Ozp48d7vEPeNu0NdSOHVNdT/8c/EfPlLuD6xisaHHuHw+neZuGz5kLzX\ni00FAEUZQu+f9jkY6R6EECz/f99h76svUvbkP9D8faRPn8XMH/4M47+wyfnHlXtJf/fMzjWvE/XF\nzw1cH2Aw4Kmuprmhjrhv3RPaQMU+dQrHfn4fE5cuJyI5pf9YZBTBXh/+xiaMMWdzA5ni4+g9doLq\nX9yHNS+XoNeLr/IUluxsTNFRdB8swX06DbO3vZ31Dz+IeXIB7hVLCLS1s+35p2mvr2XGtTcMKPeZ\nvD4lb6/GNn3qgPEDc1Ii1rxcvAdLCJ87m/BLL6Fs6xYVABRFubD37/I1WJX/GQaTiVnX38Ss628a\ntHt8FClTprH50T8TaO/AFNcfAII+H96du3CmZmApnDRg9yydxYKtYCI1pcWhAGAwmZh2zac48Ojj\nOK+5EmNsDD0lh/Du2M2yr3ydg2vXUF9SghQC64RcIj6xiq7de+h4bTVL77wHgINrVmPKy8V9zVVA\n/+I0c2oKB371GyZdvgqz/fxkbprfj3jfhvYAwmRC+v39f9DrCWrB8845w9PSTNmWjfR6ukgqmEzy\n5KkX3GpyOAxpABBCRACPApcDzcD3pJRPX+j8FrvGU7O6hqp4ijKoHHWGQa/4Rxqz3c6Cz93Gtgce\nwjZ9KsJq6U+wNnEy7rgEWquOn/edYGcnZnvYgGOFq67G5nBy4O036GhrJSYzm8U/+DFRaemkz5oL\n9M9+2vPqi7T++VFcCUksv+fbJJyeuVN3/CiW+bMGXNPgcmKOjaW1qpL4vPzzypE2fSalv/sVjssW\noz+9AU2goxPvwRJcly9Bahrdm7cyafbcD3z2yr1FrHvoD9gKp6BzOjj+1GNExr7N8v/3nVDK6OE2\n1KX4I9AHxAKFwGohxAEpZekHnZzqbOHB5U8OZfkUZdBICW+2T2JPYyYFXdOHuzhDJnfRpcTl5nFs\n2xYCPh+pd32duNwJdLe2sO87L2GbOR1LehoA3tJD+CpPkf6N2eddJ2fhYnIWLr7gfRInTiJx4qQP\n/CzMHUFbQxPkTwgdk4EAfS0t56WEOCMmK4fs2fM5/pvfY5s1ExkI0LllG8aoSDy79uArOYTLHUH+\n0vO7f7SAnw0PP0jUbZ8PPZtcspjGP/6FY1s3kbd4yQWfYygNWQAQQtiBTwEFUkoPsFUI8RpwK/Dd\nD/qORW8j3zl1qIqoKIOqtqeMCMvgp2QYiZyx8cz45MC+9rDIKJbc9XXWP/wAxoiI/hTQ3V5WfPN7\nGC0XdzOVyZevZPV9P8OcnoolLZWgz0f7a28SnZ6JI/bCLbL5t36BrNlzObF7BzqzhZRvfJe26iq6\n29uIv+XzF+zSaTx+DL3bGar8oT8Lqn1B/+D3uAsAQA6gSSnLzjl2ALhkCMugKMoIkjptBp998K/U\nlx1Bp9cTm507KFMqY7JyWPT529n2+N8ICoHW00NCwWQu++o3/un3hBDE5U4gLvdsyyGxYPKH3k+n\n1yP9gfOOS39gRE0ZHcoAEAZ0vO9YBxB+7gEhxO3A7QCJSaNzlx1FuZCF9iJaY/LZA/haY5luTPrQ\n74x1eqPxgl03F1Pm3Pmkz55DV0MDJnsY1vdtDHMxRWdmofMH6D5wEPuU/mcL9vbSvWkrU284fz+C\n4TKUAcADvP+NO4ABo7xSyr8AfwGYXBgph6ZoijL4Eqw51PaUcXXkIVa5D/Ljo9ewpxUVBIaQTqcf\nsMH7YN7n8nu+xZv3/YyeHbvROR14Sw+RPWc+6TPnDPr9P6qhDABlgEEIkS2lPHb62BTgAweAFWUs\nSrDmAP3jActS6ngXVBAYo2Iys7nlDw9TuWcXPo+HhE/djDsxebiLNcCQBQApZbcQ4iXgx0KI2+if\nBXQ1MG+oyqAoI43DYqZpuAuhDBqj2UzWEK2+/ncM9YqEuwAr0Ag8A9x5oSmgijLWLbQXMcF1BHNE\nw3AXRRmnhnQdgJSyFbhmKO+pKCPRmfGAVe4SAHaiBoWVoTcylqMpyjh0ZjwAirnCeYDVbZN478g8\nFQSUITNyklIoyjiVEz4Zl8mOYQTliFHGB/UvTlEUZZxSXUCKMkKscpcQyAuypzFTjQcoQ0K1ABRl\nBEiw5hBmsHB15CHuzX2FeXnvscdfPdzFUsY4FQAUZYRIsOaExgMiLDbMEQ0qCCiDSgUARRmhHJah\n271LGZ/UGICijEAL7UV0unrp7E2HLjUWoAwO1QJQlBHmzHjAKncJ9+a+Qkn4HtUVpAwKFQAUZQQ6\ndzxgdly5Gg9QBoUKAIoywjlMFjUeoAwKFQAURVHGKRUAFEVRxikVABRFUcYpNQ1UUUawBGsOKyhh\nrnUnqx2TVJoI5aJSLQBFGeESrDm4TPZQmgg1I0i5WFQLQFFGgXP3Ep4dV85OUAvElI9NtQAUZZRx\nmCzDXQRljFABQFFGmYX2IqbHnFDdQMrHprqAFGUUObOX8NWRhzDk69hZn64GhZV/mwoAijLKnLuX\nMPRvKL+nFRUElH+Z6gJSlFEqzGBRaSKUj0UFAEUZxRbai4a7CMoopgKAooxSZ9JGfz31WeblvafS\nRiv/MhUAFGUUU4vElI9DBQBFGeXO7B1g0OnVeIDyL1EBQFEUZZxSAUBRxpBzxwMU5cOodQCKMkbk\nhE8+u0hMp2MnqEViyj+lAoCijCEftEhMJY1TLkR1ASnKGHRmkZii/DMqACjKGLXQXoTDYlbTQpUL\nUgFAUcagM4vEvpX+glokplyQGgP4/+2dd3hURff4P7ObbNqmJyShJAQwdOlSpH5BOkpTAVFAioAo\niAV+4guI+CIqNgSlKPoK2GhKU5DepBMgdEgCIYH0nk3Znd8fm4QECCSQsiHzeZ77PNl75945ezI7\n586cmXNKkLTULBZ8dYoNfwSTlWmiaw9fXn+zES4uaq22ouTJFzk02ymsgsYp8qJGACWElJJRw7Zx\n9Xwov37jxvr/eWJKvsHg/n+TkWEsa/EUFYSckYAKGqe4G6ViAIQQO4UQBiFEcvZxvjTqLWkiIlL5\n+otTvP/eITZvuEpWlin32sF/I7l5PZFfF3nRpKEt9WvbsOgTT9ycjGzeePWB6pNS8v3iM7RvuZra\nfisY1G8zhw9GFtfXUSgUFYzSHAFMkFLqs4/apVhvibB3dwTdO/1JXFgIj3nFsHj+YV58bgsGg/nt\nPuhULJ3b26LVitx7hBB062BD0KnYB6rzi08D+XPVWVYucOd6YHXGDNIyeth2Tp2MKZbvpFAoKhZq\nCugBMBpNvPPGPn7+phLfzPXkrfGu7F9fGb1NGit+vABANV89J05n3nHv8aBMqlbTF7nO1JRMvl9y\nltVLK/FEE1ucHLUMHejEtEnOLF5w+qG/k0KhqHiUpgGYI4SIFkLsE0J0LKiQEGKMEOKIEOJIbEx6\nKYpXeM6eicfORtKlvX3uOa1WMH64E1v/CgHg/7pUISpO8MFnsaSmmsjIkHzzYzx7D6XTd4B/kesM\nD0/F3c0KowmW/ZLAus3JpKeb6NDanl3bw3jx+S0c/PdmcX1FxSNGO4cjTPL7VUULVeSjtAzAFKAG\nUAVYDKwXQtS8W0Ep5WIpZXMpZXM3d8twWp07G8fWv68Rdi0ZAJ1Og8EgkVLmK5dmMKGz0QJgZaVh\n+W9d2XtCh3fDYDzqXuHn9bDi9644OemKLIO3tx03IzNo0e0q2/ek8fV38dRqFcJvfyTSpoUtL/WF\ncS/v4N8Dyggo8pMTLdRF58CsuuvVslBFLg+9DFQIsRPoUMDlfVLKtlLKg3nO/SiEGAz0BOY/bP0l\nSUJCBuNH7eDyxXga1rXl4LFUevXx44OPWqJ3suGHXxMZMcgZgJRUE58sTGToyCa591eu4sCyFV1I\nTs7EZJKF7vgvX0og/Hoq9eq74u5h3s15+FAU7q5aDv9VDXc3s5H57c8kRk++yaaVlXnyCXu0Gpg/\n7wStVnUrZk0oHgVuXxa6O9arrEVSlDEPbQCklB0f5DZA3LdUGTNz2kECqmWwdbkvVlaCpGQTfV66\nwbIl5/nq2w4MG7yVn1alUsPPik3/pNClazX6Dbxzekevty5UfXFxBiaM3sWF83EE1LQhMMjAi8MC\neGdaU9atusSUCa65nT/Ac0878sG8WIQwq7JbR3vemKHe6hQFk2MEFAoohY1gQggXoCWwC8gCngfa\nA5NKuu6HIS01i782XiPkiB9WVuYO1lGv4cOprrwy5QKjx9Vj17/92f7PdaKjDKwYW4nadVweuL61\nv19h1vSDPN3Nni3L/bC2FkRFZ9F9cDA1arlgMGShd7jTZro6a0gzmKeijp1Kx9fX4YFlUFQsbNxu\nqo1hFZzS2AlsDcwG6jyqhooAABsbSURBVABG4BzQV0pp0XsBDOlGhABnp/xuEi9PLYlJ5tU9NjZa\nevTyfei6Nq0P5eMPD5GebuTzWZ5YW5s7ek8PK2ZNceXDr8/x3At1WLw8kOefccw1SMdPGThzMYM2\nzW05dtLAa9NimPz/nih0vZE301i6KIhDB27g4WHLC8Pr0qlzlYf+PgrLprJdAL1cT9LNOZCNcQ05\nGlmTBknNylosRRlQ4gZAShkFtCjpeoobFxcdNWrqWbMpmYG9HXPP//BrEh06Vn6gZ2ZlmVj+4wU2\nrLtMZqakW08/RoyqyzfzTzLzbVemz43BwT7/W35VHyvi4jLoN8CfTX9eoXXvcF7oZ8/1m0a+W5GI\nySSo0iQUvd6KiZMb0+cZP44fi2bfngicnW3o/Ywfrq5mZ3pERCrnzsRRtZoeFxcdfXtupM9TNsx7\nT0/w1UxmTN1H6CsNGT6q7oMrTlEuULkDFKBiARWIEILpH7RizPDtHA3MoHEDHVt2Gdi628Dq9R0f\n6JkTx+0mPiqWGROd0ekEXy29zLDtYQQHJ9O7SzXmfBnHzv1pdHry1vLS5auSeKKVFzciUlm0rBM7\ntoWzd3c4zs42rN/Snmq+epISM3FytkYIwdsT9/HvvnD697In8IyJTz86xoLFHdi6OZQ1q4Np3siO\noPMGHPQ6OrfVMf9DTwDatbKjTQtbWvUK5LnBtbB3KJzfQlF+yfEH5ISJiCprgRSljjIA9+CJVpVY\nt7kXK/53npUbE6nXwI9N0wNwcy96nPUTx6MJPBbJ2T1VsbHREBiUjosTHDwah62NhuWrE/lslgdD\nxt7g9VEu1K+jY/WGZDZsTSU9PZ6tm0MxoWHKtGbM/qhVvmfv23uDFT+c5dLFRFwcJad3VsPe3jx1\n9c/uVAaP2UUtfyuuHPTF2UlLVpZkzJs3CY/Iv1Gtlr8O3yrWnD+fQJOmHg+uOIVCUS5QBuA+VPd3\nZNqM5kW6JyvLxPZ/rrNtaxhpqRlU93cGAT0622Njo2HvwTQGvBzBOxNcGT3Umd0H0pj+cSzTJrqx\n6jtvPl4Qx5eL40hKNdGmuR2/LPLB3U3LidPp9B56mEpedrlz9d/MP8Xqn88xe6orS5ZrGdTPMbfz\nB+jS3h4PVxjSV4+zU84eBcFnszyp1iSYlFQTDtnl09NNXI/IxNNTJRKpSLRzOEJrv4NsdGrI/nNt\n1DRQBUIZgGLmbFAcI174h9TUDJo2tGFgH0dOnU1k5Zpk/P3M0yrT/hvNF7M9GdzP7Fto08IOH28r\n3pwRxezPTbg4aTFJsNIKZrzlnrv0s3EDGz6e7s7XXwbSqXMVkpMzWTj/NMe3VsW3qjW/rEsqcG2t\nq0t+Z7aTo/nz0ZMG2reyx2Aw8c7sWBo3cX+gUBWK8klOCskcfwB14GhkTeUPqCAoA1CMGI0mXnl5\nO00aaKjkoWfJvFsbbbq0t2PExJssXBbL/iMGtv6ev5Md2FvP6Mk3cXfV8u4kN1o2tWXbnlQGvBzB\n+uWVeaKJ+a28fm0bwq7GA3DxfDw1/HT4VjUblgG99cxbGMezffTY2Zk7+O17U7kWnkXQuYx89W3Y\nmoJnJVsGjrxJJU9rbkZl0ryFJ58taFdi+lFYLjn+ADdbe+UPqEAoA1CMHDsSjb2tJPSakffecM89\nf/pcOoeOG8jKksz6PAkbHVwOyaRuwK2dwZeCM3F00LDks0r0fspsHJo1ssXdTcvMT2LYtNI85bP+\n72Q8K5mdxF7e9oRey8BgMGFrq+HZPnr+2p5CnbahPNtHT8i1TLbsTKVhHR0LfkggOk7SvZMtgWcy\n+fbHRBYu7UjT5p5cvpiAm4ctPj72KBSKioOKBlqMpKRk4eaixd5OQ3yCOSz0wmXxdH3uOiaT5O1X\nXdEKI1ZWGsa+c4OYWHOZqOgsXp50g6QUEz0759/I1be7nr0H0zh9Lp3Zn8cw9+s4Xspeplm5igNP\ntPJiwrRoEpOMaDSCV15yJj7ByIEjaTSoY8NnH3hyM8pITT9rwmId+H6NICzelfETGxJ8JZEbEanU\nb+imOn8Fle0CVNC4Coa4PaCZJfF4Y3e5aWuvshaj0CQnZ9K66SpeHe7Erv2pLPvSixbdr3F0qy/V\nq5mnaZKSTdRrF0Lr5nZs25OKX1UrQsOyqF3LmpNnMjixzZda/rdGBvsPp9FveDi2tmajUtnLipsx\nJp4fXIv33m9BcnIm7751gO3brmOrM8ckGtBbz7IvvXOfcei4gadfDKdHH3/6DazJmOE7aPq4DZU8\ntGz6J5khLwbw9rtNc0NKKCo24WkXiM9Iyd0kpvwB5Y9Fg/sdlVLed/WKmgIqRvR6a6bPasGcWYfx\nq6KlceerPNXBPrfzB3M4CfNbuomLB6oTci0Tf19rVq5JwmDMZOQbkaxa6o2nhxVh4ZmMfTsSG53A\nYDDhXcmK2o/puBaeyrLvznPo35u8N+sJWj3pQ7MnvGja3INhg7fSpb09/UeEc/ZiBqlpkrQ0E1lG\nyMiUjB+9i++/8MgdacTEutGmz2VaPelD+wfc4KZ4tDA7hvNvEiNJGYBHETUFVMw8O6gWy3/rhl+A\nNyYJqammO8okp5iIjM7CzVVL08dtcdRr+Gl1CmPGNyRd2lOzZQi124RQr10omVmSV1925oUB5jn9\n5o/bcDOoBnHna+JbKYOXnt/KyX/PcXTPeQb120JWFkz5IJreXR344Stvhg40h46Y+rorm9YH4+0p\n8k0zubtpeW2kE3+suVyaalJYOHlzCSseXdQIoASo18CNLxa0JyZqC7sORHLwmIGWTc0/pKthmSz7\nOZE0g+TLJXG4uWhZujIZvYsjPXv74u1tx8ihW8nIlEyf7I6Dg+DbHxOIuJmFjQ7em2x2Lp86m86h\nE+mc2eNHtSrWXLueyfufSn79I5m/f65K88bm+lo2tcVGJ7h0JZPhzzty4PCdSXbsbAUZ6SpRvaJg\njmaGqWmgRxBlAIAbN1JZtzqY+Lh0nmznQ9v23g89H375UgKnT8XStKGO7s+H0amtPQ72GjZvT2H6\nZDcW/pjExt1W2Ntb0X9II1q09GTmtEPs2XkdieD4P764OJvX/7/0nBMBrUPw8bo1lfTruiSGP+9E\ntSrWHD5hoM/QcHp2scfZSZPb+efQt4eeIWNvsPp7bxb/7xqBQek0qm+OD5SebmLx8mRGjCv3aZoV\nxUxluwDaZR2hdW2jChr3iFLhDcCO7deZNH4P/Xo4UMVHwwfvXca/ljsLlnTEyurWDNne3RF8+/VJ\nrlxK5LHazox7vRGtWhecUGPd6mB6/J8d+w+lYmcnOHM+g/Zt7Di5w4/K3las2WxgxOj6dOhUmYjw\nFJ7psZEXB9jzTFcdKanWuZ0/gIO9hmHPObHof3G89m4kN6OyiIk10qqZuaOfPD2KT2d60KerA9Wb\nhxAXb8TV5db9F69k4OOl5ezFTCp5aOg8IAxDhsTVWQNoaNqiEr36PHxUU8Wjhwoa92hToX0AGRlG\n3p64jzXfebH4U09mvOnOsS1ViYuMY+2q4Nxy/2wJ441XdzFyoGD7Km9e6AOvjtrBnl0RBT77/Lk4\n/vw7mTEvObP7j2rMm+XJvoNp/LouifOXMjh11kCzFuZAbN8tOsPzT9szZ5oHdQN0xCXcmo5JTzex\neVsK67ckk2WEyOgsDh1PZ98hA18uSeCtmVEcO2lgUF9HnJ209O+lZ8K7kSQmmZ9x8UoG0+bE0Lmd\nPaMn3yQpWTLnPQ+uHvXn96U+eHpo8a/hjFZbuKaQkJDBH2uDWbv6CvHxlpmzWVG85PUHONlaRppW\nRfFQoUcAJ47FUNlLS7tWdrnndDrBqyOcWL4+hGcHmdMWfzb3GEvmeeY6T2v4WaN3EMz75BjtOtx9\nmeqF83FMGuPCW+PdAHOgtdo1rWnR9SoffR3HtOktcjOFHT8ayUdTzOvw+/fUM3V2NLsPpGGSkiFj\nb+Dva43eQYMQgh170/h9qQ/tW9tx7mImg1+JQAhBYpIJN1ct8z/0ZPzUSKo3C8HJUUN0rBGhgaUr\nErC2Frw+yoXRQ81pLFs1s2Pjch/qd7jAuNcb4uh475SVG/4IYcrk/TRrZIM0Sd55Yz/de/ry5cJ2\naDRqCalCUd6o0CMArVaQkXnnPoiMTJmbdMVkkpw6lUC3jvk3SvX4PwcCA+MLfHZacuYdm7pq+evQ\n6zX06V+LQUMfyz3v5W3P2YvmUA2uLlpWfuNNrxfC6DM0nJ8WeLNvQzUObPJlz5/VMJqgWhVz6Oe6\nATpWL/NBCHhzRiRGo8TeXsM3cytRv66OZ7o7EHHSn7Dj/lw4UB1bG0Gntvm/h4+XFVV8rLkWmnxP\nXd24kcqUN/ezc20V/vm9CttWV+XAxmps2XyVWdMP3/NehUJhmVRoA9C4qTtJyfDn37c6v+QUE18s\nSaTXM+a3f41GUKWKLafO5o+lExiUTrVqdhSEl489J8/mnyKJizcSG2diSJ7OH2DYqHp8+GUCR04Y\nAPObuc5a0L6VHZ3b3eqwG9a1YehAR1auTsw9V7O6Dp1OsH5rGv4tQuk1NIJqTUMIvZbFJzM8cHTU\n5kYBTTOY+PdoWr66Y2KNXI/IpHLVe6eS3LQ+lD5P2ec6jwEer2fDc0/rWfnTRdLSsu55v0KhsDwq\ntAHQajXMX9SBMW/F8PSwG4yfGkWdtldp1KxKPqfoqFfqM/rNKC4Fm43AuYsZjJ8aw8hX6t/1uSHB\nSTRv6cPk/0SzY18qUkpuRGYxZNwNatdxpk5d13zlW7byYup/WtD35Uj8moXg3eAKWq3Aw117x7M9\n3LQkpdwatQQGpZORIfns6/Ys+ekp+g5pyu9/9sTDS8+4qdEEnU/n5Jl0hr4aidBaMWNuDOs2J2M0\nSi6HZDB4XCT9B/rj4mJDaEgSFy8kYDLdOSoypBlzI4jmxdlJi85aEBWZdsc1xaNFO4cj1HU5p8JE\nPEKoUBBASnImf2++RlxcOm3aelO3Xv4OWkrJwi9PsXTRGcyrQwVjX2vA6LH18i0XlVLy4ftHWPXL\nJbp1ciD4aiaBQWkIwCShbVtvFn7XEVvbu7tesrJMvD5+L4a4SKZNcqP30HAuH/TPNQRpaSbqtg3l\nhQGOvPGKKyeC0hn1xk0C6nnyw8ou+Z6VkJDB/M8C+WtjKEIj6P10dSZMepxjR6OZO/swQUGJODlZ\n8eKwAJ7uX4O3J+7lelgytjYatNZWfPTZk7Ruc2uV07mzcTz3zGYu7PfDzdUsT2yckYYdQ0k1CI6e\nfg5b2zsNluLR4kLSSbJMalmopVPYUBDKABSBjAwjsbEGTgXGsnlDCMYsE916Vqd7L180GsFfm67y\n+ZyD7F5XOXcZ5orVicyYl8zm7X1wKESaxU/mHCc95hoL51Zi0nuRrN2UwsQxLtjbCT5fFI+UEke9\nhpBrWbi5aIiJFxw6MaDIKRwzMoxYW2vIypJ0arOWyWMcGDfMGY0GNm1LZcTEKP7a+TTe3remoCa/\ntpfd26/y2khzgpvFPyViNMKLI+rz6qTHi6ZMRbklPO0CyVkGPg0eSFS4i1oSaoEU1gBU6CmgoqLT\naVmyMIi57/9Lh8YpdG1lYOHnh5n82h6klPyx+hKTxzrlW4M/pL8j1lojly4m3uPJt+jR24+1m1PM\nvojZlVj2lRdnzqczfW4MbTrVwNXDkdDrJoRGg4eXE2s2dH+g/L06nRYhBDu3X6eKl2DCyy5otQIh\nBL26ODCgtwOrfskfHuKz+W15dXJTFq1I5b9fxGGUVoyb2ITxExsWuX5F+SUniYyi/FOhl4EWlfPn\n4vljzRXO7K6Wu1Fr6ABHGncJ49DBSNINRhz1+W2qEAK9gwaDoXBO0gYN3ejaw4/Wva7zxitOaLWC\nY6cyadOuCrPntEAIwY0bqQD53s4flMibaTxW404DEuBvRVBY6h3nR4ysw4iRdR66XkX5p67LORIN\n/hyNRY0CyilqBFAE9u6O4JnuDvl26drZaXj+GQd2bQ+nc1c/vvnR7GDN4eAxA2HhWTRuUvgk6//9\npDWTprRk/S4b1m6zZvTrzZm/qH2uv8Hb275YOn+A5k9U4u8dKfmC1kkpWftXGs1bFrzTWVGx0VvZ\n0sv1NNNrr1NO4XKMGgEUAb2jNZHRd0b3jIw2UcnfmoGDarJ5Ywht+oQz6Gl7rkUYWb4qmbmfP4mN\nTeEdpEIIevT2pUfvkg/PULuOCx06VeWpQRFMneCMg72GBcsSyTDZ0L1ntRKvX1E+yZtLeFbd9fwR\nU0/lDiiHKANQBLr39OW/7x9h257U3PX5R04YWLUhmb93+GNjo+WHlV3Y+lcY+/eG4+pmyx9/1cSv\numMZS35v5n7eht9WXuLjRZfJyDDSpVtN5o6qg06X32iFhiSxaMFpThyLxMfHgeGj69Oug08ZSa2w\nBFQu4fKNMgBFwNlZxzdLOzJ07G78fa2wthKcuZDOx58/iU9l80YqKytNqb29FxdarYbBLwYw+MWC\nnXvBVxIZ2Gczo4fqefVjZ85cyOCdSbuZPKUZzw6qVYrSKhSK4kIZgCLSpq03B44N4OCBSLKMJlq1\n9sLO7tFX4zdfnWTccEemTzbHNmrR2JaGdXT0GXaMfgNr5Iucqqh4tHM4QqKLQTmFyxmPfs9VAuh0\n2go39XHsaBTvjHTLd67p47ZYayXXw1IsfppLUXLcWhZ6km7OgWqTWDlCvbYpCkWlSnZcuJI/HlJc\nvJGERCOubipEsMKcO8BF55DrD1ArgywfZQAUheKlkfV4979xnL9kNgIJiUbGTY2mZ29fnJzuHUZa\noVBYJmoKSFEouvf05UZECu37BuLqqiUyKouu3asya06rshZNYWEof0D5QcUCUhQJg8HI1dAkPD3t\n1NSP4q7kxArKCRq3/1wbZQRKmcLGAlIjAEWRsLXVElDbpazFUFgweTeJPeN+BuqgjICFonwACoWi\nRMjJJWylUd2MpVIs/xkhxAQhxBEhRLoQ4oe7XO8shDgnhEgVQuwQQvgVR70KhaJ8YON2s6xFUNyF\n4jLN4cBs4PvbLwghPIA1wH8AN+AI8Gsx1atQKCycXq6naekdzGnHo2ppqIVRLD4AKeUaACFEc+D2\nib7+QJCU8vfsMjOBaCFEHSnlueKoX6FQWCY5/gC91YV8m8RU0DjLoDQm5+oDgTkfpJQpwOXs8wqF\nogJQ2S4g3yYxhWVQGgZADyTcdi4BuGvsACHEmGx/wpHYmPQSF06hUCgqKvc1AEKInUIIWcCxtxB1\nJANOt51zApLuVlhKuVhK2VxK2dzNXb0pKBQKRUlxXx+AlLLjQ9YRBAzL+SCEcABqZp9XKBQKRRlR\nXMtArYQQtoAW0AohbIUQOcZlLdBACDEgu8x04KRyACsUFY92Dkeo63JOpZG0EIrLB/AekAZMBYZm\n//0egJQyChgAfAjEAS2BQcVUr0KhKCfkbAxTuYQth2IxAFLKmVJKcdsxM8/1f6SUdaSUdlLKjlLK\nkOKoV6FQlC8q2wXkho1WRqDsUXu0FQpFqVPZLgArjVYtCS1jlAFQKBSKCopFh4MWQkQBoYUs7gFE\nl6A4xU15krc8yQpK3pKkPMkKFVdePyml5/0KWbQBKApCiCOFiX9tKZQnecuTrKDkLUnKk6yg5L0f\nagpIoVAoKijKACgUCkUF5VEyAIvLWoAiUp7kLU+ygpK3JClPsoKS9548Mj4AhUKhUBSNR2kEoFAo\nFIoioAyAQqFQVFDKjQEozrzDQojq2WVSs+/pUsKyJ992GIUQ8wsoOzz7et7yHUtSvrvIsFMIYchT\n//l7lBVCiLlCiJjs42MhhChFWW2EEN8JIUKFEElCiONCiB73KF/q+hVCuAkh1gohUrLlHFJAuTLV\nZbYMhdanJbTVbDkK1V7LWr+W2A8US0rIUiIn73A3wC7vBXEr7/AoYD3wAea8w60KeNbPwAGgZ/ax\nSgjxWHbgumJHSqnPI6sDcBP4/R63HJBSti0JWYrABCnl0kKUGwP0BRoBEtgKXAG+LUHZ8mIFXAM6\nAFcx/z9/E0I0vEfMqdLW7wIgA/ACGgMbhRCBUsrbQ6KXtS6h6Pq0hLYKhWuvZapfS+wHys0IQEq5\nRkq5Doi5y+XcvMNSSgMwE2gkhKhze0EhRADQFJghpUyTUq4GTmGOWFoaDAQigT2lVF9JMwyYJ6UM\nk1JeB+YBw0urcillSnYwwhAppUlKuQEIBpqVlgz3IvuHPgD4j5QyWUq5F/gTePEuxctUl2D5+nxI\nyly/ebCIfqDcGID7UJS8w/WBK1LKvBnJAgsoWxIMA/4n7738qokQIloIcUEI8R9xK7dCaTInW4Z9\n9xl65tM9pavLOxBCeAEB3DvhUGnqNwAwSikv5DlXkI4sSpdQKH1aQluFwrVXS9KvRfQD5WkK6F7o\ngdunbwrKO1xQjuIqJSBXPoQQvpiH1iPvUWw30ABzDKT6mKeysoA5JS1fHqYAZzBPWwwC1gshGksp\nL9+l7O36TAD0Qghxn8Zd7AghrIEVwI/3SDhU2votSk5si9ElFEqfltBWofDt1SL0a0n9gEWMAETp\n5h0uUo7i+1FE2V8C9kopgwt6npTyipQyOHv4fQqYhXm4WCwURl4p5UEpZZKUMl1K+SOwD/Nc8N24\nXZ9OQHJx/aAKq18hhAb4CXMnMKGg55W0fu/Cw7TNYtVlUSiMPstAl3elCO3VUvRb5v1ADhYxAijl\nvMNBQA0hhGOeaaBGwMoHqbiIsr8EfFTUKoBiW6nwgLq+lwxBmPV3KPtzI4ox33Nh5M1eyfEdZidr\nTyllZlGqoBj1excuAFbZiwwuZp8rSEclqsvC8hD6LGldFpaC5LAI/WIB/cCtp0pZLg7MxsoW8xDo\np+y/rbKveWIezg3IPj8X+Pcez/oX+DS7bD8gHvAsYfnbACmA433K9QC8sv+uA5zG7LAuLT27YF5p\nZZut8xey5a5dQPmxwFnMU2iVMf+gxpZy2/g2+3+qL0TZUtcv8AvmlWcOwJPZbbW+JeqyKPos67aa\nXW+h26sl6NfS+oFSbVgPqbiZmK1g3mNmnutdgHOY8xHvBKrnufYt8G2ez9Wzy6QB54EupSD/IuCn\nu5z3xTw09c3+/Cnm5WEpmJeozQKsS1HPnsBhzFMU8dkdwVN5rrfDPGzO+SyAj4HY7ONjskOMlJK8\nftltwZCtx5zjBUvRL+AGrMuu8yowxBJ1eT99WoIui9JeLVS/FtUPqFhACoVCUUGxCCewQqFQKEof\nZQAUCoWigqIMgEKhUFRQlAFQKBSKCooyAAqFQlFBUQZAoVAoKijKACgUCkUFRRkAhUKhqKAoA6BQ\nKBQVlP8PXXSbeW9Pz64AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "clf = LogisticClf(C = 3, lam = 1.0)\n", "clf.fit(X, t, show_message=True, method='newton-cg')\n", "ax = plt.subplot(111)\n", "plot_result(ax, clf, xx, yy, X, t)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that data are completely separated, and the decision boundaries are straight, because we employed 'linear' basis functions. \n", "\n", "Moreover, Newton method and Newton-CG method converge much faster compared with gradient descent method in terms of both iteration number and real computational time. Note that in this case we have $MC = 9$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4.2 Hand-written digits\n", "\n", "Let us try out larger data. Here, we use MNIST hand-written digits data." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training data : 1347\n", "Test data : 450\n", "Input dimension : 64\n" ] } ], "source": [ "digits = datasets.load_digits()\n", "dat_train, dat_test, label_train, label_test = train_test_split(digits.data, digits.target, test_size=0.25)\n", "\n", "print(f\"Training data : {len(dat_train)}\")\n", "print(f\"Test data : {len(dat_test)}\")\n", "print(f\"Input dimension : {dat_train.shape[1]}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Thus, in training phase, we have $N=1347$, $M=65$, $C=10$, and hence $MC = 650$." ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true } }, "outputs": [], "source": [ "def show_result_digit(clf):\n", " label_test_pred = clf.predict(dat_test)\n", " print(f\"train accuracy score: {accuracy_score(label_train, clf.predict(dat_train))}\")\n", " print(f\"test accuracy score: {accuracy_score(label_test, label_test_pred)}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us compare the results for three solvers." ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "success : True\n", "nit : 2065\n", "calcualtion time : 3.0380754470825195seconds\n", "train accuracy score: 0.9977728285077951\n", "test accuracy score: 0.9733333333333334\n" ] } ], "source": [ "clf = LogisticClf(C=10, lam=1.0)\n", "clf.fit(dat_train, label_train, method='gd', alpha=0.01, show_message=True)\n", "show_result_digit(clf)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "success : True\n", "nit : 9\n", "calcualtion time : 23.935264348983765seconds\n", "train accuracy score: 1.0\n", "test accuracy score: 0.9666666666666667\n" ] } ], "source": [ "clf = LogisticClf(C=10, lam=1.0)\n", "clf.fit(dat_train, label_train, method='newton', show_message=True)\n", "show_result_digit(clf)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "success : True\n", "nit : 9\n", "calcualtion time : 1.0520105361938477seconds\n", "train accuracy score: 1.0\n", "test accuracy score: 0.9666666666666667\n" ] } ], "source": [ "clf = LogisticClf(C=10, lam=1.0)\n", "clf.fit(dat_train, label_train, method='newton-cg', show_message=True)\n", "show_result_digit(clf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It can be seen that \n", "* The numbers of iteration for Newton and Newton-CG method are much smaller compared with that of gradient descent method. \n", "* Newton method takes quite a long time, while Newton-CG method terminates much faster. This is because Newton-CG method requires less computational cost in solving the linear equation which appeared in the update equation.\n", "\n", "Interestingly, \n", "* In gradient descent case, training accuracy does not reach 1.0, which Newton method attained, because in this case the iteration can terminate before it reaches true minimum.\n", "* However, the test accuracy for gradient descent training is better than that for Newton method.\n", "\n", "It seems that this is an example of early stopping." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below, we use Newton-CG method to train logistic regression classifier with different values of regularization parameter. We can see that, as we increase the regularization parameter, the training score gets worse, while the test score gets better, which is consistent with our intuition that larger regularization means larger bias and smaller variance." ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "lambda = 0.03\n", "success : True\n", "nit : 12\n", "calcualtion time : 3.8450474739074707seconds\n", "train accuracy score: 1.0\n", "test accuracy score: 0.9666666666666667\n", "lambda = 1.0\n", "success : True\n", "nit : 9\n", "calcualtion time : 1.0370075702667236seconds\n", "train accuracy score: 1.0\n", "test accuracy score: 0.9666666666666667\n", "lambda = 30.0\n", "success : True\n", "nit : 7\n", "calcualtion time : 0.31400346755981445seconds\n", "train accuracy score: 0.9977728285077951\n", "test accuracy score: 0.9711111111111111\n" ] } ], "source": [ "lams = [0.03, 1.0, 30.0]\n", "\n", "for lam in lams:\n", " print(f\"lambda = {lam}\")\n", " clf = LogisticClf(C=10, lam=lam)\n", " clf.fit(dat_train, label_train, method='newton-cg', show_message=True)\n", " show_result_digit(clf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Appendix scikit-learn\n", "\n", "In this appendix, we demonstrate how we can use the scikit-learn library to perform logistic regression.\n", "\n", "For detail, see official documentations ( http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html )." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true } }, "outputs": [], "source": [ "from sklearn.linear_model import LogisticRegression" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\nUIoMBlumzWzN7Jl/E+SvpVmXizzUyaGg8gfLchKWb+lmzuyuRcSlPIIDbVmxOh2jKY/RL8ax8nNf\nvDxtiIrO45lX4rDTCYxGM77eNtS7R8el6CyWfnGKvX/F8vrMNoTe70fLNj60aOXJiMc307WjAwNG\nRXPiTC5Z2ZLsbDP5JsjNk4wfs43/fuRZcKeRmOROu7BzhN7vR8c7fMBNKb4OjvvYTBj786LUQLBS\n4VQXUCl7ZHBdln3fnaAQX8wSsrLMN6TJyDQTl5CPu5uWFk31OBk0fL0qk7Hjm5AjHajTNoJ67SJo\n2CGSvHzJs0+6MHSgpU+/VVM7Yo/VJvlUHQK9cxn+2GYO/3WS/TtOMbj/JvLzYfJbCfTp5siX//Fl\n2CDL0hFTXnBjw7oL+HqJQt1MHu5anh/tzI+rz5VnmKqlqzuGzWywjnb1/+So0361f7BSodQdQBlo\n2NidjxZ0JDF+E9t2x7HngJG2LSyzeC5G5bH0mzSyjZKPlyTj7qrl8xUZGFyd6NUnEF9fe0YP20xu\nnmTaJA8cHQWffZXKldh87HTw+iTL4PKREznsPZTD8R1BBPjbculyHm9+IPnuxwx+/aYmrZpZ8mvb\nQo+dTnD2fB4jH3Ni9983brJjrxfk5qiN6svD9dNCbTQa9oBaKE6pMKoBAGJisli76gIpyTnc38GP\n9h1977o//NzZVI4eSaJFEx09Houic3sHHB00bNySybRJ7iz8Kp31221wcLBhwJB7ad3WixlT97Lj\nj8tIBAd/C8TVxTL/f/ijzoTcF4Gfz7WupO/WpjPyMWcC/G35+5CRsGHR9OrqgIuzpqDyv6pfTwND\nnolh1X99Wfy/S4Qfy+HeRpb1gXJyzCxelsGocVV+m+Yq42oj4KzTq4XilApV7RuArVsuM3H8Dvr3\ndMTfT8Nbr58juK4HC5Y8gI3NtR6ynduv8Nknhzl/No176rkw7oV7Cb3Pp8jzrl11gZ4P2vPn3izs\n7QXHT+XSsZ09h7cGUcPXhtUbjYwa04hOnWtwJTqTvj3X88RAB/p205GZZVtQ+QM4OmgY8agzi/6X\nzPOvxREbn09ikonQlpaKftK0eD6Y4UlYN0dqtYogOcWEm+u1z585n4ufj5YTZ/Lw9tTQZWAUxlyJ\nm4sG0NCitTe9w+5+VVNFUaqWaj0GkJtr4pUJu1j9hQ+LP/Bi+kseHNhUk+S4ZNasvFCQ7rdNUbz4\n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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "clf = LogisticRegression(solver='newton-cg', multi_class='multinomial')\n", "clf.fit(X, t)\n", "ax = plt.subplot(111)\n", "plot_result(ax, clf, xx, yy, X, t)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "train accuracy score: 1.0\n", "test accuracy score: 0.9555555555555556\n" ] } ], "source": [ "clf = LogisticRegression(solver='newton-cg', multi_class='multinomial')\n", "clf.fit(dat_train, label_train)\n", "show_result_digit(clf)" ] } ], "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.3" } }, "nbformat": 4, "nbformat_minor": 4 }