📄 linear_regression.ipynb
/home/palash/git/misc/ml/linear_regression.ipynb
Language: ipynb • Lines: 221
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "aeb76e59-7eaf-45a0-93d5-5b0da5eaefc8",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "fb2a5b02-1480-461d-bfcf-cc2b4c6403fb",
   "metadata": {},
   "outputs": [],
   "source": [
    "a = [2,3,-0.5]\n",
    "b = 200"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "079df699-901f-4058-b6a3-dc76668c407e",
   "metadata": {},
   "outputs": [],
   "source": [
    "rooms = np.random.randint(low=1, high=80,size=20)\n",
    "area = np.random.randint(low=1440, high=3600,size=20)\n",
    "school_distance = np.random.randint(low=100, high=1000,size=20)\n",
    "x = np.array([rooms, area, school_distance])\n",
    "x = np.transpose(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "1cafb5e3-7dfa-4332-a034-21af62cf9774",
   "metadata": {},
   "outputs": [],
   "source": [
    "rooms = np.unique(rooms)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "8da3c617-fa24-44f7-ad02-b4dfd1309b72",
   "metadata": {},
   "outputs": [],
   "source": [
    "y = rooms.dot(a[0]) + b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "2ce2e483-6c77-4f8b-ae87-2bd3b9007d68",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi0AAAGgCAYAAABmL1fpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAzDElEQVR4nO3df3RU9Z3/8dckIQk/MhNDHSYUgqlYcAygIOCAtV3lRzCyWOm2bvkRLfUHm1jRXb6QVkX02FB11+KuG3bbiuxBlirbqGFLaGokXWskCEQTUVTMEVpmCG0OMxFMgMzn+wfN1DFBmUnI5M48H+fc0869n7nz+XRs5uX93Pv+2IwxRgAAAP1cUqw7AAAAcC4ILQAAwBIILQAAwBIILQAAwBIILQAAwBIILQAAwBIILQAAwBIILQAAwBIILQAAwBIILQAAwBIiCi1lZWUaP3687Ha77Ha7PB6Ptm3bFtamtrZW1157rQYPHiy73a5rrrlGn3zySeh4S0uLFixYILvdrszMTC1ZskQff/xx74wGAADELVskaw9VVFQoOTlZl1xyiYwx2rBhgx577DHt3btXl112mWpra5Wfn6+SkhLNnTtXKSkpevPNNzVv3jylpaVJkubMmSOv16v/+I//0KlTp3Trrbdq8uTJ2rRp0zl3OhgM6vDhw8rIyJDNZot81AAAoM8ZY9Ta2qrhw4crKSmKyR7TQxdccIH5+c9/bowxZurUqea+++47a9t9+/YZSWbXrl2hfdu2bTM2m8388Y9/POfPPHTokJHExsbGxsbGZsHt0KFDUWWOFEWpo6NDzz//vI4fPy6Px6Pm5mbt3LlTCxYs0LRp03TgwAGNHTtWjzzyiK6++mpJZ6aOMjMzdeWVV4bOM2PGDCUlJWnnzp365je/2e1ntbe3q729PfTa/OXi0KFDh2S326MdAgAA6EOBQEAjR45URkZGVO+POLQ0NDTI4/Gora1NQ4YMUXl5udxut15//XVJ0oMPPqjHH39cl19+uf7rv/5L1113nRobG3XJJZfI5/PJ6XSGdyAlRVlZWfL5fGf9zNLSUq1evbrL/s57awAAgHVEe2tHxBNKY8aMUX19vXbu3KmlS5eqsLBQ+/btUzAYlCTdcccduvXWW3XFFVfoiSee0JgxY/T0009H1blOJSUl8vv9oe3QoUM9Oh8AALCeiK+0pKamavTo0ZKkSZMmadeuXVq7dq1WrlwpSXK73WHtL730Uh08eFCS5HK51NzcHHb89OnTamlpkcvlOutnpqWlhW7kBQAAianHdVqCwaDa29t10UUXafjw4dq/f3/Y8ffee0+jRo2SJHk8Hh07dky7d+8OHa+urlYwGNTUqVN72hUAABDHIrrSUlJSojlz5ignJ0etra3atGmTduzYoe3bt8tms2n58uVatWqVJkyYoMsvv1wbNmzQu+++qy1btkg6c9UlPz9ft912m9atW6dTp06puLhYN998s4YPH35eBggAAOJDRKGlublZixcvltfrlcPh0Pjx47V9+3bNnDlTkrRs2TK1tbXpnnvuUUtLiyZMmKCqqipdfPHFoXM8++yzKi4u1nXXXaekpCTNnz9fTz75ZO+OCgAAxJ2Iisv1F4FAQA6HQ36/n6eHAACwiJ7+frP2EAAAsARCCwAAsISoK+ICAID40xE0qmtqUXNrm5wZ6ZqSm6XkpP6xzh+hBQAASJIqG71aXbFPXn9baF+2I12r5rqVn5cdw56dwfQQAABQZaNXSzfuCQsskuTzt2npxj2qbPTGqGd/RWgBACDBdQSNVlfsU3ePE3fuW12xTx3B2D5wTGgBACDB1TW1dLnC8mlGktffprqmlr7rVDcILQAAJLjm1rMHlmjanS+EFgAAEpwzI71X250vhBYAABLclNwsZTvSdbYHm2068xTRlNysvuxWF4QWAAASXHKSTavmuiWpS3DpfL1qrjvm9VoILQAAQPl52SpbOFEuR/gUkMuRrrKFE/tFnRaKywEAAElngstMt4uKuAAAoP9LTrLJc/HQWHejW0wPAQAASyC0AAAAS2B6CAAAi+vPKzP3JkILAAAW1t9XZu5NTA8BAGBRVliZuTcRWgAAsCCrrMzcmwgtAABYkFVWZu5NhBYAACzIKisz9yZCCwAAFmSVlZl7E6EFAAALssrKzL2J0AIAgAVZZWXm3kRoAQDAoqywMnNvorgcAAD9SKTVbfv7ysy9idACAEA/EW112/68MnNvYnoIAIB+INGq20aD0AIAQIwlYnXbaDA9BABADHz63pU/tbafc3XbRJgGOhtCCwAAfay7e1fORTxVt40GoQUAgD7Uee9KNBM98VTdNhqEFgAA+sjn3bvyeWw6U3slnqrbRoMbcQEA6CNftDJzd+K1um00uNICAEAfieaeFNc51GlJFBFdaSkrK9P48eNlt9tlt9vl8Xi0bdu2Lu2MMZozZ45sNpteeOGFsGMHDx5UQUGBBg0aJKfTqeXLl+v06dM9GgQAAFZwrvek3F9wqdbefLn++7ar9OqKawksfxHRlZYRI0ZozZo1uuSSS2SM0YYNGzRv3jzt3btXl112WajdT3/6U9lsXS9hdXR0qKCgQC6XS6+99pq8Xq8WL16sAQMG6Mc//nHPRwMAQD/WuTKzz9/W7X0tnfeu3DI9N+GngroT0ZWWuXPn6vrrr9cll1yir371q3rkkUc0ZMgQvf7666E29fX1+ud//mc9/fTTXd7/m9/8Rvv27dPGjRt1+eWXa86cOXr44Yf11FNP6eTJkz0fDQAA/Vgirszcm6K+Ebejo0ObN2/W8ePH5fF4JEknTpzQd7/7XT311FNyuVxd3lNbW6tx48Zp2LBhoX2zZ89WIBDQ22+/fdbPam9vVyAQCNsAALCiRFuZuTdFfCNuQ0ODPB6P2traNGTIEJWXl8vtPpMa77nnHk2bNk3z5s3r9r0+ny8ssEgKvfb5fGf9zNLSUq1evTrSrgIA0CdYmblvRBxaxowZo/r6evn9fm3ZskWFhYWqqanRBx98oOrqau3du7fXO1lSUqJ777039DoQCGjkyJG9/jkAAESKlZn7TsShJTU1VaNHj5YkTZo0Sbt27dLatWs1cOBAHThwQJmZmWHt58+fr6997WvasWOHXC6X6urqwo4fOXJEkrqdTuqUlpamtLS0SLsKAMB5dbbqtp0rMzPd07t6XFwuGAyqvb1dK1eu1FtvvaX6+vrQJklPPPGE1q9fL0nyeDxqaGhQc3Nz6P1VVVWy2+2hKSYAAKyAlZn7XkRXWkpKSjRnzhzl5OSotbVVmzZt0o4dO7R9+3a5XK5ur5bk5OQoNzdXkjRr1iy53W4tWrRIjz76qHw+n+677z4VFRVxJQUAYClfVN2WlZl7X0Shpbm5WYsXL5bX65XD4dD48eO1fft2zZw585zen5ycrK1bt2rp0qXyeDwaPHiwCgsL9dBDD0XVeQAAYuVcq9sm+srMvSmi0PKLX/wiopMb0/WS2KhRo/TrX/86ovMAANDfnGt120Rfmbk3sWAiAABR6Kxue7aHlG068xRRoq/M3JsILQAARIHqtn2P0AIAQJSobtu3Iq7TAgAA/orqtn2H0AIAQA9R3bZvMD0EAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsgdACAAAsIaLQUlZWpvHjx8tut8tut8vj8Wjbtm2SpJaWFt11110aM2aMBg4cqJycHP3gBz+Q3+8PO8fBgwdVUFCgQYMGyel0avny5Tp9+nTvjQgA0O90BI1qD/xZL9b/UbUH/qyOoIl1l2BBKZE0HjFihNasWaNLLrlExhht2LBB8+bN0969e2WM0eHDh/X444/L7Xbro48+0p133qnDhw9ry5YtkqSOjg4VFBTI5XLptddek9fr1eLFizVgwAD9+Mc/Pi8DBADEVmWjV6sr9snrbwvty3aka9Vct/LzsmPYM1iNzRjTo7iblZWlxx57TEuWLOly7Pnnn9fChQt1/PhxpaSkaNu2bbrhhht0+PBhDRs2TJK0bt06rVixQkePHlVqauo5fWYgEJDD4ZDf75fdbu9J9wEA51Flo1dLN+7RZ39obH/5z7KFEwkuCaSnv99R39PS0dGhzZs36/jx4/J4PN226exUSsqZCzq1tbUaN25cKLBI0uzZsxUIBPT2229H2xUAQD/UETRaXbGvS2CRFNq3umIfU0U4ZxFND0lSQ0ODPB6P2traNGTIEJWXl8vtdndp96c//UkPP/ywbr/99tA+n88XFlgkhV77fL6zfmZ7e7va29tDrwOBQKTdBgD0gY6gUV1Ti5pb2/Sn1vawKaHPMpK8/jbVNbXIc/HQvuskLCvi0DJmzBjV19fL7/dry5YtKiwsVE1NTVhwCQQCKigokNvt1oMPPtjjTpaWlmr16tU9Pg8A4Pzp7t6Vc9HcGll7JK6Ip4dSU1M1evRoTZo0SaWlpZowYYLWrl0bOt7a2qr8/HxlZGSovLxcAwYMCB1zuVw6cuRI2Pk6X7tcrrN+ZklJifx+f2g7dOhQpN0GAJxHnfeuRBpYJMmZkX4eeoR41OM6LcFgMDR1EwgENGvWLKWmpuqll15Senr4P4gej0cNDQ1qbm4O7auqqpLdbu92iqlTWlpa6DHrzg0A0D983r0rn8emM08RTcnNOh/dQhyKaHqopKREc+bMUU5OjlpbW7Vp0ybt2LFD27dvDwWWEydOaOPGjQoEAqF7Ty688EIlJydr1qxZcrvdWrRokR599FH5fD7dd999KioqUlpa2nkZIADg/Kpraon4Ckvn00Or5rqVnGT73LZAp4hCS3NzsxYvXiyv1yuHw6Hx48dr+/btmjlzpnbs2KGdO3dKkkaPHh32vqamJl100UVKTk7W1q1btXTpUnk8Hg0ePFiFhYV66KGHem9EAIA+Fc09KS7qtCAKPa7TEgvUaQGA/qP2wJ/19z97/Qvb3V9wqb6UkSZnxpkpIa6wJJ6e/n5H/PQQAACfNiU3S9mOdPn8bd3e12LTmSsrt0zPJaigR1gwEQDQI8lJNq2ae+Zhis9GEu5dQW8itAAAeiw/L1tlCyfK5Qh/atTlSKdUP3oN00MAgF6Rn5etmW5XqCIu966gtxFaAAC9JjnJRkl+nDdMDwEAAEsgtAAAAEsgtAAAAEsgtAAAAEsgtAAAAEsgtAAAAEsgtAAAAEugTgsAJIiOoKHwGyyN0AIACaCy0avVFfvk9beF9mU70rVqrpsS+7AMpocAIM5VNnq1dOOesMAiST5/m5Zu3KPKRm+MegZEhtACAHGsI2i0umKfTDfHOvetrtinjmB3LYD+hdACAHGsrqmlyxWWTzOSvP421TW19F2ngCgRWgAgjjW3nj2wRNMOiCVCCwDEMWdGeq+2A2KJ0AIAcWxKbpayHek624PNNp15imhKblZfdguICqEFAOJYcpJNq+a6JalLcOl8vWqum3otsARCCwDEufy8bJUtnCiXI3wKyOVIV9nCidRpgWVQXA4AEkB+XrZmul1UxIWlEVoAIEEkJ9nkuXhorLsBRI3pIQAAYAmEFgAAYAmEFgAAYAmEFgAAYAmEFgAAYAmEFgAAYAmEFgAAYAnUaQGAfqAjaCj8BnwBQgsAxFhlo1erK/bJ628L7ct2pGvVXDcl9oFPYXoIAGKostGrpRv3hAUWSfL527R04x5VNnpj1DOg/yG0AECMdASNVlfsk+nmWOe+1RX71BHsrgWQeJgeAoA+8tn7VoLGdLnC8mlGktffprqmFtYMAhThlZaysjKNHz9edrtddrtdHo9H27ZtCx1va2tTUVGRhg4dqiFDhmj+/Pk6cuRI2DkOHjyogoICDRo0SE6nU8uXL9fp06d7ZzQA0E9VNnp19U+q9fc/e113b67X3//sdRU9u+ec3tvcevZgAySSiELLiBEjtGbNGu3evVtvvPGGrr32Ws2bN09vv/22JOmee+5RRUWFnn/+edXU1Ojw4cO66aabQu/v6OhQQUGBTp48qddee00bNmzQM888owceeKB3RwUA/cjZ7ls59smpc3q/MyP9fHQLsBybMaZHk6VZWVl67LHH9K1vfUsXXnihNm3apG9961uSpHfffVeXXnqpamtrddVVV2nbtm264YYbdPjwYQ0bNkyStG7dOq1YsUJHjx5VamrqOX1mIBCQw+GQ3++X3W7vSfcB4LzqCBpd/ZPqz50GOhubJJcjXa+uuJbHnxEXevr7HfWNuB0dHdq8ebOOHz8uj8ej3bt369SpU5oxY0aozdixY5WTk6Pa2lpJUm1trcaNGxcKLJI0e/ZsBQKB0NWa7rS3tysQCIRtAGAFdU0tUQcWSVo1101gAf4i4tDS0NCgIUOGKC0tTXfeeafKy8vldrvl8/mUmpqqzMzMsPbDhg2Tz+eTJPl8vrDA0nm889jZlJaWyuFwhLaRI0dG2m0AiIlzvR8lc+CAsNcuR7rKFk6kTgvwKRE/PTRmzBjV19fL7/dry5YtKiwsVE1NzfnoW0hJSYnuvffe0OtAIEBwAWAJ53o/ylPfnaikJBsVcYHPEXFoSU1N1ejRoyVJkyZN0q5du7R27Vp95zvf0cmTJ3Xs2LGwqy1HjhyRy+WSJLlcLtXV1YWdr/Ppos423UlLS1NaWlqkXQWAmJuSm6VsR7p8/rZu67F03rdy1cVDCSnAF+hxcblgMKj29nZNmjRJAwYM0Msvvxw6tn//fh08eFAej0eS5PF41NDQoObm5lCbqqoq2e12ud3unnYFAPqd5CSbVs098/fts5GE+1aAyER0paWkpERz5sxRTk6OWltbtWnTJu3YsUPbt2+Xw+HQkiVLdO+99yorK0t2u1133XWXPB6PrrrqKknSrFmz5Ha7tWjRIj366KPy+Xy67777VFRUxJUUAHErPy9bZQsndllfyMX6QkBEIgotzc3NWrx4sbxerxwOh8aPH6/t27dr5syZkqQnnnhCSUlJmj9/vtrb2zV79mz9+7//e+j9ycnJ2rp1q5YuXSqPx6PBgwersLBQDz30UO+OCgD6mfy8bM10u1jJGeiBHtdpiQXqtAAAYD0xq9MCAADQlwgtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAElJi3QEA6ImOoFFdU4uaW9vkzEjXlNwsJSfZYt0tAOcBoQWAZVU2erW6Yp+8/rbQvmxHulbNdSs/LzuGPQNwPjA9BMCSKhu9WrpxT1hgkSSfv01LN+5RZaM3Rj0DcL4QWgBYTkfQaHXFPplujnXuW12xTx3B7loAsCpCCwDLqWtq6XKF5dOMJK+/TXVNLX3XKQDnHaEFgOU0t549sETTDoA1EFoAWI4zI71X2wGwBkILAMuZkpulbEe6zvZgs01nniKakpvVl90CcJ4RWgBYTnKSTavmuiWpS3DpfL1qrpt6LUCcIbQAsKT8vGyVLZwolyN8CsjlSFfZwonUaQHiEMXlAFhWfl62ZrpdVMQFEgShBYClJSfZ5Ll4aKy7AaAPMD0EAAAsgdACAAAsgdACAAAsIaLQUlpaqsmTJysjI0NOp1M33nij9u/fH9bG5/Np0aJFcrlcGjx4sCZOnKj/+Z//CWvT0tKiBQsWyG63KzMzU0uWLNHHH3/c89EAAIC4FVFoqampUVFRkV5//XVVVVXp1KlTmjVrlo4fPx5qs3jxYu3fv18vvfSSGhoadNNNN+nb3/629u7dG2qzYMECvf3226qqqtLWrVv1u9/9TrfffnvvjQoAAMQdmzEm6mVQjx49KqfTqZqaGl1zzTWSpCFDhqisrEyLFi0KtRs6dKh+8pOf6Pvf/77eeecdud1u7dq1S1deeaUkqbKyUtdff73+8Ic/aPjw4V/4uYFAQA6HQ36/X3a7PdruAwCAPtTT3+8e3dPi9/slSVlZfy2VPW3aNP3yl79US0uLgsGgNm/erLa2Nn3jG9+QJNXW1iozMzMUWCRpxowZSkpK0s6dO7v9nPb2dgUCgbANAAAklqhDSzAY1LJlyzR9+nTl5eWF9j/33HM6deqUhg4dqrS0NN1xxx0qLy/X6NGjJZ2558XpdIadKyUlRVlZWfL5fN1+VmlpqRwOR2gbOXJktN0GAAAWFXVoKSoqUmNjozZv3hy2//7779exY8f029/+Vm+88Ybuvfdeffvb31ZDQ0PUnSwpKZHf7w9thw4divpcAADAmqKqiFtcXBy6gXbEiBGh/QcOHNC//du/qbGxUZdddpkkacKECfq///s/PfXUU1q3bp1cLpeam5vDznf69Gm1tLTI5XJ1+3lpaWlKS0uLpqsAACBORHSlxRij4uJilZeXq7q6Wrm5uWHHT5w4ceakSeGnTU5OVjAYlCR5PB4dO3ZMu3fvDh2vrq5WMBjU1KlToxoEAACIfxFdaSkqKtKmTZv04osvKiMjI3QPisPh0MCBAzV27FiNHj1ad9xxhx5//HENHTpUL7zwQujRZkm69NJLlZ+fr9tuu03r1q3TqVOnVFxcrJtvvvmcnhwCAACJKaJHnm227ldOXb9+vW655RZJ0vvvv6+VK1fq1Vdf1ccff6zRo0frn/7pn8IegW5paVFxcbEqKiqUlJSk+fPn68knn9SQIUPOqR888gwAgPX09Pe7R3VaYoXQAgCA9cS0TgsAAEBfIbQAAABLILQAAABLILQAAABLILQAAABLILQAAABLILQAAABLILQAAABLILQAAABLILQAAABLILQAAABLiGiVZwDxoyNoVNfUoubWNjkz0jUlN0vJSd0vigoA/QGhBUhAlY1era7YJ6+/LbQv25GuVXPdys/LjmHPAODsmB4CEkxlo1dLN+4JCyyS5PO3aenGPaps9MaoZwDw+QgtQALpCBqtrtgn082xzn2rK/apI9hdCwCILUILkEDqmlq6XGH5NCPJ629TXVNL33UKAM4RoQVIIM2tZw8s0bQDgL5EaAESiDMjvVfbAUBfIrQACWRKbpayHek624PNNp15imhKblZfdgsAzgmhBUggyUk2rZrrlqQuwaXz9aq5buq1AOiXCC1AgsnPy1bZwolyOcKngFyOdJUtnEidFgD9FsXlgDgQaXXb/LxszXS7qIgLwFIILYDFRVvdNjnJJs/FQ/uiiwDQK5geAiyM6rYAEgmhBbAoqtsCSDSEFsCiqG4LINEQWgCLorotgERDaAEsiuq2ABINoQWwKKrbAkg0hBbAoqhuCyDREFoAC6O6LYBEQnE5wOKobgsgURBagDhAdVsAiYDpIQAAYAmEFgAAYAkRhZbS0lJNnjxZGRkZcjqduvHGG7V///4u7Wpra3Xttddq8ODBstvtuuaaa/TJJ5+Ejre0tGjBggWy2+3KzMzUkiVL9PHHH/d8NICFdASNag/8WS/W/1G1B/5MuX0A+AIR3dNSU1OjoqIiTZ48WadPn9YPf/hDzZo1S/v27dPgwYMlnQks+fn5Kikp0b/+678qJSVFb775ppKS/pqPFixYIK/Xq6qqKp06dUq33nqrbr/9dm3atKl3Rwf0U9GuzAwAicxmjIn6X++OHj0qp9OpmpoaXXPNNZKkq666SjNnztTDDz/c7Xveeecdud1u7dq1S1deeaUkqbKyUtdff73+8Ic/aPjw4V/4uYFAQA6HQ36/X3a7PdruAzHRuTLzZ/+P1/msD48qA4hXPf397tE9LX6/X5KUlXWm4mZzc7N27twpp9OpadOmadiwYfr617+uV199NfSe2tpaZWZmhgKLJM2YMUNJSUnauXNnT7oD9HuszAwA0Ys6tASDQS1btkzTp09XXl6eJOnDDz+UJD344IO67bbbVFlZqYkTJ+q6667T+++/L0ny+XxyOp1h50pJSVFWVpZ8Pl+3n9Xe3q5AIBC2AVbEyswAEL2oQ0tRUZEaGxu1efPm0L5gMChJuuOOO3Trrbfqiiuu0BNPPKExY8bo6aefjrqTpaWlcjgcoW3kyJFRnwuIJVZmBoDoRRVaiouLtXXrVr3yyisaMWJEaH929pl5eLfbHdb+0ksv1cGDByVJLpdLzc3NYcdPnz6tlpYWuVyubj+vpKREfr8/tB06dCiabgMxx8rMABC9iEKLMUbFxcUqLy9XdXW1cnNzw45fdNFFGj58eJfHoN977z2NGjVKkuTxeHTs2DHt3r07dLy6ulrBYFBTp07t9nPT0tJkt9vDNsCKWJkZAKIXUWgpKirSxo0btWnTJmVkZMjn88nn84VqsNhsNi1fvlxPPvmktmzZog8++ED333+/3n33XS1ZskTSmasu+fn5uu2221RXV6ff//73Ki4u1s0333xOTw4BVsbKzAAQvYgeebbZuv9Dun79et1yyy2h12vWrNFTTz2llpYWTZgwQY8++qiuvvrq0PGWlhYVFxeroqJCSUlJmj9/vp588kkNGTLknPrBI8+wOuq0AEhEPf397lGdllghtCAedAQNKzMDSCg9/f1mlWcgRliZGQAiw4KJAADAEggtAADAEpgeAiLAfSgAEDuEFuAc8cQPAMQW00PAOehcmfmz6wb5/G1aunGPKhu9MeoZACQOQgvwBViZGQD6B0IL8AVYmRkA+gdCC/AFWJkZAPoHQgvwBViZGQD6B0IL8AVYmRkA+gdCC/AFWJkZAPoHQgtwDvLzslW2cKJcjvApIJcjXWULJ1KnBQD6AMXlgHOUn5etmW4XFXEBIEYILUAEWJkZAGKH6SEAAGAJhBYAAGAJTA8hIbA6MwBYH6EFcY/VmQEgPjA9hLjG6swAED8ILYhbrM4MAPGF0IK4xerMABBfCC2IW6zODADxhdCCuMXqzAAQXwgtiFuszgwA8YXQgrjF6swAEF8ILYhrrM4MAPGD4nKIe6zODADxgdCChMDqzABgfUwPAQAASyC0AAAASyC0AAAASyC0AAAASyC0AAAASyC0AAAASyC0AAAAS4gotJSWlmry5MnKyMiQ0+nUjTfeqP3793fb1hijOXPmyGaz6YUXXgg7dvDgQRUUFGjQoEFyOp1avny5Tp8+HfUgAABA/IsotNTU1KioqEivv/66qqqqdOrUKc2aNUvHjx/v0vanP/2pbLauFUc7OjpUUFCgkydP6rXXXtOGDRv0zDPP6IEHHoh+FAAAIO7ZjDEm2jcfPXpUTqdTNTU1uuaaa0L76+vrdcMNN+iNN95Qdna2ysvLdeONN0qStm3bphtuuEGHDx/WsGHDJEnr1q3TihUrdPToUaWmpn7h5wYCATkcDvn9ftnt9mi7DwAA+lBPf797dE+L3++XJGVlZYX2nThxQt/97nf11FNPyeVydXlPbW2txo0bFwoskjR79mwFAgG9/fbb3X5Oe3u7AoFA2AYAABJL1KElGAxq2bJlmj59uvLy8kL777nnHk2bNk3z5s3r9n0+ny8ssEgKvfb5fN2+p7S0VA6HI7SNHDky2m4DAACLinrBxKKiIjU2NurVV18N7XvppZdUXV2tvXv39krnOpWUlOjee+8NvQ4EAgQXAAASTFRXWoqLi7V161a98sorGjFiRGh/dXW1Dhw4oMzMTKWkpCgl5Uwmmj9/vr7xjW9Iklwul44cORJ2vs7X3U0nSVJaWprsdnvYBgAAEktEocUYo+LiYpWXl6u6ulq5ublhx1euXKm33npL9fX1oU2SnnjiCa1fv16S5PF41NDQoObm5tD7qqqqZLfb5Xa7ezgcAAAQryKaHioqKtKmTZv04osvKiMjI3QPisPh0MCBA+Vyubq9WpKTkxMKOLNmzZLb7daiRYv06KOPyufz6b777lNRUZHS0tJ6YUgAACAeRXSlpaysTH6/X9/4xjeUnZ0d2n75y1+e8zmSk5O1detWJScny+PxaOHChVq8eLEeeuihiDsPAAASR0RXWqIp6dLde0aNGqVf//rXEZ8LAAAkLtYeAgAAlkBoAQAAlkBoAQAAlkBoAQAAlkBoAQAAlkBoAQAAlkBoAQAAlhD1golIDB1Bo7qmFjW3tsmZka4puVlKTrLFulsAgAREaMFZVTZ6tbpin7z+ttC+bEe6Vs11Kz8vO4Y9AwAkIqaH0K3KRq+WbtwTFlgkyedv09KNe1TZ6I1RzwAAiYrQgi46gkarK/apu0UbOvetrtinjmDkyzoAABAtQgu6qGtq6XKF5dOMJK+/TXVNLX3XKQBAwiO0oIvm1rMHlmjaAQDQGwgt6MKZkd6r7QAA6A2EFnQxJTdL2Y50ne3BZpvOPEU0JTerL7sFAEhwhBZ0kZxk06q5bknqElw6X6+a66ZeCwCgTxFa0K38vGyVLZwolyN8CsjlSFfZwonUaQEA9DmKy+Gs8vOyNdPtoiIuAKBfILTgcyUn2eS5eGisuwEAANNDAADAGggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEggtAADAEiIKLaWlpZo8ebIyMjLkdDp14403av/+/aHjLS0tuuuuuzRmzBgNHDhQOTk5+sEPfiC/3x92noMHD6qgoECDBg2S0+nU8uXLdfr06d4ZEQAAiEsRhZaamhoVFRXp9ddfV1VVlU6dOqVZs2bp+PHjkqTDhw/r8OHDevzxx9XY2KhnnnlGlZWVWrJkSegcHR0dKigo0MmTJ/Xaa69pw4YNeuaZZ/TAAw/07sgAAEBcsRljTLRvPnr0qJxOp2pqanTNNdd02+b555/XwoULdfz4caWkpGjbtm264YYbdPjwYQ0bNkyStG7dOq1YsUJHjx5VamrqF35uIBCQw+GQ3++X3W6PtvsAAKAP9fT3u0f3tHRO+2RlZX1uG7vdrpSUFElSbW2txo0bFwoskjR79mwFAgG9/fbb3Z6jvb1dgUAgbAMAAIkl6tASDAa1bNkyTZ8+XXl5ed22+dOf/qSHH35Yt99+e2ifz+cLCyySQq99Pl+35yktLZXD4QhtI0eOjLbbAADAoqIOLUVFRWpsbNTmzZu7PR4IBFRQUCC3260HH3ww2o+RJJWUlMjv94e2Q4cO9eh8AADAelKieVNxcbG2bt2q3/3udxoxYkSX462trcrPz1dGRobKy8s1YMCA0DGXy6W6urqw9keOHAkd605aWprS0tKi6SoAAIgTEV1pMcaouLhY5eXlqq6uVm5ubpc2gUBAs2bNUmpqql566SWlp6eHHfd4PGpoaFBzc3NoX1VVlex2u9xud5TDAAAA8S6iKy1FRUXatGmTXnzxRWVkZITuQXE4HBo4cGAosJw4cUIbN24Mu2n2wgsvVHJysmbNmiW3261Fixbp0Ucflc/n03333aeioiKupgAAgLOK6JFnm83W7f7169frlltu0Y4dO/Q3f/M33bZpamrSRRddJEn66KOPtHTpUu3YsUODBw9WYWGh1qxZE3rC6IvwyDMAANbT09/vHtVpiRVCCwAA1hPTOi0AAAB9hdACAAAsIapHnnFGR9CorqlFza1tcmaka0pulpKTur/vBwAA9AyhJUqVjV6trtgnr78ttC/bka5Vc93Kz8uOYc8AAIhPTA9FobLRq6Ub94QFFkny+du0dOMeVTZ6Y9QzAADiF6ElQh1Bo9UV+9TdI1ed+1ZX7FNH0HIPZQEA0K8RWiJU19TS5QrLpxlJXn+b6ppa+q5TAAAkAEJLhJpbzx5YomkHAADODaElQs6M9C9uFEE7AABwbggtEZqSm6VsR7rO9mCzTWeeIpqSm9WX3QIAIO4RWiKUnGTTqrlnVqP+bHDpfL1qrpt6LQAA9DJCy6d0BI1qD/xZL9b/UbUH/nzWJ4Dy87JVtnCiXI7wKSCXI11lCydSpwUAgPOA4nJ/EWmxuPy8bM10u6iICwBAH2GVZ/21WNxn/4fojB9cPQEAoOdY5bmHKBYHAIA1JHxooVgcAADWkPChhWJxAABYQ8KHForFAQBgDQkfWigWBwCANSR8aKFYHAAA1pDwoUWiWBwAAFZAcbm/oFgcAAD9G6HlU5KTbPJcPDTW3QAAAN1geggAAFgCoQUAAFgCoQUAAFgCoQUAAFgCoQUAAFgCoQUAAFgCoQUAAFgCoQUAAFgCoQUAAFiCJSviGmMkSYFAIMY9AQAA56rzd7vzdzxSlgwtra2tkqSRI0fGuCcAACBSra2tcjgcEb/PZqKNOzEUDAZ1+PBhZWRkyGaLnwUNA4GARo4cqUOHDslut8e6O30qUceeqOOWEnfsiTpuibEn4tg/O25jjFpbWzV8+HAlJUV+h4olr7QkJSVpxIgRse7GeWO32xPqH+pPS9SxJ+q4pcQde6KOW2LsiTj2T487missnbgRFwAAWAKhBQAAWAKhpR9JS0vTqlWrlJaWFuuu9LlEHXuijltK3LEn6rglxp6IY+/tcVvyRlwAAJB4uNICAAAsgdACAAAsgdACAAAsgdACAAAsgdASA7/73e80d+5cDR8+XDabTS+88ELYcWOMHnjgAWVnZ2vgwIGaMWOG3n///dh0theVlpZq8uTJysjIkNPp1I033qj9+/eHtWlra1NRUZGGDh2qIUOGaP78+Tpy5EiMetx7ysrKNH78+FCBJY/Ho23btoWOx+u4P2vNmjWy2WxatmxZaF+8jv3BBx+UzWYL28aOHRs6Hq/jlqQ//vGPWrhwoYYOHaqBAwdq3LhxeuONN0LH4/Vv3EUXXdTlO7fZbCoqKpIU3995R0eH7r//fuXm5mrgwIG6+OKL9fDDD4etMdQr37tBn/v1r39tfvSjH5lf/epXRpIpLy8PO75mzRrjcDjMCy+8YN58803zt3/7tyY3N9d88sknselwL5k9e7ZZv369aWxsNPX19eb66683OTk55uOPPw61ufPOO83IkSPNyy+/bN544w1z1VVXmWnTpsWw173jpZdeMv/7v/9r3nvvPbN//37zwx/+0AwYMMA0NjYaY+J33J9WV1dnLrroIjN+/Hhz9913h/bH69hXrVplLrvsMuP1ekPb0aNHQ8fjddwtLS1m1KhR5pZbbjE7d+40H374odm+fbv54IMPQm3i9W9cc3Nz2PddVVVlJJlXXnnFGBO/37kxxjzyyCNm6NChZuvWraapqck8//zzZsiQIWbt2rWhNr3xvRNaYuyzoSUYDBqXy2Uee+yx0L5jx46ZtLQ089///d8x6OH509zcbCSZmpoaY8yZcQ4YMMA8//zzoTbvvPOOkWRqa2tj1c3z5oILLjA///nPE2Lcra2t5pJLLjFVVVXm61//eii0xPPYV61aZSZMmNDtsXge94oVK8zVV1991uOJ9Dfu7rvvNhdffLEJBoNx/Z0bY0xBQYH53ve+F7bvpptuMgsWLDDG9N73zvRQP9PU1CSfz6cZM2aE9jkcDk2dOlW1tbUx7Fnv8/v9kqSsrCxJ0u7du3Xq1KmwsY8dO1Y5OTlxNfaOjg5t3rxZx48fl8fjSYhxFxUVqaCgIGyMUvx/5++//76GDx+ur3zlK1qwYIEOHjwoKb7H/dJLL+nKK6/U3/3d38npdOqKK67Qz372s9DxRPkbd/LkSW3cuFHf+973ZLPZ4vo7l6Rp06bp5Zdf1nvvvSdJevPNN/Xqq69qzpw5knrve7fkgonxzOfzSZKGDRsWtn/YsGGhY/EgGAxq2bJlmj59uvLy8iSdGXtqaqoyMzPD2sbL2BsaGuTxeNTW1qYhQ4aovLxcbrdb9fX1cT3uzZs3a8+ePdq1a1eXY/H8nU+dOlXPPPOMxowZI6/Xq9WrV+trX/uaGhsb43rcH374ocrKynTvvffqhz/8oXbt2qUf/OAHSk1NVWFhYcL8jXvhhRd07Ngx3XLLLZLi+591SVq5cqUCgYDGjh2r5ORkdXR06JFHHtGCBQsk9d5vG6EFMVFUVKTGxka9+uqrse5KnxkzZozq6+vl9/u1ZcsWFRYWqqamJtbdOq8OHTqku+++W1VVVUpPT491d/pU579hStL48eM1depUjRo1Ss8995wGDhwYw56dX8FgUFdeeaV+/OMfS5KuuOIKNTY2at26dSosLIxx7/rOL37xC82ZM0fDhw+PdVf6xHPPPadnn31WmzZt0mWXXab6+notW7ZMw4cP79XvnemhfsblcklSlzvKjxw5EjpmdcXFxdq6dateeeUVjRgxIrTf5XLp5MmTOnbsWFj7eBl7amqqRo8erUmTJqm0tFQTJkzQ2rVr43rcu3fvVnNzsyZOnKiUlBSlpKSopqZGTz75pFJSUjRs2LC4HftnZWZm6qtf/ao++OCDuP7Os7Oz5Xa7w/ZdeumloamxRPgb99FHH+m3v/2tvv/974f2xfN3LknLly/XypUrdfPNN2vcuHFatGiR7rnnHpWWlkrqve+d0NLP5ObmyuVy6eWXXw7tCwQC2rlzpzweTwx71nPGGBUXF6u8vFzV1dXKzc0NOz5p0iQNGDAgbOz79+/XwYMHLT/27gSDQbW3t8f1uK+77jo1NDSovr4+tF155ZVasGBB6L/H69g/6+OPP9aBAweUnZ0d19/59OnTu5QyeO+99zRq1ChJ8f03rtP69evldDpVUFAQ2hfP37kknThxQklJ4ZEiOTlZwWBQUi9+771y2zAi0traavbu3Wv27t1rJJl/+Zd/MXv37jUfffSRMebMY2GZmZnmxRdfNG+99ZaZN29eXDwOuHTpUuNwOMyOHTvCHgs8ceJEqM2dd95pcnJyTHV1tXnjjTeMx+MxHo8nhr3uHStXrjQ1NTWmqanJvPXWW2blypXGZrOZ3/zmN8aY+B13dz799JAx8Tv2f/zHfzQ7duwwTU1N5ve//72ZMWOG+dKXvmSam5uNMfE77rq6OpOSkmIeeeQR8/7775tnn33WDBo0yGzcuDHUJl7/xhljTEdHh8nJyTErVqzocixev3NjjCksLDRf/vKXQ488/+pXvzJf+tKXzP/7f/8v1KY3vndCSwy88sorRlKXrbCw0Bhz5tGw+++/3wwbNsykpaWZ6667zuzfvz+2ne4F3Y1Zklm/fn2ozSeffGL+4R/+wVxwwQVm0KBB5pvf/Kbxer2x63Qv+d73vmdGjRplUlNTzYUXXmiuu+66UGAxJn7H3Z3PhpZ4Hft3vvMdk52dbVJTU82Xv/xl853vfCesVkm8jtsYYyoqKkxeXp5JS0szY8eONf/5n/8Zdjxe/8YZY8z27duNpG7HE8/feSAQMHfffbfJyckx6enp5itf+Yr50Y9+ZNrb20NteuN7txnzqXJ1AAAA/RT3tAAAAEsgtAAAAEsgtAAAAEsgtAAAAEsgtAAAAEsgtAAAAEsgtAAAAEsgtAAAAEsgtAAAAEsgtAAAAEsgtAAAAEsgtAAAAEv4/5VRsZqyXcs7AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(rooms, y)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "7ad67ba1-1684-435d-a71e-f5f7a677ab80",
   "metadata": {},
   "outputs": [],
   "source": [
    "def simple_trick(base_price, price_per_room, num_rooms, price):\n",
    "    small_random_1 = random.random() * 0.1\n",
    "    small_random_2 = random.random() * 0.1\n",
    "    predicted_price = base_price + price_per_room*num_rooms\n",
    "    if(abs(predicted_price - price) < price * 5/100):\n",
    "        return price_per_room, base_price, False\n",
    "    if price > predicted_price and num_rooms > 0:\n",
    "        price_per_room += small_random_1\n",
    "        base_price += small_random_2\n",
    "    if price > predicted_price and num_rooms < 0:\n",
    "        price_per_room -= small_random_1\n",
    "        base_price += small_random_2\n",
    "    if price < predicted_price and num_rooms > 0:\n",
    "        price_per_room -= small_random_1\n",
    "        base_price -= small_random_2\n",
    "    if price < predicted_price and num_rooms < 0:\n",
    "        price_per_room -= small_random_1\n",
    "        base_price += small_random_2\n",
    "    return price_per_room, base_price, True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "9c30fd9c-0372-477a-9e79-9178a0766638",
   "metadata": {},
   "outputs": [],
   "source": [
    "def square_trick(base_price, price_per_room, num_rooms, price, learning_rate):\n",
    "    predicted_price = base_price + price_per_room*num_rooms\n",
    "    price_per_room += learning_rate*num_rooms*(price-predicted_price)\n",
    "    base_price += learning_rate*(price-predicted_price)\n",
    "    return price_per_room, base_price, True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "fe6c6470-608b-49e1-9ae4-1d76c2841270",
   "metadata": {},
   "outputs": [],
   "source": [
    "random.seed(0)\n",
    "def linear_regression(features, labels, learning_rate=0.01, epochs = 1000):\n",
    "    price_per_room = random.random()\n",
    "    base_price = random.random()\n",
    "    for epoch in range(epochs):\n",
    "        i = random.randint(0, len(features)-1)\n",
    "        num_rooms = features[i]\n",
    "        price = labels[i]\n",
    "        price_per_room, base_price, cont = square_trick(base_price,\n",
    "                                                  price_per_room,\n",
    "                                                  num_rooms,\n",
    "                                                  price, 0.01)\n",
    "       \n",
    "    print('Price per room:', price_per_room)\n",
    "    print('Base price:', base_price)\n",
    "    return price_per_room, base_price"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "1be06805-ce33-4f3e-8ef0-679fa4589b95",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Price per room: nan\n",
      "Base price: nan\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\iampk\\AppData\\Local\\Temp\\ipykernel_16068\\2166515683.py:2: RuntimeWarning: overflow encountered in scalar multiply\n",
      "  predicted_price = base_price + price_per_room*num_rooms\n",
      "C:\\Users\\iampk\\AppData\\Local\\Temp\\ipykernel_16068\\2166515683.py:3: RuntimeWarning: invalid value encountered in scalar add\n",
      "  price_per_room += learning_rate*num_rooms*(price-predicted_price)\n",
      "C:\\Users\\iampk\\AppData\\Local\\Temp\\ipykernel_16068\\2166515683.py:4: RuntimeWarning: invalid value encountered in scalar add\n",
      "  base_price += learning_rate*(price-predicted_price)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(nan, nan)"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "linear_regression(rooms, y, learning_rate = 0.01, epochs = 10000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "519fcad2-5820-4b38-b2b9-ceddb8efff0e",
   "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.12.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}