# HG changeset patch # User Maria Panteli # Date 1506967259 -3600 # Node ID 1d9c96974c3e93176136c2dd2984d8065239cc34 # Parent 4aa0763bf8d805534954c4461275379cef051f4e# Parent 69521f86d931badc195b74ade5635a080c5f668f merged diff -r 4aa0763bf8d8 -r 1d9c96974c3e notebooks/correlation_n_outliers.ipynb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notebooks/correlation_n_outliers.ipynb Mon Oct 02 19:00:59 2017 +0100 @@ -0,0 +1,217 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pickle\n", + "from scipy.stats import pearsonr\n", + "import sys\n", + "\n", + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "\n", + "%load_ext autoreload\n", + "%autoreload 2\n", + "\n", + "sys.path.append('../')\n", + "import scripts.outliers as outliers" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Antigua and Barbuda\n", + "Australia\n", + "Cuba\n", + "Fiji\n", + "French Polynesia\n", + "Grenada\n", + "Iceland\n", + "Jamaica\n", + "Japan\n", + "Kiribati\n", + "Malta\n", + "New Zealand\n", + "Philippines\n", + "Puerto Rico\n", + "Republic of Serbia\n", + "Saint Lucia\n", + "Samoa\n", + "Solomon Islands\n", + "South Korea\n", + "The Bahamas\n", + "Trinidad and Tobago\n" + ] + } + ], + "source": [ + "DATA_FILE = '../data/lda_data_8.pickle'\n", + "METADATA_FILE = '../data/metadata.csv'\n", + "dataset, ddf, w_dict = outliers.load_data(DATA_FILE, METADATA_FILE)\n", + "X_list, Y, Yaudio = dataset\n", + "X = np.concatenate(X_list, axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CountryOutliersN_CountryN_Outliers
0Canada0.0500001005
1Lithuania0.000000470
2Cambodia0.210526194
3Ethiopia0.257143359
4Swaziland0.1632659816
\n", + "
" + ], + "text/plain": [ + " Country Outliers N_Country N_Outliers\n", + "0 Canada 0.050000 100 5\n", + "1 Lithuania 0.000000 47 0\n", + "2 Cambodia 0.210526 19 4\n", + "3 Ethiopia 0.257143 35 9\n", + "4 Swaziland 0.163265 98 16" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_global, threshold, MD = outliers.get_outliers_df(X, Y, chi2thr=0.999)\n", + "df_global.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pearson correlation between percentage of outliers and number of samples per country" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "correlation -0.0102335874359\n", + "p-value 0.905523601988\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "corr, pval = pearsonr(df_global['Outliers'], df_global['N_Country'])\n", + "print 'correlation', corr\n", + "print 'p-value', pval\n", + "\n", + "plt.scatter(df_global['Outliers'], df_global['N_Country'])\n", + "plt.xlabel('Outliers');\n", + "plt.ylabel('N');" + ] + }, + { + "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.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff -r 4aa0763bf8d8 -r 1d9c96974c3e notebooks/hubness.ipynb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notebooks/hubness.ipynb Mon Oct 02 19:00:59 2017 +0100 @@ -0,0 +1,285 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pickle\n", + "from scipy.stats import skew\n", + "from sklearn.metrics.pairwise import pairwise_distances\n", + "\n", + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load data" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(8200, 381)\n" + ] + } + ], + "source": [ + "X_list, Y, Yaudio = pickle.load(open('../data/lda_data_8.pickle','rb'))\n", + "X = np.concatenate(X_list, axis=1)\n", + "print X.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pairwise distances" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "D = pairwise_distances(X, metric='mahalanobis')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(D.ravel(), bins=100);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## n-occurrence and stats" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def n_occurrence_from_D(D, k=10, n_items=None):\n", + " if n_items is None:\n", + " n_items = len(D)\n", + " sort_idx = np.argsort(D, axis=1)\n", + " D_k = sort_idx[:, 1:(k+1)] # nearest neighbour is the item itself\n", + " N_k = np.bincount(D_k.astype(int).ravel(), minlength=n_items)\n", + " return N_k" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "60\n" + ] + } + ], + "source": [ + "# k = average number of samples per country\n", + "uniq_countries, uniq_counts = np.unique(Y, return_counts=True)\n", + "k = np.int(np.round(np.mean(uniq_counts)))\n", + "print k" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hubness 10.5914304167\n", + "median 1.0\n", + "std 348.006117132\n", + "hubs 129 0.0157317073171\n", + "orphans 3332 0.406341463415\n" + ] + } + ], + "source": [ + "N_k = n_occurrence_from_D(D, k=k)\n", + "\n", + "print 'hubness', skew(N_k)\n", + "print 'median', np.median(N_k)\n", + "print 'std', np.std(N_k)\n", + "print 'hubs', len(np.where(N_k>1000)[0]), len(np.where(N_k>1000)[0]) / float(len(N_k))\n", + "print 'orphans', len(np.where(N_k==0)[0]), len(np.where(N_k==0)[0]) / float(len(N_k))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEACAYAAABcXmojAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFrRJREFUeJzt3X+MXWd95/H3hzgDTjDj9bJyfkrxtpMmrugSzGK6wGay\nTbPDqiT5K3EkIqvrRUJuN3RXothIu8lfTECqStAqWW2XEgeBuy6FKFlS106aK1XqbsyPpJgYN/G2\nJtjgMQstgXaj9Sjf/eM+c3yZNZmxfT1z47xf0lWe85znnPs9M/H9zPOcO3NTVUiSBPC65S5AkjQ6\nDAVJUsdQkCR1DAVJUsdQkCR1DAVJUmfBUEiyPcmzSfYn+XyS1ydZk2RvkueS7Emyet7455McTHLT\nQP+Gdo7nk9x3ri5IknTmXjEUklwFfAB4W1W9BbgA2ARsA/ZW1dXAE22bJOuB24H1wBRwf5K00z0A\nbKmqCWAiydTQr0aSdFYWmim8CJwALkqyArgI+C5wM7CjjdkB3NratwA7q+pEVR0GDgEbk1wKrKqq\nfW3cQwPHSJJGxCuGQlX9EPgd4AX6YfC3VbUXWFtVM23YDLC2tS8Djgyc4ghw+Sn6j7Z+SdIIWWj5\n6OeA3wKuov/C/sYk7x8cU/2/k+HfypCk88CKBfa/HfjzqvoBQJIvAr8MHEtySVUda0tDx9v4o8CV\nA8dfQX+GcLS1B/uPnuoJkxgwknSaqioLj1rYQvcUDgLvTLKy3TC+ETgAPApsbmM2Aw+39iPApiRj\nSdYBE8C+qjoGvJhkYzvPnQPH/H+qaqQfd99997LXYJ3WaZ3WOPcYplecKVTVXyR5CPgq8DLwdeC/\nAKuAXUm2AIeB29r4A0l20Q+OWWBrnax4K/AgsBJ4rKp2D/VKJElnbaHlI6rqE8An5nX/kP6s4VTj\nPwZ87BT9XwPecgY1SpKWiL/RfAYmJyeXu4RFsc7hss7hejXU+Wqocdgy7PWos5WkRq0mSRplSagl\nutEsSXoNMRQkSR1DQZLUMRQkSR1DQZLUMRQkSZ2RDIXLL7+Gdeuu4cc//vFylyJJrykL/kbzcvju\ndx/mwgvfzssvv7zcpUjSa8pIzhTgGpILlrsISXrNGdFQkCQtB0NBktQxFCRJHUNBktQxFCRJHUNB\nktQxFCRJHUNBktRZMBSS/EKSpwceP0pyV5I1SfYmeS7JniSrB47ZnuT5JAeT3DTQvyHJ/rbvvnN1\nUZKkM7NgKFTVX1bVdVV1HbAB+HvgS8A2YG9VXQ080bZJsh64HVgPTAH3J5n7mLgHgC1VNQFMJJka\n9gVJks7c6S4f3QgcqqrvADcDO1r/DuDW1r4F2FlVJ6rqMHAI2JjkUmBVVe1r4x4aOEaSNAJONxQ2\nATtbe21VzbT2DLC2tS8DjgwccwS4/BT9R1u/JGlELDoUkowB7wP+cP6+qiqghliXJGkZnM6fzn4v\n8LWq+n7bnklySVUda0tDx1v/UeDKgeOuoD9DONrag/1HT/1U9zA7+xLT09NMTU0xOTl5GmVK0vmt\n1+vR6/XOybnT/yF/EQOTPwD+uKp2tO1PAD+oqo8n2Qasrqpt7Ubz54F30F8eehz4+aqqJE8BdwH7\ngC8Dn6qq3fOep6AYGxvn+PEXGB8fH9KlStL5KQlVlYVHLmxRM4UkF9O/yfyBge57gV1JtgCHgdsA\nqupAkl3AAWAW2Fonk2cr8CCwEnhsfiBIkpbXomcKS8WZgiSdnmHOFPyNZklSx1CQJHUMBUlSx1CQ\nJHUMBUlSx1CQJHUMBUlSx1CQJHUMBUlSx1CQJHUMBUlSx1CQJHUMBUlSx1CQJHUMBUlSx1CQJHUM\nBUlSx1CQJHUMBUlSZ1GhkGR1ki8k+VaSA0k2JlmTZG+S55LsSbJ6YPz2JM8nOZjkpoH+DUn2t333\nnYsLkiSducXOFO4DHquqa4FfAg4C24C9VXU18ETbJsl64HZgPTAF3J9k7gOlHwC2VNUEMJFkamhX\nIkk6awuGQpJx4D1V9fsAVTVbVT8CbgZ2tGE7gFtb+xZgZ1WdqKrDwCFgY5JLgVVVta+Ne2jgGEnS\nCFjMTGEd8P0kn0ny9SS/l+RiYG1VzbQxM8Da1r4MODJw/BHg8lP0H239kqQRsWKRY94G/GZVfSXJ\nJ2lLRXOqqpLU8Mq6h9nZl5ienmZqaorJycnhnVqSXuV6vR69Xu+cnDtVr/xanuQS4H9U1bq2/W5g\nO/CPgRuq6lhbGnqyqq5Jsg2gqu5t43cDdwPfbmOubf13ANdX1QfnPV9BMTY2zvHjLzA+Pj7M65Wk\n804SqioLj1zYgstHVXUM+E6Sq1vXjcCzwKPA5ta3GXi4tR8BNiUZS7IOmAD2tfO82N65FODOgWMk\nSSNgMctHAP8W+FySMeB/Ab8OXADsSrIFOAzcBlBVB5LsAg4As8DWOjkd2Qo8CKyk/26m3UO6DknS\nECy4fLTUXD6SpNOzpMtHkqTXDkNBktQxFCRJHUNBktQxFCRJHUNBktQxFCRJHUNBktQxFCRJHUNB\nktQxFCRJHUNBktQxFCRJHUNBktQxFCRJHUNBktQxFCRJHUNBktQxFCRJnUWFQpLDSb6R5Okk+1rf\nmiR7kzyXZE+S1QPjtyd5PsnBJDcN9G9Isr/tu2/4lyNJOhuLnSkUMFlV11XVO1rfNmBvVV0NPNG2\nSbIeuB1YD0wB9yeZ+0DpB4AtVTUBTCSZGtJ1SJKG4HSWjzJv+2ZgR2vvAG5t7VuAnVV1oqoOA4eA\njUkuBVZV1b427qGBYyRJI+B0ZgqPJ/lqkg+0vrVVNdPaM8Da1r4MODJw7BHg8lP0H239kqQRsWKR\n495VVd9L8o+AvUkODu6sqkpSwyvrHmZnX2J6epqpqSkmJyeHd2pJepXr9Xr0er1zcu5Und5reZK7\ngZ8AH6B/n+FYWxp6sqquSbINoKrubeN3A3cD325jrm39dwDXV9UH552/oBgbG+f48RcYHx8/y0uU\npPNbEqpq/hL/GVlw+SjJRUlWtfbFwE3AfuARYHMbthl4uLUfATYlGUuyDpgA9lXVMeDFJBvbjec7\nB46RJI2AxSwfrQW+1N5AtAL4XFXtSfJVYFeSLcBh4DaAqjqQZBdwAJgFttbJ6chW4EFgJfBYVe0e\n4rVIks7SaS8fnWsuH0nS6VnS5SNJ0muHoSBJ6hgKkqSOoSBJ6hgKkqSOoSBJ6hgKkqSOoSBJ6hgK\nkqSOoSBJ6hgKkqSOoSBJ6hgKkqSOoSBJ6hgKkqSOoSBJ6hgKkqSOoSBJ6hgKkqTOokIhyQVJnk7y\naNtek2RvkueS7EmyemDs9iTPJzmY5KaB/g1J9rd99w3/UiRJZ2uxM4UPAQeAatvbgL1VdTXwRNsm\nyXrgdmA9MAXcn2Tuw6QfALZU1QQwkWRqOJcgSRqWBUMhyRXAvwL+KzD3An8zsKO1dwC3tvYtwM6q\nOlFVh4FDwMYklwKrqmpfG/fQwDGSpBGxmJnC7wIfBl4e6FtbVTOtPQOsbe3LgCMD444Al5+i/2jr\nlySNkBWvtDPJrwHHq+rpJJOnGlNVlaROte/M3cPs7EtMT08zNTXF5OQpn1qSXpN6vR69Xu+cnDtV\nP/v1PMnHgDuBWeANwJuALwL/FJisqmNtaejJqromyTaAqrq3Hb8buBv4dhtzbeu/A7i+qj54iucs\nKMbGxjl+/AXGx8eHeLmSdP5JQlVl4ZELe8Xlo6r6aFVdWVXrgE3An1bVncAjwOY2bDPwcGs/AmxK\nMpZkHTAB7KuqY8CLSTa2G893DhwjSRoRr7h8dApz04p7gV1JtgCHgdsAqupAkl3036k0C2ytk1OR\nrcCDwErgsarafXalS5KG7RWXj5aDy0eSdHqWbPlIkvTaYihIkjqGgiSpYyhIkjqGgiSpYyhIkjqG\ngiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSp\n84qhkOQNSZ5K8kySA0mmW/+aJHuTPJdkT5LVA8dsT/J8koNJbhro35Bkf9t337m7JEnSmXrFUKiq\nl4AbquqtwC8BNyR5N7AN2FtVVwNPtG2SrAduB9YDU8D9SeY+TPoBYEtVTQATSabOxQVJks7cgstH\nVfX3rTkGXAD8DXAzsKP17wBube1bgJ1VdaKqDgOHgI1JLgVWVdW+Nu6hgWMkSSNiwVBI8rokzwAz\nwJNV9Sywtqpm2pAZYG1rXwYcGTj8CHD5KfqPtn5J0ghZsdCAqnoZeGuSceBPktwwb38lqeGWdQ+z\nsy8xPT3N1NQUk5OTwz29JL2K9Xo9er3eOTl3qhb/ep7kPwD/B/g3wGRVHWtLQ09W1TVJtgFU1b1t\n/G7gbuDbbcy1rf8O4Pqq+uApnqOgGBsb5/jxFxgfHz/LS5Sk81sSqioLj1zYQu8+evPcO4uSrAR+\nFXgaeATY3IZtBh5u7UeATUnGkqwDJoB9VXUMeDHJxnbj+c6BYyRJI2Kh5aNLgR1JXkc/QD5bVU8k\neRrYlWQLcBi4DaCqDiTZBRwAZoGtdXIqshV4EFgJPFZVu4d9MZKks3Nay0dLweUjSTo9S7Z8JEl6\nbTEUJEkdQ0GS1DEUJEkdQ0GS1DEUJEkdQ0GS1DEUJEkdQ0GS1DEUJEkdQ0GS1DEUJEkdQ0GS1DEU\nJEkdQ0GS1DEUJEkdQ0GS1DEUJEkdQ0GS1FkwFJJcmeTJJM8m+WaSu1r/miR7kzyXZE+S1QPHbE/y\nfJKDSW4a6N+QZH/bd9+5uSRJ0plazEzhBPDvquoXgXcCv5HkWmAbsLeqrgaeaNskWQ/cDqwHpoD7\nk8x9oPQDwJaqmgAmkkwN9WokSWdlwVCoqmNV9Uxr/wT4FnA5cDOwow3bAdza2rcAO6vqRFUdBg4B\nG5NcCqyqqn1t3EMDx0iSRsBp3VNIchVwHfAUsLaqZtquGWBta18GHBk47Aj9EJnff7T1S5JGxIrF\nDkzyRuCPgA9V1Y9PrghBVVWSGl5Z9zA7+xLT09NMTU0xOTk5vFNL0qtcr9ej1+udk3OnauHX8iQX\nAv8d+OOq+mTrOwhMVtWxtjT0ZFVdk2QbQFXd28btBu4Gvt3GXNv67wCur6oPznuugmJsbJzjx19g\nfHx8aBcrSeejJFRVFh65sMW8+yjAp4EDc4HQPAJsbu3NwMMD/ZuSjCVZB0wA+6rqGPBiko3tnHcO\nHCNJGgGLWT56F/B+4BtJnm5924F7gV1JtgCHgdsAqupAkl3AAWAW2FonpyNbgQeBlcBjVbV7SNch\nSRqCRS0fLSWXjyTp9Czp8pEk6bXDUJAkdQwFSVLHUJAkdQwFSVLHUJAkdQwFSVLHUJAkdQwFSVLH\nUJAkdQwFSVLHUJAkdQwFSVLHUJAkdQwFSVLHUJAkdQwFSVLHUJAkdRYMhSS/n2Qmyf6BvjVJ9iZ5\nLsmeJKsH9m1P8nySg0luGujfkGR/23ff8C9FknS2FjNT+AwwNa9vG7C3qq4GnmjbJFkP3A6sb8fc\nn2Tuc0MfALZU1QQwkWT+OSVJy2zBUKiqPwP+Zl73zcCO1t4B3NratwA7q+pEVR0GDgEbk1wKrKqq\nfW3cQwPHSJJGxJneU1hbVTOtPQOsbe3LgCMD444Al5+i/2jrlySNkLO+0VxVBdQQapEkLbMVZ3jc\nTJJLqupYWxo63vqPAlcOjLuC/gzhaGsP9h/92ae/h9nZl5ienmZqaorJyckzLFOSzj+9Xo9er3dO\nzp3+D/oLDEquAh6tqre07U8AP6iqjyfZBqyuqm3tRvPngXfQXx56HPj5qqokTwF3AfuALwOfqqrd\np3iugmJsbJzjx19gfHx8KBcqSeerJFRVFh65sAVnCkl2AtcDb07yHeA/AvcCu5JsAQ4DtwFU1YEk\nu4ADwCywtU6mzlbgQWAl8NipAkGStLwWNVNYSs4UJOn0DHOm4G80S5I6hoIkqWMoSJI6hoIkqWMo\nSJI6hoIkqWMoSJI6hoIkqWMoSJI6hoIkqWMoSJI6hoIkqWMoSJI6hoIkqWMoSJI6hoIkqWMoSJI6\nhoIkqbPgZzQvp9WrV//U9qh9dKgknW+WfKaQZCrJwSTPJ/nIwkdUe0iSzrUlDYUkFwD/CZgC1gN3\nJLl2KWsYhl6vt9wlLIp1Dpd1Dteroc5XQ43DttQzhXcAh6rqcFWdAP4AuGWxByfpHsvp1fI/inUO\nl3UO16uhzldDjcO21KFwOfCdge0jrW+RTi4ljUpASNL5ZKlvNC/q5sCb3vQ+fvKTv1vkqc5NMHhT\nW9JrUZbyxS/JO4F7qmqqbW8HXq6qjw+M8dVYkk5TVQ3lp+OlDoUVwF8CvwJ8F9gH3FFV31qyIiRJ\nP9OSLh9V1WyS3wT+BLgA+LSBIEmjY0lnCpKk0TYyf+bi9H+pbejP//tJZpLsH+hbk2RvkueS7Emy\nemDf9lbrwSQ3DfRvSLK/7btvyDVemeTJJM8m+WaSu0a0zjckeSrJM0kOJJkexToHnuOCJE8neXRU\n60xyOMk3Wp37RrjO1Um+kORb7Xu/cZTqTPIL7Ws49/hRkrtGqcZ5z/tse47PJ3n9ktRZVcv+oL+U\ndAi4CrgQeAa4dolreA9wHbB/oO8TwG+39keAe1t7favxwlbzIU7OuvYB72jtx4CpIdZ4CfDW1n4j\n/fsz145ane2cF7X/rgD+J/DuUayznfffA58DHhnF73s7518Da+b1jWKdO4B/PfC9Hx/FOtt5Xwd8\nD7hy1Gpsz/VXwOvb9n8DNi9FnUP9Ip/FF+CXgd0D29uAbctQx1X8dCgcBNa29iXAwdbeDnxkYNxu\n4J3ApcC3Bvo3Af/5HNb7MHDjKNcJXAR8BfjFUawTuAJ4HLgBeHRUv+/0Q+EfzusbqTrpB8BfnaJ/\npOocOO9NwJ+NYo3AGvo/9P0D+uH6KPCrS1HnqCwfneUvtZ0za6tqprVngLWtfRn9GufM1Tu//yjn\n6DqSXEV/ZvPUKNaZ5HVJnmn1PFlVz45incDvAh8GXh7oG8U6C3g8yVeTfGBE61wHfD/JZ5J8Pcnv\nJbl4BOucswnY2dojVWNV/RD4HeAF+u/U/Nuq2rsUdY5KKIz83e7qx+xI1JnkjcAfAR+qqh8P7huV\nOqvq5ap6K/2fxP95khvm7V/2OpP8GnC8qp4GTvke71Gos3lXVV0HvBf4jSTvGdw5InWuAN4G3F9V\nbwP+jv6svzMidZJkDHgf8Ifz941CjUl+Dvgt+qsXlwFvTPL+wTHnqs5RCYWj9Nf15lzJT6fbcplJ\ncglAkkuB461/fr1X0K/3aGsP9h8dZkFJLqQfCJ+tqodHtc45VfUj4MvAhhGs858BNyf5a/o/Mf6L\nJJ8dwTqpqu+1/34f+BL9vyM2anUeAY5U1Vfa9hfoh8SxEasT+uH6tfb1hNH7Wr4d+POq+kFVzQJf\npL/Mfs6/lqMSCl8FJpJc1RL8duCRZa4J+jVsbu3N9Nfw5/o3JRlLsg6YAPZV1THgxfaOiwB3Dhxz\n1to5Pw0cqKpPjnCdb557V0SSlfTXQp8etTqr6qNVdWVVraO/lPCnVXXnqNWZ5KIkq1r7Yvpr4ftH\nrc52/u8kubp13Qg8S389fGTqbO7g5NLRXC2jVONB4J1JVrbz3wgcYCm+lsO+eXMWN1beS//GyiFg\n+zI8/076a3f/l/79jV+nf7PnceA5YA+wemD8R1utB4F/OdC/gf4/2EPAp4Zc47vpr30/Q/9F9mn6\nf4Z81Op8C/D1Vuc3gA+3/pGqc17N13Py3UcjVSf9tfpn2uObc/8+Rq3Odv5/Qv+NBX9B/6fb8VGr\nE7gY+N/AqoG+kaqxnf+36Yfqfvrv6rpwKer0l9ckSZ1RWT6SJI0AQ0GS1DEUJEkdQ0GS1DEUJEkd\nQ0GS1DEUJEkdQ0GS1Pl/K2rf7rVpmykAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\nrrH85JPw9NNvfThNI3iv3YivUy3V+0DzAuDlwv3dwLI612BmdRSRfU3E4cPw5ptw9Og7b7/9bfZ4\nf392O3QI3ngDnnsOvvvd7Mvofve7rP/gwez2xhtw4EDW//rr8Npr8Ktfwd692foWLIAPfSj7eooz\nz4TPfx42bIC5c8t+RRpbvUNhRAcLPvOZYVYygrWM9LDESMbt3JkddKrX9kYy5oUX4Ic/rN/2RjLm\nl7+EkbyJqufv76WX4PHHa7OuWo55+WXYsqV22zt0KPs5MH6gPZL7A32vvgrt7SNb5tCh7A/8wC3i\n7feLfZCd0nniidm0zJQp77w1NWVTONOmZbfp0+Hkk6GnB44cydonnZStY+ZMmDULmpvhfe/L+mfO\nhFNPzfYEPvABOO20kb3rt3eq64FmSRcAbRHRmu6vA94sHmyW5KPMZmbHqFYHmusdClOB54D/AvwH\n0Al8NiJ+UbcizMzsXdV1+igijkj6a+AxslNS73AgmJk1job77iMzMytPw3w8Q1KrpG5JOyV9ZYy3\n9S1JfZJ2FPrmSOqQ9LykrZJmFx5bl+rqlrS80L9U0o702K2jrGmRpCckPSvp55KuL7suSSdJelLS\nM5K6JP1d2TUV1jdF0nZJDzVQTT2Sfpbq6myEuiTNlnSvpF+k3+Gykv9N/X56fQZu+yVd3wCv07r0\nf2+HpHskndgANd2Q1vVzSTekvrGvKSJKv5FNJe0CTgemAc8AZ4/h9i4CzgN2FPq+Dnw5tb8C3Jza\nS1I901J9u3hrD6sTOD+1HwFaR1HTXODc1J5Jduzl7Aaoa0b6ORX4MXBh2TWldfx34G5gcyP8/tI6\nfgnMGdRX9u+vHfiLwu/wlLJrKtR2AvAKsKjMmtJ6XwROTPf/L7Cq5Jo+CuwATiL7+9gBnFGPmkb1\nS63VDfgjYEvh/lpg7Rhv83TeHgrdQHNqzwW6U3sd8JXCuC3ABcA84BeF/pXA/65hfQ8ClzZKXcAM\n4CfAH5RdE7AQeBy4BHioUX5/ZKFw2qC+0uoiC4AXh+gv/bVK61kO/KDsmoA5ZG/CTiULzoeAPy65\npv9G9jVAA/f/B/DletTUKNNHQ32obUGda2iOiL7U7gOaU3t+qmfAQG2D+3upUc2STifbk3my7Lok\nnSDpmbTtJyLi2bJrAv4B+BLwZqGv7Jog+xzO45KeknRdA9S1GNgn6U5JT0v6pqSTS66paCWwMbVL\nqykiXgX+Hvh3srMifxMRHWXWBPwcuChNF80AriB7MzTmNTVKKDTU0e7IIrWUmiTNBO4DboiI18uu\nKyLejIhzyf5BflrSJWXWJOkzwN6I2A4MeV52ib+/T0XEecDlwF9JuqjkuqYCHwdui4iPAwfJ9sLL\nrAkASdOBPwG+O/ixEv5NnQHcSDZ7MB+YKelzZdYUEd3A14CtwKNkU0NH61FTo4RCL9m84oBFvD3d\n6qFP0lwASfOAve9S28JUW29qF/t7R1OApGlkgfDtiHiwUeoCiIj9wMPA0pJr+iSwQtIvyd5l/mdJ\n3y65JgAi4pX0cx/wANl3fZVZ125gd0T8JN2/lywk9pT9WpEF50/TawXlvk6fAP41In4dEUeA+8mm\ntEt9nSLiWxHxiYi4GHgNeJ46vE6NEgpPAS2STk/vIK4BNte5hs1kB5dIPx8s9K+UNF3SYqAF6IyI\nPcCBdDaHgGsLyxyztI47gK6IuKUR6pL0/oGzGyQ1kc2zbi+zpoi4KSIWRcRisumHf4qIa8usCUDS\nDEmzUvtksvnyHWXWldb1sqSzUtelwLNkc+alvVbJZ3lr6mhg22XV1A1cIKkpretSoIuSXydJH0w/\nfw/4r8A91ON1Op6DIGNxI3vn8BzZUfN1Y7ytjWRzh4fJjmX8OdnBpsfJ0ngrMLsw/qZUVzdwWaF/\nKdl//F3AN0ZZ04Vkc+TPkP3h3U72FeOl1QWcAzydavoZ8KXUX+prVVjnxbx19lHZv7/F6XV6hmw+\neF2D1PWfyE4Q+Deyd8CnNEBNJwO/AmYV+squ6ctkgbmD7IytaQ1Q0/dTTc8Al9TrdfKH18zMLNco\n00dmZtYAHApmZpZzKJiZWc6hYGZmOYeCmZnlHApmZpZzKJiZWc6hYGZmuf8PZ2wAgLNjtEkAAAAA\nSUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure()\n", + "plt.hist(N_k, bins=100);\n", + "\n", + "plt.figure()\n", + "plt.plot(np.sort(N_k))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Large hubs" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "129\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nAAAAgBYhiAMAAACAFiGIAwAAAIAWIYgDAAAAgBYhiAMAAACAFiGIAwAAAIAWIYgDAAAAgBYhiAMA\nAACAFiGIAwAAAIAWmT/qDQAAoAkzyyrn7rO8JXNvWXzvOe/J3bPLYek3yu9yWTyGsHwiiAMAtNCw\nC6y8C7V2Whbf+6D3VH4/ueWw9Bvld7ksHkNY3tCdEgAAAABahCAOAAAAAFqEIA4AAAAAWoQgDgAA\nAABahCAOAAAAAFqEIA4AAAAAWoQgDgAAAABahCAOAAAAAFqEIA4AAAAAWoQgDgAAAABahCAOAAAA\nAFqEIA4AAAAAWoQgDgAAAABahCAOAAAAAFqEIA4AAAAAWoQgDgAAAABahCAOAAAAAFpkzoM4M1vf\nzM43syVmdo2Z7TvX2wAAAAAAbTV/BOu8T9IB7n6lma0uaaGZnefuvxrBtgAAAABAq8x5S5y73+zu\nV6b/3yXpV5IePdfbAQAAAABtNNIxcWa2QNIWki4d5XYAAAAAQFuMojulJCl1pTxV0n6pRa7L+Pj4\n5P/HxsY0NjY2Z9uG2WdmWeXcfZa3ZNmwPH+eOe/d3WflM2pLnRiNJt9l7n480+tf3vejUZ4/2mLU\n730mv6Nl8fvBsmViYkITExNZZW0UO7SZPUTSWZK+7+5fqHndOdCWbXGyHfYdW+nEPKisLfcn5iaf\n57Imd/+YjX1uNj73UX+XM/feR7mNs7v+XKPe59py7hzlPjfKY72JZe2c1OS7nOn9Y9Tf5bKGz3N2\nmZncvfYOxSiyU5qkoyX9si6AAwAAAAD0N4oxcdtLeoOkHcxsUXrsOILtAAAAAIDWmfMxce5+kZhk\nHAAAAACmhGAKAAAAAFqEIA4AAAAAWoQgDgAAAABahCAOAAAAAFqEIA4AAAAAWoQgDgAAAABahCAO\nAAAAAFqEIA4AAAAAWoQgDgAAAABahCAOAAAAAFqEIA4AAAAAWoQgDgAAAABahCAOAAAAAFqEIA4A\nAAAAWoQgDgAAAABahCAOAAAAAFqEIA4AAAAAWoQgDgAAAABahCAOAAAAAFpk/qg3AO1gZkPLuHt2\nudmQs+5i/TP5fpaGOpuYje9yputs8hm1xdL+XU5l/blGef5oy3E5SqM6zy0NvwWjWn+bjstR1zlK\ny9q1wvJ8nlsWEcShgUEHa/lgzy03G4adUKaynW2ps4nZ+C5nus4mn1FbLK3f5XTWn2uU54+2HJej\nNNfnuaXpt2Cu19/G43LUdY7SsnatsDyf55YtdKcEAAAAgBYhiAMAAACAFiGIAwAAAIAWIYgDAAAA\ngBYhiAMAAACAFiGIAwAAAIAWIYgDAAAAgBYhiAMAAACAFiGIAwAAAIAWIYgDAAAAgBYhiAMAAACA\nFiGIAwAAAIAWIYgDAAAAgBYhiAMAAACAFiGIAwAAAIAWIYgDAAAAgBYZSRBnZjua2bVm9r9m9sFR\nbAMAAAAAtNGcB3FmtoKkL0vaUdKTJb3OzDad6+3AdE3McLm21DnKdVPn0l/nKNdNnctnnaNcN3Uu\n/XWOct3UufTXOcp1Y7pG0RK3jaRfu/uN7n6fpO9IevkItgPTMjHD5dpS5yjXTZ1Lf52jXDd1Lp91\njnLd1Ln01znKdVPn0l/nKNeN6RpFEPcYSb8vPf9DWgYAAAAAGGIUQZyPYJ0AAAAAsEww97mNqczs\nWZLG3X3H9PxDkh5090+XyhDoAQAAAFiuubvVLR9FEDdf0nWSXiDpT5Iuk/Q6d//VnG4IAAAAALTQ\n/Lleobvfb2bvknSupBUkHU0ABwAAAAB55rwlDgAAAAAwdXPeEgdgtMxsdUn3uPsD6fkKklZ297tH\nu2UAZoOZPVLSysVzd79phJszZ8xsRUlPUiRUuy5Na9RqZraqu/9j1NsBYPQI4jDjzOxpioncV1bK\nRuruxw8oP+cXGGa2saRPSXpKad3u7htNdRvNbJ6k3SVt6O6fMLMNJD3K3S+rqesDNet+/jTeT5M6\nf6wYk3pXer6qonvzdk3rNLMvuvt+ZnZmzXrc3Xeu1LmKpDfX1Ll31hsdYNB3ZGYvcPcfm9mrFPtk\neZCwu/tplbp2lnSWuz+Ysc7s79LMXlYqWxwbn6ipcx9JC9Q5R3d9RpXPu+79dH3u6W8aHZfD5Gxn\nqezA793MPujunzazI2pW5e6+b02dT5L0vpr193z2OZ97qezTJT0nlbvQ3a/q896bfO+PkrR1qvMy\nd7+1psyzJV3p7neZ2RslbSHpi+7+u/T61XV1l9a9WU2dO0s6XNKjJd0q6XGSfpW2u1zuVZIOlbSu\nOvuSu/uaNXVuK+lLin1pRcWwiLuqZc3sae4+aJvLZYe99/eW32t5G9OGfq6mzjFJ35T0u7RoAzPb\nw90vqJRrdE7KOY5yP6NS+XUkPVHSSpNv0v2nlTLbSTpK0hqS1k/76Vvd/f9Vyu0v6VhJf0/lt5R0\noLufW7fuHE2O9Zmss3K+7uk2VnPebnJOGrjPVcpm3wzIPMc3vf5YVdL67n7dgPVm1dnkuMTSjyAO\n2TJPTuOSnpfKnS3pxZIuktRzsdjgAiP7R7ZB2WMlHSTpc5J2lLSX4od2StuYfFXSg5KeL+kTiiDp\nq5KeUSl3oqTvSnqZpLdJ2lPSbTX1NTnZZ9cpaSV3LwI4ufud6UeiKqfO4ns9vM+6qk5QfH7/Lulg\nSW9Iz3uki/SvKgLhp5jZZpJ2dvdDKuVyvqPnKoLXnVQ/zclplee7SfqCmZ0q6Rh3v7bP+2nyXX5N\n0iqK/eMbknaVdGlN0e9J+qmk8xT7k2q2ufi8XynpUZK+pbjQeZ2kW2rWPa784/LZimNjgbovhKr7\nXM52FoZ9779M/y6s1FF78ZacIulIxYXqA/3W3+Bzl5ntp7gIPC2t+1tm9g13/1KlaJPvfVdJh0kq\ngocvm9n73f2UStEjJW1mZptLek96X8crvjcp9l1JKi7aT0jbuHvdepNDJG0r6Tx338LMdpD0xppy\nn5H0sszx6V+W9FpJJyvObW9SXOBWHWlmKynOtSe6+x0D6hz23tdQfLdPUgTDZyje+8sUydHqfE7S\ni4oL33Qu/Y4iqClrck4aV95xlPsZycz2kbSvpMdKulLSsyT9TLG/ln1B8Vv1PUly9yvN7Hnqtbe7\nf8HM/l3SOorv+wTFjbrqunODzexjvcENgZw6i/P1IxU3GX+Slu8g6RL1nrebnJOG7XPF+xlTxs2A\nVDb3XJN1/ZHq3Flx/lhJ0gIz20LSwTU36nLrbHJc5l73bS3pw+r9zei5sYQZ5u48eAx9SPqa4gT3\nB8WJ4hpFUppquWsUJ46r0vN1Jf2oT52LJT1c0qL0fAfFBXO13KmSPinpBkl7KE7QX+pTZ1ZZSVek\nf6+uLpvKNqbXFpX/Tf+/asC6F5eWXd6nzoslvTBtx+MkjUv65AzUuVXp+TMk/Ww6dTbYj64s1ynp\nIZIu7VP2p5KeWfpcTdKSaX5HG+UsS8vXkvR2ST9XXFS9VdIa0/jcr66899UlXdTvM8r8PBdmLmty\nXF6nuDhdN32uD5f08GluZ9b3LmnXnGX93ud0PveirKTVSs9XU+kcMcXvfbGkR5aeP6L8d6Xlxf57\nkKS3lNcz7HNX6ZxT9xlJukrSCtVtLpW7uOk+V3nvtfuCpI0VF/S/kfRtRVBVVy73vV9YPgYVwd2F\n/T73zGVNzklZx1HDz+gaxYV/sR2bSDq9ptxl1e9a9b8vxf7+JUm7DNs/FC2Ai9L72kvSoTn73ID9\n4zeSNs0o16TO8yStV3q+nqQfTrPO3H3uCklPquzTPeUqn/2wc3zW9Udp/WtXvvdrplln7nGZe913\nvaSdJW2kCOQWSFqQ+13wmPpjFJN9o522c/c3Sfqrux+suFtYd2exGGt1v5mtpWgZWb9Pnfe5+58l\nzTOzFdz9fPW2WknSE9z9Y4o7hN+U9BLFxX2d3LL3prFgvzazd5nZLooLtqluoyT9K9UpSTKzR6hz\nN7CrXPr3ZjN7mZltKemhfepcxd1/pEhC9Dt3H5f00mnWub+kk83sIjO7SNGi8O6p1Glmp6R/r655\nLDazCTN7RU2dd6RuSWsrLmrrrOruk3cxPX4t6rqxNPmOTq1ZVm0RKdZ3Ryr/XUUr3yslLTKzcte+\nJp/7Penff5jZYyTdr2hFqzrLzOq+4zqrmtnjiydmtpGie2zPuhscl7e7+/fd/RZ3/3PxmOZ25n7v\nH8pcJklnmtk7zWw9M1uneNSUy/3cCw/2+X9Zk+/d1N1K9xd1d38t3GlmH1a0BJ2VziUPqasvtZYW\nT7bvU58k/c3M1lAEPyea2ZfU6UZddrmZfdfMXmdmr0qPXfrUeXe6k3+VmX3GzN7Tb/3ufr2kj0r6\noKKF44tmdl1qrZnKe3+kus8B96VldRaa2VFmNmZmO5jZUZIurynX5JyUexxlf0aS7nX3eyTJzFb2\naPWv+229KX3XMrMVzex9qm8xXGhmP1T89p1rZmuq/34sd/9fRYD/gLsfq2jFqWpyrN/seS26Tepc\nX9LNpee3SNpgmnXm7nPzvdSNMe3T/Xqx5Z5rcq8/pPh9u72yrO77zK6zwXGZe913m7uf4e43uPuN\nxaPP+8EMojslclVPTn9R/cnpF2b2UEVXgssl3a3o9lCneoFxq+ovMKo/sjer/49sbtn9FRe7+ypa\n7tZUtNxNdRsl6QhJp0t6pJl9StKrFSfKqv8ws7UlvTf9zZqSDuhTZ9eJWTG3Yt2JObtOd/+FmW2q\n4X38c+rcL/27k+o9TNJJkv4nPf9GutD+qKJL1OqSPtbnb28zsycUT8zs1ZL+r6bc0O8ovd8nS1o7\n/bgV3fTWVGkcXan8yxVd5J6ouBO5tbvfatHt9JeKu9xSs+/yrHRsHKa4Ay7FcVK1v6QPm9m/1Llg\nda8fT3OApPPN7Lfp+QJFi2FVk+PyfDM7TNFV6Z/FQne/YhrbOfB7N7MXKy46H5MCjeKCdw3VB+5S\nfD+uGBdXtmHlee7nLkUXo0vNrOhO+QpJx9SUO6TB9/4DxcX0SanO3SR9v6bcbpJer+gOd7PFmNrP\n1pTbW9KxKYiQpNsVLSh1XqE4dx+g6Ha5pqLLYNVaqdyLKsur3dWk6Bo4T9K7Ur2PlVS9+JNFN7U9\nFV0ez1N017zCzB6taN3+71Lx3RRdgcvv/bCadR8v6bLK9/PNmnKS9A5J71Sc46U4P3y1plyTc1Lu\ncZT1GSW/T3X+j6TzzOxvkm7s836+KOkxkv4o6Yfp/VXtrRjf9Rt3v9vMHqb++0dXsKn4vawLNpsc\n65eb2XfT+/lXqWx1X2pS54/UewydN83tzD3eFqYbAEWX9d1VfzNAanaOz7n+kKQlZra7pPlm9sT0\nN3X7XFadDY/L3Ou+g83saMX3NOg7xwxjigFkMbOPKy5Wni/pK2nxN1KrV7+/2VDSml6TGCC9vrri\nJFEkBFlT0Uf7L5Vy+yhOLE+TdJzSj6y7/1dNndllc+RuY6n8poqkIZL048w7koPWv43ibuva6pyY\nP+PuP59CXf2Se7jUO0h8ppjZM9y934/eoL97vKSvK8b03C7pt5J2r97hy/mOLFoDX6EINs8o/fmd\nkr7j7l0/imb2TUW3ka7kAum1F6bW0Skzs5UVGUGrd1inWtcmiu/xWnf/55Dyw47LCdUnEdhhGts4\n393vH/D65ooLz08oLqCLffPvks53979Ndd2V9Qz93M1sK0nPViexyaKaMs9294uGLSu99ipJ26en\nF7r76VN9D6U615ImW4yXOmZ2gaSjJZ3qlWyKZvYm700GskDRk+JH6WbJfHf/e029W6mTeOandd9P\nKreaopWrnIV3peq2TNWw42iKdY4pzl8/cPd/DSle/dut1H/8V91NmOIzv0UxHu6AtO6vuvuvm6y7\nUudxxSor6+8XSObUaYqeEM9V53uf9jGUue6VFcHy5PGr+IyGnWdn5Byf9uOPqHOD5VzFkIp7p1hf\n9nGZe91nZicqbgovUamVcDrfOfIQxKGxupPTVH5ARsEaZlPMrLPahasaHP21Un42Mn09XjHwfdu0\n3kskHeDuN5TKHOzuB6Uf2bqL9L1SuexMgWZ2sbtvb2Z31dQ5eQfUzN7o7idYfZY595rscqV1rC5p\nXt0FXVNmtq27/2xImfmKcS5jA8o0+YyqwXO1cE/wnO7mPlHd2TZ7AspUdjtF69N8dfa56gXyKxXB\n0O3p+dppnG3QAAAgAElEQVSSxtz9fzQNudtpZjcobq4c6+6/rL5eKrdik4tXM3uqOpkCi/Ufn15r\n/Lmnv1tBcbe5/HneVCmzyN23GLYsLd9Q0cWs6DK3iqR1i5sRfY6d0mb2ZH1cWdGqs0Dd549PlMpk\nHZel8kVCqCcrxmcV77suedROimC7uv7azIs5zOytinPiOu7+eIskJEe6+wtqyg79flK5SyW9wFMS\nJ4vW+nPdfbv0PPucZGabuvuvLLrN9ih+38zsFHd/jdVnEnXvk+jBOhlRpQhQ+mVE7fu7Ubr5soqk\nrRRjMSVpM8V4zW3r1p2ryTmpDXVaJ6nLpoqkIQMziA5ZZ9a5xvpnFS7248bXH6VtOE/Sa0rn+Icq\nblD++1TrrNTfNyg1s+skbeIEFHOO7pQYaNDJyczKF0KHa8APiCK4qNY9MItVwx/Z3LLFxe1nS+ss\nly/qa3JhdcWAslJv966hGbSmEGyepMiIVoxj2U0xYPmZpT86KP2754BtlbozBfasu/L89anO1YfU\nWYzTKrLMFfpmHzSz/5T06cqP0nvd/aPpefZ3VARdkl5vZq+vKbtv6cn9ZvaAma094C5qk8+oUWZM\n62SrW1+RcKBftjqZ2bcUg8mvVCdDo9SbLW+8fOfa3W+3yLRXG8RZZCSrBkfVjGTZ2ynp6YpsfUel\ni/BjJH27JjBfYNEVuQgm0qp7U2/b8EyBTTOSyszerRjAf6u6P8+npde3VWTJe4R1j3NaQ+o7xvxU\ndZ//HkzLnpHe3Oqp7kMU3aW/lcrtrhiLWfU9Rcv0Qkm1d+Pdffty3RmKDI07akiGRsXNolcqkiv0\nHWtlzdKov1PSNoruXHL361PQUq1z4PdTMSwLb5Nz0nsUAdTnal6TIpmSNLx7eQ/Lz4g68HejuOlk\n0dV0H09p5NONjq4utE2DzZxjvcmNrdw6S2WzMl42PCdlZRBNn1E54JKkOyT9QtIhHj0+cs81jbIK\np/XnTqXyiPLvlbv/zczWralv6HFZud7rOh4q132FSxTn7CV17wGzhyAOw2SdnJr8gJQMS2vd5Ee2\nKDvwosXdF6aWlre5e/Vivlwu+8LK3RcMWmeNVdz9g0PKDErdX/c9rOLuJ5Sef8vM3l8uUAlwy3V1\nBbrufmb697j0d2tJetDd76z5+9OVUnab2X+7e+24D3f/Wvp3vO71Pl7s7pNJLdKP0kuVxhk2uECV\nelPYd82rVlP+bklXWyQIKLqcTF6IVD+jQRoEz4X9FGnUf+buO5jZJpL+s0/ZrSQ9OeMOaN04l34p\nratpsl+j+jTZ2duZgrWvS/q6RZexEyV93iIxzie9033rWHXSZI9pQOptxZjTzRUZ2PZKFywnltZ5\nUPrvW3xAV86K/RWZ6Gq7Syu6na2RtmmN0vK/p+2ps4KXWhfd/Z9mVpdAYefKxfORZrZYveOzHpNz\ndz2d565x902GlVV0Y3y1mb3c3b9pMfaotmuoIlPdkkEBXFL+LgemUZf0z/S5lLe9bp8e9v2U3W1m\nW7n7wlTnM9QZ49PonOTu+6R/x4aU+1P6r6mm9bXPn71F0jPd/e5U9lBFMFsN4nJ+N6RoEZkMztz9\nGotu/mVNg82cY73pObbJeS53Cowmdcrd/9ciGdYDinGmV0o6sFLsB4oEJcV4vNcqrjduUQzZ2Cn3\nHO/uE5JkZoe7+1all84ws7obglLmVCqSHjCzx3lnbsUFqk+AknNc9rveK1SDuG0lXWkxNrvoZtpz\nMwAzjyAOA3l0v5sn6fvu/t2MP8n5ASkMzGLV8Ef2a+kO/50+oGteKnu/mW1gZiv5kH7tyriwMrNN\n3P3aYV1tSs4ys5e6+9kDtrE4oT/d3b9Qfs1iMtcL0v/XUfywfN/MPqRofZPqkydUg+HJKuuWW8z9\ncoxinITM7HZJb/bu8W3lH+raiUordX5GMXfVPYofx80V3T5PqCk+zyJb273pb1dRXET3q7vvZN9N\ngq7kNPX+UJXvRk5lsu39FD+gdyp+kLeQ9CHvnYT3Xne/x8yU3v+16W5snWsU6bb/1Of1wkIz+5xi\nXIMpWj76XTRs5+5PM7PF7n6wmR2u+K6qsrczXZS/VHHBsEBxc+IkxdizcxQpr6WUjdXMLF2MjJvZ\nFapPNHGPuz9gZsMyBd5gZj9QZBn9yZCA9yZFQFbLY26oC8zsWK+ZFLiPP6fg6HuSZJE0py7b591m\n9gZ1juHXqj6J0iVmtpm7L655rbyt91tknHtcxrY2SR71QcX55nx1JzGonnebfJcXmNlHFNlW/00x\nF15dL4SB309FkYW3SIa0nuK82MWaTRD9GkWXzL+b2ccUx/AhNef4ga2vNXIyog793UgWW3cijtcr\nppiYVASbnp9BcOixPoVzbJPzXG7GyyZ15iZ1eaF3d5NebKnrtFVaMhuc41c1s8e7+2/S3/XLKixF\ndsojB73p5COSLjSzouvoc1Wf5GrocdnghmOhLqMp5gBBHIZy9wfN7AOKi6Bhhv6AlAzMYmX13TJK\nm9XdPSNd0L1OcYdpmN9KusjMzlB3S0v1b3MurN6rvK42hSYZtPZQdF8q27O0rNqVszhpF4HZ5F3F\nnGC44hhJ/8/dL5Qki7Tmxyi6yE7Vv7v7ByzGaN2o6P55oaI7V9WJkn5sZsco3s9emsak8ansIyV9\nQL3d9bq6pmRciDTuFqMIgL9onUl436T6SXj/YHnZ6qS40P6lmV2m7jug1SDy3Yof6eIYPk/1me2k\n/IxkTbbzekkTiqQ85SQyp1r3hMW52VilOH/kZArcVJGJ7V2SjkkB+HeL/VrqaqW+QdKEmZ2lmgCl\nHLwXrUYltcG7Yq7BE83sy+n5H1Q/4fbrFdkHi2P74rSs6jmS9sq8672OIrvdZYrPp992NsnQ+EnF\nRerKGnBTRc2+ywMVY/KuVkyefo7iIrjqt4rsqWdrcAApz8/C22SC6I+7+ynpXPgCRbf8/1J0BS3L\nbX2V8jOi5v5u7KXIZFm0tv1U0ZIzyRqOw1R+Bs3sc2yTOpWf8bLJOSk3g+gKZvZMT9PdWCQbK7pO\nV1v4c8/xuVmFpTSVinqzBXeNtXf3H1jkJniW4rvd3+unhsk+Ls3sUZL+Q9H6v6OZPVnStu5+dGXd\nN6byXTdSMftIbIIsFl08/qy4CCwuBnpOJKm15B0qDdJWDFDvGbthQ7JYmdmepdd6xq95zANXrfPz\nirleqtt5RaXceGXdRZfC6tiBDRUXVtulRRdL2q/BHcwpScHo6xWf44Wll9aQ9IDXDPhvUPfQJCip\nXF3yhivcfcvS8wfUCYJXUam7kurHLCxx96dYpCM+1d2/b2ZXufvmfbb1xepk+zyv5o6mLFpGn59e\n38LMdpD0xj530s9T7BvvU1ws7qmY4+YDlXLFuIGBY7PMbKF3d4upXZaWX51auL4kacLdT6v7jCt/\nM6YB2erS6z08dduZitTC8GXFZ/pVxT4yLBPtsO1cw+u741bLTSkbq2VmCkwXeF+S9Hp3L8/pOK4+\nY0AkqTgv9Pu8S+UmBqx79VSm3xQlWSy6SdWt+8aasmP1Rf2CSrmNao7/nmVp+TXu/tSM7ZyxzLql\nOsfTf/uet61hFl4zu9Ldn565/ivd/enp9/Bqdz+xz3nyR5KO8O7W1337nbctIyPq0iLjWM86xzas\n87j03+yMl8PqzGXRI+VYdYZq3Km44bBE0kvd/eRS2exzvGVmFTazG1UTcLv7hun1IulOkVyuur9X\nr32yj0uLHgzHSvqIu2+WbkQsqh7//W6kunvPjVTMLII4ZBl2Illa2CykR2+4/u3U3S1H3smWl5Xh\nLJV9nKQNFYO5P6jOiflOSVd5ZYyPme2h+vdd13J1qeIi/Ttp0W6S3u3uz6yU+4IigCl30bxXqdWs\n+uOQI138vCLVs43ih+TM6rpL5RdIeqK7n2eRlGCFajBQBE1mdpWkLT1aZBfXtUwUQWj5dTO73N2f\nUSl3sTrjBnZSGjdQDWTM7FeKsRrlbjFnu3tPF+J0IfJoRbfTzRT7yPnlgM+ajWMayqaZjdWiu9HK\nXpPG3sxOcPc3DluWljfKyGoxQXExlq7ftv24elHcZ5kpEqDspuj28wtFS1x5PqSi7K7li7J+y3JY\nd7KlnjG9Xmk9msJn1Lf7cKXcAg1J3V+9OZOW9bsZ8RnF9Ck9N1SmyqJl6yD1vvehXbRr6srKwlsq\nf4hiDNWwboqyaAH8o6R/U3SVu1fSpdWbUBbzW56ozvjpPyhuLNWm7k83FzZQd8bNuikBXq5Omv0L\nPHVhrJRp/Fn225esN/NyF6/cxE1/M/AcO5U6czU8JzXKsmqR0dfrzoWlMsepc47fXDHW7Pw+x9HQ\nrMI5LJLg7DMb1z7F91YOROtuejS5kYqZRXdKZPHM5B3W6R5Q+fOuzEdNs1jlds+QYuLOnjvKNduZ\nVad1p94u/8jVtfIMyxSYm+FMHn3Vf6foGpFj61KdRVKKK1TT/VAZSVCSp6c6iwQRRQtFcQJv/OPg\n7gemi8A7UrB1t6SX15W1UtpxSY9XdHc5Up2WuUKTCdmLO7I3W2Rg/JOkh9aUyx3P06RbzJsVP+w3\nuPs/rGYSXm82jkk2PE32oAQ5/epcRTEmabJlwMzqWtOrd2PnKxKt1MnqsmYZ4zDT9q2qyBBZviBc\nUzERctVvFcfkdyW93we3hH1Ika1u4DLLy7zYLzFTP7mfUZPuwwOPIYvuhk+WtLaZ7aLOMb6m+neL\n+n+S3mdDuvVZjJmr6nfePlrRXfAKdZ87q+9n6HnbBySZSAF9VZPu7bsqbgQc5pHhdT1JPefOFKw9\n0zJaX83sk4rWqhvUPR5uh0q5QxXn+RMV39O+Zradl5I/JVmfZapz2L5UdNc3RZBZzNf4UMXvU91N\n3GHn2MZ1Wv4UGE3OSVlZVlM9k9l6i13IK9l6k6yJ1jOuFepalLt4alFOAdw8RWvZxYPeR6q3yXF5\nV3oPxd8+S5GZs+o+d/+zmc2zSBRzvpl9cdi2YPoI4pDFYsLJ90jaIJ00nqjIEnZWpejWpf+vrMjY\n9rBKmWoWq8nVqP5i50TFBdjLVOqe0WdTT1XKllhyinpP5Ll1Nkm9PTBToGdmOCvLuEgv6n5X5e/W\nVmUMozVLgtJoO3Ol/eidih/vfRQXD0+SVN2PpMy044qWvXsUAVUx2Xe/jKj/kT6b9yomMV0z/V1V\n1rgBj3EIGytvsm1XXBy9THEHeDXVXyjnjmOShqTJ9pQgx5t1rzxekTziS9LkuNYTFFkqZWYfVgQ2\nq5hZuVX0PkUGyjq5mfVyxmG+TTHe59HqTs5yp+LzqHqTV+aJMrPtyxc8Ft12XyLpMRZdocpTB9SN\noxqa4c1TYiZJB1fPCRYtnFW5n9Ehiq7QXXe9+5QddgxtrGhpXkvdmQrvVByfPTw/K2w5uCnmtuuX\nJfR2d+85B9XI/i0ws0dI+nPx2VtMLfJhVS70G7wfKcaGnu3u96bPfTNJdd36D1InUPEhF/67SXq8\nD+/y91JFoqti8vLjFEFANYjL/SylIftScfPWzL4h6XR3Pyc9f7EiAKoz8Bw7xToH/g5P8ZyUlWXV\nMrL1Wuplo86Nz43Sd97vmiYnq3D2FCkeeQu+os4N1kGaHJfvVSQY2sjMLlGMwa7LwtvkRipmkrvz\n4DH0obhI/KDipCfFBehVmX97RZ/lu2YuuyL9u7i07PJKmU0VJ6MbFMkyXpX+3bPY5qZ1pmVXlssp\nxttd2uf9nCLp0ZmfyXaKi+M3FY8+5RYqJi5dpLhI3EvSoRn1ryjp+sqyGxWtEtXHjZJ+W1PH2pI+\nn7ZhoeKO7VpztR9Juiz9uyj9O7/8fdWUX1Nxw+BhikmDp7Od2ygu4NdXpJE+TdKzBnyXuyuS0Az6\nLv9LkR3y2vR8nT773Fjdo9/+UbMfX1lTbmPFDY5flb73G/rU+cvMZUP3w1LZQxTjR4aVW1SzrN/5\n492Z6+75++p6FC2keyqyH+5Reuwi6aH96lSMixq2nRdI2rCyb/Xsxw0+o+I7v0rRxVd19aXlWceQ\nIllBk+Pjoel9PLd4ZP7dL/osP1TSYYqAYsviMeBzH/RbsIti/Pb/KS7Ud1a0/vxPXZ1N3k/6zOdL\neoIiWc9hks6pKfc+xQXwexXJYn4u6Zg+dZ6umPx92Ge3WNLDSs8f1ue7zPosm+xLitaqocsa7kPZ\ndSrzd1jNzknPkvRDRfBXfFfvqSl3dWXdq0u6qFLmG+nfCUnnVx81dWZfKzR4P59VBFg2hb+tPS5L\nn/VT0+Mhfcqsrrg+eYjiPLpveV/lMXsPWuKQ6/HuvquZvVaSPLoK9BSyzuBaKTI4PUP95wbK6rqk\nvC5wTe8o53arG5p62zrjjVZXRqbAnK4UZZ4xl411j3map+j60fU5evP57I5RZIt7jeKO4hsVLRC7\nDPqjIbL2o+QCy0g7bmZvU9yd/ae6u6GVu/CWu+4Wd8gnn3tvptPL0n/vVPwo1Wr4XT7T4273orSO\nv1pNxjpv1mqWmyZ7aMtRyRVmtq27/0ya7EJTNx3BWWa2urvfZWZvVHQj+qLXdwMd2GUtnTek+M6/\npu5W4q4kHCW3WEqYYjXp3q0zMfcjbcjE3B4JUa4ysxPTa8WUB9d6fUbDJpkXP6Vo/T5C0d3zxarf\np3K79TW56511DEnaxcyWKGPqD8ucULnS1bX4Lagdb6RORr1qCv5ql+2c8/bBihsuv0771aWSXuk1\n48eavJ/kQY8uz7soEpccURzPZe7+2co6DlMEDHU+JWmRmV2jwRlm/1NxbE6k589T75xmUv5nKeXv\nS38ys4+qO+v0H+vejGUmzmpSp/KnwGhyTsrNsjo0W68372WTm1VYUnd3ztI6q626b1f0lnrAzO7t\nFOvp5px9XFpnrH1x7tzSYrLvrt8373QXfkBx0xNzhCAOuf5p0S9d0uSJuq7b2OHqBHH3K1p5di0X\nmELXpUOGdYHzyAL2vfLF5xC53epyUm+foZjI9UJ1X0A/R3E3uCp3gmZpyEV66ta6rrrHPN2fytSt\nu3xi7lI9MSsCrnLANm6RPGQ6cvcjKT/t+PslPdXr0ykXyhPQHizp4+p8jj2fRQqKvVLm74qkGF/z\nzviwJt/lv9KFf7GOR6g0Bsaap/2W8tNkN5mz6xmSLjaz36ft2UDSdRZzIrl3EsYcKWlzM9tccfFw\ntCJ4fV7Nxg/rslY+b5h6x2HW+Zi7n2z9071PZWLu7RXd44qLvg3MbA+vZHNUBFyrKi7+iwxve9RV\n6O7nmtk7FGPdbpO0hbvfXFMut1tfk+7DucfQi9z9/ZY39UfuhMrl6U+K34I3121kg4vfnPP2/Z4S\niLj7QjO7tl8AlzSZIPpfqVvmm9S5Wdhv6oCy1VQ/XlOKY+ZQxZyPfcdCuvu3zewCdYKzD/bZj8Yy\ntqeQuy+9TnFMnp6e/zQtq3OSoltz8duxm+KmTDV5VZM6c6fAyD4nSVrP3f+tz/rKzrRIPHOYOvv0\nN/oVtgHJzUrGM9Zb1De0O2daR+75I/u4VPdY+5UV59mesfYW4/YOVVyLTP5m9vnNwkwadVMgj3Y8\nJL1IcUf8NsVJ+neSdphiXdWuS3umR0/XJcUFWE8XhwF1H6b4IXqIoj/5nxVZkmbzszlb0mY1yzdT\nZF6sLm/S7XKB4gS+luLE/zlFprkprTu99mXFBdARigu6GxTp/qvlfi7pOaXnz1Zc6MzZfqS4UN5k\nSJ0/lLRag23o6bJXU+ZLaft2UnTHOlFxgfAVSSdM8bt8g+IC5I+Ku+/Xq6b78Czto5ekY+l0RcC3\ni2LerH77XN9H9XNUXIi9Jf2/X5fCeYqW3I+n5xtI2maa76noYnWopN37fbflbc6o8wrFWN/i+cb9\n3lODOj+muEDfVhFIXafIaFpXdkrdFGdg/yi6Nx8t6cXp//26OV9efP6KzKVSTXfbzPW+Mf37XsVF\nd/Go7dqWWecfSnW8t/K8rrtc9vtRjGk9QtLr0vONJB1YU+7q0mOJ4nxX2/1XA7qyVcplH0OKMYMf\nUNys+njxNwPqnsmu6HXdMbOGXszAftzknPQZxbylTepfSQOGFChaFS9RTM1S/MYeMc33NLQ7Z9P9\nYxrbsrZisvvq8t9I2nQuvmMe3Q9a4pDF3X+Y7twX2RL39ZqWDzN7uOIEOpnZTtIn3P0vpbomuy55\nfVel8nqbTOAtZd5RTl2bqi0tdyh+0L9XKlcM/F2guAgu0oOXuzKs6+6La7Z9scX8VUVdjbpdpoU3\nppa49SX9t+LCuzwAPmvdldeGJkFJ3i7peDNbKz3/m/q0NuTK3Y/Sdu2sCMpXkrTAzLZQJImofk4H\nSvqZmf1M3RPB7qup2867px04wzrplpeUlmd3i3H3b5nZQnWya77cYzB8Y6lVrB/33ukVmrQc3ZjW\nMSyF/Z0WCQXeIOk5qZWxX6vEVxWtDM9XJHW5Ky0r0o6/IX0+Wen4kz+a2dcV6d4PTcfqvJpy/zCz\nzyovu+18d7+u9J6vt8hwp7Sd1RbastrvXXFhvLW736PYT3+guHnSlcxnWLe+qbTUFq2nle29Q9Gi\nfEjpvHymmV2rSJn/jvTd98ztmWRN0mz1WfXuUFyU3pqe98vg2dUCa/WZjAvVY/0odbe8Vp9XZU86\n7e5LJL279PwGxU2EqnKX/vsl3SKpLimTFNlf/1Nxg6c8mXN1ioHiGNpBNcdQIbflJpUd2hU9lTu/\n5s/7HUO1ibOKbnyephDIqTOdD3rKqP95ock5KTfLam62XimzZ4ZlJixLhnbnTAaeY0vrzjku+/mH\n6jOS3jzV3zJMD0EcslhnrNuflFIDp4v733n3nGXfUbS0FOmqX68IEF5YU+0zLbJ4LdDg+WwuMrMv\nqzOBd3ECr5unrKjnZYrWpTvMrO6EurIii98pqb5XKZI9bG5mO7j7/qnc9yTdruiOd69U271r7Zr6\ny+spNO12KYsJSwd178pd9yC1J2Z3v1LSZpYxZ1dDKykCwvmSnpz62P+0pty4ogvO+Wn9i6xmughF\n9rEfKe56P6jBXfByrWalNP8W8/YVY57KQfR4w3qvV3Tnm6/IWrdBTXCUY6fhRTo8c4yflJV2vLCb\n4vje291vNrMNFF0a6wwbD1h8trnp+KW4OH2xhqR7V7PstgvN7Ch1xunsLuny0uvPUrTsfFudC+O+\n3XIlyd33N7NVzOxJ7n5d2qfqunEN7NbnzbIoFn6gCCJOStv5WkXgdIti7MpOqe4DLcZt3e5Dpv5w\n9yKD4LjF+Kw103qq9la0Pp6f1v08RUvnhmb2CXc/3lMGT3cfH/I+ypmMqwF01+eeUVf3H+e/n6wp\ndNKCG2v+9meK1pGqLRXvoTqdTHUMW9aYWsUNqKdZzNN2sJkd3u/9KK8relGuMCyj4W6K91OdaqVY\nXnxWOXX2Ox/0O8dnn5MaHE8Ds/VWXCNpPcV10iADswpXlLtzFmOT67pz5u4fQ4/LoqBljLVPLjez\n7ypuhJRvpJ5WUxYzqUmzHY/l96HoWnefOpkK/6W4W3yDSl0SVJ9x6uo+dV6nuAhbV9LDi0dNuQll\nZHxKZQ+VdK2ia8yKirufdVmsLlXcdS+ez0/vcb6kXw16PzV1fUfSW2uW76OYVLh4PpWujwO7d+Wu\nu/LamaXH2Yrg9dOl12e8i1Op7k8r7nKfU96OPmUvTf8uKi2r66qT0z3yLkUAc6fiQuHO0uPvNeVf\noujuO5EeNymCgNUk7T/F9/5uRffeX6rU3Wo6n2eqd4GkF6b/ryppjZoyWyu6Ui4qrbtfRsPF6Vgs\nuibtoD6Z9Rps46WKu81FnY+ofm9q3nX6aMX4svKyg2vKZWWiTctXTvv5aelxgKSVSq/PV5yzjk+f\n5SGSnjJkO3dWnOtuTM+3kHRGTblG3RQV57YNikefMnXdS4vv4GpJL0j/L7L5Fpl9XyVplwHrXkER\n5G+gCPJ71q/o5rxu6fm6adnDVMkYrJjD7sx0fNymuHm20YD1ryFp9ekeO6X6Hqo4D2+paE3pl83x\n4aXHYxUt3J/MXMfvp7mNQ4+htLzISPpzxTi8lSX9uk+djbqiV/72F5Xn2yjGmRXP90zf6RHKzFRY\nrXO2H8rovlx3DPY7LhW/Fbenz7X4fas71nOzCs+TtH3p+cqS1p7m/tHkuHyeOhmSny1p/T7rPk6R\nPKvrMZff5fL6oCUOuf6kmHR3iSSZ2ZMV3bI+oLjYOTeV+2Hq/lh0z3uN+mflyp3PJmsCb2nyjnLO\nZNJrK7o13p6er64YC3C/dTI7SdIlZraZ13RZLNlf0ulmtrs6d8q2UrQ4lee9adz1UUO6dzVYd1mR\nBMUVAc1N7v770utZXZym6JWKoLRfMpOyJel9zbdI4LKvYrxB1fdTt6Bqd6S/lv7fqBXD3c+x7vnf\nrvNO95kvTKVrm+K7epKXuhZPl+VPiH6iIu15OXlCP1kTt1qzwexHKILIR5rZpxSJRT5aLuDNu07v\nKGlrMzvc3Yu5unZWJylKITcTrdJ3fLikw1P3r/XL+6pHr4PvK/a5lRSJGC4ws3F3r5ujTspvUc7t\nppg92bekFczsme5+afrbbdTpcnq/GsxFVVr/uxWf8a3qzsj6tErR9d39ltLzW9Oyv6QubGVZyTAs\nMhMerzT3qJndJmkPd7+mZtuzWOZk25LkvS1WX7D+CYKabENO9sGhx1ByVmbLjZTZFd3yMhp+TZ1J\n5J+raEV+l+KmxddUSSaUU6eZfdDdP92nO+3kdprZxe6+fZ/zcu05aVj35ZLcbL1Sfs+MrKzCXpn/\nLZ2f+nVzzt0/mhyXz1MEY5PXB2b2Vnevzr13lLtfVF5gkXAKs8zcp3tNhuWBmS1x96fULbNIef8E\ndU6eq6nzYzhP0t3u3jMmwcwOVdw5Ok0DxgKY2RXuvmVl2UJ3r07gXc28OBl0eCU7lJm9WXGCK7ol\nPk+RbOIkSePu/v5U7lfpvf1W3WOeNqvUZ4of/aemdS5x959Uyvza3Z9Q3eZBr5nZsYoLpXL3rnnu\nvmp+scwAACAASURBVHeTddfUu57iDuSDirufPVnOZoOZfV+RzOPOjLKrKr6jF6VF5yruet9bKXej\n6rO59QuMc7d1O0U30/nqsx81rO98xZjNgeNAG9Z5ldJkzu6+RVp2tbs/rVLuYnffPrPOHymC7f9U\ntDjcKukZ7r5dpdxvFAk6+o6FMLP1iwsAM9tUneDyx4rsp9VxYZ9XjGEpuk5Lqh0fpNRtaEwRoN6k\n6I54WfE5lMrtpOjCvL46GQ3H3f2MmjovUAQ08xUXardJutjdDyiVWVkx8fJrFa2gZyhaKvulXL/U\n3Z9pZotK39Hi6jmk8jdjaTt/4JVJoM1sseJCs2uC5vI5oVR2a8Vd8eImxp2KTHRLFHPSnVy8p5rj\n6mF1NxzS977NsJsRZvZVRYB5sjpd1v+guJlwlrvvUCrb83mY2VXuvnll2c8kfdjdz0/PxyR9qrpv\nNmFm1yu6FA6bbLs8rEDqBB7vKLazT7BR2LPP72DtGDZ378kYWHMM/b3ffpfKr6xo1b29z+uXK7JC\ndnVFL90UKcrdqN6MhgeXL9zL31cKPG7z1LW1z3eZU+dO7n6mme2ZFnX9tle3swmLKR2K7stPt9R9\n2VP3WuuMO56v6OrYla3X3TedxroXKLo0r6ho7V9T0lc9ZVWtlP2solX1v33IBXt1/6g7Nzc8Lm9V\nJynPT9KyyfNYqVzdNVrPMsw8gjhkMbOTFQNqv6M48HdVNNe/QZEpaWszmyfpsZ45xsdi/EHdxfcO\n6fVNFXcnD1OcYIqgbE1J768GlelvvlyqczIlrrv3pBQ3s0crLoBdEcj09GNPJ9seXjPmYRgz+46k\nn1TvYqU7gi90991q/mYlxd3M4gL8QsXJPqclq992vEWRsez8tGhMkXzm6Eq5RypaeRaoe8xiz8Vi\ng3WfpshO+mN1B8XVO7/zFRepdXMbzTrrM/+bu7+77x8Nr/MYRXfYs9V91zu35amuzsvcfZvihzV9\nblfUXBC/SNG68SMNGbNgZqspBtPPU9w0WEvSidWL9pzA0Myuk7Sju/+2snxvSR/1yliiYeeEStni\nPZviDvgLFJlCa1vpK397gLt/vmb5lemC7i2Ku9MHlYNiMztB0eJ1jqK78qAEM0Wdxyj29wMVLU37\n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\nTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "large_hubs_idx = np.where(N_k>1000)[0]\n", + "print len(large_hubs_idx)\n", + "labs, counts = np.unique(Y[large_hubs_idx], return_counts=True)\n", + "\n", + "plt.figure(figsize=(15, 5))\n", + "plt.bar(range(len(labs)), counts, align='center');\n", + "plt.xticks(range(len(labs)), labs, rotation=90);\n", + "plt.ylabel('Count')\n", + "plt.xlabel('Country origins for recordings identified as large hubs')" + ] + }, + { + "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.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff -r 4aa0763bf8d8 -r 1d9c96974c3e notebooks/results_classification.ipynb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notebooks/results_classification.ipynb Mon Oct 02 19:00:59 2017 +0100 @@ -0,0 +1,1078 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import pickle \n", + "\n", + "%load_ext autoreload\n", + "%autoreload 2\n", + "\n", + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import sys\n", + "sys.path.append('../')\n", + "import scripts.map_and_average as mapper\n", + "import scripts.classification as classification" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Feature learning and write output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "print \"mapping...\"\n", + "data_list, pcadata_list, ldadata_list, nmfdata_list, ssnmfdata_list, classlabs, audiolabs = mapper.map_and_average_frames(min_variance=0.99)\n", + "mapper.write_output(data_list, pcadata_list, ldadata_list, nmfdata_list, ssnmfdata_list, classlabs, audiolabs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Classification" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/homes/mp305/anaconda/lib/python2.7/site-packages/sklearn/metrics/classification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n", + " 'precision', 'predicted', average, warn_for)\n", + "/homes/mp305/anaconda/lib/python2.7/site-packages/sklearn/discriminant_analysis.py:455: UserWarning: The priors do not sum to 1. Renormalizing\n", + " UserWarning)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "KNN LDA 0.151978449974\n", + "LDA LDA 0.320669835863\n", + "SVM LDA 0.0231101788399\n", + "RF LDA 0.0742913265128\n", + "KNN LDA 0.0547390436205\n", + "LDA LDA 0.150312531138\n", + "SVM LDA 0.0787628988868\n", + "RF LDA 0.0427708629723\n", + "KNN LDA 0.0232330458268\n", + "LDA LDA 0.0702474072041\n", + "SVM LDA 0.050068706152\n", + "RF LDA 0.0193967985786\n", + "KNN LDA 0.281733731607\n", + "LDA LDA 0.198582742899\n", + "SVM LDA 0.296355560166\n", + "RF LDA 0.132752660164\n", + "KNN LDA 0.0857923493684\n", + "LDA LDA 0.107355289483\n", + "SVM LDA 0.0896098014444\n", + "RF LDA 0.0419252843345\n", + "KNN PCA 0.140643930221\n", + "LDA PCA 0.175099072208\n", + "SVM PCA 0.0149273059799\n", + "RF PCA 0.044347638128\n", + "KNN PCA 0.052516908106\n", + "LDA PCA 0.055028942176\n", + "SVM PCA 0.0479512645907\n", + "RF PCA 0.0325567872284\n", + "KNN PCA 0.0268729640269\n", + "LDA PCA 0.0459303318699\n", + "SVM PCA 0.0386730267598\n", + "RF PCA 0.0184694543728\n", + "KNN PCA 0.220850433533\n", + "LDA PCA 0.161502657527\n", + "SVM PCA 0.245790916558\n", + "RF PCA 0.131939188698\n", + "KNN PCA 0.0814272808267\n", + "LDA PCA 0.0839732813486\n", + "SVM PCA 0.0918638232782\n", + "RF PCA 0.0449817232296\n", + "KNN NMF 0.114298949339\n", + "LDA NMF 0.178244078869\n", + "SVM NMF 0.0164055663008\n", + "RF NMF 0.0588656307204\n", + "KNN NMF 0.043057794756\n", + "LDA NMF 0.0586662842996\n", + "SVM NMF 0.00781273342686\n", + "RF NMF 0.0285937566916\n", + "KNN NMF 0.0285281454673\n", + "LDA NMF 0.0463659955869\n", + "SVM NMF 0.00768887594564\n", + "RF NMF 0.0206293416635\n", + "KNN NMF 0.177819886656\n", + "LDA NMF 0.166221515627\n", + "SVM NMF 0.010788613595\n", + "RF NMF 0.111500698621\n", + "KNN NMF 0.0795454671166\n", + "LDA NMF 0.0856428557896\n", + "SVM NMF 0.0116920633048\n", + "RF NMF 0.0421056105664\n", + "KNN SSNMF 0.14322692821\n", + "LDA SSNMF 0.18320247367\n", + "SVM SSNMF 0.0205784326384\n", + "RF SSNMF 0.0438349321113\n", + "KNN SSNMF 0.0431300683181\n", + "LDA SSNMF 0.0533449581285\n", + "SVM SSNMF 0.0106542141335\n", + "RF SSNMF 0.0272971462205\n", + "KNN SSNMF 0.0152235481009\n", + "LDA SSNMF 0.038872838043\n", + "SVM SSNMF 0.00536127803533\n", + "RF SSNMF 0.0189951953248\n", + "KNN SSNMF 0.227101074174\n", + "LDA SSNMF 0.165382484171\n", + "SVM SSNMF 0.0184921176111\n", + "RF SSNMF 0.105334465578\n", + "KNN SSNMF 0.0715413500709\n", + "LDA SSNMF 0.0819764377219\n", + "SVM SSNMF 0.0138822224913\n", + "RF SSNMF 0.035838117053\n", + "KNN NA 0.140075287804\n", + "LDA NA 0.176953549195\n", + "SVM NA 0.0149485545637\n", + "RF NA 0.0891679877647\n", + "KNN NA 0.0515315452955\n", + "LDA NA 0.0599453579616\n", + "SVM NA 0.0468615478392\n", + "RF NA 0.0440373525097\n", + "KNN NA 0.0273364752119\n", + "LDA NA 0.0378819151174\n", + "SVM NA 0.038290667129\n", + "RF NA 0.0256534114754\n", + "KNN NA 0.221769305159\n", + "LDA NA 0.191217962613\n", + "SVM NA 0.250268813953\n", + "RF NA 0.118133604659\n", + "KNN NA 0.0814734970192\n", + "LDA NA 0.0839348156722\n", + "SVM NA 0.0881235182136\n", + "RF NA 0.0532974158539\n" + ] + } + ], + "source": [ + "df_results = classification.classify_for_filenames(file_list=mapper.OUTPUT_FILES)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Sort results by accuracy of all features ('All' - Column 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\\begin{tabular}{llrrrrr}\n", + "\\toprule\n", + " 0 & 1 & 2 & 3 & 4 & 5 & 6 \\\\\n", + "\\midrule\n", + " LDA & LDA & 0.320670 & 0.150313 & 0.070247 & 0.198583 & 0.107355 \\\\\n", + " SSNMF & LDA & 0.183202 & 0.053345 & 0.038873 & 0.165382 & 0.081976 \\\\\n", + " NMF & LDA & 0.178244 & 0.058666 & 0.046366 & 0.166222 & 0.085643 \\\\\n", + " NA & LDA & 0.176954 & 0.059945 & 0.037882 & 0.191218 & 0.083935 \\\\\n", + " PCA & LDA & 0.175099 & 0.055029 & 0.045930 & 0.161503 & 0.083973 \\\\\n", + " LDA & KNN & 0.151978 & 0.054739 & 0.023233 & 0.281734 & 0.085792 \\\\\n", + " SSNMF & KNN & 0.143227 & 0.043130 & 0.015224 & 0.227101 & 0.071541 \\\\\n", + " PCA & KNN & 0.140644 & 0.052517 & 0.026873 & 0.220850 & 0.081427 \\\\\n", + " NA & KNN & 0.140075 & 0.051532 & 0.027336 & 0.221769 & 0.081473 \\\\\n", + " NMF & KNN & 0.114299 & 0.043058 & 0.028528 & 0.177820 & 0.079545 \\\\\n", + " NA & RF & 0.084140 & 0.045801 & 0.022834 & 0.118752 & 0.052336 \\\\\n", + " LDA & RF & 0.075053 & 0.040452 & 0.014805 & 0.133543 & 0.052025 \\\\\n", + " NMF & RF & 0.065347 & 0.036663 & 0.024069 & 0.121136 & 0.049071 \\\\\n", + " PCA & RF & 0.053220 & 0.029322 & 0.017777 & 0.113936 & 0.046819 \\\\\n", + " SSNMF & RF & 0.031423 & 0.021354 & 0.015184 & 0.100996 & 0.045024 \\\\\n", + " LDA & SVM & 0.023110 & 0.078763 & 0.050069 & 0.296356 & 0.089610 \\\\\n", + " SSNMF & SVM & 0.020578 & 0.010654 & 0.005361 & 0.018492 & 0.013882 \\\\\n", + " NMF & SVM & 0.016406 & 0.007813 & 0.007689 & 0.010789 & 0.011692 \\\\\n", + " NA & SVM & 0.014949 & 0.046862 & 0.038291 & 0.250269 & 0.088124 \\\\\n", + " PCA & SVM & 0.014927 & 0.047951 & 0.038673 & 0.245791 & 0.091864 \\\\\n", + "\\bottomrule\n", + "\\end{tabular}\n", + "\n" + ] + } + ], + "source": [ + "df_results_sorted = df_results.sort_values(2, ascending=False, inplace=False)\n", + "df_results_sorted.head()\n", + "print df_results_sorted.to_latex(index=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Confusion matrix" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "According to results above, best classifier = LDA and best transformation = LDA." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "accuracy, CF, labels = classification.confusion_matrix_for_dataset(df_results, classifier='LDA', filename=mapper.OUTPUT_FILES[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.320669835863\n" + ] + } + ], + "source": [ + "print accuracy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use the figure functionality to zoom in the confusion matrix." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " fig.waiting = false;\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " this.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width);\n", + " canvas.attr('height', height);\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('