├── 1_Introduction ├── 1_MachineLearningIntroduction.pdf └── README.md ├── 2_LinearRegression_SVM ├── .ipynb_checkpoints │ └── 2_airbnb_frankfurt-checkpoint.ipynb ├── 2_LinearRegression_SVM.pdf ├── 2_airbnb_frankfurt.ipynb ├── README.md └── datasets │ ├── .ipynb_checkpoints │ └── tomslee_airbnb_frankfurt_1360_2017-06-22-checkpoint.csv │ └── tomslee_airbnb_frankfurt_1360_2017-06-22.csv ├── 3_DecisionTrees-RandomForests ├── 3_DecisionTrees-RandomForests.pdf ├── 3_bank.ipynb ├── README.md ├── data │ └── bank │ │ ├── bank-full.csv │ │ ├── bank-names.txt │ │ └── bank.csv └── img │ ├── bank_tree.jpeg │ └── correlation_not_causation.jpg ├── 4_NN-DeepLearning ├── 4_GANs_Intro.pdf ├── 4_HandWrittenRecognition-CNN.ipynb ├── 4_NN-DeepLearning.pdf └── README.md ├── 5_UnsupervisedLearning ├── 5_UnsupervisedLearning.pdf ├── 5_Unsupervised_DowJones.ipynb ├── README.md └── data │ ├── all_stocks_5yr.csv.zip │ ├── companies.csv │ └── dow.csv ├── 6_TextMining ├── 6_TextMining-ESA-News.ipynb ├── 6_TextMining.pdf ├── README.md └── data │ └── esa_news_all.hdf ├── README.md ├── iartificial_net ├── IArtificial_net.pdf └── IArtificial_net_print.pdf └── img ├── 2018-MachineLearning-Lectures-ESA.JPG └── 2018-MachineLearning-Lectures-ESA_2.JPG /1_Introduction/1_MachineLearningIntroduction.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/c9ff757b91837f6af31e72f3540534ad2b844d90/1_Introduction/1_MachineLearningIntroduction.pdf -------------------------------------------------------------------------------- /1_Introduction/README.md: -------------------------------------------------------------------------------- 1 | # Machine Learning Introduction 2 | Available Resources: 3 | * [video](https://www.youtube.com/watch?v=FXYPDyoR1o0&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) 4 | * [slides](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/1_Introduction/1_MachineLearningIntroduction.pdf) 5 | -------------------------------------------------------------------------------- /2_LinearRegression_SVM/2_LinearRegression_SVM.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/c9ff757b91837f6af31e72f3540534ad2b844d90/2_LinearRegression_SVM/2_LinearRegression_SVM.pdf -------------------------------------------------------------------------------- /2_LinearRegression_SVM/README.md: -------------------------------------------------------------------------------- 1 | # Linear Regression and Support Vector Machines (SVMs) 2 | Available Resources: 3 | * Presentation 4 | * [video](https://www.youtube.com/watch?v=_5lsmWpA5IU&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) 5 | * [slides](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/2_LinearRegression_SVM/2_LinearRegression_SVM.pdf) 6 | * Hands-on 7 | * [video](https://youtu.be/9WisRGpP4p4&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) 8 | * [notebook](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/2_LinearRegression_SVM/2_airbnb_frankfurt.ipynb) 9 | -------------------------------------------------------------------------------- /3_DecisionTrees-RandomForests/3_DecisionTrees-RandomForests.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/c9ff757b91837f6af31e72f3540534ad2b844d90/3_DecisionTrees-RandomForests/3_DecisionTrees-RandomForests.pdf -------------------------------------------------------------------------------- /3_DecisionTrees-RandomForests/README.md: -------------------------------------------------------------------------------- 1 | # Decision Trees and Random Forests 2 | Available Resources: 3 | * Presentation 4 | * [video](https://youtu.be/Op4thnw-ig8&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) 5 | * [slides](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/3_DecisionTrees-RandomForests/3_DecisionTrees-RandomForests.pdf) 6 | * Hands-on 7 | * [video](https://youtu.be/HuD6myqJcFU&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) 8 | * [notebook](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/3_DecisionTrees-RandomForests/3_bank.ipynb) 9 | -------------------------------------------------------------------------------- /3_DecisionTrees-RandomForests/data/bank/bank-names.txt: -------------------------------------------------------------------------------- 1 | Citation Request: 2 | This dataset is public available for research. The details are described in [Moro et al., 2011]. 3 | Please include this citation if you plan to use this database: 4 | 5 | [Moro et al., 2011] S. Moro, R. Laureano and P. Cortez. Using Data Mining for Bank Direct Marketing: An Application of the CRISP-DM Methodology. 6 | In P. Novais et al. (Eds.), Proceedings of the European Simulation and Modelling Conference - ESM'2011, pp. 117-121, Guimarães, Portugal, October, 2011. EUROSIS. 7 | 8 | Available at: [pdf] http://hdl.handle.net/1822/14838 9 | [bib] http://www3.dsi.uminho.pt/pcortez/bib/2011-esm-1.txt 10 | 11 | 1. Title: Bank Marketing 12 | 13 | 2. Sources 14 | Created by: Paulo Cortez (Univ. Minho) and Sérgio Moro (ISCTE-IUL) @ 2012 15 | 16 | 3. Past Usage: 17 | 18 | The full dataset was described and analyzed in: 19 | 20 | S. Moro, R. Laureano and P. Cortez. Using Data Mining for Bank Direct Marketing: An Application of the CRISP-DM Methodology. 21 | In P. Novais et al. (Eds.), Proceedings of the European Simulation and Modelling Conference - ESM'2011, pp. 117-121, Guimarães, 22 | Portugal, October, 2011. EUROSIS. 23 | 24 | 4. Relevant Information: 25 | 26 | The data is related with direct marketing campaigns of a Portuguese banking institution. 27 | The marketing campaigns were based on phone calls. Often, more than one contact to the same client was required, 28 | in order to access if the product (bank term deposit) would be (or not) subscribed. 29 | 30 | There are two datasets: 31 | 1) bank-full.csv with all examples, ordered by date (from May 2008 to November 2010). 32 | 2) bank.csv with 10% of the examples (4521), randomly selected from bank-full.csv. 33 | The smallest dataset is provided to test more computationally demanding machine learning algorithms (e.g. SVM). 34 | 35 | The classification goal is to predict if the client will subscribe a term deposit (variable y). 36 | 37 | 5. Number of Instances: 45211 for bank-full.csv (4521 for bank.csv) 38 | 39 | 6. Number of Attributes: 16 + output attribute. 40 | 41 | 7. Attribute information: 42 | 43 | For more information, read [Moro et al., 2011]. 44 | 45 | Input variables: 46 | # bank client data: 47 | 1 - age (numeric) 48 | 2 - job : type of job (categorical: "admin.","unknown","unemployed","management","housemaid","entrepreneur","student", 49 | "blue-collar","self-employed","retired","technician","services") 50 | 3 - marital : marital status (categorical: "married","divorced","single"; note: "divorced" means divorced or widowed) 51 | 4 - education (categorical: "unknown","secondary","primary","tertiary") 52 | 5 - default: has credit in default? (binary: "yes","no") 53 | 6 - balance: average yearly balance, in euros (numeric) 54 | 7 - housing: has housing loan? (binary: "yes","no") 55 | 8 - loan: has personal loan? (binary: "yes","no") 56 | # related with the last contact of the current campaign: 57 | 9 - contact: contact communication type (categorical: "unknown","telephone","cellular") 58 | 10 - day: last contact day of the month (numeric) 59 | 11 - month: last contact month of year (categorical: "jan", "feb", "mar", ..., "nov", "dec") 60 | 12 - duration: last contact duration, in seconds (numeric) 61 | # other attributes: 62 | 13 - campaign: number of contacts performed during this campaign and for this client (numeric, includes last contact) 63 | 14 - pdays: number of days that passed by after the client was last contacted from a previous campaign (numeric, -1 means client was not previously contacted) 64 | 15 - previous: number of contacts performed before this campaign and for this client (numeric) 65 | 16 - poutcome: outcome of the previous marketing campaign (categorical: "unknown","other","failure","success") 66 | 67 | Output variable (desired target): 68 | 17 - y - has the client subscribed a term deposit? (binary: "yes","no") 69 | 70 | 8. Missing Attribute Values: None 71 | -------------------------------------------------------------------------------- /3_DecisionTrees-RandomForests/img/bank_tree.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/c9ff757b91837f6af31e72f3540534ad2b844d90/3_DecisionTrees-RandomForests/img/bank_tree.jpeg -------------------------------------------------------------------------------- /3_DecisionTrees-RandomForests/img/correlation_not_causation.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/c9ff757b91837f6af31e72f3540534ad2b844d90/3_DecisionTrees-RandomForests/img/correlation_not_causation.jpg -------------------------------------------------------------------------------- /4_NN-DeepLearning/4_GANs_Intro.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/c9ff757b91837f6af31e72f3540534ad2b844d90/4_NN-DeepLearning/4_GANs_Intro.pdf -------------------------------------------------------------------------------- /4_NN-DeepLearning/4_HandWrittenRecognition-CNN.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Supervised Learning (3) - Neural Networks, Deep Learning\n", 8 | "## Machine Learning Lectures by the ESA Data Analytics Team for Operations (DATO)\n", 9 | "### [José Martínez Heras](https://www.linkedin.com/in/josemartinezheras/)\n", 10 | "\n", 11 | "## Resouces\n", 12 | "This notebook is best followed when watched along to its corresponding [deep learning using convolutional neural networks for hand written recognition **video**](https://dlmultimedia.esa.int/download/public/videos/2048/03/003/4803_003_AR_EN.mp4)\n", 13 | "\n", 14 | "The tutorial about convolutional neural networks can be found in the [2018-MachineLearning-Lectures-ESA **GitHub**](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA)\n", 15 | "\n", 16 | "## Goal of today's project\n", 17 | "Classify hand written numbers. The goal is to help post offices to automatically route the mail by reading the hand written zip code. \n", 18 | "\n", 19 | "### Inspired by\n", 20 | "* https://github.com/wxs/keras-mnist-tutorial/blob/master/MNIST%20in%20Keras.ipynb\n", 21 | "* https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py" 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "metadata": { 27 | "ExecuteTime": { 28 | "end_time": "2018-03-22T09:36:44.331239Z", 29 | "start_time": "2018-03-22T09:36:44.328199Z" 30 | } 31 | }, 32 | "source": [ 33 | "## Import libraries" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 1, 39 | "metadata": { 40 | "ExecuteTime": { 41 | "end_time": "2018-03-22T11:14:06.837368Z", 42 | "start_time": "2018-03-22T11:14:03.766149Z" 43 | } 44 | }, 45 | "outputs": [ 46 | { 47 | "name": "stderr", 48 | "output_type": "stream", 49 | "text": [ 50 | "C:\\Users\\jamheras\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\h5py\\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", 51 | " from ._conv import register_converters as _register_converters\n", 52 | "Using TensorFlow backend.\n" 53 | ] 54 | } 55 | ], 56 | "source": [ 57 | "import numpy as np\n", 58 | "np.random.seed(42)\n", 59 | "\n", 60 | "%matplotlib inline\n", 61 | "import matplotlib.pyplot as plt\n", 62 | "plt.rcParams['figure.figsize'] = (7,4.5) # Make the figures a bit bigger\n", 63 | "\n", 64 | "from keras.datasets import mnist\n", 65 | "from keras.models import Sequential\n", 66 | "from keras.layers.core import Dense, Dropout, Activation, Flatten\n", 67 | "from keras.layers import Convolution2D, MaxPooling2D\n", 68 | "from keras import backend as K\n", 69 | "from keras.utils import np_utils\n", 70 | "\n", 71 | "from sklearn.dummy import DummyClassifier\n", 72 | "from sklearn.linear_model import LogisticRegression\n", 73 | "from sklearn.metrics import accuracy_score, log_loss\n", 74 | "from sklearn.svm import SVC" 75 | ] 76 | }, 77 | { 78 | "cell_type": "markdown", 79 | "metadata": {}, 80 | "source": [ 81 | "## Data\n", 82 | "The MNIST database (Modified National Institute of Standards and Technology database) is a large database of handwritten digits that is commonly used for training various image processing systems. The database is also widely used for training and testing in the field of machine learning. It was created by \"re-mixing\" the samples from NIST's original datasets. The creators felt that since NIST's training dataset was taken from American Census Bureau employees, while the testing dataset was taken from American high school students, it was not well-suited for machine learning experiments. Furthermore, the black and white images from NIST were normalized to fit into a 28x28 pixel bounding box and anti-aliased, which introduced grayscale levels.\n", 83 | "\n", 84 | "The MNIST database contains 60,000 training images and 10,000 testing images. Half of the training set and half of the test set were taken from NIST's training dataset, while the other half of the training set and the other half of the test set were taken from NIST's testing dataset. \n", 85 | "\n", 86 | "Wikipedia contributors, \"MNIST database,\" Wikipedia, The Free Encyclopedia, https://en.wikipedia.org/w/index.php?title=MNIST_database&oldid=829836442 (accessed March 22, 2018)." 87 | ] 88 | }, 89 | { 90 | "cell_type": "code", 91 | "execution_count": 2, 92 | "metadata": { 93 | "ExecuteTime": { 94 | "end_time": "2018-03-22T11:14:07.345048Z", 95 | "start_time": "2018-03-22T11:14:06.839006Z" 96 | } 97 | }, 98 | "outputs": [ 99 | { 100 | "name": "stdout", 101 | "output_type": "stream", 102 | "text": [ 103 | "Downloading data from https://s3.amazonaws.com/img-datasets/mnist.npz\n", 104 | "11493376/11490434 [==============================] - 7s 1us/step\n", 105 | "X_train original shape (60000, 28, 28)\n", 106 | "y_train original shape (60000,)\n" 107 | ] 108 | } 109 | ], 110 | "source": [ 111 | "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n", 112 | "\n", 113 | "print(\"X_train original shape\", X_train.shape)\n", 114 | "print(\"y_train original shape\", y_train.shape)" 115 | ] 116 | }, 117 | { 118 | "cell_type": "markdown", 119 | "metadata": { 120 | "ExecuteTime": { 121 | "end_time": "2018-03-22T09:46:26.531308Z", 122 | "start_time": "2018-03-22T09:46:26.528836Z" 123 | } 124 | }, 125 | "source": [ 126 | "### Exploratory Data Analysis (EDA)" 127 | ] 128 | }, 129 | { 130 | "cell_type": "code", 131 | "execution_count": 3, 132 | "metadata": { 133 | "ExecuteTime": { 134 | "end_time": "2018-03-22T11:14:09.326374Z", 135 | "start_time": "2018-03-22T11:14:07.346596Z" 136 | } 137 | }, 138 | "outputs": [ 139 | { 140 | "data": { 141 | "image/png": "iVBORw0KGgoAAAANSUhEUgAABDAAAAGrCAYAAAA2DWcxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3XmYVMXZ/vH7eRVEA7gBiiJgFBWjURQ1+nPHPSgu0dd9F/O6J2iCO1ETDaJJNBrFqLiiJG5o3DeQuAGKoCLgAkpEBRUBd7R+f0x7cqo4PdMz00t19/dzXXPx1FR3n+qZ2+6e46kqc84JAAAAAAAgZv9T6QEAAAAAAAA0hRMYAAAAAAAgepzAAAAAAAAA0eMEBgAAAAAAiB4nMAAAAAAAQPQ4gQEAAAAAAKJX9ycwzGyImd1a6XEgLuQCITKBLOQCWcgFQmQCWcgFQmSiaXVxAsPMDjazCWa2yMzmmNlDZrZ1hcYy08y+zI1lkZk9WolxILpc9DSzp8zsCzN7w8x2qsQ46l1MmUiNaTszc2Z2USXHUc9iyoWZXWhmU8xssZkNqcQY0CCyXGxlZi+a2UIzm1zp1616FUsmzKyLmY00s/fN7DMz+7eZbVHucaBBLLnIjYX3kAhElomnzGyumS0ws1fMbEAlxtEcNX8Cw8x+LenPkv4gaRVJ3SVdLamSv5w9nXPtc1+7VHAcdSvCXIyU9LKklSWdLemfZta5QmOpSxFmQmbWRtJfJL1QqTHUuwhz8aak30j6V4WOD8WVCzNbSdJoSZdKWkHSUEn3m9mK5R5LPYspE5LaSxovaVNJK0m6SdK/zKx9BcZS1yLLhcR7SMVFmIlTJXV1znWUNFDSrWbWtUJjKUhNn8Aws+UlXSDpROfc3c65z51z3zrn7nfOnZHnPv8wsw9yZ6zHmtlPUn17mNnruf/D8R8zOz33/U5m9oCZzTezT8zsGTOr6Z9tNYstF2a2jqRNJJ3vnPvSOXeXpCmS9ivF88eSYstEyiBJj0p6o4hPFwWKMRfOuZuccw9JWliCp4wCRJiLrSR96Jz7h3PuO+fcrZLmStq3+M8eWWLLhHPubefc5c65OblMDJfUVtK6pfkJIEtsuZB4D6m0SDMx2Tm3+IempDaS1ijqEy+yWv8je0tJ7STd04z7PCSpl6Qukl6SdFuq73pJxzvnOkjaQNKTue8PkjRbUmc1nEk7Sw0ByOc2a7hU51Ez26gZY0NxxJaLn0h62zmXfjN5Jfd9lEdsmZCZ9ZB0tBre6FAZ0eUCUYgtF5b7Cr+3QTPGh9aJLRMeM9tYDScw3mzG+NB6UecCFRFlJnInO75SwxW/T0ua0IzxlV2tn8BYWdK81FmlJjnnbnDOLXTOfS1piKSNcmfLJOlbSeubWUfn3KfOuZdS3+8qqUfuLNozzrl8ITlEUk9JPSQ9JekRM1uh2c8MrRFbLtpL+iz43meSOjTjOaF1YsuEJF0h6Vzn3KIWPSMUQ4y5QOXFlotnJa1mZgeZWRszO0LSWpKWa+HzQ/PFlomEmXWUdIuk3znnws8aKK1oc4GKiTITzrn+avi7Yw9Jjzjnvm/+UyufWj+B8bGkTma2dCE3NrOlzOwSM3vLzBZImpnr6pT7dz81/GJnmdkYM9sy9/1L1XBW+1Eze9vMBuc7hnPu365hmsAXzrmLJc2XtE3znxpaIbZcLJLUMfheR3F5XzlFlQkz21NSB+fcnS18PiiOqHKBaESVC+fcx2qYO/1rSR9K2k3S42r4v28oj6gykTrOspLul/R87jMnyivKXKCios1E7kTHQ5J2NbO9mvGcyq7WT2A8J+krSXsXePuD1fAhYCdJy6vhSgkpd2mmc268c26AGi7huVfSqNz3FzrnBjnnfixpT0m/NrN+BR7TaclLP1FaseXiNUk/NrP0FRcb5b6P8ogtE/0k9bWGOY8fSPpfSaeZ2X0teXJosdhygThElwvn3Bjn3GbOuZUkHaaGtQ5ebMFzQ8tElwkzWyZ33/9IOr4FzwmtF10uUHHVkIml1XAVX7Rq+gRG7lK58yRdZWZ7m9lyucsrdzezoRl36SDpazWcHVtODavDSpLMrK2ZHWJmyzvnvpW0QNJ3ub7+Zra2mVnq+9+FD25m3c3s/+Ueq52ZnaGGM2j/Lu4zR2Niy4VzbrqkSZLOz+ViH0k/lXRXMZ838ostE5LOlbSOpI1zX6MlXSfpqCI9ZRQgwlwod/x2anj/Xjr3mrFU8Z41mhJpLvrkxtBR0jBJs51zjxTvWaMxsWXCGnaw+qekLyUdHvvl4LUqtlzkbst7SAXFlgkzWy937GVz4zhU0raSxhT3mReZc67mv9Sw7sQESZ9L+kANWwdtlesbIunWXN1e0n1quHR/lqTD1XCFxNpqWPzoYUmfqiEI4yVtnbvfr9RwSc/narhk89w84/iJpMm5230s6QlJfSv986nXr1hykbttTzUsmvOlpGmSdqr0z6cev2LKRDCuEZIuqvTPp16/YspFLgsu+Dqy0j+jevyKLBcj1bB20meS7pTUpdI/n3r8iiUTkrbLPd4Xapim+sPXNpX+GdXjVyy5yN2W95AIvmLJhKTeali4c6EaljUYL2mfSv98mvqy3OABAAAAAACiVdNTSAAAAAAAQG3gBAYAAAAAAIgeJzAAAAAAAED0WnUCw8x2M7NpZvamsecwcsgFspALhMgEspALhMgEspALZCEXta/Fi3jmttyZLmlnNaxuOl7SQc651/Pdp1OnTq5nz54tOh6Kb+LEifOcc52L+ZjNzQWZiEspMiGRi2oXw2uFRC5iE0MuyERcYsiERC5iQy4QmjlzpubNm2fFflzeQ6pboa8VS7fiGJtLetM597YkmdkdkgZIyvvC0bNnT02YMKEVh0QxmdmsEjxss3JBJuJSokxI5KKqxfBaIZGL2MSQCzIRlxgyIZGL2JALhPr27Vuqh+Y9pIoV+lrRmikkq0t6L9WenfteOJCBZjbBzCbMnTu3FYdDlWgyF2SiLpELhHgPQRZeKxDitQJZyAWy8B5SB1pzAiPrsp8l5qM454Y75/o65/p27lz0K9MRnyZzQSbqErlAiPcQZOG1AiFeK5CFXCAL7yF1oDUnMGZLWiPV7ibp/dYNBzWAXCALuUCITCALuUCITCALuUAWclEHWnMCY7ykXma2ppm1lXSgpNHFGRaqGLlAFnKBEJlAFnKBEJlAFnKBLOSiDrR4EU/n3GIzO0nSI5KWknSDc+61oo0MVYlcIAu5QIhMIAu5QIhMIAu5QBZyUR9aswuJnHMPSnqwSGNBjSAXyEIuECITyEIuECITyEIukIVc1L7WTCEBAAAAAAAoC05gAAAAAACA6HECAwAAAAAARI8TGAAAAAAAIHqcwAAAAAAAANHjBAYAAAAAAIheq7ZRBZBt4sSJSf3Xv/7V67v55puT+vDDD/f6Tj755KTeZJNNSjQ6AAAAxOrUU09N6iuuuMLr22CDDbz2Aw88kNQ9evQo7cCACHAFBgAAAAAAiB4nMAAAAAAAQPQ4gQEAAAAAAKLHGhh5fPfdd0n92WefFXy/cL2DL774IqmnTZvm9V111VVJffrpp3t9I0eO9Nrt2rVL6sGDB3t9559/fsHjQ2lMmjTJa++8885JvWDBAq/PzJL6lltu8fpGjx6d1B9//HExh4ga8cQTT3jtQw45xGuPGTMmqdddd92yjAnlcdFFF3nt9Gv/999/7/U9/fTTXnu77bYr2bgAlMfChQuTetGiRV7fv/71r6T+6KOPvL5BgwYl9TLLLFOi0aE1Zs6c6bVvvfXWpP6f//H/f/PUqVO99htvvJHUrIFRO6ZPn+61v/nmm6R+5plnvL4TTjjBa4eZaYkBAwZ47TvuuMNrt23bttXHaCmuwAAAAAAAANHjBAYAAAAAAIhezU8heffdd5M6femNJD377LNJPW7cOK9v/vz5SX3XXXcVZSzdunXz2qecckpS33PPPV5fhw4dvPZGG22U1FwKXHkvvvii195vv/28dnraUXrKiOT/bsPLr9LTRp577jmvb9NNN/Xalbx0K1Zjx4712umf5z777FPu4ZTE+PHjvXbfvn0rNBKUw4gRI5L6kksu8foau0Q0fN0BEL933nnHaw8dOtRrpz8XvPrqqwU/7gcffJDU4ZaciEOnTp289rbbbpvU6enFqC3hf8c33XRTUv/jH//w+tJTRd9//32vL/w8UIzPAGHufvnLX3rtP//5z0ndsWPHVh+vObgCAwAAAAAARI8TGAAAAAAAIHqcwAAAAAAAANGruTUwXn75Za/dr1+/pG7OdqjFkp6TFG6B96Mf/SipDz74YK9vtdVW89orrrhiUrM1Ynmkt8CVpJdeeimpDz30UK9vzpw5BT/u2muvndS//e1vvb4DDzwwqbfeemuv78ILL/TaZ511VsHHrBfh1pEzZsxI6mpeAyM97zGcIz1r1iyv7Zwry5hQHunf79dff13BkaC1XnjhhaQOt9BOb38sSa+//nrexxk2bFhSh58V0lvrHXbYYV7fFltsUfhgUTLpLS8lfx55eutMSfrqq6+8dvr1fY011vD60utrhdtsjho1KqnD7RbXW2+9QoaNEmvfvr3XZjvU+hB+ln/wwQcrNJKm3XzzzV776KOPTurwb5ZS4woMAAAAAAAQPU5gAAAAAACA6HECAwAAAAAARK/m1sAI54ytvPLKSV2sNTA233xzr51en+Kpp57y+tq2bZvU4XxUxO3444/32iNHjizK46bXaVm0aJHXl973O5wTPWXKlKIcv5aF8/O23HLLCo2kuNL7fV933XVeX7geC/OZq9vjjz/uta+88sq8t03/rh944AGvb5VVVinuwNBsd955p9c+9dRTk3revHleX7h2zXbbbZfUc+fO9frOOOOMvMdMP054jDvuuKOJEaNYws+b6fWuwlwsXLiw4Mft1atXUj/yyCNe3zfffJPUvXv39vrSWQhzgTjMnz/fa7/yyisVGgnKaeedd/baja2B0aVLl6ROrz8h+WulSf4ajKFnn302qceOHVvQOGPDFRgAAAAAACB6nMAAAAAAAADRq7kpJCuttJLXvvTSS5M6vMR24403Tur0pZ2h9O0k6bHHHvPa6a2PXn31Va/viiuuaGLEiMnEiROT+l//+pfX19j2lOnLfSWpf//+SR1e7tu1a9ek7tOnj9fX2HQktsds2nfffVfpIZTEcccdl7cvfUkxqtO4ceOS+sgjj/T6Gpv6mH5tYcu9yli8eLHXHj9+fFKH/92mt+ZOTxeUpHPPPddrp7ekC7fPPeCAA5L60UcfzTu2vn375u1Dad1zzz1e++9//3uLHmettdby2unPn+E2qultw1F90q8PkvTuu+8WfN/06044jZT3hrj93//9n9fee++98962TZs2Sb3qqqu2+JgLFixI6g022MDrS09ZDoVj22yzzVo8htbiCgwAAAAAABA9TmAAAAAAAIDoNXkCw8xuMLOPzOzV1PdWMrPHzGxG7t8VG3sM1B5ygSzkAiEygSzkAlnIBUJkAlnIRX0rZA2MEZL+Kim9P+FgSU845y4xs8G59m8z7ltx6fk6O+64o9fXoUOHpJ48ebLXd/311yf1oEGDvL70mhehcC7R8OHDCx9sdRmhKs7FDyZNmuS109sZpeeISZKZJfXuu+/u9YVbrD799NNJfdFFF3l9xx57bFJ37tzZ69too42SOtwCKVyT46WXXkrqTTbZRJEYoTLnIv3f7kcffVSsh41KuL1aWrgFV4RGqAZeK0rppptuSuo5c+bkvV241s7hhx9esjGVwQjVQC5uvfVWr51+fQ+l/1sNt9Ls2LFj3vuFt21s3Ytu3bol9RFHHJH3dhEboRrIxahRowq+bc+ePZM6nFP+xz/+0WuH616kvfHGGwUfs8qMUA1koimrrbaa106vhzRkyJBG75vuX2GFFby+k046qbVDi9UI1UAull7a/1O8sf/GiyW9BfOnn35a8P3S7y+StMwyyxRtTM3V5BUYzrmxkj4Jvj1A0g+fuG6SlH/FEdQkcoEs5AIhMoEs5AJZyAVCZAJZyEV9a+kaGKs45+ZIUu7fLvluaGYDzWyCmU2YO3duCw+HKlFQLshE3SEXCPEegiy8ViALuUCI9xBk4bWiTpR8G1Xn3HBJwyWpb9++Fd0HsrFLNJdffvm8feH2VwceeKDXDi/1R+MqnYnp06cn9dChQ72+9JaFnTp18vrS25+Gl+aG04rS26im69b48ssvvfawYcOS+vbbby/KMSqppbl48MEHkzr8GVWrDz/80GvPnDkz721XX331Eo+msir9elEK8+bN89o33HBDUofvJ+nLgc8555zSDqxKVDoT6d/DxRdf7PWlpxqecMIJXl96OmFjn0dCv//97wu+bXrr9nCKYq2rdC7Sws+N6enEu+yyi9e39tprJ3WXLnn/Dm9S+L6BBjHlojnSWys3NYUEzVOtmWipO+64w2unX4+a87n5ggsuKNqYWqulf3l/aGZdJSn3b21OPEdzkQtkIRcIkQlkIRfIQi4QIhPIQi7qREtPYIyW9MP/gj5C0n3FGQ6qHLlAFnKBEJlAFnKBLOQCITKBLOSiThSyjepISc9JWtfMZpvZMZIukbSzmc2QtHOujTpCLpCFXCBEJpCFXCALuUCITCALuahvTa6B4Zw7KE9XvyKPpaLOP/98rz1x4sSkHjNmjNf3+OOPe+1wPmM9qKZcfP3111779NNPT+r0+gmSv7XuzTff7PX17ds3qWNYa+G9996r9BCWUIlcTJs2LW/fT37yk1IdtqTSGZX8uc3rrLOO15fObIyq6bWiVMI1TPbbb7+C73vyyScndbgVeDWrplyE837T6160bdvW69t1112TOtwCc9lll817jK+++sprp7dKfffdd70+5/47ZTtcF2XAgAF5j1ENqikXjQm3xCzHGgbPPvtsyY9RCbWSidb4/vvvvTZr75GLULil9yWX/PfczVtvveX1ffvttwU95sYbb+y127Rp08LRFR//BQAAAAAAgOhxAgMAAAAAAESv5NuoVotwG8zrrrsuqTfZZBOv77jjjvPaO+ywQ1KnpxlI0oknnpjU6e3VUD4vvfSS1w6njaTdd99/1/vZbrvtSjYmlMdmm21W6SF4FixYkNQPP/yw15e+/C99+XgovGQ8vc0m4hT+ridPnpz3tv36+Ve/nnrqqSUZE/KbP3++17766qu9dvq9PD1lRJLuvffego7x5ptveu1DDjnEa6ensYZ+8YtfJPUZZ5xR0PFQHdLb4ErS559/7rXT04fCz5RTpkzJ+7hbbrllZo3qEE4Z4e+J2hFOMb3llluSOlyyoDHjxo3z2oVmJNzSOz31ZI899vD6GpsGWW5cgQEAAAAAAKLHCQwAAAAAABA9TmAAAAAAAIDosQZGHmuttVZSjxgxwus76qijvHZ6vlK6lvz5i4cffrjX17Vr19YOEwX49a9/7bXTc0jDdS5iWveiqW2z0s8D2T755JMW3e+VV17x2unfxRNPPOH1zZ49O6m/+eYbr++2227L+zjhXMItttgiqZdZZhmvb/HixUkdrrODOKXXQhg8eHCjt916662T+qabbvL6ll9++eIODE0K/zueN29e3tuGaxZ89NFHSX3jjTd6faNHj07qV1991etbtGiR107PXw7nMh966KFJHa7fhTh98cUXSf3aa695feltehtbo0vy30Ma20oz/HyZ/hy71FJLNXoMAKWVXq9mr7328vree++9so5lm2228doDBw4s6/FbiiswAAAAAABA9DiBAQAAAAAAoscJDAAAAAAAED3WwCjAPvvs47XXXnttrz1o0KCkDufHn3XWWUk9a9asvH3dunVr9TjR4IEHHvDa4XoG6fnE4dyzmDS17/fGG29czuFEK72WRPgz+uUvf5nUf/jDHwp+zMmTJ3vt9HojSy/tv2wut9xySd27d2+v7+ijj/bam266aVJvv/32Xt8qq6yS1OHrwZdffpnU6623XmNDR4WEe7nvt99+Bd/3xz/+cVKnc4DKaNu2rdfu3Lmz1547d25Sr7nmml5f+BqUz2qrrea1O3bs6LXnzJmT1J06dfL69txzz4KOgfL69ttvk/rll1/2+tKvB+nfreS/h4VrV2y11VZe++GHH07q9Loaoe+++85r33333Ul96qmnen1h3gFUTkvXt2tq3bx8wr+Z0uvw7LHHHi0aSzlwBQYAAAAAAIgeJzAAAAAAAED0mELSAhtuuKHXHjVqVFLff//9Xl96y9Vrr73W65sxY0ZSP/bYY8UcYl1LX24vLbklXpcuXZL6f//3f8sypny+/vprrz1kyJC8t91xxx299iWXXFKKIVWdq6++Oql79Ojh9T377LMteszu3bt77QEDBiT1+uuv7/X97Gc/a9ExQsOHD0/q9CXqkj/FAHH64x//6LULvXxTanqbVZTXCius4LXTW+JKUv/+/ZM63Ko5vQV7+nVDko488sikXmmllby+Aw880GunpxmEfYhD+NkiPb1j3333zXu/888/32vvsMMOSZ3eUllaMl/pzwHhVrxp4XvImWeemdTh+9vee+/ttcNtvFF5zZkeMHbsWK990kknlWRMaLn035FPP/2013fLLbck9W677eb1tWvXrkXHu/766732lVde2aLHiQlXYAAAAAAAgOhxAgMAAAAAAESPExgAAAAAACB6rIFRBOn5socddpjXd+yxxyb14sWLvb70PLVwDlS4xSKKJz2/M9yyrBzS615cdNFFXt+ll16a1OFWmunteiWpffv2JRhddfvtb39b6SG0WLgFc1pztuRE+UyaNCmpH3300YLvF66NsO666xZtTCi+LbbYwmuH6wu0RDhPfcyYMV47PcedNXDikN4mVVpyLYv0+3coPZf95JNP9vrSnyHDbIXbGE6ZMiWpw+1Pf/Ob32TeTpJGjx6d1IcccojXt9NOO+V9nBVXXFH59OnTJ28fiitc86Kx7ZrTW+ZK0uuvv57U4RpeqLxw7bZzzjmn6McI19djDQwAAAAAAIAy4AQGAAAAAACIHlNIWmDy5Mle+5///GdSjx8/3usLp42kpS/l2nbbbYs0OjRlr732Kuvx0peZS9LQoUOTOr0Fr+SPLbwMEPUr3OYOcdhll12S+tNPP817u3AKwogRI0o1JFSJcLvvxi4RZxvVyvnuu++S+txzz/X6hg0b5rV/9KMfJfXFF1/s9R100EFJHW7Tm/7cGE4vefnll712r169kvpvf/ub15fejnXBggVeX3pL8dtuu83rS08vkfzXtdAaa6yR1O+8807e26G4jj/+eK+d3na9Kenb/vnPfy7amFA9HnnkkUoPoei4AgMAAAAAAESPExgAAAAAACB6nMAAAAAAAADRYw2MPKZNm5bU4XYz99xzj9f+4IMPCnrMpZZaymunt/AM57+i5ZxzjbbvvffepP7LX/5SkjFcfvnlSR1ulfrZZ58ldbid2c0331yS8QAovo8//jipG3sNP/HEE702WyBj1113rfQQUID0+gHhmhfLLbec17722muTOlxH4vnnn0/qG2+80et78MEHk/qrr77y+s477zyvfdRRRyV1ej2KUMeOHb12ehvXdC1JI0eO9NrhGhlpf/rTn/L2oXR69+5d6SGgGcItl8M1KPr165fUyy67bEnGcMMNNyT1aaedVpJjVBJ/NQMAAAAAgOg1eQLDzNYws6fMbKqZvWZmp+a+v5KZPWZmM3L/rlj64SIW5AIhMoEs5AJZyAVCZAJZyAWykIv6VsgUksWSBjnnXjKzDpImmtljko6U9IRz7hIzGyxpsKTflm6oxZee+nH77bd7fVdddVVSz5w5s8XH6Nu3b1KfffbZXl+5t/Mssmhzkd5+Lqud/r2fcsopXt/RRx+d1CuvvLLXl74E9JZbbvH6XnnlFa89e/bspO7evbvXl750+IQTTljyCVSvaDNRbcJpTzNmzEjqLbfcstzDaa2ayUX68m1J+v777wu631ZbbVWK4VS7mslFS9TitnZFEF0mLrjggrx96S1WJenSSy9N6iFDhnh9b775ZkHHC+935plneu1wKnIxpLd4zWpHILpclFu4ve4VV1zhtd9+++28901PlQ4fZ6211irC6Comqlw888wzSf2HP/zB63vssce8dnoL4samgjXmk08+8drpqWiSNGjQoKT+4osv8j5OOIWlVFNaiq3JKzCcc3Occy/l6oWSpkpaXdIASTflbnaTpL1LNUjEh1wgRCaQhVwgC7lAiEwgC7lAFnJR35q1BoaZ9ZTUR9ILklZxzs2RGkIkqUue+ww0swlmNmHu3LmtGy2i1NxckInax2sFspALZOE9BCFeK5CFXCAL7yH1p+ATGGbWXtJdkk5zzi0o9H7OueHOub7Oub6dO3duyRgRsZbkgkzUNl4rkIVcIAvvIQjxWoEs5AJZeA+pTwVto2pmbdQQjtucc3fnvv2hmXV1zs0xs66SPirVIFvjww8/TOrXXnvN60vPBXvjjTdafIzNN988qX/zm994fQMGDEjqWtsqtVpzkZ63evXVV3t9d911V1KH25Cl1yFoSnqdgh133NHra2xObbWr1kzEJly3pdC1FmJVzbmYNGlSUofzWNOv6W3btvX60lunrrLKKiUaXXWr5ly01ltvvVXpIUQptkysuuqqSR3+n9qvv/7aa4drYaXtscceSb3tttt6fXvv/d8r3Hv27On1lWLNi2oUWy4qbYMNNvDa6TUVQrX2t0daTLlI/0356quvNnrboUOHJnWHDh1adLzw88hLL73ktcPPkWnbb799Uv/f//2f17fDDju0aDzlVsguJCbpeklTnXOXp7pGSzoiVx8h6b7iDw+xIhcIkQlkIRfIQi4QIhPIQi6QhVzUt0KuwPh/kg6TNMXMfvhfUWdJukTSKDM7RtK7kvYvzRARKXKBEJlAFnKBLOQCITKBLOQCWchFHWvyBIZzbpykfNeh9CvucFAtyAVCZAJZyAWykAuEyASykAtkIRf1raA1MGIW7oN7/PHHe+30/OXG9kluzFZbbeW103vrStKuu+6a1NWyf24tS68/IUmbbbaZ1x4/fnze+37wwQdJnV4/JbTyyit77QMHi3PoAAAgAElEQVQPPNBrp/fdBlrrueeeS+ojjzyycgOpQ/Pnz0/qxl4TVl99da89bNiwko0J1W+bbbbx2uE6N7U8b72ajB07Nqnvvfdery+cc96ly383Ozj66KO9vhVXXDGpw/VygOYaOHCg177//vsrNBK0xN/+9reSHyP9erTnnnt6fem/Udq1a1fysZQC75AAAAAAACB6nMAAAAAAAADRq4opJC+88ILXvvTSS5P6xRdf9Pr+85//tOgY4dSPU045JanPOussr699+/YtOgbKo1u3bl777rvv9trXXnttUl900UUFP246E+G2Q7169WrOEIFGOecqPQQAJbThhht67bXXXttrp7dFDLdc7dy5c+kGBk96i8PDDjvM6wvbQLmsv/76Xrt3795JPXXq1HIPB5JuvPHGpL7yyiu9vptvvrkox1hrrbWSernllvP6wmmJxx13XFKH7ze1gCswAAAAAABA9DiBAQAAAAAAoscJDAAAAAAAEL2qWAPjnnvuabTdmPS8sHAbmaWWWiqpTz/9dK9vhRVWaM4QEbGuXbt67SFDhmTWQCXtvvvuSf2Pf/yjgiNB2nrrrZfU4Zba48aNK/dwUKPOPvtsr33ssccmdbgO11//+tekDufCA6h9PXr08NpTpkyp0Ejwgz59+iR1uE3qFlts4bXPOeecpP7000+9vr333jupd955Z69vwIABSb3qqqu2fLA1gCswAAAAAABA9DiBAQAAAAAAolcVU0guueSSRtsAUO2OPPLIzBqVlb5Mc8yYMRUcCWrZvvvu67XvuOOOpH788ce9vvTUxxtuuMHrY5t3AKisZZZZxmsff/zxjbbRfFyBAQAAAAAAoscJDAAAAAAAED1OYAAAAAAA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La5u3bqVbmBAhLgCAwAAAAAARI8TGAAAAAAAIHpMIcnjs88+S+oddtjB6wsv9fzggw/y9gEtNXjwYK99zTXXeO02bdokdb9+/coypnq1//77J/V5553n9TU2haQ59ttvv6QOL2/fZZddinIMoJ5dcMEFST1s2LCiPObDDz9clMcJpacH9O7d2+tLX1qeriVpzTXXLMl4UDoff/xxUodTBRoTThsIP6uiunz55Zdee9y4cUkdfs4IX3eOPfbY0g0MiBBXYAAAAAAAgOhxAgMAAAAAAESPExgAAAAAACB6rIHRAuk1L8I2a2CgWJ5//nmvnd7aV5K23nrrpD7ggAPKMqZ6tdJKKyX17373O69v0KBBSf3FF194fd27d/fa7777bt5jzJ8/P6nD+a2sgYGmzJo1y2uH86lHjhyZ1H/729/yPs7Pf/5zr33jjTcWYXRxuPvuu1t0v3BLyg033LBFj7Peeusl9RtvvOH1pdfdkqSXX345qV977TWv75xzzknqn/70p14fa2DEL71tqiQdfPDBSR1upRlKZzi91S6q33LLLee111lnnaR+//33vb6PPvqoLGNC9brsssuS+ptvvvH6pk6dmtTpbcFD6fcsacn3okriCgwAAAAAABA9TmAAAAAAAIDocQIDAAAAAABEjzUwWqCpOYqoTWPHjk3q3//+915fen655K+Z0Bzpx3n11Ve9vrXWWstrDxs2rEXHQOv88pe/9NrXXHNNUr/yyiteX8eOHVt0jJNOOqlF90Nte/zxx712ej58+BoUrqlgZgUdI1x7p5Y88sgjST1t2jSvb9111817v3BueteuXYs7MEkLFy702ul1NhpbO+f+++/32v379y/uwFB0t9xyi9d+7733knqPPfbw+sL1arp161a6gSEqJ554YlI//fTTXl+4hg7qw5gxY5J6ypQpXl/6bxRJuueee5K6sb9bG/tsMGPGDK/du3dvr51eS6PcuAIDAAAAAABEjxMYAAAAAAAgekwhaYHwcptwuzrUpoEDByZ1eFnV66+/7rXTW5w2R3pqyscff+z1XXfddV57o402atExUFzpLQ3DqUWTJk1q0WN+/fXXrRoTqtexxx7rtdOXiY4fP77gx+nQoYPXPuSQQ5K6b9++Xl96G8d27doVfIxqk56GF07Jq7RwKkhj00aWWWaZpA7zgjhtueWWSR1ONezZs2dSX3755V4fU0bq1+abb563b9SoUV77j3/8Y1KXYoobimvOnDlJfdBBB3l9b7/9dt77paeGfv75515fOE1kk002Ser0ttzN8f3333vtL774okWPUwpcgQEAAAAAAKLHCQwAAAAAABC9Jk9gmNkNZvaRmb2a+t5KZvaYmc3I/btiaYeJ2JALZCEXCJEJZCEXyEIuECITyEIu6lsha2CMkPRXSTenvjdY0hPOuUvMbHCu/dviD686TJw4ManT8xxr3AjVWS6WXXbZpA7XQfnqq69a9JjhGgnpec//8z/++cWWHqPMRqjOcvGLX/wiqcO1T3beeWevHW6Nm8+5557rtf/5z3+2cHRRGKE6y0RTwvVtzjzzzKS+4YYbvL70lsybbrqp1zd48OCk3mCDDby+9OuVJHXv3r1lgy2dEaqzXHzzzTdJfcopp3h9N998c3jzvJ599tmk7tOnT+sHFpcRqoFc3HfffV77xRdfTOrw88P++++f1OF/t5BUI5lojXB9g/RriSSNHj06qY8//viyjCkCI1QluQi3QD/uuOOSOr2NcmuEa/F16tQpqefNm+f1vf/++0l91FFHeX2zZ8/Oe4z111+/NUMsqiavwHDOjZX0SfDtAZJuytU3Sdq7yONC5MgFspALhMgEspALZCEXCJEJZCEX9a2la2Cs4pybI0m5f7vku6GZDTSzCWY2Ye7cuS08HKpEQbkgE3WHXCDEewiy8FqBLOQCId5DkIXXijpR8m1UnXPDJQ2XpL59+7ombh6NpZf+749m+eWX9/rS29hI0ltvvVWWMdWKaslEeBl/+vL/9dZbz+trzpamixYtSur01leSv0XRz372M68vPVWhFlVLLkK33nprUk+ePNnre+2111r0mC3dhrcWVWsuGnPhhRd67euvvz6pTz75ZK8vvTVv+/btSzuwKlEtmXjyySe9dvq1YsSIEY3et02bNkl9xRVXeH29e/du/eBqUKVzMX/+/KR+5plnCr7fiiv+d5p+a7ZN/ctf/pLUjV2WPmzYsBYfoxpVOhfFEE47CoVTStC4cmdi6NChXrvQaSPpLbMl/2+GLbbYwutbd9118z7Oyiuv7LXTrxWNTRlJb/EsSbfcckve25ZbS6/A+NDMukpS7t+PijckVDFygSzkAiEygSzkAlnIBUJkAlnIRZ1o6QmM0ZKOyNVHSLqvkduifpALZCEXCJEJZCEXyEIuECITyEIu6kQh26iOlPScpHXNbLaZHSPpEkk7m9kMSTvn2qgj5AJZyAVCZAJZyAWykAuEyASykIv61uQaGM65g/J09SvyWKKywgorJPU222zj9T3wwAPlHk50ajUX6Xlp1113ndeXXhflqquu8vo6d+5c8DEGDRqU1P/4xz+8vtVWWy2p//3vfxf8mLGo1Vy88cYbSb3PPvt4fW+++WZSL168uCjH22uvvYryODGo1UyE0uvXSP5c1XCLzPT8U0naYYcdknrXXXf1+tq1a1esIUalVnOR3i4z/F1+9913BT9Oes77Gmus4fUttdRSLRxd/Ko5F+nfy8SJE72+77//PqnDLdK33Xbbgo9x+eWXJ3W4LkJ6rZT0luyhyy67zGuH8/Fbsw5HKVRzJlA6Mefi0Ucf9drPP/98wfdNv96Ha04Ua320xta9SAs/i6a3Zq20lk4hAQAAAAAAKBtOYAAAAAAAgOiVfBtVIGZTpkzx2vvuu29Sz5s3z+tLb2+43XbbFXyMcMuyxrbPO/vsswt+XJTP1KlTk/qdd97x+oo1bSTtT3/6k9e+8sori34MFNdFF13ktdNTSA444ACvb5dddvHatTpNpB6NGjUqqZszZSSU3haxf//+Xt+mm26a1OElvnvvvXdSb7jhhi0+PppvzJgxSR1uo5qeNtK9e3evL9ziMG3SpElee9y4cUk9evTovPf70Y9+5LVXX331pJ4+fbrXt//++3vtO+64I6l79OiR9xgAsoXTtMIppmlbbrml1x4yZEhSt2bKyKeffprUDz30kNc3duzYgsbz85//vMXHLzWuwAAAAAAAANHjBAYAAAAAAIgeJzAAAAAAAED0WAOjCD7++ONKDwGNCNcouPXWW5P6mGOO8foa2+rsueeeS+o//OEPXl96a1RJ+uSTT5I63CrVOZfUhx9+uNd3/PHHL/kEUHHprVOHDh3q9f32t79N6q+++qoox5szZ05RHgflc/HFF3vt9BaHBx3k7/bGmhe1K72O0uuvv+71TZgwIanDNZaaI71FZ7hd5+9+97ukPu2007y+3/zmN167S5cuLR4DpIULF3rtcH2ktK5duyb1YYcd5vX16tUrqcP1KcL3m/vuuy+pwy0Nd95556QOP5MsWLAgqXfccUevb/78+XnHjTikPzdKS26hi7gMHDjQa4ev98svv3xS33777V7fqquuWpQxXHPNNUl97rnn5r3dT37yE6+d/pulWGMpBa7AAAAAAAAA0eMEBgAAAAAAiB4nMAAAAAAAQPRYA6MIGtuLG5WX3tNcko499tikDucRpte9WHvttb2+9PzldC0tmYH//Oc/SR2uZ9C5c+ekvuGGGxodO+JzyimneO30/OWm5hKn12M56aSTvL70HGVUn80339xrp18jwt/1sssu67XTc9dR3bbaaqukfvDBB72+d999N6nDOdEffvih17777ruTOnyfCOfDp6XXcbr88su9vnC9jCeeeCKpwzWf0LRx48Z57V/96ld5b5ueE3/eeed5fenf/emnn+71hRnq0KFDUu+///5e32WXXZbUM2bM8Pp++ctfZj6GJPXr189r9+jRY8kngIpizYvqst9++zXaLoX777/fa19wwQV5b7v00v/98z9cey/mdS/SeMcCAAAAAADR4wQGAAAAAACIHlNICrDDDjt47QceeKBCI0Eh7rzzTq991FFHee02bdok9QorrOD1pbczWnHFFb2+X//610k9duxYry+cUpK+xDe89C996fAaa6zh9T399NNJvdZaawnx23333Qu+bToXb775pteXvtxv0qRJXt+sWbOSmst7y+uFF15I6j59+nh9bdu2TeqHHnrI67viiiuS+sILL/T6fvGLX3jt559/Pql79+7d8sEiat27d8+ss6RfV7bbbjuv769//WtSv/jiiwUff8yYMV572LBhSR1usYqmTZ48ueDbhtNG0tJb76Zfb7Kkt1ENc5He6n2bbbbJ+xjh9rrpHKA6/fSnP630EFBhe++9t9dubNpR+vNJuOVrteAKDAAAAAAAED1OYAAAAAAAgOhxAgMAAAAAAESPNTAK0NRc1W+//Tap03PVJearV8K1117rtcPf39lnn53URx99dMGPm553HM4ZS89hb0p6HYRwfRXWvaht33zzTVI3tsVVep0WSVpqqaVKNqZ6F25z3L9/f6+d3vryT3/6k9d36KGHJvVKK63k9aW3Tg3XwFi0aJHX/vTTT5sxYtSbdM4k6cADD0zqnXbayesL12dqTLgOD5on3DY7/d4+YMCAvPcL1ziaOXNm5mNI/taokr/uxfTp072+gw8+uKDHCdfAQPXjs2P9Oeuss7x2egttqfGtscP1c6oRV2AAAAAAAIDocQIDAAAAAABEjykkBVh66cZ/TOlL9b7++utSDwdNCC/dTG9RJi25dWmh0tufvvbaa43eduTIkUm9wQYb5L1dt27dWjQWVKdzzjmnoNsdc8wxXpuclM4mm2zitRcsWOC1//jHPyZ1eCl/Y/785z/n7Qsv+2/sNQIIpT+ThPltzhSSddZZp2hjQuPbFjYmfal3+BjhVq3pKbFfffWV17fmmmsm9TPPPOP1hVvGA6g+6WnIL7/8stcXThlJv5aEn0d69epVgtGVF1dgAAAAAACA6HECAwAAAAAARI8TGAAAAAAAIHqsgVGAcE2Fdddd12tPmzYtqcN5RldffXXpBoZMp556alEe57PPPvPao0aNSupwnvyPf/xjr33AAQcUZQwono8//thrH3XUUV47vTVheju61gi36Bw+fHhB9wvXbUHpnHLKKV77oosuytsf3jYtnFM6Y8aMpA6307744ou9djPQlS4AACAASURBVMeOHQsbLKKQ/u/6uuuu8/rWW2+9pC7V+8B3332X1OEaCY0J1/PaYostijamerTXXnt57UsvvTSpR48e7fU999xzSf3KK694fQsXLsx7jJtvvtlrp9dc69Spk9d3/vnnJzXrJtUX1t+rTV988YXXvvXWW5P6sccea/S+Bx10UFKH63c1tsVqtaj+ZwAAAAAAAGoeJzAAAAAAAED0mpxCYmZrSLpZ0qqSvpc03Dn3FzNbSdKdknpKminpAOfcp6Ubajx23XVXr/3+++8n9eWXX17u4VREPeQinP5zzTXXJHWXLl28vqeeeqosY4pZ7Jk4+eSTvfb999/vtadPn57Uq6++uteXbq+99tpe38SJEzMfQ5KGDh3qtcOpR2mDBg1K6tVWWy3v7apN7Lk488wzvXabNm289ksvvZTUTzzxRN7H+fRTf+h77LFHUl922WVeX5ihehR7LtI++OADr73bbrsl9ZQpU7y+MAfF8OGHH3rt9OeMJ598suDH6d27t9feZpttWjewIqumTEhS27ZtvfZyyy2X1OGl31tvvXVSt3S7VUnq0KFDUu+///5eX/o1p5ZUWy4q4cEHH0zq8LNOrarVXKSnlB133HFe3z//+c+89/vTn/7ktU866aSkroUpI6FCntFiSYOcc70l/UzSiWa2vqTBkp5wzvWS9ESujfpBLhAiE8hCLpCFXCBEJpCFXCALuahjTZ7AcM7Ncc69lKsX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9YEHHljOIZUVV2AAAAAAAIDkrfcEhjHmZmPM+8aY17zbuhhjHjXGvJX/s/n/CwJJIRfIQi4QIxPIQi6QhVwgRiaQhVzUt2KuwJgkqX9021mSpllrd5A0Ld9GfZkkcoF1TRK5QGiSyATWNUnkAuuaJHKB0CSRCaxrkshF3VrvGhjW2qeNMb2imwdI+na+vlXSk5LOLOO4yuY//uM/XB1vo9quXbuyH8/fPjO2dOnSoH3HHXe4+oQTTij7WJpTreeikE8++cTVn376adC39dZbu/riiy8O+nr06FHwMefPnx+0J0yY4Oply5YFfX4mzzvvvKCvbdu2BY+RipaaC9/ll18etP0tDuNcoD4yIa27doW/7sUhhxwS9D388MNFP66/dtNjjz0W9C1evDjzeJK0++67F32MaqhGLvytqN99992gz99OMBbPG7/nnntcPXz48PIMrgHdu3cP2v5aHn//+98Lfp+/VXytaCmvF/6aF5J02mmnuTreCtV/b4//rleuXBm0P/zww4LH9B+nQ4cOQZ+/rkuxW7GmoqVkYn3iv1t/i/Z4DbQTTzyx6MdduHChq2+88cYSR5eeeslFqQ4//HBXv/HGGwXvF6/B6G/BvPHGG5d/YGVS6qtYd2vtEknK/7lZoTsaY443xsw0xsyMf1lDi1NULshE3SEXiPEegiy8ViALuUCM9xBk4bWiTjT7aVhr7fXW2r7W2r7xyuuoT2QCWcgFspALxMgEspALZCEXiJGJ2lfqNqpLjTE9rLVLjDE9JL1fzkGVU6Uvu992222Ddp8+fVwdX8Izb968ioypgmomF4X4l+n96U9/Cvr8S7TPOiucVveb3/wmaPuXa55++ulB30MPPeTqLl26BH1nn322q0866aRih526ms+FL76c/Jvf/Kar99xzz0oPp1a1qExIDV9qGU8vKRf/0s9NN920WY5RYc2aiw033NDV8bZy/tao8bS/mP96/4Mf/CDoa46/h3j6aUPTRlqomni9mDJliqvjrVIbmraxzz77uDqeJjZp0qSgPWLEiIKP409PHTRoUIOP0wLURCbWZ82aNa72P0tI4Ran1157bdDXqlXxv74dffTRrn777beDvlGjRhX9ODWiReSiHF5//XVXG2MK3i+ejnTwwQc325jKqdQrMO6X9OWr87GS7ivPcFDjyAWykAvEyASykAtkIReIkQlkIRd1ophtVH8n6VlJOxljFhtjhkm6VNLBxpi3JB2cb6OOkAtkIReIkQlkIRfIQi4QIxPIQi7qWzG7kBxVoKtfmceCGkIukIVcIEYmkIVcIAu5QIxMIAu5qG+lroGBAjbaaKMG20jbHnvs4er99tsv6PPXwJg2bVrQF89bHTlypKvfeeedgseLt0r9xS9+UfxgUTHTp0939XPPPRf0zZ49u6THfPLJJ4N2165dXf3Vr361pMdE9axduzZoW2td3blz56Bv9erVQdtfc+HWW28N+mbNmuXqzTffPOjzt+Lu2bNnI0dc3zp27Bi0v/GNb7h6fWtgvPrqq65etGhR0FfsGhiff/550L7uuusK3veuu+4q6jFRWfG6Ev5WqTF/PTZ/zQtJuvrqq4s+pr89crzORkNba/rre91www1B34wZM4o+Psrr7rvvdnW8Lt7jjz/u6ni9tIb47wtS+Jmlffv2Qd8ZZ5xR9OMibfF6e/5nkHgNjH79/u8cz7nnntu8A2smtbUZNAAAAAAAqEucwAAAAAAAAMljCkmZffbZZ0E7vlTY52+BhzS0adPG1R06dCh4vyVLlgTtI444Img3dOnWRv+PyQAAEutJREFUsGHDXD1w4MCSxonK8rdY7N27d9AXb53siy8x9rcsW7FiRdDnZ2/ixIlB3ymnnFL0WFEd8TbZ/r/7K6+8Mui74oorgrY/TSR25513utq/DBzl5U8hmTx5ctHf9+yzzwZtfxriM888E/T57VWrVgV948ePL/qYDfFfn+KpSyiviy66KGh/8sknBe87duxYV48ZM6boY+y///5B+zvf+Y6ru3fvXvTj+FMH/PcaVJc/ZXDHHXcM+vzXpPV57733XO1PYZbC6Y3xZ4nGZAhpOemkk4L2ffeFG674n0F22223oM//TOtPb6slXIEBAAAAAACSxwkMAAAAAACQPE5gAAAAAACA5LEGRpktWLAgaM+dO7fgffv371/04y5fvtzVr7zyStDnz8EdPHhw0LfTTjsVfQyEevXqVZbH+e53vxu0/W2rttpqq7IcA83r5ptvdnW8RZk/nzjeGvGCCy4I2v5WiYceemjQ9/DDD7v6uOOOC/q23357VzfmdQOVE2+fuXLlSlfPnDkz6PPXyJHCuart2rUL+vr06VOuIaIBw4cPd3W8xfHvfve7gt8Xzykvdr2aeNvdDTYoz/8n+dt9T5kyJejz119C47388stB2/83LoV/p//+97/Lckz/tb9c4tefOIuonKlTp7r6wgsvDPo22mijgt/38ccfB21/HTb/9wVJ+vnPf+7qs846q6RxIg3+lsfxmhf+Oiix448/Pmh369atvAOrAq7AAAAAAAAAyeMEBgAAAAAASB4nMAAAAAAAQPJYA6MEn332WdBevHixq//6178W/TgnnHCCq/fcc8+g76WXXgraH374oasXLVoU9HXo0MHV8+fPD/omTZpU9HgQzludPn160BfPG23I9773PVc/8MADTR8YKuq1114L2mvWrHF1q1aFXzZffPHFoB2vV3HkkUcW/N4hQ4a4+i9/+UvQd8kllxR8TKTh9ddfD9rPPfecq/33CCn8u44NGjQoaLMGRuWNGjUqaN95551lP0a85oW/Dkq5+BmUWAOjFP57gb/OgCStWLEiaJdrHZPmsGrVKlfHazWlPO6WZtq0aQX7BgwYULDPXytDCte1kKR33nnH1dttt13Q539+2GSTTYoaJ9Lkr8e2ZMmSBu+78847u7qhbNUqXrUAAAAAAEDyOIEBAAAAAACS1+KnkHz66aeufv/994O+WbNmufr5558P+h5//PGiHlOS3njjjZLG5l9y/NFHHzV435/97Geu9qcnSOH2fdtss01JY0HO0KFDXX3vvfcGfY25xLc5LgdG5SxdurRgX0NbE++yyy5Be/z48SUd/8QTTwzau+66a0mPg+rZd999Xf3qq68W/X1jx45tjuEgMfH2mPF7hr/9dqdOnYK+eLtFNJ9TTz3V1f5l+rXm7rvvdrW/FSMqa7PNNgvabdu2dfUPf/jDoM+f9rNs2bKgz9++XQqnOMdbOXfs2LG0waLqrrrqqqB90003uXp9v2c8+uijrt5iiy3KO7AEcAUGAAAAAABIHicwAAAAAABA8jiBAQAAAAAAklfza2DE61Gcf/75Qfv+++939dy5c0s6RrztUPv27YO2v62iv91ibPjw4UG7oW1U0XzeffddV/tbEknSPffc4+p4fpn/d7T77rsHfbfcckvQjtdbQcvRs2fPgn3+lsbNdQzUnnhb3rVr1wZttjFsObp06eLqr3zlK0Gfvz3rUUcdVfRjxtuqswZGmi6//PJqD8F58803g/bo0aML3rdXr15B21+XAeUVr2f1P//zP6721zeQpD322MPV8etF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\n", 142 | "text/plain": [ 143 | "" 144 | ] 145 | }, 146 | "metadata": {}, 147 | "output_type": "display_data" 148 | } 149 | ], 150 | "source": [ 151 | "plt.figure(figsize=(15,6))\n", 152 | "for i in range(24):\n", 153 | " plt.subplot(3,8,i+1)\n", 154 | " plt.imshow(255-X_train[i], cmap='gray', interpolation='none')\n", 155 | " plt.title(\"Class {}\".format(y_train[i]))\n", 156 | "plt.tight_layout()" 157 | ] 158 | }, 159 | { 160 | "cell_type": "code", 161 | "execution_count": 4, 162 | "metadata": { 163 | "ExecuteTime": { 164 | "end_time": "2018-03-22T11:14:09.487869Z", 165 | "start_time": "2018-03-22T11:14:09.328705Z" 166 | } 167 | }, 168 | "outputs": [ 169 | { 170 | "data": { 171 | "text/plain": [ 172 | "" 173 | ] 174 | }, 175 | "execution_count": 4, 176 | "metadata": {}, 177 | "output_type": "execute_result" 178 | }, 179 | { 180 | "data": { 181 | "image/png": "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\n", 182 | "text/plain": [ 183 | "" 184 | ] 185 | }, 186 | "metadata": {}, 187 | "output_type": "display_data" 188 | } 189 | ], 190 | "source": [ 191 | " plt.imshow(255-X_train[31], cmap='gray', interpolation='none')" 192 | ] 193 | }, 194 | { 195 | "cell_type": "code", 196 | "execution_count": 5, 197 | "metadata": { 198 | "ExecuteTime": { 199 | "end_time": "2018-03-22T11:14:09.554117Z", 200 | "start_time": "2018-03-22T11:14:09.489146Z" 201 | } 202 | }, 203 | "outputs": [ 204 | { 205 | "name": "stdout", 206 | "output_type": "stream", 207 | "text": [ 208 | " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", 209 | " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", 210 | " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", 211 | " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", 212 | " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", 213 | " 0 0 0 0 0 0 0 0 0 0 0 0 0 42 154 180 255 176 118 118 16 0 0 0 0 0 0 0\n", 214 | " 0 0 0 0 0 0 0 0 0 0 0 0 0 142 253 253 253 253 253 253 236 103 0 0 0 0 0 0\n", 215 | " 0 0 0 0 0 0 0 0 0 0 0 0 0 227 253 253 204 177 177 177 243 191 0 0 0 0 0 0\n", 216 | " 0 0 0 0 0 0 0 0 0 0 0 0 0 227 253 216 22 0 0 23 227 238 96 21 0 0 0 0\n", 217 | " 0 0 0 0 0 0 0 0 0 0 0 0 0 227 253 205 0 0 17 124 253 253 253 170 0 0 0 0\n", 218 | " 0 0 0 0 0 0 0 0 0 0 0 0 0 227 253 234 62 18 201 253 253 253 251 90 0 0 0 0\n", 219 | " 0 0 0 0 0 0 0 0 0 0 0 0 0 227 253 253 253 253 253 253 253 221 103 0 0 0 0 0\n", 220 | " 0 0 0 0 0 0 0 0 0 0 0 0 0 227 253 253 253 253 253 208 24 5 0 0 0 0 0 0\n", 221 | " 0 0 0 0 0 0 0 0 0 0 0 0 39 236 253 253 253 251 97 16 0 0 0 0 0 0 0 0\n", 222 | " 0 0 0 0 0 0 0 0 0 0 4 69 224 253 253 240 169 46 0 0 0 0 0 0 0 0 0 0\n", 223 | " 0 0 0 0 0 0 0 0 0 33 134 253 253 253 253 105 0 0 0 0 0 0 0 0 0 0 0 0\n", 224 | " 0 0 0 0 0 0 0 0 51 225 253 253 253 253 253 68 0 0 0 0 0 0 0 0 0 0 0 0\n", 225 | " 0 0 0 0 0 0 0 48 227 253 253 250 174 253 253 68 0 0 0 0 0 0 0 0 0 0 0 0\n", 226 | " 0 0 0 0 0 0 0 213 253 253 179 63 111 253 253 68 0 0 0 0 0 0 0 0 0 0 0 0\n", 227 | " 0 0 0 0 0 0 92 251 201 13 5 0 166 253 253 68 0 0 0 0 0 0 0 0 0 0 0 0\n", 228 | " 0 0 0 0 0 39 222 253 198 0 0 0 248 253 231 46 0 0 0 0 0 0 0 0 0 0 0 0\n", 229 | " 0 0 0 0 0 54 243 253 124 0 38 133 252 253 150 0 0 0 0 0 0 0 0 0 0 0 0 0\n", 230 | " 0 0 0 0 0 118 253 253 237 179 223 253 253 190 14 0 0 0 0 0 0 0 0 0 0 0 0 0\n", 231 | " 0 0 0 0 0 44 230 253 253 253 253 253 244 76 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", 232 | " 0 0 0 0 0 0 45 231 253 253 253 182 66 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", 233 | " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", 234 | " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", 235 | " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" 236 | ] 237 | } 238 | ], 239 | "source": [ 240 | "for x in X_train[31]:\n", 241 | " for i in x:\n", 242 | " print(str(i).rjust(4), end='')\n", 243 | " print()" 244 | ] 245 | }, 246 | { 247 | "cell_type": "markdown", 248 | "metadata": {}, 249 | "source": [ 250 | "### Let's see the distribution of the digits" 251 | ] 252 | }, 253 | { 254 | "cell_type": "code", 255 | "execution_count": 6, 256 | "metadata": { 257 | "ExecuteTime": { 258 | "end_time": "2018-03-22T13:38:21.283978Z", 259 | "start_time": "2018-03-22T13:38:21.115426Z" 260 | } 261 | }, 262 | "outputs": [ 263 | { 264 | "data": { 265 | "image/png": "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\n", 266 | "text/plain": [ 267 | "" 268 | ] 269 | }, 270 | "metadata": {}, 271 | "output_type": "display_data" 272 | } 273 | ], 274 | "source": [ 275 | "plt.hist(y_train, bins=10, orientation='horizontal');" 276 | ] 277 | }, 278 | { 279 | "cell_type": "markdown", 280 | "metadata": {}, 281 | "source": [ 282 | "## Data Preparation\n", 283 | "### Scale data to [0,1] instead of [0, 255]" 284 | ] 285 | }, 286 | { 287 | "cell_type": "code", 288 | "execution_count": 7, 289 | "metadata": { 290 | "ExecuteTime": { 291 | "end_time": "2018-03-22T11:14:09.850120Z", 292 | "start_time": "2018-03-22T11:14:09.717634Z" 293 | } 294 | }, 295 | "outputs": [ 296 | { 297 | "name": "stdout", 298 | "output_type": "stream", 299 | "text": [ 300 | "Training matrix shape (60000, 28, 28)\n", 301 | "Testing matrix shape (10000, 28, 28)\n" 302 | ] 303 | } 304 | ], 305 | "source": [ 306 | "X_train = X_train.astype('float32')\n", 307 | "X_test = X_test.astype('float32')\n", 308 | "X_train /= 255\n", 309 | "X_test /= 255\n", 310 | "print(\"Training matrix shape\", X_train.shape)\n", 311 | "print(\"Testing matrix shape\", X_test.shape)" 312 | ] 313 | }, 314 | { 315 | "cell_type": "markdown", 316 | "metadata": {}, 317 | "source": [ 318 | "### one-hot encode the class output" 319 | ] 320 | }, 321 | { 322 | "cell_type": "code", 323 | "execution_count": 8, 324 | "metadata": { 325 | "ExecuteTime": { 326 | "end_time": "2018-03-22T11:14:09.855244Z", 327 | "start_time": "2018-03-22T11:14:09.851523Z" 328 | } 329 | }, 330 | "outputs": [ 331 | { 332 | "data": { 333 | "text/plain": [ 334 | "array([5, 0, 4], dtype=uint8)" 335 | ] 336 | }, 337 | "execution_count": 8, 338 | "metadata": {}, 339 | "output_type": "execute_result" 340 | } 341 | ], 342 | "source": [ 343 | "y_train[:3]" 344 | ] 345 | }, 346 | { 347 | "cell_type": "code", 348 | "execution_count": 9, 349 | "metadata": { 350 | "ExecuteTime": { 351 | "end_time": "2018-03-22T11:14:09.892056Z", 352 | "start_time": "2018-03-22T11:14:09.856446Z" 353 | }, 354 | "collapsed": true 355 | }, 356 | "outputs": [], 357 | "source": [ 358 | "n_classes = len(np.unique(y_train))\n", 359 | "Y_train = np_utils.to_categorical(y_train, n_classes)\n", 360 | "Y_test = np_utils.to_categorical(y_test, n_classes)" 361 | ] 362 | }, 363 | { 364 | "cell_type": "code", 365 | "execution_count": 10, 366 | "metadata": { 367 | "ExecuteTime": { 368 | "end_time": "2018-03-22T11:14:09.921652Z", 369 | "start_time": "2018-03-22T11:14:09.893659Z" 370 | } 371 | }, 372 | "outputs": [ 373 | { 374 | "data": { 375 | "text/plain": [ 376 | "array([[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n", 377 | " [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", 378 | " [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.]])" 379 | ] 380 | }, 381 | "execution_count": 10, 382 | "metadata": {}, 383 | "output_type": "execute_result" 384 | } 385 | ], 386 | "source": [ 387 | "Y_train[:3]" 388 | ] 389 | }, 390 | { 391 | "cell_type": "markdown", 392 | "metadata": {}, 393 | "source": [ 394 | "### prepare 2 sets of data\n", 395 | "#### The flat version for considering each pixel as an input\n", 396 | "Since the images are 28x28 pixels, there are 784 pixels" 397 | ] 398 | }, 399 | { 400 | "cell_type": "code", 401 | "execution_count": 11, 402 | "metadata": { 403 | "ExecuteTime": { 404 | "end_time": "2018-03-22T11:14:09.954439Z", 405 | "start_time": "2018-03-22T11:14:09.922953Z" 406 | } 407 | }, 408 | "outputs": [ 409 | { 410 | "name": "stdout", 411 | "output_type": "stream", 412 | "text": [ 413 | "Training X_train_flat shape (60000, 784)\n", 414 | "Testing X_test_flat shape (10000, 784)\n" 415 | ] 416 | } 417 | ], 418 | "source": [ 419 | "X_train_flat = X_train.reshape(-1, 784)\n", 420 | "X_test_flat = X_test.reshape(-1, 784)\n", 421 | "print(\"Training X_train_flat shape\", X_train_flat.shape)\n", 422 | "print(\"Testing X_test_flat shape\", X_test_flat.shape)" 423 | ] 424 | }, 425 | { 426 | "cell_type": "markdown", 427 | "metadata": { 428 | "ExecuteTime": { 429 | "end_time": "2018-03-20T15:22:46.472156Z", 430 | "start_time": "2018-03-20T15:22:46.463902Z" 431 | } 432 | }, 433 | "source": [ 434 | "#### In the case we want to process them as images, we need to take into account the channels\n", 435 | "In this example is not particularly relevant, but it is generally needed as images normally have 3 channels (e.g. RGB: Red, Green, Blue). Other examples could be channels of different bands (e.g. infrared, ultra-violet, etc.)" 436 | ] 437 | }, 438 | { 439 | "cell_type": "code", 440 | "execution_count": 12, 441 | "metadata": { 442 | "ExecuteTime": { 443 | "end_time": "2018-03-22T11:14:09.990766Z", 444 | "start_time": "2018-03-22T11:14:09.955870Z" 445 | } 446 | }, 447 | "outputs": [ 448 | { 449 | "name": "stdout", 450 | "output_type": "stream", 451 | "text": [ 452 | "Training matrix shape (60000, 28, 28, 1)\n", 453 | "Testing matrix shape (10000, 28, 28, 1)\n", 454 | "Input shape (28, 28, 1)\n" 455 | ] 456 | } 457 | ], 458 | "source": [ 459 | "# input image dimensions\n", 460 | "img_rows, img_cols = 28, 28\n", 461 | "\n", 462 | "if K.image_data_format() == 'channels_first':\n", 463 | " X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)\n", 464 | " X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)\n", 465 | " input_shape = (1, img_rows, img_cols)\n", 466 | "else:\n", 467 | " X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)\n", 468 | " X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)\n", 469 | " input_shape = (img_rows, img_cols, 1)\n", 470 | "\n", 471 | "print(\"Training matrix shape\", X_train.shape)\n", 472 | "print(\"Testing matrix shape\", X_test.shape)\n", 473 | "print(\"Input shape\", input_shape)" 474 | ] 475 | }, 476 | { 477 | "cell_type": "markdown", 478 | "metadata": {}, 479 | "source": [ 480 | "## Feature Engineering\n", 481 | "We are not doing any feature engineering today. We will work with the images as they are" 482 | ] 483 | }, 484 | { 485 | "cell_type": "markdown", 486 | "metadata": {}, 487 | "source": [ 488 | "## Machine Learning\n", 489 | "### Neural network using each pixel as an input" 490 | ] 491 | }, 492 | { 493 | "cell_type": "code", 494 | "execution_count": 13, 495 | "metadata": { 496 | "ExecuteTime": { 497 | "end_time": "2018-03-22T11:14:10.144457Z", 498 | "start_time": "2018-03-22T11:14:09.992571Z" 499 | } 500 | }, 501 | "outputs": [ 502 | { 503 | "name": "stdout", 504 | "output_type": "stream", 505 | "text": [ 506 | "_________________________________________________________________\n", 507 | "Layer (type) Output Shape Param # \n", 508 | "=================================================================\n", 509 | "dense_1 (Dense) (None, 128) 100480 \n", 510 | "_________________________________________________________________\n", 511 | "dropout_1 (Dropout) (None, 128) 0 \n", 512 | "_________________________________________________________________\n", 513 | "dense_2 (Dense) (None, 10) 1290 \n", 514 | "=================================================================\n", 515 | "Total params: 101,770\n", 516 | "Trainable params: 101,770\n", 517 | "Non-trainable params: 0\n", 518 | "_________________________________________________________________\n" 519 | ] 520 | } 521 | ], 522 | "source": [ 523 | "model = Sequential()\n", 524 | "\n", 525 | "model.add(Dense(128, activation='relu', input_shape=(784,)))\n", 526 | "model.add(Dropout(0.5))\n", 527 | "model.add(Dense(10, activation='softmax'))\n", 528 | " \n", 529 | "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n", 530 | "model.summary()" 531 | ] 532 | }, 533 | { 534 | "cell_type": "code", 535 | "execution_count": 14, 536 | "metadata": { 537 | "ExecuteTime": { 538 | "end_time": "2018-03-22T11:14:56.894026Z", 539 | "start_time": "2018-03-22T11:14:10.146469Z" 540 | } 541 | }, 542 | "outputs": [ 543 | { 544 | "name": "stdout", 545 | "output_type": "stream", 546 | "text": [ 547 | "Train on 60000 samples, validate on 10000 samples\n", 548 | "Epoch 1/10\n", 549 | "60000/60000 [==============================] - 2s 38us/step - loss: 0.5052 - acc: 0.8518 - val_loss: 0.2203 - val_acc: 0.9348\n", 550 | "Epoch 2/10\n", 551 | "60000/60000 [==============================] - 2s 31us/step - loss: 0.2652 - acc: 0.9217 - val_loss: 0.1584 - val_acc: 0.9532\n", 552 | "Epoch 3/10\n", 553 | "60000/60000 [==============================] - 2s 32us/step - loss: 0.2157 - acc: 0.9377 - val_loss: 0.1358 - val_acc: 0.9603\n", 554 | "Epoch 4/10\n", 555 | "60000/60000 [==============================] - 2s 32us/step - loss: 0.1874 - acc: 0.9449 - val_loss: 0.1137 - val_acc: 0.9663\n", 556 | "Epoch 5/10\n", 557 | "60000/60000 [==============================] - 2s 36us/step - loss: 0.1678 - acc: 0.9500 - val_loss: 0.1051 - val_acc: 0.9682\n", 558 | "Epoch 6/10\n", 559 | "60000/60000 [==============================] - 2s 38us/step - loss: 0.1566 - acc: 0.9531 - val_loss: 0.0946 - val_acc: 0.9722\n", 560 | "Epoch 7/10\n", 561 | "60000/60000 [==============================] - 2s 38us/step - loss: 0.1438 - acc: 0.9569 - val_loss: 0.0970 - val_acc: 0.9722\n", 562 | "Epoch 8/10\n", 563 | "60000/60000 [==============================] - 2s 35us/step - loss: 0.1378 - acc: 0.9581 - val_loss: 0.0898 - val_acc: 0.9725\n", 564 | "Epoch 9/10\n", 565 | "60000/60000 [==============================] - 2s 38us/step - loss: 0.1282 - acc: 0.9609 - val_loss: 0.0884 - val_acc: 0.9735\n", 566 | "Epoch 10/10\n", 567 | "60000/60000 [==============================] - 2s 40us/step - loss: 0.1259 - acc: 0.9608 - val_loss: 0.0850 - val_acc: 0.9750\n" 568 | ] 569 | } 570 | ], 571 | "source": [ 572 | "model.fit(X_train_flat, Y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test_flat, Y_test));" 573 | ] 574 | }, 575 | { 576 | "cell_type": "markdown", 577 | "metadata": {}, 578 | "source": [ 579 | "### Quite good results! Let's try with a deeper network" 580 | ] 581 | }, 582 | { 583 | "cell_type": "code", 584 | "execution_count": 15, 585 | "metadata": { 586 | "ExecuteTime": { 587 | "end_time": "2018-03-22T11:14:57.045315Z", 588 | "start_time": "2018-03-22T11:14:56.895775Z" 589 | } 590 | }, 591 | "outputs": [ 592 | { 593 | "name": "stdout", 594 | "output_type": "stream", 595 | "text": [ 596 | "_________________________________________________________________\n", 597 | "Layer (type) Output Shape Param # \n", 598 | "=================================================================\n", 599 | "dense_3 (Dense) (None, 128) 100480 \n", 600 | "_________________________________________________________________\n", 601 | "dropout_2 (Dropout) (None, 128) 0 \n", 602 | "_________________________________________________________________\n", 603 | "dense_4 (Dense) (None, 128) 16512 \n", 604 | "_________________________________________________________________\n", 605 | "dropout_3 (Dropout) (None, 128) 0 \n", 606 | "_________________________________________________________________\n", 607 | "dense_5 (Dense) (None, 10) 1290 \n", 608 | "=================================================================\n", 609 | "Total params: 118,282\n", 610 | "Trainable params: 118,282\n", 611 | "Non-trainable params: 0\n", 612 | "_________________________________________________________________\n" 613 | ] 614 | } 615 | ], 616 | "source": [ 617 | "model = Sequential()\n", 618 | "model.add(Dense(128, activation='relu', input_shape=(784,)))\n", 619 | "model.add(Dropout(0.5))\n", 620 | "model.add(Dense(128, activation='relu'))\n", 621 | "model.add(Dropout(0.5))\n", 622 | "model.add(Dense(10, activation='softmax'))\n", 623 | "\n", 624 | "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n", 625 | "model.summary()" 626 | ] 627 | }, 628 | { 629 | "cell_type": "code", 630 | "execution_count": 16, 631 | "metadata": { 632 | "ExecuteTime": { 633 | "end_time": "2018-03-22T11:15:18.483607Z", 634 | "start_time": "2018-03-22T11:14:57.046759Z" 635 | } 636 | }, 637 | "outputs": [ 638 | { 639 | "name": "stdout", 640 | "output_type": "stream", 641 | "text": [ 642 | "Train on 60000 samples, validate on 10000 samples\n", 643 | "Epoch 1/10\n", 644 | "60000/60000 [==============================] - 3s 47us/step - loss: 0.6482 - acc: 0.7980 - val_loss: 0.2146 - val_acc: 0.9354\n", 645 | "Epoch 2/10\n", 646 | "60000/60000 [==============================] - 2s 40us/step - loss: 0.3172 - acc: 0.9080 - val_loss: 0.1640 - val_acc: 0.9501\n", 647 | "Epoch 3/10\n", 648 | "60000/60000 [==============================] - 3s 45us/step - loss: 0.2581 - acc: 0.9255 - val_loss: 0.1366 - val_acc: 0.9589\n", 649 | "Epoch 4/10\n", 650 | "60000/60000 [==============================] - 3s 49us/step - loss: 0.2259 - acc: 0.9342 - val_loss: 0.1268 - val_acc: 0.9627\n", 651 | "Epoch 5/10\n", 652 | "60000/60000 [==============================] - 3s 49us/step - loss: 0.2029 - acc: 0.9410 - val_loss: 0.1160 - val_acc: 0.9649\n", 653 | "Epoch 6/10\n", 654 | "60000/60000 [==============================] - 3s 52us/step - loss: 0.1882 - acc: 0.9449 - val_loss: 0.1058 - val_acc: 0.9678\n", 655 | "Epoch 7/10\n", 656 | "60000/60000 [==============================] - 3s 51us/step - loss: 0.1772 - acc: 0.9482 - val_loss: 0.0926 - val_acc: 0.9706\n", 657 | "Epoch 8/10\n", 658 | "60000/60000 [==============================] - 3s 52us/step - loss: 0.1665 - acc: 0.9509 - val_loss: 0.0990 - val_acc: 0.9688\n", 659 | "Epoch 9/10\n", 660 | "60000/60000 [==============================] - 3s 50us/step - loss: 0.1603 - acc: 0.9518 - val_loss: 0.0926 - val_acc: 0.9717\n", 661 | "Epoch 10/10\n", 662 | "60000/60000 [==============================] - 3s 51us/step - loss: 0.1550 - acc: 0.9554 - val_loss: 0.0923 - val_acc: 0.9727\n" 663 | ] 664 | } 665 | ], 666 | "source": [ 667 | "model.fit(X_train_flat, Y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test_flat, Y_test));" 668 | ] 669 | }, 670 | { 671 | "cell_type": "markdown", 672 | "metadata": {}, 673 | "source": [ 674 | "### Let's use now a convolutional network" 675 | ] 676 | }, 677 | { 678 | "cell_type": "code", 679 | "execution_count": 17, 680 | "metadata": { 681 | "ExecuteTime": { 682 | "end_time": "2018-03-22T11:15:18.812491Z", 683 | "start_time": "2018-03-22T11:15:18.485237Z" 684 | } 685 | }, 686 | "outputs": [ 687 | { 688 | "name": "stdout", 689 | "output_type": "stream", 690 | "text": [ 691 | "_________________________________________________________________\n", 692 | "Layer (type) Output Shape Param # \n", 693 | "=================================================================\n", 694 | "conv2d_1 (Conv2D) (None, 26, 26, 8) 80 \n", 695 | "_________________________________________________________________\n", 696 | "max_pooling2d_1 (MaxPooling2 (None, 13, 13, 8) 0 \n", 697 | "_________________________________________________________________\n", 698 | "conv2d_2 (Conv2D) (None, 11, 11, 16) 1168 \n", 699 | "_________________________________________________________________\n", 700 | "max_pooling2d_2 (MaxPooling2 (None, 5, 5, 16) 0 \n", 701 | "_________________________________________________________________\n", 702 | "dropout_4 (Dropout) (None, 5, 5, 16) 0 \n", 703 | "_________________________________________________________________\n", 704 | "flatten_1 (Flatten) (None, 400) 0 \n", 705 | "_________________________________________________________________\n", 706 | "dense_6 (Dense) (None, 64) 25664 \n", 707 | "_________________________________________________________________\n", 708 | "dropout_5 (Dropout) (None, 64) 0 \n", 709 | "_________________________________________________________________\n", 710 | "dense_7 (Dense) (None, 10) 650 \n", 711 | "=================================================================\n", 712 | "Total params: 27,562\n", 713 | "Trainable params: 27,562\n", 714 | "Non-trainable params: 0\n", 715 | "_________________________________________________________________\n" 716 | ] 717 | } 718 | ], 719 | "source": [ 720 | "cnn = Sequential()\n", 721 | "cnn.add(Convolution2D(8, kernel_size=(3, 3), activation='relu', input_shape=(28,28,1)))\n", 722 | "cnn.add(MaxPooling2D(pool_size=(2,2)))\n", 723 | "cnn.add(Convolution2D(16, (3, 3), activation='relu'))\n", 724 | "cnn.add(MaxPooling2D(pool_size=(2,2)))\n", 725 | "cnn.add(Dropout(0.5))\n", 726 | " \n", 727 | "cnn.add(Flatten())\n", 728 | "cnn.add(Dense(64, activation='relu'))\n", 729 | "cnn.add(Dropout(0.5))\n", 730 | "cnn.add(Dense(10, activation='softmax'))\n", 731 | "\n", 732 | "cnn.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n", 733 | "cnn.summary()" 734 | ] 735 | }, 736 | { 737 | "cell_type": "code", 738 | "execution_count": 18, 739 | "metadata": { 740 | "ExecuteTime": { 741 | "end_time": "2018-03-22T11:16:26.353997Z", 742 | "start_time": "2018-03-22T11:15:18.813851Z" 743 | } 744 | }, 745 | "outputs": [ 746 | { 747 | "name": "stdout", 748 | "output_type": "stream", 749 | "text": [ 750 | "Train on 60000 samples, validate on 10000 samples\n", 751 | "Epoch 1/10\n", 752 | "60000/60000 [==============================] - 17s 291us/step - loss: 0.7768 - acc: 0.7489 - val_loss: 0.1571 - val_acc: 0.9555\n", 753 | "Epoch 2/10\n", 754 | "60000/60000 [==============================] - 18s 303us/step - loss: 0.3427 - acc: 0.8961 - val_loss: 0.1069 - val_acc: 0.9680\n", 755 | "Epoch 3/10\n", 756 | "60000/60000 [==============================] - 19s 309us/step - loss: 0.2757 - acc: 0.9174 - val_loss: 0.0855 - val_acc: 0.9735\n", 757 | "Epoch 4/10\n", 758 | "60000/60000 [==============================] - 18s 303us/step - loss: 0.2369 - acc: 0.9288 - val_loss: 0.0772 - val_acc: 0.9756\n", 759 | "Epoch 5/10\n", 760 | "60000/60000 [==============================] - 19s 323us/step - loss: 0.2163 - acc: 0.9355 - val_loss: 0.0651 - val_acc: 0.9790\n", 761 | "Epoch 6/10\n", 762 | "60000/60000 [==============================] - 19s 316us/step - loss: 0.2022 - acc: 0.9397 - val_loss: 0.0619 - val_acc: 0.9800\n", 763 | "Epoch 7/10\n", 764 | "60000/60000 [==============================] - 24s 392us/step - loss: 0.1912 - acc: 0.9436 - val_loss: 0.0556 - val_acc: 0.9826\n", 765 | "Epoch 8/10\n", 766 | "60000/60000 [==============================] - 21s 343us/step - loss: 0.1804 - acc: 0.9460 - val_loss: 0.0518 - val_acc: 0.9831\n", 767 | "Epoch 9/10\n", 768 | "60000/60000 [==============================] - 21s 342us/step - loss: 0.1727 - acc: 0.9492 - val_loss: 0.0517 - val_acc: 0.9832\n", 769 | "Epoch 10/10\n", 770 | "60000/60000 [==============================] - 20s 341us/step - loss: 0.1683 - acc: 0.9496 - val_loss: 0.0498 - val_acc: 0.9844\n" 771 | ] 772 | } 773 | ], 774 | "source": [ 775 | "cnn.fit(X_train, Y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test, Y_test));" 776 | ] 777 | }, 778 | { 779 | "cell_type": "markdown", 780 | "metadata": {}, 781 | "source": [ 782 | "The Convolutional Neural Network performs better with fewer parameters" 783 | ] 784 | }, 785 | { 786 | "cell_type": "markdown", 787 | "metadata": {}, 788 | "source": [ 789 | "## So far so good, but what about if we would have a *more difficult* problem?\n", 790 | "**56x56** instead of 28x28 with the number in a random location\n", 791 | "### Prepare data" 792 | ] 793 | }, 794 | { 795 | "cell_type": "code", 796 | "execution_count": 19, 797 | "metadata": { 798 | "ExecuteTime": { 799 | "end_time": "2018-03-22T11:16:26.857182Z", 800 | "start_time": "2018-03-22T11:16:26.356239Z" 801 | }, 802 | "collapsed": true 803 | }, 804 | "outputs": [], 805 | "source": [ 806 | "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n", 807 | "Y_train = np_utils.to_categorical(y_train, n_classes)\n", 808 | "Y_test = np_utils.to_categorical(y_test, n_classes)\n", 809 | "X_extendend_train = np.zeros((60000, 56, 56))\n", 810 | "X_extendend_test = np.zeros((10000, 56, 56))" 811 | ] 812 | }, 813 | { 814 | "cell_type": "code", 815 | "execution_count": 20, 816 | "metadata": { 817 | "ExecuteTime": { 818 | "end_time": "2018-03-22T11:16:27.659113Z", 819 | "start_time": "2018-03-22T11:16:26.858871Z" 820 | }, 821 | "collapsed": true 822 | }, 823 | "outputs": [], 824 | "source": [ 825 | "for i in range(60000):\n", 826 | " posx = np.random.randint(0, 28)\n", 827 | " posy = np.random.randint(0, 28)\n", 828 | " X_extendend_train[i,posx:posx+28, posy:posy+28] = X_train[i]\n", 829 | "for i in range(10000):\n", 830 | " posx = np.random.randint(0, 28)\n", 831 | " posy = np.random.randint(0, 28)\n", 832 | " X_extendend_test[i,posx:posx+28, posy:posy+28] = X_test[i]" 833 | ] 834 | }, 835 | { 836 | "cell_type": "code", 837 | "execution_count": 21, 838 | "metadata": { 839 | "ExecuteTime": { 840 | "end_time": "2018-03-22T11:16:29.455093Z", 841 | "start_time": "2018-03-22T11:16:29.450926Z" 842 | } 843 | }, 844 | "outputs": [ 845 | { 846 | "name": "stdout", 847 | "output_type": "stream", 848 | "text": [ 849 | "Training X_train_flat shape (60000, 3136)\n", 850 | "Testing X_test_flat shape (10000, 3136)\n" 851 | ] 852 | } 853 | ], 854 | "source": [ 855 | "X_train_flat_extended = X_extendend_train.reshape(-1, 56*56)\n", 856 | "X_test_flat_extended = X_extendend_test.reshape(-1, 56*56)\n", 857 | "print(\"Training X_train_flat shape\", X_train_flat_extended.shape)\n", 858 | "print(\"Testing X_test_flat shape\", X_test_flat_extended.shape)" 859 | ] 860 | }, 861 | { 862 | "cell_type": "code", 863 | "execution_count": 22, 864 | "metadata": { 865 | "ExecuteTime": { 866 | "end_time": "2018-03-22T11:16:29.486975Z", 867 | "start_time": "2018-03-22T11:16:29.456244Z" 868 | } 869 | }, 870 | "outputs": [ 871 | { 872 | "name": "stdout", 873 | "output_type": "stream", 874 | "text": [ 875 | "Training matrix shape (60000, 56, 56, 1)\n", 876 | "Testing matrix shape (10000, 56, 56, 1)\n", 877 | "Input shape (56, 56, 1)\n" 878 | ] 879 | } 880 | ], 881 | "source": [ 882 | "# input image dimensions\n", 883 | "img_rows_extended, img_cols_extended = 56, 56\n", 884 | "\n", 885 | "if K.image_data_format() == 'channels_first':\n", 886 | " X_train_extended = X_extendend_train.reshape(X_extendend_train.shape[0], 1, img_rows_extended, img_cols_extended)\n", 887 | " X_test_extended = X_extendend_test.reshape(X_extendend_test.shape[0], 1, img_rows_extended, img_cols_extended)\n", 888 | " input_shape_extended = (1, img_rows_extended, img_cols_extended)\n", 889 | "else:\n", 890 | " X_train_extended = X_extendend_train.reshape(X_extendend_train.shape[0], img_rows_extended, img_cols_extended, 1)\n", 891 | " X_test_extended = X_extendend_test.reshape(X_extendend_test.shape[0], img_rows_extended, img_cols_extended, 1)\n", 892 | " input_shape_extended = (img_rows_extended, img_cols_extended, 1)\n", 893 | "\n", 894 | "print(\"Training matrix shape\", X_train_extended.shape)\n", 895 | "print(\"Testing matrix shape\", X_test_extended.shape)\n", 896 | "print(\"Input shape\", input_shape_extended)" 897 | ] 898 | }, 899 | { 900 | "cell_type": "code", 901 | "execution_count": 23, 902 | "metadata": { 903 | "ExecuteTime": { 904 | "end_time": "2018-03-22T11:19:32.864858Z", 905 | "start_time": "2018-03-22T11:19:31.021855Z" 906 | } 907 | }, 908 | "outputs": [ 909 | { 910 | "data": { 911 | "image/png": "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9atfATB79mwA7r//frbaaqu61dWezZo1C4Bx48YBcNhhhzFjxgwAttxySwBOO+00ADbffHO++uorAPbaay8A7rrrrmaP169fv+oXLUlSB+UpJJIkSZIkKXl2YEiS1M4NHz4cgHPOOQeAhRZq/vlECKHWJXUYI0eOBODQQw8tXDdw4EAgdzoJQNeuXQu3ZdeVdl706NEDgIMOOqh6xUqS1MHZgSFJkiRJkpJnB4YkSe3c22+/DVCYf0Ftd+qppwJw9tlnA8Uulp///OeFuUaadl5kfvOb35R9vEsvvRSA5ZdfvuK1SpLUKOzAkCRJkiRJybMDQ5Kkduyee+7h97//fbPr1lprLQBuu+02AFZcccWa19VenXHGGUCx86Jz584A7LDDDgCce+65dOnSpdl9vvzySyA378XEiROB4rKpWSfHoEGDqly5JDU3ZMiQQvfXOuusAxRfF3r16lW3ulQZr776KgAzZ84E4KGHHgJynYKlc2GVk70uZUt7Z693qbMDQ5IkSZIkJc8ODEmS2qGHH34YgIMPPpjp06c3u+24444D/ISttaZNm8Zll10GFOe8yDov/vGPf8yx/euvvw7AfvvtB8D48eMLt/3whz8Eiv8WklQrEyZMAHKrKGWfxL/00ksAvPzyy4CvD+3V888/z9VXXw3ADTfcAMDs2bMBePfdd4HcSmQtWX3slltuAeCnP/0pABdffDFQfn6nlDiAIUlSO5S9gZk8eXLhuq222gqAAw88sC41tXczZ85kypQpza7L2q8/+OADAP76178W3vQ9//zzAHz22WdAbtAje9O4//77A7DEEktUv3BJamK55ZYDYMsttywcr9QxnHzyyYwdO7aij3nNNdcA8OMf/xiAzTffvKKPX2meQiJJkiRJkpJnB4YkSe1I1iFw1VVXAblW0W7dugHFCSO1YDp37lxY5vTDDz8E4Fvf+hZA2XbclVdeGSi2206ePLnwyecuu+xS9XolqZys88vTRDqegQMHztGBscIKKwDFDorZs2fPMYnnI488AsCDDz5Ygyqryw4MSZIkSZKUvPl2YIQQVgWuAVYCZgPDYoyXhBCWAUYBvYEJwF4xxo+rV6pSYi6qL5sM7g9/+ANQPD8tO7d98ODBbLjhhvUprgwzoXLMReVkk7Ltueeec9w2ePBgALbddttalrTAUs1Ft27dCpN17rzzzgB89NFHAKy++upAbtm5gw8+GIBlllkGgL333hvIdWBk36t1Us1ESj799NPCfCv//Oc/geLcLEOHDmXRRRetW23VYi4WzLRp0wB45pln6lxJdTRyLn72s5+x2267NbtukUUWAWCllVaa6/0++eQTILecbjbZZyZ7vI033riSpVZNSzowZgFDY4x9ge8BR4YQ1gZOBO6NMfYB7s3/rMZhLlTKTKgcc6FyzIVKmQmVYy5UjrloYPPtwIgxTgYm57//NITwErAKMAjYOr/Z1cD9wAlVqVLJMRfV9fTTTzNw4ECgOGKanX89YsQIILf00dSpU+tTYBlmQuWYi8q54447AHj22WebXT9gwACGDBlSj5IWWMq52HTTTYHiHBjzkp1L/MADDwC5+UhWW2216hXXgaWciXp56623ADjvvPMAePTRRwsr35R67733CivmdCTmYsHMmDEDgIkTJ85x27hx4wBYa621gPY5T0Yj52LhhRdm1VVXbfX97rzzTgA+/njOhpQePXoAtJsurlZN4hlC6A1sADwOrJgPDzHGySGEFeZyn8OBwwF69uzZllqVqNbmwkzM3X/+8x8g1yI+ffp0oDhwseSSSwK5SeYApk6dyqOPPgrARhtt1Oy2evNYoXLMxYLJTmk48cTmHyRly5xdffXVLLXUUjWvq1La82vIF198AVCYLC2E4CkkFdCox4qXX34ZgIsvvhiAkSNHAvDll18CEGMs/OGSvSd46aWXABg9ejQ///nPgeIfph1No+ZiQWQTDB988MGcfvrpzW7Lfs4mfz7qqKNqWVrFtefXkFq4/vrrARg2bBhQfN1q6owzzqhpTW3V4kk8QwhLAH8HjokxftLS+8UYh8UY+8UY+2Uze6vjWJBcmImOzWOFyjEXKsfXEJXyWKFyzIXK8TWkMbWoAyOEsAi5cFwbYxyTv/r9EEL3/OhWd+CDahWpNJmLtsta/J588kkA9t9/fyA3EVypNdZYA4ATTsh1wu29996FT2DPPPNMAE4++eTqFjwfZkLlmIsFN2HChLKTdgKFUxVWXHHFWpZUMR0hFzvssEO9S+hQOkImWivrtjzhhBMYNWoUkJuss5w+ffoU2sBnzpwJQN++fYHc8srZEssdTSPmolJOO+20OTowOgpzMXcjR47knHPOAeCNN94A4Ouvv55ju/XXXx8oTgLaXsy3AyPk+tevBF6K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vLFG1ak9uueeexgzZgxQPM5Mnz4dgBDCHNs/9thjtStOklQRRx55JAD3338/AC+//HIdq1Gje+CBB3juueeA4t9FN910E1BcOQfmfB/y2muvAdC3b99Cl0aKHMBQh3P44YcDxf+E2VJW2R+l5WSDHVOnTuWKK64AYL311qtmmUrQyJEjAXj22WeBebfQzStPalzZhG3ZG4dx48bNsc2SSy4JwH777QdAv3792HfffQFYbLHFalGmJKmCNtlkk2Y/jx49GoBzzz2X7t2716MkdWCTJ08Gisv3vvnmm81unz59Op9//jlQHLDYcMMNAXjqqafm+rizZ88GYMaMGZUtuMI8hUSSJEmSJCXPDgx1OF26dAGKbVFffvnlXLfNJmmcOHEiAAsttNA8t1fHk7V57r777rz++usAzJo1a77323XXXatal9qHqVOnAnDSSScBcNVVVwHFU9Y22mgjTjzxRADWWWcdoHiM6tmzZ01rlSRVV/Zp98yZMwG45ZZbOOKII+pZkjqYe+65h8MOOwyAd955Z77bZ53oyy23HABTpkwpTDZ7yCGHADBp0qRm91l77bUrVm812IEhSZIkSZKSZweGOpTTTjutMOFithRQubksPvvsMyB3biIUz/X63ve+V5jIUY0hm6TorbfealHnReaiiy4C4Pe//31V6lL7cOaZZwJw5ZVXAjB48GCgOK/OEkssUZ/CJEk1VzopYtaJIVXKeeedN9fOi0UXXRTI/X2z6aabArDmmms222bZZZflkksuAebsvOjduzcAI0aMqGTJFWcHhiRJkiRJSp4dGOoQspHIK664goUXzsX6j3/8IwDLL7/8HNsPHToUgBtuuAGAlVdeGYB///vfVa9Vadl9992B3Ij2CSecAMx73pRMNgO0GkfWqZV1bl1zzTWFTzG22WYbAHbYYQfA1UQkSVLl3HXXXUD55dZXXXVVoNg5Mb+V8ko7LzLZ/G7ZfBmpsgNDkiRJkiQlzw4MtWvPPfccAHvssQeQm1k3Owd9q622Knuf888/n+HDhze77pRTTqlekWoXjj76aPr06QPAtGnTmt02a9YsjjrqKAA++eSTmtemNJx11llAsQNjr732YvvttwfsuJAkSdVzwQUXAMVuUID+/fsDcPrppwPz7rz4+OOPAbj99tt58MEHm92WPc4PfvCDitVbTQ5gqF3JJlkcOXIk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dYGs5fwvf/kLUFoW9dRTTwXgl7/8JVC9+3biiSfypz/9CYCVVloJgNNPPx0ojWtT93jggQeA0soRAJMnT17kvvfeey8A/fv3B+Bzn/tc9xanhrXssssC1Z4Xw4cPB6B37951q0n19e1vfxuAmTNnAtUVAzITJkzg5ptvBuCwww5r99dfddVVK708/vnPf7Z6bZ999mn311N6OrsKWdbzIlvx5o033gBKcydk82GsuuqqnXoPddyCBQuAUk/QbD6LSy+9FIBevRb+0+zAAw8E4MUXXwTgpJNOKqJM1cnEiRMBKssqZ7LVDLMVC5uZPTAkSZIkSVLy7IEhdYHPf/7zAHzpS18CSj0w7rrrLgD++te/AtU1vVvONJ6NZ8ubbVpdKxtzvuGGGwKwzjrrtHr9qquuqtzVyNbezlq7x4wZwzHHHFNUqWoQU6ZMYezYsUB1BaGsF1U2zlzNZ8kllwSqq0tk555p06ZV9sl65n3zm98E2nfHffbs2Qv1vFDjijEC1Xl0oLpizcEHH9zmr/Puu+9W9r/ttttavZZd726//XY22GCDTtWrzst6wUydOpW7774bqPbIrXX99ddXeo4ucj3X8wAAEN5JREFUv/zyQHVVO/VMhx56KABnn302AO+99x4AX//61+tWU2pswJC6QPaHbp8+fSrbZs2aBVQn28l+SQkhVE5Ou+++e5FlNrUrrrgCKP0yANWf2fz584FSN+/f/OY3QHV52z//+c9A6ZfJddddF4ARI0YUV7SS9M477wClLLzyyisAnH/++YBLIKtqhRVWAODLX/4y0LoBI1t+9+WXXwbyGzCyc1N2XspkS6WqZ8iWz9x3330r55bMNttsA1S7jO+2226VBohsos/sd4v58+dXlknNJgbPltPdY489AGy8SMTVV18NwPrrr185P9R69dVXgdLNr6xxK7uR4vCf5pBN3qqFOYREkiRJkiQlzx4YdfDf//3fANxxxx0APPXUUzz//POt9hk2bBhQ6u4H1Ts5Sltbuo2PHDmy0v1vjTXW6OaKBKUlqbJJs2onyHriiSeA0t302rvn++67LwAPPvggP/nJTyr7qbllSxK+8sor7LfffoCTqmnRsjus11xzzUKvPfzww0B1GOLf/va3ysd3330XgB/96EeLfY9saFxHlmVVfW233XYA3HzzzZUem1lPjPvvvx+oThKcTUbd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\n", 912 | "text/plain": [ 913 | "" 914 | ] 915 | }, 916 | "metadata": {}, 917 | "output_type": "display_data" 918 | } 919 | ], 920 | "source": [ 921 | "plt.figure(figsize=(15,6))\n", 922 | "for i in range(24):\n", 923 | " plt.subplot(3,8,i+1)\n", 924 | " plt.imshow(255-X_extendend_train[i], cmap='gray', interpolation='none')\n", 925 | " plt.title(\"Class {}\".format(y_train[i]))\n", 926 | "plt.tight_layout()" 927 | ] 928 | }, 929 | { 930 | "cell_type": "markdown", 931 | "metadata": {}, 932 | "source": [ 933 | "### Simple Network" 934 | ] 935 | }, 936 | { 937 | "cell_type": "code", 938 | "execution_count": 24, 939 | "metadata": { 940 | "ExecuteTime": { 941 | "end_time": "2018-03-22T11:16:29.626612Z", 942 | "start_time": "2018-03-22T11:16:29.488124Z" 943 | } 944 | }, 945 | "outputs": [ 946 | { 947 | "name": "stdout", 948 | "output_type": "stream", 949 | "text": [ 950 | "_________________________________________________________________\n", 951 | "Layer (type) Output Shape Param # \n", 952 | "=================================================================\n", 953 | "dense_8 (Dense) (None, 128) 401536 \n", 954 | "_________________________________________________________________\n", 955 | "dropout_6 (Dropout) (None, 128) 0 \n", 956 | "_________________________________________________________________\n", 957 | "dense_9 (Dense) (None, 10) 1290 \n", 958 | "=================================================================\n", 959 | "Total params: 402,826\n", 960 | "Trainable params: 402,826\n", 961 | "Non-trainable params: 0\n", 962 | "_________________________________________________________________\n" 963 | ] 964 | } 965 | ], 966 | "source": [ 967 | "model = Sequential()\n", 968 | "\n", 969 | "model.add(Dense(128, activation='relu', input_shape=(3136,)))\n", 970 | "model.add(Dropout(0.5))\n", 971 | "model.add(Dense(10, activation='softmax'))\n", 972 | " \n", 973 | "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n", 974 | "model.summary()" 975 | ] 976 | }, 977 | { 978 | "cell_type": "code", 979 | "execution_count": 25, 980 | "metadata": { 981 | "ExecuteTime": { 982 | "end_time": "2018-03-22T11:16:59.743208Z", 983 | "start_time": "2018-03-22T11:16:29.627801Z" 984 | } 985 | }, 986 | "outputs": [ 987 | { 988 | "name": "stdout", 989 | "output_type": "stream", 990 | "text": [ 991 | "Train on 60000 samples, validate on 10000 samples\n", 992 | "Epoch 1/10\n", 993 | "60000/60000 [==============================] - 11s 177us/step - loss: 14.2283 - acc: 0.1141 - val_loss: 14.2498 - val_acc: 0.1146\n", 994 | "Epoch 2/10\n", 995 | "60000/60000 [==============================] - 9s 147us/step - loss: 14.0690 - acc: 0.1248 - val_loss: 13.8900 - val_acc: 0.1363\n", 996 | "Epoch 3/10\n", 997 | "60000/60000 [==============================] - 9s 149us/step - loss: 14.0078 - acc: 0.1292 - val_loss: 14.1713 - val_acc: 0.1200\n", 998 | "Epoch 4/10\n", 999 | "60000/60000 [==============================] - 9s 151us/step - loss: 13.9243 - acc: 0.1349 - val_loss: 13.8727 - val_acc: 0.1382\n", 1000 | "Epoch 5/10\n", 1001 | "60000/60000 [==============================] - 9s 152us/step - loss: 13.8569 - acc: 0.1393 - val_loss: 13.7519 - val_acc: 0.1463\n", 1002 | "Epoch 6/10\n", 1003 | "60000/60000 [==============================] - 9s 154us/step - loss: 13.7816 - acc: 0.1442 - val_loss: 13.7431 - val_acc: 0.1468\n", 1004 | "Epoch 7/10\n", 1005 | "60000/60000 [==============================] - 9s 156us/step - loss: 13.8239 - acc: 0.1418 - val_loss: 13.8757 - val_acc: 0.1383\n", 1006 | "Epoch 8/10\n", 1007 | "60000/60000 [==============================] - 9s 155us/step - loss: 13.7789 - acc: 0.1446 - val_loss: 13.6672 - val_acc: 0.1515\n", 1008 | "Epoch 9/10\n", 1009 | "60000/60000 [==============================] - 9s 155us/step - loss: 13.7375 - acc: 0.1472 - val_loss: 13.6377 - val_acc: 0.1531\n", 1010 | "Epoch 10/10\n", 1011 | "60000/60000 [==============================] - 10s 161us/step - loss: 13.6832 - acc: 0.1503 - val_loss: 13.5794 - val_acc: 0.1567\n" 1012 | ] 1013 | } 1014 | ], 1015 | "source": [ 1016 | "model.fit(X_train_flat_extended, Y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test_flat_extended, Y_test));" 1017 | ] 1018 | }, 1019 | { 1020 | "cell_type": "markdown", 1021 | "metadata": {}, 1022 | "source": [ 1023 | "### Deeper Network" 1024 | ] 1025 | }, 1026 | { 1027 | "cell_type": "code", 1028 | "execution_count": 26, 1029 | "metadata": { 1030 | "ExecuteTime": { 1031 | "end_time": "2018-03-22T11:16:59.895748Z", 1032 | "start_time": "2018-03-22T11:16:59.745281Z" 1033 | } 1034 | }, 1035 | "outputs": [ 1036 | { 1037 | "name": "stdout", 1038 | "output_type": "stream", 1039 | "text": [ 1040 | "_________________________________________________________________\n", 1041 | "Layer (type) Output Shape Param # \n", 1042 | "=================================================================\n", 1043 | "dense_10 (Dense) (None, 128) 401536 \n", 1044 | "_________________________________________________________________\n", 1045 | "dropout_7 (Dropout) (None, 128) 0 \n", 1046 | "_________________________________________________________________\n", 1047 | "dense_11 (Dense) (None, 64) 8256 \n", 1048 | "_________________________________________________________________\n", 1049 | "dropout_8 (Dropout) (None, 64) 0 \n", 1050 | "_________________________________________________________________\n", 1051 | "dense_12 (Dense) (None, 10) 650 \n", 1052 | "=================================================================\n", 1053 | "Total params: 410,442\n", 1054 | "Trainable params: 410,442\n", 1055 | "Non-trainable params: 0\n", 1056 | "_________________________________________________________________\n" 1057 | ] 1058 | } 1059 | ], 1060 | "source": [ 1061 | "model = Sequential()\n", 1062 | "model.add(Dense(128, activation='relu', input_shape=(3136,)))\n", 1063 | "model.add(Dropout(0.5))\n", 1064 | "model.add(Dense(64, activation='relu'))\n", 1065 | "model.add(Dropout(0.5))\n", 1066 | "model.add(Dense(10, activation='softmax'))\n", 1067 | "\n", 1068 | "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n", 1069 | "model.summary()" 1070 | ] 1071 | }, 1072 | { 1073 | "cell_type": "code", 1074 | "execution_count": 27, 1075 | "metadata": { 1076 | "ExecuteTime": { 1077 | "end_time": "2018-03-22T11:17:33.465627Z", 1078 | "start_time": "2018-03-22T11:16:59.897862Z" 1079 | } 1080 | }, 1081 | "outputs": [ 1082 | { 1083 | "name": "stdout", 1084 | "output_type": "stream", 1085 | "text": [ 1086 | "Train on 60000 samples, validate on 10000 samples\n", 1087 | "Epoch 1/10\n", 1088 | "60000/60000 [==============================] - 10s 166us/step - loss: 14.2801 - acc: 0.1077 - val_loss: 14.2516 - val_acc: 0.1149\n", 1089 | "Epoch 2/10\n", 1090 | "60000/60000 [==============================] - 10s 159us/step - loss: 14.2509 - acc: 0.1141 - val_loss: 14.2152 - val_acc: 0.1177\n", 1091 | "Epoch 3/10\n", 1092 | "60000/60000 [==============================] - 10s 161us/step - loss: 14.2098 - acc: 0.1173 - val_loss: 14.2622 - val_acc: 0.1150\n", 1093 | "Epoch 4/10\n", 1094 | "60000/60000 [==============================] - 10s 166us/step - loss: 14.1982 - acc: 0.1182 - val_loss: 14.0263 - val_acc: 0.1290\n", 1095 | "Epoch 5/10\n", 1096 | "60000/60000 [==============================] - 10s 165us/step - loss: 14.1795 - acc: 0.1188 - val_loss: 14.1258 - val_acc: 0.1224\n", 1097 | "Epoch 6/10\n", 1098 | "60000/60000 [==============================] - 10s 168us/step - loss: 14.2043 - acc: 0.1176 - val_loss: 14.0765 - val_acc: 0.1262\n", 1099 | "Epoch 7/10\n", 1100 | "60000/60000 [==============================] - 10s 160us/step - loss: 14.1952 - acc: 0.1186 - val_loss: 14.1367 - val_acc: 0.1228\n", 1101 | "Epoch 8/10\n", 1102 | "60000/60000 [==============================] - 10s 161us/step - loss: 14.2147 - acc: 0.1178 - val_loss: 14.2863 - val_acc: 0.1136\n", 1103 | "Epoch 9/10\n", 1104 | "60000/60000 [==============================] - 10s 172us/step - loss: 14.2605 - acc: 0.1151 - val_loss: 14.2581 - val_acc: 0.1154\n", 1105 | "Epoch 10/10\n", 1106 | "60000/60000 [==============================] - 10s 164us/step - loss: 14.2523 - acc: 0.1157 - val_loss: 14.2468 - val_acc: 0.1161\n" 1107 | ] 1108 | } 1109 | ], 1110 | "source": [ 1111 | "model.fit(X_train_flat_extended, Y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test_flat_extended, Y_test));" 1112 | ] 1113 | }, 1114 | { 1115 | "cell_type": "markdown", 1116 | "metadata": {}, 1117 | "source": [ 1118 | "### Now with a convolutional neural network" 1119 | ] 1120 | }, 1121 | { 1122 | "cell_type": "code", 1123 | "execution_count": 28, 1124 | "metadata": { 1125 | "ExecuteTime": { 1126 | "end_time": "2018-03-22T11:17:33.658113Z", 1127 | "start_time": "2018-03-22T11:17:33.467129Z" 1128 | } 1129 | }, 1130 | "outputs": [ 1131 | { 1132 | "name": "stdout", 1133 | "output_type": "stream", 1134 | "text": [ 1135 | "_________________________________________________________________\n", 1136 | "Layer (type) Output Shape Param # \n", 1137 | "=================================================================\n", 1138 | "conv2d_3 (Conv2D) (None, 54, 54, 8) 80 \n", 1139 | "_________________________________________________________________\n", 1140 | "max_pooling2d_3 (MaxPooling2 (None, 27, 27, 8) 0 \n", 1141 | "_________________________________________________________________\n", 1142 | "conv2d_4 (Conv2D) (None, 25, 25, 16) 1168 \n", 1143 | "_________________________________________________________________\n", 1144 | "max_pooling2d_4 (MaxPooling2 (None, 12, 12, 16) 0 \n", 1145 | "_________________________________________________________________\n", 1146 | "dropout_9 (Dropout) (None, 12, 12, 16) 0 \n", 1147 | "_________________________________________________________________\n", 1148 | "flatten_2 (Flatten) (None, 2304) 0 \n", 1149 | "_________________________________________________________________\n", 1150 | "dense_13 (Dense) (None, 64) 147520 \n", 1151 | "_________________________________________________________________\n", 1152 | "dropout_10 (Dropout) (None, 64) 0 \n", 1153 | "_________________________________________________________________\n", 1154 | "dense_14 (Dense) (None, 10) 650 \n", 1155 | "=================================================================\n", 1156 | "Total params: 149,418\n", 1157 | "Trainable params: 149,418\n", 1158 | "Non-trainable params: 0\n", 1159 | "_________________________________________________________________\n" 1160 | ] 1161 | } 1162 | ], 1163 | "source": [ 1164 | "cnn = Sequential()\n", 1165 | "cnn.add(Convolution2D(8, kernel_size=(3, 3), activation='relu', input_shape=(56,56,1)))\n", 1166 | "cnn.add(MaxPooling2D(pool_size=(2,2)))\n", 1167 | "cnn.add(Convolution2D(16, (3, 3), activation='relu'))\n", 1168 | "cnn.add(MaxPooling2D(pool_size=(2,2)))\n", 1169 | "cnn.add(Dropout(0.5))\n", 1170 | " \n", 1171 | "cnn.add(Flatten())\n", 1172 | "cnn.add(Dense(64, activation='relu'))\n", 1173 | "cnn.add(Dropout(0.5))\n", 1174 | "cnn.add(Dense(10, activation='softmax'))\n", 1175 | "\n", 1176 | "cnn.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n", 1177 | "cnn.summary()" 1178 | ] 1179 | }, 1180 | { 1181 | "cell_type": "code", 1182 | "execution_count": 29, 1183 | "metadata": { 1184 | "ExecuteTime": { 1185 | "end_time": "2018-03-22T11:18:21.649245Z", 1186 | "start_time": "2018-03-22T11:17:33.659443Z" 1187 | } 1188 | }, 1189 | "outputs": [ 1190 | { 1191 | "name": "stdout", 1192 | "output_type": "stream", 1193 | "text": [ 1194 | "Train on 60000 samples, validate on 10000 samples\n", 1195 | "Epoch 1/10\n", 1196 | "60000/60000 [==============================] - 79s 1ms/step - loss: 3.3026 - acc: 0.1048 - val_loss: 2.2640 - val_acc: 0.1188\n", 1197 | "Epoch 2/10\n", 1198 | "60000/60000 [==============================] - 78s 1ms/step - loss: 2.1973 - acc: 0.1704 - val_loss: 1.9590 - val_acc: 0.3113\n", 1199 | "Epoch 3/10\n", 1200 | "60000/60000 [==============================] - 78s 1ms/step - loss: 1.8824 - acc: 0.2931 - val_loss: 1.3787 - val_acc: 0.5325\n", 1201 | "Epoch 4/10\n", 1202 | "60000/60000 [==============================] - 85s 1ms/step - loss: 1.5292 - acc: 0.4279 - val_loss: 0.9976 - val_acc: 0.7090\n", 1203 | "Epoch 5/10\n", 1204 | "60000/60000 [==============================] - 82s 1ms/step - loss: 1.2829 - acc: 0.5319 - val_loss: 0.7603 - val_acc: 0.7767\n", 1205 | "Epoch 6/10\n", 1206 | "60000/60000 [==============================] - 83s 1ms/step - loss: 1.1279 - acc: 0.5937 - val_loss: 0.6538 - val_acc: 0.8103\n", 1207 | "Epoch 7/10\n", 1208 | "60000/60000 [==============================] - 90s 1ms/step - loss: 1.0276 - acc: 0.6382 - val_loss: 0.5654 - val_acc: 0.8590\n", 1209 | "Epoch 8/10\n", 1210 | "60000/60000 [==============================] - 84s 1ms/step - loss: 0.9383 - acc: 0.6781 - val_loss: 0.4818 - val_acc: 0.8926\n", 1211 | "Epoch 9/10\n", 1212 | "60000/60000 [==============================] - 89s 1ms/step - loss: 0.8600 - acc: 0.7109 - val_loss: 0.3954 - val_acc: 0.9056\n", 1213 | "Epoch 10/10\n", 1214 | "60000/60000 [==============================] - 87s 1ms/step - loss: 0.7847 - acc: 0.7400 - val_loss: 0.3412 - val_acc: 0.9209\n" 1215 | ] 1216 | } 1217 | ], 1218 | "source": [ 1219 | "cnn.fit(X_train_extended, Y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test_extended, Y_test));" 1220 | ] 1221 | }, 1222 | { 1223 | "cell_type": "markdown", 1224 | "metadata": {}, 1225 | "source": [ 1226 | "## Conclusion\n", 1227 | "With a more difficult problem, only a convolutional neural network succeeds at identiying which object is in the image. In addition, it needs fewer number of parameters compared to non-convolutional approaches (e.g. only fully connected)." 1228 | ] 1229 | }, 1230 | { 1231 | "cell_type": "code", 1232 | "execution_count": null, 1233 | "metadata": {}, 1234 | "outputs": [], 1235 | "source": [] 1236 | } 1237 | ], 1238 | "metadata": { 1239 | "kernelspec": { 1240 | "display_name": "Python 3", 1241 | "language": "python", 1242 | "name": "python3" 1243 | }, 1244 | "language_info": { 1245 | "codemirror_mode": { 1246 | "name": "ipython", 1247 | "version": 3 1248 | }, 1249 | "file_extension": ".py", 1250 | "mimetype": "text/x-python", 1251 | "name": "python", 1252 | "nbconvert_exporter": "python", 1253 | "pygments_lexer": "ipython3", 1254 | "version": "3.6.4" 1255 | }, 1256 | "toc": { 1257 | "colors": { 1258 | "hover_highlight": "#DAA520", 1259 | "navigate_num": "#000000", 1260 | "navigate_text": "#333333", 1261 | "running_highlight": "#FF0000", 1262 | "selected_highlight": "#FFD700", 1263 | "sidebar_border": "#EEEEEE", 1264 | "wrapper_background": "#FFFFFF" 1265 | }, 1266 | "moveMenuLeft": true, 1267 | "nav_menu": { 1268 | "height": "12px", 1269 | "width": "252px" 1270 | }, 1271 | "navigate_menu": true, 1272 | "number_sections": true, 1273 | "sideBar": true, 1274 | "threshold": 4, 1275 | "toc_cell": false, 1276 | "toc_section_display": "block", 1277 | "toc_window_display": false, 1278 | "widenNotebook": false 1279 | } 1280 | }, 1281 | "nbformat": 4, 1282 | "nbformat_minor": 2 1283 | } 1284 | -------------------------------------------------------------------------------- /4_NN-DeepLearning/4_NN-DeepLearning.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/c9ff757b91837f6af31e72f3540534ad2b844d90/4_NN-DeepLearning/4_NN-DeepLearning.pdf -------------------------------------------------------------------------------- /4_NN-DeepLearning/README.md: -------------------------------------------------------------------------------- 1 | # Neural Networks and Deep Learning 2 | Available Resources: 3 | * Presentation 4 | * [video](https://youtu.be/2Fp85uT41oA&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) 5 | * [slides](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/4_NN-DeepLearning/4_NN-DeepLearning.pdf) 6 | * [Introduction to Generative Adversarial Networks](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/4_NN-DeepLearning/4_GANs_Intro.pdf) 7 | * Hands-on 8 | * [video](https://youtu.be/3YdQlygV3xU&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) 9 | * [notebook](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/4_NN-DeepLearning/4_HandWrittenRecognition-CNN.ipynb) 10 | -------------------------------------------------------------------------------- /5_UnsupervisedLearning/5_UnsupervisedLearning.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/c9ff757b91837f6af31e72f3540534ad2b844d90/5_UnsupervisedLearning/5_UnsupervisedLearning.pdf -------------------------------------------------------------------------------- /5_UnsupervisedLearning/README.md: -------------------------------------------------------------------------------- 1 | # Unsupervised Learning 2 | Available Resources: 3 | * Presentation 4 | * [video](https://youtu.be/8y7jgfJ8vTA&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) 5 | * [slides](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/5_UnsupervisedLearning/5_UnsupervisedLearning.pdf) 6 | * Hands-on 7 | * [video](https://youtu.be/WheCCObhCdk&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) 8 | * [notebook](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/5_UnsupervisedLearning/5_Unsupervised_DowJones.ipynb) 9 | -------------------------------------------------------------------------------- /5_UnsupervisedLearning/data/all_stocks_5yr.csv.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/c9ff757b91837f6af31e72f3540534ad2b844d90/5_UnsupervisedLearning/data/all_stocks_5yr.csv.zip -------------------------------------------------------------------------------- /5_UnsupervisedLearning/data/companies.csv: -------------------------------------------------------------------------------- 1 | security,sector,sub-industry 2 | A,Agilent Technologies Inc,Health Care,Health Care Equipment 3 | AAL,American Airlines Group,Industrials,Airlines 4 | AAP,Advance Auto Parts,Consumer Discretionary,Automotive Retail 5 | AAPL,Apple Inc.,Information Technology,"Technology Hardware, Storage & Peripherals" 6 | ABBV,AbbVie Inc.,Health Care,Pharmaceuticals 7 | ABC,AmerisourceBergen Corp,Health Care,Health Care Distributors 8 | ABT,Abbott Laboratories,Health Care,Health Care Equipment 9 | ACN,Accenture plc,Information Technology,IT Consulting & Other Services 10 | ADBE,Adobe Systems Inc,Information Technology,Application Software 11 | ADI,"Analog Devices, Inc.",Information Technology,Semiconductors 12 | ADM,Archer-Daniels-Midland Co,Consumer Staples,Agricultural Products 13 | ADP,Automatic Data Processing,Information Technology,Internet Software & Services 14 | ADS,Alliance Data Systems,Information Technology,Data Processing & Outsourced Services 15 | ADSK,Autodesk Inc.,Information Technology,Application Software 16 | AEE,Ameren Corp,Utilities,Multi-Utilities 17 | AEP,American Electric Power,Utilities,Electric Utilities 18 | AES,AES Corp,Utilities,Independent Power Producers & Energy Traders 19 | AET,Aetna Inc,Health Care,Managed Health Care 20 | AFL,AFLAC Inc,Financials,Life & Health Insurance 21 | AGN,"Allergan, Plc",Health Care,Pharmaceuticals 22 | AIG,"American International Group, Inc.",Financials,Property & Casualty Insurance 23 | AIV,Apartment Investment & Management,Real Estate,Residential REITs 24 | AIZ,Assurant Inc.,Financials,Multi-line Insurance 25 | AJG,Arthur J. Gallagher & Co.,Financials,Insurance Brokers 26 | AKAM,Akamai Technologies Inc,Information Technology,Internet Software & Services 27 | ALB,Albemarle Corp,Materials,Specialty Chemicals 28 | ALGN,Align Technology,Health Care,Health Care Supplies 29 | ALK,Alaska Air Group Inc,Industrials,Airlines 30 | ALL,Allstate Corp,Financials,Property & Casualty Insurance 31 | ALLE,Allegion,Industrials,Building Products 32 | ALXN,Alexion Pharmaceuticals,Health Care,Biotechnology 33 | AMAT,Applied Materials Inc.,Information Technology,Semiconductor Equipment 34 | AMD,Advanced Micro Devices Inc,Information Technology,Semiconductors 35 | AME,AMETEK Inc.,Industrials,Electrical Components & Equipment 36 | AMG,Affiliated Managers Group Inc,Financials,Asset Management & Custody Banks 37 | AMGN,Amgen Inc.,Health Care,Biotechnology 38 | AMP,Ameriprise Financial,Financials,Asset Management & Custody Banks 39 | AMT,American Tower Corp A,Real Estate,Specialized REITs 40 | AMZN,Amazon.com Inc.,Consumer Discretionary,Internet & Direct Marketing Retail 41 | ANDV,Andeavor,Energy,Oil & Gas Refining & Marketing 42 | ANSS,ANSYS,Information Technology,Application Software 43 | ANTM,Anthem Inc.,Health Care,Managed Health Care 44 | AON,Aon plc,Financials,Insurance Brokers 45 | AOS,A.O. Smith Corp,Industrials,Building Products 46 | APA,Apache Corporation,Energy,Oil & Gas Exploration & Production 47 | APC,Anadarko Petroleum Corp,Energy,Oil & Gas Exploration & Production 48 | APD,Air Products & Chemicals Inc,Materials,Industrial Gases 49 | APH,Amphenol Corp,Information Technology,Electronic Components 50 | APTV,Aptiv Plc,Consumer Discretionary,Auto Parts & Equipment 51 | ARE,Alexandria Real Estate Equities Inc,Real Estate,Office REITs 52 | ARNC,Arconic Inc.,Industrials,Aerospace & Defense 53 | ATVI,Activision Blizzard,Information Technology,Home Entertainment Software 54 | AVB,"AvalonBay Communities, Inc.",Real Estate,Residential REITs 55 | AVGO,Broadcom,Information Technology,Semiconductors 56 | AVY,Avery Dennison Corp,Materials,Paper Packaging 57 | AWK,American Water Works Company Inc,Utilities,Water Utilities 58 | AXP,American Express Co,Financials,Consumer Finance 59 | AYI,Acuity Brands Inc,Industrials,Electrical Components & Equipment 60 | AZO,AutoZone Inc,Consumer Discretionary,Specialty Stores 61 | BA,Boeing Company,Industrials,Aerospace & Defense 62 | BAC,Bank of America Corp,Financials,Diversified Banks 63 | BAX,Baxter International Inc.,Health Care,Health Care Equipment 64 | BBT,BB&T Corporation,Financials,Regional Banks 65 | BBY,Best Buy Co. Inc.,Consumer Discretionary,Computer & Electronics Retail 66 | BDX,Becton Dickinson,Health Care,Health Care Equipment 67 | BEN,Franklin Resources,Financials,Asset Management & Custody Banks 68 | BF.B,Brown-Forman Corp.,Consumer Staples,Distillers & Vintners 69 | BHF,Brighthouse Financial Inc,Financials,Life & Health Insurance 70 | BHGE,"Baker Hughes, a GE Company",Energy,Oil & Gas Equipment & Services 71 | BIIB,Biogen Inc.,Health Care,Biotechnology 72 | BK,The Bank of New York Mellon Corp.,Financials,Asset Management & Custody Banks 73 | BKNG,Booking Holdings Inc,Consumer Discretionary,Internet & Direct Marketing Retail 74 | BLK,BlackRock,Financials,Asset Management & Custody Banks 75 | BLL,Ball Corp,Materials,Metal & Glass Containers 76 | BMY,Bristol-Myers Squibb,Health Care,Health Care Distributors 77 | BRK.B,Berkshire Hathaway,Financials,Multi-Sector Holdings 78 | BSX,Boston Scientific,Health Care,Health Care Equipment 79 | BWA,BorgWarner,Consumer Discretionary,Auto Parts & Equipment 80 | BXP,Boston Properties,Real Estate,Office REITs 81 | C,Citigroup Inc.,Financials,Diversified Banks 82 | CA,"CA, Inc.",Information Technology,Systems Software 83 | CAG,Conagra Brands,Consumer Staples,Packaged Foods & Meats 84 | CAH,Cardinal Health Inc.,Health Care,Health Care Distributors 85 | CAT,Caterpillar Inc.,Industrials,Construction Machinery & Heavy Trucks 86 | CB,Chubb Limited,Financials,Property & Casualty Insurance 87 | CBOE,Cboe Global Markets,Financials,Financial Exchanges & Data 88 | CBRE,CBRE Group,Real Estate,Real Estate Services 89 | CBS,CBS Corp.,Consumer Discretionary,Broadcasting 90 | CCI,Crown Castle International Corp.,Real Estate,Specialized REITs 91 | CCL,Carnival Corp.,Consumer Discretionary,"Hotels, Resorts & Cruise Lines" 92 | CDNS,Cadence Design Systems,Information Technology,Application Software 93 | CELG,Celgene Corp.,Health Care,Biotechnology 94 | CERN,Cerner,Health Care,Health Care Technology 95 | CF,CF Industries Holdings Inc,Materials,Fertilizers & Agricultural Chemicals 96 | CFG,Citizens Financial Group,Financials,Regional Banks 97 | CHD,Church & Dwight,Consumer Staples,Household Products 98 | CHRW,C. H. Robinson Worldwide,Industrials,Air Freight & Logistics 99 | CHTR,Charter Communications,Consumer Discretionary,Cable & Satellite 100 | CI,CIGNA Corp.,Health Care,Managed Health Care 101 | CINF,Cincinnati Financial,Financials,Property & Casualty Insurance 102 | CL,Colgate-Palmolive,Consumer Staples,Household Products 103 | CLX,The Clorox Company,Consumer Staples,Household Products 104 | CMA,Comerica Inc.,Financials,Diversified Banks 105 | CMCSA,Comcast Corp.,Consumer Discretionary,Cable & Satellite 106 | CME,CME Group Inc.,Financials,Financial Exchanges & Data 107 | CMG,Chipotle Mexican Grill,Consumer Discretionary,Restaurants 108 | CMI,Cummins Inc.,Industrials,Industrial Machinery 109 | CMS,CMS Energy,Utilities,Multi-Utilities 110 | CNC,Centene Corporation,Health Care,Managed Health Care 111 | CNP,CenterPoint Energy,Utilities,Multi-Utilities 112 | COF,Capital One Financial,Financials,Consumer Finance 113 | COG,Cabot Oil & Gas,Energy,Oil & Gas Exploration & Production 114 | COL,Rockwell Collins,Industrials,Aerospace & Defense 115 | COO,The Cooper Companies,Health Care,Health Care Supplies 116 | COP,ConocoPhillips,Energy,Oil & Gas Exploration & Production 117 | COST,Costco Wholesale Corp.,Consumer Staples,Hypermarkets & Super Centers 118 | COTY,"Coty, Inc",Consumer Staples,Personal Products 119 | CPB,Campbell Soup,Consumer Staples,Packaged Foods & Meats 120 | CRM,Salesforce.com,Information Technology,Internet Software & Services 121 | CSCO,Cisco Systems,Information Technology,Communications Equipment 122 | CSRA,CSRA Inc.,Information Technology,IT Consulting & Other Services 123 | CSX,CSX Corp.,Industrials,Railroads 124 | CTAS,Cintas Corporation,Industrials,Diversified Support Services 125 | CTL,CenturyLink Inc,Telecommunication Services,Integrated Telecommunication Services 126 | CTSH,Cognizant Technology Solutions,Information Technology,IT Consulting & Other Services 127 | CTXS,Citrix Systems,Information Technology,Internet Software & Services 128 | CVS,CVS Health,Consumer Staples,Drug Retail 129 | CVX,Chevron Corp.,Energy,Integrated Oil & Gas 130 | CXO,Concho Resources,Energy,Oil & Gas Exploration & Production 131 | D,Dominion Energy,Utilities,Electric Utilities 132 | DAL,Delta Air Lines Inc.,Industrials,Airlines 133 | DE,Deere & Co.,Industrials,Agricultural & Farm Machinery 134 | DFS,Discover Financial Services,Financials,Consumer Finance 135 | DG,Dollar General,Consumer Discretionary,General Merchandise Stores 136 | DGX,Quest Diagnostics,Health Care,Health Care Services 137 | DHI,D. R. Horton,Consumer Discretionary,Homebuilding 138 | DHR,Danaher Corp.,Health Care,Health Care Equipment 139 | DIS,The Walt Disney Company,Consumer Discretionary,Cable & Satellite 140 | DISCA,Discovery Inc. Class A,Consumer Discretionary,Cable & Satellite 141 | DISCK,Discovery Inc. Class C,Consumer Discretionary,Cable & Satellite 142 | DISH,Dish Network,Consumer Discretionary,Cable & Satellite 143 | DLR,Digital Realty Trust Inc,Real Estate,Specialized REITs 144 | DLTR,Dollar Tree,Consumer Discretionary,General Merchandise Stores 145 | DOV,Dover Corp.,Industrials,Industrial Machinery 146 | DPS,Dr Pepper Snapple Group,Consumer Staples,Soft Drinks 147 | DRE,Duke Realty Corp,Real Estate,Industrial REITs 148 | DRI,Darden Restaurants,Consumer Discretionary,Restaurants 149 | DTE,DTE Energy Co.,Utilities,Multi-Utilities 150 | DUK,Duke Energy,Utilities,Electric Utilities 151 | DVA,DaVita Inc.,Health Care,Health Care Facilities 152 | DVN,Devon Energy Corp.,Energy,Oil & Gas Exploration & Production 153 | DWDP,DowDuPont,Materials,Diversified Chemicals 154 | DXC,DXC Technology,Information Technology,IT Consulting & Other Services 155 | EA,Electronic Arts,Information Technology,Home Entertainment Software 156 | EBAY,eBay Inc.,Information Technology,Internet Software & Services 157 | ECL,Ecolab Inc.,Materials,Specialty Chemicals 158 | ED,Consolidated Edison,Utilities,Electric Utilities 159 | EFX,Equifax Inc.,Industrials,Research & Consulting Services 160 | EIX,Edison Int'l,Utilities,Electric Utilities 161 | EL,Estee Lauder Cos.,Consumer Staples,Personal Products 162 | EMN,Eastman Chemical,Materials,Diversified Chemicals 163 | EMR,Emerson Electric Company,Industrials,Electrical Components & Equipment 164 | EOG,EOG Resources,Energy,Oil & Gas Exploration & Production 165 | EQIX,Equinix,Real Estate,Specialized REITs 166 | EQR,Equity Residential,Real Estate,Residential REITs 167 | EQT,EQT Corporation,Energy,Oil & Gas Exploration & Production 168 | ES,Eversource Energy,Utilities,Multi-Utilities 169 | ESRX,Express Scripts,Health Care,Health Care Distributors 170 | ESS,"Essex Property Trust, Inc.",Real Estate,Residential REITs 171 | ETFC,E*Trade,Financials,Investment Banking & Brokerage 172 | ETN,Eaton Corporation,Industrials,Electrical Components & Equipment 173 | ETR,Entergy Corp.,Utilities,Electric Utilities 174 | EVHC,Envision Healthcare,Health Care,Health Care Services 175 | EW,Edwards Lifesciences,Health Care,Health Care Equipment 176 | EXC,Exelon Corp.,Utilities,Multi-Utilities 177 | EXPD,Expeditors International,Industrials,Air Freight & Logistics 178 | EXPE,Expedia Inc.,Consumer Discretionary,Internet & Direct Marketing Retail 179 | EXR,Extra Space Storage,Real Estate,Specialized REITs 180 | F,Ford Motor,Consumer Discretionary,Automobile Manufacturers 181 | FAST,Fastenal Co,Industrials,Building Products 182 | FB,"Facebook, Inc.",Information Technology,Internet Software & Services 183 | FBHS,Fortune Brands Home & Security,Industrials,Building Products 184 | FCX,Freeport-McMoRan Inc.,Materials,Copper 185 | FDX,FedEx Corporation,Industrials,Air Freight & Logistics 186 | FE,FirstEnergy Corp,Utilities,Electric Utilities 187 | FFIV,F5 Networks,Information Technology,Communications Equipment 188 | FIS,Fidelity National Information Services,Information Technology,Internet Software & Services 189 | FISV,Fiserv Inc,Information Technology,Internet Software & Services 190 | FITB,Fifth Third Bancorp,Financials,Regional Banks 191 | FL,Foot Locker Inc,Consumer Discretionary,Apparel Retail 192 | FLIR,FLIR Systems,Information Technology,Electronic Equipment & Instruments 193 | FLR,Fluor Corp.,Industrials,Construction & Engineering 194 | FLS,Flowserve Corporation,Industrials,Industrial Machinery 195 | FMC,FMC Corporation,Materials,Fertilizers & Agricultural Chemicals 196 | FOX,Twenty-First Century Fox Class B,Consumer Discretionary,Publishing 197 | FOXA,Twenty-First Century Fox Class A,Consumer Discretionary,Publishing 198 | FRT,Federal Realty Investment Trust,Real Estate,Retail REITs 199 | FTI,TechnipFMC,Energy,Oil & Gas Equipment & Services 200 | FTV,Fortive Corp,Industrials,Industrial Machinery 201 | GD,General Dynamics,Industrials,Aerospace & Defense 202 | GE,General Electric,Industrials,Industrial Conglomerates 203 | GGP,General Growth Properties Inc.,Real Estate,Retail REITs 204 | GILD,Gilead Sciences,Health Care,Biotechnology 205 | GIS,General Mills,Consumer Staples,Packaged Foods & Meats 206 | GLW,Corning Inc.,Information Technology,Electronic Components 207 | GM,General Motors,Consumer Discretionary,Automobile Manufacturers 208 | GOOG,Alphabet Inc Class C,Information Technology,Internet Software & Services 209 | GOOGL,Alphabet Inc Class A,Information Technology,Internet Software & Services 210 | GPC,Genuine Parts,Consumer Discretionary,Specialty Stores 211 | GPN,Global Payments Inc.,Information Technology,Data Processing & Outsourced Services 212 | GPS,Gap Inc.,Consumer Discretionary,Apparel Retail 213 | GRMN,Garmin Ltd.,Consumer Discretionary,Consumer Electronics 214 | GS,Goldman Sachs Group,Financials,Investment Banking & Brokerage 215 | GT,Goodyear Tire & Rubber,Consumer Discretionary,Tires & Rubber 216 | GWW,Grainger (W.W.) Inc.,Industrials,Industrial Machinery 217 | HAL,Halliburton Co.,Energy,Oil & Gas Equipment & Services 218 | HAS,Hasbro Inc.,Consumer Discretionary,Leisure Products 219 | HBAN,Huntington Bancshares,Financials,Regional Banks 220 | HBI,Hanesbrands Inc,Consumer Discretionary,"Apparel, Accessories & Luxury Goods" 221 | HCA,HCA Holdings,Health Care,Health Care Facilities 222 | HCP,HCP Inc.,Real Estate,Health Care REITs 223 | HD,Home Depot,Consumer Discretionary,Home Improvement Retail 224 | HES,Hess Corporation,Energy,Integrated Oil & Gas 225 | HIG,Hartford Financial Svc.Gp.,Financials,Property & Casualty Insurance 226 | HII,Huntington Ingalls Industries,Industrials,Aerospace & Defense 227 | HLT,Hilton Worldwide Holdings Inc,Consumer Discretionary,"Hotels, Resorts & Cruise Lines" 228 | HOG,Harley-Davidson,Consumer Discretionary,Motorcycle Manufacturers 229 | HOLX,Hologic,Health Care,Health Care Equipment 230 | HON,Honeywell Int'l Inc.,Industrials,Industrial Conglomerates 231 | HP,Helmerich & Payne,Energy,Oil & Gas Drilling 232 | HPE,Hewlett Packard Enterprise,Information Technology,"Technology Hardware, Storage & Peripherals" 233 | HPQ,HP Inc.,Information Technology,"Technology Hardware, Storage & Peripherals" 234 | HRB,Block H&R,Financials,Consumer Finance 235 | HRL,Hormel Foods Corp.,Consumer Staples,Packaged Foods & Meats 236 | HRS,Harris Corporation,Information Technology,Communications Equipment 237 | HSIC,Henry Schein,Health Care,Health Care Distributors 238 | HST,Host Hotels & Resorts,Real Estate,Hotel & Resort REITs 239 | HSY,The Hershey Company,Consumer Staples,Packaged Foods & Meats 240 | HUM,Humana Inc.,Health Care,Managed Health Care 241 | IBM,International Business Machines,Information Technology,IT Consulting & Other Services 242 | ICE,Intercontinental Exchange,Financials,Financial Exchanges & Data 243 | IDXX,IDEXX Laboratories,Health Care,Health Care Equipment 244 | IFF,Intl Flavors & Fragrances,Materials,Specialty Chemicals 245 | ILMN,Illumina Inc,Health Care,Life Sciences Tools & Services 246 | INCY,Incyte,Health Care,Biotechnology 247 | INFO,IHS Markit Ltd.,Industrials,Research & Consulting Services 248 | INTC,Intel Corp.,Information Technology,Semiconductors 249 | INTU,Intuit Inc.,Information Technology,Internet Software & Services 250 | IP,International Paper,Materials,Paper Packaging 251 | IPG,Interpublic Group,Consumer Discretionary,Advertising 252 | IPGP,IPG Photonics Corp.,Information Technology,Electronic Manufacturing Services 253 | IQV,IQVIA Holdings Inc.,Health Care,Life Sciences Tools & Service 254 | IR,Ingersoll-Rand PLC,Industrials,Industrial Machinery 255 | IRM,Iron Mountain Incorporated,Real Estate,Specialized REITs 256 | ISRG,Intuitive Surgical Inc.,Health Care,Health Care Equipment 257 | IT,Gartner Inc,Information Technology,IT Consulting & Other Services 258 | ITW,Illinois Tool Works,Industrials,Industrial Machinery 259 | IVZ,Invesco Ltd.,Financials,Asset Management & Custody Banks 260 | JBHT,J. B. Hunt Transport Services,Industrials,Trucking 261 | JCI,Johnson Controls International,Industrials,Building Products 262 | JEC,Jacobs Engineering Group,Industrials,Construction & Engineering 263 | JNJ,Johnson & Johnson,Health Care,Health Care Equipment 264 | JNPR,Juniper Networks,Information Technology,Communications Equipment 265 | JPM,JPMorgan Chase & Co.,Financials,Diversified Banks 266 | JWN,Nordstrom,Consumer Discretionary,Department Stores 267 | K,Kellogg Co.,Consumer Staples,Packaged Foods & Meats 268 | KEY,KeyCorp,Financials,Regional Banks 269 | KHC,Kraft Heinz Co,Consumer Staples,Packaged Foods & Meats 270 | KIM,Kimco Realty,Real Estate,Retail REITs 271 | KLAC,KLA-Tencor Corp.,Information Technology,Semiconductor Equipment 272 | KMB,Kimberly-Clark,Consumer Staples,Household Products 273 | KMI,Kinder Morgan,Energy,Oil & Gas Storage & Transportation 274 | KMX,Carmax Inc,Consumer Discretionary,Specialty Stores 275 | KO,Coca-Cola Company (The),Consumer Staples,Soft Drinks 276 | KORS,Michael Kors Holdings,Consumer Discretionary,"Apparel, Accessories & Luxury Goods" 277 | KR,Kroger Co.,Consumer Staples,Food Retail 278 | KSS,Kohl's Corp.,Consumer Discretionary,General Merchandise Stores 279 | KSU,Kansas City Southern,Industrials,Railroads 280 | L,Loews Corp.,Financials,Multi-line Insurance 281 | LB,L Brands Inc.,Consumer Discretionary,Apparel Retail 282 | LEG,Leggett & Platt,Consumer Discretionary,Home Furnishings 283 | LEN,Lennar Corp.,Consumer Discretionary,Homebuilding 284 | LH,Laboratory Corp. of America Holding,Health Care,Health Care Services 285 | LKQ,LKQ Corporation,Consumer Discretionary,Distributors 286 | LLL,L-3 Communications Holdings,Industrials,Aerospace & Defense 287 | LLY,Lilly (Eli) & Co.,Health Care,Pharmaceuticals 288 | LMT,Lockheed Martin Corp.,Industrials,Aerospace & Defense 289 | LNC,Lincoln National,Financials,Multi-line Insurance 290 | LNT,Alliant Energy Corp,Utilities,Electric Utilities 291 | LOW,Lowe's Cos.,Consumer Discretionary,Home Improvement Retail 292 | LRCX,Lam Research,Information Technology,Semiconductor Equipment 293 | LUK,Leucadia National Corp.,Financials,Multi-Sector Holdings 294 | LUV,Southwest Airlines,Industrials,Airlines 295 | LYB,LyondellBasell,Materials,Specialty Chemicals 296 | M,Macy's Inc.,Consumer Discretionary,Department Stores 297 | MA,Mastercard Inc.,Information Technology,Internet Software & Services 298 | MAA,Mid-America Apartments,Real Estate,Residential REITs 299 | MAC,Macerich,Real Estate,Retail REITs 300 | MAR,Marriott Int'l.,Consumer Discretionary,"Hotels, Resorts & Cruise Lines" 301 | MAS,Masco Corp.,Industrials,Building Products 302 | MAT,Mattel Inc.,Consumer Discretionary,Leisure Products 303 | MCD,McDonald's Corp.,Consumer Discretionary,Restaurants 304 | MCHP,Microchip Technology,Information Technology,Semiconductors 305 | MCK,McKesson Corp.,Health Care,Health Care Distributors 306 | MCO,Moody's Corp,Financials,Financial Exchanges & Data 307 | MDLZ,Mondelez International,Consumer Staples,Packaged Foods & Meats 308 | MDT,Medtronic plc,Health Care,Health Care Equipment 309 | MET,MetLife Inc.,Financials,Life & Health Insurance 310 | MGM,MGM Resorts International,Consumer Discretionary,Casinos & Gaming 311 | MHK,Mohawk Industries,Consumer Discretionary,Home Furnishings 312 | MKC,McCormick & Co.,Consumer Staples,Packaged Foods & Meats 313 | MLM,Martin Marietta Materials,Materials,Construction Materials 314 | MMC,Marsh & McLennan,Financials,Insurance Brokers 315 | MMM,3M Company,Industrials,Industrial Conglomerates 316 | MNST,Monster Beverage,Consumer Staples,Soft Drinks 317 | MO,Altria Group Inc,Consumer Staples,Tobacco 318 | MON,Monsanto Co.,Materials,Fertilizers & Agricultural Chemicals 319 | MOS,The Mosaic Company,Materials,Fertilizers & Agricultural Chemicals 320 | MPC,Marathon Petroleum,Energy,Oil & Gas Refining & Marketing 321 | MRK,Merck & Co.,Health Care,Pharmaceuticals 322 | MRO,Marathon Oil Corp.,Energy,Oil & Gas Exploration & Production 323 | MS,Morgan Stanley,Financials,Investment Banking & Brokerage 324 | MSFT,Microsoft Corp.,Information Technology,Systems Software 325 | MSI,Motorola Solutions Inc.,Information Technology,Communications Equipment 326 | MTB,M&T Bank Corp.,Financials,Regional Banks 327 | MTD,Mettler Toledo,Health Care,Life Sciences Tools & Services 328 | MU,Micron Technology,Information Technology,Semiconductors 329 | MYL,Mylan N.V.,Health Care,Pharmaceuticals 330 | NAVI,Navient,Financials,Consumer Finance 331 | NBL,Noble Energy Inc,Energy,Oil & Gas Exploration & Production 332 | NCLH,Norwegian Cruise Line,Consumer Discretionary,"Hotels, Resorts & Cruise Lines" 333 | NDAQ,"Nasdaq, Inc.",Financials,Financial Exchanges & Data 334 | NEE,NextEra Energy,Utilities,Multi-Utilities 335 | NEM,Newmont Mining Corporation,Materials,Gold 336 | NFLX,Netflix Inc.,Information Technology,Internet Software & Services 337 | NFX,Newfield Exploration Co,Energy,Oil & Gas Exploration & Production 338 | NI,NiSource Inc.,Utilities,Multi-Utilities 339 | NKE,Nike,Consumer Discretionary,"Apparel, Accessories & Luxury Goods" 340 | NKTR,Nektar Therapeutics,Health Care,Pharmaceuticals 341 | NLSN,Nielsen Holdings,Industrials,Research & Consulting Services 342 | NOC,Northrop Grumman Corp.,Industrials,Aerospace & Defense 343 | NOV,National Oilwell Varco Inc.,Energy,Oil & Gas Equipment & Services 344 | NRG,NRG Energy,Utilities,Independent Power Producers & Energy Traders 345 | NSC,Norfolk Southern Corp.,Industrials,Railroads 346 | NTAP,NetApp,Information Technology,Internet Software & Services 347 | NTRS,Northern Trust Corp.,Financials,Asset Management & Custody Banks 348 | NUE,Nucor Corp.,Materials,Steel 349 | NVDA,Nvidia Corporation,Information Technology,Semiconductors 350 | NWL,Newell Brands,Consumer Discretionary,Housewares & Specialties 351 | NWS,News Corp. Class B,Consumer Discretionary,Publishing 352 | NWSA,News Corp. Class A,Consumer Discretionary,Publishing 353 | O,Realty Income Corporation,Real Estate,Retail REITs 354 | OKE,ONEOK,Energy,Oil & Gas Storage & Transportation 355 | OMC,Omnicom Group,Consumer Discretionary,Advertising 356 | ORCL,Oracle Corp.,Information Technology,Application Software 357 | ORLY,O'Reilly Automotive,Consumer Discretionary,Specialty Stores 358 | OXY,Occidental Petroleum,Energy,Oil & Gas Exploration & Production 359 | PAYX,Paychex Inc.,Information Technology,Internet Software & Services 360 | PBCT,People's United Financial,Financials,Thrifts & Mortgage Finance 361 | PCAR,PACCAR Inc.,Industrials,Construction Machinery & Heavy Trucks 362 | PCG,PG&E Corp.,Utilities,Multi-Utilities 363 | PEG,Public Serv. Enterprise Inc.,Utilities,Electric Utilities 364 | PEP,PepsiCo Inc.,Consumer Staples,Soft Drinks 365 | PFE,Pfizer Inc.,Health Care,Pharmaceuticals 366 | PFG,Principal Financial Group,Financials,Life & Health Insurance 367 | PG,Procter & Gamble,Consumer Staples,Personal Products 368 | PGR,Progressive Corp.,Financials,Property & Casualty Insurance 369 | PH,Parker-Hannifin,Industrials,Industrial Machinery 370 | PHM,Pulte Homes Inc.,Consumer Discretionary,Homebuilding 371 | PKG,Packaging Corporation of America,Materials,Paper Packaging 372 | PKI,PerkinElmer,Health Care,Health Care Equipment 373 | PLD,Prologis,Real Estate,Industrial REITs 374 | PM,Philip Morris International,Consumer Staples,Tobacco 375 | PNC,PNC Financial Services,Financials,Regional Banks 376 | PNR,Pentair Ltd.,Industrials,Industrial Machinery 377 | PNW,Pinnacle West Capital,Utilities,Multi-Utilities 378 | PPG,PPG Industries,Materials,Specialty Chemicals 379 | PPL,PPL Corp.,Utilities,Electric Utilities 380 | PRGO,Perrigo,Health Care,Pharmaceuticals 381 | PRU,Prudential Financial,Financials,Life & Health Insurance 382 | PSA,Public Storage,Real Estate,Specialized REITs 383 | PSX,Phillips 66,Energy,Oil & Gas Refining & Marketing 384 | PVH,PVH Corp.,Consumer Discretionary,"Apparel, Accessories & Luxury Goods" 385 | PWR,Quanta Services Inc.,Industrials,Construction & Engineering 386 | PX,Praxair Inc.,Materials,Industrial Gases 387 | PXD,Pioneer Natural Resources,Energy,Oil & Gas Exploration & Production 388 | PYPL,PayPal,Information Technology,Data Processing & Outsourced Services 389 | QCOM,QUALCOMM Inc.,Information Technology,Semiconductors 390 | QRVO,Qorvo,Information Technology,Semiconductors 391 | RCL,Royal Caribbean Cruises Ltd,Consumer Discretionary,"Hotels, Resorts & Cruise Lines" 392 | RE,Everest Re Group Ltd.,Financials,Reinsurance 393 | REG,Regency Centers Corporation,Real Estate,Retail REITs 394 | REGN,Regeneron,Health Care,Biotechnology 395 | RF,Regions Financial Corp.,Financials,Regional Banks 396 | RHI,Robert Half International,Industrials,Human Resource & Employment Services 397 | RHT,Red Hat Inc.,Information Technology,Systems Software 398 | RJF,Raymond James Financial Inc.,Financials,Investment Banking & Brokerage 399 | RL,Polo Ralph Lauren Corp.,Consumer Discretionary,"Apparel, Accessories & Luxury Goods" 400 | RMD,ResMed,Health Care,Health Care Equipment 401 | ROK,Rockwell Automation Inc.,Industrials,Electrical Components & Equipment 402 | ROP,Roper Technologies,Industrials,Industrial Conglomerates 403 | ROST,Ross Stores,Consumer Discretionary,Apparel Retail 404 | RRC,Range Resources Corp.,Energy,Oil & Gas Exploration & Production 405 | RSG,Republic Services Inc,Industrials,Environmental & Facilities Services 406 | RTN,Raytheon Co.,Industrials,Aerospace & Defense 407 | SBAC,SBA Communications,Real Estate,Specialized REITs 408 | SBUX,Starbucks Corp.,Consumer Discretionary,Restaurants 409 | SCG,SCANA Corp,Utilities,Multi-Utilities 410 | SCHW,Charles Schwab Corporation,Financials,Investment Banking & Brokerage 411 | SEE,Sealed Air,Materials,Paper Packaging 412 | SHW,Sherwin-Williams,Materials,Specialty Chemicals 413 | SIVB,SVB Financial,Financials,Regional Banks 414 | SJM,JM Smucker,Consumer Staples,Packaged Foods & Meats 415 | SLB,Schlumberger Ltd.,Energy,Oil & Gas Equipment & Services 416 | SLG,SL Green Realty,Real Estate,Office REITs 417 | SNA,Snap-On Inc.,Consumer Discretionary,Household Appliances 418 | SNPS,Synopsys Inc.,Information Technology,Application Software 419 | SO,Southern Co.,Utilities,Electric Utilities 420 | SPG,Simon Property Group Inc,Real Estate,Retail REITs 421 | SPGI,"S&P Global, Inc.",Financials,Financial Exchanges & Data 422 | SRCL,Stericycle Inc,Industrials,Environmental & Facilities Services 423 | SRE,Sempra Energy,Utilities,Multi-Utilities 424 | STI,SunTrust Banks,Financials,Regional Banks 425 | STT,State Street Corp.,Financials,Asset Management & Custody Banks 426 | STX,Seagate Technology,Information Technology,"Technology Hardware, Storage & Peripherals" 427 | STZ,Constellation Brands,Consumer Staples,Distillers & Vintners 428 | SWK,Stanley Black & Decker,Consumer Discretionary,Household Appliances 429 | SWKS,Skyworks Solutions,Information Technology,Semiconductors 430 | SYF,Synchrony Financial,Financials,Consumer Finance 431 | SYK,Stryker Corp.,Health Care,Health Care Equipment 432 | SYMC,Symantec Corp.,Information Technology,Application Software 433 | SYY,Sysco Corp.,Consumer Staples,Food Distributors 434 | T,AT&T Inc.,Telecommunication Services,Integrated Telecommunication Services 435 | TAP,Molson Coors Brewing Company,Consumer Staples,Brewers 436 | TDG,TransDigm Group,Industrials,Aerospace & Defense 437 | TEL,TE Connectivity Ltd.,Information Technology,Electronic Manufacturing Services 438 | TGT,Target Corp.,Consumer Discretionary,General Merchandise Stores 439 | TIF,Tiffany & Co.,Consumer Discretionary,"Apparel, Accessories & Luxury Goods" 440 | TJX,TJX Companies Inc.,Consumer Discretionary,Apparel Retail 441 | TMK,Torchmark Corp.,Financials,Life & Health Insurance 442 | TMO,Thermo Fisher Scientific,Health Care,Health Care Equipment 443 | TPR,"Tapestry, Inc.",Consumer Discretionary,"Apparel, Accessories & Luxury Goods" 444 | TRIP,TripAdvisor,Consumer Discretionary,Internet & Direct Marketing Retail 445 | TROW,T. Rowe Price Group,Financials,Asset Management & Custody Banks 446 | TRV,The Travelers Companies Inc.,Financials,Property & Casualty Insurance 447 | TSCO,Tractor Supply Company,Consumer Discretionary,Specialty Stores 448 | TSN,Tyson Foods,Consumer Staples,Packaged Foods & Meats 449 | TSS,Total System Services,Information Technology,Internet Software & Services 450 | TTWO,Take-Two Interactive,Information Technology,Home Entertainment Software 451 | TWX,Time Warner Inc.,Consumer Discretionary,Cable & Satellite 452 | TXN,Texas Instruments,Information Technology,Semiconductors 453 | TXT,Textron Inc.,Industrials,Aerospace & Defense 454 | UA,Under Armour Class C,Consumer Discretionary,"Apparel, Accessories & Luxury Goods" 455 | UAA,Under Armour Class A,Consumer Discretionary,"Apparel, Accessories & Luxury Goods" 456 | UAL,United Continental Holdings,Industrials,Airlines 457 | UDR,UDR Inc,Real Estate,Residential REITs 458 | UHS,"Universal Health Services, Inc.",Health Care,Health Care Facilities 459 | ULTA,Ulta Beauty,Consumer Discretionary,Specialty Stores 460 | UNH,United Health Group Inc.,Health Care,Managed Health Care 461 | UNM,Unum Group,Financials,Life & Health Insurance 462 | UNP,Union Pacific,Industrials,Railroads 463 | UPS,United Parcel Service,Industrials,Air Freight & Logistics 464 | URI,"United Rentals, Inc.",Industrials,Trading Companies & Distributors 465 | USB,U.S. Bancorp,Financials,Diversified Banks 466 | UTX,United Technologies,Industrials,Aerospace & Defense 467 | V,Visa Inc.,Information Technology,Internet Software & Services 468 | VAR,Varian Medical Systems,Health Care,Health Care Equipment 469 | VFC,V.F. Corp.,Consumer Discretionary,"Apparel, Accessories & Luxury Goods" 470 | VIAB,Viacom Inc.,Consumer Discretionary,Cable & Satellite 471 | VLO,Valero Energy,Energy,Oil & Gas Refining & Marketing 472 | VMC,Vulcan Materials,Materials,Construction Materials 473 | VNO,Vornado Realty Trust,Real Estate,Office REITs 474 | VRSK,Verisk Analytics,Industrials,Research & Consulting Services 475 | VRSN,Verisign Inc.,Information Technology,Internet Software & Services 476 | VRTX,Vertex Pharmaceuticals Inc,Health Care,Biotechnology 477 | VTR,Ventas Inc,Real Estate,Health Care REITs 478 | VZ,Verizon Communications,Telecommunication Services,Integrated Telecommunication Services 479 | WAT,Waters Corporation,Health Care,Health Care Distributors 480 | WBA,Walgreens Boots Alliance,Consumer Staples,Drug Retail 481 | WDC,Western Digital,Information Technology,"Technology Hardware, Storage & Peripherals" 482 | WEC,Wec Energy Group Inc,Utilities,Electric Utilities 483 | WELL,Welltower Inc.,Real Estate,Health Care REITs 484 | WFC,Wells Fargo,Financials,Diversified Banks 485 | WHR,Whirlpool Corp.,Consumer Discretionary,Household Appliances 486 | WLTW,Willis Towers Watson,Financials,Insurance Brokers 487 | WM,Waste Management Inc.,Industrials,Environmental & Facilities Services 488 | WMB,Williams Cos.,Energy,Oil & Gas Storage & Transportation 489 | WMT,Wal-Mart Stores,Consumer Staples,Hypermarkets & Super Centers 490 | WRK,WestRock Company,Materials,Paper Packaging 491 | WU,Western Union Co,Information Technology,Internet Software & Services 492 | WY,Weyerhaeuser Corp.,Real Estate,Specialized REITs 493 | WYN,Wyndham Worldwide,Consumer Discretionary,"Hotels, Resorts & Cruise Lines" 494 | WYNN,Wynn Resorts Ltd,Consumer Discretionary,Casinos & Gaming 495 | XEC,Cimarex Energy,Energy,Oil & Gas Exploration & Production 496 | XEL,Xcel Energy Inc,Utilities,Multi-Utilities 497 | XL,XL Capital,Financials,Property & Casualty Insurance 498 | XLNX,Xilinx Inc,Information Technology,Semiconductors 499 | XOM,Exxon Mobil Corp.,Energy,Integrated Oil & Gas 500 | XRAY,Dentsply Sirona,Health Care,Health Care Supplies 501 | XRX,Xerox Corp.,Information Technology,"Technology Hardware, Storage & Peripherals" 502 | XYL,Xylem Inc.,Industrials,Industrial Machinery 503 | YUM,Yum! Brands Inc,Consumer Discretionary,Restaurants 504 | ZBH,Zimmer Biomet Holdings,Health Care,Health Care Equipment 505 | ZION,Zions Bancorp,Financials,Regional Banks 506 | ZTS,Zoetis,Health Care,Pharmaceuticals 507 | -------------------------------------------------------------------------------- /5_UnsupervisedLearning/data/dow.csv: -------------------------------------------------------------------------------- 1 | company 2 | AAPL,Apple 3 | AXP,American Express 4 | BA,Boeing 5 | CAT,Caterpillar 6 | CSCO,Cisco Systems 7 | CVX,Chevron 8 | DIS,Walt Disney 9 | DWDP,DowDuPont 10 | GE,General Electric 11 | GS,Goldman Sachs 12 | HD,The Home Depot 13 | IBM,IBM 14 | INTC,Intel 15 | JNJ,Johnson & Johnson 16 | JPM,JPMorgan Chase 17 | KO,Coca-Cola 18 | MCD,McDonald's 19 | MMM,3M 20 | MRK,Merck 21 | MSFT,Microsoft 22 | NKE,Nike 23 | PFE,Pfizer 24 | PG,Procter & Gamble 25 | TRV,Travelers 26 | UNH,UnitedHealth Group 27 | UTX,United Technologies 28 | V,Visa 29 | VZ,Verizon 30 | WMT,Walmart 31 | XOM,ExxonMobil 32 | -------------------------------------------------------------------------------- /6_TextMining/6_TextMining.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/c9ff757b91837f6af31e72f3540534ad2b844d90/6_TextMining/6_TextMining.pdf -------------------------------------------------------------------------------- /6_TextMining/README.md: -------------------------------------------------------------------------------- 1 | # Text Mining 2 | Available Resources: 3 | * Presentation 4 | * [video](https://youtu.be/HSwD7uYwL8Y&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) 5 | * [slides](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/6_TextMining/6_TextMining.pdf) 6 | * Hands-on 7 | * [video](https://youtu.be/iApmefne6A8&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) 8 | * [notebook](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/6_TextMining/6_TextMining-ESA-News.ipynb) 9 | -------------------------------------------------------------------------------- /6_TextMining/data/esa_news_all.hdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/c9ff757b91837f6af31e72f3540534ad2b844d90/6_TextMining/data/esa_news_all.hdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 2018-MachineLearning-Lectures-ESA 2 | 3 | **[Español]** Actualización: los contenidos del blog en [IArtificial.net](https://www.iartificial.net) están disponibles en PDF en 2 versiones: 4 | - [PDF de IArtificial.net](iartificial_net/IArtificial_net.pdf) 5 | - [PDF para imprimir de IArtificial.net](iartificial_net/IArtificial_net_print.pdf) 6 | 7 | --- 8 | 9 | In 2018, The European Space Agency (ESA) organized a series of 6 lectures on Machine Learning at the European Space Operations Centre (ESOC). 10 | This repository contains the lectures resources: presentations, notebooks and links to the videos (presentation and hands-on). 11 | 12 | The topics covered are: 13 | 1. **Machine Learning Introduction** 14 | * presentation: [video](https://www.youtube.com/watch?v=FXYPDyoR1o0&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) [slides](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/1_Introduction/1_MachineLearningIntroduction.pdf) 15 | 2. **Linear Regression and Support Vector Machines** 16 | * presentation: [video](https://www.youtube.com/watch?v=_5lsmWpA5IU&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) [slides](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/2_LinearRegression_SVM/2_LinearRegression_SVM.pdf) 17 | * hands-on: [video](https://www.youtube.com/watch?v=9WisRGpP4p4&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) [notebook](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/2_LinearRegression_SVM/2_airbnb_frankfurt.ipynb) 18 | 3. **Decision Trees and Random Forests** 19 | * presentation: [video](https://www.youtube.com/watch?v=Op4thnw-ig8&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) [slides](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/3_DecisionTrees-RandomForests/3_DecisionTrees-RandomForests.pdf) 20 | * hands-on: [video](https://www.youtube.com/watch?v=HuD6myqJcFU&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) [notebook](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/3_DecisionTrees-RandomForests/3_bank.ipynb) 21 | 4. **Neural Networks and Deep Learning** 22 | * presentation: [video](https://www.youtube.com/watch?v=2Fp85uT41oA&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) [slides](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/4_NN-DeepLearning/4_NN-DeepLearning.pdf) 23 | * hands-on: [video](https://www.youtube.com/watch?v=3YdQlygV3xU&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) [notebook](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/4_NN-DeepLearning/4_HandWrittenRecognition-CNN.ipynb) 24 | * bonus: [Introduction to GANs](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/4_NN-DeepLearning/4_GANs_Intro.pdf) 25 | 5. **Unsupervised Learning** 26 | * presentation: [video](https://www.youtube.com/watch?v=8y7jgfJ8vTA&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) [slides](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/5_UnsupervisedLearning/5_UnsupervisedLearning.pdf) 27 | * hands-on: [video](https://www.youtube.com/watch?v=WheCCObhCdk&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) [notebook](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/5_UnsupervisedLearning/5_Unsupervised_DowJones.ipynb) 28 | 6. **Text Mining** 29 | * presentation: [video](https://www.youtube.com/watch?v=HSwD7uYwL8Y&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) [slides](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/6_TextMining/6_TextMining.pdf) 30 | * hands-on: [video](https://www.youtube.com/watch?v=iApmefne6A8&list=PLjai7zNYchWMJuV46s6XOIURPA3dDkooG) [notebook](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/blob/master/6_TextMining/6_TextMining-ESA-News.ipynb) 31 | 32 |   33 | 34 | ![logo](img/2018-MachineLearning-Lectures-ESA_2.JPG) 35 | -------------------------------------------------------------------------------- /iartificial_net/IArtificial_net.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/c9ff757b91837f6af31e72f3540534ad2b844d90/iartificial_net/IArtificial_net.pdf -------------------------------------------------------------------------------- /iartificial_net/IArtificial_net_print.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/c9ff757b91837f6af31e72f3540534ad2b844d90/iartificial_net/IArtificial_net_print.pdf -------------------------------------------------------------------------------- /img/2018-MachineLearning-Lectures-ESA.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/c9ff757b91837f6af31e72f3540534ad2b844d90/img/2018-MachineLearning-Lectures-ESA.JPG -------------------------------------------------------------------------------- /img/2018-MachineLearning-Lectures-ESA_2.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmartinezheras/2018-MachineLearning-Lectures-ESA/c9ff757b91837f6af31e72f3540534ad2b844d90/img/2018-MachineLearning-Lectures-ESA_2.JPG --------------------------------------------------------------------------------