diff --git a/experiments/Riemannian_vs_baseline_car.ipynb b/experiments/Riemannian_vs_baseline_car.ipynb index a17eb5b..3909230 100644 --- a/experiments/Riemannian_vs_baseline_car.ipynb +++ b/experiments/Riemannian_vs_baseline_car.ipynb @@ -136,7 +136,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Train" + "# Choose the learning rate" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Riemannian" ] }, { @@ -146,21 +153,223 @@ "collapsed": false }, "outputs": [], + "source": [ + "riemannian_lr_arr = np.hstack((2**np.arange(6), 2**np.arange(6, 10, 0.3)))\n", + "best_riemannian_loss = np.inf\n", + "riemannian_loss_arr = np.zeros(riemannian_lr_arr.shape)\n", + "for i, lr in enumerate(riemannian_lr_arr):\n", + " # To use the same order of looping through objects for all runs.\n", + " np.random.seed(0)\n", + " model = TTRegression('all-subsets', 'logistic', 4, learning_rate=lr, solver='riemannian-sgd',\n", + " max_iter=20, verbose=1, batch_size=500, fit_intercept=False, reg=0.)\n", + " model.fit(X_train, y_train)\n", + " riemannian_loss_arr[i] = model.logger.loss_hist['train']['logistic'][-1]\n", + " if best_riemannian_loss > model.logger.loss_hist['train']['logistic'][-1]:\n", + " best_riemannian_loss = model.logger.loss_hist['train']['logistic'][-1]\n", + " best_riemannian_model = model\n", + " best_riemannian_lr = lr" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.loglog(riemannian_lr_arr, riemannian_loss_arr)\n", + "plt.xlabel('learning rate')\n", + "plt.ylabel('logistic loss after 20 epochs (train)')\n", + "plt.title('Riemannian SGD 500')" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.loglog(best_riemannian_model.logger.loss_hist['train']['logistic'])\n", + "plt.xlabel('epoch')\n", + "plt.ylabel('logistic loss (train)')\n", + "plt.title('Riemannain SGD 500, LR %f' % best_riemannian_lr)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## SGD" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "sgd_lr_arr = np.hstack((2**np.arange(-12, -2, 0.1)))\n", + "best_sgd_loss = np.inf\n", + "sgd_loss_arr = np.zeros(sgd_lr_arr.shape)\n", + "for i, lr in enumerate(sgd_lr_arr):\n", + " # To use the same order of looping through objects for all runs.\n", + " np.random.seed(0)\n", + " model = TTRegression('all-subsets', 'logistic', 4, learning_rate=lr, solver='sgd',\n", + " max_iter=100, verbose=1, batch_size=500, fit_intercept=False, reg=0.)\n", + " model.fit(X_train, y_train)\n", + " sgd_loss_arr[i] = model.logger.loss_hist['train']['logistic'][-1]\n", + " if best_sgd_loss > model.logger.loss_hist['train']['logistic'][-1]:\n", + " best_sgd_loss = model.logger.loss_hist['train']['logistic'][-1]\n", + " best_sgd_model = model\n", + " best_sgd_lr = lr" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.loglog(sgd_lr_arr, sgd_loss_arr)\n", + "plt.xlabel('learning rate')\n", + "plt.ylabel('logistic loss after 100 epochs (train)')\n", + "plt.title('SGD 500')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.loglog(best_sgd_model.logger.loss_hist['train']['logistic'])\n", + "plt.xlabel('epoch')\n", + "plt.ylabel('logistic loss (train)')\n", + "plt.title('SGD 500, LR %f' % best_sgd_lr)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Train" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [], "source": [ "plain_sgd = {}\n", "riemannian_sgd = {}\n", "\n", "for batch_size in [-1, 100, 500]:\n", - " # To use the same order of looping through objects for all runs.\n", + "# To use the same order of looping through objects for all runs.\n", " np.random.seed(0)\n", - " model = TTRegression('all-subsets', 'logistic', 4, 'sgd', max_iter=10000, verbose=1,\n", + " model = TTRegression('all-subsets', 'logistic', 4, best_sgd_lr, 'sgd', max_iter=12000, verbose=1,\n", " fit_intercept=False, batch_size=batch_size, reg=0.)\n", " model.fit_log_val(X_train, y_train, X_val, y_val)\n", " plain_sgd[batch_size] = model\n", "\n", - " np.random.seed(0)\n", " # To use the same order of looping through objects for all runs.\n", - " rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 'riemannian-sgd', max_iter=800, verbose=1,\n", + " np.random.seed(0)\n", + " rieamannian_model = TTRegression('all-subsets', 'logistic', 4, best_riemannian_lr, 'riemannian-sgd', max_iter=1400, verbose=1,\n", " batch_size=batch_size, fit_intercept=False, reg=0.)\n", " rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", " riemannian_sgd[batch_size] = rieamannian_model" @@ -175,7 +384,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 22, "metadata": { "collapsed": false }, @@ -185,7 +394,7 @@ "np.random.seed(0)\n", "w_init = tt.rand(2 * np.ones(X.shape[1]), r=4)\n", "# Divide by norm to make sure the norm is reasonable,\n", - "# round to make all the ranks are valid.\n", + "# round to make all the ranks valid.\n", "w_init = ((1 / w_init.norm()) * w_init).round(eps=0)\n", "\n", "plain_sgd_rand = {}\n", @@ -194,19 +403,61 @@ "batch_size = -1\n", "# To use the same order of looping through objects for all runs.\n", "np.random.seed(0)\n", - "model_rand = TTRegression('all-subsets', 'logistic', 4, 'sgd', max_iter=5000, verbose=1,\n", - " fit_intercept=False, batch_size=batch_size, reg=0., coef0=w_init)\n", + "model_rand = TTRegression('all-subsets', 'logistic', 4, best_sgd_lr, 'sgd', max_iter=12000, verbose=1,\n", + " fit_intercept=False, batch_size=batch_size, reg=0., coef0=w_init.copy())\n", "model_rand.fit_log_val(X_train, y_train, X_val, y_val)\n", "plain_sgd_rand[batch_size] = model_rand\n", "\n", "np.random.seed(0)\n", "# To use the same order of looping through objects for all runs.\n", - "riemannian_model_rand = TTRegression('all-subsets', 'logistic', 4, 'riemannian-sgd', max_iter=1600, verbose=1,\n", - " batch_size=batch_size, fit_intercept=False, reg=0., coef0=w_init)\n", + "riemannian_model_rand = TTRegression('all-subsets', 'logistic', 4, best_riemannian_lr, 'riemannian-sgd', max_iter=1400, verbose=1,\n", + " batch_size=batch_size, fit_intercept=False, reg=0., coef0=w_init.copy())\n", "riemannian_model_rand.fit_log_val(X_train, y_train, X_val, y_val)\n", "riemannian_sgd_rand[batch_size] = riemannian_model_rand" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Random init with beter distribution" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from src.models.all_subsets import tensorize_linear_init\n", + "np.random.seed(0)\n", + "w_init = tensorize_linear_init(np.random.rand(X.shape[1]), np.random.rand())\n", + "for _ in range(2):\n", + " w_init = w_init + 0 * tt.ones(2, X.shape[1])\n", + "w_init = w_init.round(eps=0)\n", + "\n", + "plain_sgd_smart_rand = {}\n", + "riemannian_sgd_smart_rand = {}\n", + "\n", + "batch_size = -1\n", + "# To use the same order of looping through objects for all runs.\n", + "np.random.seed(0)\n", + "model_rand = TTRegression('all-subsets', 'logistic', 4, best_sgd_lr, 'sgd', max_iter=12000, verbose=1,\n", + " fit_intercept=False, batch_size=batch_size, reg=0., coef0=w_init.copy())\n", + "model_rand.fit_log_val(X_train, y_train, X_val, y_val)\n", + "plain_sgd_smart_rand[batch_size] = model_rand\n", + "\n", + "# To use the same order of looping through objects for all runs.\n", + "np.random.seed(0)\n", + "riemannian_model_rand = TTRegression('all-subsets', 'logistic', 4, best_riemannian_lr, 'riemannian-sgd',\n", + " max_iter=1400, verbose=1, batch_size=batch_size, fit_intercept=False,\n", + " reg=0., coef0=w_init.copy())\n", + "riemannian_model_rand.fit_log_val(X_train, y_train, X_val, y_val)\n", + "riemannian_sgd_smart_rand[batch_size] = riemannian_model_rand" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -216,7 +467,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 31, "metadata": { "collapsed": false }, @@ -225,6 +476,7 @@ "with open('data/riemannian_vs_baseline_car.pickle', 'wb') as f:\n", " obj = {'plain_sgd': plain_sgd, 'riemannian_sgd': riemannian_sgd,\n", " 'plain_sgd_rand': plain_sgd_rand, 'riemannian_sgd_rand': riemannian_sgd_rand,\n", + " 'plain_sgd_smart_rand': plain_sgd_rand, 'riemannian_sgd_smart_rand': riemannian_sgd_rand,\n", " 'X_train': X_train, 'y_train': y_train, 'X_val': X_val, 'y_val': y_val}\n", " pickle.dump(obj, f, protocol=pickle.HIGHEST_PROTOCOL)" ] @@ -238,7 +490,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 32, "metadata": { "collapsed": true }, @@ -265,16 +517,16 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 58, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n1MPaAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -294,49 +546,45 @@ "plt.loglog(logs['plain_sgd'][500].logger.time_hist, logs['plain_sgd'][500].logger.loss_hist['train']['logistic'],\n", " label='Cores SGD 500', linewidth=2, color=colors[2])\n", "\n", - "grid = np.array([0.01, 1, 5, 30, 60]) / 2.5\n", + "grid = np.array([0.7, 4, 25])\n", "x = logs['riemannian_sgd'][-1].logger.time_hist\n", "marker_indices = np.searchsorted(x, grid)\n", "plt.loglog(logs['riemannian_sgd'][-1].logger.time_hist,\n", " logs['riemannian_sgd'][-1].logger.loss_hist['train']['logistic'],\n", " marker='o', markevery=marker_indices, label='Riemann GD', linewidth=2, color=colors[0])\n", - "grid = np.array([0.05, 2, 12, 30]) / 2.5\n", + "grid = np.array([0.05, 2, 24])\n", "x = logs['riemannian_sgd'][100].logger.time_hist\n", "marker_indices = np.searchsorted(x, grid)\n", "plt.loglog(logs['riemannian_sgd'][100].logger.time_hist,\n", " logs['riemannian_sgd'][100].logger.loss_hist['train']['logistic'],\n", " marker='o', markevery=marker_indices, label='Riemann 100', linewidth=2, color=colors[1])\n", - "grid = np.array([0.1, 7.5, 60]) / 2.5\n", + "grid = np.array([0.1, 0.9, 30])\n", "x = logs['riemannian_sgd'][500].logger.time_hist\n", "marker_indices = np.searchsorted(x, grid)\n", "plt.loglog(logs['riemannian_sgd'][500].logger.time_hist,\n", " logs['riemannian_sgd'][500].logger.loss_hist['train']['logistic'],\n", " marker='o', markevery=marker_indices, label='Riemann 500', linewidth=2, color=colors[2])\n", "\n", - "grid = np.array([0.1, 3, 20, 53])\n", - "x = riemannian_sgd_rand[-1].logger.time_hist\n", + "grid = np.array([3, 25])\n", + "x = logs['riemannian_sgd_rand'][-1].logger.time_hist\n", "marker_indices = np.searchsorted(x, grid)\n", - "plt.loglog(riemannian_sgd_rand[-1].logger.time_hist,\n", - " riemannian_sgd_rand[-1].logger.loss_hist['train']['logistic'],\n", - " marker='s', markevery=marker_indices, label='Riemann GD rand init', linewidth=2, color=colors[0])\n", - "\n", - "# plt.loglog(plain_sgd_rand[-1].logger.time_hist,\n", - "# plain_sgd_rand[-1].logger.loss_hist['train']['logistic'],\n", - "# marker='v', markevery=marker_indices, label='Cores GD rand init', linewidth=2, color=colors[0])\n", + "plt.loglog(logs['riemannian_sgd_rand'][-1].logger.time_hist,\n", + " logs['riemannian_sgd_rand'][-1].logger.loss_hist['train']['logistic'],\n", + " marker='s', markevery=marker_indices, label='Riemann GD rand init 1', linewidth=2, color=colors[0])\n", "\n", "legend = plt.legend(loc='upper left', bbox_to_anchor=(1, 1.04), frameon=False)\n", "plt.xlabel('time (s)')\n", - "plt.ylabel('logistic loss')\n", + "plt.ylabel('training loss (logistic)')\n", "plt.minorticks_off()\n", "ax = plt.gca()\n", "ax.set_xlim([0.02, 100])\n", - "ax.set_ylim([1e-17, 2])\n", + "ax.set_ylim([1e-6, 4e1])\n", "fig.tight_layout()" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 59, "metadata": { "collapsed": true }, @@ -356,16 +604,16 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 79, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbMAAADWCAYAAABbo2zaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd4VGXWwH9nZpJJDy0JPQldKQIiIIiAoCL2LvbuZ69r\n2dVFrKirrrLquuuKBXtXiiAiICBFeq8pQHpCejKTmXm/P+6dTE8mIYQE5vc882TmLfe+N5ncc895\nTxGlFCFChAgRIkRrxnC0FxAiRIgQIUIcLiFhFiJEiBAhWj0hYRYiRIgQIVo9IWEWIkSIECFaPSFh\nFiJEiBAhWj0hYRYiRIgQIVo9IWEWIkSIECFaPSFhFiJEiBAhWj2mo72Aw0FEQhHfIUIcJZRScrTX\nECKEk1avmSmljsrr5pmrSX5sNmu/ewM1NQ71xXUopfhsVQbJj83m5pmra8dOnToVpRQOh4Nef51D\n8mOz+cf87UGdZ21GEcmPzWbQ0/OptNjYl19On7/NJfmx2Szfk3/Urr+ul/N6j5dXi77e7+7Svp9r\nP2rS44YI0dJoscJMRFJF5D0R+fJor8Ubu0OxOr0IgC6DxmmNmatAKX7dkQfAGSck+swTEbq0iQRg\ny8HSoM71/rI0AK4e0Z3IcCOpHaK5bUwPAOZuzj6cywgR4phDRJJE5DMR2S0ia0Rktoj0asbzXysi\nG0Vks4isF5H/iEic3vebiOwQkQ0isk1E3hSR+OZa27FOixVmSqk0pdStR3sd/tiZU0ZZtY0ubSJJ\nShkAkW2hPIfqgnSW7S4A4Ix+vsIMoHdSLABpBRX1nieruIp5W3IwGoTrT02ubXcKyuV7Cg/3UkKE\nONb4DliklOqtlDoFeAJICmaiiBgP58QiMgm4HzhbKTUQGAqs8Dr/FKXUYGAQYAV+OJxzhnDRbMJM\nRP4nIrkissmrfZL+tLJLRB5rrvUcDqvTNCEyIrUdGAzQbQQAK9euo6rGzomd4ugUH1k7fty4cbXv\nh3RrA0BemaXe83z0RwZ2h2LywE4exxvUJZ7YCBNpBRUcOFTZFJfUpLhf7/HA8Xa9LRURGQ9YlVL/\ndbYppTYrpZbr/a/oGtNGEblCbxsrIktF5Adgq952jYisEpF1IvKOaBhEZKaIbNLn3+9nCX8FHlZK\n5ejnVkqpD5RSu92XqffZgEeBbiIy8Aj8Oo47mlMzmwmc7d4gIgbgX3p7f2CKiPTzmtfiNpmdJsbh\nqe20hm7DAVi0U9PKJniZGN1vdmP6JABQabXXufdgdyi+WJMJwM2jUzz6TEYDp/ZoD1CrCbYkjreb\n+/F2vS2YAcBafx0icgkwSNeYzgReERGnxjQEuFcp1U+//1wJjFJKDQUcwDXAYKCLUmqQUuoktPuZ\nN/2B9cEuVinlADYB3ve8EI2g2bwZlVLLRCTZq3k4sFsplQEgIp8DFwI7RKQd8DwwWEQeU0q91Fxr\nrQulFKvTvIXZCJSCX/NigMAmRoD+neJq3+/MKaOf22d3tmeXcqiyhq5tIxnSva1P/5jeHViwLZdl\newq4anj3xl5OiBBHnJTH5xyWx0j69HOb4oH2NOAzAKVUnogsBk4ByoDVSqlMfdwENPPgGhERIALI\nBWYDqSLyBjAXWODnHLXXKSIDgI+BWOAJpdRXAdbV4h7WWytHe8+sC7Df7fMBvQ2lVJFS6k7d9t0i\nBBnAvoIKCsqtdIgxk9ohWmvsPJRdksxBexvaR4dxUtc2AecbDEJUuGaaX7YnsFa1cp9myhypa2De\njO7VAYAVewtxOELeZSEaT6XVxv6ilmeubgRbgWFBjnUXIhVe7R8qpYYqpYYopU5QSj2jlCoGTgIW\nA3cA7wU4/1AApdQWpdQQYB4Q6Wes0zI1ENge5JpD1EGrjjMDePrpp2vfjxs37oibfJxa2YjUdmgP\nbkB4FL9GnQPVML6LA4Oh7oetxFgz6YWVrM8sDjhm5T7XefyR2iGaLm0iOVhcxbbsUgZ0CTlFhWgc\nY176jcIKK4sfGUeK8wHNi8WLF7N48eJGHb+JNKt6UUotEpHnReRWpdR7APp+VDzwO3C7iHwEtAfG\nAI8AJ3gd5lfgexH5p1IqX0TaomlXFWj7cd+JyC40rcub6cA/ROQipdRBvc1bkIm+LhPwApCplNpy\nmJcegqMvzA4C7jayrnpb0LgLs+bAx8Sos6BmMAATo9LqPUZqh2jSCyvZlVvmt9/hUKzR9+UCaWYi\nwuhe7fnyzwMs21MQEmYhgkYpxfXvr6ZtVDhvThlCYYUVgD8zDgUUZt4PitOmTWuOpTaGi4E3RORx\noApIBx7QtzlOBTai7YP9RTc3eggzpdR2EXkSWKBrTlbgbqAamKm3KeBx7xMrpeaJSAdgnj6uGNgC\nzHcbNktELIAZWIi2rRKiCWhuYSZ4qvdrgF76Xlo2cBUwpZnX1CD8CbOckmo2lMVhxsrplt+AO+s8\nxoAu8fy2M5+s4iq//TtyyiipqqFLm0i6tYsKeJzTeifw5Z8HWL6ngP8b27PhFxOiRVFQbqFtVDjG\nejT7w6WowsrvuuPQm1OG1LYfC8HQuifhlQH6HkXzIHRvWwIs8Wr7CvC3x3VyEOf/GP9aG0qp8fXN\nD9F4mtM1/1O0mIs+IpIpIjcppezAvWibqVuBz5VSLdZ+vL+okoPFVcRFmOirx4sB/LItB4Axhk1E\nZf0BDnudx3E6dFRY7ZRU1vj0O/fLApkYnYzqqWltq9OKqK6p+5whWjabD5Qw7LmF3Dhz9VFbQ+sX\nZSGOZ5pNmCmlrlZKdVZKmZVS3ZVSM/X2eUqpvrqjx/TmWk9jcNfK3PfF5m/NBeDsmH1gKYX8HXUe\nJ6W9S9vamlXi078qrW7nDycdYsz0SYrBYnOwM8e/yTJE6+CHDZp1/fdmCLWo3esNEeIY4mh7M7Yq\n/JkYSyprWLmvEKNBmNhDF1L7V9V5nC5tXXvC6/cf8uhzOFyu/yN61K2ZAXRrq50zt7S6/gsI0WJp\nTvkS8FQh1SxEKyYkzBqAM1h6RKpLY/p1Ry42h2J4Sjvapur7D5l1CzOzyUh8ZBgAH67IoMrqMhHu\nzivnUGUNHeMi6F7HfpmTxLgIAHKDyCgSomWydFc+//29fsehpiKQ4FS6NCuqsGK1OZptPSFCNAUh\nYRYkeaXVpBVUEBVupH9nV6DzAqeJsX9SbSaQ+jQzgN6JmtdYXpmFd5bsrW2v3S/r0S4oc1BSnLl2\nfSFaJ9e/37z7ZBJAN5u3JYcX5m5n6LO/MOG1xc26phAhDpeQMAsSp1Z2cnJbTEbt11ZdY2fJrnwA\nzurfEZIGQFg0HEqD8rw6j9e9ncsF+t9L9tYGrQa7X+YkyamZhYRZCC9+zfiVnYd2+nYEeEZavDOf\n/yzdB8D+Iv+etiFCtFRCwixI3IOlnSzdlU9VjZ1BXePp3CYSjCboqnvv1qOdddVNiH2SYrDaHDw/\nR6tvtqqeYGlvnJpZbmnIzHjEWfshrJhxtFcRNA8sfoBthdt82o9l/4+jWQJGRProZV7Wi8hWEfm3\nW99wvW+niPwpIj+JSH+9b6qIHNATG+8Uka+949/cjnOZiGwREbuIDPXqe0K/7u0icpZb+1A9QfIu\nEfnnkbr+o01ImAWJU5gNTXblSaz1Yuzf0TVQz6BfnzDrpjuBpLSPJircyM9bc/jojwwKK6wkxLql\nyqqHxNiQZtZs/HQfLHgSqvxnbmktcVrHsCyDo1gCBngTeFVPg9UfmKEfNxH4Anhc99weBrwIuAeH\nvqan0OoLfAksEhF/5pnNaIHhHrFxuvC7Ai2jyTnA2+Lap3gHuEUp1QctNMoj4fuxQkiYBUFxpZUd\nOWWYDMLV/13FvM3Z2OwOft2hCbOzTnT7X+k2Uvu5v+59EGcwdEG5hbvHaw+Oz8zWnqI9UmXVg9PM\nGExJmRBNhN0rNrC6lJqlr3PFy1/xxLebm+QUHyxPY9SLvwYMrG8oJdWuNR+rrvktoARMR9wyGCml\ntupv7wE+UEqtcutboZT60d91KKW+RMsacrWfvp16SRnvP+KFaHG6NqVUOrAbGC4iHYFYpdQafdxH\nwEV+f4GtnJAwC4I16Zr7fLvocAB+2ZbL6rQiiitr6NEhml6JMa7BXfU8p1nroSawtuQUZvsPVXHL\naal0bxeFXU8YHOx+GUD7aC1jRFGFFYstFDjdPHhpYAv+Rtiip3mj8jE+W53pf0oD+H79QZ7+aRtZ\nJVXkz7wGfnsh8ODtP8Gy1+s95vytObXvj01RBhz9EjD/BH4TkTki8oC4qkj3B9Y18FrW07DSMN5J\n2w/qbV3QErg7qU3mfqxxtHMztgqcxTjDdMePnbllLNima2X9O3o+6Ua2gYQTIH87ZG+E7iP8HrNj\nXARhRiFf16ieOu9EbvvoTwBGBhFf5sRgEBJjzWSXVJNXaqkz/VWIBpC3HSryIfX0+sce0P5unaWo\nSU79wBcbAOglBzmp5FdY8iuM/ysFVQXMT5/PRb0uIjpMN0N/ca32s/fZkHRiwGPa3SoruH9dm8M0\nOvDDgYd1ks03bG4VJWCUUh+IyM/AJDTt53YRGew9TkRWAnHAfKXUgwHWeww/cxwZQppZEKzS98sq\nrTYAdueW1T7pnt3fjzk+CBd9o0E0pxHgwKFKJp6QyB2n9+C6kcn0TIgJOM8fibWmxtC+WZPx9kj4\n8Hwozap/rAT5b7T6v/DhBVATnOnQhGes1//98n9MXz2dF1e96Du4Ws8kk76sVrh64CZOVID3xwBH\nuwQMSqkcvbr0RYAdTSvbglteR6XUSOAptGz+gRhCw0rDHAS6uX12Jm0P1H7MEdLM6qHcYmPLwRKM\nBuGQnkfRaldkl1STFGf2X7us+0hY92EQTiBRZBRWsr+oil6JsTwx2a8DU70kxYY8Go8YpdkQ19mz\nzUcCBPkQPfcR7eemL+DkG+sd7n0Wp5v98oP+vldKM2t/cK728ekS796gzhEM7kH+wdBEmlW9HO0S\nMLpjxa9KKZu+V9UOTXC8DawUkZ+VUiv14d4mFHE7zqVoptCH6rlk99/rj8AnIvI6mhmxF5rGqUSk\nRESGoyV2vx7NUeWYIyTM6mFtxiEcCvokxviUbDnrxI7+a5e5ezQqFdAXuls7TTPbf+jwCiOGYs2a\nGy8R0NBbtc0a5Fn8HzivtJr9RZW+JmVb4L9/QGHWCNXs67X76x909DhqJWCAs/RzO1XvR5RSeQAi\nciXwsoh0BvKAAuAZt7kPiMg1QDSaJneGUqrQ+wQichGal2QHYLaIbFBKnaOU2iYiXwLbgBrgLuX6\n494NfIBmMp2rlPo5iN9jqyMkzOrBmZGjW7tIH2Hm4ZLvTrseENVB23M5lKZ99kNXPa/i4Vb5DcWa\nHWWCNTPWEpwAcQSSkgLphRUewmxbVgmvz1/Hf/3PaNK9MUsLTnV1NEvAKKUeBh4O0LcaGBegbxoQ\nVIE4pdT3wPcB+l5Ec/n3bl+LVtH6mCa0Z1YH1TV2vl6rOQK1i9JyKbbRf4YZJXAiYBGXdlZHnsZa\nj8bDzLZQu2cW0syOAH6EQGPNjN7z7TV+ygUpXjL9h7uMPwTUzPwtYdqPW1mxz+WAsninVwaaALKs\nMSLuWHXtD9G6CQmzOvh23UHyyyz06xiLTfcGS9bLt0SEGWu9G/0ShBOIM3C6ycyMIQeQo0ODb+5K\nE2TTu2uOJm70kGyuNC3m0bAv6pzvI05FeWhyN85c4zUjwJEaIM1+2pjFC3NbbLnBEMc5LdbMKCJR\naBunFmCJUurT5jy/ze7g3aVaAuA7x/XkgxXpAJRVax6NFRYbVpuDcFMAgVa7bxY4eNqlmYXMjK2L\nJtDMSg9CTSUU7PLoMrp5MNatmXmuQVB1jw/YHrw0u/ez9QCcMyCAeT1EiKNIS9bMLgG+UkrdAVzQ\n3CeftyWHjMJKureL4tyBnUgr0Lx39+VXIIBDafsWAek8BAxhkLctYPqj9tHhRIYZKa22UVLlW3E6\nWJJCKa2OHH5Ul73Fez0bmnDPzF27CiSchlnK6f/73VCe73VU8fjk0RdABWvMVlq5xdbwSSFCHGGa\nTZiJyP9EJFdENnm1TxKRHXoSzMfcurriimhv1tQWSineXqzdsG4/vQdl1TaKK2sIN2o3iw4xmiZU\nZ3XnsAjoPBhQcNBP3A/a3kOtR+NhaGdtosIINxkoq7bVxsKFOHLc8cvtng0BC4QpyN7kmwlGKQJp\nc+4CycMBZMs3fH4wh2FV1XyYn0bCgQUw/4mAazR4CbMytYcvdtRlugye/FDqtBAtkObUzGYCHgku\ndTfXf+nt/YEpejoZ0ARZV+fQ5lokwJJd+WzPLqVDjJnLTu7KPl0rC9NNioO6avXMvL0bfQjG1Kh7\nNB44jH0zEXGraxa60QREKfj0KpjzSBMf2Ovr6dBNhVu+gXfHwKxL/Uzx/5UOqJl9fTP9rVZm5rg5\ndpS5UlQZvAKsxUuY5bKU51Y9R7m1nE0HXDFojdHMdtT1EBcixFGi2YSZUmoZcMireTiwWymVoZSq\nAT5HS5gJWvbry0TkLeCn5lonUKuV3XJaKhFhxloTY6XFjtEgTDhBy/pRnzDLMCQzbbGFqdPfYNp9\n15OR5ltNOBiPxrT0NG5++GbOu+M8bn74ZtLSfY8TMjUGQcl+2DUP1gRyYPfP1sKt7CvZF3iAm2BK\n5BC80Bnbz0+yZf77WmPGMn+T/B7K4fYvWZ+cqahyfWc+Cff0yPbWzJzUOGqY8t+VtZ8bsmfWGjgO\nSsC4j10nIpPc+o7rEjBH2wHEOznmATQBh1KqEri5uRe0NqOI1WlFxEaYuHZkdwDSCsoB7eYyIrUd\nQ7prZWB25ZYHPE5GWhozXn+FaaPCiQ6vpsL6PVPvXc29M+aRnJpaO65rPR6NaelpXPLoJVgnWjGY\nDaRZtM/fvvwtqSmu47g8GkOaWUAMDf+6V9kquWq29jUMnA/fJZiuNf0CtipMK2eQbT+ZAX6LigQO\npA9mz8zJruxihrg9jiaJ61nRWzNzHdN7L63OU7RGvgNmKqWmQG0GkCRgT30TRcSolDqcLQ1nCZjZ\n+vGcwspZAuYqZ+Z8ERmFVgLGmVn/NaXUa3rfFWglYAb4C5x2H+u2dvcSMF2BhSLSWw+cdpaAWSMi\nc0XkbKXU/MO4zhbJ0RZmh83TTz9d+37cuHGMGzfusI73zmLtCfy6kcnERmgxZU7NDLRA6R4J0RgN\nQnphBdU1diLCfO9YH7w+lWmDc4kO125I0eHCtEFZ/OP1qUx986Pace4ejaXVNWQUVJJeWEF6QQXF\nVTVsX/BSrSADMJgNWCdaeXbGs7z/6vu1x0msNTOGNLOANNhRAyprfJ18fERMAMEUUE7UtWemxO97\nf5jw3B9danblrA0ozLyk1/vLfLV8fyxevJjiZZ8ENfZoEagEjFv/K2hJgB3A80qpL0VkLPAsmtWo\nL9BPz8RxHxAGrALuQvuD/Q8tcFoB7yul3vBaQoNKwAS6Dn1dk9FKwPirBuvvi1FbAgZIFxFnCZgM\n/JeACQmzJuYg0N3tc4OTYLoLs8NlZ04ZC7fnYjYZuGm0S+vZm++6oZ15YhJmk5GU9lHsza9gT145\nA7r45gt1lGYT3c7zOxcdLjhKsz3anJrZbzvzGfS0TyJuIg5kEHay503YYDawq2gXSqnaAFanZpZ5\nmG7+rZmCqgK+3f0tl/W5jHYR/gLam2brVXzkhH9tKrBmVZc3o7uZsT5hFjgTh/cemuuYnud+9Zdd\nfsd5M27cONqc5vo/KFn+WVDzmpmgSsDomtIaEXFm/hgC9FdKZXqVgLHr2xzXoKWJ6qKUGqQfL87P\naZwlYJYDv6BpiCVo/gAfNPBa6ioBc4+IXAf8CTysn6ML8IfbGGcJGBuhEjBHBMHzjrIG6CUiyUA2\ncBUwpZnXVMu7S7S9siuGdSNBT97rcCjSdGHWv3Ncbab7vh1j2Ztfwa7cMr/CzBDXiQqrqtXMACqs\nCoO11GNcjw4xdIgJp6DcSkSYgZT20SS3j6Jzm0hmLk+noMRMksVRq5kBOCwOdhfv5tYFt/LQsIfo\n374/w/QK2N+uO8gDE/vU1l47nrhv0X1sLtjM2ty1vHvmu74DGpG5QvwIFF/NrIEaXx35Ot3NjI+E\nfVnnYUx1OPkONexmU8DeZubp+MMzZj5dEioB4+Jt4Bk9gfBzwKvArfVd/PFAc7rmfwqsQCvbnSki\nN+n26XvRvhhb0dTkhqUYWPMepC2FslyfDYDZm7K49cM/eXHedr76cz/rMg8FjOfaX1TJDxuzMBqE\n20935VLMLavGateecicP7FTb3icpFtBqm/njxgenMXVTZyqs2poqrIqpiy3cmLgN1vyvdlxkuJEl\nfxnPyicmsP2ZSfz8wOm8e90wpp7fn7F9EojocwXVPxlwWLQ1OCwOLHMtdB3XldU5q7lq9lU8tvQx\nOnWoYmyfBMotNmYs2t2gX2FzU1BuYdbKDCqaOF5pc4FmUVqft77pDhqMAGxEBhCrw/+1u2tjlxj9\nOY64CA/zt52icZFpkd/28V+OJ/aEx4lK/SdwzIVxHPMlYJRS+W4JhP+L7mNAqARM82lmSimfEuB6\n+zxgXqMPPMctr6c5Hjr0hg59IKEPa/f1ZeF2xUKvr0RCrJmeCVqF6J4JMfRKjOGH9QexOxQXDe7s\nkcB1j5uTh3vtMqcw2x3ACSQ5NZV7Z8zjH69PxVGajSGuE/c+2o/kDS/BnIcgLAoGa0potNlEtNn3\nT3HtyGSW7Mqnfdsn6L9jIfmVeSRGJ/Lk609SHRnF3P2z+HTHp8xNm8svGb9wVrebkN09mLUyg5tH\np7bYQp03f7CGTQdK2JpVwouXDDo6i6hDO3LHn2bmQ5tktAoj2ozaUwSYuz5vPQmVY2rjTgwRmShb\nG5Qtrl7TojtGCRxof65xNc943MO85kbkYIrZia28f8AxNXZH3SnbgqVpNKt6OR5KwIhIRz2ZMmiJ\nJbbo70MlYI72Ag6bwddqKYEKdmoFCg/+WRukfJMjkWFhqew19mBPWF/2qk7srYohv8xCfpmFlft8\nKwNvzSrlwS820DMhmp4JMfyiV5SONZvolRhbO84pzHZkl1JptREV7vurTE5N9XD2ACAhGn75O/xw\nlxZY3f/igJd2Rr9EurSJ5GAxvPJ/LzG2TwIAry3YyZuL1vLKZVfy08VTmLF+BnP2zWFO1n+IaHMN\nVYcG8vL87cyYUmeS76OGM87pj72BNYu6yKvMwyAGOkR28NsfVIb4OoSZUi6R4s+RwmdWrCu9UzD2\ntCX7F3PlaNd9Kjr1bQDKtk9vkDALq+NkUcH8DqTu7PdNJsyal2O6BIx+jMH6NaSjaYmESsAcC8Ls\nore0n0ppJVcKdmmv/F10z9tK95wtULVK+/MCDpOQZWrPHrqxt81p7IkaxJLCNmSVagN255WzO89X\n2zqxs+d+b0r7KMKNBrJKqjnx7/OJNZtIjDOTGBtBUpyZpLgIuraLorv+6tImUsvjOPp+rdLw4hfh\nm1vBFAl9J/mcD7Rq1FeP6M4r83fy8R8ZjO2TwJaDJbylx8F9sWY/lw8bxfQx07nuxOt47c/XWFkz\nB4pP4KeNOSQlzOGvE87B0AgvvvpYtruA5PZRh6X9NeZGaXfYmfDVBAA23xDYWd4vHiWWHfizshdU\nFXDJD5ewtCHHNYbVvpWwolqJVpc4yS7PplMd/cFgOmy/+rrnW20OolrZ1utxUALm+jr6jusSMK1f\nmDkRgZhE7ZVymqtdKS1TQu4WyNmMIXcrXXO30LVgI+NK1lNWHMlsy5tANB+ccoCYbgPY6+jMnsIq\n9uZXsGJvAdU1DiYP9EyuajIauGt8T75ee4C8MgtlFhtl+TYPz0fv5XVpE0nfpFh6J17IJb1y6LNn\nJurL65CznoeTroQIXxP6FcO68c+Fu1i0I5fMwkoe+2YTdj2D/58Zh8guqaJTfCT92/fnvVEv8PvG\n93miZjUHM0bx3q8WVhXeyVOn38LwTsN9ju2PXbll/N+stTx6dj8mBUgou/lACdf+T/MyTp9+blDH\n9UdjhJlNufZ5qm3VRJgiGjBbBXivtyjF/zbO4pDFPV7LF582t/g1ozlbe4avh4cWP8xir7bwhJ8h\n/9T6JzvPFfTIQNQtzFpy3bIQIbxp9cLsmrnXEGWK0l5hUUSaImvfe7SFRxHZcyRRfc8gKiyK6BoL\n8ekrmLUih7KcaIbLdsZtfhY2wzBTBHQ5GbqP5KmcMH4vSWBkymifcz8wsQ8PTOyDUoqSqhpySy3k\nlVWTW2ohp6SK/UVVZBZVkllUSXZJFQcOaa9fd+TxbyYyzXSAG/gF5v0F689PsqfDGRT3vZL2/c8g\nNSGWcJOBhFgz5wzoxI8bs7j+/VWkF1bSpU0kvZNiWLwzn7mbc7jlNC2MQGaew+lFe1k88VmuNNlZ\nt9fMli1juLH4b4zv1YcHhz5Ir7Z1J0N4/JtN7Muv4P9mrQ0oqDYfLPHb3lACVhyoA3cTYqm1tGHC\nzG2uzW7F5KZRAcxYtIf/rU/HnOBq87dnlmSzwS9TYcQdENcZjC71JZCZ8EDZAc/cbH6GmTssbpAw\nO2zNzDfGwANLTUiYhWg9tHphtim/8Q7IymGiIl+zOoR1WMp3Es/g6mpSrdWQsRwylvMsgBks7/2F\n9Mg4iiJiKYlqQ3l0e6piErHEdsQW35lwcxzRYdFEhUXRsWMUPbpqgjTa1JbIsEjCJILcYge78yrY\nmVvG7twyPs65i3XF/bhCFjHauJUT8+dB/jwylibylmMsy9tcQFLnrkTr+3HphVoM2fMXD6DCYmfx\nznzmbMqqFWYUaebHsIzf+eSGu7nyPyvYdAAq0+/il7Kl/Lbjb1xw4kAeGnE7iVGJfn8nFZb6EyBY\nbU2T9zm8EZqZQ7lusKWW0oDXUR+3LriFD8773KPttV92Ed6h/j2rN/IKIOefkL4MbvuVAmspzt27\nQHFml/54Kc6IWSGwThQo2NkfwfzzHo7nhaWJ/s4hQjQHrV6YfXzOx1TWVFJp015VNVW1753tVbYq\n13u9v8pWRV52b8rtcRjMWWxsn8YmiQfiibfbGWyxMKTaSl+rlV7WGjra7aRUFJNSUQyF+33WkWc0\nkmUykmXVo3qsAAAgAElEQVQysd1kIstkYm+4iV3h4VQYtJu2IESaIokOiyYmJoaUQYlERiTwMxex\nuuxShmWlc2LOzySTx4OGr7iodCnnFEynGnPteQwCL/28kx4doggzCusyi0kvqGBrVimvWV7hEdOX\nnIMQGW7kyztG8bfvtvDNugNYCyZiBT4/YOXHda8xNOEU+rbtx/WjUnhND5y994xe5AVR4NMZqnC4\nhJmCv9X+tDGL2ZuyeP6SPrVtpV4xe+7Y7A5MPsLSJSi25gfabxOvT75rjHcmEs5aB8B/trzHX/U+\n95yI7mKp0uYKZhfVuArP3hzpPbOMwkp6J8XWOSZEiJZCqxdmgxN9YhKDwmZ3MOG1JRRRyT8vnsw5\ng26kxl5DjUN7We1Wlu7J5vrvNjC4WyzTzuqE8dA+pDgTY/EBwkqziCjLJaoin5jKYhLtdhLtdgZb\nrD7n2h9u5vfISOZFmdlgdlBpqyS/Kp+0Es9UQp9FRTL5jKu4ITKV5OXvkFq4ix8GLOPbdrexJr2I\nnTllVFjtbM8uZXu260Y+/tXFugWtC3+vuZEx9jnEoFXD/sflgzi7fxIr9xXxZ2Yum/ZDZf4YluXD\nMtJ5f0V6rfXt5y05HvskX/65n8tP7lqbZcSJtYn2Utw1sxUHV9CzTU+SopP8jnUWhjyxq8uk5xRm\n+0r2sTbXlfjBYrMz7PmFrPrrBMwmt50lt5t/QDFaTwqp+ghGwNSlmTXoXPX0n1FRyUXlddTcq2cV\nK/YWMvFE/3+PECFaGq1emDUW9+Kbkwd2wmQwEGbw3EMpL6vGYelI/w7JDOw+ALqP8X8wuw3KsuBQ\nhpaZvXg/HEqD3K2Qv4NuVgtXWy1cXQL2pP6UnXILeT1Gk1dVQF5lHrmVuazOXs2fuX/yzZ7v+QaY\n3CGJ6YVCn70f8MTEm2CytmdXbrGxO7eMXbllzNmUzdLdBbX36LaUkU9bntvZhYNvzKZo/S/YHXY6\nxkcx9aG7+Pv541m1r5DXF69ic/HvVJd3wl7Zk7hIA6VVDp8N/0e/3sS0H7eSGBfBlOHdGJbSjqHd\n2zaZMHM6gKzKXsUdC+/AIAY2Xr+xzjnbslz7dSUW7f2F31/oMcahoLSyhrSCCvp1dPdCDUKYHWbK\nq7AgKkU3lTCri6WREZo5tC7q2TNzf2AKEaKlc1wKM6UU7+ju7XeM7eHHHKXhTDCc2iG67gMaTdCm\nu/byxl4DB9fB9h9h05cYc7fSZvZDtEkaQJ9JL0LvSwC486Q7SStJ49vd3/LDnh+Ya8llYFw015aW\nk/HJRSyf9DTDOo+gV5teDOneliHd23Lh4C6c8vxCyqptXDmsG2dvvJebax7l26Ie5P7yPvGnXYMh\nPIJt1mrW3vUkP779HCN6pPB5j8nsLx3Iw0v+wuaMpUhULqeb7yM7N5Gc0mrKqjWPQRGosNpJK6jg\nhbk7ABie2o6IMAPG6K2IqRo4DG9G3QHEmbnDfT8sEGWWmlo3vnc2vsOFvS4MONZQR1D0kRJm4UGa\n/gKNMsWvgyYofLAsKpLTq+ozGdf9+96WXRowkXZLRUTsaLFkYcA+4DqlVKmIdALeUEpdcVQXWA8i\nci3wF7S4ERtaoPMj+jX8BnRC85cNBxYCT+m5GY97Wl1EZFOwZFc+27JLSYg1c+nQrn7H2OwOtuhe\ne6kJ9QizujCGQfcRcPbz8MBmOO+fENdVCxX48AJYOA1smmkyNT6Vh4c9zMLLF/LK2Ff444SJ5BiN\nJJcVkPHrU1z646WM/WIsD/72IJ9s/4SMsj18ettwvrzjVF66bBDjDRsYLLvJ27y8VpABGMIjKDnh\nYqb+463aZXWL68asyR9xw/BhOIzFrLc9Q7+TviYmwnUn/fn+01n08FievWgAF5zUGbPJwOq0Ipbu\nKsBRnYIhPI9d+Y3PjOM0M5ok+Gcqg5s2cbD8YJ0B0j5iKQgzo0+m+iAErDth9QgI7dxea3Zblzmx\n8clw3DEEIVQjO39DXQKtpKqGz1dnBuxvoVToqagGomXCvxtAKZXdCgTZJOB+4Gx9/UPRUgC623qn\nKKUGA4PQArp/aPaFtlAC3kVEJBKtBMG5aGlZAIrQkmx+opQKXE2yhfOOV/FNb/JKq7nns/VsPFBC\nRJiBAZ3rSqHWAMIiYNhNcNIUWPY6LH0Zlr0GO+dBQh+oLIL4roQDk/qew6RJH1DY+VP47i4eKilj\nc/tu7K0qInPPXBZmLgTAKEbaRrSl/eb2fC3wqOkLFquUWkHmxBAeweJNueSVVZOoF/IMN4bz+PDH\nOaXjKTy1/CkWH1gMCRswWKbgqEqmb0dt879HQgyXD0uiS8oKPlqznsr8MaiaDljzz+G8NzZwxbAi\n9iyYxaEy34z9PTq25Z1XnvFoM0QcIKLTV5SoW4DBDQzq9rxJ2/2Wn9LG+CpmrrmGgPd670l1C4Wv\ndnnG1oZ5CL/AZkbvz01tdrzAa68soCYYtxlb6Uk+7c9e2J+nftjK0t0F3OhWQaKhGMxRKeEJyc8Z\no9t1tlcUZVnzM550WCrTj9Q8L/5ADxbWk5nP1rPmG4DpwFjADLyllPqvXg5mGlCMloH/K7Qydvej\nZc+4SCmVJiLnAU+iaX+FwDV66qupaFVAeqDlQ3xDKTVDP/c8YBkwCi1z/YVKKW8d/K9oWfBzAPQM\nHh94jRG9zyYijwK7RWSge6mb45W6Hon/iSb1r1NKVQCISDRaFPvrwP8d8dUdAdZmHGKVXnzzmhG+\nZsGV+wq559P1FJRbSIw186+rh9Zm0G8ywiJg/BPQYyz8cDfkb9de7mz8DHqMo/1lM+HECzFv+4FP\n6ERlZDeid8xhQY/hlJVkkOmw8FlcDcWV+QCMMm5jVFQVW6zVHgLNYa2mtNrO6OmLuGFUChP6JXFy\nclvCTQYmdJ9Av3b9eHTJo2wq2ERU8rtY887GobTsIUsPLOWFVS9wsPwghnjo1cZMRp4Be1VPrBW9\nmbUyk+JN+2lz2jW+13rQM3OOUorIrh9jCCthjeUFYApGQ/BmLG8B5V+Y1Y72/OihrQR2jg8WBTzz\nxzMeZR7CPfbM/GNUnmc5EsLsRGvgvI0ea4lM8yvMhupVGNIL63IgqRuDOSolqvfIhe3OurunITwC\nh7WaogVvjTSYoybWJZgaO09HC+MTMaJlwHdPCOz8Nd8CFCulRohIOLBcRJxZ8AehlV4pRjNT/lcf\ndx9aUvSHgN/1ZMGIyC1oWUX+os/vi3aPjAd2isjbensv4Eql1O0i8gVwKfCp19r7o5V+CQqllENE\nNunrDQmzQB1KqTv8tFUAc/RXq8SplV1/qqv4Jmg32X8v2ccr83fgUDCyRzvenDKkVos5IiSPgjtX\nwJZvwBAG0e2hNBuqimD5m7BvMbw3AS74F+xdjOyeT7SuxZy1b3XtYe6zRZIz/CZIfwGAt85sxwWL\nvqXkxEtw3gxKln1C7MnnU2NXzP99Fdbl67jRMJn+neMY1LUNg7rG88SQGVz6+ZOEt/8dc9I8bv25\nhLiISH7N/BWA3m1789TIp3hzTg2Zhg+J6v4/Lu76IGFVI3lteaCL9LxNW2wOxOC5l9MQM6N4OS3Y\nAmSfBy2MIWBfkOcLKs+jG+fX1G+W8z53s2ThDYDB7N9JpLuepmxffgVVVjuR4Q3fNwtPSH7OKZBA\nsw60O+vunqY2ndJSHg98C4k75WLihl+C9zxbcfZzwLX1nDZSRNahZYffhlZXzJuzgIEicrnzlEBv\ntKR3a9zyKe7FVeplM650VN30PIid0LQzd7fkOXqBzEIRycVlIkxz057WAil+1lX7ZRORAWjJjGOB\nJ/QUW/44ml+fFkW9dxERmaOUOld/L8BPSqnzjvjKjgCBim+WVNXwyFcba5MK3zWuJw+d2SegY0iT\nEhYJQ/z8fw64FD6bAjmb4NMroNMgyFjh2sMRA5x6L+z7DWPOJrr8+kLt1NQ2Dn5853mmvfY2W/fv\n52BZIe0nxWPu+AM1WZez35bIx46zwGFjXWYx6zKL3U58LrbKVCI7fc2aPK0YbqQpkrsH383VJ1xN\nmCGMcssKHDWa6bXGlMkz593M0s/b4a/wzKq0Ih78Yj1Tz+9PfGQY87fmYD10KmHx6zGEaXuSdWlm\n3g4I3vtNdQkzXxrhml/HnllDBZ0To9c1NMfdKM7h/zpM0Xt82mbeeIrHg94Jf/+5UWnLjNHtOvsz\nd3uXavJBKb9mckN0285BnLZSKTVURCLQqinfg2+1ZgHuVUp5CDrdzOhu+nO4fXbgul/OAP6hlJqj\nz5nqNsd7vslPux3NbOnNVrR9siVKqS3AEBGZAUT6u1DdXDoQP6VijkeCeSSu9X7Qywm02ihKZ/HN\nK0/pRocYzXS4NauEuz5ZR0ZhJXERJl67YnDLiK2J7wo3/6yZIbd+pwkyd5QDOg6EiVNh7Qew8Gmw\n6K7U1kpSU1P4YMbLtcOzyrN4e8PbrGMGMfsvY63qg113C4yPctC/UwL78iuwORRnnng2C3YmUxH7\nNQYVwahON3Ne8qm1oQvlFjuqpg0AmaWaA0hdnoPfrc/iu/VZbi2TqDk0kpje0wFt388fC7bmcPvH\na3ntCpcZzCBgK+uLmEowRuTUKcwc3vdMt5to4McUb2EW2IzpXbU5WIxH2i/fD48WFfNxvL/iyL6M\n7+ebVaUuTSoQ9oqiLIcfc3d1xvpP0pd/GlDDiuj6yCzHiEuv8Z7nqDiUFWiOG849pWoRuR+tnMtb\nXmPmA3eJyG/63lNvGlbjKw5wruWGIOcE88wyHfiHiFyklHKux1uQOc2oJuAFIFMXfMc9wageu0Xk\nORGZLCLPgt8H8BaPe/HN28ZoxTe/WJPJxW+vIKOwkgFd4ph975iWIcichEfDZTPh9iUw4e+QMkbL\nAzjgMq3/21th2/dwyi1wyX9c8yy+BUM7x3TmudOe45Mzp/Gl+Vm2mW/ivIRXMITnUlKpeSlecUo3\n1vxtAi9eMoif77mQcxP/RlXWlXy/rpAz3v4vP27UMp9UWGw4dGGWXZHdqEtTtjZYi0YBYDKYcFjb\nU51zPuszXUl+3/pN0xoe+tIVe1Zabadq/01Upj0A1K2ZuWtO2eXZ7Cl200KCdQBxND6lU6A4M8MR\njzJrGVjzM54sWvDWXodVMyvre197rfkZTx6JeTq1v1yl1AY0N33v6vXvoZkg14nIZuDf+M/bHOgP\nNQ34WkTWAPnBrKWOY7kGaLUd3wTmicgWEVmG5p4/323YLBHZgGb2jAQCx6YcZwSjmd2O9gsbgBbz\n8NMRXREgIqnA34C4pnKnfe/3fdgdiouHdCEh1sxfvtrIV2sPADBleDemnt+/ZcbTiEDnwdprjF5d\nojwftv0Ajhr45jboNhLcE+5WF/s/FtBW14LMYqOHKY2olLeJLLmagry+vPnrbsqrbTx13gkkxJp5\n9YqTuHNcT66bcxPlhh08PC+XtPzrKbfYcNg0YVZszWPJ/iWkJMW5nD1yt4CtGroMZV37DRjM43BY\nuvisxZJ7AX//YQsr0oSKHG3//OK3V7DwodNJaR/NxgO+4TOHKrzMjHoWfaNSmJTCYnA9n9ndhNlZ\n35xF15qa2iqwgQXK4bnmB4O3ZtZSNz3SXpxM6hNzGz3fYalMN5ijJtqKs58zRLft7Kg4FJRXYmPn\nASil4rw+u9/sB+ltCu3+8jev6R7lYJRSZ7i9r+1TSv2IVgzT+9zTvD67V54d5Nb+ah3r/xg/hT/1\nvvGB5oWo2zV/iFJqPTAeKAX+1LvGA/5rsjcRSqk04FZ9k/WwKSi38PkaTas4f1AnLn57BduzSzGb\nDDx/8UAuO9l/rFmLJSYBrvkKPr5IM4Ot+xCSBrj6a+qImqh2ZXW4u981zMz5CXuHWbx79mzu/mQD\n7y9PI9xkoDj6Q7Irsnj3zHcpN2gB02HxG3l94S59dhTKEUaNoYp7Ft3DHdfcwbtDnte6ntb20yx3\nzWTYvKXADEYb/8PPW3yLoX70Rwbet/OJry1l3v3+s61UWtxyHyqpDbj+9mA2PWpsnJLcFefVe28T\nuZ/FFEiWNSLOrJ5EGj54m0MMQVa9bm5EhPTp5zbKxOhEF0D1OW002bwQxy91mRmdTxJjvF6nBZzh\nhYj8T0RydfdR9/ZJIrJDRHaJyGMNXXQw1NgdlFTWkFVcxWu/7MRic3Bip1ju/3wD27NLSWkfxfd3\nj259gsxJz/Fwo36TWf4mzP+rW6eCdN29sKYacjZrmUjAta8GmGuq6BbbjRpHDSmdynnr6qGYDMK/\nl+zl+/U5rMtbx5c7Xc8T7pW2QWpNjQDz090tIfqplMs9/IkLOvP8xQN8xgTinDd+99te4bG9HsFL\nq18CoEeNpqEl17jMjg4V2NEiIljnjTpd/+uZKv5NoEavcze1m1FVEwvG9OnnMr5vQv0DQ4Q4itTl\nmv+h/rbcXS0WkdsbcPyZaJ4/H7nNNwD/QosByQLWiMgPSqkdInIdMAR4RSmVTRAWmGvfW0WF1Ual\nxU65xUal1UaF1e43f+C2bG0vaVL/jrx8+SDiIsJ8xrQqkkdrnpDrZ2k5IU2RYI7RKm4vmQ4pP2me\nkGlLYODlcOl7nvtp1SX0bd+X/WX72Vm0k/P7n88Llwzk0a83Yck7B1PMNmZtn1U7vH10OGf3T2L+\nVs3rM97YjnJ9yyDe7BtYbrG7hJnVbuXUfka+uGM4Ny2YQnX2pTiq/aT/qocqtzzOyh5FQZWna7m7\nYKhLmEUGFGbee2aNNzOKqdRvgg0fzazRZwjMkJRurE/3re4AUHXwCiK7aA8pDltMUMebedPww9LQ\nQoQ40gT8PxKRNiLSE7hMRFJFpIfu9XN5oDneKKWWoaWUcWc4sFsplaGUqgE+R9/EVEp9rJR6CLCI\nyDvA4Po0t2V7ClifWczO3DIOFldxqLIGq82BQSA2wkSsWZPX0eFGTu3Rnmcu7M871w5t/YIMNNPU\nua9BtxGAwHmvw4g7tb70ZbDpK02QAWT8of10MzNSVUzfdn0B2FG0A5Ti8uhN9EmyouzRtMm8HIOb\nA5lC8c41J/PXyf345JbhnFWllUARpbBa9T07N4cJq8Mleb7Y+QUXfn8hn+5+C4M5j+jUt4k94XHW\nP3Uml59WSXj73zB3/LbeS3YvsaXsvh7L7qLIardpTiB2Xw0p0uHg/O/OJ6cip44j4NLMDrvcigvv\nnVn3bCRNpVPZRBiY6npYGJTSze0kirLtz1OZcSsVu4PxqdB4c8qQJlpdiBBNT10OIGOBi9CC+55C\n+z+zonn+HA5dAPdHxgNoAq4WpVQRcGcwBxtfsZgwo4Ewo4GxY8cy4YzxRJtNmE0GLDYHY17+jTKL\njX9dM5TxfRtXyLFFYzLDjXOhLBvadNNu3Ete1MyK397qGld6UDM5lrj96vf+ysCRNwHw2Y7P6FGY\nyaUrP+I9RyKXMI0DlhO4Kv1scnvPxyZCvLUag8DtQ+OgJJPNNk3zMgFb9lfx04rNnH+yK36vxm3v\n7oudXwCwKPsb1/aQUsQd+I2RnXL5uVAzU5pjd2FJewKLTbvDn94ngaW78ulGLmHY2Ycr1EjZo/z8\nQhRisBHZ/V3u/H0a0yscTMjZS1LXjh5JgCOUIr00nRnrZ/D8ac+7ZjckzixgT9393nkTj6R3o7tA\n88SIvbLuquPuLF68mF9mz6d4ZUbTLCxEiCamLjPjD8APItJNKbVfD5g+BWh8aecjwMwZrwTs+3bd\nQfLLLJzQKY5xfY5hm7/RpAky5/vB18Ha970GKTiUDtmeJVZO3b6AC3teyI97f2TXLs1Rtbshj5nh\nL3OJdRpf2sfRrXo5p9jz+EfaPAh7Ala9A0DHGC0EUZSiu+MQ5y84jYyVJ5OsH9tq88zV2NZup0qE\nat3jcFJFJcbPruB8k5ml7WJ5tOgQDyRa2dH7MbZfvxGDGJj201aW7sqnhBjONa5kn90lzNpYzdxc\nVMzO8DBer7mUAYY0DHq4kCk6jWo7TMjWMnJcUlbOsGrXhptzz6zG4Z32yas455HwZqznc3PifFio\nj3HjxjFy9Bh+ekrzWC1Z/tmRXlqIEA0iGHP9B/rPZ9Bymn1zmOc8iJaM00lXGhawGBR2h+LdpVqQ\n9J3jevoUmDymGXip5+eEftrPt0dA3jaPLsO6j3hu6Uw+7HIudrdf0UBDGmcZ1uDAgKVkGA8e0t39\ndUEG0Mmmme+UCBeFa56KyaVuRTK3fldbrDLG4WBp5kEWZbr+1K/kFwIQbrPwRl4BXWx2vsrKoZ/F\nSnVZDuRu4+Ihmkt/KdF8Zp8AQIRoGt9FBTEszLuPJfuf4Q37pdxW8wg3lpTRqcbXrCjAcDdhFudw\nYFCKs/eu0pxlqg7RVfJpFtd8r7METnp8ZBjVs13t+6gGhKO0yNAVL0TELiLrRGSziPwgInF6e6em\n8o4+UojIGBFZKyI1InKJV98NusPcThG53q09RURW6n2f6cHUxyXBCDPnmBQ9X2NDU8gLnv+7a4Be\nIpKsJ/m8Cj8xG4fL3M3ZZBRWktw+iskDOjb14Vs2XYaB0QwITHwGRt3r2Z80AG77zfXZWs6QZW8z\nLuFkj2FXGbUxRaWnUm33zR7RSd/AcgBVUb57kAM3fMW/cvO5t6iY24q1mLFYpbihpJTPD3rvVbn4\nKiuHqNdOgHdOZZAxk3vGdmeQaA8mkWJlimExAO/Zz2WVOpF82tbOXVw8hQczNAF4XYlrf/DCMs+E\nuc8UFHFeeQUTMjbAB5PhpRSWme+nraqkq5swVPoeoL9Hofoej4I1M3qntzrSmNySVl41vFsdI1sl\nrbYEDJCBllHkE/dGEWkL/B3NMjYCmCoizvvwS8CrSqk+aMmRb2m+5bYsghFmmSLyCzBfl/pB+yqL\nyKdo9Xj6iEimiNyklLKjZZ9egJaL7HOlVJPnFuvaNpIxvTtw++mBi28es4RFQNdhgIL2PWHQVa6s\nIQATn4YuQ6HnGR7TTovx3F8ZbdjKCZKO1d6Gu6sf8/GBSNIdK+yAxeY/tm10VTW3l5Ryc4nLi/KR\nomL6W61+x/vw7himFL7Nj+an2GW+jvXht9FFNA/GGj9W8s/sE7iz5kHOLNZSODnpbPf92ib5abvd\n9ifzDricXuQIZACpywGkOXCLK6dHh+C8GRuLMdKYEtU7alb8sPhFUb2jZhkjjSlHcp4Xf6Dt0aM/\nPG/W3xtE5GURWSUiG0TkNr19rIgsFpHvRWSPiLwoIlfr4zbqyRwQkfN0bWitiCwQkQS9faoejvSb\nPv9et3NvE5H/6Jk9fhYRn1IcSilnairvb8TZwAKlVIlSqhjt3jlJ7zsDl7XsQ+DiRvyejgnqVUmV\nUjeIiEnPYSbA+cEeXCl1dYD2eUDTVCEMwJDubfn4lhGNTgbb6kkeDRnLtdcJ58Fl/9Ne7px6N+x1\ni3//03OfzSCKWeEvcqblFXao7qSrjqSKplE5lGBG0d5mp9BkpMrWBOWRA9Blj1YpI1zsgJ0Uya13\nzracO9kR9jb9DP7d0wHuO+SbYeRKh9eW8BHJAHJk48zqPb+byd1wBE9ujDSmxA2NW9j5hs49DWYD\nDouDrA+zRhojjRPtVfb0pp6n05pLwATC22nuINBFRNoDh5Sq/ZIeAIJJxnxMUlcGkDeUUveLyO+A\n0vecnKWXTm+m9R02x9VemTspp2nFP9OXBR7TayLctwG+vgmy/JdRai9lnGLYwXzHcC60Psv/mX5E\nIbxju4AnTbPoZN9OocnIxUWBzYZNzQTDOj4Ne44Nqic/2EezU/l67O1QyUyyvkR6hN/nqYDE4SmU\n1WEETRujMqHct903zqx5H7jc/yWMddXJOUzMXc3POQUSgMFsoPMNnXuGJ4anDfxwYMB5HSZ1oMM5\nHfCeZ8mzHOslYBrDcXqD86Uub8b79Z/+8wqFaNl0PUWrkZazGaqKIbKN/3HtUrX9s/wdWub90oPQ\nc4KWvDg6gUWZi0j6+HOoHk4p0bxsc+Vsfdx2O5NrHgYz5JhMYAnSdHiYiOhFSNnGJcZl3GO9jwOq\nAzm09xnrUIKhofmm3NiSpiVSbswdI3CiYU+aOot+fYczutk5I4+gU0dYfFhnp0ByYjAb6rWWKKXw\nNy8sPuxYLwETiIO4BClogvo3pVShiMSLiEHXzo6IM11rIZh6Zn/3aqpBU7+/U0o1z90rRMMJj4Iu\nJ8P+lZC5EvpOCjxWBBJPgKu/8Oka32My1su689Es/0UnlS0eqCTbdHQ83TrKIb42T+Mz23iesN3m\n03++9TnmmL3zyQbPqN3vcF5Ce+ZG+8a01XfFgStNN42ZsVok+LRcbkS5FdqMCj9yzm81JTVZDovD\nQzA5LA7Kt5Z/kvd9XkANK+q5qFkJkxOu8Z5XU1JzrJeACTR+PvC87vRhAM4EHtf7fkNLZPGFvpYf\nGnieY4Zg/o+SgWpgJVCJZk9OBgJVPg3RUkgZrf3MqMPUWA8iwvh+J/q0j+2jeRBWdNEsNW+2bcNz\n7dsypnsXBqZ255GE9uQZPW/3Tb/75OJc40r6iW9A71aVyge2sw7r2C/mF/JIUeBKBIGoCWDi9o0z\na5xqtjrCx4cgKGLMLgEWbjpym2aWA5Ynsz7M2uuwaH95fe9rr+WApc60I42dp9NqS8CIyDAR2Q9c\nBvzb6bCilDoEPIuW7H0VME13BAFNqD0kIruAdsD/fI98fBDMY1k3pZTT3XOBiPyiO4UsqXNWiKNP\n8mj4/VVX0uFGYjYZ+eCmUyirthFtNlJptRMdbmLJrjXkHYqAcBjVbSx5YqRTRQ4fnj6dbjHdGDpr\nqM+x3ux7E+W/v0K2yURbh4PZMVF8mJ13WOsDiJMqfjY/QaYjkdOt//Toe9p2IxcY/6Cd+NZ5C5br\nShs+N1ClNW/vxcZ6My6OiuT0quoGz4uL9P9vP2V4N64Y1nSu+vYqe7ox0jjRkmd5Liw+rHNNSU2W\n5YDlyfqcOBo7D1p3CRil1J+A3z+AUuoDXDG/7u1paO76xz3BCLMDukfOJrQ/SKbuKZRW97QQR51u\nIyD9Ta8AACAASURBVECMWtaP6lKICK7SsD/GeaUCKyzXtgAycs2YukFeZR5fne+prD9/2vOsyFrB\nnH1agtozk8/ktOH38rStEEHYZClm6rCHuG75VPq268vfRvxNc9gpOQCxnUAplq98lZIV/2RmfBxD\nqy18HxtNvN1Bh05D+DT1Sm1fMKodzHsUsjfS3ZDHavOdXGx5hoO4sr4MtbzLlcbfuMq4iMGyt1kq\nrgTWzJrGzFjeSFfEpDgzneMj6Jno6Zb/x95CXrxkUIBZjUMXQA0u5dLYeSGOX4Jxzb9ZRIajed/M\nVEqt0btuPILrCtEUmGOg8xA4+CccWK15LzYR7WPM9EiIJq0olhj8V5y+oOcF7CzaSbw5nmdGPcPI\nTiMJM4R55EIE+HiyVy3CeFdZntGjH2NFyhh2LLyDHeZwACoNBrILNsO5bp7NdyytfZtos7LMXsP9\n3+7ix42ubZYv7OP5wj6eJNN+ituvJSp2Pf8q3M/oRmg3wWALIDC9RVB4M4ePGAR+f+wMn02cv04+\noVnXESJEU1Lvo52IxKJ50kwExjvTw4RoJSTqqayKA8dbNZYJ/RJR9mgMhFFiKaGyxjMXo1KK2ftm\nU2Ip4dU/X0U1cm9oVJdRbL5hM5tv2Fz/YABTOGKO5s0pQ0iffi7p089l4UNjCWu3FDGWk2vrhiX3\nIg7t/Rs3Ou7k5MRRTZkUv/7lKU8/x8Y4cQAkRSXVP8gPCoXRIBh0t/xFD49lxpQhnNW//kw5/77W\n13QcIkRLIBg7xSdowXivonn8BBvoF6IlEK2bBysK6h7XCCackAQYELvm9p9T6RlrdqDsAEXVWs7G\nzLJMnl35bNBB7Gnpadz88M2cd8d53PzwzaSla1bta0/QLE8fTPqgQWvtlRjD8nseZsrZW3ngnHhO\n7GICFU5NySkUZt5Db/Ua79kmk6fiuXNpPGf/2sPndefShmVyi3L4v1bvf7oIPeb1lpR3fAfXwVX9\nrgpq3OhO4zw+e/8NeiTEcP5JwcXaThrQKahxIUI0N8HsmcUrpZwCbKeI3HEkFxSiiYnW940qDt/J\nwpuh3TWPRmt1HMbofHLKc+gR36O2f0P+BgD6tetHRmkGc/bN4dROp3JhL9eevEM5MIjn7T0tPY1L\nHr0E60QrBrOBNIv2+duXv+Uvp/yFB09+kHBjeIPXmxiVyAunPwPAA2Oh/3/GYy0ejq1kCDZrR57j\nWl60TcFmfQ85zc/XfPmTgG/WkEDEBCjs2T2mK4IrqiVZhlOZPooOfbvx8pjp8Ol1QR2/S0wX3o+P\n9UgV5o+Hhv6V5XMW135urIbsZNdz52B+6bAOESJEkxOMMNsgIv8F1gHDaGElYELUQ4xTM6u/zEdD\nCTcZCDcacNS0wYjvvtnGfK3czNkpZ9MhsgNPLX+K51c9T2x4LFsKtrAocxF7S/YSHRZNfHg8seGx\nRJgiWDdrHTJRPDJAWCdauWbaNdz44I2YjWbCjeGEG8K1n8Zwrc0QTpgxDIMYMIpRexmMvu/1nzHR\nlVSa56ISf8ZW3g9b8TDs5X0pIQZ/IeYOgSoRPXO2whmL7UDzXBSvV3QALTSqKA2J6VL7OW9/V+x2\n7SHglI6nNOhvcNX1i2HGyQH7lSOMtuZ2Hm1VfvJopqWn8eyMZ8krzyMxJpGn7n2K1JRUn3FwZN35\nQ4RoLME4gNwvIsOAnsA7uvtoiNZCdAftZ3nTCzOAyHAjVTXarT+QMDsp4SSGJQ3jj6w/mJs2l/t/\nu99jXEVNBRU1FaAnti+oLCDJ7LkfZDAb2HNoDzPWeydzOHxE/r+9Ow+PqrweOP49M1kJSWQLEMKO\nyK4CAoIooIiKilil7lprqdrS2lat9ScCrbZutS24K2pdKdYNFWtFjUBFAQHZETHsmxAIEMg2c35/\n3Jt9Idtsyfk8T57M3HvnznsTyJn3ve97jp/oxLVEJ67FX9CEg19VPJy4hA6c2qwPUU3XId7ihA6z\nkhOZlZxY8bkL74+pMrhjGvF+xYtywOPhvLRUBOWAfk4T/ZrnMxJ4f08MBalt8ODMeoxSZ5F1FM69\ntijc56p4M94kOms53pbNiVEl1v0qPdXfz8db55Zq084jO1mzfw3x3niiPFHs2LaDn0/5Ob5zfUU9\n4fF3jGf2A7Pp1qVbuZ5zOBMRH87asmic5A7XquohEWkL/COcM+eLyPXAwzi3dQAeU9XnS+z7P5z1\naver6kvu9k7ALJw1Zl/jXG9lq0IatKpyM95YweZ+ItKv8AdsIkBC4Hpm4GSTOFpBMMvOz+bbA9/i\nFS99WvZBRJg8ZDIZWRnsz9nPyPYjGdVhFANbDyTHl0NWbhaH8w6T68vl3i/v5fvc78tljujevDuX\n972cnIIc8v355PnyyPXlku/PJ9eXS54vj3x/Pn7141MfPr/P+e4+9qufAn+B812d73m+PA7lFZeK\n8UQdxRNdyTREfwI5O68AKSC6ybdEJ60iquk68B4rSlqqZabjq0jRoN5REY6WiAs7ogv/+x3DyzF+\nyPuBH/KA2GoOoR5Y7XwlVp75Xjw+/rK0dBKfN759gze+LV5GsfedveVyIeaPzmf47cNJuSSFWG8s\nsd5Y4rxxxEbFEhdVk0xMQZetqv0BRORFnBIwf1HVXUDYBrISZqnqr0puKFECpj9Op/9rEXlXVbMo\nLgHzhog8iZNE+elgNzocVNUzq32GVRM+AnjPDJyemf+o05PZnV08AWT1vtX41U+vFr2Ij4oHoGlM\nU2ZfVL4+Yow3hqSY4kmy038/vdQ9M3+un5h5Mbz80MuVDn3VRVVJb0vqxG56eNaw2N+T/Oxe5Gf3\nIooC2sZuYJJvIaO9X9NMnMzCWubr5tat+PvefeR4BB/C5alteG3XbvwIr/pG8qxvLEgB7/6kG1Gv\nXY4CBSL43O8F/X6Mb9VsChB84gxrFgz+Ob60AeS/fTN5IuSJkCvCEY/wwgnFvctz2p/PvG3FRSpa\nN2lN87jmHCs4hk99HJSDFeZCLIzCub5ccn25HOIQNZUUK536pHjva5soqbsO687Ve333HMrVzYF6\nXRmLgL7glGEB3lfVviLiAR4AzgJigcdV9Vk3z+I0nIz5fXCyHK0Cfo2TS/ESVc0QkQuBe3B6f/uB\nq1X1BxGZglN4uAvO4ud/qOoM970/BBYCQ3F6XuNUtaJSExV9kioqAeNeS2EJmH/hlIApzHDyT2Aq\nFszK+bAwe3RZIpJS2T4TZpo0B/HAsQPgywdv+SKadTp9jBfNKt8zW7HXmfxxSqtTanzOzp0689ZD\nbzn3cLL3kpKQwuSHKr+HU9+8TQ5xeNmfSm0beCyXLjH7eTLmfn7QJD7yncZ//INY5O/Fttze3Elv\nvAU+hnrWcL5nMed6l9JSiv/4P7fH6Rk39TkRIgolzS1uOty3k6fznR503+Y9IC8fbdoaOVKi1M05\nD8Kq9+FYZvG25n2h68VwpPSEkaNSOphNHXI/cdFe3v/+fQD2HN3DvMvnFe2/8X838lXuV+V6wmO7\njmXmdTPJ9eWSU5BDji+HnIIccn259KDHcX+OSbHSaVyP6HlPjY3rmhAjZOcpN3+QMyQpVs6pKjDV\n9nWuSC8Bc6mInAlsAH6jqjuwEjDVUlUwu9MtOvclsNnd1gnnk8Vuin95ASEi44CxQCLwfNkM16aa\nPF5o0sIZZszeB0n1O7W6SXQUfneYcXf27qLZiSXvl9VG506def6vwRnN/mzCZ7yy9hV6tujJ7Z/f\nTuvxXopu4LnmbN5KrPun8GdpTXhnxydcwyfs10Q+9g1grn8wC/19WODvxwJ/P+4puJHBnnVc4PmK\nMd4lpEgWm6Kj6OpWsZ7U/UrY5mQ1OsO7xknfXYKU/YAe0wRumgczjr/Oq0mZiSfJTaLp1aJXUTAr\na/KkyRX2hCc/NBkRIS4qrlZDi31SvPcVBiSAhBjhqbFxXbs182QwtfJlDr87PZbbh8ZQ9nWbMv0N\nvQTMHOA1Vc0XkYnASzgBuSpWAsZV6Z1dVb0dp3zCLpwudx/38S9UNaCBzH3/d1V1InALkTHWHb4C\neN8sPsYLGkNCVBL5/nwyczLxq78omJ2SUvOeWbC1jG/JbQNu45wOlWdIGdyxOGXeppgYBnV0spS0\nkMNcEZXOSzEPclurO3go6mlGepbjxc8if28mF9zI4NzHmZA7mQXHRrFbneUM4z8pnZ4vgfIzDP/S\nvFnpDS261vYSaRbXrNJ9hT3hwRsG03FRRwZvGMxbD71V555w20RJLQxIhRJiBP9x1hr6VanodW2a\nSrVLwOAM9wnO37CyCkvAnOp+dVXVwq5qdUvATHdzL95M6XIu1S0BU64joaoHVLXwY81zOPfIwOmJ\nlSzalwbsUNX9QLI7bFq0vYLrbRSqnM2oqoeBd+ryBiIyE7gQ2FMy8aaInAf8HSegzlTVylau3AOU\nLeFgaqJwRmMA7psVlhNJjk4hu+AQu7N3cyjvEIfyDpESn0LbhMhZZOv1VF7UxSfCkI5pRZn/j1WQ\nF7E1R/hf6hpe2Ps5WdqET/z9mesbzHx/PxZrTxYX9GRqwQ0MlA1c6F3EWO+X3LtA+D6/BXE8RkHT\nLoy5+V3Y1oUuTY6y8MqmDD12jC/j4/h9VQ3vfz0s+2eV13Z+p/P5w4I/AHBux/JVBALRE951WHdm\n55UOTNl5ysff+16d9nlWpT2sj2dGvXLnML267Ot2H9EGXQJGRNqoauGN53HAuhLttRIwxxGMObcv\n4NzALOJ+knjM3d4buFJEerj7rhWRR0UkVUQeAOa6pRxMbRWuNQvA9Px4N5g1jXIC5q7sXXyz1x1i\nTDk54ip9Tx85nfioeGaMmsH8H88vtS/b4ykVxAp7Z4V+fPgInyY0oW/nDpzRpSWXehfyXMxf+Tr2\nZv4R/RhjPIuJJY+lehJTC25gcO4TfJB3KhuG3cf+YXeQe/KP2NBhHBuG3cf3uSfw91H/4JdtUngl\nuZIMcmvdv1sX/u241+X1eJl57kxGdxzNPUOqU0ml7lbv9d1z8wc5m7LznJ6Ye+9r0+q9viobUNvX\nuSK2BAzwKxFZLSLLcXqUN4CVgKmuwFXmc6nqQnc2T0mDgI2qugVARGbhfBJZr6ovAy+LyCSc8eIk\nEemmqs8Euq0NVtGMxvoPZoU9swSPG8yO7OL7rO+B2t8vC6WRHUay6MpFRb20Vdev4us9X9MirgUX\nvXMRAPFR8UwbOo07599ZrXMmyjHGeb9gnPcLsjWWef7+vOc7nc/9p5BJQoULtAFGth/JaW1Oo0Ni\niRGmCx6Bubc7j9e5VUg8Xhh5D3x2X5XtGNR2EIPaDqpWm+vDoVzdnBQr52zK9N/Xpqmk7j5SvVmJ\ntX0dRHwJmLuBuyvZ9yJWAqZK1ak0/XdVvU1ErgF+hzNFtMpRj2ooOztnO06AK6KqMyhf7tzURgCn\n5xdWKo6T4p5Z4UzGSAxmUH64cUBrJ8PGrAtnMfG/E/nXhf8iLTGNO+ffyamd2rN8s/NPWZt34Yx2\nQ1i4Y6EzlHftwzz03jW8kfkNS7Y462ATJJdx3kWM8y4iSxMYSXcyKW+jrzX/XbOHJ0Y9S1x0ifac\ndlNxMCvprDuOG8xCwQ1ANS7lUtvXmcarOj2zwkU4Y1T1VBFZFMgG1dTUqVOLHo8YMYIRI0aErC1h\nqyiYucmG/T44dhASWtT51PHuH9pYnJRJGw9sZFPWJqI9zgy6hqR3i97878riQqcpTVLYe3Qvd5/Y\nnz8fi0Kun8N0bxQr9q6gX6t+4PFw57jXGLpjITw7ttz5kiWbVpJVYTDL1Kbc/MoymsZGcW7v1pzX\nuw2nd21BYlyJpRU/KjOi1Gk4bF5QT1dbWnp6Ounp6QE5tzH1oTrBzCMi9+KsuYDKC+jWRIWzc2pz\nopLBzFSi6J6Z2zP7/CH4/EG46RNIqzyvX3UUDjN6/c5suSV7nHJ3vVr0qlUy4Ejy8WUfk5mTScv4\nlkXboimfX/GMdmdw/5g7+L+PHnY23LEJHq56ZmIHzz46tktm1Y4s3lq2g7eW7cDrEfqlJdOtVzqd\nEvLoqO3ptCOLDi2akBQXDdfNgT9WPmuxLsp+UJw2bVrlBxsTAtUJZpcCpwKfuwsMKxzTPY7C3KuF\nlgDd3Htpu4ArKH+T1tSXsvfM1r0HqPMpvp6C2a79cRDtZMGH2i2WjjQe8ZQKZFX5v9PvwT/4D3jU\nX2rhepfo/bDjP7B5YanjuzQ5ypOTziBjXzYfrNxJ+oYfWL7tIMu3Ol+O4rI+ac3iGdixGR2GLqZb\nSlP+Er+ZP3x5M7ecfEudr9OYSFCdYPZzVX3AnUr/R+AVoNpjGSLyGs5iwxYishWYoqovuBM8/kvx\n1Px1VZzG1EXJYJZ7BH5wf9QHNtf51PHuPbOvvssnuacXv5sF7eSUyLxfFkgej5eiSXNTDsLMc3ny\n/kvg9F/Au7+A5a+Ue03nlgn8ctSJ/HLUiRzKyeebbQfZmnmULfuPsnlfNlv2H2VLZjbbDxxj+4HS\na9W6tppB/r527M7KoU1yWOdTNKbOqhPMRuPkMbsaGAZ8AUyv7huo6lWVbP8QJ1+ZCbSSwWznMijM\nfnMgo/LXVFNhzww8+AuSIcq5AxSpkz+CRgRuKpGcYtzjFQazkpLiohl+Yqty2/1+Ze2uQ6zZmcW2\nzGOs3XWIxRmZbPohm7/N+5ZVOw7y3PU1Ky1jTKSpTjCLF5HrgL1umpXyqQpMeIuOg9gkyD0E331S\nvD2z7sEs31dcgDJam5NPJqkJqaQ0SanzuRudezPhj82Pf1wZHo/Qp10yfdoVp4jK9/n58vv9vPbV\nVq4Y1KGKVzcskVwCBsCdNX4HzohVAc4tmdvda/gMJ4VWDhADzAMmFyYgDnC7PgN+p6rLymx/BnhU\nVddX8dqf41QzeMUtZfNRicXhJY+7DCdRck/gtLLvdTzVWTR9Lc7YyBQRicNZ7GwiTWHvbEOJznDW\ndif5cB2c0a0lTWOdz0Q5x5wlPjbEWEseL0x274MN/12dThXt9TD8xFY8ec0AzupevjfXgGWran9V\n7QscwCkBg6ruioBAdh5Ohv4xbvv744yElSzud6WqnoKzbi2PamT8KJHuqt6p6sSqApl7zNOqWjjs\ncAPO0qyKrALGU2KtX01Up2e2F2gF/BXYhLNa3kSahFaQuQn2bXCee2PAlwdZ26B5l1qftkXTWFZP\nG8OwBz5lb3YHvEnLGNV+1PFfaCrmjYapAf+gHRSx7Xo8E5XYqnvZ7QWHf/g2d8f6ifX9ugpEWgmY\nu3F6P7uhaHH3i2WOKUzXVSAidwIbRaRviSTGuNd7GKcUzNnAL0TkbOAi9zq+UNWb3eM+w8kqMhIn\n0/9PVfV/bsflBZyguYHS+SdLvk9Rj819z3/gpC886l5j4c/lCE7C+oHAK+4I3+klfwaqusE9Z63S\nBlUnmL2KU8n0Xbchr7mNNZGkaYlP53HJ0LoPbPmfM9RYh2BW6MzurXh98SCStA9ntqs8Ya9pPKIS\nW3VvdcldZ5Xd/sM7DwTkda5ILgHTG1henYsEUFW/iKx027uqzO4EYJGbMB4RWauqf3IfvyQiY1X1\nA/dYr3uN5+MM843GSfCeraq9RaQvUJ0hvwScQHmPiDwI/Az4c3Fz9U0R+SXwW1Wt9nVWV3WCWbKq\nFv7QN7jjnybSJJQIZu0GQFKqE8zqYRIIwNSLe7Fy+0HW7PTw+uJt/PSM4NQeM5EnumX7szrd9UGl\nuQqjW7avbFd1RHIJmKKfiYj0AV7GKYH1B1V9o4LjofIExgXAWyWeny0idwBNgGbAaqAwmBUe9zVQ\nmHrwTJxeFqq6SkS+qeR9SspV1bklzlXZp9qAJGytzljqChF5VkRucTPgrwxEQ0yAJZSYkNFuIDRz\ng009TAIBiI3ycts5zsjQjE83kpmdVy/nNaaGIrYEDLAGt+yLqq5W1VNxhifjK7pQd7i0L8XZ9UvK\ncYcpEZFYnMojl7ptfq6SNlfWLqheACp5A76qcwXEcd9MVX8tIgOBrsCTqro08M0y9S6hxOLetIGQ\ne9h5XA9rzQqd0zOFoV1b8MWm/Tz0n/U88KN+x3+RaXTy9237fPMDY0dUtj+hxwPpOPezaiNiS8Dg\n3Md7REQuUafCNJQPZIXDqFE4Q3hbVXX1cd4vDqfXt19EmgKX4dwPrMp8nOVY6W4vsTr/matzjYdx\nfn71ca5SKu2ZiciNhV84F5IA9HOfm0jTtGTPbAA0d3tmBzbDmnfgnxcX526sJRHhj+P6EO0VZi3Z\nxrKtB+p0PmNqIWJLwLhrb6cDH7qlYBbiDBd+VOKwV0RkBc6wZzxOtZEq39uduv8sTs/vQ2BxNdr1\nJNBURNbg3EerrBNT0zI3LwJPicgyt8dYREQuEZFtwBDgfRGp0Tpk0UqqvrrrASqkqlVXAgwSEdHK\n2m/K2PolPD8GmnWCX38DRzPhoc4QFe9MCc87AhdNhwHV/aBZuYf+s54n0jfROzWJd38xjChvMMrm\nmWASEVS1yk/PYTCb0TQilQazSGDBrAb8fph3r5NZvfsYUIUHOkJuiWngw38HZ99b57c6mlfA6Efn\ns+PgMW4+qyt3nd+jzuc04aU6wcyYYLKPzI2FxwPn3ucEMnDSKTXvVPqYA1vq5a2axETx6IST8XqE\npz7fxMdr99TLeY0xpjLHDWYi0rvM83LdfxOhWrul6k66wPlej5NBBndpwZ1jTgLgt/9awfrdh+rt\n3MYYU1Z1emZlqz3fH4iGmBAYPQ2uegMucOtsHayfnlmhiWd2YWzfthzOLeD65xez46Cl9TTGBEZV\nsxl/IiILgP4iMl9EFojIfJx8YKYhSGgJ3c+FxFQnvVVhiZh6IiL8dcLJDOrUnD2HcrnimUVs3X+0\n3s5vjDGFKg1mqvqCqg4H7lDVM1V1uPv96iC2zwSDxwMnuJnVD26t11PHRXt59rqB9EtLZlvmMS57\n6gu+3mJT9o0x9as6w4wtwMnoLCJfuTnKAkpEeojIkyIyW0RuDvT7GeAEN4tNPQ81AiQ3iebVmwYz\npEtz9h7O5cdPL+K5Bd9jM1GNMfWlOsFstPv9auAMnJIwAaWq61X1FuDHOFmmTaA16+R8r8dJICUl\nxkXz0o2DuXFYZwr8yn0frONnLy1l76GcgLyfMaZxqU4wK1WcE6j2XXwRmSkie9zMziW3nyci60Xk\nWxH5fSWvvQh4H5hb0X5Tz5q5PbN6mp5fkZgoD/de1IunrulPYlwU89btZfTf5vPm19utl2aMqZNA\nF+d8ARhTcoObHPMxd3tv4EoR6eHuu1ZEHhWRtqr6nqqOBa6pwfuZ2iocZgxQz6yk8/q05aPbzmTE\nSa3IOpbP7974huueX8zanTZ93xhTO9XJapwPDMapDXQ91UsSCYCqLnQL05U0CNioqlsARGQWTn6x\n9ar6MvCyiJwlInfhFM77ABN4hcOMAbhnVpHUE+J54YbT+PfX2/nT+2tZsHEfC79bwIX9Urn5rC40\nyT3AtEefYE/WUVonN2HKb2+lc+dOQWmbMSbyHDedlYjMwymj8ISqjhKRT1T17Gq/gRPM3nNLDyAi\nP8IpCz7RfX4NMEhVazyxxNJZ1aNjB+DBThCdAHfvcDKEBElmdh6Pffodr3y5hTyfn4KsveSvnEvs\n4CvwxMThz8shed3bzHniPgtoYcLSWZlwU52emVdV15eoZB1WKbCmTp1a9HjEiBGMGDEiZG2JaPHN\nIDbZydWYva90ZeoAa54Qw70X9eKnwzszc0EG0x9+nSZuIAPwxMSR1XM80x59ghdnPBS0dpli6enp\npKenh7oZxlSqOj2zyUA7nCqrHwF7VPXPVb6o9OvL9syGAFNV9Tz3+V04JbUfrHHjrWdWv54aDrtX\nwk2fODXPQmT01b9gY/sLym2PX/Umc/85g84tE0LQKlOS9cxMuDluL0tV/4RTpXQy8HxNAplLKF1o\nbQnQTUQ6ikgMcAUwp4bnNIHQLHiTQKrSrnkC/rzSU/b9eTnsyspl5CPpXDvzK+au2kVegT9ELTTG\nhJvqJBr+WFVXqeobqvqNiLxe3ZOLyGvAF0B3EdkqIj9RVR8wCfgvTrG4WapaUdlvE2zN3IKdmRkh\nbcaU395K8rq3iwKaPy+H+FVvMuGqq4mN8rBg4z5ufXUZQx/4hAc+XM/mfdkhba8xJvSqKs45EhiF\nMzX/JXdzFDBMVWtb0rxe2TBjPVv6Arx/G5x8FYx/MqRNycjYXOFsxoNH83h7+Q5eX7yVb/cU55E8\nvUsLLu3fjvP6tCExLjpk7W4sbJjRhJuqgllHoBMwEXjG3ZwPrFbVsFgQZMGsnn3/Obx0MbQfAj/9\n6PjHh5CqsmzrAV5fvI33V+4kJ98ZcoyN8nBOz9aMOyWVESelEBMVVvOVGgwLZibcWKVpU+zgNvh7\nH0hIgTs2hro11ZZ1LJ/3V+7k3RU7WZyRWbQ9OT6a8/u04eKTUxncpQVej/3trS8WzEy4sWBmivn9\ncH8b8OXCH7ZDbGKoW1RjOw4eY86Knby7Ygfrdx8u2p6SGMvYfm25+ORUTml/AhLEdXQNkQUzE24s\nmJnSHhsE+zbAzQuhTd9Qt6ZOvt1zmDkrdjLnm51szSyuo9buhHguOjmVi05uS6+2SRbYasGCmQk3\nFsxMaa9dAd9+CBNegl7jQt2aeqGqfLM9i/e+2cn7K3ey51Bu0b60ZvGMP7Ud409tR5dWTUPYyshi\nwcyEGwtmprT/3A1fPg7nTIUzfhPq1tQ7v19ZuuUA767YwX/X7uGHw8WB7dQOJ3Bp/zQu6teWE5rE\nhLCV4c+CmQk3FsxMaYufhbm3Q//r4OIZoW5NQPn9ypcZ+3lr2Q4+XLWL7DwfANFeYXSv1lw+sD1n\nntjKJo5UwIKZCTcWzExp330Cr1wKHU6HQT9zvielhrpVAXcsz8d/1+7mzWU7WLjxB/zuP6u2yXFc\nNiCNywe0p0OLJqFtZBixYGbCjQUzU1pmBkw/pfh5+8Fw40dBzaIfaruzcnhz2XZmL93Glv3FKqL2\nSAAADcJJREFUE0dO79KCCaelcX6ftsRFe0PYwtCzYGbCjQUzU5qvAP7UovS269+HzsND054Q8vuV\nxZszmb1kG3NX7ypamJ0YF8XFJ6cyYWB7+qUlN8rZkBbMTLixYGbKmzkGdi6HrqOcmY2dz4Jr3wFP\n482mcSgnn/e+2cnspdv5ZtvBou092iQyYWB7Ljm1Hc0TGs+kEQtmJtxYMDPl5R2FvGzwRsHf+kDe\nETihI4z9K5w4OtStC7kNuw8ze+k23l6+g8zsPABivB5G92rNhNPac0a3lg1+0ogFMxNuLJiZqq2d\nAx/dDVnbwBMF45+GvpeFulVhIa/Az7x1e5i9dBvzvy0/aeSyAWl0bNEwa69ZMDPhxoKZOT6/Dz6Z\nBv/7B4gHxj8DPS+C6LhQtyxs7Mo6xr+XbueNr7eXyjYypEtzJgxsT8+EXB587OlyVQAilQUzE24s\nmJnq++zP8LlbENwTDadcCaMmQ9OU0LYrjBRNGlm6jbmrnEkjBVl7ObLsPZKGXY0nJg5/Xg7J695m\nzhP3RWxAs2Bmwk3YBjMRaQJ8DkxR1bmVHGPBLJhUYcEjsOwlJ8M+ColtnQki7QfBgBvA07inrJd0\nKCefD1bu4u57puDrcyGemOKerD8vh6FHv2DWU38NYQtrz4KZCTfhHMymAYeBtRbMwtC+jTBnEmxd\nVLyt6yi2DH2QF/9xH/5Du/AkteWG30yjY+fOoWtnGDj/ul+yLvX8ctsPLnyVyyf+lisHtees7ikR\nNWnEgpkJNwENZiIyE7gQ2KOq/UpsPw/4O+ABZqrqg2Vedw7QAogD9qnqB5Wc34JZKPnyYd0cOPID\nzH+YLTv3MmNFDNOG5pMQI2TnKVNWpjJpxoeNOqDdMOlOPo0eXK5ndnjJWyQPuwqANknOpJEJAyMj\n04gFMxNuAh3MzgCOAC8VBjMR8QDfAmcDO4ElwBWqul5ErgX6A0lAFtAbOKqq4ys5vwWzcLFtMdOu\nG8Htp0eREFP8Ny47T3lkxwCmnNsKvvsYmneBbuc499l6j3eel6QKB7dAs07BbX8AZWRs5uJb7yGr\n5/hS98yef3gyS/dF8a8lW9lcJtPIFYPaM6Z3m7DNNGLBzISbgA8zikhH4L0SwWwIzn2w893ndwFa\ntnfm7rsOp2dmw4wRYMpVpzOt+9ry2z/LYdrIKmY+NusEHYZC3mHYux72b4S+E2Dk3dC8YfToMjI2\nM+3RJyqczaiqfJVRPtNIUlwUF5+SymUD2nNymGUasWBmwk0ogtmPgDGqOtF9fg0wSFV/VYtzWzAL\nI9N+dR23N32nfM9sRSJTfvNTGHwLZMyHI3tgx1JY+27VJ/TGOmva+l8PHQYHuPXh4VBOPnNW7GT2\n0m2s3J5VtP3ElKZcNiCN8ae2IyUp9EsiLJiZcBPxwWzKlClFz0eMGMGIESPqpd2m5rZkZDBj0vlM\n67ez+J7ZN22Z9Nh/yt8zU4Vl/3TWrbXu7QS5+GYQmwRbv4TFT5c+/qQLnAz+J10ALbsF76JCaP3u\nQ7yxdDvvLN/BfjfTiNcjjDypFVcO6sCIk4I3aSQ9PZ309PSi59OmTbNgZsJKqIYZp6rqee7zSocZ\nq3Fu65mFmS0ZGbz4tyn1M5txzduwZCZsXlC8TTxODy9tAKT2h+1LnRySCS0qP0+Ey/f5+Wz9Xt5c\ntp1P1u2lwE01kpocx4TT2vPj09rTNjk+qG2ynpkJN8EIZp1wgllf97kX2IAzAWQXsBi4UlXX1eLc\nFswagw0fOkVDD+2EHyr5Z9JxGFz1L4hNDG7bgmzfkVze/Ho7ry8unjTiETinZ2uuPb0jZ3RrGZR7\naxbMTLgJ9GzG14ARONPs9+BM/HhBRM6n9NT8B2p5fgtmjc3yV+GTP8KR3VUf1+cyGHIrnNDeGbps\nYKm3/H5l0ff7eW3xVj5avZsCv3JqhxN4+9ZhQXl/C2Ym3ITtounqsGDWiGXvc7KNxDdz7rf986Kq\nj+82Gi57HuKSgtO+INp7OIfZS7ZxYutExvRuE5T3tGBmwo0FM9MwFOTCf+5yMpNs+QLUV/4YTxSc\n8RtIagenXAVRscFvZwNhwcyEGwtmpuEqyIXMDPhiBqx4pfz+ky6Aob+CjqcHv20RzoKZCTcWzEzj\nsO49mP8w5ByCAxnl9ye2hUufcWZLpp1mvbbjsGBmwo0FM9P4HN4Na95xFm1v/aLiY86eAsNuA48n\nuG2LEBbMTLixYGYatwNbYPW/nRmSVekyEsY9BslpwWlXmLNgZsKNBTNjwKmmjUDeEae0zdp3qj4+\nbRB0GQEnnQftBgShgeHFgpkJNxbMjKlIziH4bh7EJcPBrfD+bZUf640FXy7c9AmkDQxeG0PIgpkJ\nNxbMjKmuvevg3zdCQitI6QmbPoMDm51AVmjUPXD6pAa3SLssC2Ym3FgwM6Yujh2AVf+GubdXvH/o\nr+Cs30Ns0+C2K8AsmJlwY8HMmPpQkAeLn4FFj8PhneX3D/gJnDgaup7dIHptFsxMuLFgZkx9yj8G\n7/0aVv7LeS4eUH/pY04cA4MmOtn+I3TqvwUzE24smBkTSH4/bJgLq9+ENW+V3tesMyS2Zcspd/Li\niy/UT9mcILFgZsKNBTNjgiX/GGz8GN68yckTmZ/NloN+ZizOY9qI2BIFTVOZ9NiHYR3QLJiZcGPB\nzJhQ8Ptg3XtM+8UV3D40hoSY4riQnac8sj6NKY/PgjZ9IQj1yWrKgpkJN5E5YG9MpPN4ofcl+DsN\nLxXIABJiBP/+TfD0cJh2Arx4IeQeCVFDjYkMFsyMCSFPUluy80qPLmTnKZ5mHZ3JIwCbF8Bf2sHU\nZHj3l5B3NAQtNSa8heUwo4icBfwJWAO8rqrzKznOhhlNRNuSkcGMSeczrd/O4ntmK1OZNONDOqa1\ncSaOzL0T8rNLvzAxFYbcAkMnhWQY0oYZTbgJ12B2JvB7YA9wn6p+X8lxERHM0tPTGTFiRKibETR2\nvTWzJSODF/82pfLZjAV5sN8tOvq/6ZC1tfQJTrsJhv8OklJr3YaasmBmwk1AhxlFZKaI7BGRlWW2\nnyci60XkWxH5fdnXqep8VR0L3AUcJ515+EtPTw91E4LKrrdmOnbuzJTpLzHtxY+ZMv2l8rMYo2Kg\ndW8Y9DP49Tdw61cQFV+8f8lz8GhPmDnGCXZ5ZXpxxjQCgb5n9gIwpuQGEfEAj7nbewNXikgPd9+1\nIvKoiLR1Dz8IxAS4jcZEDo8HUnrAPbthykGY8DK06efs2/YlfDwZHu4Gs6+D5a+61QCMafiiAnly\nVV0oIh3LbB4EbFTVLQAiMgsYB6xX1ZeBl0VkvIiMAZJxAp8xpiwR6HWx87VvI6x+C9L/DPlHncKj\na9+Fd291hiFPvtIpVROG0/yNqQ8Bv2fmBrP3VLWf+/xHwBhVneg+vwYYpKq/qsW5w/+GmTENlN0z\nM+EkoD2zQLP/TMYYYyA068x2AB1KPE9ztxljjDG1EoxgJu5XoSVANxHpKCIxwBXAnCC0wxhjTAMV\n6Kn5rwFfAN1FZKuI/ERVfcAk4L84i6Jnqeq6QLbDGGNMwxaWi6aNMcaYmrDcjCEiIp1F5DkRmR3q\ntgSDiDQRkRdF5GkRuSrU7Qm0Rvj7HSciz4jI6yIyOtTtMY2P9cxCTERmq+qEULcj0NwlGAdU9QMR\nmaWqV4S6TcHQWH6/hUTkBOBhVf1ZqNtiGhfrmdVRbVN2RbpaXHcasM19HHFpKRrb77kO13sP8Hhw\nWmlMMQtmdVfXlF2RulauRteNE8jSCg8NViPrUU2vt+iw4DSv3tX4ekXkAWCuqq4IZkONAQtmdaaq\nC4EDZTYXpexS1XygMGUXqvqyqv4WyBWRJ4FTIvETfU2vG3gbuExEHgfeC15L60dNr1dEmjem36+I\nTALOxvkdTwxqY40hwjOAhLF2FA+pAWzH+UNQRFUzgVuC2aggqPS6VfUocGMoGhVAVV1vY/v9zgBm\nhKJRxoD1zIwxxjQAFswCo7Gm7Gps123X27Cv10QQC2b1o7Gm7Gps123X27Cv10QwC2Z11FhTdjW2\n67brbdjXayKfLZo2xhgT8axnZowxJuJZMDPGGBPxLJgZY4yJeBbMjDHGRDwLZsYYYyKeBTNjjDER\nz4KZMcaYiGfBzNSamwlipPu4tYj8oZ7O+4iIpFSwvZ+I3FEf72GMaVgsmJm66ASMAlDVPar6l7qe\nUEQSgVaqurfsPlVdCQyp63sYYxoeC2amLiYC14rIx24v7WUAEVkkIk+JyHIRuUFE3hSRFSLS190/\nVkQ+F5GFInJumXOeDXzpHjdeRL4SkXkicp67f6OInBKsCzTGRAarZ2bq4hlgk6reKyIdgcLcaM2B\ne4BoYBlOpvWBwE9F5DfA7cBIwAt8iJPrr9CJwGr38XjgclXdWmJ/BtADsGrGxpgiFsxMIOxV1X0A\nIvKdquaLyE6gGdAS6AnMw8nI3rKK89wHTBYRL3C/qm4KcLuNMRHKhhlNXeRTsw9EAuwDVgJnq+pI\noOyQ4Uace3EAW1X1Z8CzwG/dbV2A9bVtsDGmYbJgZupiNTBMRF4vs10reYw6ZRr+BnwqIp8Cfy/z\n2k+Boe7jqSKSDkwHZrnbuquqDTEaY0qxEjAm7IjIw8DDZWc0ikg/YIyqPhyalhljwpUFM2OMMRHP\nhhmNMcZEPAtmxhhjIp4FM2OMMRHPgpkxxpiIZ8HMGGNMxLNgZowxJuJZMDPGGBPx/h/fMpzP9MMR\nBAAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -385,49 +633,49 @@ "plt.loglog(logs['plain_sgd'][500].logger.time_hist, logs['plain_sgd'][500].logger.loss_hist['valid']['logistic'],\n", " label='Cores SGD 500', linewidth=2, color=colors[2])\n", "\n", - "grid = np.array([0.01, 1, 5, 30, 60]) / 2.5\n", + "grid = np.array([0.3, 2, 15])\n", "x = logs['riemannian_sgd'][-1].logger.time_hist\n", "marker_indices = np.searchsorted(x, grid)\n", "plt.loglog(logs['riemannian_sgd'][-1].logger.time_hist,\n", " logs['riemannian_sgd'][-1].logger.loss_hist['valid']['logistic'],\n", " marker='o', markevery=marker_indices, label='Riemann GD', linewidth=2, color=colors[0])\n", - "grid = np.array([0.05, 2, 12, 30]) / 2.5\n", + "grid = np.array([0.05, 2, 70])\n", "x = logs['riemannian_sgd'][100].logger.time_hist\n", "marker_indices = np.searchsorted(x, grid)\n", "plt.loglog(logs['riemannian_sgd'][100].logger.time_hist,\n", " logs['riemannian_sgd'][100].logger.loss_hist['valid']['logistic'],\n", " marker='o', markevery=marker_indices, label='Riemann 100', linewidth=2, color=colors[1])\n", - "grid = np.array([0.1, 7.5, 60]) / 2.5\n", + "grid = np.array([0.1, 1, 20])\n", "x = logs['riemannian_sgd'][500].logger.time_hist\n", "marker_indices = np.searchsorted(x, grid)\n", "plt.loglog(logs['riemannian_sgd'][500].logger.time_hist,\n", " logs['riemannian_sgd'][500].logger.loss_hist['valid']['logistic'],\n", " marker='o', markevery=marker_indices, label='Riemann 500', linewidth=2, color=colors[2])\n", "\n", - "grid = np.array([0.1, 3, 20, 53])\n", - "x = riemannian_sgd_rand[-1].logger.time_hist\n", + "grid = np.array([1, 7, 20])\n", + "x = logs['riemannian_sgd_rand'][-1].logger.time_hist\n", "marker_indices = np.searchsorted(x, grid)\n", - "plt.loglog(riemannian_sgd_rand[-1].logger.time_hist,\n", - " riemannian_sgd_rand[-1].logger.loss_hist['valid']['logistic'],\n", - " marker='s', markevery=marker_indices, label='Riemann GD rand init', linewidth=2, color=colors[0])\n", + "plt.loglog(logs['riemannian_sgd_rand'][-1].logger.time_hist,\n", + " logs['riemannian_sgd_rand'][-1].logger.loss_hist['valid']['logistic'],\n", + " marker='s', markevery=marker_indices, label='Riemann GD rand init 1', linewidth=2, color=colors[0])\n", "\n", - "# plt.loglog(plain_sgd_rand[-1].logger.time_hist,\n", - "# plain_sgd_rand[-1].logger.loss_hist['valid']['logistic'],\n", + "# plt.loglog(logs['plain_sgd_rand'][-1].logger.time_hist,\n", + "# logs['plain_sgd_rand'][-1].logger.loss_hist['valid']['logistic'],\n", "# marker='v', label='Cores GD rand init', linewidth=2, color=colors[0])\n", "\n", "legend = plt.legend(loc='upper left', bbox_to_anchor=(1, 1.04), frameon=False)\n", "plt.xlabel('time (s)')\n", - "plt.ylabel('validation logistic loss')\n", + "plt.ylabel('test loss (logistic)')\n", "plt.minorticks_off()\n", "ax = plt.gca()\n", "ax.set_xlim([0.02, 100])\n", - "ax.set_ylim([1e-17, 2])\n", + "ax.set_ylim([1e-5, 20])\n", "fig.tight_layout()" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 80, "metadata": { "collapsed": true }, diff --git a/experiments/Riemannian_vs_baseline_hiv.ipynb b/experiments/Riemannian_vs_baseline_hiv.ipynb new file mode 100644 index 0000000..e211086 --- /dev/null +++ b/experiments/Riemannian_vs_baseline_hiv.ipynb @@ -0,0 +1,2289 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import os\n", + "import cPickle as pickle\n", + "import numpy as np\n", + "import pandas as pd\n", + "from sklearn.cross_validation import train_test_split\n", + "\n", + "import sys\n", + "sys.path.append('../')\n", + "\n", + "%matplotlib inline\n", + "import matplotlib as mpl\n", + "import matplotlib.pylab as plt\n", + "import tt\n", + "from src.TTRegression import TTRegression\n", + "import urllib" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "train_fraction = 0.8" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def get_dummies(d, col):\n", + " dd = pd.get_dummies(d.ix[:, col])\n", + " dd.columns = [str(col) + \"_%s\" % c for c in dd.columns]\n", + " return(dd)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "... loading data\n", + "dataset len: 1625\n", + "\n", + "Original targets:\n", + "-1 1250\n", + " 1 375\n", + "Name: 1, dtype: int64\n" + ] + } + ], + "source": [ + "# Reproducability.\n", + "np.random.seed(0)\n", + "\n", + "dataset_path = 'hiv.txt'\n", + "# if (not os.path.isfile(dataset_path)):\n", + "# dataset_url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/car/car.data'\n", + "# print('Downloading data from %s' % dataset_url)\n", + "# urllib.urlretrieve(dataset_url, dataset_path)\n", + "\n", + "\n", + "print('... loading data')\n", + "hiv_data = pd.read_csv(dataset_path, header=None)\n", + "\n", + "print \"dataset len: %d\\n\" % len(hiv_data)\n", + "print \"Original targets:\"\n", + "print hiv_data.ix[:, 1].value_counts()\n", + "\n", + "hiv_target = hiv_data.ix[:, 1].values\n", + "\n", + "cols = []\n", + "for i in range(8):\n", + " dd = pd.get_dummies((hiv_data.ix[:, 0].str[i]))\n", + " dd.columns = [str(i) + \"_%s\" % c for c in dd.columns]\n", + " cols.append(dd)\n", + "hiv_features_one_hot = pd.concat(cols, axis=1)\n", + "hiv_features_one_hot = hiv_features_one_hot.as_matrix()\n", + "\n", + "# Shuffle.\n", + "idx_perm = np.random.permutation(len(hiv_data))\n", + "\n", + "X, y = hiv_features_one_hot[idx_perm, :], hiv_target[idx_perm]\n", + "\n", + "num_objects = y.size\n", + "train_size = np.round(num_objects * train_fraction).astype(int)\n", + "X_train = X[:train_size, :]\n", + "y_train = y[:train_size]\n", + "X_val = X[train_size:, :]\n", + "y_val = y[train_size:]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1300, 160)\n", + "(325, 160)\n" + ] + } + ], + "source": [ + "print(X_train.shape)\n", + "print(X_val.shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Train" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.091907711416386123" + ] + }, + "execution_count": 102, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn import metrics\n", + "md = LogisticRegression()\n", + "md.fit(X_train, y_train)\n", + "\n", + "phat = md.predict_proba(X_val)[:,1]\n", + "metrics.log_loss(y_val, phat)" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['X_val',\n", + " 'X_train',\n", + " 'riemannian_sgd_smart_rand',\n", + " 'plain_sgd_rand',\n", + " 'plain_sgd',\n", + " 'riemannian_sgd',\n", + " 'riemannian_sgd_rand',\n", + " 'y_val',\n", + " 'y_train',\n", + " 'plain_sgd_smart_rand']" + ] + }, + "execution_count": 106, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "logs.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.049553831284881833, 0.072686232951934965)" + ] + }, + "execution_count": 148, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 10, 'riemannian-sgd', max_iter=100, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.001)#, exp_reg=1.2)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1], rieamannian_model.logger.loss_hist['valid']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 149, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(rieamannian_model.logger.loss_hist['train']['logistic'][1:])\n", + "plt.plot(rieamannian_model.logger.loss_hist['valid']['logistic'][1:])" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.055013951202464745, 0.068450260366060611)" + ] + }, + "execution_count": 153, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "model = TTRegression('all-subsets', 'logistic', 4, 0.001, 'sgd', max_iter=100, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.0001)\n", + "model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "model.logger.loss_hist['train']['logistic'][-1], model.logger.loss_hist['valid']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 154, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(model.logger.loss_hist['train']['logistic'][1:])\n", + "plt.plot(model.logger.loss_hist['valid']['logistic'][1:])" + ] + }, + { + "cell_type": "code", + "execution_count": 146, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.048325617261269105, 0.07357982661999532)" + ] + }, + "execution_count": 146, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 20, 'riemannian-sgd', max_iter=100, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.001)#, exp_reg=1.2)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1], rieamannian_model.logger.loss_hist['valid']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 147, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(rieamannian_model.logger.loss_hist['train']['logistic'][1:])\n", + "plt.plot(rieamannian_model.logger.loss_hist['valid']['logistic'][1:])" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.052488880609546637, 0.074131447108265663)" + ] + }, + "execution_count": 143, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 5, 'riemannian-sgd', max_iter=100, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.001)#, exp_reg=1.2)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1], rieamannian_model.logger.loss_hist['valid']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.04899284828491178, 0.075667014143683223)" + ] + }, + "execution_count": 140, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 20, 'riemannian-sgd', max_iter=100, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.001)#, exp_reg=1.2)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1], rieamannian_model.logger.loss_hist['valid']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.049805296322674525" + ] + }, + "execution_count": 137, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 10, 'riemannian-sgd', max_iter=100, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.001)#, exp_reg=1.2)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1], rieamannian_model.logger.loss_hist['valid']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.073058285036361914" + ] + }, + "execution_count": 139, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 138, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n39Z8zrpwxhmqTzxh7ysrVe+8U7VRI9X+/VWLiqq2ff99+/WPx+uvW77h88+tXdu25hHF44IL7Hqv\nvFL1uOPs1/8XvzDvSNW8pw4dVCdMsPLkyardupmtL79cvb9Vq1QXLYqWb7vNckGxnHKK6ltvRcuf\nfWYe7JgxVduVlKiOGxff9rCn88wz1T22MWNUr77a/r9mz1Z99FHVyy+P31cs1NNzyYi4YOHUeqBl\nqK4lIMH7e4FxCc6vw4YN+882ffr05D6ZPKJ3b9Wf/CTbVkRZtswSti1aRL+8O3eqHnJI1S+Nqn3B\nxo9PzXkrKizZHCsCiUShNm64wQTjjDMSfzlVLYw6+WTVBx9UnTPHhKl3b9X77rP9I0dWDRl37bI+\nIbmk9oYNdl3r10frvv1WtUkTSzKHWbJEtVWrqqHLVVep7rOP6v33V21bVmaiMXy4lX/60+rXGRHW\nFi3sb7hwoSWhI9cxZ0607fTp06t81zIhLj2BaaHyUOD2mDZjgItD5TKgVaj843Afcc7RHpifYF/1\nv1YD4447VH/3u2xbUZ3iYhOUrVtV33xT9YQTqrd5/nmL61PBo4/aFyRVbN2q2rGj6pFHRr2QZFm+\nXPWgg1TffttyKLH5sDlzVH/4w+T7GziwqpdVXJzYW/3tb00YVe2OU/PmqrNmmVdz222qU6eal9Ky\npeWmDj9c9bHHTMBic0pbt6qKqA4YYOXKSstVrV2r+te/mgIkyvVlQlz2IprQ3ScIY46KadOPaEK3\nJzEJXeBZ4GcxdYeE3t8KjE9w/vhX3oDYudO2XOSyy+yffciQ6C95mB077PbuRx/V/1z9+qXOC4qw\ncKElxHeHRx5R3Xvv+CFNXXn6aQu/Iowda15VPFatit6afu451bPPjtZfc43qeeeZZ/Xuu1ZfUmLC\nkkjkO3VSHT06Wv7hD+1vetBBqoMGqf785/GPS7u42DnoCywCyoGhQd0Q4OehNqMDEZoXExI1CUKi\npjF9Pg3MD8RqctjTiWkX/8qdjLB0qf3SHXighUvxuOce1Wuvrd95tmyx3NPmzfXrJ5Xs2mVfwlhv\nYHfYuNHGIW3fbuWzzrI7dIn40Y8sxOnfX/Xxx2vv/913Vd94I/6+55+vOq7p97+3b/6jj0bH5oT3\nR8iIuGRzc3HJPjffrNqjR+L969bZP+imTbt/jgkT7BZvQ+assywZ/OabFq7VlAifOlX1mGNMkFIt\n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\nAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(rieamannian_model.logger.loss_hist['valid']['logistic'][1:])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5],\n", + " [ 0.5, 0.5]])" + ] + }, + "execution_count": 109, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "logs['riemannian_sgd_rand'][-1].predict_proba(X_val)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Choose the step size for sgd\n" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "17.867469528251185" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 32000.0, 'riemannian-sgd', max_iter=10, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "plt.loglog(rieamannian_model.logger.loss_hist['train']['logistic'])" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "5.2376773398940273" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 16000.0, 'riemannian-sgd', max_iter=10, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n+oOIfTVnXLkAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.loglog(rieamannian_model.logger.loss_hist['train']['logistic'])" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4.2812900713979012" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 8000.0, 'riemannian-sgd', max_iter=10, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.loglog(rieamannian_model.logger.loss_hist['train']['logistic'])" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3.2772404275048075" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 4000.0, 'riemannian-sgd', max_iter=10, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3.8138777144144325e-07" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 2000.0, 'riemannian-sgd', max_iter=200, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1.2588001429859041" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 1200.0, 'riemannian-sgd', max_iter=10, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.64938201034652476" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 600.0, 'riemannian-sgd', max_iter=10, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.56848235213715392" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 500.0, 'riemannian-sgd', max_iter=10, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.44834578313021378" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 400.0, 'riemannian-sgd', max_iter=10, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.12317075220657484" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 300.0, 'riemannian-sgd', max_iter=10, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.11523507694629134" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 250.0, 'riemannian-sgd', max_iter=10, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.078775459626710592" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 200.0, 'riemannian-sgd', max_iter=10, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3.1281075685984382e-06" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model_800 = TTRegression('all-subsets', 'logistic', 4, 800.0, 'riemannian-sgd', max_iter=200, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model_800.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model_800.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4.6763795526036593e-07" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model_1600 = TTRegression('all-subsets', 'logistic', 4, 1600.0, 'riemannian-sgd', max_iter=200, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model_1600.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model_1600.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.00026016104170833684" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 160.0, 'riemannian-sgd', max_iter=200, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAEHCAYAAACncpHfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd4VGX68PHvk0AooUdqCKEXEVB6qFFQYAFFkapYVtf2\nytrFTnB/7mJDd0VkVUBBERBx6UWRIAgElCq9CSSEABJ6C8n9/vFMSCGBSTI1c3+u61zJnHPmnDse\nmXuebkQEpZRSgSfI2wEopZTyDk0ASikVoDQBKKVUgNIEoJRSAUoTgFJKBShNAEopFaA0ASilVIDS\nBKCUUgGqiLtvYIxpCDwFhAE/ichYd99TKaXUtRlPjQQ2xhjgSxG5zyM3VEopdVV5rgIyxowzxiQZ\nYzZm29/dGLPNGLPDGDMs27HewBxgXsHCVUop5Sp5LgEYYzoAp4GJItLUsS8I2AF0AQ4Ca4CBIrIt\n23vniEgvVwSulFKqYPLcBiAiy40xkdl2twZ2isg+AGPMFOAOYJsxpjNwF1AMmFvAeJVSSrmIqxqB\nw4EDmV7HY5MCIrIUWHq1NxtjdEpSpZTKBxEx+X2vz3QDFRGvb8OHD/f6tfLyPmfOvdo5+TmW035X\n/nfzhWfnK88vv8f97dm5Og5feHaeen4F5aoEkADUyPS6umOf02JiYoiNjXVROPkTHR3t9Wvl5X3O\nnHu1c/JzzJX/jVzJ1XH5wvPL73F/e3YQeP/2rnbcmf2xsbHExMRcM4ZryVc3UGNMTWC2iDRxvA4G\ntmMbgROB1cAgEdnq5PXEFdlMeUdMTIxL/mdUnqfPzr8ZYxBPVgEZYyYDK4D6xpj9xpgHRSQVGAos\nAjYDU5z98Ff+z5e/Waqr02cX2Dw2EOyqQRgjw4cPJzo6Wv+HVEqpa4iNjSU2NpYRI0YUqATgMwnA\nF+JQSil/4vEqIKWUUoWDJgCllApQPpMAhg8f7vVuoEop5Q+82g3U1Ywx0v/b/nzZ50uKFynu7XCU\nUsovFJo2ABHhtkm3cezcMW+HopRSAcFnEsCUu6fQqlorOozvwL7j+7wdjlJKFXo+kwCCTBDvd3uf\nR1s8Srvx7ViXuM7bISmlVKHmM20AmeP4bst3PDb3Mb668yu61e3mxciUUsp3FZo2gMz6Xt+X/w34\nH/f/734mrJvg7XCUUqpQcvui8M6KiYnJMhVE+xrtWfrAUnp83YP9J/bzRuc3sMsKK6VUYEufCqKg\n3F4FZIy5A+gJlAbGi8gPOZyT61QQh04fotfkXjSr3IyxvcZSNLioW+NVSil/UdAqII+1ARhjygHv\nisjfcjh21bmATl88zYDpA0iTNKbdPY3SxUq7M1SllPIL3pgOepwxJskYszHb/u7GmG3GmB3GmGE5\nvPU14OP8BFkqpBQzB84kokwEnb/oTOKpxPxcRimlVCb5aQSeAGTpmmOMCQJGO/Y3BgYZYxpmOj4S\nmCci6/MbaJGgIvy313+5q9FdtBvfjq1HdLkBpZQqiDwnABFZDiRn290a2Cki+0QkBZgC3AFgjBmK\nXSnsbmPMIwUJ1hjDa51eI6ZzDNFfRrNs37KCXE4ppQKaq7qBhgMHMr2Od+xDRD4SkVYi8oSIfJrr\nFcaNg/h4p252/43389WdX9F3Wl++3fxtAcJWSqnA5TvdQD/4AIYOhdBQojt3Jvrhh6FzZyhRIsfz\nb61zK4uGLKLX5F7En4znmahnPByxUkp5lqu6f6bL76LwkdhF4Zs6XrcFYkSku+P1S4CIyNtOXs/2\nAkpNhbVrYeFCu61fD1FR0K2b3Ro3hmxjAfaf2E+Pr3twa+1bef+29wkOCs7z36OUUv7IK91AjTE1\nsQmgieN1MLAdW9efCKwGBjm7MHyuawKfOAE//ZSREFJS4LbbbDLo2hXCwgBIPpfMnVPv5LqS1zHp\nzkmUKJpzqUEppQoDr60JbIyZDEQDYUASMFxEJhhjegAfYtsVxonIyDxc89prAovAzp0ZyeDnn6FR\no8ulgwstbuSBuQ9z4MQBZg6cSVjJsDz9XUop5W/8ZiDYVYPIz6LwFy7AL79kJIR9+5BbbmZGxBk+\nrrCLcUN/pFb5Wu4JWCmlfEChSQA5VgHlxaFDsGgRLFzI2fmzSCxyjtK976bSXUMgOhpCQ10ZslJK\neY3XqoDcIV8lgKtJS2PJjFGsGDecx/6sTdiWvdCmTUZjctOmVzQmK6WUvyk0JQB3xLHywErunHon\nb7d5jfuTa2RUF505k9GYfOutULGiy++tlFLuVmjWA4iJiXFp/1aAqIgofn7wZ95c9wFvlP4VGT0a\ndu2C5cttiWDqVKhbF1q2hNdfh5MnXXp/pZRyh9jYWGJiYgp8nUJdAkh3+Mxhek3uxfUVr+ez3p9l\nnVL64kVYudKORF63DmbPhpo13RaLUkq5ilYBOenMxTMM/G4gFy5dYHr/6ZQpVibrCSLwn//A22/D\n9OnQrp1b41FKqYIqNFVA7hYaEsr3A76ndvnadJrQiYOnDmY9wRh46in4/HPo0we+/to7gSqllIcE\nTAIAO6X0Jz0/YUDjAUSNi2Lz4c1AxhgzEeAvf7Gjj197zW5pad4NWiml3CRgqoCy+2rjVzy36DmG\nVp7G3DGd+fVX+Ne/4PnnHSccPgx33QVVq8KXX0LJkh6NTymlrkWrgPLh/Hk4u+peQmZNZsTWfrR9\neAo7d8KoUTBvnuOkSpVg8WI7G2mnTpCQ4NWYlVLK1XwmAbijG2h2ycnwz39CrVowcyZ89Y8u/Pr3\nH5l+8gWmJbzDlGkpPPAAbE2fwq5YMfvtv29faNsWfvvNrfEppZQz/KYbqDGmFvAqUEZE+udyjlur\ngPbtgw8/tJ/lt99uq3luuCHjePzJeAZ9N4jNhzdTL6gb+xb1YvkX3akbnmlCuRkz4NFHYexYmxCU\nUsrL/KYbqDFmmqcTwIYN8O67tlrnoYdsJ5/q1XM/P+FkAvN2zmPk93PYZ5bQtlYzetfvRc/6PWlc\nsTFm3Tq44w547DF45RWdTkIp5VUeTwDGmHFALyApfUEYx/7uZJ0O+u1s7/NIAhCxnXjeeQd+/91+\n6D/6KJQt6/w1Ll2CHr3PU7JxLBG3zGH2jtkYDL3q96Jv2Sg6PzWKoEbXw2efQfHiLolbKaXyyhsJ\noANwGpiYaUWwIGAHdkGYg8AaYKCIbMv0vm9FpF8u1yxwArh0yY7feucd28j7/PNwzz22Gj8/jh+3\ns0W88AI89JCw+chm5uyYw5wdc9gVv5Hv5pWm7vkSyIwZVKnd9NoXVEopF/PWimA5LQk5XER6OF5f\nXhLSGFMBeAvoCnye0zKRBUkAZ87A+PG2B0/16vDii9CzJwS5oHl7+3bo2BG++87+TPfn2T9ZsGMe\nxd96m5aLt/Li0IY0urkfver3onnV5gQZn2lbV0oVYr6SAPoC3UTkEcfre4HWIvJ3J6+X5wRw5AiM\nHg2ffAIdOthv6lFRefs7nLFoEdx/P6xaBZGRVx6/9NVE0p5+iklP3cz7FbZx7Nwxetbrye0Nbqdb\n3W4UL6JVREop9yhoAijiymAKInOXpqstDLNrl/22/8030L+/ndizfn33xXXbbTBsmO099MsvUKpU\n1uNF7r0P6tTjob59eeiFF9j9YG/m7prHh3Ef8sDMB+hdvzcDGg/g1jq3EhIc4r5AlVKFXvpCMK7i\nyiqgGBHp7nh9uQrIyetdswSwerXt0bNkie2EM3QoVK6c59DzRcT2Ijp+3LYz5Fi9tG8f9O5txwuM\nHg0hISSeSmT6lulM3TyVrUe30qdBHwbcMIBbat1CkSCfyb1KKT/lrSqgmtgE0MTxOhjYjm0ETgRW\nA4NEZGtu18h2vRyXhBSB+fNtw+7evfDss/aDOPu3cE+4cAFuuQW6dIE338zlpFOnYPBgOH3aNhxU\nqHD50IETB/h2y7dM3TyVvcl7uavRXQxoPIBOkZ0IDgr2zB+hlCoUvLYkpDFmMhANhAFJ2MbfCcaY\nHmTtBjoyD9fMUgK4eNFW8bz7LhQpYuv3+/eHokWvchEPSEqC1q1tXP1z7NAKpKbCSy/BpElw7722\nAaFJkyyn7E3ey7TN05i6eSqJpxO5u9HdDLhhAO0i2mkDslLKaX4zEOyqQTgSwMmT8Omn8O9/Q4MG\ntkfPrbf61nirdetsu8DChdC8+VVO3LbNJoFJkyAszCaCwYPtHEOZ7Phzx+VkcPz8cW6vfztREVG0\nCW9D3Qp1Mb70xyulfEqhSQDt2w9n48ZoevaM5oUXrvHh6mXTp9vqqNWroUqVa5yclmYbLr78EmbN\nshPL3XefbS/INkhh8+HNzN81n7iEOOLi4ziTcobW4a1pE96GNuFtaB3emrCSYbncSCkVKLxWBeQO\nxhgZOlR45hk7UZs/iImxXUSXLMnDYLP0toGJE+08Ff3722TQpk2OxZzEU4mXk0FcQhy/HvyVyqUq\nX04Gvev3plZ5P/kPppRyuUJTAvCFOPIiLc1+fpcubQei5bmmZv9+Wz305Zf2zffdB0OGQI0aub4l\nNS2VrUe3Ehcfx6r4VczYNoMBjQfweqfXqVq6asH+IKWU39EE4EVnzkD79vaz+9ln83kREYiLs4lg\n2jTbyhwTY0sF13D07FFGLh/J+HXjebTFo7zY/kXKlyifz0CUUv6m0CwI44n1AFwtNNSuK/Duu7Bg\nQT4vYowdO/DJJ3bRmT594O677cizDRuu+tbrSl7He7e9x4bHNnD07FHqj67PyOUjOZtyNp/BKKX8\ngd+sB+BUEH5aAki3fLldPXLZMtt7qcDOn4f//hdGjrSNxjEx0KjRNd+2/eh2Xl/yOsv3L+e1Tq/x\ncPOHdfSxUoVYoSkB+LMOHex6wr1721XHCqx4cTuP9a5dtjtU5862G+mePVd9W4PrGjCt3zRmD5rN\nzO0zafRxI77f+j3+nFyVUu6jJQAXevpp2LLFLkBTxJUzPZw4AR98AB99ZKuHXnsNIiKu+bbFexbz\n5PwnqVehHh/1+IjIcjnMZqeU8ltaAvAh771nf77wgosvXLasrQbasQPKl4dmzWwJITHxqm/rUrsL\n6x9dT+vw1rT4tAXvr3ifS2mXXBycUspfaQJwoSJFYOpUmDvXfll3eaEmLMy2C2zZYhuPr7/ernoT\nF5frW4oVKcZrnV5j1cOrWLB7AS0/bUlcfO7nK6UCh1YBucH27TBggE0Ar75q15APdsd8b8nJMGEC\nfPyxTQ5Dh9rBCbmMTBMRvvn9G55b9Bx3NryTf3b5J+WKl3NDYEopT/D5KiBjTEljzBfGmP8aYwbn\ndp4/dgPNTYMGds6gt96yVfeNG8MXX0BKiotvVL68HYCwYwe8/rodWBYZCW+8AQcPXnG6MYbBTQaz\n5YktpEkajT5uxJg1Y0hJLUBgCQkF+AOUUvnhN91AHauDJYvIXGPMFBEZmMM5haoEkJmInS7i//7P\nduIZNgwefNCNa8lv3WrXI/jmG+jWDR55xPYiymERg3WJ6xj24zD+OP4H/+zyT/o26uvc5HPnz9tB\na2PG2OqnpUttd1WllEd5Y1H4cUAvICl9QRjH/u5knQ76bcf+l4B5IrLRGPO1iNyTwzULbQLIbOVK\nWypYuxaeew4efdSNaxucOGGLHePH25VshgyxWw4DFX7Y/QPDfhxGSHAI79z6Dp0ic/kw370bxo61\n123ZEp54Av74A2Jj7RxHSimPKmgCQETytAEdgBuBjZn2BQG7gEigKLAeaOg4dg/wF8fvk3O5pgSS\ndetE+vUTqVhR5M03RZKT3XzD9etFnn1WpHJlkTZtRMaMEfnzzyynpKalylcbvpKaH9aUXpN7yZ5j\ne7Je4/PPRcLCRF54QWTXroz9p06JVKgg8scfbv4jlFLZOT478/w5nr7l7032gz5zAmgLzM/0+iVg\nmOP3ksB44GPsKmEBnwDSbd0qcv/99vPz5ZdFDh928w1TUkTmzhUZMECkTBn7c9u2LKecTzkvI5eN\nlIrvVJQZW2aIpKaKvPKKSJ06V5x72TPPiLz4opuDV0plV9AE4Ko1gfsC3UTkEcfre4HWIvJ3J68n\n+YmjsNi71y57OXWq7dX56KNwww1uvunx43a6iffeg379YPjwLIssr05YzZAp/Zk8pzg3nStH0OzZ\nULFiztfavdtOXrd/P5Qs6ebAlVLpCloF5DMrk2du0c6+NnBhV6uWnQvu9dftz27doGZN237br5+b\nPlPLlbMt0g8/bFuoGze2g8uefRZCQ2ldvA6/f1+N1Zf+IPq+0kwseoaa5JIA6tSBdu3g66/hb39z\nQ7BKKchYCMZl8lNsIOcqoAWZXl+uAnLyeq4uGfm1lBSRmTNFeva01UNPPimycaObb7p7t8jAgSLV\nqomMGiVSv77Iiy9K2qVL8v6K96XSu5Vk6u9T5eiZo5KWlnbl+3/4QeSGG0RyOqaUcgu8VAVUE1sF\n1MTxOhjYDnQBEoHV2Pr+rU5eT4YPHx5w3/ydsX+/7cgzbhxUr25LBf3726mo3WL1attVqWdPezOH\nVfGreHLek+xO3s25lHNUK12N8DLhVC9TnZtr3kyvej2p1vZWOyjt5pvdFJxSCry4JKQxZjIQDYQB\nScBwEZlgjOlB1m6gI/NwTclPIgokly7ZNQc+/RR++QUGDrSfz82aeT6WsylnOXjqIAdPHWRv8l4W\n7l7Igl0LeHFTGfrsK0nIrDnULl/b84EpFWB0RbAAFB9vSwWffw5Vq9pEMGCAG8cUOCElNYVfti2i\nVVRfbnmyDIve2EnZ4mW9F5BSAcDnp4JwVmGaCsLdqle3sz3s3Ws778yebZcSfvxxOwWFNxQNLkp0\n456EPvIkb/1eiTeWvOGdQJQKAH4zFYRTQWgJoMASEuy8cJ99BpUq2VLBwIF20XpPB5LaLop/NEmm\nz+fLuLHKjR4OQKnAoVVAKovUVPjhB9tWEBtrE8HLL9slBTzmwAGOd2zFzMZFGDJ7H0FB7pgKVSlV\naKqAlGsEB0P37jBjBmzcCEeO2Ol/xoxxw2ykuYmIoMzqDbT5PZntA2+FtDQP3VgplRc+kwC0DcD1\nqle33UcXLoTvv4emTW17gScKW0GVKnN+0TyO/7qcC/cMgJQUdvy5g+cWPkejjxtR76N61P1PXer8\npw4zts5wf0BKFSLaBqDyRMR2I33+eTvjw3vv2fXm3e2ZGY8y+B/fk4IwqL9hUKu/MqDxAEJDQgky\nQSzbt4zx68ez7MFl7g9GqUJG2wBUnly6ZEsFMTHQtatdXz6HGaJd5vj54/x95mP844v9RJwtQtDs\nOVCmzOXjF1MvUvX9qqx9ZK0uWq9UHmkbgMqTIkXsZHM7dtgP/o4d7cji9evdc79yxcsxccAUIucs\nI6jR9dClCxw9evl4SHAIdze6mym/T3FPAEqpXGkCCFClS9tv/3v2QNu2duaHXr3sojVuERxsZ7rr\n2tXecM6cy40Rg5sMZvLvk+2sol9/rctMKuUhWgWkALvK4xdfwMiRdnbSF16wvYlyWEmy4ObNs0ui\nhYfD+++TlpbK7Ic60HNfMYq07wjLl0NEBNx/v52dVCmVI20DUC6VkmKXE/7gAzh7FoYOhQcecMM0\nEykpdtTaiBFQpAhzetbjt14tGH77+7ahIi4Obr/d1k1FRLj45koVDoWmDUC7gfqGokXhvvvsusWf\nf24Hk0VG2i/ie/a4+Ebpawrv3Uv1Nz9kwp7v7PTgRYpA+/Zw55128XmlVBZ+0Q3UGFMLeBUoIyL9\nr3KelgB82L59dpbn8eOhd287/1DNmq69h4jQeExjPr/9c9pFtLM7f/gBXn3VTlGtlLqCT5cARGSv\niDzsznso94uMtEtW7tpla2NatID/9/8gMdF19zDGcE+Te/h649cZO2++2Waf3btddyOl1GVOJQBj\nzDhjTJIxZmO2/d2NMduMMTuMMcPcE6LyFeXKwZtvwrZtUKKEXUXyhRdc12nnrkZ3MXfn3IwdRYpA\n375aDaSUmzhbApgAdMu8wxgTBIx27G8MDDLGNHQcG2KMGWWMqZp+uoviVT6gYkU7knjTJtt7qEkT\nu3bx0qUFm2ai4XUNOZtylv0n9mfsHDgQpugYAaXcwakEICLLgeRsu1sDO0Vkn4ikAFOAOxznTxKR\nZ4ELxphPgBu1hFD4hIfDRx/ZdtzoaHjsMTvf0Kefwrlzeb+eMYZOkZ34ed/PGTs7dLADx7Y6tbqo\nUioPCtIGEA4cyPQ63rHvMhE5JiKPi0g9EXm7APdSPqxMGdsmsGULfPghzJplxxL83//BsWN5u9YV\nCSAoyA5VnjrVtUErpSji7QDSZe7SpIvD+ydj7EwPXbrYZPDee1C3Ltx7r00Qzsw51CmyE2PWjMm6\n85574Lbb4ORJlkRVJa7KJV7q+LJ7/gilfFj6YvCu4nQ3UGNMJDBbRJo6XrcFYkSku+P1S4Dk55u+\ndgMtvA4etF1Ix42zbQWPP27HdxXJ5atHaloqYe+Esf3J7VQuVTnjwLZtMHkySZ+OYnPTqtyyaKdn\n/gClfJgnu4EasjbmrgHqGmMijTEhwEBgVn4D0YFghVO1avDWW7B/Pzz0kK0iatzYrmeck+CgYDrU\n6MCy/dmmh27YkLQRMbR/ojitVuyDAwdyvoBSAcCjA8GMMZOBaCAMSAKGi8gEY0wP4ENsIhknIiPz\nFYSWAALKmDF2zqFFi6BhwyuPv/PLO8SfjOc/Pf6TZf/GpI00G9uM71ZFclfju20dk1IBzCMlABEZ\nLCLVRKSYiNQQkQmO/fNFpIGjkTdfH/4q8DzxhG0gvvlmWLfuyuNXNAQ7/LjnRxpd14hvbqlkhyWf\nOOGBaJUqvHQuIOUV990Ho0dDt262m/+lSxnHmldtzu7k3SSfy9rz+Mc9P3J7g9vZWzYNevSA//7X\nw1Er5Rv8Yi4gp4PQKqCAtXSpne7nwAF48kl48EEIC4NbJ3Xl6bZP06t+L8CuHHbdO9cxd/BcHp3z\nKFvaT7aLGOzdCyEhXv4rlPIOn54LSKlr6dzZTv8/fTps2GAnmStVCtZ+34ln//3z5QFlcfFx1Aur\nR0TZCM6mnIUbb4RmzWwxQimVLz6TALQKKLC1agVffQWnT0NSEnz0fGcOl17EM8+nALB472K61upK\nyaIlbQIA26Xon//UHkEq4GgVkCrULqZepPdXdxL762FGtf+ab87+lTc6v0G7iHZUea8Kp185bU+M\nibGTEn33nVfjVcobtApIFUohwSEsuG8Of+/4IEPXt2Nd4no61OhAiSIlOJtylstfGF56CTZuhLlz\nr35BpdQVNAEon2WM4d3+T/B0meWUXz2K+bNKkpYaTEhwCBdSL9iTihe3vYH+9jcXL1mmVOGnVUDK\n56Wl2a6iY8faRWlOPFaB/c/vIqxkhYyTPvnELmS8YgVcd533glXKg3RReBVQNm2C5l9V597zq/h8\nVHWCgzMdfOUVWLLE9i3VrqEqAGgbgAooTZpAZLWSbNt9lr59s6078NZbULIkTJzotfiU8ic+kwC0\nG6hyVqliJfnPJ2cpUcKuRJaS4jhgjF2z8q23Mu1UqvDxm26gxpg7gJ5AaWC8iPyQwzlaBaSc1m5c\nO9677T1aVWnHXXfZBWkmTbJrxwDQtSsMGmSnH81u5Ei7buXLup6A8n8+XwUkIjNF5BHgcaC/u++n\nCr/0wWBFi9r14uPj7dxCR444Thg+POdSgAh8+SX8/rvHY1bKFzmdAIwx44wxScaYjdn2dzfGbDPG\n7LjGur+vAR/nN1Cl0mUeDVyiBMyebecPatTI8QW/Q0eoUQNmzsz6xk2bYPt2uziBUipPJYAJQLfM\nO4wxQcBox/7GwCBjTEPHsSHGmFHGmGrGmJHAPBFZ76K4VQDLMh0Etgro3/+GVavgiy9gwQKgVy/b\nGyizadPgrrt06gilHJxOACKyHEjOtrs1sFNE9olICjAFuMNx/iQReRboC3QB7jbGPOKasFUgy54A\n0tWtawcGf/AB0L69nWUunYhNAM88A4mJkJrquYCV8lEFbQMIBzJ/nYp37LtMRD4SkVYi8oSIfFrA\n+ymVawIA2/a7aRNsKd4cdu6EkyftgQ0b7KID7dpBhQpw6JAHI1bKN+WyNLfnZe7SFB0dTXR0tNdi\nUb7tagmgWDG78PwHY4rxWYsWtl7otttg8mTo3992FY2IsNVA4eE5XkMpXxUbG+vS7vIFTQAJQI1M\nr6s79uWZK/q0qsBwtQQA8Nhj0KABfPhAB0KXL7drT06cCOn/cCIibENw27aeCVgpF8n+5XjEiBEF\nul5eq4CMY0u3BqhrjIk0xoQAA4FZ+QlEB4IpZ10rAVSqBH36wIJTHeCXX2DePNtAkL4CfY0a2hCs\n/JqrBoLlpRvoZGAFUN8Ys98Y86CIpAJDgUXAZmCKiGzNTyAxMTFa7aOccq0EAHZcwIdxUbB6tZ0t\n9K9/zTiYXgWklJ+Kjo52SQJwugpIRAbnsn8+ML/AkSjlJGcSQOfO8MfxcpyvWoviP/8MU6dmHKxR\nI2sPIaUClM4FpPyOMwkgKMj2CFpXuhMMGAClS2cc1BKA8nN+MxeQU0HoXEAqD2Ztn8Xnaz9n1qCr\nNzdt3AgDep5m89YggkqVzDiQmGgXlU9KcnOkSrmXz88FpJSrOVMCAGjaFIqWL8Wy30pmPVC5Mhw/\nDufPuylCpfyDJgDld5xNAADPPWdrgL7+2g4GBmz9UHi4nUVOqQDmMwlA2wCUs/KSAO6/304W9847\n8OSTmQ5oO4DyY9oGoALWjj930GtyL3YM3eH0e06dgubN4R//gIEDgSFD7LoB99/vvkCVcrOCtgH4\nzFQQSjkrLyWAdKVL256g3bpBixZQr2FDXRdABTyfqQJSyln5SQBgSwD/+hdERcG3B9qStnKVG6JT\nyn9oAlB+J78JAODhh+3sEFP3tubcinWM/c9F7QykApYmAOV3igUX42LqRVLT8jenf4MGMH1haUzt\n2uyYvoHatWHUKDhzxsWBKuXjfCYBaC8g5SxjDCWLluTcpXMFuk7JLlGMunsl8+bZWaNr1YKYGNiz\nxzVxKuUuftELyLE85FNAGPCTiIzN5TztBaTypNK7lfj9id+pFFop/xf54gtYtMiuFQBs3QpjxtjG\n4vr1bUeDNk8wAAAVOElEQVSh/v2hfHnXxKyUq/n0SGAR2SYijwMDgHbuvJcKLAVpB7gsKgpWrrS/\nb91Ko9Nr+OjVQyQkwLBhsHgx1Kxpe4u+9hps3lzgsJXyKU51AzXGjAN6AUki0jTT/u7Ah9hEMk5E\n3s7hvb2Bx4BJLolYKVyUAOrVgxMn7Cf8tm0QGgq1a1N0/nx694beve2MEStW2PXlu3Wzp3TsaLdO\nnWyCMPn+/qWUdzlbApgAdMu8wxgTBIx27G8MDHJU+WCMGWKMGWWMqSois0WkJ3CvC+NWAc4lCSAo\nyA4P/stfbMX/hAk2IWRSrpw9/PbbsG+fXVf+xhvtGjPt2tkBxYMG2aqjTZsgLa1gISnlSU6VAERk\nuTEmMtvu1sBOEdkHYIyZAtwBbBORScAkY0xnY8xLQDFgrgvjVgHOJQkA4M03M34PDYXTp3M9NTgY\nmjWz25NP2rmFdu+GZcvs9sEHcOwYtG+fUUpo0QKKFi14mEq5Q0FGAocDmSdTiccmhctEZCmwtAD3\nUCpHLksAmZUqlae+oMbYlSbr1oUHH7T7EhMzEsJjj9kE0aqVTQZt2kDLlnbJSqV8gc9MBZG5S1P2\nhY+Vys5tCeAqJQBnVK1qew71729fp7chLFtmxxr89huUKWMTQcuWNjm0aKE9jZRzYmNjXdpd3ulu\noI4qoNnpjcDGmLZAjIh0d7x+CZCcGoKduLZ2A1V5cu+Me+letzv3NnVh09Lp03atADeOCEuvNlqz\nBn791f5ct87e9sYbbfVS+s+ICG1gVlfnycngjGNLtwao60gMicBAYFB+A0lfFF6/+StnuKUEULKk\nXSQmLc02ELtB5mqjQY5/LampsH07bNhgt48/tj8vXMhoc2jZEtq2hTp1NCko15UEnCoBGGMmA9HY\nAV1JwHARmWCM6UHWbqAj8xWElgBUHj294GlqlqvJ022fdu2FS5WCQ4fsTy9LSrKJYP16W1KIi4Oz\nZ21bQvPmtqRw0012BLMmhcBU0BKArgeg/NIri1+hVEgpXun4imsvXLmy/dStUsW113WRhARYvdpW\nG6Vvp0/bZJCeEG66CRo10t5HgaDQrAegVUAqL9xSBQR57gnkaeHhcOeddkt35IgtJaxfDwsXwsiR\ndsxCo0Zwww32Z+PG0KQJREZqaaEw8GgVkLtpCUDl1aiVo4g/Gc+obqNce+FmzWDiRPvTj505Ywem\nbdlit82bbcHm/HlbfdSiRUZjc/36UMRnvgqqvCg0JQCl8sJtJYBrDAbzF6GhttG4bdus+w8dstVG\nv/0G330Hw4dDfLwtJaQ3ODdtan9WqOCd2JXnaAJQfilQq4AKqkoV6NHDbulOn7arY27caEsJ335r\nfy9bNiMZNG1qNy0tFC4+8yi1DUDlhVsTQCEoAeRFqVJXlhbS0mw7QnrX1GnT4PXXbSN0/fq2PaFJ\nE9vG0KwZVKumbQuepG0AKqDN2zmP0atHM++eea698JAhcOutcN99rr1uIXHmjF03YdMmu23caLfU\nVJsI0hNDkya24dkHetMWatoGoAKSVgF5R2hoxjQWmR06ZEsKmzbB8uXwySc2UVSpYksJ6aWFJk1s\nCSIkxDvxq6w0ASi/pFVAvqVKFbt1yzRpfGqqnfZi0ybbxvDdd3bJzf377Ujo9FJC48Z2srywMK+F\nH7A0ASi/pL2AfF9wsP22X78+9O2bsf/cOVs6+P13u40bB9ddBx06eC/WQKUJQPklt5YAEhNdf111\nWYkSdixC8+bejkS5dU1gpdxF2wCUKjifSQAxMTEunedaFW5aBaQCWWxsbJY1VPLL7d1AjTElsauC\nDReRHPvsaTdQlVcpqSmUeKsEKa+nYFzZAf377+HLL+F//3PdNZVyk4J2A/VECWAYMNUD91EBpGhw\nUYJMEClpKa69sFYBqQDiVAIwxowzxiQZYzZm29/dGLPNGLPDGDMsh/d1BbYAR8i6mIxSBeaWaiCt\nAlIBxNleQBOAj4CJ6TuMMUHAaKALcBBYY4yZKSLbjDFDgOZAGeAE0Bg4C8x1YewqwKUngHLFy7nu\nojoOQAUQpxKAiCx3LP2YWWtgp4jsAzDGTAHuALaJyCRgUvqJxpj7gKOuCVkpy20Lw2sVkAoQBRkH\nEA4cyPQ6HpsUriAiE3Par1RBaBWQUgXjMwPBMndp0llBlTNCQ0I5deGUay+qVUDKh7lqFtB0TncD\ndVQBzRaRpo7XbYEYEenueP0SICLydp6D0G6gKh/unnY3/a7vx4AbBrjuomlpdjHdixftXAZK+TBP\ndgM1ZO3Jswaoa4yJNMaEAAOBWfkNRAeCqbyqXb42e5L3uPaiQUF2roKzbhhkppSLeHQgmDFmMhAN\nhAFJ2EFdE4wxPYAPsYlknIiMzFcQWgJQ+TD217GsTVzLp70/de2Fq1Sx6yZWrera6yrlYh5ZD0BE\nBueyfz4wP783z0xXBFN5VatcLaZvme76C2tPIOXjdEUwFfB2/rmTbl91Y89TLq4GatbMTgdx442u\nva5SLuYPU0Eo5RY1ytYg4VQCl9IuufbC2hNIBQhNAMpvFStSjMqhlTlw4sC1T84LrQJSAcJnEoD2\nAlL54ZaeQDoYTPk4v5kO2qkgtA1A5dODMx+kfUR7Hm7+sOsu+uKLkJRk2wGU8mHaBqACWu1ybigB\nvPEGrF4NX3zh2usq5WM0ASi/Vrt8bfYe3+vai5YqBdOnwwsvwIIFrr22Uj5EE4Dya7XK13J9CQCg\ncWOYNQvuvx+m6npGqnDSBKD8mlsagdNFRcGiRTBsGLzyCmg7lSpkNAEov1Y5tDJnU866flbQdM2a\nwZo18OOP8PLL7rmHUl7iMwlAu4Gq/DDGULNcTde3A2RWsSLMn2+rhF56CVJT3XcvpZzgF91AjTGd\ngX8Am4FvROTnXM7TbqAq33p/05uHbnqIPg37uPdGhw9D//52ttDJk6F8effeT6lr8PVuoAKcAoph\nVwxTyuVql6vN3mQ3lgDSVaoEP/wADRtCq1bwyy/uv6dSbuRUAjDGjDPGJBljNmbb390Ys80Ys8MY\nMyz7+0TkZxHpCbwEvOmakJXKym09gXJStCh88AG8/TYMGAC9esHXX2u1kPJLzpYAJgDdMu8wxgQB\nox37GwODjDENHceGGGNGGWPSJ1Q/DoS4JmSlsmp4XUNi98Vy/tJ5z920b1/YuhUGD4axY+3Mof/+\nNxw96rkYlCqggi4JOVxEejheX7EkpDHmTmyCKAt8om0Ayh1EhIHfDSQkOISJfSZiTL6rRPMbgK0a\n+uormDMHOnWC+vVtUujTB0qW9Gw8KmB4sw0gHMg8DWO8Y99lIvK9iDwmIoNy+/BXqqCMMUy4YwJb\nj2zlnV/e8UYAcNttMHEibN4M99wD5crZqqEqVSA6GsaP12Umlc9xakUwT8jcpUlXBlN5VbJoSWYO\nnEnUuCgupV3ilY6veL4kAHYZyX79Ml4nJ8OyZfDZZ/D889Chgy0V9O0LZct6Pj7l11y1Eli6glYB\nxYhId8frK6qAnA5Cq4CUixw8dZA7p95JZNlIJtwxgdCQUG+HlCExEWJj4dtv7cCyevVsNVGnTnDz\nzVCjhrcjVH7Gk1VAxrGlWwPUNcZEGmNCgIHArPwGogPBlCtUK12NpQ8sJTQklBaftmBt4lpvh5Sh\nalUYNAhmzLDJ4OOPoUULmDvX/qxbFx55BL75Bg4d8na0yod5dCCYMWYyEA2EAUnYxt8JxpgewIfY\nRDJOREbmKwgtASg3+GbTN/x9wd/pWrsrDcIaUK9CPeqF1aNJpSaUKFrC2+FllZZm2w9++gmWLIGl\nS6F0aWjeHG66yW7Nm0N4uG1zUIqClwB0QRhVqMWfjGfxnsXsOraLncd2suPPHRw6fYhXO77K31r8\njZBgH+2dnJYGe/fC2rWwbl3Gz7S0K5NCnToQ5DOzuigPKjQJYPjw4dr4qzxibeJaXv3pVbYf3c6I\n6BEMbjKY4KBgb4d1bSK26ig9GaQnhmPHbLfT+vVtu0Lm38uV83bUyg3SG4NHjBhROBKAL8ShAsvP\n+37m5cUvc/LCSUZEj6BnvZ4UK1LM22HlXXIy7Nhht507s/4eGgrXXw+NGtmf119v2xrCw7XUUAgU\nmhKAL8ShAo+IMHfnXP61/F9sStpE19pdGdp6KNE1o73TjdSVRCAhAbZssdvWrfbn7t221FCjBkRE\n2K169Yzf07eyZbW9wcdpAlDKRZLPJTNt8zQ+jPuQ4kWK81Sbp+h3fT/f6krqKmfPwr59cOCA3eLj\nM35P3yBrQsgpSZQq5d2/I8AVmgSgbQDKV6RJGgt3LWT0mtH8sv8Xbql1C1HVo6hRtgZNKjeh0XWN\n/L90cC0icPLklUkhe7IICbGjnStXtj8zb5Uq2f2VKtmteHFv/1WFhrYBKOUBSaeTWLx3MasTVpNw\nKoHfDv7G2ZSzRNeM5pZat3BzzZupW6Fu4U8IORGB48chKcmOW0jfkpJsY/XhwxlbUhIUK5aRDLJv\nt98ONWt6+y/yO4WmBOALcSjljD+O/8GSvUtY8scSftr7E8YYbq558+WEEFku0tsh+p70EkV6Mjhy\nJGuCeOghOypa5YkmAKW8SETYdWwXP+39iSV/2KQQWjSUW2rdQvuI9tQPq0/Lai39s3eR8nmaAJTy\nISLCliNb+GnvT8QlxLHt6Da2/7mdqOpRdKnVha61u3JT1ZsIMtoFUxWcJgClfFzyuWSW7lvK4j2L\n+XHvjxw7d4xudbrRKbITHWp0oEFYg8BsQ1AFVmgSgPYCUoHij+N/sGDXAn458AtL/1hK0eCi9KzX\nk441OtIuoh3hZcKvfREV0PyiF5CxX2v+AZQB1ojIpFzO0xKACkgiwqbDm5i/cz4r4lew4sAKShQp\nQVREFFHVo2hVrRU3Vb2JkkV1VTF1JZ8uARhj+gB9gKPAXBFZkst5mgCUIqNReVX8KlbGr2TNwTVs\nObKF+mH1aV2tNW2qt6FzZGfqVKjj7VCVD/BIAjDGjAN6AUnpC8I49ncn63TQb2d73zDgmIh8Zoz5\nVkT6kQNNAErl7vyl82w4tIHVCatZlbCKxXsWU7pYabrX6U63ut3oHNmZ0sVKeztM5QWeSgAdgNPA\nxEwrggUBO4AuwEHsAjEDRWSbMWYIcBOwDjgnItONMVNEZGAu19cEoJST0iSNjUkbWbhrIQt2L2B1\nwmrqVqhLVPUo2oS3oU31NjS8rqH2NAoAHqsCymVJyOEi0sPx+oolIY0xJYCPgDPANhH5JJdrawJQ\nKp8upl5k/aH1rDywkriEOOIS4vjz7J+0rNaSNuFtaB3emiaVm1CzXE1NCoVMQRNAQRaFDwcOZHod\nD7TOfIKInAMeLsA9lFLXEBIcQuvw1rQOz/jnd+TMEVYnrCYuIY6xv43l98O/c/z8cVpVa0XHGh1p\nW70t11e8noiyEZoUAlhBEoBLZV7fUruDKlUwFUMr0rN+T3rW73l5X/K5ZFbFr2LZ/mW8v/J9th7d\nyonzJ2h4XUOaVG5Cy6otaR3emhur3EjR4KJejF7lJr37p6sUtAooRkS6O15fUQXkdBBaBaSUVxw/\nf5xtR7ex4dAGfj34K3EJcexJ3kPTyk1pWa3l5a1BWAP/WDUtwHiyDaAmNgE0cbwOBrZjG4ETgdXA\nIBHZmucgdCCYUj7j5IWTrE1cy68Hf728HTp9iOZVm9Muoh3tItoRVT2KiqEVvR1qwPLoQDBjzGQg\nGggDkrCNvxOMMT3I2g10ZL6C0BKAUj7t+PnjrElYw8r4law4sIJV8asoFVKKm6reRIeIDnSK7ETz\nqs110jsP8+mBYE4HoQlAKb+SJmnsP7GfXw/+yrJ9y/h5/8/s+HMHTSo1udwVtW31ttQqV0vnOXKj\nQpMAtApIKf92+uJpfjv42+WuqHHxcVxIvWATgiMptA5vTbni5bwdqt/zi7mAnA5CSwBKFUrxJ+OJ\ni4+7nBTWJq6lepnqtA5vTbPKzWhWuRktqrXQpJBPhaYE4AtxKKXc61LaJTYf3szqhNVsOryJdYfW\nsS5xHdP6TeMv9f7i7fD8jiYApZRfu5R2iTRJIyQ4xNuh+B1vjgR2qZiYGG0DUCoAFQnymY8hv+Gq\nAWFaAlBKKT9V0BKATgKilFIBShOAUkoFKE0ASikVoDQBKKVUgNIEoJRSAcpnEkBMTIxL57lWSqnC\nKjY2NssaKvnl1m6gjrWE78GON2gkIh1yOU+7gSqlVB75dDdQEVkuIo8Dc4Av3Xkv5T1acvNf+uwC\nm1MJwBgzzhiTZIzZmG1/d2PMNmPMDmPMsKtcYjAwuSCBKt+lHyL+S59dYHO2BDAB6JZ5hzEmCBjt\n2N8YGGSMaeg4NsQYM8oYU9UYEwEcF5EzLozbLVz5jyG/18rL+5w592rn5OeYr35guDouX3h++T3u\nb88OAu/f3tWOe/L5OZUARGQ5kJxtd2tgp4jsE5EUYApwh+P8SSLyrIgkAg9hE4jPC7T/CTUBuP56\nmgDyJ9D+7V3tuCefX0EWhe8LdBORRxyv7wVai8jf8xyEMdoCrJRS+eD3s4EW5A9QSimVPwXpBZQA\n1Mj0urpjn1JKKT+QlwRgHFu6NUBdY0ykMSYEGAjMcmVwSiml3MfZbqCTgRVAfWPMfmPMgyKSCgwF\nFgGbgSkistV9oSqllHIln1gQRimllOf5RCNwdsaYksAY4AKwVER0EJkfMcbUAl4FyohIf2/Ho/LG\nGHMH0BMoDYwXkR+8HJJykmMs1lNAGPCTiIy96vm+WAJwdClNFpG5xpgpIjLQ2zGpvDPGTNME4L+M\nMeWAd0Xkb96OReWNMcYAX4rIfVc7zyOzgeZjKonqwAHH76meiFHlzgVTgSgvKsDzew342DNRqpzk\n59kZY3pj51+bd63re2o66DxNJYH98K+efqqHYlS5y+vzu3yaZ8JT15Dn52eMGQnME5H1ngxUXSHP\nz05EZotIT+Dea13cIwkgr1NJAN8DdxtjPgZmeyJGlbu8Pj9jTAVjzCfAjVoy8L58PL+hQBfsv8FH\nPBqsyiIfz66zMebfxpixwNxrXd+bjcDhZFTzAMRj/zBE5CzwV28EpZx2ted3DHjcG0Epp13t+X0E\nfOSNoJRTrvbslgJLnb2Qz6wIppRSyrO8mQB0Kgn/ps/Pv+nz818ue3aeTAA6lYR/0+fn3/T5+S+3\nPTtPdQPVqST8mD4//6bPz3+5+9n55EAwpZRS7qeNwEopFaA0ASilVIDSBKCUUgFKE4BSSgUoTQBK\nKRWgNAEopVSA0gSglFIBShOAUkoFKE0ASikVoP4/h+EsQmsukhoAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.loglog(rieamannian_model.logger.loss_hist['train']['logistic'])\n", + "plt.loglog(rieamannian_model_1600.logger.loss_hist['train']['logistic'])\n", + "plt.loglog(rieamannian_model_800.logger.loss_hist['train']['logistic'])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.00033300869655848692" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 140.0, 'riemannian-sgd', max_iter=200, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.0004941606919187378" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 120.0, 'riemannian-sgd', max_iter=200, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.00069424199467138167" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 100.0, 'riemannian-sgd', max_iter=200, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.0011217952114711302" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 80.0, 'riemannian-sgd', max_iter=200, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.001236212271499575" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 60.0, 'riemannian-sgd', max_iter=200, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.0025096523867232153" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 40.0, 'riemannian-sgd', max_iter=200, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.0043267280526794877" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 20.0, 'riemannian-sgd', max_iter=200, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.009119125359184365" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 10.0, 'riemannian-sgd', max_iter=200, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.016789322716112491" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 5.0, 'riemannian-sgd', max_iter=200, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.034886521963542333" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 2.0, 'riemannian-sgd', max_iter=200, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "rieamannian_model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "nan" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "model = TTRegression('all-subsets', 'logistic', 4, 0.08, 'sgd', max_iter=1000, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.10923394645550188" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "model = TTRegression('all-subsets', 'logistic', 4, 0.04, 'sgd', max_iter=1000, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.039985891406132693" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "model = TTRegression('all-subsets', 'logistic', 4, 0.02, 'sgd', max_iter=1000, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.070527546289762322" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "model = TTRegression('all-subsets', 'logistic', 4, 0.01, 'sgd', max_iter=1000, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.048679468688613017" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# To use the same order of looping through objects for all runs.\n", + "model = TTRegression('all-subsets', 'logistic', 4, 0.005, 'sgd', max_iter=1000, verbose=1,\n", + " batch_size=500, fit_intercept=False, reg=0.)\n", + "model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "model.logger.loss_hist['train']['logistic'][-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "plain_sgd = {}\n", + "riemannian_sgd = {}\n", + "\n", + "for batch_size in [-1, 100, 500]:\n", + " # To use the same order of looping through objects for all runs.\n", + " np.random.seed(0)\n", + " model = TTRegression('all-subsets', 'logistic', 4, 0.01, 'sgd', max_iter=10000, verbose=1,\n", + " fit_intercept=False, batch_size=batch_size, reg=0.)\n", + " model.fit_log_val(X_train, y_train, X_val, y_val)\n", + " plain_sgd[batch_size] = model\n", + "\n", + " np.random.seed(0)\n", + " # To use the same order of looping through objects for all runs.\n", + " rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 400, 'riemannian-sgd', max_iter=800, verbose=1,\n", + " batch_size=batch_size, fit_intercept=False, reg=0.)\n", + " rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + " riemannian_sgd[batch_size] = rieamannian_model" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "with open('data/riemannian_vs_baseline_hiv_400_001.pickle', 'wb') as f:\n", + " obj = {'plain_sgd': plain_sgd, 'riemannian_sgd': riemannian_sgd,\n", + "# 'plain_sgd_rand': plain_sgd_rand, 'riemannian_sgd_rand': riemannian_sgd_rand,\n", + "# 'plain_sgd_smart_rand': plain_sgd_smart_rand, 'riemannian_sgd_smart_rand': riemannian_sgd_smart_rand,\n", + " 'X_train': X_train, 'y_train': y_train, 'X_val': X_val, 'y_val': y_val}\n", + " pickle.dump(obj, f, protocol=pickle.HIGHEST_PROTOCOL)" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# plain_sgd = {}\n", + "riemannian_sgd = {}\n", + "\n", + "for batch_size in [-1, 100, 500]:\n", + " # To use the same order of looping through objects for all runs.\n", + "# np.random.seed(0)\n", + "# model = TTRegression('all-subsets', 'logistic', 4, 0.01, 'sgd', max_iter=10000, verbose=1,\n", + "# fit_intercept=False, batch_size=batch_size, reg=0.)\n", + "# model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "# plain_sgd[batch_size] = model\n", + "\n", + " np.random.seed(0)\n", + " # To use the same order of looping through objects for all runs.\n", + " rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 800, 'riemannian-sgd', max_iter=800, verbose=1,\n", + " batch_size=batch_size, fit_intercept=False, reg=0.)\n", + " rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + " riemannian_sgd[batch_size] = rieamannian_model" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "with open('data/riemannian_vs_baseline_hiv_800_001.pickle', 'wb') as f:\n", + " obj = {'plain_sgd': plain_sgd, 'riemannian_sgd': riemannian_sgd,\n", + "# 'plain_sgd_rand': plain_sgd_rand, 'riemannian_sgd_rand': riemannian_sgd_rand,\n", + "# 'plain_sgd_smart_rand': plain_sgd_smart_rand, 'riemannian_sgd_smart_rand': riemannian_sgd_smart_rand,\n", + " 'X_train': X_train, 'y_train': y_train, 'X_val': X_val, 'y_val': y_val}\n", + " pickle.dump(obj, f, protocol=pickle.HIGHEST_PROTOCOL)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# plain_sgd = {}\n", + "riemannian_sgd = {}\n", + "\n", + "for batch_size in [-1, 100, 500]:\n", + " # To use the same order of looping through objects for all runs.\n", + "# np.random.seed(0)\n", + "# model = TTRegression('all-subsets', 'logistic', 4, 0.01, 'sgd', max_iter=10000, verbose=1,\n", + "# fit_intercept=False, batch_size=batch_size, reg=0.)\n", + "# model.fit_log_val(X_train, y_train, X_val, y_val)\n", + "# plain_sgd[batch_size] = model\n", + "\n", + " np.random.seed(0)\n", + " # To use the same order of looping through objects for all runs.\n", + " rieamannian_model = TTRegression('all-subsets', 'logistic', 4, 200, 'riemannian-sgd', max_iter=800, verbose=1,\n", + " batch_size=batch_size, fit_intercept=False, reg=0.)\n", + " rieamannian_model.fit_log_val(X_train, y_train, X_val, y_val)\n", + " riemannian_sgd[batch_size] = rieamannian_model" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "with open('data/riemannian_vs_baseline_hiv_200_001.pickle', 'wb') as f:\n", + " obj = {'plain_sgd': plain_sgd, 'riemannian_sgd': riemannian_sgd,\n", + "# 'plain_sgd_rand': plain_sgd_rand, 'riemannian_sgd_rand': riemannian_sgd_rand,\n", + "# 'plain_sgd_smart_rand': plain_sgd_smart_rand, 'riemannian_sgd_smart_rand': riemannian_sgd_smart_rand,\n", + " 'X_train': X_train, 'y_train': y_train, 'X_val': X_val, 'y_val': y_val}\n", + " pickle.dump(obj, f, protocol=pickle.HIGHEST_PROTOCOL)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Train from random init" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "np.random.seed(0)\n", + "w_init = tt.rand(2 * np.ones(X.shape[1]), r=4)\n", + "# Divide by norm to make sure the norm is reasonable,\n", + "# round to make all the ranks are valid.\n", + "w_init = ((1 / w_init.norm()) * w_init).round(eps=0)\n", + "\n", + "plain_sgd_rand = {}\n", + "riemannian_sgd_rand = {}\n", + "\n", + "batch_size = -1\n", + "# # To use the same order of looping through objects for all runs.\n", + "# np.random.seed(0)\n", + "# model_rand = TTRegression('all-subsets', 'logistic', 4, 'sgd', max_iter=5000, verbose=1,\n", + "# fit_intercept=False, batch_size=batch_size, reg=0., coef0=w_init)\n", + "# model_rand.fit_log_val(X_train, y_train, X_val, y_val)\n", + "# plain_sgd_rand[batch_size] = model_rand\n", + "\n", + "# To use the same order of looping through objects for all runs.\n", + "np.random.seed(0)\n", + "riemannian_model_rand = TTRegression('all-subsets', 'logistic', 4, 800, 'riemannian-sgd', max_iter=1600, verbose=1,\n", + " batch_size=batch_size, fit_intercept=False, reg=0., coef0=w_init)\n", + "riemannian_model_rand.fit_log_val(X_train, y_train, X_val, y_val)\n", + "riemannian_sgd_rand[batch_size] = riemannian_model_rand" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Random init with beter distribution" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from src.models.all_subsets import tensorize_linear_init\n", + "w_init = tensorize_linear_init(np.random.rand(X.shape[1]), np.random.rand())\n", + "for _ in range(2):\n", + " w_init = w_init + 0 * tt.ones(2, X.shape[1])\n", + "w_init = w_init.round(eps=0)\n", + "\n", + "plain_sgd_smart_rand = {}\n", + "riemannian_sgd_smart_rand = {}\n", + "\n", + "batch_size = -1\n", + "# # To use the same order of looping through objects for all runs.\n", + "# np.random.seed(0)\n", + "# model_rand = TTRegression('all-subsets', 'logistic', 4, 'sgd', max_iter=5000, verbose=1,\n", + "# fit_intercept=False, batch_size=batch_size, reg=0., coef0=w_init)\n", + "# model_rand.fit_log_val(X_train, y_train, X_val, y_val)\n", + "# plain_sgd_smart_rand[batch_size] = model_rand\n", + "\n", + "# To use the same order of looping through objects for all runs.\n", + "np.random.seed(0)\n", + "riemannian_model_rand = TTRegression('all-subsets', 'logistic', 4, 800, 'riemannian-sgd', max_iter=1600, verbose=1,\n", + " batch_size=batch_size, fit_intercept=False, reg=0., coef0=w_init)\n", + "riemannian_model_rand.fit_log_val(X_train, y_train, X_val, y_val)\n", + "riemannian_sgd_smart_rand[batch_size] = riemannian_model_rand" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Save" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "with open('data/riemannian_vs_baseline_hiv_800_001.pickle', 'rb') as f:\n", + " logs = pickle.load(f)\n", + "plain_sgd = logs['plain_sgd']\n", + "riemannian_sgd = logs['riemannian_sgd']\n", + "\n", + "with open('data/riemannian_vs_baseline_hiv_800_001_tmp.pickle', 'wb') as f:\n", + " obj = {'plain_sgd': plain_sgd, 'riemannian_sgd': riemannian_sgd,\n", + " 'plain_sgd_rand': plain_sgd_rand, 'riemannian_sgd_rand': riemannian_sgd_rand,\n", + " 'plain_sgd_smart_rand': plain_sgd_smart_rand, 'riemannian_sgd_smart_rand': riemannian_sgd_smart_rand,\n", + " 'X_train': X_train, 'y_train': y_train, 'X_val': X_val, 'y_val': y_val}\n", + " pickle.dump(obj, f, protocol=pickle.HIGHEST_PROTOCOL)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Plot train" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "params = {\n", + " 'axes.labelsize': 8,\n", + " 'font.size': 8,\n", + " 'legend.fontsize': 10,\n", + " 'xtick.labelsize': 10,\n", + " 'ytick.labelsize': 10,\n", + " 'text.usetex': False,\n", + " 'figure.figsize': [4, 3]\n", + " }\n", + "mpl.rcParams.update(params)\n", + "\n", + "\n", + "colors = [(31, 119, 180), (44, 160, 44), (255, 127, 14), (255, 187, 120)]\n", + "# Scale the RGB values to the [0, 1] range, which is the format matplotlib accepts.\n", + "for i in range(len(colors)):\n", + " r, g, b = colors[i]\n", + " colors[i] = (r / 255., g / 255., b / 255.)" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "with open('data/riemannian_vs_baseline_hiv_800_001_tmp.pickle', 'rb') as f:\n", + " logs = pickle.load(f)\n", + "\n", + "fig = plt.figure()\n", + "plt.loglog(logs['plain_sgd'][-1].logger.time_hist,\n", + " logs['plain_sgd'][-1].logger.loss_hist['train']['logistic'], label='Cores GD',\n", + " linewidth=2, color=colors[0])\n", + "plt.loglog(logs['plain_sgd'][100].logger.time_hist, logs['plain_sgd'][100].logger.loss_hist['train']['logistic'],\n", + " label='Cores SGD 100', linewidth=2, color=colors[1])\n", + "plt.loglog(logs['plain_sgd'][500].logger.time_hist, logs['plain_sgd'][500].logger.loss_hist['train']['logistic'],\n", + " label='Cores SGD 500', linewidth=2, color=colors[2])\n", + "\n", + "grid = np.array([0.01, 80, 170]) / 10\n", + "x = logs['riemannian_sgd'][-1].logger.time_hist\n", + "marker_indices = np.searchsorted(x, grid)\n", + "plt.loglog(logs['riemannian_sgd'][-1].logger.time_hist,\n", + " logs['riemannian_sgd'][-1].logger.loss_hist['train']['logistic'],\n", + " marker='o', markevery=marker_indices, label='Riemann GD', linewidth=2, color=colors[0])\n", + "grid = np.array([0.05, 80, 170]) / 10\n", + "x = logs['riemannian_sgd'][100].logger.time_hist\n", + "marker_indices = np.searchsorted(x, grid)\n", + "plt.loglog(logs['riemannian_sgd'][100].logger.time_hist,\n", + " logs['riemannian_sgd'][100].logger.loss_hist['train']['logistic'],\n", + " marker='o', markevery=marker_indices, label='Riemann 100', linewidth=2, color=colors[1])\n", + "grid = np.array([0.1, 70, 200]) / 10\n", + "x = logs['riemannian_sgd'][500].logger.time_hist\n", + "marker_indices = np.searchsorted(x, grid)\n", + "plt.loglog(logs['riemannian_sgd'][500].logger.time_hist,\n", + " logs['riemannian_sgd'][500].logger.loss_hist['train']['logistic'],\n", + " marker='o', markevery=marker_indices, label='Riemann 500', linewidth=2, color=colors[2])\n", + "\n", + "grid = np.array([0.1, 20, 400]) / 3\n", + "x = logs['riemannian_sgd_rand'][-1].logger.time_hist\n", + "marker_indices = np.searchsorted(x, grid)\n", + "plt.loglog(logs['riemannian_sgd_rand'][-1].logger.time_hist,\n", + " logs['riemannian_sgd_rand'][-1].logger.loss_hist['train']['logistic'],\n", + " marker='s', markevery=marker_indices, label='Riemann GD rand init 1', linewidth=2, color=colors[0])\n", + "\n", + "grid = np.array([0.8, 3, 150, 320]) / 3\n", + "x = logs['riemannian_sgd_rand'][-1].logger.time_hist\n", + "marker_indices = np.searchsorted(x, grid)\n", + "plt.loglog(logs['riemannian_sgd_smart_rand'][-1].logger.time_hist,\n", + " logs['riemannian_sgd_smart_rand'][-1].logger.loss_hist['train']['logistic'],\n", + " marker='v', markevery=marker_indices, label='Riemann GD rand init 2', linewidth=2, color=colors[0])\n", + "\n", + "# plt.loglog(plain_sgd_rand[-1].logger.time_hist,\n", + "# plain_sgd_rand[-1].logger.loss_hist['train']['logistic'],\n", + "# marker='v', markevery=marker_indices, label='Cores GD rand init', linewidth=2, color=colors[0])\n", + "\n", + "legend = plt.legend(loc='upper left', bbox_to_anchor=(1, 1.04), frameon=False)\n", + "plt.xlabel('time (s)')\n", + "plt.ylabel('training loss (logistic)')\n", + "plt.minorticks_off()\n", + "ax = plt.gca()\n", + "ax.set_ylim([1e-8, 200])\n", + "ax.set_xlim([0.1, 1000])\n", + "fig.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "fig.savefig('data/riemannian_vs_plain_hiv_train.pdf', bbox_extra_artists=(legend,), bbox_inches='tight')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "# Plot validation" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "with open('data/riemannian_vs_baseline_hiv_800_001_tmp.pickle', 'rb') as f:\n", + " logs = pickle.load(f)\n", + "\n", + "fig = plt.figure()\n", + "plt.loglog(logs['plain_sgd'][-1].logger.time_hist,\n", + " logs['plain_sgd'][-1].logger.loss_hist['valid']['logistic'], label='Cores GD',\n", + " linewidth=2, color=colors[0])\n", + "plt.loglog(logs['plain_sgd'][100].logger.time_hist, logs['plain_sgd'][100].logger.loss_hist['valid']['logistic'],\n", + " label='Cores SGD 100', linewidth=2, color=colors[1])\n", + "plt.loglog(logs['plain_sgd'][500].logger.time_hist, logs['plain_sgd'][500].logger.loss_hist['valid']['logistic'],\n", + " label='Cores SGD 500', linewidth=2, color=colors[2])\n", + "\n", + "grid = np.array([0.01, 80, 170]) / 2\n", + "x = logs['riemannian_sgd'][-1].logger.time_hist\n", + "marker_indices = np.searchsorted(x, grid)\n", + "plt.loglog(logs['riemannian_sgd'][-1].logger.time_hist,\n", + " logs['riemannian_sgd'][-1].logger.loss_hist['valid']['logistic'],\n", + " marker='o', markevery=marker_indices, label='Riemann GD', linewidth=2, color=colors[0])\n", + "grid = np.array([0.05, 80, 170]) / 2\n", + "x = logs['riemannian_sgd'][100].logger.time_hist\n", + "marker_indices = np.searchsorted(x, grid)\n", + "plt.loglog(logs['riemannian_sgd'][100].logger.time_hist,\n", + " logs['riemannian_sgd'][100].logger.loss_hist['valid']['logistic'],\n", + " marker='o', markevery=marker_indices, label='Riemann 100', linewidth=2, color=colors[1])\n", + "grid = np.array([0.1, 70, 200]) / 2\n", + "x = logs['riemannian_sgd'][500].logger.time_hist\n", + "marker_indices = np.searchsorted(x, grid)\n", + "plt.loglog(logs['riemannian_sgd'][500].logger.time_hist,\n", + " logs['riemannian_sgd'][500].logger.loss_hist['valid']['logistic'],\n", + " marker='o', markevery=marker_indices, label='Riemann 500', linewidth=2, color=colors[2])\n", + "\n", + "grid = np.array([0.1, 20, 400]) / 2\n", + "x = logs['riemannian_sgd_rand'][-1].logger.time_hist\n", + "marker_indices = np.searchsorted(x, grid)\n", + "plt.loglog(logs['riemannian_sgd_rand'][-1].logger.time_hist,\n", + " logs['riemannian_sgd_rand'][-1].logger.loss_hist['valid']['logistic'],\n", + " marker='s', markevery=marker_indices, label='Riemann GD rand init 1', linewidth=2, color=colors[0])\n", + "\n", + "grid = np.array([0.8, 3, 150, 320])\n", + "x = logs['riemannian_sgd_rand'][-1].logger.time_hist\n", + "marker_indices = np.searchsorted(x, grid)\n", + "plt.loglog(logs['riemannian_sgd_smart_rand'][-1].logger.time_hist,\n", + " logs['riemannian_sgd_smart_rand'][-1].logger.loss_hist['valid']['logistic'],\n", + " marker='v', markevery=marker_indices, label='Riemann GD rand init 2', linewidth=2, color=colors[0])\n", + "\n", + "# plt.loglog(plain_sgd_rand[-1].logger.time_hist,\n", + "# plain_sgd_rand[-1].logger.loss_hist['valid']['logistic'],\n", + "# marker='v', markevery=marker_indices, label='Cores GD rand init', linewidth=2, color=colors[0])\n", + "\n", + "legend = plt.legend(loc='upper left', bbox_to_anchor=(1, 1.04), frameon=False)\n", + "plt.xlabel('time (s)')\n", + "plt.ylabel('test loss (logistic)')\n", + "plt.minorticks_off()\n", + "ax = plt.gca()\n", + "ax.set_ylim([0.02, 40])\n", + "ax.set_xlim([0.1, 1000])\n", + "fig.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "fig.savefig('data/riemannian_vs_plain_hiv_validation.pdf', bbox_extra_artists=(legend,), bbox_inches='tight')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/experiments/data/riemannian_vs_baseline_car.pickle b/experiments/data/riemannian_vs_baseline_car.pickle index bffc924..99cb763 100644 Binary files a/experiments/data/riemannian_vs_baseline_car.pickle and b/experiments/data/riemannian_vs_baseline_car.pickle differ diff --git a/experiments/data/riemannian_vs_baseline_car_train.pdf b/experiments/data/riemannian_vs_baseline_car_train.pdf new file mode 100644 index 0000000..4077433 Binary files /dev/null and b/experiments/data/riemannian_vs_baseline_car_train.pdf differ diff --git a/experiments/data/riemannian_vs_baseline_car_validation.pdf b/experiments/data/riemannian_vs_baseline_car_validation.pdf new file mode 100644 index 0000000..3fa4c34 Binary files /dev/null and b/experiments/data/riemannian_vs_baseline_car_validation.pdf differ diff --git a/src/TTRegression.py b/src/TTRegression.py index bc03585..6c924e1 100644 --- a/src/TTRegression.py +++ b/src/TTRegression.py @@ -45,7 +45,7 @@ class TTRegression(BaseEstimator, LinearClassifierMixin): Contains all the logged details (e.g. loss on each iteration). """ - def __init__(self, tt_model, loss_name, rank, + def __init__(self, tt_model, loss_name, rank, learning_rate, solver='riemannian-sgd', batch_size=-1, fit_intercept=True, reg=0., exp_reg=1.0, dropout=None, max_iter=100, verbose=0, persuit_init=False, coef0=None, intercept0=None): @@ -55,6 +55,7 @@ def __init__(self, tt_model, loss_name, rank, self.tt_model = tt_model self.loss_name = loss_name self.rank = rank + self.learning_rate = learning_rate self.solver = solver self.batch_size = batch_size self.fit_intercept = fit_intercept @@ -226,16 +227,15 @@ def fit_log_val(self, X_, y_, val_X_=None, val_y_=None): if self.solver == 'riemannian-sgd': from optimizers.riemannian_sgd import riemannian_sgd w, b = riemannian_sgd(X, y, self.tt_dot, self.loss, self.loss_grad, - self.project, w0=self.coef_, - intercept0=self.intercept_, + self.project, self.learning_rate, + w0=self.coef_, intercept0=self.intercept_, fit_intercept=self.fit_intercept, val_x=val_X, val_y=val_y, reg=self.reg, exp_reg=self.exp_reg, dropout=self.dropout, batch_size=self.batch_size, num_passes=self.max_iter, - logger=self.logger, verbose_period=1, - beta=0.5, rho=0.1) + logger=self.logger, verbose_period=1) self.coef_, self.intercept_ = w, b elif self.solver == 'sgd': if self.dropout is not None: @@ -243,14 +243,13 @@ def fit_log_val(self, X_, y_, val_X_=None, val_y_=None): from optimizers.core_sgd import core_sgd w, b = core_sgd(X, y, self.tt_dot, self.loss, self.loss_grad, - self.gradient_wrt_cores, w0=self.coef_, - intercept0=self.intercept_, + self.gradient_wrt_cores, self.learning_rate, + w0=self.coef_, intercept0=self.intercept_, fit_intercept=self.fit_intercept, val_x=val_X, val_y=val_y, reg=self.reg, batch_size=self.batch_size, num_passes=self.max_iter, - logger=self.logger, verbose_period=1, - beta=0.5, rho=0.1) + logger=self.logger, verbose_period=1) self.coef_, self.intercept_ = w, b else: raise ValueError("Only 'riemannian-sgd' and 'sgd' solvers are supported.") diff --git a/src/optimizers/core_sgd.py b/src/optimizers/core_sgd.py index ea66d55..2c77815 100644 --- a/src/optimizers/core_sgd.py +++ b/src/optimizers/core_sgd.py @@ -4,13 +4,14 @@ # TODO: add Adam scheme support. +# TODO: support fit_intercept +# TODO: debug? def core_sgd(train_x, train_y, vectorized_tt_dot_h, loss_h, - loss_grad_h, grad_wrt_cores_h, w0, intercept0=0, + loss_grad_h, grad_wrt_cores_h, learning_rate, w0, intercept0=0, fit_intercept=True, val_x=None, val_y=None, reg=0, batch_size=-1, num_passes=30, seed=None, logger=None, verbose_period=1, - debug=False, - beta=0.5, rho=0.1): + debug=False): """SGD w.r.t. TT-cores optimization for a linear model with weights in TT. The objective function is @@ -54,34 +55,13 @@ def core_sgd(train_x, train_y, vectorized_tt_dot_h, loss_h, batch_y = train_y[curr_idx] batch_w_x = vectorized_tt_dot_h(w, train_x[curr_idx, :]) batch_linear_o = batch_w_x + b - batch_loss_arr = loss_h(batch_linear_o, batch_y) - wcore_wcore = w.core.dot(w.core) - batch_loss = np.sum(batch_loss_arr) + reg * wcore_wcore / 2.0 batch_grad_coef = loss_grad_h(batch_linear_o, batch_y) w_cores = tt.tensor.to_list(w) gradient = grad_wrt_cores_h(w_cores, train_x[curr_idx, :], batch_grad_coef) gradient += reg * w.core -# Armiho step choosing. - step_prev_w = step_w - gradient_norm = np.linalg.norm(gradient) - while step_w > 1e-10: - new_w = w.copy() - new_w.core += -step_w * gradient - new_w_x = vectorized_tt_dot_h(new_w, train_x[curr_idx, :]) + w.core += -learning_rate * gradient - if fit_intercept: - b_objective = lambda b: np.sum(loss_h(new_w_x + b, batch_y)) - m = minimize_scalar(b_objective) - b = m.x - new_loss = m.fun - else: - new_loss = np.sum(loss_h(new_w_x + b, batch_y)) - new_loss += reg * new_w.core.dot(new_w.core) / 2.0 - if new_loss <= batch_loss - rho * step_w * gradient_norm**2: - break - step_w *= beta - w = new_w if (logger is not None) and e % verbose_period == 0: logger.after_each_iter(e, train_x, train_y, w, lambda w, x: vectorized_tt_dot_h(w, x) + b, stage='train') diff --git a/src/optimizers/riemannian_sgd.py b/src/optimizers/riemannian_sgd.py index 6a7224d..4cf277e 100644 --- a/src/optimizers/riemannian_sgd.py +++ b/src/optimizers/riemannian_sgd.py @@ -70,7 +70,7 @@ def build_reg_tens(n, exp_reg): def riemannian_sgd(train_x, train_y, vectorized_tt_dot_h, loss_h, - loss_grad_h, project_h, w0, intercept0=0, + loss_grad_h, project_h, learning_rate, w0, intercept0=0, fit_intercept=True, val_x=None, val_y=None, reg=0., exp_reg=1., dropout=None, batch_size=-1, num_passes=30, seed=None, logger=None, verbose_period=1, @@ -123,59 +123,13 @@ def riemannian_sgd(train_x, train_y, vectorized_tt_dot_h, loss_h, batch_y = train_y[curr_idx] batch_w_x = vectorized_tt_dot_h(w, curr_batch) batch_linear_o = batch_w_x + b - batch_loss_arr = loss_h(batch_linear_o, batch_y) wreg = w * reg_tens wregreg = w * reg_tens * reg_tens - wreg_wreg = wreg.norm()**2 - batch_loss = np.sum(batch_loss_arr) + reg * wreg_wreg / 2.0 batch_grad_coef = loss_grad_h(batch_linear_o, batch_y) - batch_gradient_b = np.sum(batch_grad_coef) direction = project_h(w, curr_batch, batch_grad_coef, reg=0) direction = riemannian.project(w, [direction, reg * wregreg]) - batch_dir_x = vectorized_tt_dot_h(direction, curr_batch) - - dir_dir = direction.norm()**2 - wreg_dir = tt.dot(wreg, direction) - if fit_intercept: - # TODO: Use classical Newton-Raphson (with hessian). - step_objective = lambda s: _regularized_loss_step(s, loss_h, batch_y, batch_w_x, batch_dir_x, b, batch_gradient_b, reg, wreg_wreg, wreg_dir, dir_dir) - step_gradient = lambda s: _regularized_loss_step_grad(s, loss_grad_h, batch_y, batch_w_x, batch_dir_x, b, batch_gradient_b, reg, wreg_dir, dir_dir) - step0_w, step0_b = fmin_bfgs(step_objective, np.ones(2), fprime=step_gradient, gtol=1e-10, disp=logger.disp()) - else: - def w_step_objective(w_step): - steps = np.array([w_step, 0]) - obj = _regularized_loss_step(steps, loss_h, batch_y, - batch_w_x, batch_dir_x, b, - batch_gradient_b, reg, wreg_wreg, - wreg_dir, dir_dir) - return obj - step0_w = minimize_scalar(w_step_objective).x - - - # TODO: consider using Probabilistic Line Searches for Stochastic Optimization. -# Armiho step choosing. - step_w = step0_w - # = - # = <(\sum_i coef[i] * x_i + reg * w), direction> = - # = \sum_i coef[i] + reg * - grad_times_direction = batch_dir_x.dot(batch_grad_coef) + reg * wreg_dir - while step_w > 1e-10: - new_w = (w - step_w * direction).round(eps=0, rmax=max(w.r)) - new_w_x = vectorized_tt_dot_h(new_w, curr_batch) - - if fit_intercept: - b_objective = lambda b: np.sum(loss_h(new_w_x + b, batch_y)) - m = minimize_scalar(b_objective) - b = m.x - new_loss = m.fun - else: - new_loss = np.sum(loss_h(new_w_x + b, batch_y)) - new_wreg = new_w * reg_tens - new_loss += reg * new_wreg.norm()**2 / 2.0 - if new_loss <= batch_loss - rho * step_w * grad_times_direction: - break - step_w *= beta - w = new_w + + w = (w - learning_rate * direction).round(eps=0, rmax=max(w.r)) if (logger is not None) and e % verbose_period == 0: logger.after_each_iter(e, train_x, train_y, w, lambda w, x: vectorized_tt_dot_h(w, x) + b, stage='train')