You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

599 lines
133 KiB
Plaintext

{
"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": 2,
"id": "d2670f5b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[1.000e+00, 1.000e-03],\n",
" [1.000e+00, 2.196e+00]])"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"X0 = np.array([[0.001],\n",
" [2.196]])\n",
"X = np.c_[np.ones(2),X0]\n",
"y = np.array([4.314825, 10.877373])\n",
"X"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "d95f739b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([4.31183523, 2.9897713 ])"
]
},
"execution_count": 3,
"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": 4,
"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": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAGdCAYAAACyzRGfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAadUlEQVR4nO3de4xU9fn48Wdg3YUSdrzCsnVEtCoWrRdUAtIoFiWUGPUPq4RavMXGYJSaajWpt6BdMUZNvyFqTQoKKtqo2NZW4g2NigoCDVqrooh4AWvVHUA71uX8/jDsz5WbqzOf2dl9vZITOmfOzHk2p5PzdubsbC7LsiwAABLpVe0BAICeRXwAAEmJDwAgKfEBACQlPgCApMQHAJCU+AAAkhIfAEBSddUe4Os2btwY7733XvTv3z9yuVy1xwEAvoEsy2LdunXR3NwcvXpt+72NLhcf7733XhQKhWqPAQB8C6tXr47dd999m9t0ufjo379/RHw5fGNjY5WnAQC+iWKxGIVCof08vi1dLj42fdTS2NgoPgCgxnyTSyZccAoAJCU+AICkxAcAkFSn4+Opp56K448/PpqbmyOXy8W8efM63H///ffHcccdF7vsskvkcrlYtmxZmUYFALqDTsfHhg0b4qCDDooZM2Zs9f7Ro0fH9OnTv/NwAED30+nfdhk/fnyMHz9+q/efdtppERHx1ltvfeuhAIDuq+q/alsqlaJUKrXfLhaLVZwGAKi0ql9w2tLSEvl8vn3x7aYA0L1VPT4uvfTSaG1tbV9Wr15d7ZEAgAqqenw0NDS0f5upbzUFgMpavHhxHHPMMbF48eKqzVD1+AAA0rnjjjviiSeeiNmzZ1dthk5fcLp+/fpYsWJF++2VK1fGsmXLYuedd4499tgjPvroo3j77bfjvffei4iIV199NSIimpqaoqmpqUxjAwDf1KpVq+LDDz+MXC4X99xzT0REzJ07NyZPnhxZlsWuu+4agwcPTjZPLsuyrDMPWLBgQYwZM2az9ZMnT45Zs2bFrFmz4owzztjs/iuuuCKuvPLK7T5/sViMfD4fra2tPoIBgDL46h97y+VykWVZ+7+bdDIHNtOZ83en46PSxAcAlNedd94Zp59+enzxxReb3VdXVxezZs2KSZMmfad9dOb8XfXv+QAAKmvSpEmx//77x/Dhwze77/nnn49DDz006TwuOAWAHqRXr14d/q3KDFXbMwCQzIABA6KpqSmGDx8et9xySwwfPjyamppiwIAByWdxzQcA9BClUinq6+vbLzb9/PPPo6GhoSzP7ZoPAGAzXw2NXC5XtvDoLB+7AABJiQ8AICnxAQAkJT4AgKTEBwCQlPgAAJISHwBAUuIDAEhKfAAASYkPACAp8QEAJCU+AICkxAcAkJT4AACSEh8AQFLiAwBISnwAAEmJDwAgKfEBACQlPgCApMQHAJCU+AAAkhIfAEBS4gMASEp8AABJiQ8AICnxAQAkJT4AgKTEBwCQlPgAAJISHwBAUuIDAEhKfAAASYkPACAp8QEAJNXp+Hjqqafi+OOPj+bm5sjlcjFv3rwO92dZFpdffnkMGjQo+vbtG2PHjo3XX3+9XPMCADWu0/GxYcOGOOigg2LGjBlbvP+6666L3//+93HLLbfE888/H/369Ytx48bFf//73+88LABQ++o6+4Dx48fH+PHjt3hflmVx0003xW9/+9s44YQTIiLijjvuiIEDB8a8efPi1FNP/W7TAgA1r6zXfKxcuTLWrFkTY8eObV+Xz+djxIgRsXDhwi0+plQqRbFY7LAAAN1XWeNjzZo1ERExcODADusHDhzYft/XtbS0RD6fb18KhUI5RwIAupiq/7bLpZdeGq2tre3L6tWrqz0SAFBBZY2PpqamiIhYu3Zth/Vr165tv+/rGhoaorGxscMCAHRfZY2PIUOGRFNTUzz22GPt64rFYjz//PMxcuTIcu4KAKhRnf5tl/Xr18eKFSvab69cuTKWLVsWO++8c+yxxx4xderUuPrqq2OfffaJIUOGxGWXXRbNzc1x4oknlnNuAKBGdTo+Fi9eHGPGjGm/feGFF0ZExOTJk2PWrFlx8cUXx4YNG+Kcc86JTz75JEaPHh0PP/xw9OnTp3xTAwA1K5dlWVbtIb6qWCxGPp+P1tZW138AQI3ozPm76r/tAgD0LOIDAEhKfAAASYkPACAp8QEAJCU+AICkxAcAkJT4AACSEh8AQFLiAwBISnwAAEmJDwAgKfEBACQlPgCApMQHAJCU+AAAkhIfAEBS4gMASEp8AABJiQ8AICnxAQAkJT4AgKTEBwCQlPgAAJISHwBAUuIDAEhKfAAASYkPACAp8QEAJCU+AICkxAcAkJT4AACSEh8AQFLiAwBISnwAAEmJDwAgKfEBACQlPgCApMQHAJCU+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": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"plt.plot(X0,y, '*k')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "4f15df79",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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2y6SlA2++gp69QrLogN07w733w81a8Zbl7QdnPmQpEz36quhzfLcc1CtWlgyffx4g4eyluFDkjLVhg3w+9+HLe8//xz23x/efBPOPdc2i7KabRdJykTLlkHPnvDii2Hcsyfcey/ssku8dUlJYPiQpEzz8svQowcsXQrVq4fQcfbZcVclJY1tF0nKFGVlcP310KlTCB4HHghz5hg8lHOc+ZCkTPDFF2G2Y9q0MO7bF+6+G3beOd66pBQwfEhS3F58Ec46C778EmrUgPvuC2MpR9l2kaS4rF8Pv/sdHHdcCB7//d8wd67BQznPmQ9JisNnn8GZZ4Y1PADOOy9sEle9erx1SWlg+JCkdHv22bBa6ddfh4XCHnwQTj897qqktLHtIknpsm4dXHUVdOkSgkeLFjBvnsFDFY4zH5KUDp9+CmecEXakBbj4Yrj1VsjLi7cuKQaGD0lKtaeeCmt1LF8O+fnw8MPwq1/FXZUUm5S0XVauXMnAgQNp1KgR1atXp127dsyePTsVbyVJmWvtWrjsMjjppBA8DjkE5s83eKjCS0n46NevHy+++CJjx47l7bff5thjj6VTp058/vnnqXg7Sco8H38MHTqEO1gAfvMbeO01aNw43rqkDJCIoihK5i/89ttvqVmzJn/961/p0qXLxudbtmxJ586duemmm7b68yUlJeTn51NcXEytWrWSWZokpceTT4YVSouLYdddYdQoOPHEuKuSUqo8399Jv+Zj/fr1lJWVUa1atU2er169Oq+99tpPji8tLaW0tHTjuKSkJNklSVJ6fPcdXHkl3HNPGLdtCxMmwJ57xluXlGGS3napWbMmbdu25cYbb2TJkiWUlZUxbtw43njjDb744oufHD906FDy8/M3PgoLC5NdkiSl3qJF0K7d/wePq66CV14xeEibkfS2C8CHH35I3759mTFjBpUrV6ZFixbst99+zJ07l/fee2+TYzc381FYWGjbRVL2mDgRzj0XVq6E3XaDMWOgc+e4q5LSKta2C8A+++zDK6+8wurVqykpKaFhw4acfvrp7L333j85Ni8vjzzvc5eUjb79NlxIev/9YXzYYfDoo/CLX8Rbl5ThUrrCaY0aNWjYsCHLly9nypQpnHTSSal8O0lKnw8+gEMPDcEjkQgbxL38ssFD2gYpmfmYMmUKURSx//77s2jRIq688kqaNGlCnz59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FoOHJCmLGD6ywYYNcMstcPjhUFQE++4Ls2aFZdNts0iSskzSw8f1119PIpHY5NGkSZNkv03F8e9/h4XCrr4aysqge/ewnkezZnFXJknSdknJNR8HHnggL7300v+/SRUvLdkuM2aEsLFkCVSrBnffHW6rdbZDkpTFUpIKqlSpQoMGDVLxqyuGsrKwCdzgwaHl0qRJuLbj4IPjrkySpB2Wkms+Fi5cSEFBAXvvvTc9evTg008/TcXb5KZly+D44+Haa0Pw6N0b5swxeEiSckbSZz7atGnDqFGj2H///fniiy8YMmQIhx12GO+88w41a9b8yfGlpaWUlpZuHJeUlCS7pOzx8svQowcsXQo77xzuZundO+6qJElKqkQURVEq32DFihU0atSI22+/nXPOOecnr19//fUMGTLkJ88XFxdTq1atVJaWOcrK4IYb4MYbwwJiBx4Y2iy//GXclUmStE1KSkrIz8/fpu/vlN9qW7t2bfbbbz8WLVq02dcHDRpEcXHxxkdRUVGqS8osS5ZAp04hfEQR9OsXlk03eEiSclTKw8eqVav48MMPadiw4WZfz8vLo1atWps8KowXXgi3zE6fDrvsAuPHw4MPhpaLJEk5Kunh44orruCVV17hk08+YebMmZx88slUrlyZ7t27J/utstf69fC//xsuLP33v6Fp07B2x5lnxl2ZJEkpl/QLTj/77DO6d+/O119/ze67706HDh2YNWsWu+++e7LfKjt99llYu+O118L4/PPhjjvCOh6SJFUASQ8fEyZMSPavzB3PPgu9esHXX0PNmmFDuNNOi7sqSZLSyr1d0mHdOrjqKujSJQSPli1h/nyDhySpQnLd81RbvBjOOCNsBAdw8cVw661hV1pJkiogw0cq/fWv0KcPLF8OtWvDww/DySfHXZUkSbGy7ZIKa9fCwIHQrVsIHq1bhzaLwUOSJMNH0n30EbRvD3fdFcaXXw6vvgp77RVrWZIkZQrbLsn0xBPQty+UlECdOjBqFHTtGndVkiRlFGc+kuG77+Cii+CUU0LwaNcutFkMHpIk/YThY0ctXBjCxvDhYXz11WG59D33jLUsSZIylW2XHTFhAvTvDytXwm67wdixYcl0SZK0Rc58bI9vv4XzzgvLpK9cCYcfDgsWGDwkSdoGho/yev99aNMGHngAEgn43e9g6lT4xS/irkySpKxg26U8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\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"Xvec = np.linspace(0,2.5,2)\n",
"Xnew = np.c_[np.ones((2, 1)), Xvec]\n",
"ypre = Xnew.dot(theta)\n",
"plt.plot(X0,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": [
"[<matplotlib.lines.Line2D at 0xffff60435af0>]"
]
},
"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": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"np.random.seed(42)\n",
"X0 = 2 * np.random.rand(100, 1)\n",
"X = np.c_[np.ones((100, 1)), X0] # add x0 = 1 to each instance\n",
"y = 4 + 3 * X0 + np.random.randn(100, 1)\n",
"plt.plot(X0, 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": 10,
"id": "17481af6",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array([4.21509616]), array([[0. , 2.77011339]]))"
]
},
"execution_count": 10,
"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": 11,
"id": "c5e85264",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[4.21509616],\n",
" [9.75532293]])"
]
},
"execution_count": 11,
"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": 13,
"id": "20da996b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0xffff453bbb50>"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(X0,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": [
"# Batch Gradient Descent Example for Linear Model\n",
"\n",
"$\\nabla MSE(\\theta)=\\frac{2}{m} X^T(X\\theta-y)$ \n",
"\n",
"$\\theta_N=\\theta-\\eta \\nabla MSE(\\theta)$"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "da8103f8",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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KStR7EJ+DACEmyfBR0dHh772ta958VajKnSnDe+RHwMA4RaKXW2H7rSH5xhwp+2fRCKh1tZW8mMAIIRCMe3CnbadYrGY4vE418EjLG0GYAvHV7tMlNurXbjTRhh5lXANILxK6b9DFXwAYcTSZgBeKKX/DsW0CxBmJFwDsA3BB1DhWNoMwDYEH0CFI+EagG3I+QBCgoRrAG7ytbw6ADtR+h+ALZh2AQAAniL4AAAAniL4AAAAniL4AAAAniL4AAAAniL4AAAAniL4AAAAniL4AAAAniL4AAAAniL4AAAAniL4AAAAnrJub5ehfe56e3t9bgkAACjWUL9dzH611gUffX19kqSGhgafWwIAAErV19enurq6gsdETDEhioey2ayOHDmiadOmKRKJlP06vb29amhoUHd397hb+wZZGM6Tc6wMnGNl4BwrgxvnaIxRX1+f6uvrFY0WzuqwbuQjGo06uu13bW1txX54ThWG8+QcKwPnWBk4x8rg9DmON+IxhIRTAADgKYIPAADgqYoNPmpqarRhwwbV1NT43RRXheE8OcfKwDlWBs6xMvh9jtYlnAIAgMpWsSMfAADATgQfAADAUwQfAADAUwQfAADAU4EKPjZv3qw///M/1+TJk7Vo0SK9/vrrBY//zne+owsuuECTJ0/WvHnz9P3vfz/v68YY3XXXXZo9e7amTJmilpYWdXZ2unkK4yrlHB955BF99KMf1emnn67TTz9dLS0tI47/+7//e0UikbzHVVdd5fZpFFTKOW7btm1E+ydPnpx3TNCvYzweH3GOkUhE11xzTe4Y267jyy+/rGXLlqm+vl6RSERPP/30uN/T0dGhiy66SDU1NZozZ462bds24phSf8fdVOo5PvXUU7riiit01llnqba2VosXL9bzzz+fd8yXv/zlEdfxggsucPEsCiv1HDs6Okb9rB49ejTvuCBfx9F+1yKRiObOnZs7xrbruHHjRl1yySWaNm2azj77bC1fvlwHDx4c9/v87CMDE3x8+9vf1h133KENGzZo3759mj9/vlpbW3Xs2LFRj3/11Vd1ww03KJFIaP/+/Vq+fLmWL1+ut956K3fMV7/6VT300EP6+te/rtdee01Tp05Va2ur3nvvPa9OK0+p59jR0aEbbrhBqVRKe/bsUUNDg6688kr9+te/zjvuqquu0m9+85vc48knn/TidEZV6jlKJyvwndr+w4cP53096Nfxqaeeyju/t956S1VVVfrEJz6Rd5xN1/H48eOaP3++Nm/eXNTxhw4d0jXXXKPLL79cBw4c0Jo1a3TLLbfkdc7lfDbcVOo5vvzyy7riiiv0/e9/X2+88YYuv/xyLVu2TPv37887bu7cuXnX8cc//rEbzS9Kqec45ODBg3nncPbZZ+e+FvTr+OCDD+adW3d3t2bMmDHi99Gm6/jSSy/ptttu009+8hO98MILev/993XllVfq+PHjY36P732kCYiFCxea2267LffvwcFBU19fbzZu3Djq8ddff7255ppr8p5btGiRaWtrM8YYk81mzaxZs8y//Mu/5L7++9//3tTU1Jgnn3zShTMYX6nnONz//u//mmnTppnt27fnnlu1apW57rrrnG5q2Uo9x0cffdTU1dWN+XqVeB0feOABM23aNNPf3597zrbreCpJZteuXQWP+dKXvmTmzp2b99yKFStMa2tr7t8T/bm5qZhzHM2HPvQhc/fdd+f+vWHDBjN//nznGuagYs4xlUoZSeZ3v/vdmMdU2nXctWuXiUQiJp1O556z+ToaY8yxY8eMJPPSSy+NeYzffWQgRj7+53/+R2+88YZaWlpyz0WjUbW0tGjPnj2jfs+ePXvyjpek1tbW3PGHDh3S0aNH846pq6vTokWLxnxNN5VzjsOdOHFC77//vmbMmJH3fEdHh84++2ydf/75uvXWW/Xb3/7W0bYXq9xz7O/vV2NjoxoaGnTdddfpZz/7We5rlXgdk8mkVq5cqalTp+Y9b8t1LMd4v49O/Nxsk81m1dfXN+L3sbOzU/X19Tr33HN144036p133vGpheX7yEc+otmzZ+uKK67QK6+8knu+Eq9jMplUS0uLGhsb8563+Tr29PRI0ojP3qn87iMDEXz893//twYHBzVz5sy852fOnDlirnHI0aNHCx4/9N9SXtNN5ZzjcGvXrlV9fX3eh+Wqq67SN7/5Te3evVv33nuvXnrpJV199dUaHBx0tP3FKOcczz//fH3jG9/QM888o8cee0zZbFZLlixRJpORVHnX8fXXX9dbb72lW265Je95m65jOcb6fezt7dUf/vAHRz7/trnvvvvU39+v66+/PvfcokWLtG3bNj333HN6+OGHdejQIX30ox9VX1+fjy0t3uzZs/X1r39d3/3ud/Xd735XDQ0Nisfj2rdvnyRn/o7Z5MiRI/rBD34w4vfR5uuYzWa1Zs0aXXrppfrwhz885nF+95HW7WqL8mzatEk7duxQR0dHXkLmypUrc/8/b948XXjhhTrvvPPU0dGhj33sY340tSSLFy/W4sWLc/9esmSJPvjBD2rLli265557fGyZO5LJpObNm6eFCxfmPR/06xg2TzzxhO6++24988wzefkQV199de7/L7zwQi1atEiNjY3auXOnEomEH00tyfnnn6/zzz8/9+8lS5bo7bff1gMPPKBvfetbPrbMHdu3b9f06dO1fPnyvOdtvo633Xab3nrrLV9zUIoRiJGPM888U1VVVXr33Xfznn/33Xc1a9asUb9n1qxZBY8f+m8pr+mmcs5xyH333adNmzbphz/8oS688MKCx5577rk688wz1dXVNeE2l2oi5zjktNNO04IFC3Ltr6TrePz4ce3YsaOoP15+XsdyjPX7WFtbqylTpjjy2bDFjh07dMstt2jnzp0jhrWHmz59uj7wgQ8E5jqOZuHChbn2V9J1NMboG9/4hm6++WZVV1cXPNaW6/jZz35Wzz77rFKplGKxWMFj/e4jAxF8VFdX6y/+4i+0e/fu3HPZbFa7d+/Ouys+1eLFi/OOl6QXXnghd3xTU5NmzZqVd0xvb69ee+21MV/TTeWco3QyG/mee+7Rc889p4svvnjc98lkMvrtb3+r2bNnO9LuUpR7jqcaHBzUm2++mWt/pVxH6eSyt4GBAd10003jvo+f17Ec4/0+OvHZsMGTTz6pT33qU3ryySfzlkqPpb+/X2+//XZgruNoDhw4kGt/pVxH6eQKkq6urqJuBvy+jsYYffazn9WuXbv04osvqqmpadzv8b2PnHDKqkd27NhhampqzLZt28zPf/5zs3r1ajN9+nRz9OhRY4wxN998s7nzzjtzx7/yyitm0qRJ5r777jO/+MUvzIYNG8xpp51m3nzzzdwxmzZtMtOnTzfPPPOM+c///E9z3XXXmaamJvOHP/zB8/MzpvRz3LRpk6murjb/9m//Zn7zm9/kHn19fcYYY/r6+swXvvAFs2fPHnPo0CHzox/9yFx00UWmubnZvPfee4E4x7vvvts8//zz5u233zZvvPGGWblypZk8ebL52c9+ljsm6NdxyF/91V+ZFStWjHjexuvY19dn9u/fb/bv328kmfvvv9/s37/fHD582BhjzJ133mluvvnm3PG/+tWvzJ/8yZ+YL37xi+YXv/iF2bx5s6mqqjLPPfdc7pjxfm5eK/UcH3/8cTNp0iSzefPmvN/H3//+97ljPv/5z5uOjg5z6NAh88orr5iWlhZz5plnmmPHjnl+fsaUfo4PPPCAefrpp01nZ6d58803ze23326i0aj50Y9+lDsm6NdxyE033WQWLVo06mvadh1vvfVWU1dXZzo6OvI+eydOnMgdY1sfGZjgwxhj/vVf/9Wcc845prq62ixcuND85Cc/yX3tsssuM6tWrco7fufOneYDH/iAqa6uNnPnzjX//u//nvf1bDZr1q9fb2bOnGlqamrMxz72MXPw4EEvTmVMpZxjY2OjkTTisWHDBmOMMSdOnDBXXnmlOeuss8xpp51mGhsbzWc+8xnf/ggMKeUc16xZkzt25syZ5q//+q/Nvn378l4v6NfRGGP+67/+y0gyP/zhD0e8lo3XcWjJ5fDH0HmtWrXKXHbZZSO+5yMf+Yiprq425557rnn00UdHvG6hn5vXSj3Hyy67rODxxpxcXjx79mxTXV1t/uzP/sysWLHCdHV1eXtipyj1HO+9915z3nnnmcmTJ5sZM2aYeDxuXnzxxRGvG+TraMzJJaVTpkwx7e3to76mbddxtPOTlPc7ZlsfGfn/hgMAAHgiEDkfAACgchB8AAAATxF8AAAATxF8AAAATxF8AAAATxF8AAAATxF8AAAATxF8AAAATxF8AAAATxF8AAAATxF8AAAATxF8AAAAT/0faoYsvjXu3ucAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"X = 2 * np.random.rand(100, 1)\n",
"Xb = np.c_[np.ones((100, 1)), X] # add x0 = 1 to each instance\n",
"y = 4 + 3 * X + np.random.randn(100, 1)\n",
"plt.plot(X, y, '.k')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "c93a4eb5",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-0.52563093],\n",
" [ 0.03240701]])"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"eta = 0.01 # learning rate\n",
"ni = 20 # iterations\n",
"m = 100 # dataset size\n",
"theta = np.random.randn(2,1) # random initialization\n",
"theta"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "19aaf38d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[4.24631965],\n",
" [2.93425959]])"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"for iteration in range(ni):\n",
" gradients = 2/m * Xb.T.dot(Xb.dot(theta) - y)\n",
" theta = theta - eta * gradients\n",
"theta"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "1a8ec08d",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAGdCAYAAACyzRGfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABjJklEQVR4nO3dd5gUVdo28LtJQxDGwAxhHRAMoEhQEQR0BUWMCCaQNWBAdxFUdA3opyCvAUVWfFXMCUXEgICLAkrOggQVFQQdcSQNpgmEAWbq++O8PdPVXdVdp+pU6r5/19WX0lN16lRXd52nToxomqaBiIiIyCPV/M4AERERZRYGH0REROQpBh9ERETkKQYfRERE5CkGH0REROQpBh9ERETkKQYfRERE5CkGH0REROSpGn5nIF5FRQW2bduG+vXrIxKJ+J0dIiIiskDTNJSUlKBp06aoVi153Ubggo9t27YhLy/P72wQERGRDQUFBTjyyCOTbhO44KN+/foAROYbNGjgc26IiIjIiuLiYuTl5VWW48kELviINrU0aNCAwQcREVHIWOkywQ6nRERE5CkGH0REROQpBh9ERETkKQYfRERE5CkGH0REROQpBh9ERETkKQYfRERE5CkGH0REROQpBh9ERETkKengY9GiRejduzeaNm2KSCSCadOmVf7twIEDuPfee9G2bVvUq1cPTZs2xbXXXott27apzDMRERGFmHTwsXv3brRv3x7jx49P+NuePXuwZs0aPPjgg1izZg0++ugjbNy4ERdffLGSzBIREZE1ubm5iEQiyM3N9TsrCSKapmm2d45EMHXqVPTt29d0m1WrVqFTp07YsmULmjVrljLN4uJiZGdno6ioiGu7EBER2WC0voqD4t4SmfLb9YXlioqKEIlEcOihhxr+vaysDGVlZZX/Li4udjtLREREacuspiM3NxeFhYUe58aYqx1O9+3bh3vvvRcDBgwwjYJGjx6N7OzsyldeXp6bWSIiIkpru3btknrfD64FHwcOHEC/fv2gaRpeeOEF0+3uu+8+FBUVVb4KCgrcyhIREVHay8nJkXrfD640u0QDjy1btmDevHlJ236ysrKQlZXlRjaIiIgyTmFhoWGfj6A0uQAu1HxEA49NmzZhzpw5OOKII1QfgoiIiJLQNK2ypiMnJ8f1zqaypGs+SktLsXnz5sp/5+fnY926dTj8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5OXloaCgAA0aNFCadhCk+/kB6X+OPL/wS/dzTPfzA9L/HN06P03TUFJSgqZNm6JateS9OgJX81GtWjUceeSRrh6jQYMGafmFikr38wPS/xx5fuGX7ueY7ucHpP85unF+qWo8otjhlIiIiDzF4IOIiIg8lVHBR1ZWFkaOHImsrCy/s+KKdD8/IP3PkecXful+jul+fkD6n2MQzi9wHU6JiIgovWVUzQcRERH5j8EHEREReYrBBxEREXmKwQcRERF5KtTBx/jx43HUUUehdu3a6Ny5M1auXJl0+w8++ACtW7dG7dq10bZtW3z66ae6v2uahhEjRqBJkyaoU6cOevbsiU2bNrl5CinJnOMrr7yCM844A4cddhgOO+ww9OzZM2H76667DpFIRPc677zz3D4NUzLn9+abbybkvXbt2rptwn4Nu3fvnnCOkUgEF154YeU2QbqGixYtQu/evdG0aVNEIhFMmzYt5T4LFizAySefjKysLBxzzDF48803E7aR/W27Rfb8PvroI5xzzjnIyclBgwYN0KVLF8yePVu3zUMPPZRw/Vq3bu3iWZiTPb8FCxYYfj937Nih2y4o1w+QP0ej31ckEkGbNm0qtwnSNRw9ejROPfVU1K9fH7m5uejbty82btyYcj+/y8PQBh/vvfce7rzzTowcORJr1qxB+/btce6556KwsNBw+2XLlmHAgAG48cYbsXbtWvTt2xd9+/bF+vXrK7cZM2YMnnnmGbz44ov44osvUK9ePZx77rnYt2+fV6elI3uOCxYswIABAzB//nwsX74ceXl56NWrF7Zu3arb7rzzzsP27dsrX++++64Xp5NA9vwAMSNfbN63bNmi+3vYr+FHH32kO7/169ejevXquOKKK3TbBeUa7t69G+3bt8f48eMtbZ+fn48LL7wQPXr0wLp16zBs2DAMGjRIV0Db+V64Rfb8Fi1ahHPOOQeffvopVq9ejR49eqB3795Yu3atbrs2bdrort+SJUvcyH5KsucXtXHjRl3+c3NzK/8WpOsHyJ/j//7v/+rOraCgAIcffnjCbzAo13DhwoUYMmQIVqxYgc8//xwHDhxAr169sHv3btN9AlEeaiHVqVMnbciQIZX/Li8v15o2baqNHj3acPt+/fppF154oe69zp07a//85z81TdO0iooKrXHjxtqTTz5Z+fe//vpLy8rK0t59910XziA12XOMd/DgQa1+/frahAkTKt8bOHCg1qdPH9VZtUX2/N544w0tOzvbNL10vIbjxo3T6tevr5WWlla+F6RrGAuANnXq1KTb3HPPPVqbNm107/Xv318799xzK//t9DNzi5XzM3LCCSdoo0aNqvz3yJEjtfbt26vLmCJWzm/+/PkaAO3PP/803Sao10/T7F3DqVOnapFIRPv5558r3wvqNdQ0TSssLNQAaAsXLjTdJgjlYShrPvbv34/Vq1ejZ8+ele9Vq1YNPXv2xPLlyw33Wb58uW57ADj33HMrt8/Pz8eOHTt022RnZ6Nz586mabrJzjnG27NnDw4cOIDDDz9c9/6CBQuQm5uLVq1aYfDgwfj999+V5t0Ku+dXWlqK5s2bIy8vD3369MG3335b+bd0vIavvfYarrzyStSrV0/3fhCuoR2pfocqPrMgqaioQElJScJvcNOmTWjatClatmyJq666Cr/88otPObSnQ4cOaNKkCc455xwsXbq08v10u36A+A327NkTzZs3170f1GtYVFQEAAnfuVhBKA9DGXz89ttvKC8vR6NGjXTvN2rUKKHtMWrHjh1Jt4/+VyZNN9k5x3j33nsvmjZtqvsCnXfeeXjrrbcwd+5cPPHEE1i4cCHOP/98lJeXK81/KnbOr1WrVnj99dcxffp0TJw4ERUVFejatSt+/fVXAOl3DVeuXIn169dj0KBBuveDcg3tMPsdFhcXY+/evUq+90EyduxYlJaWol+/fpXvde7cGW+++SZmzZqFF154Afn5+TjjjDNQUlLiY06tadKkCV588UVMmTIFU6ZMQV5eHrp37441a9YAUHPfCpJt27Zh5syZCb/BoF7DiooKDBs2DN26dcOJJ55oul0QysPArWpLajz++OOYPHkyFixYoOuUeeWVV1b+f9u2bdGuXTscffTRWLBgAc4++2w/smpZly5d0KVLl8p/d+3aFccffzxeeuklPPzwwz7mzB2vvfYa2rZti06dOuneD/M1zCSTJk3CqFGjMH36dF2fiPPPP7/y/9u1a4fOnTujefPmeP/993HjjTf6kVXLWrVqhVatWlX+u2vXrvjxxx8xbtw4vP322z7mzB0TJkzAoYceir59++reD+o1HDJkCNavX+9b/xMZoaz5aNiwIapXr46dO3fq3t+5cycaN25suE/jxo2Tbh/9r0yabrJzjlFjx47F448/js8++wzt2rVLum3Lli3RsGFDbN682XGeZTg5v6iaNWvipJNOqsx7Ol3D3bt3Y/LkyZZuZH5dQzvMfocNGjRAnTp1lHwvgmDy5MkYNGgQ3n///YTq7XiHHnoojjvuuFBcPyOdOnWqzHu6XD9AjPZ4/fXXcc0116BWrVpJtw3CNRw6dChmzJiB+fPn48gjj0y6bRDKw1AGH7Vq1cIpp5yCuXPnVr5XUVGBuXPn6p6MY3Xp0kW3PQB8/vnnldu3aNECjRs31m1TXFyML774wjRNN9k5R0D0UH744Ycxa9YsdOzYMeVxfv31V/z+++9o0qSJknxbZff8YpWXl+Obb76pzHu6XENADIMrKyvD1VdfnfI4fl1DO1L9DlV8L/z27rvv4vrrr8e7776rGyJtprS0FD/++GMorp+RdevWVeY9Ha5f1MKFC7F582ZLDwB+XkNN0zB06FBMnToV8+bNQ4sWLVLuE4jyUEm3VR9MnjxZy8rK0t58803tu+++026++Wbt0EMP1Xbs2KFpmqZdc8012vDhwyu3X7p0qVajRg1t7Nix2vfff6+NHDlSq1mzpvbNN99UbvP4449rhx56qDZ9+nTt66+/1vr06aO1aNFC27t3r+fnp2ny5/j4449rtWrV0j788ENt+/btla+SkhJN0zStpKREu+uuu7Tly5dr+fn52pw5c7STTz5ZO/bYY7V9+/YF/vxGjRqlzZ49W/vxxx+11atXa1deeaVWu3Zt7dtvv63cJuzXMOr000/X+vfvn/B+0K5hSUmJtnbtWm3t2rUaAO2pp57S1q5dq23ZskXTNE0bPny4ds0111Ru/9NPP2l169bV7r77bu3777/Xxo8fr1WvXl2bNWtW5TapPrMgn98777yj1ahRQxs/frzuN/jXX39VbvPvf/9bW7BggZafn68tXbpU69mzp9awYUOtsLAw8Oc3btw4bdq0adqmTZu0b775Rrv99tu1atWqaXPmzKncJkjXT9PkzzHq6quv1jp37myYZpCu4eDBg7Xs7GxtwYIFuu/cnj17KrcJYnkY2uBD0zTt2Wef1Zo1a6bVqlVL69Spk7ZixYrKv5155pnawIEDddu///772nHHHafVqlVLa9OmjfbJJ5/o/l5RUaE9+OCDWqNGjbSsrCzt7LPP1jZu3OjFqZiSOcfmzZtrABJeI0eO1DRN0/bs2aP16tVLy8nJ0WrWrKk1b95cu+mmm3y7KWia3PkNGzascttGjRppF1xwgbZmzRpdemG/hpqmaRs2bNAAaJ999llCWkG7htGhl/Gv6DkNHDhQO/PMMxP26dChg1arVi2tZcuW2htvvJGQbrLPzEuy53fmmWcm3V7TxNDiJk2aaLVq1dL+9re/af3799c2b97s7Yn9H9nze+KJJ7Sjjz5aq127tnb44Ydr3bt31+bNm5eQblCun6bZ+47+9ddfWp06dbSXX37ZMM0gXUOjcwOg+10FsTyM/F/miYiIiDwRyj4fREREFF4MPoiIiMhTDD6IiIjIUww+iIiIyFMMPoiIiMhTDD6IiIjIUww+iIiIyFMMPoiIiMhTDD6IiIjIUww+iIiIyFMMPoiIiMhTDD6IiIjIU/8f1lukVZ9zAngAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"for iteration in range(ni):\n",
" gradients = 2/m * Xb.T.dot(Xb.dot(theta) - y)\n",
" theta = theta - eta * gradients\n",
" Xnew = 2 * np.random.rand(100, 1)\n",
" plt.plot(X,y,'.k')\n",
" Xbw = np.c_[np.ones((100, 1)), Xnew] # add x0 = 1 to each instance\n",
" ypre = Xbw.dot(theta)\n",
" plt.plot(Xnew, ypre, '-r')"
]
}
],
"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
}