├── LICENSE
├── README.md
├── _config.yml
├── data-science
├── DS - Correlation Coefficients.ipynb
├── DS - Cross-Entropy.ipynb
├── DS - Iris DataViz.ipynb
└── DS - Linear Discriminant Analysis.ipynb
├── deep-learning
├── DL - Feed Forward NN.ipynb
├── DL - Image Classifier.ipynb
└── DL - XOR NN Solution.ipynb
├── docs
├── CODE_OF_CONDUCT.md
└── CONTRIBUTING.md
├── machine-learning
├── supervised-learning
│ ├── ML - Linear Regression.ipynb
│ ├── ML - Logistic Regression.ipynb
│ └── ML - ROC Curve.ipynb
└── unsupervised-learning
│ ├── ML - Clustering Validation.ipynb
│ ├── ML - Clustering with Dendogram.ipynb
│ └── ML - DBSCAN Clustering.ipynb
└── nlp
└── NLP - Text Normalization.ipynb
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Andres Segura
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Machine Learning Course
2 | 
3 | 
4 | 
5 | 
6 | 
7 |
8 | Free hands-on and interactive course in Python, which starting from Data Science offers examples (in Google Colab) and explanation (in Twitter threads) on concepts and techniques of Machine Learning, Deep Learning and NLP.
9 |
10 | Although it is not intended to have the formal rigor of a book, we tried to be as faithful as possible to the original algorithms and methods, only adding variants, when these were necessary for didactic purposes.
11 |
12 | ## Quick Start
13 | The best way to get the most out of this course is to carefully read each selected problem, try to think of a possible solution (language independent) and then look at the proposed Python code and try to reproduce it in your favorite IDE. If you already have knowledge of the Python language, then you can go directly to programming your solution and then compare it with the one proposed in the course.
14 |
15 | If you want to play with these notebooks online without having to install any library or configure hardware, you can use the following service:
16 | -
17 |
18 | ## Contents
19 | 1. Data Science
20 | - Correlation Coefficients: explanation \| code
21 | - Feature Scaling: explanation \| code
22 | - Entropy and Cross-Entropy: explanation \| code
23 | - Data Visualization & Dimensionality Reduction: code
24 | - Linear Discriminant Analysis: code
25 |
26 | 2. Machine Learning
27 | - What is Machine Learning: explanation
28 | - Fundamentals: explanation
29 | - Tips for deploying ML models: explanation
30 | - Unsupervised Learning (UL)
31 | - Clustering: explanation
32 | - Hierarchical Clustering: explanation \| code
33 | - DBSCAN Clustering: explanation \| code
34 | - Clustering Validation: explanation \| code
35 | - Supervised Learning (SL)
36 | - Methodology for regression problems: explanation
37 | - Linear Regression: code
38 | - Logistic Regression: code
39 | - Confusion Matrix: explanation \| resource
40 | - ROC Curve: code
41 | - Overfitting and Regularization: explanation
42 |
43 | 3. Deep Learning
44 | - XOR NN Solution: explanation \| code
45 | - Feed Forward NN: explanation \| code
46 | - CNN to Classify Images: explanation \| code
47 |
48 | 4. Natural Language Processing
49 | - Computational Linguistics vs NLP: explanation
50 | - Top NLP Libraries: explanation
51 | - Text Normalization: explanation \| code
52 | - Split Sentences: explanation \| code
53 | - Embeddings vs one-hot encoding: explanation
54 | - spaCy: explanation
55 | - Hugging Face example: code
56 |
57 | ## Contributing and Feedback
58 | Any kind of feedback/suggestions would be greatly appreciated (algorithm design, documentation, improvement ideas, spelling mistakes, etc...). If you want to make a contribution to the course you can do it through a PR.
59 |
60 | ## Author
61 | - Created by Andrés Segura-Tinoco
62 | - Created on Mar 06, 2021
63 |
64 | ## License
65 | This project is licensed under the terms of the MIT license.
66 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | title: Machine Learning Course
2 | description: Starting from Data Science offers examples (with Python code) and explanation (in Twitter threads) on concepts and techniques of Machine Learning, Deep Learning and NLP
3 | show_downloads: false
4 | google_analytics:
5 | theme: jekyll-theme-cayman
6 |
--------------------------------------------------------------------------------
/data-science/DS - Cross-Entropy.ipynb:
--------------------------------------------------------------------------------
1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"DS - Cross-Entropy.ipynb","provenance":[],"collapsed_sections":[],"toc_visible":true,"authorship_tag":"ABX9TyMb4ZCAS2f9bNmhHXfh6HYc"},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"9FhFIxkiWhsr"},"source":["# Entropy and Cross-Entropy\n","\n","Created by Andres Segura-Tinoco \n","Created on Mar 15, 2021\n","\n","Source: https://en.wikipedia.org/wiki/Entropy_(information_theory)"]},{"cell_type":"code","metadata":{"id":"F50pPNvTW7O2"},"source":["import math"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"uyfoxcwjXojH"},"source":["**Entropy** is a measure of unpredictability, so its value is inversely related to the compression capacity of a chain of symbols.\n","\\begin{align}\n"," Entropy(X) = H(X) = \\sum_{i=1}^n P(x_i) \\log_{2} \\frac{1}{P(x_i)} \\tag{1}\n","\\end{align}"]},{"cell_type":"markdown","metadata":{"id":"GFQ2DEzHXrZl"},"source":["The **Cross-Entropy** of the distribution $q$ relative to a distribution $p$ over a given set is defined as follows:\n","\\begin{align}\n"," Cross-Entropy(p, q) = H(p, q) = \\sum_{i=1}^n P(x_i) \\log_{2} \\frac{1}{Q(x_i)} \\tag{2}\n","\\end{align}"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"f9QnmARTWc_5","executionInfo":{"status":"ok","timestamp":1615838598764,"user_tz":300,"elapsed":951,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"67361a6e-00af-4430-d9f8-89dab11966f5"},"source":["# Probability distributions P of x set\n","p_x = [0.1, 0.2, 0.15, 0.15, 0.4]\n","sum(p_x)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["1.0"]},"metadata":{"tags":[]},"execution_count":2}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"0rzI4sSEWgdA","executionInfo":{"status":"ok","timestamp":1615838598765,"user_tz":300,"elapsed":947,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"6c13796d-21b0-44cf-c22a-57861f7adc3b"},"source":["# Calculate entropy of Px\n","h_x = 0\n","for x in p_x:\n"," h_x -= x * math.log2(x)\n","h_x"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["2.1464393446710153"]},"metadata":{"tags":[]},"execution_count":3}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"QH8NwLrVYrqw","executionInfo":{"status":"ok","timestamp":1615838598765,"user_tz":300,"elapsed":943,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"f19c29ad-618e-4172-d13b-0a656c799484"},"source":["# Probability distributions Qgu of x set\n","q_x = [0.08, 0.24, 0.13, 0.17, 0.38]\n","sum(q_x)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["1.0"]},"metadata":{"tags":[]},"execution_count":4}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"FNvfKScpXIry","executionInfo":{"status":"ok","timestamp":1615838598766,"user_tz":300,"elapsed":941,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"9ede76f7-4df9-4d51-f0d3-8957aebfb8f5"},"source":["# Calculate cross-entropy of Qx relative to Px\n","ce_x = 0\n","for p, q in zip(p_x, q_x):\n"," ce_x += p * math.log2(1/q)\n","ce_x"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["2.1595073003443446"]},"metadata":{"tags":[]},"execution_count":5}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"fycgxlV1eq4s","executionInfo":{"status":"ok","timestamp":1615838598767,"user_tz":300,"elapsed":938,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"91d234c1-58af-4720-dafa-24c891340ff0"},"source":["# Validation\n","h_x < ce_x"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["True"]},"metadata":{"tags":[]},"execution_count":6}]},{"cell_type":"markdown","metadata":{"id":"D_Lvtzkme7wp"},"source":["
\n","You can contact me on Twitter | GitHub | LinkedIn"]}]}
--------------------------------------------------------------------------------
/deep-learning/DL - Feed Forward NN.ipynb:
--------------------------------------------------------------------------------
1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"DL - Feed Forward NN.ipynb","provenance":[],"collapsed_sections":[],"toc_visible":true,"authorship_tag":"ABX9TyM/F6tbrCHTSqFCrnxgftMs"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","metadata":{"id":"HyeqmF4temTO"},"source":["# Feed Forward Neural Network\n","\n","Created by Andres Segura-Tinoco \n","Created on Mar 23, 2021"]},{"cell_type":"markdown","metadata":{"id":"awFa8dBm_jVt"},"source":["The data set contains 3 classes of 50 instances each, where each class refers to a type of iris plant. \n","https://archive.ics.uci.edu/ml/datasets/iris"]},{"cell_type":"markdown","metadata":{"id":"AXx9yBN0ilkS"},"source":["## 1. Load libraries"]},{"cell_type":"code","metadata":{"id":"Rglh6Qt3ij14"},"source":["import numpy as np\n","from sklearn.datasets import load_iris\n","from sklearn.model_selection import train_test_split\n","from sklearn.preprocessing import OneHotEncoder\n","from keras.models import Sequential\n","from keras.layers import Dense\n","from keras.optimizers import Adam\n","from keras.utils.vis_utils import plot_model\n","import matplotlib.pyplot as plt"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"t0Hkl-vRipv_"},"source":["## 2. Load the Iris dataset"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"eW7cJrZ6iuVt","executionInfo":{"status":"ok","timestamp":1616537451440,"user_tz":300,"elapsed":3118,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"153afd1c-21b8-485d-bacc-b5ac9c6b6c22"},"source":["# Load dataset\n","iris_data = load_iris() \n","\n","# Check our data\n","print('Data Features:')\n","print(iris_data.feature_names)\n","\n","print('Example data:')\n","print(iris_data.data[:5])\n","\n","print('Example labels:')\n","print(iris_data.target[:5])"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Data Features:\n","['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']\n","Example data:\n","[[5.1 3.5 1.4 0.2]\n"," [4.9 3. 1.4 0.2]\n"," [4.7 3.2 1.3 0.2]\n"," [4.6 3.1 1.5 0.2]\n"," [5. 3.6 1.4 0.2]]\n","Example labels:\n","[0 0 0 0 0]\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"1FH-J6bbIW1D"},"source":["# Create X and Y sets\n","x = iris_data.data\n","y = iris_data.target.reshape(-1, 1) # Convert data to a single column"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"3NNziG5-iuvB"},"source":["## 3. One Hot encode the class labels"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"d4spSYKaV_nu","executionInfo":{"status":"ok","timestamp":1616537451441,"user_tz":300,"elapsed":3111,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"7611c770-2330-4a51-b5e0-fb8ce05438cc"},"source":["encoder = OneHotEncoder(sparse=False)\n","y = encoder.fit_transform(y)\n","print('OneHotEncoder: ')\n","print(y[[0, 50, 100]])\n","\n","#Encodes the output as:\n","#Setosa,\tVersicolor,\tVirginica\n","#1\t\t0\t\t\t0\n","#0\t\t1 \t\t0\n","#0 \t0 \t\t1"],"execution_count":null,"outputs":[{"output_type":"stream","text":["OneHotEncoder: \n","[[1. 0. 0.]\n"," [0. 1. 0.]\n"," [0. 0. 1.]]\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"j1aQ5hGgi5_f"},"source":["## 4. Split the data for training and testing"]},{"cell_type":"code","metadata":{"id":"npo8xqD4i6QI"},"source":["# Split the data into 80-20%\n","train_x, test_x, train_y, test_y = train_test_split(x, y, test_size=0.20)"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"ETEL5IwvjFiF"},"source":["## 5. Build the feedforward network model"]},{"cell_type":"code","metadata":{"id":"9zRPd3JfjE31"},"source":["# Create FFNN model\n","model = Sequential(name=\"Iris_FFNN\")\n","model.add(Dense(10, input_shape=(4,), activation='relu', name='L1'))\n","model.add(Dense(10, activation='relu', name='L2'))\n","model.add(Dense(3, activation='softmax', name='Output'))\n","\n","# Adam optimizer with learning rate of 0.001\n","optimizer = Adam(lr=0.001)\n","model.compile(optimizer, loss='categorical_crossentropy', metrics=['accuracy'])"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"utGRoG5QkYyY"},"source":["## 6. Show the model architecture"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"W-7bzX2DkZRO","executionInfo":{"status":"ok","timestamp":1616537451710,"user_tz":300,"elapsed":3371,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"591e20b5-79ac-4d7a-f9cd-0108e0fe64f5"},"source":["model.summary()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Model: \"Iris_FFNN\"\n","_________________________________________________________________\n","Layer (type) Output Shape Param # \n","=================================================================\n","L1 (Dense) (None, 10) 50 \n","_________________________________________________________________\n","L2 (Dense) (None, 10) 110 \n","_________________________________________________________________\n","Output (Dense) (None, 3) 33 \n","=================================================================\n","Total params: 193\n","Trainable params: 193\n","Non-trainable params: 0\n","_________________________________________________________________\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":422},"id":"xggbou1OjuZX","executionInfo":{"status":"ok","timestamp":1616537451711,"user_tz":300,"elapsed":3368,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"d0af9a3c-b939-43c2-9582-e3149251f2b3"},"source":["plot_model(model, to_file='model_plot.png', show_shapes=True, show_layer_names=True)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"image/png":"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\n","text/plain":[""]},"metadata":{"tags":[]},"execution_count":8}]},{"cell_type":"markdown","metadata":{"id":"B8S3GioMwy2O"},"source":["## 7. Train model"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"aU6hE_3MwzYK","executionInfo":{"status":"ok","timestamp":1616537454779,"user_tz":300,"elapsed":6431,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"d7e4b1a4-cddb-4f6d-9902-0ea0907027e9"},"source":["print(\"Fit model on training data\")\n","results = model.fit(train_x, train_y, batch_size=25, epochs=50, validation_data=(test_x, test_y), verbose=False)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Fit model on training data\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"-nDssxaAyQRx"},"source":["## 8. Plot model results"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"phPDQip_xhwE","executionInfo":{"status":"ok","timestamp":1616537454780,"user_tz":300,"elapsed":6428,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"82af0a20-18e5-47ad-ed6c-7e6ddfd3dee9"},"source":["# List all data in history\n","print(results.history.keys())"],"execution_count":null,"outputs":[{"output_type":"stream","text":["dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":295},"id":"Ew_zZWo9yyyl","executionInfo":{"status":"ok","timestamp":1616537454999,"user_tz":300,"elapsed":6643,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"634d5455-35ee-4374-caad-fc7d3c75395c"},"source":["# Summarize history for accuracy\n","plt.plot(results.history['accuracy'])\n","plt.plot(results.history['val_accuracy'])\n","plt.title('Model Accuracy')\n","plt.ylabel('accuracy')\n","plt.xlabel('epoch')\n","plt.legend(['train', 'test'], loc='upper left')\n","plt.show()"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":[""]},"metadata":{"tags":[],"needs_background":"light"}}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":295},"id":"oDwK8iB2yyoN","executionInfo":{"status":"ok","timestamp":1616537455236,"user_tz":300,"elapsed":6875,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"c4246fba-9b65-4a2f-9d11-b648f765b679"},"source":["# Summarize history for loss\n","plt.plot(results.history['loss'])\n","plt.plot(results.history['val_loss'])\n","plt.title('Model Loss')\n","plt.ylabel('loss')\n","plt.xlabel('epoch')\n","plt.legend(['train', 'test'], loc='upper left')\n","plt.show()"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3deXhV5bn38e+9M4dMZGQIEAghzLOoaC2jDCqgUlSUWl97UNva8e1RT2t72lNP7Xs62B6r1lpq1RZnFKuWGUEZwyTzPCVARjKSOff7x9pgQgIEyM5O9r4/17WvZK9n7bXvdRH2b6/nWetZoqoYY4zxXy5vF2CMMca7LAiMMcbPWRAYY4yfsyAwxhg/Z0FgjDF+zoLAGGP8nAWBMZcgIikioiIS2Ix1vyYin7ZGXca0FAsC41NE5IiIVIlI/HnLt7g/zFO8U9nlBYoxrcmCwPiiw8A9Z5+IyCAg3HvlGNO2WRAYX/Qq8NV6z+8HXqm/gohEi8grIpIrIkdF5Mci4nK3BYjIr0UkT0QOAbc08dq/iMhJEckSkV+ISMDVFCwiXURkoYgUiMgBEfm3em2jRCRDRIpFJFtEfuteHioir4lIvogUishGEUm6mjqMf7IgML5oHRAlIv3cH9B3A6+dt87/AtFAL+DLOMHxgLvt34BbgWHASGDmea99GagBervXuRn4+lXW/DqQCXRxv99/i8g4d9vvgd+rahSQCrzpXn6/ex+6AXHAw0D5VdZh/JAFgfFVZ48KJgK7gayzDfXC4QlVLVHVI8BvgDnuVWYBz6jqcVUtAH5Z77VJwFTgu6papqo5wO/c27siItINuAF4TFUrVHUr8BJfHNVUA71FJF5VS1V1Xb3lcUBvVa1V1U2qWnyldRj/ZUFgfNWrwGzga5zXLQTEA0HA0XrLjgJd3b93AY6f13ZWD/drT7q7YwqBPwGJV1FrF6BAVUsuUM+DQB9gj7v751b38leBRcDrInJCRP6fiARdRR3GT1kQGJ+kqkdxBo2nAu+e15yH8226R71l3fniqOEkTndL/bazjgOVQLyqxrgfUao64CrKPQHEikhkU/Wo6n5VvQcnbH4FvC0iHVS1WlV/pqr9gdE43VlfxZjLZEFgfNmDwDhVLau/UFVrcfrZnxKRSBHpAXyfL8YR3gS+LSLJItIReLzea08Ci4HfiEiUiLhEJFVEvnwZdYW4B3pDRSQU5wN/DfBL97LB7tpfAxCR+0QkQVXrgEL3NupEZKyIDHJ3dRXjhFvdZdRhDGBBYHyYqh5U1YwLND8KlAGHgE+BfwDz3G1/xuly2QZspvERxVeBYGAXcBp4G+h8GaWV4gzqnn2MwzndNQXn6GAB8FNVXepefzKwU0RKcQaO71bVcqCT+72LccZBPsHpLjLmsojdmMYYY/ybHREYY4yfsyAwxhg/Z0FgjDF+zoLAGGP8XLubBTE+Pl5TUlK8XYYxxrQrmzZtylPVhKba2l0QpKSkkJFxoTMCjTHGNEVEjl6ozbqGjDHGz1kQGGOMn7MgMMYYP9fuxgiaUl1dTWZmJhUVFd4uxeNCQ0NJTk4mKMgmmTTGtAyfCILMzEwiIyNJSUlBRLxdjseoKvn5+WRmZtKzZ09vl2OM8RE+0TVUUVFBXFycT4cAgIgQFxfnF0c+xpjW4xNBAPh8CJzlL/tpjGk9PhMEl1JRXcuJwnLqbLZVY4xpwG+CoKqmjrzSSkoralp824WFhTz33HOX/bqpU6dSWFh46RWNMcaD/CYIIkIDCRChuLy6xbd9oSCoqbl46Hz00UfExMS0eD3GGHM5fOKsoeZwiRAZFkRRRTVdVHG1YF/7448/zsGDBxk6dChBQUGEhobSsWNH9uzZw759+5gxYwbHjx+noqKC73znO8ydOxf4YrqM0tJSpkyZwo033siaNWvo2rUr77//PmFhYS1WozHGXIjPBcHPPtjJrhPFTbbV1ikV1bWEBgUQ4Gp+EPTvEsVPb7vwvcmffvppduzYwdatW1m5ciW33HILO3bsOHeK57x584iNjaW8vJxrrrmGO++8k7i4uAbb2L9/P/Pnz+fPf/4zs2bN4p133uG+++5rdo3GGHOlfC4ILibAJSBOIFxOEFyuUaNGNTjP/w9/+AMLFiwA4Pjx4+zfv79REPTs2ZOhQ4cCMGLECI4cOeKx+owxpj6fC4KLfXMHOJpfRlllLf06R3rsVMwOHTqc+33lypUsXbqUtWvXEh4ezpgxY5q8DiAkJOTc7wEBAZSXl3ukNmOMOZ/fDBafFR0WRE1dHWVVtS22zcjISEpKSppsKyoqomPHjoSHh7Nnzx7WrVvXYu9rjDEtweeOCC4lMjQIcZ89FBHSMrsfFxfHDTfcwMCBAwkLCyMpKelc2+TJk3nhhRfo168f6enpXHfddS3ynsYY01JE29kFViNHjtTzb0yze/du+vXr1+xtHMkro7y6lr6dPNc95EmXu7/GGCMim1R1ZFNtftc1BE73UHVtHeUt2D1kjDHtlV8GQWRYICJCUUXLX1xmjDHtjV8GQaDLRURIIEXl1bS3rjFjjGlpfhkEANFhgVTV1FFRbd1Dxhj/5rEgEJF5IpIjIjsu0B4tIh+IyDYR2SkiD3iqlqZEhQYhCEXlLT8JnTHGtCeePCJ4GZh8kfZvArtUdQgwBviNiAR7sJ4GAgNcdAgJsO4hY4zf81gQqOoqoOBiqwCR4py/GeFet1W/nkeHBVFZU0tlTd1VbedKp6EGeOaZZzhz5sxVvb8xxlwNb44RPAv0A04A24HvqGqTn8giMldEMkQkIzc3t8UKiApzbgBfdJVTU1sQGGPaM29eWTwJ2AqMA1KBJSKyWlUbTR2qqi8CL4JzQVlLFRAU4KJDsHP2UFJU6BVvp/401BMnTiQxMZE333yTyspKbr/9dn72s59RVlbGrFmzyMzMpLa2lieffJLs7GxOnDjB2LFjiY+PZ8WKFS21a8YY02zeDIIHgKfV6aA/ICKHgb7Ahqva6sePw6ntzV69W20dVTV11AUHXPgeBZ0GwZSnL7iN+tNQL168mLfffpsNGzagqkybNo1Vq1aRm5tLly5d+PDDDwFnDqLo6Gh++9vfsmLFCuLj4y9rN40xpqV4s2voGDAeQESSgHTgUGsXEeiejrqmrmUONBYvXszixYsZNmwYw4cPZ8+ePezfv59BgwaxZMkSHnvsMVavXk10dHSLvJ8xxlwtjx0RiMh8nLOB4kUkE/gpEASgqi8A/wW8LCLbAQEeU9W8q37ji3xzb4oLyM4ppVaVPkmRV/32qsoTTzzBQw891Kht8+bNfPTRR/z4xz9m/Pjx/OQnP7nq9zPGmKvlsSBQ1Xsu0X4CuNlT7385osODOFFYfu7uZZer/jTUkyZN4sknn+Tee+8lIiKCrKwsgoKCqKmpITY2lvvuu4+YmBheeumlBq+1riFjjLf4zzTU1eVwJh+iuoA07BGLDgviZGE5hWeq6BR9+fcJrj8N9ZQpU5g9ezbXX389ABEREbz22mscOHCAH/7wh7hcLoKCgnj++ecBmDt3LpMnT6ZLly42WGyM8Qr/mYa6ohgKDkLHnhAW06j5UG4pVbV1pCe1/ampbRpqY8zlsmmoAUIiwRUIZ5q+xi0mPJiqmjrKbe4hY4yf8Z8gEIGwWKgshtrGF5BFuaemLjxjU1MbY/yLzwRBs7q4wmMBhfLTjZoCXS4i28HU1G25NmNM++QTQRAaGkp+fv6lPySDwpzHBbuHnDuXlVW2zRlJVZX8/HxCQ6/8KmhjjDmfT5w1lJycTGZmJs2ah6iyxDkiyKmEgIaTnaoquUUVlGYH0DG81SZCvSyhoaEkJyd7uwxjjA/xiSAICgqiZ8+ezVu5LB9+kw7XPgSTnmrU/KfXt7BybzYbfzSB4ECfOGAyxpiL8r9Pug5x0GcSfP5mk4PG04Z0oai8mtX7W26WU2OMacv8LwgAhs6Gshw4sKxR05fSEogOC+KDbSe8UJgxxrQ+/wyC3hMhPA62/aNRU3Cgi6mDOrF4VzblVXZNgTHG9/lnEAQGw6BZsPfjJs8gum1wF85U1bJsT7YXijPGmNbln0EAMPQeqK2CHe80arq2VxyJkSEs3GrdQ8YY3+e/QdBpMCQOgG3zGzUFuIRbBndm5d7cq76NpTHGtHX+GwQizqBx1ibI3duoedqQLlTV1rFo5ykvFGeMMa3Hf4MAYPAskADY2njQeGi3GHrEhbNgc5YXCjPGmNbj30EQkQi9J8Dnb0BdwzOERISZw5NZeyifo/llXirQGGM8z7+DAJzuoZKTcKjxTWFmjkzGJfBWRqYXCjPGmNZhQZA+xbmmIOOvjZo6R4dxU58E3t6USW0L3dzeGGPaGo8FgYjME5EcEdlxkXXGiMhWEdkpIp94qpaLCgyBYXNg70dQ1Hg84K6R3ThVXMEqm3LCGOOjPHlE8DIw+UKNIhIDPAdMU9UBwFc8WMvFjXwAVGHTy42axvdLIrZDMG9lHG/9uowxphV4LAhUdRXQ9MT/jtnAu6p6zL1+jqdquaSOKZA2ETb/rdFEdMGBLm4f1pUlu7LJL630Tn3GGONB3hwj6AN0FJGVIrJJRL7qxVrgmq9DaTbs+Wejplkju1FdqyzYYqeSGmN8jzeDIBAYAdwCTAKeFJE+Ta0oInNFJENEMpp185kr0XsCxHSHjX9p1JTeKZIh3WJ4M+O43SrSGONzvBkEmcAiVS1T1TxgFTCkqRVV9UVVHamqIxMSEjxTjSsARjwAR1ZDzp5GzXeN7Ma+7FK2ZRZ55v2NMcZLvBkE7wM3ikigiIQD1wK7vViPc/ZQQDBkzGvUdNuQzoQGuXhjow0aG2N8iydPH50PrAXSRSRTRB4UkYdF5GEAVd0N/Av4HNgAvKSqFzzVtFVEJED/Gc5EdJWlDZoiQ4OYOqgzH2w7YfcpMMb4FE+eNXSPqnZW1SBVTVbVv6jqC6r6Qr11/kdV+6vqQFV9xlO1XJZrHoTKYtj+VqOmu0Z2o7Syho+2n/RCYcYY4xl2ZfH5ul0LSQMh4y/OtQX1jOoZS0pcOG/YNQXGGB9iQXA+Eeeo4NR2yNx4XpPwlZHd2HC4gMN5NhGdMcY3WBA0ZdAsCI6EjS81apo54uxEdHZUYIzxDRYETQmJgCF3w84FUJbfoCkpKpRxfRN5MyOTyhobNDbGtH8WBBdyzYPOPY23vNKo6avXp5BXWsmHn9ugsTGm/bMguJDEfpDyJVj/ItRUNWj6Ulo8vRMj+OtnR+xKY2NMu2dBcDGjvw0lJ5wuonpEhK+NTmF7VhGbjp72UnHGGNMyLAgupvcESOgLa/630amkdwzvSlRoIH/97Ih3ajPGmBZiQXAxLhdc/y3I3g6HVjZoCg8O5J5R3fnXzlOcKCz3Tn3GGNMCLAguZfAsiEiCNX9o1DTn+h6oKq+sPeqFwowxpmVYEFxKYAhc+xAcXA6nGk6FlNwxnEkDOjF/wzGbf8gY025ZEDTHiAcgqAOsfbZR0wM39KSovNpuWmOMabcsCJojPBaGz3EmojvvBvfXpHRkQJcoXl5z2E4lNca0SxYEzXXdI6B1sOFPDRaLCA/c0JN92aV8diD/Ai82xpi2y4KguTqmQP/pkPFXqChu0HTbkM7ERwTz188Oe6c2Y4y5ChYEl2P0o869Cra82mBxSGAAs6/twfK9ORyxWUmNMe2MBcHl6DoCetwA656H2uoGTfdd151Al/DymiPeqc0YY66QBcHlGv0oFB2HXe83WJwYGcqtg7vwVsZxis5UX+DFxhjT9lgQXK60SRDfBz59ptG0E3Nv6kVZVa0dFRhj2hULgsvlcsGN33emndjzzwZN/TpHMaFfEvM+O0xJhR0VGGPaB48FgYjME5EcEdlxifWuEZEaEZnpqVpa3KCvQFxvWPFLqKtr0PTouN4UlVfz2rpjXirOGGMujyePCF4GJl9sBREJAH4FLPZgHS0vIBC+/Bjk7ITdCxs0DekWw019Enhp9SGbdsIY0y54LAhUdRVQcInVHgXeAXI8VYfHDLzTGStY+XSTRwX5ZVX8Y4MdFRhj2j6vjRGISFfgduD5Zqw7V0QyRCQjNzfX88U1hyvAOSrI3Q27Gt645pqUWK7rFcuLqw5SUW1HBcaYts2bg8XPAI+pat2lVlTVF1V1pKqOTEhIaIXSmmnA7ZDQz31U0PAD/9FxaWQXV/LWpkwvFWeMMc3jzSAYCbwuIkeAmcBzIjLDi/VcPlcAjHkM8vbBjncbNI1OjWN49xheWHmQ6tpLZp0xxniN14JAVXuqaoqqpgBvA99Q1fe8Vc8V6zcdEgfAJ09Dbc25xSLCo+PSyCosZ8Fmm6LaGNN2efL00fnAWiBdRDJF5EEReVhEHvbUe3qFywVjHof8A7Dj7QZNY9ITGNg1iudWHqDGjgqMMW1UoKc2rKr3XMa6X/NUHa2i763QaRB88isYONM5vRTnqOBbY9N4+LVNfLj9JNOHdvVyocYY05hdWdwSXC4Y8wQUHILP32jQdHP/JNKTInl2+QHq6uzGNcaYtseCoKWkT4XOQ5yjgpqqc4tdLuGb43qzP6eUhdtOeLFAY4xpmgVBSxGBcT+BwqOw8c8Nmm4d1JkBXaL4n0V77boCY0ybY0HQktImQOp456jgzBcXVbtcwo+m9iOrsJy/fnbEe/UZY0wTLAha2s2/gMoSJwzqGd07nvF9E3luxQHySyu9VJwxxjRmQdDSkvrD8Pth40uQt79B0xNT+3KmupY/LNt/gRcbY0zrsyDwhLE/gsAwWPxkg8W9EyO5Z1Q3/r7+GAdzS71UnDHGNGRB4AkRCXDTD2Dfx3BoZYOm707oQ2hQAE9/vMc7tRljzHksCDzl2kcgpjss+lGDCeniI0J4ZEwqS3Zls+5QvhcLNMYYhwWBpwSFwoSfQfYO2Pr3Bk0P3tiTztGhPPXhbrvIzBjjdRYEnjTgduh2LSx3n0nkFhoUwA8npbM9q8guMjPGeJ0FgSeJwKT/htJs+PSZBk0zhna1i8yMMW2CBYGnJY90bna/9lk4ffTcYpdL+NEtzkVmf151yIsFGmP8nQVBa5jwn+AKhA++A/rFmMDo1HimDOzEsysOcCz/jNfKM8b4t2YFgYh8R0SixPEXEdksIjd7ujifEZ3shMGhFY0Gjn9yW38CXcJPF+5A1QaOjTGtr7lHBP9HVYuBm4GOwBzgaY9V5YtGPgg9boB//QcUnzy3uHN0GN+b2IcVe3NZtPOUFws0xvir5gaBuH9OBV5V1Z31lpnmcLlg2v9CbSV8+IMGXURfG51C306R/OyDXZRV1lxkI8YY0/KaGwSbRGQxThAsEpFIwO69eLniUp3pJ/Z+CDu/uNl9YICLp24fyMmiCp5Zus+LBRpj/FFzg+BB4HHgGlU9AwQBD3isKl923Tegy3D46N+hLO/c4hE9Yrn7mm7M++wIu08We7FAY4y/aW4QXA/sVdVCEbkP+DFQ5LmyfFhAIEz/I1QUwcePNWh6bHJfosOC+NGC7XbFsTGm1TQ3CJ4HzojIEOAHwEHglYu9QETmiUiOiOy4QPu9IvK5iGwXkTXubfuHpP5w0w9hx9uw9+Nzizt2CObxKX3ZfKyQNzOOe7FAY4w/aW4Q1KhzbuN04FlV/SMQeYnXvAxMvkj7YeDLqjoI+C/gxWbW4htu/B4kDoB/fg/KC88tnjk8mWtSOvL0v/ZQUFZ1kQ0YY0zLaG4QlIjIEzinjX4oIi6ccYILUtVVQMFF2teo6mn303VAcjNr8Q2BwTD9WSjNgYWPnjuLyOUSfjFjEKUVNfz4PesiMsZ4XnOD4C6gEud6glM4H9r/04J1PAh8fKFGEZkrIhkikpGbm9uCb+tlXYfDxJ/B7oXw6e/OLU7vFMkPJ6Xz0fZT/HrxXi8WaIzxB80KAveH/9+BaBG5FahQ1YuOETSXiIzFCYLHLrSOqr6oqiNVdWRCQkJLvG3bcf23YOCdsOznsH/pucVzb+rFPaO689zKg7y+4ZgXCzTG+LrmTjExC9gAfAWYBawXkZlX++YiMhh4CZiuqv55lxYR50KzpAHwzoNQcNi9WPiv6QO4qU8CP3pvB6v3+9CRkDGmTWlu19CPcK4huF9VvwqMAp68xGsuSkS6A+8Cc1TVv6+iCu4Ad73q/P7GfVBVBjgXmv1x9jDSEiP4xmub2Xuq5CIbMcaYK9PcIHCpak695/mXeq2IzAfWAukikikiD4rIwyLysHuVnwBxwHMislVEMi63eJ8S2wtm/gWydzYYPI4MDWLe164hPCSAB/66gZziCi8XaozxNdKcGS9F5H+AwcB896K7gM9V9YL9+p4ycuRIzcjw4cxY/RtnvODmX8DoR88t3pFVxKw/rSU1IYI3HrqO8OBALxZpjGlvRGSTqo5sqq25g8U/xDnPf7D78aI3QsAv3Ph96DcNlvwEDq44t3hg12ienT2MnSeK+Pb8rXZaqTGmxTT7xjSq+o6qft/9WODJovyaCMx4DuLT4Y05kLXpXNO4vkk8eWt/lu7O5g/L93uxSGOML7lUP3+JiBQ38SgREZsZzVNCImHOuxAeC6/e4YwbuH1tdAp3Dk/mmaX7WbIr24tFGmN8xUWDQFUjVTWqiUekqka1VpF+KaoL3L8QgsLglRmQdwBwTit96vaBDOoazfff2MrB3FIvF2qMae/snsVtWccU+OpC0Dp4ZToUOheWhQYF8MKcEQQFunjo1U2U2s1sjDFXwYKgrUvoA3MWQFUJ/G0alDi3s+waE8azs4dxOK+MH7xpg8fGmCtnQdAedB4M977jTFD3ygwocy7CHp0azxNT+rJoZzbPf3LQy0UaY9orC4L2ots1MPt1OH0YXpkGp48C8OCNPZk+tAu/XryXFXtzLrERY4xpzIKgPel5E9wzHwqPw4tfhoPLERGevmMwfTtF8e35W1hzIO/S2zHGmHosCNqb1HEwdwVEdobX7oRPnyEsyMVL94+kc3Qoc+Zt4JW1R2jOFePGGAMWBO1TXCo8uAT6T4elP4W3vkbXsFreeWQ0Y9MT+Mn7O/mPBTuoqqnzdqXGmHbAgqC9ComAmX+FiT93bmzz0gQiy47x4pyRfHNsKvM3HOO+l9aTX1rp7UqNMW2cBUF7JgI3fAfuexdKs+HFMbg2/5UfTuzD7+8eyrbMQqY9+xm7TthF4MaYC7Mg8AWpY+GhT6DLUPjn9+BvtzE9uZy3Hr6e2jrlzufXMO/Tw9TUWleRMaYxCwJfEdPduQp52rOQvR2eH83gw39h4SOjGJnSkZ//cxe3/u+nZBwp8Halxpg2xoLAl4jA8DnwzY2QPgWW/ZzE16fwyuQgnr93OEXl1cx8YS0/eHMbeTZ2YIxxsyDwRZFJMOtvcPc/4Ewe8tJ4phz6Bcv/rTePjEll4bYsxv56Ja+sPUKtTU1hjN+zIPBlfW+Bb66Hax+Bz98k7PlreExeZdHcgQxJjuEn7+9k+h8/ZdvxQm9XaozxIgsCXxcaDZP/Gx7dDIO/Auueo9ffR/Nq7xU8/5U+5BRXMuO5z3jyvR0UlVd7u1pjjBd4LAhEZJ6I5IjIjgu0i4j8QUQOiMjnIjLcU7UYIKYbTP8jfGMdpI5FVv6SKcsms/r6zTwyKoa/rz/K+N+sZMGWTLsq2Rg/48kjgpeByRdpnwKkuR9zgec9WIs5KyEd7noVvr4cOg8mZNVT/PvOO8gY8gHXRebyvTe2MfvP69lzyq49MMZfeCwIVHUVcLFzFacDr6hjHRAjIp09VY85T/II5z4H31gHQ+4m9sACnj39CGu7/oHYEyuY8swn3PvSOpbsyrYBZWN8nHiyG0BEUoB/qurAJtr+CTytqp+6ny8DHlPVjCbWnYtz1ED37t1HHD161GM1+62yfNj8Mmz4M5ScpCSkEx/VjOCtMyPIiRnCV0f34isjuxEdFuTtSo0xV0BENqnqyCbb2kMQ1Ddy5EjNyLjoKuZq1FY7cxdtfxs9sAypraTAFcsHVSNYJtfTbdh47r2uF/272C2rjWlPLhYEga1dTD1ZQLd6z5Pdy4w3BQTBwDth4J1IZQnsW0TsrveZs28x99cuoWDb71i2eRjvx91E39EzmDK8F6FBAd6u2hhzFbwZBAuBb4nI68C1QJGqnvRiPeZ8IZEwaCYMmomrqgz2LyFix0Km7V9ESNEqKj76Fes+Hkxxj5sZNPZueqakeLtiY8wV8FjXkIjMB8YA8UA28FMgCEBVXxARAZ7FObPoDPDApbqFwLqG2oTaavTIZ5za8C4hB/9FbE02dSrsCe5PeepU+oy5h8hOqd6u0hhTj9fGCDzBgqCNUaXg0GYOrX6djscWk1p3BIDjIWnUpt9Kt9GzCEjq58yDZIzxGgsC0ypUlT27PufIZ6/T+cRShrIPgLzQHtT2nUbidXchSQMtFIzxAgsC0+oqqmtZvXk7p9a/Te+8ZYyS3QSIkh/andr0aSRc+xWk8xALBWNaiQWB8aqiM9V8smUnBZvepXfeMq6TXQRKHYUhXXH1u5WoYbdDt1HgsrOPjPEUCwLTZhSeqWLllj3kZbxLr7wV3ODaQYjUUBEcS0D/WwkaMA163gSBId4u1RifYkFg2qSTReV8sGEvpzI+YNiZTxnr2kaElFMTFIGkTyVg4AxIHQdBYd4u1Zh2z4LAtGmqyuZjp1mw8RD525cwpnYdkwIyiJFSqgPC0bSbCR50O6RNhOAO3i7XmHbJgsC0GxXVtXy6P4/lu7Io3LWCG6o+Y3LARuKkmBpXKHW9JxA8+A5ImwQhEd4u15h2w4LAtEt1dcq2zEKW7TpB9vaVDCxawZSAjSRKIXUBIUjaRKT/DOgzCUJt7iNjLsaCwPiE3SeLeWP9YQ5vXcGYmjXcFrSReC1A3aHAoJnQZ7KNKRjTBAsC41PKq2r5cPtJ3lh/hLrjG5gWuJ4ZweuJrj2NBndA+t4KA2dC6lhnEj1jjAWB8V37skt4K+M4H27NJKVsC3cErWVqwEbC60rRsFhkwO0w5G5IvsYuXjN+zYLA+Ly6OmXDkQLe33qCJduPMaRyEzOD1zFBNhKkVRDbCwbfBYNnOb8b42csCIxfqaqpY/X+XBZsyeKzXYcZr+u5L2wtQ2q2Iygkj3KOEgbeAWEdvV2uMXt3hLwAABPtSURBVK3CgsD4rcIzVSzcdoI3M46Tn3WYO4LWcG/YWrpUHXEGmftOhaH3Qq+xEODN23MY41kWBMYAO08U8VZGJgs2Z9Ktch8PdFjLVD4jrKYQIpKcrqOhsyGxn7dLNabFWRAYU09FdS3/2nGKf2w4xpbDOUwM3MrD0esYeGYDLq2BzkNg8N3O6agRid4u15gWYUFgzAUcyCll/oZjvLM5k4AzedwftYm7Qz4jsWQ3SAD0Hu+MJ6RPtesTTLtmQWDMJdQ/SthwuIB+AVl8N3ELYyqXE3LmFIREwYAZMGQ2dL/OTkU17Y4FgTGX4UBOCfM3HOedzZkUn6lkRsxBHorZSFr+clzVZ6BjCgy5xzlS6Jji7XKNaRYLAmOuwLmjhPXH2HCkgEhXJd/rupvpsorYnPXOqag9bnAGmPtPh5BIb5dszAV5LQhEZDLweyAAeElVnz6vvTvwNyDGvc7jqvrRxbZpQWC84WBuKW9mHOedTVnklVYyMKKY/9tpK6NLFxNceAiCwqHfNBh6D6TcBC6Xt0s2pgGvBIGIBAD7gIlAJrARuEdVd9Vb50Vgi6o+LyL9gY9UNeVi27UgMN5UXVvHJ3tzeSPjOMv35FBbV8ddnU7xfyLWkpa7GFdlMUR3c05FHXIPxPf2dsnGABcPAk9eQTMKOKCqh9xFvA5MB3bVW0eBs/MHRwMnPFiPMVctKMDFhP5JTOifRE5JBe9tyeLdzVFMOtCZDq7b+Hbyfu6QT4j/9LfI6l9D1xFOKAy8EzrEe7t8Y5rkySOCmcBkVf26+/kc4FpV/Va9dToDi4GOQAdggqpuamJbc4G5AN27dx9x9OhRj9RszJXafbKYBVuyeG9LFjkllaSGFvP9ztsZW7Gc8NO7wRUIvSc4oZA+xU5FNa3OW11DzQmC77tr+I2IXA/8BRioqnUX2q51DZm2rLZO+exAHu9uzmTRzmzKq2u5KTqHR+MyGFa0lMCyUxAc4YTBgNshdTwEhXq7bOMHvNU1lAV0q/c82b2svgeByQCqulZEQoF4IMeDdRnjMQEu4aY+CdzUJ4GyyhoW7TzFgi1Z3HUgEXQy9yYeZU7kZnrvX4pr+1sQHAl9p8KAO5z7JwSGeHsXjB/y5BFBIM5g8XicANgIzFbVnfXW+Rh4Q1VfFpF+wDKgq16kKDsiMO1RTnEFC7ed4N3NWew6WUx4QB2P9MjizpCNdD65FKkohJBodyjc7kyCFxjs7bKND/Hm6aNTgWdwTg2dp6pPicjPgQxVXeg+U+jPQATOwPG/q+rii23TgsC0d7tOFPP2pkze25pFQVkVnSNcfK/XCSbJOqKPLoKKIgsF0+LsgjJj2qCqmjpW7M3hrYxMVuzNobZO6ZcQwtzk44yrW0P0kUVQ6Q6F9MnOdQq9x9tAs7kiFgTGtHG5JZV8vOMkH35+kg1HClCFvgkhPOQOhaiji53uo6AOkDYR+k+DtJvtambTbBYExrQjOSUVLNpxig+3n2T9YScU0uJC+Hq3LCawntjji5GyXAgIgdRx0O9W6DMFOsR5u3TThlkQGNNO5ZRUsGhnNot2nGLtoXxq65Ru0cE82COHyQEbSMpaihRngriceY/63QZ9b4HoZG+XbtoYCwJjfEDhmSqW7Mpm0c5TrNqfR1VNHYkRwTzYu5jbgjfR+eQyJHePs3Lnoc49FNKnQKdBNm22sSAwxteUVtawfE8OH31+khV7c6isqSMpKoQ5aVXMCN1C1+yVSOZGQJ25j9KnOI8eN9oZSH7KgsAYH1ZaWcOy3dl8+PlJVu7Lpaqmjk5RodyZHszMqJ2k5H2CHFwBNeXODXZSxzmhkHYzhMd6u3zTSiwIjPETJRXVLNudw4fbT/KJOxSSokK4rX8ss2IPkFb4KbJvEZSecsYVul0LfSY73UjxadaF5MMsCIzxQyUV1Szfk9PgSCEhMoSb+yVwZ+c8hpStJeDAv+DUducFHXs6odBnkjPwbF1IPsWCwBg/d7b7aNHOU6zcm8uZqloiQwMZ1zeR6T3ruKFuEyGHlsLhT6CmwpkYL3WsEwy9J0BkJ2/vgrlKFgTGmHMqqmtZvT+PRTtPsWx3NqfPVBMc6OLG3vFM6hPFzeF76Xh8OexbBCXuW4R0HgK9JzrjCskjwRXg3Z0wl82CwBjTpJraOjYcKWDprhyW7D7F8YJyAIYkRzOhbyK3dCqg5+k1yP4lcHw9aC2EdXQGnHtPcH7a0UK7YEFgjLkkVWV/TilLdmWzdHc2W48XogrdY8OZNCCJW9LCGVy1BdeBJbB/CZS5Z4tPGvhFMHS/zqbSbqMsCIwxly2npIJlu3NYtPMUnx3Io7pWSYgMYWL/JCb1T+T6DicJPrICDiyDY+ugrhqCwp2B5l5jnEdif3C5vLsjBrAgMMZcpeKKalbsyWkw2NwhOIAbesczrm8i43p1IDF/gxMKh1ZC/n7nhR0SoOeXodeXnWCI6e7FvfBvFgTGmBZTUV3Lp/vzWL43hxV7cjhZVAFA/85RjOubyJj0BIZElxF0dLUTCodWQmm28+KOKdDzJiccUr4EkUne2g2/Y0FgjPEIVWVvdgnL9zihsOnoaeoUIkMCuS41jpvS4vlS73h61B1DjqyGw6vgyGrn5jsA8enQ80tOd1LKjRCR6N0d8mEWBMaYVlF0ppo1B/NYtT+PVftyySp0zkLqFhvGjb3jGZ0az/U9Y4gv3euEwuFVcHQtVJc5G4hLgx6jnVDoMdpmUW1BFgTGmFanqhzJP8Pq/bms2pfL+kMFlFTWAJCeFMno3nGMTo1nVI8ook/vgqOfwtE1TjBUuo8YIrtA8gjoOtK5fqHLMAju4MW9ar8sCIwxXldTW8f2rCLWHMxn7cF8Nh4poLKmDpfAoK7RjO4dz+jUOEZ2iybs9B4nFLIyIDMDTh92NiIu50ykrsOdUOgyDBIH2HQYzeDNm9dPBn6Pc/P6l1T16SbWmQX8J87N67ep6uyLbdOCwBjfUFlTy5Zjhaw5kMeag/lsPV5ITZ0SFCAM696R0alxXNszjmHdYwitOg1Zm5xQyMqAE1ug/LSzoYBgSBrghELnodBlqBMWAUHe3cE2xitBICIBwD5gIpAJbATuUdVd9dZJA94ExqnqaRFJVNWci23XgsAY31RWWcPGIwWsPZjPmoP57DhRhCoEBQhDkmMY1TOWa3vFMaJHRyKCA6DwqBMI5x7bvuhSOhsOnYe6A2IIJPbz64vdvBUE1wP/qaqT3M+fAFDVX9Zb5/8B+1T1peZu14LAGP9QdKaajKMFbDhcwPrDBWzPKqK2TnEJ9O0UxfAeMQzv3pHh3TvSIy4cUXW6kE5sgZNb4cRWOPn5F+HgCoSEvs4d284+kgb6zT0ZLhYEgR58367A8XrPM4Frz1unD4CIfIbTffSfqvovD9ZkjGknosODGN8vifH9nGsNyipr2HKskA2H89l8rJD3tpzgtXXHAIjrEMyw7jEMSY5hYPJNDBp9G/ERIVBX54TDqc+dUDi1HQ6ugG3zv3ijqGTn6OHso9MgiE2FAE9+PLYt3t7TQCANGAMkA6tEZJCqFtZfSUTmAnMBune3KxON8UcdQgK5MS2eG9PiAaitU/bnlLD5aCGbj51m87HTLN39Rc9yl+hQBnaNZlDXaAYl38CQ62+hYwf3oHJpjhMOp7ZD9k7ncXAZ1DlnNREQAgl9nIHoxH7OmENSf4jq6pM37/FkEGQB3eo9T3Yvqy8TWK+q1cBhEdmHEwwb66+kqi8CL4LTNeSxio0x7UaAS+jbKYq+naKYfa3zBbG4opqdWcXsyCpiu/uxeFf2udf0iAtnSHIMQ7rFMLTbcAZcO5bQIPeU2jWVkLvXHQw7IGe3c53D569/8aYhUU73UmJfSOjnDol+EJHUrgPCk2MEgTiDxeNxAmAjMFtVd9ZbZzLOAPL9IhIPbAGGqmr+hbZrYwTGmMtRXFHNjqwith0vYtvxQrZlFp6bFiPAJaQlRjCgSzQDu0YxsGs0/TpHERFS7zty+WnI2QM5u9wP9+/lBV+sExrjBERCH+dq6YR059af0d3bzKR73jx9dCrwDE7//zxVfUpEfg5kqOpCERHgN8BkoBZ4SlVfv/AWLQiMMVcvp7iCbZlOMOw8UcT2rGLySisB54t9z7gO9O0cSXpSFOmdIunbKZLuseG4XO5v/apQluscNeS6gyF3H+TthTP1vscGhkFcb4jv7fyMS3P/TIWwmFbdZ7ugzBhjLiGnuILtWUXsyCpmx4ki9mWXcKzgDGc/IsOCAuiTFEGfpEjSO0WSlhRJelIkSVEhSP1uobJ8JxDy9rnDYR/kH3BOd9W6L9YLj4fYXu5Hzy9+79jTOZOphbuaLAiMMeYKnKmqYV92KXtPFbPnVAl7T5WwL7v03NEDQGRoIOlJZ4PBCYo+nSKds5bqq6mC00ecKbrzDziPgsPOozgL55pat5Ao6NjDCYWOKU5QdExxBq2v8I5wFgTGGNOCCsqq2Jddwr7ss+HgBERRefW5dWI7BNMnKYK0xEhSEzrQKyGCXgkd6BId9kUX01nVFc4RQ8FhKDjkBMbpw+6fR6HWHTyjH4Wbf3FFNXvrOgJjjPFJsR2Cua5XHNf1iju3TFXJLalkrzsU9meXsDe7hPe2ZJ2bbA8gNMhFz/gIUhM6kJoQQWqi83uv+N6EJaQ3frO6Oig56QRDB89M021BYIwxLUBESIwKJTEqlC+lJZxbrqrkllZyKLeMQ7llHMwt5VBuKZ9nFvHR9pPU6dnXQ9eYMFITIkiJC6dHXAd6uH92i+1ESHRXj9VuQWCMMR4kIiRGhpIYGdrgCAKcu70dyS/jYE4ZB3JKOZjrPDYdPU1pvaMIEegcFcoDN/Tk327q1eI1WhAYY4yXhAYFnLsorj5VpaCsiqMFZziaX8bR/DMcyz9DYpRnJs2zIDDGmDZGRIiLCCEuIoTh3Tt6/P3axiVvxhhjvMaCwBhj/JwFgTHG+DkLAmOM8XMWBMYY4+csCIwxxs9ZEBhjjJ+zIDDGGD/X7mYfFZFc4OgVvjweyGvBctoTf91322//Yvt9YT1UNaGphnYXBFdDRDIuNA2rr/PXfbf99i+231fGuoaMMcbPWRAYY4yf87cgeNHbBXiRv+677bd/sf2+An41RmCMMaYxfzsiMMYYcx4LAmOM8XN+EwQiMllE9orIARF53Nv1eIqIzBORHBHZUW9ZrIgsEZH97p+ev9NFKxORbiKyQkR2ichOEfmOe7lP77uIhIrIBhHZ5t7vn7mX9xSR9e6/9zdEJNjbtXqCiASIyBYR+af7uc/vt4gcEZHtIrJVRDLcy67q79wvgkBEAoA/AlOA/sA9ItLfu1V5zMvA5POWPQ4sU9U0YJn7ua+pAX6gqv2B64Bvuv+NfX3fK4FxqjoEGApMFpHrgF8Bv1PV3sBp4EEv1uhJ3wF213vuL/s9VlWH1rt24Kr+zv0iCIBRwAFVPaSqVcDrwHQv1+QRqroKKDhv8XTgb+7f/wbMaNWiWoGqnlTVze7fS3A+HLri4/uujlL30yD3Q4FxwNvu5T633wAikgzcArzkfi74wX5fwFX9nftLEHQFjtd7nule5i+SVPWk+/dTQJI3i/E0EUkBhgHr8YN9d3ePbAVygCXAQaBQVWvcq/jq3/szwL8Dde7ncfjHfiuwWEQ2ichc97Kr+ju3m9f7GVVVEfHZc4ZFJAJ4B/iuqhY7XxIdvrrvqloLDBWRGGAB0NfLJXmciNwK5KjqJhEZ4+16WtmNqpolIonAEhHZU7/xSv7O/eWIIAvoVu95snuZv8gWkc4A7p85Xq7HI0QkCCcE/q6q77oX+8W+A6hqIbACuB6IEZGzX/R88e/9BmCaiBzB6eodB/we399vVDXL/TMHJ/hHcZV/5/4SBBuBNPcZBcHA3cBCL9fUmhYC97t/vx9434u1eIS7f/gvwG5V/W29Jp/edxFJcB8JICJhwESc8ZEVwEz3aj6336r6hKomq2oKzv/n5ap6Lz6+3yLSQUQiz/4O3Azs4Cr/zv3mymIRmYrTpxgAzFPVp7xckkeIyHxgDM60tNnAT4H3gDeB7jhTeM9S1fMHlNs1EbkRWA1s54s+4//AGSfw2X0XkcE4g4MBOF/s3lTVn4tIL5xvyrHAFuA+Va30XqWe4+4a+r+qequv77d7/xa4nwYC/1DVp0Qkjqv4O/ebIDDGGNM0f+kaMsYYcwEWBMYY4+csCIwxxs9ZEBhjjJ+zIDDGGD9nQWBMKxKRMWdnyjSmrbAgMMYYP2dBYEwTROQ+9zz/W0XkT+6J3UpF5Hfuef+XiUiCe92hIrJORD4XkQVn54IXkd4istR9r4DNIpLq3nyEiLwtIntE5O9Sf0IkY7zAgsCY84hIP+Au4AZVHQrUAvcCHYAMVR0AfIJz1TbAK8BjqjoY58rms8v/DvzRfa+A0cDZ2SGHAd/FuTdGL5x5c4zxGpt91JjGxgMjgI3uL+thOJN41QFvuNd5DXhXRKKBGFX9xL38b8Bb7vlguqrqAgBVrQBwb2+Dqma6n28FUoBPPb9bxjTNgsCYxgT4m6o+0WChyJPnrXel87PUn/umFvt/aLzMuoaMaWwZMNM93/vZ+8H2wPn/cnZmy9nAp6paBJwWkS+5l88BPnHfJS1TRGa4txEiIuGtuhfGNJN9EzHmPKq6S0R+jHMXKBdQDXwTKANGudtycMYRwJn29wX3B/0h4AH38jnAn0Tk5+5tfKUVd8OYZrPZR41pJhEpVdUIb9dhTEuzriFjjPFzdkRgjDF+zo4IjDHGz1kQGGOMn7MgMMYYP2dBYIwxfs6CwBhj/Nz/By/oYq6GUF3OAAAAAElFTkSuQmCC\n","text/plain":[""]},"metadata":{"tags":[],"needs_background":"light"}}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"N1I3oubcIaiq","executionInfo":{"status":"ok","timestamp":1616537455237,"user_tz":300,"elapsed":6871,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"e00924b2-01be-454a-a67f-cb31b4efec04"},"source":["# Test on data not used for the training\n","results = model.evaluate(test_x, test_y)\n","\n","print('Final test set loss: {:4f}'.format(results[0]))\n","print('Final test set accuracy: {:4f}'.format(results[1]))"],"execution_count":null,"outputs":[{"output_type":"stream","text":["1/1 [==============================] - 0s 16ms/step - loss: 0.5509 - accuracy: 0.8667\n","Final test set loss: 0.550854\n","Final test set accuracy: 0.866667\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"U51vdkg7UQeR"},"source":["\n","You can contact me on Twitter | GitHub | LinkedIn"]}]}
--------------------------------------------------------------------------------
/deep-learning/DL - XOR NN Solution.ipynb:
--------------------------------------------------------------------------------
1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"DL - XOR NN Solution.ipynb","provenance":[],"collapsed_sections":[],"toc_visible":true,"authorship_tag":"ABX9TyMLSQQfn+xUzItcU/1Oia0U"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","metadata":{"id":"qJF-WuID6OJK"},"source":["# Neural Network that implements the XOR gate\n","### Solving XOR with a NN with a hidden layer\n","\n","Created by Andres Segura-Tinoco \n","Created on Mar 29, 2021"]},{"cell_type":"code","metadata":{"id":"LWjGn3X-6JkR"},"source":["# Importing Keras libraries\n","import numpy as np\n","from keras.models import Sequential\n","from keras.layers.core import Dense\n","from tensorflow.keras import initializers\n","from keras.optimizers import Adam\n","from keras.utils.vis_utils import plot_model\n","import matplotlib.pyplot as plt"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"ScXABjya_Wpm"},"source":["## 1. Create NN Model"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"E--4x5lsF89r","executionInfo":{"status":"ok","timestamp":1617023847908,"user_tz":300,"elapsed":2960,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"a349cf61-aeb1-406f-e246-0c12ccf1b64b"},"source":["# Layer weight initializers\n","initializer = initializers.RandomNormal(mean=0.0, stddev=0.5, seed=None)\n","values = initializer(shape=(2, 2))\n","values"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{"tags":[]},"execution_count":2}]},{"cell_type":"code","metadata":{"id":"PirxbEVG61Z9"},"source":["# Create model\n","model = Sequential(name=\"XOR_MLP\")\n","model.add(Dense(units=4, input_dim=2, use_bias=True, activation='relu', kernel_initializer=initializer, name='HL'))\n","model.add(Dense(units=1, use_bias=True, activation='sigmoid', kernel_initializer=initializer, name='Output'))\n","\n","# Adam optimizer with learning rate of 0.02\n","model.compile(optimizer=Adam(lr=0.02), loss='binary_crossentropy', metrics=['accuracy'])"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"hSGKDZLc8sOm","executionInfo":{"status":"ok","timestamp":1617023848331,"user_tz":300,"elapsed":3376,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"f637c3a9-1e66-4714-ba43-8c497d53c0ef"},"source":["model.summary()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Model: \"XOR_MLP\"\n","_________________________________________________________________\n","Layer (type) Output Shape Param # \n","=================================================================\n","HL (Dense) (None, 4) 12 \n","_________________________________________________________________\n","Output (Dense) (None, 1) 5 \n","=================================================================\n","Total params: 17\n","Trainable params: 17\n","Non-trainable params: 0\n","_________________________________________________________________\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":312},"id":"5i9nmdeF9N3h","executionInfo":{"status":"ok","timestamp":1617023848332,"user_tz":300,"elapsed":3372,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"898e708b-4680-4970-b27d-ae97d0df05f0"},"source":["plot_model(model, to_file='model_plot.png', show_shapes=True, show_layer_names=True)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"image/png":"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\n","text/plain":[""]},"metadata":{"tags":[]},"execution_count":5}]},{"cell_type":"markdown","metadata":{"id":"ZYIcX-1l_eNC"},"source":["## 2. Train model with Binary data"]},{"cell_type":"code","metadata":{"id":"6m0_JNaDCBdh"},"source":["# Define binary encoding\n","training_data = np.array([[0,0],[0,1],[1,0],[1,1]], \"float32\")\n","target_data = np.array([[0],[1],[1],[0]], \"float32\")"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"MYCsgbQHASgm","executionInfo":{"status":"ok","timestamp":1617023849064,"user_tz":300,"elapsed":4093,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"53a9ef53-bfd2-46d3-af2d-f6fe4159285d"},"source":["print(\"Fit model on training data\")\n","results = model.fit(training_data, target_data, epochs=100, verbose=False)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Fit model on training data\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"q-i8LDhaBSfL","executionInfo":{"status":"ok","timestamp":1617023849065,"user_tz":300,"elapsed":4090,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"c02ea6d5-60ff-4081-ec7f-a74382ee3500"},"source":["print(model.predict(training_data).round())"],"execution_count":null,"outputs":[{"output_type":"stream","text":["[[0.]\n"," [1.]\n"," [1.]\n"," [0.]]\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":295},"id":"oRYZ2U-VDrk0","executionInfo":{"status":"ok","timestamp":1617023849399,"user_tz":300,"elapsed":4419,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"687c0cf6-7bf7-4531-b2f0-8e941502771e"},"source":["# Summarize history for accuracy\n","plt.plot(results.history['accuracy'])\n","plt.title('Model Accuracy')\n","plt.ylabel('accuracy')\n","plt.xlabel('epoch')\n","plt.show()"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":[""]},"metadata":{"tags":[],"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"RrGJ7lSDCGsK"},"source":["## 3. Train model with Bipolar input data"]},{"cell_type":"code","metadata":{"id":"mrz-tcbmCPcB"},"source":["# Define bipolar encoding\n","training_data = np.array([[-1,-1],[-1,1],[1,-1],[1,1]], \"float32\")\n","target_data = np.array([[0],[1],[1],[0]], \"float32\")"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Ju4wi84iCP-L","executionInfo":{"status":"ok","timestamp":1617023849678,"user_tz":300,"elapsed":4690,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"19891cce-ed6c-489e-81c8-6723aace280c"},"source":["print(\"Fit model on training data\")\n","results = model.fit(training_data, target_data, epochs=10, verbose=False)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Fit model on training data\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Ry4CSKLUCPt5","executionInfo":{"status":"ok","timestamp":1617023849679,"user_tz":300,"elapsed":4688,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"8a4a6f2b-b8b1-48df-de37-42e1677cb863"},"source":["print(model.predict(training_data).round())"],"execution_count":null,"outputs":[{"output_type":"stream","text":["[[0.]\n"," [1.]\n"," [1.]\n"," [0.]]\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":295},"id":"_tBI4YrCD3mt","executionInfo":{"status":"ok","timestamp":1617023849679,"user_tz":300,"elapsed":4684,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"167699f8-ca85-45a7-ed0d-0b7083170af7"},"source":["# Summarize history for accuracy\n","plt.plot(results.history['accuracy'])\n","plt.title('Model Accuracy')\n","plt.ylabel('accuracy')\n","plt.xlabel('epoch')\n","plt.show()"],"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":[""]},"metadata":{"tags":[],"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"mh3kUIeDUVa3"},"source":["\n","You can contact me on Twitter | GitHub | LinkedIn"]}]}
--------------------------------------------------------------------------------
/docs/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | We as members, contributors, and leaders pledge to make participation in our
6 | community a harassment-free experience for everyone, regardless of age, body
7 | size, visible or invisible disability, ethnicity, sex characteristics, gender
8 | identity and expression, level of experience, education, socio-economic status,
9 | nationality, personal appearance, race, religion, or sexual identity
10 | and orientation.
11 |
12 | We pledge to act and interact in ways that contribute to an open, welcoming,
13 | diverse, inclusive, and healthy community.
14 |
15 | ## Our Standards
16 |
17 | Examples of behavior that contributes to a positive environment for our
18 | community include:
19 |
20 | * Demonstrating empathy and kindness toward other people
21 | * Being respectful of differing opinions, viewpoints, and experiences
22 | * Giving and gracefully accepting constructive feedback
23 | * Accepting responsibility and apologizing to those affected by our mistakes,
24 | and learning from the experience
25 | * Focusing on what is best not just for us as individuals, but for the
26 | overall community
27 |
28 | Examples of unacceptable behavior include:
29 |
30 | * The use of sexualized language or imagery, and sexual attention or
31 | advances of any kind
32 | * Trolling, insulting or derogatory comments, and personal or political attacks
33 | * Public or private harassment
34 | * Publishing others' private information, such as a physical or email
35 | address, without their explicit permission
36 | * Other conduct which could reasonably be considered inappropriate in a
37 | professional setting
38 |
39 | ## Enforcement Responsibilities
40 |
41 | Community leaders are responsible for clarifying and enforcing our standards of
42 | acceptable behavior and will take appropriate and fair corrective action in
43 | response to any behavior that they deem inappropriate, threatening, offensive,
44 | or harmful.
45 |
46 | Community leaders have the right and responsibility to remove, edit, or reject
47 | comments, commits, code, wiki edits, issues, and other contributions that are
48 | not aligned to this Code of Conduct, and will communicate reasons for moderation
49 | decisions when appropriate.
50 |
51 | ## Scope
52 |
53 | This Code of Conduct applies within all community spaces, and also applies when
54 | an individual is officially representing the community in public spaces.
55 | Examples of representing our community include using an official e-mail address,
56 | posting via an official social media account, or acting as an appointed
57 | representative at an online or offline event.
58 |
59 | ## Enforcement
60 |
61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
62 | reported to the community leaders responsible for enforcement.
63 |
64 | All complaints will be reviewed and investigated promptly and fairly.
65 |
66 | All community leaders are obligated to respect the privacy and security of the
67 | reporter of any incident.
68 |
69 | ## Enforcement Guidelines
70 |
71 | Community leaders will follow these Community Impact Guidelines in determining
72 | the consequences for any action they deem in violation of this Code of Conduct:
73 |
74 | ### 1. Correction
75 |
76 | **Community Impact**: Use of inappropriate language or other behavior deemed
77 | unprofessional or unwelcome in the community.
78 |
79 | **Consequence**: A private, written warning from community leaders, providing
80 | clarity around the nature of the violation and an explanation of why the
81 | behavior was inappropriate. A public apology may be requested.
82 |
83 | ### 2. Warning
84 |
85 | **Community Impact**: A violation through a single incident or series
86 | of actions.
87 |
88 | **Consequence**: A warning with consequences for continued behavior. No
89 | interaction with the people involved, including unsolicited interaction with
90 | those enforcing the Code of Conduct, for a specified period of time. This
91 | includes avoiding interactions in community spaces as well as external channels
92 | like social media. Violating these terms may lead to a temporary or
93 | permanent ban.
94 |
95 | ### 3. Temporary Ban
96 |
97 | **Community Impact**: A serious violation of community standards, including
98 | sustained inappropriate behavior.
99 |
100 | **Consequence**: A temporary ban from any sort of interaction or public
101 | communication with the community for a specified period of time. No public or
102 | private interaction with the people involved, including unsolicited interaction
103 | with those enforcing the Code of Conduct, is allowed during this period.
104 | Violating these terms may lead to a permanent ban.
105 |
106 | ### 4. Permanent Ban
107 |
108 | **Community Impact**: Demonstrating a pattern of violation of community
109 | standards, including sustained inappropriate behavior, harassment of an
110 | individual, or aggression toward or disparagement of classes of individuals.
111 |
112 | **Consequence**: A permanent ban from any sort of public interaction within
113 | the community.
114 |
115 | ## Attribution
116 |
117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118 | version 2.0, available at
119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
120 |
121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct
122 | enforcement ladder](https://github.com/mozilla/diversity).
123 |
124 | [homepage]: https://www.contributor-covenant.org
125 |
126 | For answers to common questions about this code of conduct, see the FAQ at
127 | https://www.contributor-covenant.org/faq. Translations are available at
128 | https://www.contributor-covenant.org/translations.
129 |
--------------------------------------------------------------------------------
/docs/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 | Welcome, and thank you for your interest in helping to improve and accelerate/ease the adoption of the Python Algorithms Course.
3 |
4 | There are many ways in which you can contribute, beyond writing code. The goal of this document is to provide a high-level overview of how you can get involved, and hopefully not feel intimidated.
5 |
6 | ## Asking Questions and Providing Feedback
7 | Have a question? Rather than emailing the author, open an issue.
8 |
9 | The community will be eager to assist you. Your well-worded question will serve as a resource to others searching for help.
10 |
11 | ## Reporting Issues and Ideas
12 | Have you identified an oversight or problem? Have a feature request? We want to hear about it! Here's how you can make reporting your issue as effective as possible.
13 |
14 | > **Note:** If you already know what you want to change, feel free to just fork/clone the repo, change it, and submit a pull request. No need to add overhead by creating an issue!
15 |
16 | ### Look For an Existing Issue
17 | Before you create a new issue, please do a search in [open issues](https://github.com/ansegura7/Algorithms/issues) to see if the issue or feature request has already been filed.
18 |
19 | If you cannot find an existing issue that describes your bug or feature, create a new issue using the guidelines below.
20 |
21 | ### Writing Good Bug Reports and Feature Requests
22 | File a single issue per problem and feature request. Do not enumerate multiple bugs or feature requests in the same issue.
23 |
24 | Below is some information you can provide. The more you can provide, the more likely someone will be successful at understanding and incorporating it. However be mindful of the cost/benefit for documenting vs simply implementing the change.
25 |
26 | Please include the following with each issue:
27 | - **Title** - Concise and clear to quickly identify the topic.
28 | - **Problem** - Summary of the issue/idea/feature.
29 | - **Possible Solution** - If a solution seems clear, share it as an option.
30 | - **Examples** - "What was expected" vs "What actually ocurred".
31 | - **Context** - External factors that restrict possible solutions. (stuff that can't be changed)
32 | > Example: Please upgrade the vehicle from 30mph to 60mph. Context: budget is $5000.
33 |
34 | # Thank You!
35 | Your contributions to the Python Algorithms Course, large or small, make great projects like this possible. Thank you for taking the time to contribute!
36 |
--------------------------------------------------------------------------------
/machine-learning/supervised-learning/ML - ROC Curve.ipynb:
--------------------------------------------------------------------------------
1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"ML - ROC Curve.ipynb","provenance":[],"collapsed_sections":[],"authorship_tag":"ABX9TyMks3MbMYGawx2mWhVMVQLX"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","metadata":{"id":"_GV4XfYNy_f4"},"source":["# ROC Curve\n","\n","Created by Andres Segura-Tinoco \n","Created on Apr 08, 2021"]},{"cell_type":"code","metadata":{"id":"3VJM-P6ptjal"},"source":["# Import libraries\n","from matplotlib import pyplot as mpl\n","from sklearn.metrics import confusion_matrix\n","from sklearn.metrics import roc_curve, roc_auc_score"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"eHBo-ok4s8uF","executionInfo":{"status":"ok","timestamp":1617906847084,"user_tz":300,"elapsed":768,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"395c5ef8-28e3-44a3-e9c7-a0791410d4e5"},"source":["y_real = [0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0]\n","print(len(y_real))"],"execution_count":null,"outputs":[{"output_type":"stream","text":["40\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"KZQzwZi0tH4H","executionInfo":{"status":"ok","timestamp":1617906847084,"user_tz":300,"elapsed":765,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"3a49ba70-9f7a-441c-a038-3faf92f8e28a"},"source":["y_pred = [0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0]\n","print(len(y_pred))"],"execution_count":null,"outputs":[{"output_type":"stream","text":["40\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"k8bZZysUtXG7","executionInfo":{"status":"ok","timestamp":1617906847085,"user_tz":300,"elapsed":763,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"2162e541-14aa-432a-ae84-03036d1af1b2"},"source":["matrix = confusion_matrix(y_real, y_pred)\n","matrix"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[14, 7],\n"," [ 7, 12]])"]},"metadata":{"tags":[]},"execution_count":4}]},{"cell_type":"code","metadata":{"id":"1KWGn_IeuTS0"},"source":["fpr, tpr, thresholds = roc_curve(y_real, y_pred)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"01XR73guuoG5","executionInfo":{"status":"ok","timestamp":1617906847086,"user_tz":300,"elapsed":758,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"5cbb502e-4ac3-48f4-e978-4da80fa0088e"},"source":["roc_auc_score(y_real, y_pred)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["0.6491228070175439"]},"metadata":{"tags":[]},"execution_count":6}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":296},"id":"znnFrtO9uzsC","executionInfo":{"status":"ok","timestamp":1617906847758,"user_tz":300,"elapsed":1428,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"973ba94a-4bc5-41d3-cba8-765333e6736e"},"source":["mpl.plot(fpr, tpr, marker='.')\n","mpl.xlabel('False Positive Rate')\n","mpl.ylabel('True Positive Rate')\n","mpl.legend()\n","mpl.show()"],"execution_count":null,"outputs":[{"output_type":"stream","text":["No handles with labels found to put in legend.\n"],"name":"stderr"},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":[""]},"metadata":{"tags":[],"needs_background":"light"}}]},{"cell_type":"markdown","metadata":{"id":"rdkGr59QzRJk"},"source":["\n","You can contact me on Twitter | GitHub | LinkedIn"]}]}
--------------------------------------------------------------------------------
/nlp/NLP - Text Normalization.ipynb:
--------------------------------------------------------------------------------
1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"NLP - Text Normalization.ipynb","provenance":[],"collapsed_sections":[],"toc_visible":true,"authorship_tag":"ABX9TyPjYQeQilkD4xwGHd8eQJD2"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","metadata":{"id":"Frd_wyWebdfF"},"source":["# NLP - Text Normalization\n","### With NLTK and spaCy\n","\n","Created by Andres Segura-Tinoco \n","Created on May 15, 2021"]},{"cell_type":"code","metadata":{"id":"KuEStjoNbQ5s"},"source":["# Import libraries\n","import spacy\n","from spacy.lang.en import English"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":35},"id":"tE9VQGYncOQM","executionInfo":{"status":"ok","timestamp":1621109534846,"user_tz":300,"elapsed":958,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"e40c9e4f-7eed-47c0-cd3b-ac9d0bf09e4b"},"source":["# Verify installed spacy version\n","spacy.__version__"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"},"text/plain":["'2.2.4'"]},"metadata":{"tags":[]},"execution_count":2}]},{"cell_type":"markdown","metadata":{"id":"Plh556jfeSR7"},"source":["## 1. Create NLP model"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":120},"id":"Avq9JTkLdbHH","executionInfo":{"status":"ok","timestamp":1621109534848,"user_tz":300,"elapsed":956,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"3e27ed86-84e7-4a93-9185-56a51ec36caf"},"source":["# Document composed of a paragraph from the book The Adventures of Sherlock Holmes, by Arthur Conan Doyle\n","book_en = \"\"\"\n"," To Sherlock Holmes she is always _the_ woman. I have seldom heard him\n"," mention her under any other name. In his eyes she eclipses and\n"," predominates the whole of her sex. It was not that he felt any emotion\n"," akin to love for Irene Adler. All emotions, and that one particularly,\n"," were abhorrent to his cold, precise but admirably balanced mind. He\n"," was, I take it, the most perfect reasoning and observing machine that\n"," the world has seen, but as a lover he would have placed himself in a\n"," false position. He never spoke of the softer passions, save with a gibe\n"," and a sneer. They were admirable things for the observer—excellent for\n"," drawing the veil from men’s motives and actions. But for the trained\n"," reasoner to admit such intrusions into his own delicate and finely\n"," adjusted temperament was to introduce a distracting factor which might\n"," throw a doubt upon all his mental results. Grit in a sensitive\n"," instrument, or a crack in one of his own high-power lenses, would not\n"," be more disturbing than a strong emotion in a nature such as his. And\n"," yet there was but one woman to him, and that woman was the late Irene\n"," Adler, of dubious and questionable memory.\n"," \"\"\"\n","\n","# Data quality\n","book_en = book_en.replace(\"\\n \", \"\").lower()\n","book_en"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"},"text/plain":["'to sherlock holmes she is always _the_ woman. i have seldom heard himmention her under any other name. in his eyes she eclipses andpredominates the whole of her sex. it was not that he felt any emotionakin to love for irene adler. all emotions, and that one particularly,were abhorrent to his cold, precise but admirably balanced mind. hewas, i take it, the most perfect reasoning and observing machine thatthe world has seen, but as a lover he would have placed himself in afalse position. he never spoke of the softer passions, save with a gibeand a sneer. they were admirable things for the observer—excellent fordrawing the veil from men’s motives and actions. but for the trainedreasoner to admit such intrusions into his own delicate and finelyadjusted temperament was to introduce a distracting factor which mightthrow a doubt upon all his mental results. grit in a sensitiveinstrument, or a crack in one of his own high-power lenses, would notbe more disturbing than a strong emotion in a nature such as his. andyet there was but one woman to him, and that woman was the late ireneadler, of dubious and questionable memory.'"]},"metadata":{"tags":[]},"execution_count":3}]},{"cell_type":"code","metadata":{"id":"A5_1t1cwcONO"},"source":["# Create NLP model for English language\n","nlp = spacy.load('en_core_web_sm')\n","doc_en = nlp(book_en)"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"DjkHGe9Tepf4"},"source":["## 2. Remove Stopwords"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"GOlCGSTNcOKQ","executionInfo":{"status":"ok","timestamp":1621109535840,"user_tz":300,"elapsed":1942,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"dd6e3241-a032-4302-eefc-a15cda813d70"},"source":["# Bag of words\n","doc_sw = []\n","doc_words = []\n","\n","for token in doc_en:\n"," word = str(token).replace(',', '').strip()\n","\n"," if not token.is_stop and len(word) > 2:\n"," if word not in doc_words:\n"," doc_words.append(word)\n"," else:\n"," if word not in doc_sw:\n"," doc_sw.append(word)\n","\n","print('Count of Stopwords:', len(doc_sw))\n","print('Count of words:', len(doc_words))"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Count of Stopwords: 54\n","Count of words: 80\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"eCQDOq1xhmTn"},"source":["## 3. Stemming\n","\n","Process in which terms are transformed to their root in order to reduce the size of the vocabulary. It is carried by applying word reduction rules.\n","\n","Two of the most common stemming algorithms are:\n","- Porter\n","- Snowball"]},{"cell_type":"code","metadata":{"id":"NFg-hmI6fX1s"},"source":["from nltk.stem.porter import *"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"K-JmLWH8hyoD"},"source":["### 3.1. Porter Stemmer"]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"nlj46XVtfXzY","executionInfo":{"status":"ok","timestamp":1621109536465,"user_tz":300,"elapsed":2561,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"0bc5e592-91d8-4e78-caba-62b53b13cc20"},"source":["stemmer = PorterStemmer()\n","\n","for word in doc_words:\n"," root_word = stemmer.stem(word)\n"," if word != root_word:\n"," print(word + ' --> ' + root_word)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["holmes --> holm\n","himmention --> himment\n","eyes --> eye\n","eclipses --> eclips\n","andpredominates --> andpredomin\n","irene --> iren\n","emotions --> emot\n","particularly --> particularli\n","abhorrent --> abhorr\n","precise --> precis\n","admirably --> admir\n","balanced --> balanc\n","hewas --> hewa\n","reasoning --> reason\n","observing --> observ\n","machine --> machin\n","thatthe --> thatth\n","placed --> place\n","afalse --> afals\n","position --> posit\n","passions --> passion\n","admirable --> admir\n","things --> thing\n","observer --> observ\n","excellent --> excel\n","fordrawing --> fordraw\n","motives --> motiv\n","actions --> action\n","trainedreasoner --> trainedreason\n","intrusions --> intrus\n","delicate --> delic\n","finelyadjusted --> finelyadjust\n","temperament --> tempera\n","introduce --> introduc\n","distracting --> distract\n","results --> result\n","sensitiveinstrument --> sensitiveinstru\n","lenses --> lens\n","notbe --> notb\n","disturbing --> disturb\n","emotion --> emot\n","nature --> natur\n","ireneadler --> ireneadl\n","dubious --> dubiou\n","questionable --> question\n","memory --> memori\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"DYOOHZbXh13i"},"source":["### 3.2. Snowball Stemmer"]},{"cell_type":"code","metadata":{"id":"OCyfXZYBh2Mq"},"source":["from nltk.stem.snowball import SnowballStemmer"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"f1PqTBmih9m6","executionInfo":{"status":"ok","timestamp":1621109536714,"user_tz":300,"elapsed":2803,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"b68b6870-1f15-47e5-a6c5-2ee8c4d7e15a"},"source":["stemmer = SnowballStemmer(language='english')\n","\n","for word in doc_words:\n"," root_word = stemmer.stem(word)\n"," if word != root_word:\n"," print(word + ' --> ' + root_word)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["holmes --> holm\n","himmention --> himment\n","eyes --> eye\n","eclipses --> eclips\n","andpredominates --> andpredomin\n","irene --> iren\n","emotions --> emot\n","particularly --> particular\n","abhorrent --> abhorr\n","precise --> precis\n","admirably --> admir\n","balanced --> balanc\n","hewas --> hewa\n","reasoning --> reason\n","observing --> observ\n","machine --> machin\n","thatthe --> thatth\n","placed --> place\n","afalse --> afals\n","position --> posit\n","passions --> passion\n","admirable --> admir\n","things --> thing\n","observer --> observ\n","excellent --> excel\n","fordrawing --> fordraw\n","motives --> motiv\n","actions --> action\n","trainedreasoner --> trainedreason\n","intrusions --> intrus\n","delicate --> delic\n","finelyadjusted --> finelyadjust\n","temperament --> tempera\n","introduce --> introduc\n","distracting --> distract\n","results --> result\n","sensitiveinstrument --> sensitiveinstru\n","lenses --> lens\n","notbe --> notb\n","disturbing --> disturb\n","emotion --> emot\n","nature --> natur\n","ireneadler --> ireneadl\n","questionable --> question\n","memory --> memori\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"hcco2M6ShtNn"},"source":["## 4. Lemmatization\n","\n","It performs a morphological analysis using reference dictionaries to create equivalence classes between words.\n","\n","For example, for the token “eclipses”, a Stmm rule would return the term “eclips“, while through Lmmt we would get the term “eclipse“."]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"LgpGSm2thto8","executionInfo":{"status":"ok","timestamp":1621109536715,"user_tz":300,"elapsed":2801,"user":{"displayName":"Andres Segura Tinoco","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiweZ_blXJ6DNDPTMRkqLGa414Wso2PBYrLKYCU=s64","userId":"03707731297563483663"}},"outputId":"0a8dc196-ebfd-43ca-cc7c-95e9fb1bfa31"},"source":["for token in doc_en:\n"," word = str(token).replace(',', '').strip()\n","\n"," if not token.is_stop and len(word) > 2:\n"," root_word = token.lemma_\n"," if word != root_word:\n"," print(word + ' --> ' + root_word)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["heard --> hear\n","eyes --> eye\n","eclipses --> eclipse\n","andpredominates --> andpredominate\n","felt --> feel\n","emotions --> emotion\n","observing --> observe\n","seen --> see\n","placed --> place\n","spoke --> speak\n","softer --> soft\n","passions --> passion\n","things --> thing\n","men --> man\n","motives --> motive\n","actions --> action\n","intrusions --> intrusion\n","results --> result\n","lenses --> lense\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"65UO4VrycKPM"},"source":["\n","You can contact me on Twitter | GitHub | LinkedIn"]}]}
--------------------------------------------------------------------------------