Skip to content

Instantly share code, notes, and snippets.

@alessiot
Last active September 30, 2019 16:38
Show Gist options
  • Save alessiot/953caa6777516a094028cf86630df6b1 to your computer and use it in GitHub Desktop.
Save alessiot/953caa6777516a094028cf86630df6b1 to your computer and use it in GitHub Desktop.
Learning XOR with a Multilayer Perceptron Network
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Learning XOR with a Multilayer Perceptron Network\n",
"\n",
"In sklearn, a neural network model can be created with the typical steps of any of the other available [supervised machine learning techniques](https://scikit-learn.org/stable/supervised_learning.html). The exclusice-or problem (XOR) is one of the benchmark case studies to evaluate neural network algorithms. The table below shows the simplest case of XOR truth based on two input values. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>F1</th>\n",
" <th>F2</th>\n",
" <th>Target</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" F1 F2 Target\n",
"0 0 0 0\n",
"1 0 1 1\n",
"2 1 0 1\n",
"3 1 1 0"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"import VisualizeNN as VisNN\n",
"\n",
"data = {'F1':[0,0,1,1], 'F2':[0,1,0,1], \"Target\":[0,1,1,0]} #XOR\n",
"df = pd.DataFrame(data) \n",
"\n",
"X_xor = df[[\"F1\",\"F2\"]]\n",
"y_xor = df[\"Target\"].values.tolist()\n",
"\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We want to build a classification model that learns from this data table what the XOR of two values is."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.neural_network import MLPClassifier\n",
"clf = MLPClassifier(activation='relu', max_iter=10000, hidden_layer_sizes=(4,2), alpha = 0.1, nesterovs_momentum = False, random_state=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Once the model is instantiated, we can fit it and retrieve its parameters (weights) to predict outcomes of XOR operations on future values."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 531 ms, sys: 2.82 ms, total: 534 ms\n",
"Wall time: 533 ms\n"
]
},
{
"data": {
"text/plain": [
"MLPClassifier(activation='relu', alpha=0.1, batch_size='auto', beta_1=0.9,\n",
" beta_2=0.999, early_stopping=False, epsilon=1e-08,\n",
" hidden_layer_sizes=(4, 2), learning_rate='constant',\n",
" learning_rate_init=0.001, max_iter=10000, momentum=0.9,\n",
" n_iter_no_change=10, nesterovs_momentum=False, power_t=0.5,\n",
" random_state=1, shuffle=True, solver='adam', tol=0.0001,\n",
" validation_fraction=0.1, verbose=False, warm_start=False)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%time clf.fit(X_xor, y_xor) "
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"y_xor_hat = clf.predict(X_xor)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" 0 1.00 1.00 1.00 2\n",
" 1 1.00 1.00 1.00 2\n",
"\n",
" micro avg 1.00 1.00 1.00 4\n",
" macro avg 1.00 1.00 1.00 4\n",
"weighted avg 1.00 1.00 1.00 4\n",
"\n",
"[[2 0]\n",
" [0 2]]\n"
]
}
],
"source": [
"from sklearn.metrics import classification_report, confusion_matrix\n",
"print(classification_report(y_xor, y_xor_hat))\n",
"print(confusion_matrix(y_xor, y_xor_hat))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[array([[ 1.18332144e-27, 1.05608585e+00, -6.50163054e-02,\n",
" -1.08957792e+00],\n",
" [-6.79035606e-03, -1.05599939e+00, -2.32002603e-03,\n",
" 1.08884321e+00]]), array([[-1.24903181e-03, 1.16000481e-02],\n",
" [-1.56385795e+00, 9.88670373e-01],\n",
" [ 2.32563059e-28, -1.95235261e-34],\n",
" [-1.51685150e+00, 8.37604911e-01]]), array([[-1.94749722],\n",
" [ 0.83545489]])]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"clf.coefs_"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x648 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"network=VisNN.DrawNN([2,4,2,1], clf.coefs_) # only abs(weight)>0.5 are shown\n",
"network.draw()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As it can be seen from the figure above, the intermediate nodes 1 and 3 pass little information coming from the input layer to the subsequent hidden layer."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment