{ "cells": [ { "cell_type": "markdown", "id": "eb335a6d", "metadata": {}, "source": [ "# Linear regression\n", "\n", "The linear regression is a training procedure based on a linear model. The model makes a prediction by simply computing a weighted sum of the input features, plus a constant term called the bias term (also called the intercept term, $\\theta_0$):\n", "\n", "$$ \\hat{y}=\\theta_0 x_0 + \\theta_1 x_1 + \\theta_2 x_2 + \\cdots + \\theta_n x_n$$\n", "\n", "\n", "This can be written more easy by the using vector notation form:\n", "\n", "$$\\hat{y}= h_\\theta(x) = \\theta^T x$$\n", "\n", "---\n", "**Now that we have our model, how do we train it?**\n", "\n", "*Please, consider that training the model means adjusting the parameters to reduce the error or minimizing the cost function.* \n", "\n", "The most common performance measure of a regression model is the **Mean Square Error (MSE)**. Therefore, to train a Linear Regression model, you need to find the value of $\\theta$ that minimizes the MSE:\n", "\n", "\n", "$$ MSE(X,h_\\theta) = \\frac{1}{m} \\sum_{i=1}^{m} \\left( \\theta^T x^{(i)}-y^{(i)} \\right)^2$$\n", "\n", "\n", "$$ MSE(X,h_\\theta) = \\frac{1}{m} \\sum_{i=1}^{m} \\left(\\hat{y}^{(i)}-y^{(i)} \\right)^2$$\n", "\n", "$$ MSE(X,h_\\theta) = \\frac{1}{m} \\left(\\hat{y}-y \\right)^2$$" ] }, { "cell_type": "markdown", "id": "12cf820d", "metadata": {}, "source": [ "# The normal equation\n", "\n", "To find the value of $\\theta$ that minimizes the cost function, there is a closed-form or direct solution that gives the result. This is called the **Normal Equation**; and can be found it by deriving the *MSE* equation as a function of $\\theta$ and making it equals to zero:\n", "\n", "\\begin{eqnarray*}\n", "\t\\frac{\\partial J(\\theta)}{\\partial \\theta} = 0\\\\\n", "\t\\frac{\\partial J(\\theta)}{\\partial \\theta}=\\frac{1}{m}\\left(\\theta x-y \\right)^2=\\frac{1}{m}\\left(\\theta x-y \\right)^T\\left(\\theta x-y \\right)\\\\\n", "\t\\frac{1}{m}\\left[(\\theta x)^T-y^T \\right] \\left[\\theta x-y \\right]\n", "\\end{eqnarray*}" ] }, { "cell_type": "markdown", "id": "9139b1c9", "metadata": {}, "source": [ "just considers that:\n", "\\begin{align*}\n", "\t(A^T)^T = A\\\\\n", "\t(A+B)^T = A^T + B^T\\\\\n", "\t(kA)^T = kA^T\\\\\n", "\t(AB)^T =A^TB^T\n", "\\end{align*}" ] }, { "cell_type": "markdown", "id": "5b069092", "metadata": {}, "source": [ "just considers that $(\\theta x)^Ty=y^T(\\theta x)$\n", "\\begin{align*}\n", "\t0=\\frac{\\partial\\,}{\\partial \\theta}\\frac{1}{m}\\left[(\\theta x)^T\\theta x - (\\theta x)^Ty-y^T\\theta x+y^Ty \\right]\\\\\n", "\\end{align*}" ] }, { "cell_type": "markdown", "id": "ae45a858", "metadata": {}, "source": [ "$$0=\\frac{\\partial\\,}{\\partial \\theta}\\frac{1}{m}\\left[(\\theta x)^T\\theta x - 2(\\theta x)^Ty+y^Ty \\right]$$" ] }, { "cell_type": "markdown", "id": "ec27d3cd", "metadata": {}, "source": [ "$$0=\\frac{1}{m}\\left[2\\theta x^T x - 2(x)^Ty+0 \\right]$$" ] }, { "cell_type": "markdown", "id": "7c8c8cfe", "metadata": {}, "source": [ "$$0=\\frac{2}{m}\\left[\\theta x^T x - (x)^Ty+0 \\right]$$" ] }, { "cell_type": "markdown", "id": "c06b74fd", "metadata": {}, "source": [ "$$\\hat{\\theta} = (X^T X)^{-1} X^{T} y $$" ] }, { "cell_type": "markdown", "id": "1315356e", "metadata": {}, "source": [ "## A basic example\n", "\n", "First try to implement the linear regressor by only using two instances or points, $(x^0, y^0)$ and $(x^1,y^1)$, thus:\n", "\n", "$$\\hat{y}^{(i)}=\\theta_0 x_0+ \\theta_1 x_1^{(i)}$$\n", "\n", "but, considers that $x_0=1$, then:\n", "\n", "$$\\hat{y}^{(i)}=\\theta_0 + \\theta_1 x_1^{(i)}$$\n", "\n", "then, to write it in vector form\n", "\n", "$$\n", " \\hat{y}^0=\n", " \\begin{bmatrix}\n", " \\theta_0 & \\theta_1\n", " \\end{bmatrix} \n", " \\begin{bmatrix}\n", " 1 \\\\ \n", " x_0\n", " \\end{bmatrix}\n", "$$" ] }, { "cell_type": "markdown", "id": "54dda83d", "metadata": {}, "source": [ "Now, we need a matrix form to manage all data:\n", "\n", "$$\n", " \\begin{bmatrix}\n", " \\hat{y}^0 \\\\ \n", " \\hat{y}^1\\\\\n", " \\end{bmatrix}\n", " =\n", " \\begin{bmatrix}\n", " \\theta_0 + \\theta_1 x^0_1 \\\\\n", " \\theta_0 + \\theta_1 x^0_1 \\\\\n", " \\end{bmatrix}\n", "$$" ] }, { "cell_type": "markdown", "id": "d86618e4", "metadata": {}, "source": [ "$$\n", " \\begin{bmatrix}\n", " \\hat{y}^0 \\\\ \n", " \\hat{y}^1\\\\\n", " \\end{bmatrix}\n", " =\n", " \\begin{bmatrix}\n", " 1 & x^0_1 \\\\\n", " 1 & x^1_1 \\\\\n", " \\end{bmatrix}\n", " \\begin{bmatrix}\n", " \\theta_0 \\\\\n", " \\theta_1 \\\\\n", " \\end{bmatrix}\n", "$$\n", "\n", "Now, let's compute $\\theta$ using the normal equation:" ] }, { "cell_type": "code", "execution_count": 1, "id": "d2670f5b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1.000e+00, 1.000e-03],\n", " [1.000e+00, 2.196e+00]])" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "X = np.array([[1,0.001],[1, 2.196]])\n", "Xo = np.array([[0.001],[2.196]])\n", "y = np.array([4.314825, 10.877373])\n", "X" ] }, { "cell_type": "code", "execution_count": 2, "id": "d95f739b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([4.31183523, 2.9897713 ])" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)\n", "theta" ] }, { "cell_type": "code", "execution_count": 3, "id": "b241fb39", "metadata": {}, "outputs": [], "source": [ "t0 = theta[0]\n", "t1 = theta[1]" ] }, { "cell_type": "code", "execution_count": 5, "id": "152366f0", "metadata": {}, "outputs": [ { "data": { "image/png": "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pMQHAJCU+AAAkqpIfKxbty6mTp0agwcPjr59+8aoUaNi0aJFldgVAFBjKhIfZ599djzyyCMxe/bsWL58eRx33HExduzYePfddyuxOwCghuSyLMvK+YSfffZZ9O/fPx588MGYMGFC+/rhw4fH+PHj4+qrr97m44vFYuTz+WhtbY3GxsZyjgYAVEhnzt9lf+fjiy++iLa2tujTp0+H9X379o2nn3663LsDAGpM2eOjf//+MXLkyJg2bVq899570dbWFnPmzImFCxfG+++/v9n2pVIpisVihwUA6L4qcs3H7NmzI8uy+P73vx8NDQ3x+9//PiZOnBi9em2+u5aWlsjn8+1LoVCoxEgAQBdR9ms+vmrDhg1RLBZj0KBBccopp8T69evjoYce6rBNqVSKUqnUfrtYLEahUHDNBwDUkM5c81FXyUH69esX/fr1i48//jjmz58f11133WbbNDQ0RENDQyXHAAC6kIrEx/z58yPLsthvv/1ixYoVcdFFF8XQoUPjjDPOqMTuAIAaUpFrPlpbW2PKlCkxdOjQ+MUvfhGjR4+O+fPnxw477FCJ3QEANaSi13x8G77nAwBqT1W/5wMAYFvEBwCQlPgAAJISHwBAUuIDAEhKfAAASYkPACAp8QEAJCU+AICkxAcAkJT4AACSEh8AQFLiAwBISnwAAEmJDwAgKfEBACQlPgCApMQHAJCU+AAAkhIfAEBS4gMASEp8AABJiQ8AICnxAQAkJT4AgKTEBwCQlPgAAJISHwBAUuIDAEhKfAAASYkPACAp8QEAJCU+AICkxAcAkJT4AACSEh8AQFLiAwBISnwAAEmJDwAgKfEBACQlPgCApMoeH21tbXHZZZfFkCFDom/fvrH33nvHtGnTIsuycu8KAKhBdeV+wunTp8fNN98ct99+ewwbNiwWL14cZ5xxRuTz+Tj//PPLvTsAoMaUPT6effbZOOGEE2LChAkREbHnnnvG3XffHS+88EK5dwUA1KCyf+wyatSoeOyxx+K1116LiIh//OMf8fTTT8f48eO3uH2pVIpisdhhAQC6r7K/83HJJZdEsViMoUOHRu/evaOtrS2uueaamDRp0ha3b2lpiauuuqrcYwAAXVTZ3/m49957484774y77rorlixZErfffntcf/31cfvtt29x+0svvTRaW1vbl9WrV5d7JACgC8llZf41lEKhEJdccklMmTKlfd3VV18dc+bMiX/961/bfXyxWIx8Ph+tra3R2NhYztEAgArpzPm77O98fPrpp9GrV8en7d27d2zcuLHcuwIAalDZr/k4/vjj45prrok99tgjhg0bFkuXLo0bbrghzjzzzHLvCgCoQWX/2GXdunVx2WWXxQMPPBAffPBBNDc3x8SJE+Pyyy+P+vr67T7exy4AUHs6c/4ue3x8V+IDAGpPVa/5AADYFvEBACQlPgCApMQHAJCU+AAAkhIfAEBS4gMASEp8AABJiQ8AICnxAQAkJT4AgKTEBwCQlPgAAJISHwBAUuIDAEhKfAAASYkPACAp8QEAJCU+AICkxAcAkJT4AACSEh8AQFLiAwBISnwAAEmJDwAgKfEBACQlPgCApMQHAJCU+AAAkhIfAEBS4gMASEp8AABJiQ8AICnxAQAkJT4AgKTEBwCQlPgAAJISHwBAUuIDAEhKfAAASZU9Pvbcc8/I5XKbLVOmTCn3rgCAGlRX7idctGhRtLW1td9+6aWX4thjj42TTz653LsCAGpQ2eNjt91263D72muvjb333juOOuqocu8KAKhBZY+Pr/r8889jzpw5ceGFF0Yul9viNqVSKUqlUvvtYrFYyZEAgCqr6AWn8+bNi08++SROP/30rW7T0tIS+Xy+fSkUCpUcCQCoslyWZVmlnnzcuHFRX18ff/nLX7a6zZbe+SgUCtHa2hqNjY2VGg0AKKNisRj5fP4bnb8r9rHLqlWr4tFHH437779/m9s1NDREQ0NDpcYAALqYin3sMnPmzBgwYEBMmDChUrsAAGpQReJj48aNMXPmzJg8eXLU1VX0mlYAoMZUJD4effTRePvtt+PMM8+sxNMDADWsIm9LHHfccVHB61gBgBrmb7sAAEmJDwAgKfEBACQlPgCApMQHAJCU+AAAkhIfAEBS4gMASEp8AABJiQ8AICnxAQAkJT4AgKTEBwCQlPgAAJISHwBAUuIDAEhKfAAASYkPACAp8QEAJCU+AICkxAcAkJT4AACSEh8AQFLiAwBISnwAAEmJDwAgKfEBACQlPgCApMQHAJCU+AAAkhIfAEBS4gMASEp8AABJiQ8AICnxAQAkJT4AgKTEBwCQlPgAAJISHwBAUuIDAEiqIvHx7rvvxs9//vPYZZddom/fvnHggQfG4sWLK7ErAKDG1JX7CT/++OM48sgjY8yYMfH3v/89dtttt3j99ddjp512KveuAIAaVPb4mD59ehQKhZg5c2b7uiFDhpR7NwBAjSr7xy5//vOf47DDDouTTz45BgwYEIccckjcdtttW92+VCpFsVjssAAA3VfZ4+PNN9+Mm2++OfbZZ5+YP39+nHvuuXH++efH7bffvsXtW1paIp/Pty+FQqHcIwEAXUguy7KsnE9YX18fhx12WDz77LPt684///xYtGhRLFy4cLPtS6VSlEql9tvFYjEKhUK0trZGY2NjOUcDACqkWCxGPp//Rufvsr/zMWjQoPjhD3/YYd3+++8fb7/99ha3b2hoiMbGxg4LANB9lT0+jjzyyHj11Vc7rHvttddi8ODB5d4VAFCDyh4fv/rVr+K5556L3/3ud7FixYq466674g9/+ENMmTKl3LsCAGpQ2ePj8MMPjwceeCDuvvvuOOCAA2LatGlx0003xaRJk8q9KwCgBpX9gtPvqjMXrAAAXUNVLzgFANgW8QEAJCU+AICkxAcAkJT4AACSEh8AQFLiAwBISnwAAEmJDwAgKfEBACQlPgCApMQHAJCU+AAAkhIfAEBS4gMASEp8AABJiQ8AICnxAQAkJT4AgKTEBwCQlPgAAJISHwBAUuIDAEhKfAAASYkPACAp8QEAJCU+AICkxAcAkJT4AACSEh8AQFLiAwBISnwAAEmJDwAgKfEBACQlPgCApMQHAJCU+AAAkhIfAEBS4gMASEp8AABJlT0+rrzyysjlch2WoUOHlns3AECNqqvEkw4bNiweffTR/7+TuorsBgCoQRWpgrq6umhqaqrEUwMANa4i13y8/vrr0dzcHHvttVdMmjQp3n777a1uWyqVolgsdlgAgO6r7PExYsSImDVrVjz88MNx8803x8qVK+PHP/5xrFu3bovbt7S0RD6fb18KhUK5RwIAupBclmVZJXfwySefxODBg+OGG26Is846a7P7S6VSlEql9tvFYjEKhUK0trZGY2NjJUcDAMqkWCxGPp//Rufvil8JuuOOO8a+++4bK1as2OL9DQ0N0dDQUOkxAIAuouLf87F+/fp44403YtCgQZXeFQBQA8oeH7/+9a/jySefjLfeeiueffbZOOmkk6J3794xceLEcu8KAKhBZf/Y5Z133omJEyfGf/7zn9htt91i9OjR8dxzz8Vuu+1W7l0BADWo7PExd+7ccj8lANCN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hg8fHo899lj7uo0bN8Zjjz3W4b+iv2rkyJEdto+IeOSRR7a6PZ33bY7L17W1tcXy5ctj0KBBlRqTb8hrprYsW7bM66bMsiyL8847Lx544IF4/PHHY8iQIdt9jNfNFlT7itdymjt3btbQ0JDNmjUr++c//5mdc8452Y477pitWbMmy7IsO+2007JLLrmkfftnnnkmq6ury66//vrslVdeya644opshx12yJYvX16tH6Fb6uxxueqqq7L58+dnb7zxRvbiiy9mp556atanT5/s5ZdfrtaP0G2tW7cuW7p0abZ06dIsIrIbbrghW7p0abZq1aosy7LskksuyU477bT27d98883se9/7XnbRRRdlr7zySjZjxoysd+/e2cMPP1ytH6Hb6uyxufHGG7N58+Zlr7/+erZ8+fLsggsuyHr16pU9+uij1foRuqVzzz03y+fz2YIFC7L333+/ffn000/bt3Gu2b5uFR9ZlmX/93//l+2xxx5ZfX19dsQRR2TPPfdc+31HHXVUNnny5A7b33vvvdm+++6b1dfXZ8OGDcseeuihxBP3DJ05LlOnTm3fduDAgdlPf/rTbMmSJVWYuvvb9OuZX182HY/JkydnRx111GaPOfjgg7P6+vpsr732ymbOnJl87p6gs8dm+vTp2d5775316dMn23nnnbOjjz46e/zxx6szfDe2pWMSER1eB84125fLsixL/W4LANBzdZtrPgCA2iA+AICkxAcAkJT4AACSEh8AQFLiAwBISnwAAEmJDwAgKfEBACQlPgCApMQHAJCU+AAAkvp/pWGeZ7sqfysAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "plt.plot(Xo,y, '*k')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 8, "id": "4f15df79", "metadata": {}, "outputs": [ { "data": { "image/png": "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KMbKpPLpwAMP5MADDywdt27dmg8//JA77riDUaNGxVhZ5urXrx/vvvsub7zxRtylVDgZM/NRt25dKleuzPLlyzd5fvny5eTn52/xZ/Lz88t0vXbMjnw2P7bLLrvQvHlzFi1alIoStZ229jdTq1YtqlevHlNV2pojjzzSv5kUueiii3juued45ZVX2GuvvbZ5rd81m8uY8FG1alVatmzJlClTSp8rKSlhypQpm/wv6B9q1arVJtcDvPzyy1u9XjtmRz6bHysuLuadd96hYcOGqSpT28G/mYplwYIF/s0kWRRFXHTRRYwfP56pU6fSpEmTn/wZ/262IO4Vr8k0duzYKDc3NxoxYkT0r3/9KzrvvPOi2rVrR8uWLYuiKIp69OgRXXPNNaXXv/nmm1GVKlWi2267Lfr3v/8dDRw4MNpll12id955J65/hYxV1s/mhhtuiCZNmhR9+OGH0dy5c6MzzjgjqlatWvTee+/F9a+QkVatWhXNnz8/mj9/fgREt99+ezR//vxo8eLFURRF0TXXXBP16NGj9PqPPvoo2nXXXaMrr7wy+ve//x0NGTIkqly5cjRx4sS4/hUyVlk/mzvuuCOaMGFCtHDhwuidd96JLr300qhSpUrR5MmT4/pXyEgXXnhhlJeXF02bNi364osvSh9r164tvcbvmp+WUeEjiqLonnvuifbee++oatWq0ZFHHhnNnDmz9LXjjjsu6tmz5ybXP/7449EBBxwQVa1aNTrkkEOi559/Ps0VZ4+yfDb9+/cvvbZBgwbRL3/5y2jevHkxVJ3Zvr8988eP7z+Lnj17Rscdd9xmP9OsWbOoatWq0b777hsNHz487XVng7J+Nrfccku03377RdWqVYvq1KkTtWvXLpo6dWo8xWewLX0mwCZ/B37X/LScKIqidM+2SJKk7JUxaz4kSVLFYPiQJElpZfiQJElpZfiQJElpZfiQJElpZfiQJElpZfiQJElpZfiQJElpZfiQJElpZfiQJElpZfiQJElpZfiQJElp9f8BAK25a7F8PhUAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "Xvec = np.linspace(0,2,2)\n", "Xnew = np.c_[np.ones((2, 1)), Xvec]\n", "ypre = Xnew.dot(theta)\n", "plt.plot(Xo,y, '*k')\n", "plt.plot(Xvec, ypre, '-r')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "a986cb4d", "metadata": {}, "source": [ "# My Linear Regressor\n", "\n", "**Instructions:** Create your own function train (estimate) the model's parameter for a Linear Regressor implementing the *Normal Equation*. Test your model with the next generated data." ] }, { "cell_type": "code", "execution_count": 9, "id": "5ca2686a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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t+jf//3ftXXrVq1atUrbt2/X9OnTlUwmLW1/rvLp59ixY/XDH/5QL7zwgp555hmlUilNmTJFiURCkv/O5VtvvaUDBw7orrvuyrjfbefSrO4+k62trfr4448t+Qy40cMPP6yzZ8/qtttuS983adIkrV27Vi+99JIef/xxHT58WDfccIPOnDnjYEtzN3LkSD3xxBP6yU9+op/85CeqrKxUTU2N9uzZI8maf8/c5tixY/rFL37R5XPp5nOZSqW0aNEiffnLX9YXv/jFbo+z83rpul1t0TcrV67Uhg0btG3btoxkzDlz5qT//8orr9T48eM1ZswYbdu2TTfffLMTTTVt8uTJmjx5cvrnKVOm6Atf+ILWrFmjFStWONiywohGo7ryyit13XXXZdzvh3MZNM8995yWL1+uF154ISMfYvr06en/Hz9+vCZNmqRwOKyNGzcqEok40VRTxo4dq7Fjx6Z/njJlig4dOqRHHnlETz/9tIMtK5x169bpwgsv1OzZszPud/O5XLhwoQ4cOOBoDkpnnhr5uOSSS1RSUqIPPvgg4/4PPvhAI0aMyPqYESNG9Hh8x3/NPGch5dPHDg8//LBWrlypX/7ylxo/fnyPx44ePVqXXHKJWlpa+tzmfPSlnx0uuOACTZw4Md0HP53LtrY2bdiwIad/tJw+l2Z195ksKyvTwIEDLfnbcJMNGzborrvu0saNG7sMaXd24YUX6vOf/7xnzmU21113Xbr9fjuXhmHohz/8oe68807179+/x2Pdci6/8Y1v6Gc/+5lisZhCoVCPx9p5vfRU8NG/f3996Utf0tatW9P3pVIpbd26NeMb8fkmT56ccbwkvfzyy+njR40apREjRmQc09raqjfffLPb5yykfPoonctAXrFihV566SVdc801vb5OIpHQH/7wB40cOdKSdpuVbz/Pl0wmtX///nQf/HIupXPL3drb23XHHXf0+jpOn0uzevtMWvG34Rbr16/XV7/6Va1fvz5juXR3zp49q0OHDnnmXGazb9++dPv9dC6lcytIWlpacvpS4PS5NAxD3/jGN7Rp0yb96le/0qhRo3p9jK3XS1PpqS6wYcMGo7S01Fi7dq3xm9/8xliwYIFx4YUXGidOnDAMwzDuvPNOY/HixenjX3vtNaNfv37Gww8/bLz77rvG0qVLjQsuuMDYv39/+piVK1caF154ofHCCy8Y//3f/23MmjXLGDVqlPHxxx/b3j/DMN/HlStXGv379zd+/OMfG8ePH0/fzpw5YxiGYZw5c8a47777jJ07dxqHDx82XnnlFePqq682qqurjU8++cSRPhqG+X4uX77c2LJli3Ho0CFj9+7dxpw5c4wBAwYY77zzTvoYr5/LDtdff71x++23d7nfjefyzJkzxt69e429e/cakozvf//7xt69e4333nvPMAzDWLx4sXHnnXemj//9739v/MVf/IXx7W9/23j33XeN1atXGyUlJcZLL72UPqa3980JZvv57LPPGv369TNWr16d8bk8depU+phvfetbxrZt24zDhw8br732mlFXV2dccsklxsmTJ23vn2GY7+MjjzxibN682Whubjb2799vfPOb3zSKi4uNV155JX2MH85lhzvuuMOYNGlS1ud027m8++67jfLycmPbtm0Zf38fffRR+hgnr5eeCz4MwzD+9V//1bj00kuN/v37G9ddd53xxhtvpH934403GvPnz884fuPGjcbnP/95o3///sa4ceOMn//85xm/T6VSxv33328MHz7cKC0tNW6++Wbj4MGDdnSlW2b6GA6HDUldbkuXLjUMwzA++ugjY9q0acbQoUONCy64wAiHw8bXv/51Rz/8Hcz0c9GiReljhw8fbvz1X/+1sWfPnozn8/q5NAzD+O1vf2tIMn75y192eS43nsuO5Zadbx39mj9/vnHjjTd2ecxVV11l9O/f3xg9erTx1FNPdXnent43J5jt54033tjj8YZxbonxyJEjjf79+xuf+9znjNtvv91oaWmxt2PnMdvHVatWGWPGjDEGDBhgDBkyxKipqTF+9atfdXler59Lwzi3pHTgwIFGU1NT1ud027nM1j9JGZ81J6+XRX9uJAAAgC08lfMBAAC8j+ADAADYiuADAADYiuADAADYiuADAADYiuADAADYiuADAADYiuADAADYiuADAADYiuADAADYiuADAADYiuADAADY6v8B+xWn8E1xWCwAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "np.random.seed(42)\n", "Xo = 2 * np.random.rand(100, 1)\n", "X = np.c_[np.ones((100, 1)), Xo] # add x0 = 1 to each instance\n", "y = 4 + 3 * Xo + np.random.randn(100, 1)\n", "plt.plot(Xo, y, '.k')" ] }, { "cell_type": "markdown", "id": "43a9426c", "metadata": {}, "source": [ "Therefore, the model will become:\n", "\n", "$$\n", " \\begin{bmatrix}\n", " \\hat{y}^0 \\\\ \n", " \\hat{y}^1\\\\\n", " \\vdots \\\\\n", " \\hat{y}^n\n", " \\end{bmatrix}\n", " =\n", " \\begin{bmatrix}\n", " 1 & x^0_1 \\\\\n", " 1 & x^1_1 \\\\\n", " \\vdots & \\vdots \\\\\n", " 1 & x^n_1\n", " \\end{bmatrix}\n", " \\begin{bmatrix}\n", " \\theta_0 \\\\\n", " \\theta_1 \\\\\n", " \\vdots \\\\\n", " \\theta_n\n", " \\end{bmatrix}\n", "$$\n" ] }, { "cell_type": "markdown", "id": "c07852f4", "metadata": {}, "source": [ "## Using Sklearn to train the model\n", "Python already includes a linear regression function within Scikit-Learn." ] }, { "cell_type": "code", "execution_count": 11, "id": "17481af6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([4.21509616]), array([[0. , 2.77011339]]))" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.linear_model import LinearRegression\n", "\n", "lin_reg = LinearRegression()\n", "lin_reg.fit(X, y)\n", "lin_reg.intercept_, lin_reg.coef_" ] }, { "cell_type": "code", "execution_count": 16, "id": "c5e85264", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[4.21509616],\n", " [9.75532293]])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_new = np.array([[0], [2]])\n", "X_new_b = np.c_[np.ones((2, 1)), X_new] #Se agrega x0=1 para cada instancia\n", "y_Pred=lin_reg.predict(X_new_b)\n", "y_Pred" ] }, { "cell_type": "code", "execution_count": 23, "id": "20da996b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(Xo,y, '.k', label='data')\n", "plt.plot(X_new, y_Pred, '-r', label='SK-model')\n", "plt.legend()" ] }, { "cell_type": "markdown", "id": "19ad47f6", "metadata": {}, "source": [ "# Gradient Descent" ] }, { "cell_type": "code", "execution_count": null, "id": "1a8ec08d", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.8.10" } }, "nbformat": 4, "nbformat_minor": 5 }