Newer
Older
abgabensammlungSS15 / is / UB3 / ExerciseSheet3Fiete.ipynb
@MaxXximus92 MaxXximus92 on 11 May 2015 41 KB ea mr Ue3
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "preamble": true
   },
   "source": [
    "(Defining latex commands: not to be shown...)\n",
    "$$\n",
    "\\newcommand{\\norm}[1]{\\left \\| #1 \\right \\|}\n",
    "\\DeclareMathOperator{\\minimize}{minimize}\n",
    "\\newcommand{\\real}{\\mathbb{R}}\n",
    "\\newcommand{\\normal}{\\mathcal{N}}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#  Gaussian Algebra (25 Points)\n",
    "\n",
    "Prove that the product of two univariate (scalar) Gaussian distributions is a Gaussian again, i.e. show, by explicitly performing the required arithmetic transformations, that\n",
    "\n",
    "\\begin{equation}\n",
    "   \\normal(x;\\mu,\\sigma^2)\\normal(x;m,s^2) = \\normal[x; (\\frac 1{\\sigma^2}+\\frac 1{s^2})^{-1}(\\frac \\mu{\\sigma^2}+\\frac m{s^2}),(\\frac 1{\\sigma^2}+\\frac 1{s^2})^{-1}]\\normal[m,\\mu,\\sigma^2+s^2].\n",
    "\\end{equation}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#  Maximum Likelihood Estimator of Simple Linear Regression (25 Points)\n",
    "\n",
    "Derive the formula $\\mathbf{w}_{MLE} = (X^TX)^{-1}X^T\\mathbf{y}$ from the lecture, by calculating the derivative of $p(\\mathbf{y}\\,|X,\\mathbf{w}) = \\normal(\\mathbf{y}\\,|X\\mathbf{w}, \\sigma^2I)$ with respect to $\\mathbf{w}$, setting it to zero and solving it for $\\mathbf{w}$.\n",
    "\n",
    "\n",
    "Note: _To refresh your linear algebra you might find it useful to have a look in [here](http://webdav.tuebingen.mpg.de/lectures/ei-SS2015/pdfs/Murray_cribsheet.pdf)._"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#  Linear regression (50 Points)\n",
    "\n",
    "In this exercise you will perform a regression analysis on a toy dataset. You will implement ridge regression and learn how to find a good model through a comparative performance analysis.\n",
    "\n",
    "1) Download the [training set](http://webdav.tuebingen.mpg.de/lectures/ei-SS2015/data/ex1_train.csv)! <br>\n",
    "2) Implement $\\mathbf{w}_{RIDGE}$ as a function of a given $X, \\mathbf{y}$ array and a regularization parameter $\\lambda$!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      ":0: FutureWarning: IPython widgets are experimental and may change in the future.\n"
     ]
    }
   ],
   "source": [
    "# Loading the required packages\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from IPython.html.widgets import interact"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1 2 3]\n",
      "[1, 1, 1]\n",
      "3\n"
     ]
    }
   ],
   "source": [
    "testx = np.array([1, 2, 3]);\n",
    "testy = [1, 1, 1];\n",
    "\n",
    "print(testx);\n",
    "print(testy);\n",
    "\n",
    "foo = testx.T * testy;\n",
    "\n",
    "print(len(foo));"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "def wRidge(X,y,lamb):\n",
    "    # Change the following line and implement the ridge regression estimator wRidge\n",
    "    # w = np.zeros(X.shape[-1])\n",
    "    a = np.linalg.inv(lamb + np.dot(X.T, X));\n",
    "    # print('a');\n",
    "    # print(a);\n",
    "    b = X.T;\n",
    "    # print('b');\n",
    "    # print(b);\n",
    "    c = y;\n",
    "    # print('y');\n",
    "    # print(y);\n",
    "    ab = np.dot(a, b);\n",
    "    abc = np.dot(ab, c);\n",
    "    # print('abc');\n",
    "    # print(abc);\n",
    "    w = abc;\n",
    "    return w;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3) Load \"ex1_train.csv\" into a numpy array! The first column in the csv file is $X$ and the second column is $\\mathbf{y}$, assign them to each variable!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-3.  -2.5 -1.  -0.5  0.   1.   2.   2.5  3.   4. ]\n",
      "[  4.87103994  -1.03777715  -6.73176788  -4.08540431   0.           8.73176788\n",
      "  13.27437941  13.53777715  13.12896006  13.94558004]\n",
      "(-3.0, 4.0, -6.731767878463172, 13.945580037536574)\n"
     ]
    }
   ],
   "source": [
    "# Read ex1_train.csv and assign the first column and \n",
    "# second column to variables x and y respectively.\n",
    "from numpy import genfromtxt\n",
    "data = genfromtxt('ex1_train.csv', delimiter=' ');\n",
    "X = data[:, 0];\n",
    "y = data[:, 1];\n",
    "\n",
    "print(X);\n",
    "print(y);\n",
    "\n",
    "print(min(X), max(X), min(y), max(y));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4) Plot the training data with appropriate labels on each axes!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": [
       "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\n"
      ],
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1050d4790>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the input data here\n",
    "def plotData(X, y):\n",
    "    plt.plot(X, y, 'bo')\n",
    "    plt.axis([min(X) - 1, max(X) + 1, min(y) - 1, max(y) + 1])\n",
    "    \n",
    "    \n",
    "plotData(X, y) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "5) Implement a function which constructs features upto a input polynomial degree $d$!<br>\n",
    "Note: _Constructing higher polynomial features is similar to what you implemented in Exercise 3 (SVM) of the previous exercise sheet._"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def construct_poly(x,d):\n",
    "    ## Implement a method which given an array of size N, \n",
    "    ## returns an array of dimension (N,d)\n",
    "    res = np.zeros((len(x), d));\n",
    "    for i in range(len(x)) :\n",
    "        xi = x[i];\n",
    "        for j in range(d) :\n",
    "            res[i][j] = np.power(xi, j);\n",
    "  \n",
    "    return res;\n",
    "\n",
    "# testX = [1, 2, 3, 4, 5, 6];\n",
    "# testY = [1, 1, 1, 1, 1, 1];\n",
    "# foo = construct_poly(testX, testY);\n",
    "# print(foo[1,:]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "6) Implement the Mean Squared Error Loss (MSE) as a function of the predicted and true values of the target variable! <br>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def MSE(y_predict,y_true):\n",
    "    ## Implement mean squared error for a given input y and its predictions.\n",
    "    error = sum(np.power((y_predict - y_true), 2)) / float(len(y_predict));\n",
    "    return error;\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "7) By comparing the MSE find the degree $d$ for the polynomial that fits the training data best! You might find it useful to use the code below to interactively change the variable $d$, set $\\lambda = 1$ and keep it fixed. Plot the error as a function of different values of $d$!<br>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('Best d: ', 6)\n",
      "('Best theta: ', array([ -1.48019799e+00,   6.47756826e+00,   1.20573199e+00,\n",
      "        -6.46681792e-01,   1.20936028e-03,   1.08880545e-02]))\n",
      "('mse errors for each d: ', [88.938436293253972, 58.242200994141662, 24.151575218954584, 17.772988325257703, 2.6042621684559881, 1.9740426997964349, 1.6839081464600774, 1.762196096936659, 1.8951684291047843, 1.8996652873425053])\n"
     ]
    },
    {
     "data": {
      "image/png": [
       "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\n",
       "AAAAAElFTkSuQmCC\n"
      ],
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10520d050>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "bestTheta = 1;\n",
    "bestMSE = 9999999999;\n",
    "bestD = 0;\n",
    "alpha = 1.0;\n",
    "\n",
    "dMax = 10;\n",
    "mseErrors = [];\n",
    "\n",
    "for d in range(dMax) :\n",
    "    newPoly = construct_poly(X, d);\n",
    "    newTheta = wRidge(newPoly, y, alpha);\n",
    "    newMSE = MSE(newPoly.dot(newTheta), y);\n",
    "    mseErrors.append(newMSE);\n",
    "    if newMSE < bestMSE :\n",
    "        bestMSE = newMSE;\n",
    "        bestTheta = newTheta;\n",
    "        bestD = d;\n",
    "        \n",
    "print('Best d: ', bestD);\n",
    "print('Best theta: ', bestTheta);\n",
    "print('mse errors for each d: ', mseErrors);\n",
    "plotData(range(dMax), mseErrors);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": [
       "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\n",
       "zKwN/T9xkbdVhKP+GwAAAABJRU5ErkJggg==\n"
      ],
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1053ff350>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = X;\n",
    "\n",
    "##This function provides an interactive mode to change polynomial degree. \n",
    "@interact(n=[1,16])\n",
    "def plot(n):\n",
    "    X = construct_poly(x,n)\n",
    "    w = wRidge(X,y,alpha)\n",
    "    plt.plot(x,X.dot(w))\n",
    "    plt.title(\"MSE %f\" % MSE(X.dot(w),y))\n",
    "    plt.plot(x,y)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "8) Apply models with different values of $d$ after being trained on the training dataset, to the test data available [here](http://webdav.tuebingen.mpg.de/lectures/ei-SS2015/data/ex1_train.csv). Compare the errors on the test data to the ones from the training by plotting the error curves as functions of the polynomial degree in a single plot! What do you conclude? <br>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "## Read test data here"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "9) With a fixed optimal $d$, change the value of $\\lambda$ to one of the following values $[0.1, 1.0, 10.0]$ and find the minimum MSE!<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Hand in printed copy of completed notebook."
   ]
  }
 ],
 "metadata": {
  "annotations": {
   "author": "",
   "categories": [
    "intelligent-systems-1-2015"
   ],
   "date": "2015-04-30",
   "location": "Beginning of next lecture",
   "parent": "IS_SS2015",
   "submission_date": "2015-05-07",
   "subtitle": "Exercise Sheet 3, Linear Regression",
   "tags": [
    "IntelligenSystems",
    "Course"
   ],
   "title": "Intelligent Systems 1 - Summer Semester 2015"
  },
  "celltoolbar": "Edit Metadata",
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}