ai/lineare regression/task.ipynb

436 lines
73 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"id": "24877bfa-41a2-43ab-a77e-207b89db9f67",
"metadata": {},
"source": [
"# Lineare Regression"
]
},
{
"cell_type": "markdown",
"id": "c8ab019e-7274-43d6-95c8-54b21f42b730",
"metadata": {},
"source": [
"Trainsingsdaten:\n",
"$$\n",
"\\{(x^{(i)}, y^{(i)}); i = 1, \\dots, d \\}\n",
"$$\n",
"\n",
"$x^{(d)}$ ist dabei ein Zeilenvektor dessen Länge die Anzahl an **Features** ist. $n$ ist die Menge an **Trainsingsdaten**.\n",
"Wir haben also mehrere Beispiele von Eingaben $x^{(n)}$ und Ausgaben $y^{(n)}$.\n",
"Außerdem gilt: $x^{(0)} = (0, \\dots, 0)$ und $x_0=1$\n",
"\n",
"| Feature 1 | Fature 2 | Feature d | Result |\n",
"|-----------|----------|-----------|--------|\n",
"| $x^0_0$ | $x^1_0$ | $x^d_0$ | $y_0$ |\n",
"| $x^0_1$ | $x^1_1$ | $x^d_1$ | $y_1$ |\n",
"| $x^0_2$ | $x^1_2$ | $x^d_2$ | $y_2$ |\n",
"| .... | .... | ... | ... |\n",
"| $x^0_n$ | $x^1_n$ | $x^d_n$ | $y_n$ |\n",
"\n",
"Gesucht ist eine Funktion:\n",
"$$\n",
" h: X \\rightarrow Y\n",
"$$\n",
"Es kann die folgende Form für $h$ angenommen werden, wobei $\\vec{\\theta}$ Gewichte sind welche so berechnet werden, dass der quadratische Fehler zu allen Punkten im Datensatz möglichst gering ist. Allgemein gilt für $h$:\n",
"$$\n",
"h_\\theta(\\vec{x})=\\sum_{i=0}^{n}\\vec{\\theta}_i\\vec{x_i} = \\langle\\vec{\\theta},\\vec{x}\\rangle\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "7b6a7dd0-9389-4e27-9aeb-fc26d3e86121",
"metadata": {},
"source": [
"## Kostenfunktion\n",
"\n",
"Die Kostenfunktion gibt an wie weit $h_\\theta(x)$ von $y$ entfernt ist (least-squares cost function):\n",
"$$\n",
"J(\\vec{\\theta})=\\frac{1}{2n}\\sum_{i=1}^d\\left(h_\\theta(x^{(i)}) - y^{(i)}\\right)^2\n",
"$$\n",
"Ziel ist es die **Kostenfunktion** zu *minimieren*!\n"
]
},
{
"cell_type": "markdown",
"id": "625a9381-ca46-49f3-9913-0d9cddee5132",
"metadata": {
"jp-MarkdownHeadingCollapsed": true
},
"source": [
"\n",
"### Analytische Lösung\n",
"\n",
"Um das zu erreichen setzen wir den Gradienten der Kostenfunktion auf Null und lösen auf:\n",
"$$\n",
"\\Delta(J\\theta)= \\begin{pmatrix} \\frac{\\delta J}{\\delta \\theta_0} \\\\ \\vdots \\\\ \\frac{\\delta J}{\\delta \\theta_d} \\end{pmatrix} = 0\n",
"$$\n",
"\n",
"Dafür definieren wir $J(\\theta)$ in Matrixschreibweise:\n",
"$$\n",
"J(\\vec{\\theta})=\\frac{1}{2n}\\sum_{i=1}^d\\left(h_\\theta(\\vec{x}^{(i)}) - \\vec{y}^{(i)}\\right)^2 \\\\\n",
"= \\frac{1}{2n}(X\\vec{\\theta} - \\vec{y})^T(X\\vec{\\theta} - \\vec{y})\n",
"$$\n",
"wobei (beachte $x_0=1$) \n",
"$$\n",
"X=\\begin{bmatrix} 1 & (\\vec{x}^{(1)})^T \\\\ \\vdots & \\vdots \\\\ 1 & (\\vec{x}^{(n)})^T \\end{bmatrix} \\quad\n",
"X\\vec{\\theta} = \\begin{bmatrix} (x^{(1)})^T\\vec{\\theta} \\\\ \\vdots \\\\ (x^{(n)})^T\\vec{\\theta} \\end{bmatrix}\n",
"= \\begin{bmatrix} h_\\theta(x^{(1)}) \\\\ \\vdots \\\\ h_\\theta(x^{(n)}) \\end{bmatrix}\n",
"= \\begin{bmatrix} \\vec{\\theta}_0 + \\vec{\\theta}_1 x^{(1)} \\\\ \\vdots \\\\ \\vec{\\theta}_0 + \\vec{\\theta}_1 x^{(n)} \\end{bmatrix}\n",
"$$\n",
"\n",
"Aus dem Gradienten gleich Null:\n",
"$$\n",
"\\nabla J(\\theta) = \\frac{1}{n}(X^TX\\theta-X^T\\vec{y}) = 0\n",
"$$\n",
"folgt für die Gewichte:\n",
"$$\n",
"\\theta = (X^TX)^{-1}X^Ty\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "80c59be5-8373-4050-9c64-d5c3c8aeda15",
"metadata": {},
"source": [
"Haben wir mehr Features als Datensätze $d > n$ sind einige Features redundant und linear von einander abhängig.\n",
"$(X^TX)^{-1}$ ist dann nicht mehr invertierbar!\n",
"\n",
"Als Lösung können unnötige Features entfernt werden oder mehr Trainingsdaten gesammelt werden."
]
},
{
"cell_type": "markdown",
"id": "308e24fd-29a9-470a-a3b9-ca4b4c38c746",
"metadata": {},
"source": [
"### Programmieraufgabe (Least-Square-Error)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "77a09940-b050-4804-9454-8c43bdba5a44",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "2b468a67-b915-429c-be13-8db869b3320d",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Price</th>\n",
" <th>BuildingArea</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1035000.0</td>\n",
" <td>79.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1465000.0</td>\n",
" <td>150.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1600000.0</td>\n",
" <td>142.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>1876000.0</td>\n",
" <td>210.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>1636000.0</td>\n",
" <td>107.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13572</th>\n",
" <td>650000.0</td>\n",
" <td>79.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13573</th>\n",
" <td>635000.0</td>\n",
" <td>172.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13576</th>\n",
" <td>1031000.0</td>\n",
" <td>133.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13578</th>\n",
" <td>2500000.0</td>\n",
" <td>157.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13579</th>\n",
" <td>1285000.0</td>\n",
" <td>112.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>7130 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" Price BuildingArea\n",
"1 1035000.0 79.0\n",
"2 1465000.0 150.0\n",
"4 1600000.0 142.0\n",
"6 1876000.0 210.0\n",
"7 1636000.0 107.0\n",
"... ... ...\n",
"13572 650000.0 79.0\n",
"13573 635000.0 172.0\n",
"13576 1031000.0 133.0\n",
"13578 2500000.0 157.0\n",
"13579 1285000.0 112.0\n",
"\n",
"[7130 rows x 2 columns]"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"table = pd.read_csv('melb_data.csv', usecols=[\"BuildingArea\", \"Price\"])\n",
"table.dropna(subset=['BuildingArea'], inplace=True)\n",
"\n",
"area = np.array(table['BuildingArea'][:100])\n",
"price = np.array(table['Price'][:100])\n",
"\n",
"table"
]
},
{
"cell_type": "code",
"execution_count": 57,
"id": "72f1b01d-918c-4f4d-bb46-5df84546be44",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Axes: >"
]
},
"execution_count": 57,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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tUs7d+7UFVdcoWuuuUZvvPGGJBfdZxZsd99991lz586Neqy9vd0qLCy01q1bF/7dW2+9ZUmytm/fbtMZOo8ka/369eF/Dw4OWhMnTrT+5V/+Jfy79vZ2q7i42Fq7dq1lWZb15ptvWpKs119/PfyYF154wfJ4PNY777xj27lnyvBrZlmWtWzZMuuaa66J+Te5fs0sy7JaW1stSdaWLVssy0rsM/mrX/3KysvLs44fPx5+zGOPPWZ5vV6rt7fX3jeQIcOvm2VZ1sc+9jHrzjvvjPk3XDfLqqystP7zP//TVfcZLRYZcuDAAdXW1mr69Om66aabdPjwYUnSrl271NfXp0WLFoUfe/7552vq1Knavn17pk7XcQ4dOqTjx49HXCefz6dLLrkkfJ22b9+uiooKffjDHw4/ZtGiRcrLy9OOHTtsP2en2Lx5s2pqajRr1izdfvvtOnHiRPgY10zy+/2SpAkTJkhK7DO5fft2zZkzR2effXb4MZ/4xCcUCATCtVG3G37dQn7+85+rurpas2fP1qpVq9TV1RU+lsvXbWBgQE8//bROnz6txsZGV91ntm9CBumSSy7RE088oVmzZunYsWO6//77demll2rfvn06fvy4ioqKVFFREfE3Z599to4fP56ZE3ag0LUY+gEL/Tt07Pjx46qpqYk4XlBQoAkTJuTstVy8eLGuv/561dXV6eDBg/rKV76iJUuWaPv27crPz8/5azY4OKi77rpLTU1Nmj17tiQl9Jk8fvx41HsxdMztol03SfqHf/gHTZs2TbW1tdqzZ4/uuece7d+/X88++6yk3Lxue/fuVWNjo3p6elReXq7169frggsu0O7du11znxEsMmDJkiXh/25oaNAll1yiadOm6b//+79VUlKSwTOD2/393/99+L/nzJmjhoYGzZgxQ5s3b9bChQszeGbOsGLFCu3bty9izBPii3Xdho7NmTNnjiZNmqSFCxfq4MGDmjFjht2n6QizZs3S7t275ff79Ytf/ELLli3Tli1bMn1aRtEV4gAVFRU677zz1NLSookTJyoYDKq9vT3iMe+++64mTpyYmRN0oNC1GD5ieuh1mjhxolpbWyOO9/f36+TJk1zLv5o+fbqqq6vV0tIiKbev2cqVK7Vx40a98sormjx5cvj3iXwmJ06cGPVeDB1zs1jXLZpLLrlEkiLut1y7bkVFRaqvr9dFF12k1atXa+7cufrXf/1XV91nBAsH6Ozs1MGDBzVp0iRddNFFKiws1Msvvxw+vn//fh0+fFiNjY0ZPEtnqaur08SJEyOuUyAQ0I4dO8LXqbGxUe3t7dq1a1f4MZs2bdLg4GD4Cy7X/eUvf9GJEyc0adIkSbl5zSzL0sqVK7V+/Xpt2rRJdXV1EccT+Uw2NjZq7969EaHspZdektfr1QUXXGDPG7FZvOsWze7duyUp4n7Ltes23ODgoHp7e911n2V69Ggu+tKXvmRt3rzZOnTokPXaa69ZixYtsqqrq63W1lbLsizrtttus6ZOnWpt2rTJ2rlzp9XY2Gg1NjZm+Kzt19HRYTU3N1vNzc2WJOuRRx6xmpubrbffftuyLMtas2aNVVFRYT333HPWnj17rGuuucaqq6uzuru7w8+xePFia968edaOHTusbdu2WTNnzrSWLl2aqbeUdqNds46ODuvuu++2tm/fbh06dMj6zW9+Y33oQx+yZs6cafX09ISfI9eu2e233275fD5r8+bN1rFjx8I/XV1d4cfE+0z29/dbs2fPtq688kpr9+7d1v/8z/9YZ511lrVq1apMvCVbxLtuLS0t1re+9S1r586d1qFDh6znnnvOmj59urVgwYLwc+Tadbv33nutLVu2WIcOHbL27Nlj3XvvvZbH47FefPFFy7Lcc58RLDLg05/+tDVp0iSrqKjIOuecc6xPf/rTVktLS/h4d3e39fnPf96qrKy0SktLreuuu846duxYBs84M1555RVL0oifZcuWWZZ1Zsrp17/+devss8+2iouLrYULF1r79++PeI4TJ05YS5cutcrLyy2v12vdcsstVkdHRwbejT1Gu2ZdXV3WlVdeaZ111llWYWGhNW3aNOvWW2+NmLpmWbl3zaJdL0nW448/Hn5MIp/JP//5z9aSJUuskpISq7q62vrSl75k9fX12fxu7BPvuh0+fNhasGCBNWHCBKu4uNiqr6+3vvzlL1t+vz/ieXLpui1fvtyaNm2aVVRUZJ111lnWwoULw6HCstxzn7FtOgAAMIYxFgAAwBiCBQAAMIZgAQAAjCFYAAAAYwgWAADAGIIFAAAwhmABAACMIVgAAABjCBYAAMAYggUAADCGYAEAAIwhWAAAAGP+P/x/MxmeLqsJAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"\n",
"fig, ax = plt.subplots()\n",
"sns.scatterplot(x=area, y=price, ax=ax)"
]
},
{
"cell_type": "code",
"execution_count": 62,
"id": "d59dd0f8-aed5-4980-9f66-150b99a436f5",
"metadata": {},
"outputs": [],
"source": [
"# Create one feature array for \"building area\".\n",
"# Prepend x_0 = 1\n",
"X=[]\n",
"for row in area:\n",
" X.append([1, row])\n",
"\n",
"X = np.array(X)\n",
"Y = np.array(price)"
]
},
{
"cell_type": "code",
"execution_count": 70,
"id": "12229c95-72c8-4182-b17a-10c831c41439",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Axes: >"
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Solve for theta with least-square method.\n",
"theta = np.linalg.solve(X.T @ X, X.T @ Y)\n",
"\n",
"# Plot solution.\n",
"fig, ax = plt.subplots()\n",
"sns.scatterplot(x=area, y=price, ax=ax)\n",
"sns.lineplot(x=[min(area), max(area)], y=[theta[0] + theta[1] * min(area), theta[0] + theta[1] * max(area)], ax=ax, color='red') "
]
},
{
"cell_type": "markdown",
"id": "e3887ea2-b7a0-4d01-a332-d1f73c3d1f6b",
"metadata": {},
"source": [
"### Numerische Lösung mit Gradient Descent\n",
"\n",
"Numerische Minimierung von $J(\\theta)$.\n",
"\n",
"Wir fange bei beliebigen $\\theta$ an und führen iterativ folgende Operation auf $\\theta$ aus:\n",
"$$\n",
"\\theta \\leftarrow \\theta - \\alpha \\nabla J(\\theta)\n",
"$$\n",
"\n",
"Die Lernrate $\\alpha$ bestimmt wie schnell wir dem Gradienten folgen. $\\nabla J(\\theta)$ ist der Gradient also die partielle Ableitung nach jedem einzelnen Feature.\n",
"\n",
"$\\alpha$ sollte ein sehr kleiner Wert sein!"
]
},
{
"cell_type": "code",
"execution_count": 258,
"id": "984c198b-ab5a-47bd-aba7-89642cc0411a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Axes: >"
]
},
"execution_count": 258,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAGsCAYAAACB/u5dAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAARHpJREFUeJzt3Xl8lNXd//93FhISQsIS9s2wKkKAoiKCVAUVXH4IuIC0ICgoBGtvuyi9e9fauy3aqt/eioKKgFhERVkqrSsICCIKBAEXBERAAVmzL5Pl+v1xTEIgk5lJrtmueT0fjzweeGYyObmcyfW+zjnX50RZlmUJAADABtHB7gAAAHAOggUAALANwQIAANiGYAEAAGxDsAAAALYhWAAAANsQLAAAgG0IFgAAwDYECwAAYBuCBQAAsE3QgsX69et14403qm3btoqKitKKFSt8fg3LsvTYY4+pe/fuio+PV7t27fSXv/zF/s4CAACvxAbrB+fn56tPnz6aPHmyRo8eXafXuO+++/Tuu+/qscceU+/evXXq1CmdOnXK5p4CAABvRYXCJmRRUVFavny5brrppsq24uJi/fd//7eWLFmirKws9erVS48++qiuuOIKSdKXX36p9PR07dq1Sz169AhOxwEAQDUhu8ZixowZ2rRpk1555RXt2LFDt9xyi4YPH649e/ZIkt5880117txZq1atUlpams477zzdddddjFgAABBEIRksDh48qAULFmjp0qW6/PLL1aVLF/3617/W4MGDtWDBAknSN998owMHDmjp0qVatGiRFi5cqK1bt+rmm28Ocu8BAIhcQVtjUZudO3eqrKxM3bt3r9ZeXFys5s2bS5LKy8tVXFysRYsWVT7vhRdeUP/+/bV7926mRwAACIKQDBZ5eXmKiYnR1q1bFRMTU+2xpKQkSVKbNm0UGxtbLXxccMEFksyIB8ECAIDAC8lg0a9fP5WVlenYsWO6/PLLa3zOoEGDVFpaqn379qlLly6SpK+//lqS1KlTp4D1FQAAVAnaXSF5eXnau3evJBMknnjiCV155ZVq1qyZOnbsqJ/97GfauHGjHn/8cfXr10/Hjx/X6tWrlZ6eruuvv17l5eW6+OKLlZSUpH/84x8qLy9XRkaGkpOT9e677wbjVwIAIOIFLVisXbtWV1555TntEydO1MKFC1VSUqI///nPWrRokb7/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nzNs2DBFR0dr8+bNAe9zqFi7dq1atmypHj16aNq0aTp58mTlYxwzKTs7W5LUrFkzSd59Jjdt2qTevXtX2+X52muvVU5OTuXVqNOdfdwqLF68WKmpqerVq5dmzpypgoKCysci+biVlZXplVdeUX5+vgYOHOio91nANyGDNGDAAC1cuFA9evTQkSNH9PDDD+vyyy/Xrl27dPToUcXFxalJkybVvqdVq1Y6evRocDocgiqOxZkfsIr/rnjs6NGjatmyZbXHY2Nj1axZs4g9lsOHD9fo0aOVlpamffv26Xe/+51GjBihTZs2KSYmJuKPWXl5uX75y19q0KBB6tWrlyR59Zk8evRoje/FisecrqbjJkm33367OnXqpLZt22rHjh164IEHtHv3bi1btkxSZB63nTt3auDAgSoqKlJSUpKWL1+unj17avv27Y55nxEsgmDEiBGV/05PT9eAAQPUqVMnvfbaa0pISAhiz+B0Y8eOrfx37969lZ6eri5dumjt2rUaOnRoEHsWGjIyMrRr165qa57gmbvjdubanN69e6tNmzYaOnSo9u3bpy5dugS6myGhR48e2r59u7Kzs/X6669r4sSJWrduXbC7ZSumQkJAkyZN1L17d+3du1etW7eWy+VSVlZWtef88MMPat26dXA6GIIqjsXZK6bPPE6tW7fWsWPHqj1eWlqqU6dOcSx/1LlzZ6Wmpmrv3r2SIvuYzZgxQ6tWrdIHH3yg9u3bV7Z785ls3bp1je/FiseczN1xq8mAAQMkqdr7LdKOW1xcnLp27ar+/ftr1qxZ6tOnj/7v//7PUe8zgkUIyMvL0759+9SmTRv1799fDRo00OrVqysf3717tw4ePKiBAwcGsZehJS0tTa1bt652nHJycrR58+bK4zRw4EBlZWVp69atlc9Zs2aNysvLK//ARbrvvvtOJ0+eVJs2bSRF5jGzLEszZszQ8uXLtWbNGqWlpVV73JvP5MCBA7Vz585qoey9995TcnKyevbsGZhfJMA8HbeabN++XZKqvd8i7bidrby8XMXFxc56nwV79Wgk+tWvfmWtXbvW2r9/v7Vx40Zr2LBhVmpqqnXs2DHLsizrnnvusTp27GitWbPG2rJlizVw4EBr4MCBQe514OXm5lqZmZlWZmamJcl64oknrMzMTOvAgQOWZVnWI488YjVp0sRauXKltWPHDmvkyJFWWlqaVVhYWPkaw4cPt/r162dt3rzZ2rBhg9WtWzdr3LhxwfqV/K62Y5abm2v9+te/tjZt2mTt37/fev/9962f/OQnVrdu3ayioqLK14i0YzZt2jQrJSXFWrt2rXXkyJHKr4KCgsrnePpMlpaWWr169bKuueYaa/v27dbbb79ttWjRwpo5c2YwfqWA8HTc9u7da/3pT3+ytmzZYu3fv99auXKl1blzZ2vIkCGVrxFpx+3BBx+01q1bZ+3fv9/asWOH9eCDD1pRUVHWu+++a1mWc95nBIsguO2226w2bdpYcXFxVrt27azbbrvN2rt3b+XjhYWF1vTp062mTZtaiYmJ1qhRo6wjR44EscfB8cEHH1iSzvmaOHGiZVnmltP/+Z//sVq1amXFx8dbQ4cOtXbv3l3tNU6ePGmNGzfOSkpKspKTk61JkyZZubm5QfhtAqO2Y1ZQUGBdc801VosWLawGDRpYnTp1sqZMmVLt1jXLirxjVtPxkmQtWLCg8jnefCa//fZba8SIEVZCQoKVmppq/epXv7JKSkoC/NsEjqfjdvDgQWvIkCFWs2bNrPj4eKtr167Wb37zGys7O7va60TScZs8ebLVqVMnKy4uzmrRooU1dOjQylBhWc55n7FtOgAAsA1rLAAAgG0IFgAAwDYECwAAYBuCBQAAsA3BAgAA2IZgAQAAbEOwAAAAtiFYAAAA2xAsAACAbQgWAADANgQLAABgG4IFAACwzf8PIaqicrNfl7YAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def gradient_descent(alpha, theta):\n",
" return theta + sum([(Y[i] - theta * X[i]) * X[i] for i in range(1, len(X))]) / len(X) * alpha\n",
"\n",
"# Initial value of theta doesn't matter.\n",
"theta = [0, 0]\n",
"# This is basically a magic number.\n",
"# Make sure to set this to a small value otherwise it will not converge.\n",
"alpha = 1e-6\n",
"\n",
"for i in range(300):\n",
" theta = gradient_descent(alpha, theta)\n",
"\n",
"# Plot solution.\n",
"fig, ax = plt.subplots()\n",
"sns.scatterplot(x=area, y=price, ax=ax)\n",
"sns.lineplot(x=[min(area), max(area)], y=[theta[0] + theta[1] * min(area), theta[0] + theta[1] * max(area)], ax=ax, color='red') "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e9d6a2f7-af43-4032-bac8-381db91d37c8",
"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.11.11"
}
},
"nbformat": 4,
"nbformat_minor": 5
}