Skip to content

Instantly share code, notes, and snippets.

@yhilpisch
Last active February 11, 2024 23:13
Show Gist options
  • Star 39 You must be signed in to star a gist
  • Fork 26 You must be signed in to fork a gist
  • Save yhilpisch/648565d3d5d70663b7dc418db1b81676 to your computer and use it in GitHub Desktop.
Save yhilpisch/648565d3d5d70663b7dc418db1b81676 to your computer and use it in GitHub Desktop.
Machine Learning for Finance | Dr. Yves J. Hilpisch | CQF Elective | London, 23. May 2017

Machine Learning for Finance

A CQF elective with Dr. Yves J. Hilpisch, The Python Quants GmbH

General resources:

Wifi

You can use the following wifi in this venue:

SSID Fitch Guest
PW   Ft1ch#2016#!

Abstract

This CQF elective is about machine learning and deep learning with Python applied to finance. It starts with techniques to retrieve financial data from open data sources and covers Python packages like NumPy, pandas, scikit-learn and TensorFlow. It provides the basis to further explore these recent developments in data science to improve traditional financial tasks such as the pricing of American options or the prediction of future stock market movements.

Among other, the elective covers:

  • Getting and working with financial time series data in Python
  • Using linear OLS regression to predict financial prices & returns
  • Using scikit-learn for machine learning with Python
  • Application to the pricing of American options by Monte Carlo simulation
  • Applying logistic regression to classification problems
  • Predicting stock market returns as a classification problem
  • Using TensorFlow for deep learning with Python
  • Using deep learning for predicting stock market returns

Overview slides under http://hilpisch.com/cqf_ml_elective.pdf

Python

Download and install Miniconda 3.6 from https://conda.io/miniconda.html

If you have either Miniconda or Anaconda installed there is not need to install anything new.

conda create -n elective python=3.6
(source) activate elective
conda install numpy pandas=0.19 scikit-learn matplotlib
conda install pandas-datareader pytables
conda install ipython jupyter
jupyter notebook

Installing TensorFlow: https://www.tensorflow.org/install/

Finance

Download the paper by Longstaff and Schwartz (2001) about the Least-Squares Monte Carlo algorithm to price American options from Paper about LSM algorithm

Basic Definitions

"You can think of deep learning, machine learning and artificial intelligence [AI] as a set of Russian dolls nested within each other, beginning with the smallest and working out. Deep learning is a subset of machine learning, which is a subset of AI. ... That is, all machine learning counts as AI, but not all AI counts as machine learning. For example, symbolic logic (rules engines, expert systems and knowledge graphs) as well as evolutionary algorithms and Baysian statistics could all be described as AI, and none of them are machine learning."

"Neural networks are a set of algorithms, modeled loosely after the human brain, that are designed to recognize patterns. They interpret sensory data through a kind of machine perception, labeling or clustering raw input. The patterns they recognize are numerical, contained in vectors, into which all real-world data, be it images, sound, text or time series, must be translated."

"Deep learning maps inputs to outputs. It finds correlations. It is known as a 'universal approximator', because it can learn to approximate the function f(x) = y between any input x and any output y, assuming they are related through correlation or causation at all. In the process of learning, a neural network finds the right f, or the correct manner of transforming x into y, whether that be f(x) = 3x + 12 or f(x) = 9x - 0.1."

"All classification tasks depend upon labeled datasets; that is, humans must transfer their knowledge to the dataset in order for a neural to learn the correlation between labels and data. This is known as supervised learning. ... Any labels that humans can generate, any outcomes you care about and which correlate to data, can be used to train a neural network."

Source: https://deeplearning4j.org

Machine Learning

Here some resources to get a first overview of basic machine learning concepts and logistic regression for classification:

Neural Networks

Here some resources to get a first overview of neural networks:

TensorFlow

Some resources to get started with Google's TensorFlow package for deep learning:

Data

Download a HDF5 database file, containing a single pandas DataFrame object with hitorical equites data, from http://hilpisch.com/equities.h5

Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"http://hilpisch.com/tpq_logo.png\" width=350px align=\"right\">"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Simple Neural Networks in Python"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"&copy; Dr. Yves J. Hilpisch\n",
"\n",
"The Python Quants GmbH"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"from pylab import plt\n",
"plt.style.use('seaborn')\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Neural Network for Regression"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Regression & Neural Networks](https://www.cs.cmu.edu/afs/cs.cmu.edu/academic/class/15381-s06/www/nn.pdf)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Linear OLS Regression"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"x = np.linspace(0, 10, 5)\n",
"y = 3 * x + 2.5 + np.random.standard_normal(len(x)) * 1.5"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x10c596b70>]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n8/PTGlCS9P8NjXdE3AncArzSv2ovcCQz75vmYJKkjc10u92B3xARvwF8HXg4M/dHxP1A0Av/MnBH\nZq4N2kenc7rbaOya0MiSVBszG90w9Mg7Mx+LiCvOuOorwAOZeSoiPgr8GfDhQftYXX11xDnX12rN\nsrIy8OfDjlO3NddtveCa62Iza261Zje8bZwnLI9n5qk3toErxxlKkjS+ceJ9IiLe2d++Djg16Jsl\nSZM3zqcK/hHw5xHxGvAi8IHJjiRJGmakeGfmt4H9/e2vAldPcSZJ0hC+SUeSCmS8JalAxluSCmS8\nJalAxluSCmS8JalAxluSCmS8JalAxluSCmS8JalAxluSCmS8JalAxluSCmS8JalAxluSCmS8JalA\nxluSCmS8JalAxluSCmS8JalAxluSCmS8JalAxluSCmS8JalAxluSCmS8JalAxluSCmS8JalAxluS\nCtQY5ZsiYh9wb2YuRMQ7gAeBLvACcFtmvj69ESVJZxt65B0RdwIPABf2rzoCHMrMa4AZ4KbpjSdJ\nWs8oR97fAt4HPNy/vBd4ur/9BHADcHzQDubmLqLR2DXujAC0WrObun+J6rbmuq0XXHNdTGPNQ+Od\nmY9FxBVnXDWTmd3+9hpwybB9rK6+Ot50fa3WLCsra5vaR2nqtua6rRdcc11sZs2Doj/OE5Znnt+e\nBV4eYx+SpE0YJ97PR8RCf/sg8MzkxpEkjWKkV5uc5UPA0Yg4H1gEHp3sSJKkYUaKd2Z+G9jf314C\nrp3iTJKkIXyTjiQVyHhLUoGM907TbtM49Ry021VPImmKjPdO0m4zd2CBuYPXMXdgwYBLO5jx3kEa\nuUhjeam3vbxEIxcrnkjStBjvHaQTe+jsnu9t756nE3sqnkjStIzzOm9tV80mqydO0sjFXribzaon\nkjQlxnunaTbp7L2q6ikkTZmnTSSpQMZbkgpkvCWpQMZbkgpkvCWpQMZbkgpkvCWpQMZbkgpkvCWp\nQMZbkgpkvCWpQMZbkgpkvCWpQMZbkgpkvCWpQMZbkgpkvCWpQMZbkgpkvCWpQMZbkgpkvCWpQGP/\n9fiI+Crw/f7Ff8vM909mJEnSMGPFOyIuBGYyc2Gy40iSRjHT7XbP+U4RsQ/4HPDv9H4A3J2ZX97o\n+zud091GY9fYQ0pSTc1seMOY8f45YD/wALAbeAKIzOys9/0rK2vn/iBnaLVmWVlZ28wuilO3Nddt\nveCa62Iza261ZjeM97jnvJeAb2ZmF1iKiJeAnwG+O+b+JEnnYNxXm9wK3AcQEW8FLgb+c1JDSZIG\nG/fI+7PAgxHxJaAL3LrRKRNJ0uSNFe/M/CHwOxOeRZI0ou3/Jp12G559tvdVkgRs93i328wdWID9\n+3tfDbgkAds83o1cpLG81NteXqKRixVPJEnbw7aOdyf20Nk939vePU8n9lQ8kSRtD2N/tsmWaDZZ\nPXGS1ve+w+qlb4Nms+qJJGlb2N7xhl6w374PavauLEkaZFufNpEkrc94S1KBjLckFch4S1KBjLck\nFch4S1KBxvpjDJKkannkLUkFMt6SVCDjLUkFMt6SVCDjLUkFMt6SVCDjLUkF2rYfCRsRbwE+A/w8\n8L/AH2TmN6udaroi4jzgGHAFcAFwT2Z+sdKhtkhEXAqcAq7PzG9UPc+0RcRHgPcC5wOfyczPVjzS\nVPX/bT9E79/2aeAPd/J/54jYB9ybmQsR8Q7gQaALvADclpmvb/YxtvOR968BF2bmLwF/CtxX8Txb\n4Wbgpcy8BrgR+HTF82yJ/v/Yfwn8T9WzbIWIWADeBVwNXAtcXulAW+NXgEZmvgv4GPDxiueZmoi4\nE3gAuLB/1RHgUP//6xngpkk8znaO9y8Dfw+QmV8GfrHacbbEF4DD/e0ZoFPhLFvpE8BfAP9R9SBb\n5ADwL8Bx4O+Ax6sdZ0ssAY3+b9QXA69VPM80fQt43xmX9wJP97efAN4ziQfZzvG+GPjvMy6fjoht\ne5pnEjKznZlrETELPAocqnqmaYuI3wdWMvNE1bNsoZ+idzDyW8AHgb+OiJlqR5q6Nr1TJt8AjgKf\nqnSaKcrMx3jzD6eZzHzjc0jWgEsm8TjbOd7fB2bPuPyWzNzxR6IRcTnwFPBwZj5S9Txb4Fbg+og4\nCfwC8LmI+OlqR5q6l4ATmfnDzEzgB0Cr4pmm7Y/prXme3vNYD0XEhUPus1OceX57Fnh5EjvdzvH+\nR3rnyYiI/fR+zdzRIuIy4Engrsw8VvU8WyEz352Z12bmAvA14Hcz88WKx5q2LwE3RsRMRLwV+HF6\nQd/JVvnRb9L/BZwH7KpunC31fP95DoCDwDOT2Ol2Pg1xnN4R2T/RO//7/orn2Qp3A3PA4Yh449z3\nwcysxRN5dZGZj0fEu4Gv0DuAui0zT1c81rR9EjgWEc/Qe4XN3Zn5SsUzbZUPAUcj4nxgkd4p0U3z\nI2ElqUDb+bSJJGkDxluSCmS8JalAxluSCmS8JalAxluSCmS8JalA/wcOlF1Ph4MhqwAAAABJRU5E\nrkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x103193e80>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(x, y, 'r.')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"reg = np.polyfit(x, y, deg=1)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 2.7211312 , 3.08083347])"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"reg"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x10c5a5c88>]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAW8AAAD3CAYAAADSftWOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8VOXd9/HPmZ1AUCwRdykKl9jFWiyiUk3FtbdLS/V2\nedy3VrEVEnYJAgImZIEbqLbFhVtavS0uzwtpLbZSUWtVHrQVXo0XKC3uGjBiQjIzmcx5/pi0N20N\ngWQmZ5bv+x/OzDgnv8uEL1fO/K7rOK7rIiIiucXndQEiIrLvFN4iIjlI4S0ikoMU3iIiOUjhLSKS\ngwK98UUaGpp61NIyYEARjY0t6SonJxTamAttvKAxF4qejLmkpNjp7LWcmHkHAn6vS+h1hTbmQhsv\naMyFIlNjzonwFhGRf6bwFhHJQQpvEZEcpPAWEclBCm8RkRyk8BYRyUEKbxGRTGluhpdfTv2ZZgpv\nEZFMaG5mwNmlMGpU6s80B7jCW0QkAwK2nsCWzanjLZsJ2Pq0nl/hLSKSAQkznMTQYanjocNImOFp\nPX+Xe5sYY/zAMsAALvADIAos73i8CRhnrU2mtTIRkRz2xrv9uX3g6xx5VBN1d7dBv35pPf/ezLzP\nB7DWngLMAOYBdcAMa+03AQe4MK1ViYjkqFgMFiwIMWZMEc//MczAYwamPbhhL8LbWvt/gZs6Hh4J\nfAqMANZ1PPcUcEbaKxMRyTGvvOJjzJgiamrClJS4rFjRwsKFmflae7UlrLU2YYz5b+C7wEXAmdba\nv2/z2gTst6f3DxhQ1OOdtUpKinv0/lxUaGMutPGCxpwvPvsMpk+Hu+9OPR43DubP99G/fxGQmTHv\n9X7e1tqrjTFTgJeBPru9VExqNt6pnu7fW1JSTENDU4/OkWsKbcyFNl7QmPPF00/7mTw5wvvv+xg2\nrJ3a2hgnnthOLAYNDT0b855Cv8vLJsaYK40x0zoetgBJ4P8ZY0o7njsXeL5blYmI5KiPP3a46aYI\nV1xRREODw8SJMZ55poUTT2zvla+/NzPvx4EHjDHPAUFgPFAPLDPGhDqOH81ciSIi2cN14ZFHAsyc\nGeHTTx1GjGhn4cIoxxzTuw13XYa3tXYX8J+f89Jp6S9HRCR7/fWvDhMnRnj++QB9+7rcdVeUa65p\nw+/BDYJ65R6WIiK5LJGAn/40yIIFYVpbHc44I8GCBVEOO6xHt+ftEYW3iMgebNzoY8KECK+/7mfg\nwCSLFkX5zncSOJ3eGrh3KLxFRD5HayvU1IS4++4Q7e0Ol1zSxuzZUQ44wOvKUhTeIiL/4oUX/JSX\nR/jrX30ccUSSmppWSkt7p4tkbym8RUQ6fPopzJ4d5he/COHzudx8c5zJk2P07et1Zf9O4S0iBc91\nYfXqAFOnhmlo8PGlL6Xa/772tezdb0/hLSIF7YMPHKZMCfOb3wQJh11mzIhx881xgkGvK9szhbeI\nFKRkEh58MMidd4ZpanI4+eQEtbVRjjrKu/a/faHwFpGCs2WLj7KyMC+/HKB/f5e6uiiXX96GL4du\nT6PwFpGCEY/D0qUh6upCxOMO553Xxl13xRg0KDdm27tTeItIQdiwwUdZWYT6ej+DBiWprIzyH/+R\n8LqsblN4i0hea26Gysowy5YFcV2Hq66KU1ERY7893oUg+ym8RSRvrV3rZ+LECO++6+Ooo5LU1bVy\n0knZtdimuxTeIpJ3tm93qKgI89hjQQIBlwkTYkyYECcS8bqy9FF4i0jecF149NEAFRVhPvnEx/HH\nt1NXF+VLX8rexTbdpfAWkbzw9tsOkyZF+P3vAxQVucyZE+XGG73Za7s3KLxFJKe1t8O99wa5664w\nLS0OpaUJqqujHHlk7rX/7QuFt4jkrL/8JdX+9+qrfg44IEl1dZSLLvJ+r+3eoPAWkZwTjcLChSGW\nLAmRSDiMHdvG3LkxBg7M79n27hTeIpJT/vhHP2VlEd56y8dhhyWprm5lzJj8aP/bFwpvEckJn30G\nc+aEefDBEI7jcuONcaZNi9Gvn9eVeUPhLSJZ79e/Tu21/eGHPo45JtX+d8IJ+df+ty8U3iKStT76\nyGH69DBPPhkkFHKZMiXGD38YJxTyujLvKbxFJOu4Ljz0UJBZs8Ls3OkwcmSCuroYw4YV9mx7dwpv\nEckqW7c6TJwY4YUXAvTr51JVFeXqq3Nrr+3eoPAWkazQ1gb33BOipiZENOpw9tkJqqqiHHJI4bT/\n7QuFt4h47s9/9jFhQoRNm/yUlCRZujTK+ecXxmKb7lJ4i4hnWlpgwYIwP/lJkGTS4fLL49xxR4wB\nA7yuLPvtMbyNMUHgfmAwEAbmAu8Aq4EtHf/ZPdbaRzJYo4jkoXXr/JSXR3j7bR+DByepqWnl1FML\nb7FNd3U1874C2GGtvdIYcwDwJ2AOUGetrc14dSKSdz75BGbNivA//xPE73e59dYYEyfGKSryurLc\n0lV4rwQe7Th2gAQwAjDGmAtJzb7HW2ubMleiiOQD14VHHoFbb+3L9u0+vvKVdhYujPLVr6r9rzsc\n1+36k1xjTDGwClhG6vLJ69baDcaY24EB1tqJe3p/ItHuBgJ5uqmuiHTpnXfglltg9WqIRGDOHJgw\nAQL61K0rnX5k2+X/OmPM4cATwN3W2oeMMftbaz/tePkJYElX52hsbNnbQj9XSUkxDQ2FNbkvtDEX\n2nihMMacTMIDDwSZOzfMrl0Op58O8+c3M2SIS2Oj19X1jp58n0tKijt9bY9t78aYQcDTwBRr7f0d\nT68xxozsOB4DbOhWVSKS16z1cf75RUybFiEYhP/6r1Z+9zsYMkR92+nQ1cx7OjAAqDDGVHQ8VwYs\nNMa0AR8CN2WwPhHJMbEYLF4cYtGiEG1tDhdemNpre9AgV33babTH8LbW3gbc9jkvnZKZckQkl61f\nn7qzjbV+Dj44SVVVK+eco/a/TNDHBSLSY83NMG9emPvvD+K6DtdeG2fGjBjFnV+ylR5SeItIj/z2\nt34mTYrw/vs+hg5tp7Y2xqhRmm1nmsJbRLqlocFhxowwTzwRJBh0KS+PMX58nHDY68oKg8JbRPZJ\narFNgDvuiNDY6DBiROrONsOHa7FNb1J4i8he+9vfUnttP/dcgKIil/nzo1x7bRt+rcHrdQpvEelS\nIgE/+1mQqsowrVGHMadFqV6Y4LDD1LPtFd2bQkT2aONGH+eeW8SsWRH6tjXyCy7nqfeO47D983t1\naLZTeIvI52pthblzQ5x1VhF//rOfS8d8QH37MC7nYYJvbiZg670usaApvEXk3/zhD35KS/uyeHGY\nQw91eeSRFhYvg/2HfgGAxNBhJMxwj6ssbLrmLSL/8OmnMGdOmJ//PITP5/KDH8SZMiVG374A/Whc\n8ywBW58K7n79vC63oCm8RQSAJ58MMG1amI8/9nHssam9to8//l/a//r1IzHiG94UKP9E4S1S4D74\nwGHq1DBPPRUkHHa5/fYYt9wSJxj0ujLZE4W3SIFKJmHFiiBz5oRpanI46aQEdXVRjjpK7X+5QOEt\nUoDefNOhrCzCSy8F6N/fpbY2yv/5P2341MKQMxTeIgUkHocf/zhEXV2IWMzh299uo7IyxkEHabad\naxTeIgXi1Vd9TJgQob7ez6BBSe66K8p55yW8Lku6SeEtkueam6GqKsyyZUGSSYcrr4wzc2aM/fbz\nujLpCYW3SB5buza11/Y77/gYMiRJXV0rJ5+svbbzgcJbJA/t2OEwc2aYlSuDBAIu48fHmDAhTp8+\nXlcm6aLwFskjrguPPRagoiLMjh0+vva11F7bX/6y9trONwpvkTzxzjsOkyZFWLs2tdf27NlRbryx\njYD+luclfVtFclx7O9x3X5D588O0tDiUliaoro5y5JFq/8tnCm+RHFZf76OsLMKGDX4GDHBZsKCV\niy9O4DheVyaZpvAWyUHRKCxaFGLx4hCJhMPYsW3ceWeMkhLNtguFwlskx7z0kp/y8jBbtvg59NAk\n1dWtnHGG2v8KjcJbJEd89hnMnRtm+fIQjuNyww1xpk+PaVvtAqXwFskBTz0VYOrUMB984OOYY1Lt\nfyecoPa/QqbwFsliH33kMH16mCefDBIKuUyZEuOHP4wTCnldmXhtj+FtjAkC9wODgTAwF/gLsBxw\ngU3AOGutpgAiaeS68PDDAe64I8LOnQ4jRyaoq4sxbJj+qklKV7v3XgHssNZ+EzgHWArUATM6nnOA\nCzNbokhh2brV4Xvf68P48X1ob4eqqiirVrUquOWfdHXZZCXwaMexAySAEcC6jueeAs4CnshIdSIF\nJJGAe+4JUV0dIhp1OPvsBJWVUQ49VO1/8u8c1+36B8MYUwysApYBNdbaQzqePx24zlp7xZ7en0i0\nu4GAPw3liuSnV1+FG26A116DAw+EJUvg4ovRYhvp9Cegyw8sjTGHk5pZ322tfcgYs2C3l4uBT7s6\nR2Njy94U2amSkmIaGpp6dI5cU2hjLrTxQmrM27Y1UV0d5ic/CdLe7nDZZW3MmhVlwADYvt3rCtOv\nUL/P3R1zSUlxp6919YHlIOBp4FZr7TMdT79mjCm11j4LnAv8vltViRS4Z56B66/vy7ZtPo48Mklt\nbSunnqrFNrJ3upp5TwcGABXGmIqO524DFhtjQkA9/3tNXET2QmMjzJoV4eGHwedzGDcuzqRJMYqK\nvK5Mcskew9taexupsP5Xp2WmHJH85bqwalWAadPCbN/u4/jjobq6ha9+VV0ksu+6ahUUkTR4/32H\nq67qw4039qG52aGiIsYrr6Dglm7TCkuRDEomYfnyIHPnhmludhg9OkFNTZQhQ1wCgbDX5UkOU3iL\nZMjmzT4mTIiwfr2f/fZzWbSolcsu017bkh4Kb5E0i8dh8eIQixaFiMcdLrigjXnzYgwapMU2kj4K\nb5E0Wr/eR3l5hDfe8HPwwUkqK6Oce27C67IkDym8RdKguRnmzw9z331BXNfhmmvizJgRo39/ryuT\nfKXwFumh3/7Wz+TJEd57z8fQoe3U1sYYNUqLbSSzFN4i3dTQ4FBREebxx4MEgy5lZTHGj48TiXhd\nmRQChbfIPnJd+OUvA8ycGaGx0WHEiNSdbYYPV8+29B6Ft8g+2LbNYeLECOvWBSgqcpk3L8p117Xh\n16aZ0ssU3iJ7IZGAZcuCVFWFaWlxGDMmwYIFUQ4/XO1/4g2Ft0gXNm3yUVYW4U9/8vOFLySprY0y\ndqwW24i3FN4inWhthbq6EEuXhmhvd7j44jbmzInxhS9oti3eU3iLfI4XX/RTVhZh61Yfhx+epLq6\nldNPV/ufZA+Ft8hudu6EOXPCrFgRwudz+f7340yZEqNfP68rE/lnCm+RDqtXp/ba/ugjH8OHt7Nw\nYZSvf13tf5KdFN5S2JqbaXjxLSY9eAK/fjpCOOwyfXqMcePiBINeFyfSOYW3FKzkZ808fvLdTPu4\nnJ1EOGlkjNpFbRx9tD6QlOynO+lIQXrzTYex34lwy8d34uLwU27iyTv+oOCWnKHwloLS1gaLFoX4\n1rf68uKmAXyn79PUM5zrhq4jOXy41+WJ7DVdNpGC8dprqTvb/OUvfg48MLXX9nmlXyFgf06jGY5a\nSiSXKLwl7+3aBZWVYZYtC5JMOlx5ZZyZM2Pstx9APxIjvuF1iSL7TOEteW3t2tRe22+/7WPIkCS1\nta2ccooW20juU3hLXtqxw2HmzDArVwbx+11uuy1GWVmcPn28rkwkPRTekldcFx5/PMCMGWF27PBx\n3HGpxTZf/rIW20h+UXhL3njnHYfJkyM880yAPn1cZs+OcuONbQT0Uy55SD/WkvPa2+H++4PMm5fa\na/u00xJUV0cZPFg925K/FN6S0+rrU3ttb9jgZ8AAl6qqVv7zP7XXtuS/vQpvY8yJQJW1ttQYczyw\nGtjS8fI91tpHMlWgyOeJxWDhwhBLloRoa3MYO7aNO++MUVKi2bYUhi7D2xgzGbgS2NXx1Aigzlpb\nm8nCRDrz0kt+ysvDbNni59BDkyxY0MqZZ6r9TwrL3sy83wLGAis6Ho8AjDHmQlKz7/HW2qYM1Sfy\nD01NcOedYZYvD+E4LjfcEGf6dO21LYXJcd2uf800xgwG/sdaO8oYcy3wurV2gzHmdmCAtXbint6f\nSLS7gYBury3dt2oV3HILvPceHHss3HsvnHSS11WJZFynn9505wPLJ6y1n/79GFjS1RsaG1u68WX+\nV0lJMQ0NhTW5L7Qxdzbejz5yuP32MKtWBQkGXSZPjvPDH8YJh6GhwYNC06jQvsegMXfnvZ3pzq6C\na4wxIzuOxwAbulOUyJ64Ljz0UIDRo/uyalWQb3yjnbVrW5g4MRXcIoWuOzPvm4Elxpg24EPgpvSW\nJIVu61aHSZMiPP98gL59XSoro1xzTRs+bWAs8g97Fd7W2r8BozqOXwVOyWBNUqASCbjnnhDV1SGi\nUYezzkpQVRXl0EPV/ifyr7RIR7LCq6/CNdcUsXGjn4EDkyxZEuWCC7TYRqQz+kVUPNXSArNnhxk5\nEjZu9HPZZW384Q+7uPBCBbfInmjmLZ557jk/5eURtm3zMWQIVFW1cNppWmwjsjc085Ze19gIt90W\n4aKLinjnHYdx4+Js3IiCW2QfaOYtvcZ1YdWqANOmhdm+3ceXv5zaa/u445IUFYXYtavrc4hIisJb\nesX77ztMmRJhzZoAkYhLRUWMH/wgTjDodWUiuUnhLRmVTMLy5UHmzg3T3OwwenSCmpooQ4ao/U+k\nJxTekjGbN/soKwvzyisB9tvPZdGiVi67TF0kIumg8Ja0i8dh8eIQixaFiMcdLrigjXnzYgwapNm2\nSLoovCWt1q/3UV4e4Y03/Bx0UJKqqijnnpvwuiyRvKPwlrRobob588Pcd18Q13W4+uo4FRUx+vf3\nujKR/KTwlh777W/9TJ4c4b33fBx9dDt1dTFGjVLPtkgmKbyl2xoaHCoqwjz+eJBAwKWsLMb48XEi\nEa8rE8l/Cm/ZZ64Lv/xlgJkzIzQ2OowY0U5tbZRjj016XZpIwVB4yz7Zts1h4sQI69YFKCpymTs3\nyvXXt+HXXe5EepXCW/ZKIgHLlgWpqgrT0uJw+ukJFiyIcsQRav8T8YLCW7q0aZOPsrIIf/qTnwMO\nSFJTE+V739NiGxEvKbylU62tUFcXYunSEO3tDhdd1MacOTEGDtRsW8RrCm/5XC++6KesLMLWrT4O\nPzxJdXUrp5+u9j+RbKHwln+ycyfMmRNmxYoQjuPy/e/HmTIlRr9+XlcmIrtTeMs/rF4dYOrUMB9/\n7GP48Hbq6qKMGKH2P5FspPAWPvzQYerUML/+dZBQyGXatBjjxsUJhbyuTEQ6o/AuYMkk/PznQWbP\nDtPU5DBqVILa2hhDh2q2LZLtFN4F6s03HcrLI/zxjwGKi12qq6NceWUbPt3VVCQnKLwLTFsb/PjH\nIWprQ8RiDuec00ZVVYyDD1b7n0guUXgXkNde8zF+fIT6ej8HHpjkrruinHeeFtuI5CKFdwHYtQsq\nK8MsWxYkmXS44oo4M2fG2H9/rysTke5SeOe5tWtTe22//baPL34xSW1tK6NHa7GNSK7bq/A2xpwI\nVFlrS40xRwPLARfYBIyz1qo9Icvs2OEwc2aYlSuD+P0uP/pRjPLyOH36eF2ZiKRDl70FxpjJwL3A\n37fYrwNmWGu/CTjAhZkrT/aV68JjjwUYPbqIlSuDHHdcO08/3cKMGQpukXyyNzPvt4CxwIqOxyOA\ndR3HTwFnAU/s6QQDBhQRCPRsw+eSkuIevT8X7euYt22Dm2+Gp56CPn2gpgZuu81PINA3QxWml77H\nhUFjTo8uw9ta+5gxZvBuTznW2r/3lTUB+3V1jsbGlu5V16GkpJiGhqYenSPX7MuY29vh/vuDzJuX\n2mv71FMT1NREGTzYpbExw4Wmib7HhUFj3vf3dqY7H1jufn27GPi0G+eQNKmvT+21vWGDn/33d6ms\nbOWSS9T+J5LvurOe7jVjTGnH8bnA8+krR/ZWLAaVlSHGjCliwwY/3/1uGy+8sItLL1VwixSC7sy8\ny4FlxpgQUA88mt6SpCsvveSnvDzMli1+DjkkyYIFrZx1ltr/RArJXoW3tfZvwKiO483AaRmsSTrR\n1AR33hlm+fLUXtvXXx/n9tu117ZIIdIinRzxm9/4mTIlwgcf+Bg2LLXX9siRaq8XKVTaQy7LffSR\nww03RLjqqiK2b3eYNCnGM8+0dB7czc0ENqyH5ubeLVREepVm3lnKdeGhhwLccUeEnTsdTjihnYUL\noxizh9l2czMDzi4lsGUziaHDaFzzLLqmIpKfNPPOQlu3OpxxBowf34dEAu66K8rq1S17Dm4gYOsJ\nbNmcOt6ymYCt741yRcQDCu8skkjAkiUhSkv7snYtnHlmghde2MX11+/dTRISZjiJocNSx0OHkTDD\nM1yxiHhFl02yxOuv+5gwIcLGjX4GDkyyfLnDt77Vum892/360bjmWQK2PhXcumQikrc08/ZYSwvM\nnh3m7LOL2LjRz6WXphbbXHIJ3Vts068fiRHfUHCL5DnNvD303HN+yssjbNvm44gjUnttn3aaFtuI\nSNcU3h5obIRZsyI8/HAQn8/lllviTJoUo29ubP4nIllA4d2LXBdWrQowbVqY7dt9fOlL7SxaFOW4\n47TYRkT2jcK7l7z/vsOUKRHWrAkQibjMmBHj5pvjBINeVyYiuUjhnWHJJCxfHmTu3DDNzQ6nnJKg\ntjbKkCFu128WEemEwjuDNm/2UVYW5pVXAvTv77JwYZTLL2/Tlq0i0mMK7wyIx2Hx4hCLFoWIxx3O\nP7+N+fNjDBqk2baIpIfCO83Wr/dRXh7hjTf8HHRQksrKKN/+dsLrskQkzyi806S5GebPD3PffUFc\n1+Hqq+NUVMTo39/rykQkHym80+B3v/MzeXKEd9/1cfTR7dTVxRg1SottRCRzFN49sH27w4wZYR5/\nPEgg4FJWFmP8+DiRiNeViUi+U3h3g+vCypUBZs4M88knPr7+9dSdbY49VottRKR3KLz30bZtDhMn\nRli3LkBRkcvcuVGuv74Nv9/rykSkkCi891J7O/zsZ0GqqsK0tDh861sJqqujHHGE2v9EpPcpvPfC\npk2p9r/XXvNzwAFJamqifO97CS22ERHPKLz3IBqFuroQS5eGSCQcLrqojTlzYgwcqNm2iHhL4d2J\nF19M7bX91ls+Dj88SXV1K6efrvY/EckOCu9/sXMnzJkTZsWKEI7j8v3vx5kyJaYb04hIVlF47+ZX\nvwowdWqYjz7yMXx4qv1vxAi1/4lI9lF4Ax9+6DBtWphf/SpIKOQybVqMcePihEJeVyYi8vkKOryT\nSfjFL4LMnh3ms88cRo1KUFsbY+hQzbZFJLt1O7yNMa8Cn3U8/Ku19tr0lNQ73nrLobw8wosvBigu\ndqmujnLllW34fF5XJiLStW6FtzEmAjjW2tL0lpN5bW1w990hampCxGIO55zTRlVVjIMPVvufiOQO\nx3X3PbSMMScCDwLbSP0DMN1a+1Jn/30i0e4GAt6vH1+/Hm64AV5/HQ46CJYuhbFj0WIbEclWnaZT\nd8P7K8Ao4F5gKPAUYKy1n3vXgYaGph5Na0tKimloaOr2+3ftgqqqMD/7WZBk0uGKK+LMnBlj//17\nUlVm9XTMuabQxgsac6HoyZhLSoo7De/uXvPeDLxprXWBzcaYHcDBwDvdPF/G/P73fiZNivD22z6+\n+MUktbWtjB6txTYiktu6+/HcdUAtgDHmEKA/8EG6ikqHTz6BW2+NcMklRbz3nsOPfhTj2Wd3KbhF\nJC90d+Z9H7DcGPMC4ALXdXbJpLe5LjzxRIAZM8Js3+7jq19tZ+HCKF/5itr/RCR/dCu8rbVx4PI0\n19Jj777rMHlyhN/9LkCfPi6zZkW56aY2AgXdzS4i+Sj7Y625Gbb+BQ48gs42GGlvhwceCDJ3bmqv\n7VNPTVBTE2XwYLX/iUh+yu7wbm5mwNmlsGUzA4YOo3HNs/8W4G+84WPChAgbNvjZf3+XyspWLrlE\ne22LSH7L6vWEAVtPYMvm1PGWzQRs/T9ei8WgqirEmDFFbNjg57vfbeOFF3Zx6aUKbhHJf1k9806Y\n4SSGDiOwZTOJocNImOEAvPyyn/LyMJs3+znkkCQLFrRy1lnqIhGRwpHV4U2/fjSueZaSj9+m8cAj\naHL7MXdKmAceSO21ff31caZPj1Fc7HWhIiK9K7vDG1LXuL94Imt+3sLkyRE++MDHsGGpvbZHjlT7\nn4gUpqwP748/drj1VvjlL4sIBl0mTYrxox/FCYe9rkxExDtZHd6NjVBaWsT27XDCCanZ9jHHaLYt\nIpLV4R0KwUkntXP22T4uuqhFe22LiHTI6vDu2xfuuy9KSUmQhgavqxERyR6ay4qI5CCFt4hIDlJ4\ni4jkIIW3iEgOUniLiOQghbeISA5SeIuI5CCFt4hIDnJcV3ebERHJNZp5i4jkIIW3iEgOUniLiOQg\nhbeISA5SeIuI5CCFt4hIDlJ4i4jkoKy9GYMxxgfcDRwHxIAbrLVveltVZhljgsD9wGAgDMy11q7y\ntKheYow5ENgAnGmtfcPrejLNGDMNuAAIAXdba+/zuKSM6vjZ/m9SP9vtwI35/H02xpwIVFlrS40x\nRwPLARfYBIyz1vb4fo7ZPPP+DhCx1p4ETAVqPa6nN1wB7LDWfhM4B1jqcT29ouMv9k+BVq9r6Q3G\nmFLgZOAU4DTgcE8L6h3fBgLW2pOBOcA8j+vJGGPMZOBeINLxVB0wo+PvtQNcmI6vk83hPRr4DYC1\n9iXgBG/L6RUrgYqOYwdIeFhLb6oBfgK873UhveRsYCPwBPAksNrbcnrFZiDQ8Rt1f6DN43oy6S1g\n7G6PRwDrOo6fAs5IxxfJ5vDuD+zc7XG7MSZrL/Okg7W22VrbZIwpBh4FZnhdU6YZY64BGqy1a7yu\npRcNJDUZuRj4AfALY4zjbUkZ10zqkskbwDJgsafVZJC19jH++R8nx1r7931ImoD90vF1sjm8PwOK\nd3vss9bm/UzUGHM48HtghbX2Ia/r6QXXAWcaY54FvgY8aIw5yNuSMm4HsMZaG7fWWiAKlHhcU6ZN\nIDXmYaStUjmjAAAA+UlEQVQ+x/pvY0yki/fki92vbxcDn6bjpNkc3n8gdZ0MY8woUr9m5jVjzCDg\naWCKtfZ+r+vpDdbaU621p1lrS4E/AVdZaz/0uKxMewE4xxjjGGMOAfqSCvR81sj//ib9CRAE/N6V\n06te6/icA+Bc4Pl0nDSbL0M8QWpG9iKp67/XelxPb5gODAAqjDF/v/Z9rrW2ID7IKxTW2tXGmFOB\nV0hNoMZZa9s9LivTFgL3G2OeJ9VhM91au8vjmnpLObDMGBMC6kldEu0xbQkrIpKDsvmyiYiIdELh\nLSKSgxTeIiI5SOEtIpKDFN4iIjlI4S0ikoMU3iIiOej/A/kKmywhA0nGAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10c5a5b00>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"yr = np.polyval(reg, x)\n",
"plt.plot(x, y, 'r.')\n",
"plt.plot(x, yr, 'b')"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.45682106736303585"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"((y - yr) ** 2).mean()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Network Training &mdash; Single Step"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"l0 = np.array((x, len(x) * [1])).T"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0. , 1. ],\n",
" [ 2.5, 1. ],\n",
" [ 5. , 1. ],\n",
" [ 7.5, 1. ],\n",
" [ 10. , 1. ]])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"l0"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"weights = np.array(((2., 2.)))"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 2., 7., 12., 17., 22.])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"l1 = np.dot(l0, weights)\n",
"l1"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 3.95853305, 8.72304609, 16.74829052, 23.33676317, 30.66581449])"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 1.95853305, 1.72304609, 4.74829052, 6.33676317, 8.66581449])"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"d = y - l1\n",
"d"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"28.920382115788744"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(d ** 2).mean() # MSE"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"alpha = 0.01 # learning rate"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 1.62232936, 0.23432447])"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"update = alpha * np.dot(d, l0)\n",
"update"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"weights += update # updating weights"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 3.62232936, 2.23432447])"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"weights"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"24.000605043780112"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"l1 = np.dot(l0, weights)\n",
"d = y - l1\n",
"(d ** 2).mean() # new MSE"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Network Training &mdash; Multi Step"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"weights = np.array(((2., 2.)))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"MSE after 0 iterations: 28.92\n",
"MSE after 5 iterations: 11.52\n",
"MSE after 10 iterations: 4.82\n",
"MSE after 15 iterations: 2.24\n",
"MSE after 20 iterations: 1.23\n",
"MSE after 25 iterations: 0.83\n"
]
}
],
"source": [
"for _ in range(26):\n",
" # layer 1\n",
" l1 = np.dot(l0, weights)\n",
"\n",
" # deltas of layer 1\n",
" d = y - l1\n",
" \n",
" # print MSE\n",
" if _ % 5 == 0:\n",
" print('MSE after %4d iterations: %6.2f' % (_, (d ** 2).mean()))\n",
"\n",
" # update weights based on deltas\n",
" weights += alpha * np.dot(d, l0)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x10c84aac8>]"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x109192978>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"yr = np.polyval(reg, x)\n",
"plt.plot(x, y, 'r.')\n",
"plt.plot(x, yr, 'b')\n",
"plt.plot(x, l1, 'm--')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Neural Network for Classification"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://iamtrask.github.io/2015/07/12/basic-python-network/"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Sigmoid Function"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://en.wikipedia.org/wiki/Sigmoid_function"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# sigmoid function\n",
"def sigmoid(x, deriv=False):\n",
" if deriv == True:\n",
" return sigmoid(x) * (1 - sigmoid(x))\n",
" return 1 / (1 + np.exp(-x))"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"x = np.linspace(-10, 10)\n",
"y = sigmoid(x)\n",
"d = sigmoid(x, deriv=True)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10c5ed2e8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(2, sharex=True, figsize=(10, 8))\n",
"ax[0].plot(x, y, 'b')\n",
"ax[1].plot(x, d, 'g');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### The Data"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# input dataset (features)\n",
"# layer 0\n",
"l0 = np.array([[0, 0, 1],\n",
" [0, 1, 1],\n",
" [1, 0, 1],\n",
" [1, 1, 1] ])"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# output dataset (labels) \n",
"y = np.array([[0,\n",
" 0,\n",
" 1,\n",
" 1]]).T"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Single Step"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-0.16595599],\n",
" [ 0.44064899],\n",
" [-0.99977125]])"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# initialize weights randomly with mean 0\n",
"np.random.seed(1)\n",
"weights = 2 * np.random.random((3, 1)) - 1\n",
"weights"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-0.99977125],\n",
" [-0.55912226],\n",
" [-1.16572724],\n",
" [-0.72507825]])"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.dot(l0, weights)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.2689864 ],\n",
" [ 0.36375058],\n",
" [ 0.23762817],\n",
" [ 0.3262757 ]])"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"l1 = sigmoid(np.dot(l0, weights))\n",
"l1"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-0.2689864 ],\n",
" [-0.36375058],\n",
" [ 0.76237183],\n",
" [ 0.6737243 ]])"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"e = y - l1\n",
"e"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.30994584990928159"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(e ** 2).mean()"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.24553187],\n",
" [ 0.24190935],\n",
" [ 0.24650375],\n",
" [ 0.24346281]])"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sigmoid(l1, True)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-0.06604473],\n",
" [-0.08799467],\n",
" [ 0.18792752],\n",
" [ 0.16402681]])"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"d = e * sigmoid(l1, True)\n",
"d"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.35195432],\n",
" [ 0.07603214],\n",
" [ 0.19791493]])"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"u = np.dot(l0.T, d)\n",
"u"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.18599833],\n",
" [ 0.51668113],\n",
" [-0.80185633]])"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"weights += u\n",
"weights"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.24425422705654065"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"l1 = sigmoid(np.dot(l0, weights))\n",
"e = y - l1\n",
"(e ** 2).mean()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Multiple Steps"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-0.16595599],\n",
" [ 0.44064899],\n",
" [-0.99977125]])"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# initialize weights randomly with mean 0\n",
"np.random.seed(1)\n",
"weights = 2 * np.random.random((3, 1)) - 1\n",
"weights"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"after 0 iterations\n",
"layer 1: [[ 0.2689864 0.36375058 0.23762817 0.3262757 ]]\n",
"errors: [[-0.2689864 -0.36375058 0.76237183 0.6737243 ]]\n",
"MSE: 0.309945849909\n",
"\n",
"after 200 iterations\n",
"layer 1: [[ 0.03581881 0.02486184 0.97910131 0.96983694]]\n",
"errors: [[-0.03581881 -0.02486184 0.02089869 0.03016306]]\n",
"MSE: 0.000811915861218\n",
"\n",
"after 400 iterations\n",
"layer 1: [[ 0.01812805 0.01228468 0.98963848 0.98469571]]\n",
"errors: [[-0.01812805 -0.01228468 0.01036152 0.01530429]]\n",
"MSE: 0.000205280470873\n",
"\n",
"after 600 iterations\n",
"layer 1: [[ 0.01210241 0.00814395 0.99312159 0.98977191]]\n",
"errors: [[-0.01210241 -0.00814395 0.00687841 0.01022809]]\n",
"MSE: 9.11796267574e-05\n",
"\n",
"after 800 iterations\n",
"layer 1: [[ 0.00907573 0.00608783 0.99485433 0.99232527]]\n",
"errors: [[-0.00907573 -0.00608783 0.00514567 0.00767473]]\n",
"MSE: 5.1202496537e-05\n",
"\n",
"after 1000 iterations\n",
"layer 1: [[ 0.00725744 0.00485959 0.99589051 0.9938605 ]]\n",
"errors: [[-0.00725744 -0.00485959 0.00410949 0.0061395 ]]\n",
"MSE: 3.27168767611e-05\n"
]
}
],
"source": [
"for _ in range(1001):\n",
" # forward propagation\n",
" # layer 1\n",
" l1 = sigmoid(np.dot(l0, weights))\n",
"\n",
" # errors of layer 1\n",
" e = y - l1\n",
" if _ % 200 == 0:\n",
" print('\\nafter %d iterations' % _)\n",
" print('layer 1:', l1.T)\n",
" print('errors: ', e.T)\n",
" print('MSE: ', (e ** 2).mean())\n",
"\n",
" # multiply errors by the slope of the \n",
" # sigmoid at the values in l1\n",
" d = e * sigmoid(l1, True)\n",
"\n",
" # update weights\n",
" weights += np.dot(l0.T, d)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"http://hilpisch.com/tpq_logo.png\" width=350px align=\"right\">"
]
}
],
"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.6.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@stef296
Copy link

stef296 commented Aug 3, 2017

Hi Yves, thanks for the great session. There is a small bug in the paths() function. I think it should be something like this:

def paths2(S0=S0,r=r,sigma=sigma,dt=dt):
    rn = rng()
    rn[0] = 0.0
    S = np.zeros_like(rn)
    S[0] = S0
    S[1:] = S0 * np.exp(((r - 0.5 * sigma ** 2) * dt +
            sigma * dt ** 0.5 * rn[1:]).cumsum(axis=0))
    return S; 

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment