{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Simple OOP example with Linear Regression\n", "### Inspired by Dr. Tirthajyoti Sarkar, Fremont, CA 94536\n" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### A very simple class `MyLinearRegression`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In linear regression we try and compute optimal parameters/coefficients such that the model\n", "$$\n", "x_i^Tw+b\n", "$$\n", "best describes observed data. Here $x_i$ is a data vector and $b$ is the so-called intercept. Given now many data vectors $x_i$ these can be collected into a matrix $\\tilde X$ and to account for the intercept the machine learning community in order to compute both the weights $w$ and the intercept $b$ considers the following matrix\n", "$$\n", "X=\n", "\\begin{bmatrix}\n", "1&x_{11}&\\ldots&x_{1d}\\\\\n", "1&x_{21}&\\ldots&x_{2d}\\\\\n", "\\vdots&\\ldots&\\ldots&\\ldots\\\\\n", "1&x_{n1}&\\ldots&x_{nd}\\\\\n", "\\end{bmatrix}\n", "$$\n", "and we solve for the coefficient vector \n", "$\n", "\\beta=\n", "\\begin{bmatrix}\n", "b\\\\\n", "w\\\\\n", "\\end{bmatrix}$.\n", "Given a vector of data points $y$ we now solve the problem of minimizing\n", "$$\n", "\\Vert X\\beta-y\\Vert_{2}^2\n", "$$\n", "with the explicit solution given by\n", "$$\n", "\\beta^{*}=(X^TX)^{-1}X^Ty.\n", "$$\n", "The following class realizes the solution of this problem." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "class MyLinearRegression:\n", " \n", " def __init__(self, fit_intercept=True):\n", " self.coef_ = None\n", " self.intercept_ = None\n", " self._fit_intercept = fit_intercept" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Create an instance and check attributes" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "mlr = MyLinearRegression()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mlr._fit_intercept" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mlr.coef_==None" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mlr.intercept_ == None" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "<__main__.MyLinearRegression object at 0x7facc41484e0>\n" ] } ], "source": [ "print(mlr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Built-in description method\n", "We can add a special built-in method `__repr__` to create a short description string" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "class MyLinearRegression:\n", " \n", " def __init__(self, fit_intercept=True):\n", " self.coef_ = None\n", " self.intercept_ = None\n", " self._fit_intercept = fit_intercept\n", " \n", " def __repr__(self):\n", " return \"I am a Linear Regression model!\"" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "mlr = MyLinearRegression()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "I am a Linear Regression model!\n" ] } ], "source": [ "print(mlr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Adding the `fit` method\n", "Now, we can add the core fitting method called `fit`. This uses linear algebra routines from NumPy to solve a linear regression (single or multi-variate) problem." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "class MyLinearRegression:\n", " \n", " def __init__(self, fit_intercept=True):\n", " self.coef_ = None\n", " self.intercept_ = None\n", " self._fit_intercept = fit_intercept\n", " \n", " def __repr__(self):\n", " return \"I am a Linear Regression model!\"\n", " \n", " def fit(self, X, y):\n", " \"\"\"\n", " Fit model coefficients.\n", "\n", " Arguments:\n", " X: 1D or 2D numpy array \n", " y: 1D numpy array\n", " \"\"\"\n", " \n", " # check if X is 1D or 2D array\n", " if len(X.shape) == 1:\n", " X = X.reshape(-1,1)\n", " \n", " # add bias if fit_intercept is True\n", " if self._fit_intercept:\n", " X_biased = np.c_[np.ones(X.shape[0]), X]\n", " else:\n", " X_biased = X\n", " \n", " # closed form solution\n", " xTx = np.dot(X_biased.T, X_biased)\n", " inverse_xTx = np.linalg.inv(xTx)\n", " xTy = np.dot(X_biased.T, y)\n", " coef = np.dot(inverse_xTx, xTy)\n", " \n", " # set attributes\n", " if self._fit_intercept:\n", " self.intercept_ = coef[0]\n", " self.coef_ = coef[1:]\n", " else:\n", " self.intercept_ = 0\n", " self.coef_ = coef" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Generate some random data for test" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "X = 10*np.random.random(size=(20,2))\n", "y = 3.5*X.T[0]-1.2*X.T[1]+2*np.random.randn(20)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1,2,figsize=(10,3))\n", "\n", "ax[0].scatter(X.T[0],y)\n", "ax[0].set_title(\"Output vs. first feature\")\n", "ax[0].grid(True)\n", "ax[1].scatter(X.T[1],y)\n", "ax[1].set_title(\"Output vs. second feature\")\n", "ax[1].grid(True)\n", "\n", "fig.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Instantiate a new `MyLinearRegression` object and fit the data" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "mlr = MyLinearRegression()" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "We have not fitted the data yet. There is no regression coefficients\n", "Regression coefficients: None\n" ] } ], "source": [ "print(\"We have not fitted the data yet. There is no regression coefficients\")\n", "print(\"Regression coefficients:\", mlr.coef_)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "mlr.fit(X,y)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "We have fitted the data. We can print the regression coefficients now\n", "Regression coefficients: [ 3.42299229 -1.05863427]\n" ] } ], "source": [ "print(\"We have fitted the data. We can print the regression coefficients now\")\n", "print(\"Regression coefficients:\", mlr.coef_)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The intercept term is given by: 0.12126935155178842\n" ] } ], "source": [ "print(\"The intercept term is given by: \", mlr.intercept_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "### Comparison of ground truth and fitted values\n", "Woudn't it be nice to compare the ground truth with the predictions and see how closely they fit" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "coef_ = mlr.coef_\n", "y_pred = np.dot(X,coef_)+mlr.intercept_" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.scatter(y,y_pred,s=100,alpha=0.75,color='red',edgecolor='k')\n", "plt.plot(y,y,c='k',linestyle='dotted')\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Extension\n", "Add the plotting as a method to our class!" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "# TODO" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now create a data set of your choice and apply the fit and plot method of our class on it." ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "# TODO " ] } ], "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.9" }, "toc-showcode": false, "toc-showmarkdowntxt": false }, "nbformat": 4, "nbformat_minor": 4 }