commit d42d1adbddbf6a11f444c3ad25782836b7bf7266
parent a85539ca7202428d522eb6bf697d81fcec5d8089
Author: Andrew <andrewlaack1@gmail.com>
Date: Tue, 14 May 2024 21:11:25 -0500
Added data and git ignore
Diffstat:
5 files changed, 171 insertions(+), 124 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -0,0 +1 @@
+datasets/
diff --git a/linearRegression/LinRegByHand.ipynb b/linearRegression/LinRegByHand.ipynb
@@ -1,123 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 29,
- "id": "ae9b31b1-3b43-4fc4-a66a-02bdbd36e197",
- "metadata": {},
- "outputs": [],
- "source": [
- "import pandas as pd\n",
- "import matplotlib.pyplot as plt"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 30,
- "id": "78775d8d-7c34-45ca-81b6-f11cc3647087",
- "metadata": {},
- "outputs": [],
- "source": [
- "dataSource = 'https://github.com/ageron/data/raw/main/'\n",
- "df = pd.read_csv(dataSource + \"lifesat/lifesat.csv\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "id": "5cb98e28-6901-498e-a32c-1105d22220cc",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- " Country GDP per capita (USD) Life satisfaction\n",
- "0 Russia 26456.387938 5.8\n",
- "1 Greece 27287.083401 5.4\n",
- "2 Turkey 28384.987785 5.5\n",
- "3 Latvia 29932.493910 5.9\n",
- "4 Hungary 31007.768407 5.6\n",
- "5 Portugal 32181.154537 5.4\n",
- "6 Poland 32238.157259 6.1\n",
- "7 Estonia 35638.421351 5.7\n",
- "8 Spain 36215.447591 6.3\n",
- "9 Slovenia 36547.738956 5.9\n",
- "10 Lithuania 36732.034744 5.9\n",
- "11 Israel 38341.307570 7.2\n",
- "12 Italy 38992.148381 6.0\n",
- "13 United Kingdom 41627.129269 6.8\n",
- "14 France 42025.617373 6.5\n",
- "15 New Zealand 42404.393738 7.3\n",
- "16 Canada 45856.625626 7.4\n",
- "17 Finland 47260.800458 7.6\n",
- "18 Belgium 48210.033111 6.9\n",
- "19 Australia 48697.837028 7.3\n",
- "20 Sweden 50683.323510 7.3\n",
- "21 Germany 50922.358023 7.0\n",
- "22 Austria 51935.603862 7.1\n",
- "23 Iceland 52279.728851 7.5\n",
- "24 Netherlands 54209.563836 7.4\n",
- "25 Denmark 55938.212809 7.6\n",
- "26 United States 60235.728492 6.9\n"
- ]
- }
- ],
- "source": [
- "print(df)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 34,
- "id": "69dbc13a",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "<Axes: xlabel='GDP per capita (USD)', ylabel='Life satisfaction'>"
- ]
- },
- "execution_count": 34,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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dDa3w825556rV155pUX7woULde6553qkKAAAgL3ldrhZuXKljjnmmBbtRx99tFauXOmRogAAAPaW2+Fmx44drZ6W2rlzp3777TePFAUAALC33A43o0eP1tNPP92i/amnntLIkSM9UhQAAMDe6vBsqWZ33323xo8fr3Xr1unYY4+VJC1btkyrV6/WRx995PECAQAA3OH2kZu0tDQtX75cCQkJWrhwod5++23ZbDZ98803OuqoozqjRgAAgA6zGGOMt4voSjU1NYqJiVF1dTX36gEAwE+4s/92+7TUrn7//Xc1NDS4tBEYAACAN7l9Wqq+vl6XX3654uPj1bNnT/Xp08flBQAA4E1uh5vrrrtOH3/8sebOnauwsDA9++yzuuOOOzRw4EDNnz+/M2oEAADoMLdPS7399tuaP3++jj76aF144YU66qijZLPZlJiYqAULFmjy5MmdUScAAECHuH3kprKyUoMGDZL05/U1lZWVkqQjjzxSOTk5nq0OAADATW6Hm0GDBqm4uFiSNGTIEC1cuFDSn0d0evfu7dHiAAAA3OV2uLnwwgu1bt06SdKNN96oJ554QuHh4brqqqt03XXXebxAAAAAd+zzfW5KS0v11VdfyWaz6ZBDDvFUXZ2G+9wAAOB/3Nl/d+jITd++fVVeXi5Juuiii7R9+3bnssTERJ1++ul+EWwAAEDg61C4aWhoUE1NjSTpxRdf1O+//96pRQEAAOytDk0FT01N1amnnqqRI0fKGKPMzExFRES02vf555/3aIEAAADu6FC4eemll/TII49o48aNslgsqq6u5ugNAADwSW5fUJycnKw1a9YoNja2s2rqVFxQDACA/+nUB2c23+NmV1VVVdzjBgAA+AS373Nz//3369VXX3W+P/vss9W3b1/tt99+zvvfuOOnn37S+eefr9jYWEVERGjEiBFas2ZNm/0//fRTWSyWFq+ysjK3/zYA31HkqNUn+b+quLzO26UA8HNuH7l56qmntGDBAknSkiVLtGTJEn3wwQdauHChrrvuOn300UcdXte2bduUlpamY445Ru+//77i4uJUUFDQoaeL5+fnuxyWio+Pd/erAPABVfUNyszOU06Bw9mWnhKnrAy7YiJDvFgZAH/ldrgpKytTQkKCJOmdd97R2WefreOOO05JSUkaM2aMW+u6//77lZCQoHnz5jnbkpOTO/TZ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Fpf2YItF6Slx3WLGEGMAAOhshJsulpVhV5rN6tKWZrMqK8PupYq6HmMAAOhMPDjTS4rL61RSUdet7/HCGAAAOsqd/Tf3ufGSZCs7dMYAANAZOC0FAAACCuEGAAAEFMINAAAIKIQbAAAQUAg3AAAgoBBuAABAQCHcAACAgEK4AQAAAYVwAwAAAgrhBgAABJRu9/iF5kdp1dTUeLkSAADQUc377Y48ErPbhZvt27dLkhISErxcCQAAcNf27dsVExPTbp9u91TwpqYm/fzzz+rVq5e2b9+uhIQEbd682atPCPcFNTU1jMX/MBZ/YSz+xDj8hbH4C2Pxl64YC2OMtm/froEDByooqP2rarrdkZugoCDtv//+kiSLxSJJio6O7vYbZjPG4i+MxV8Yiz8xDn9hLP7CWPyls8diT0dsmnFBMQAACCiEGwAAEFC6dbgJCwvTrFmzFBYW5u1SvI6x+Atj8RfG4k+Mw18Yi78wFn/xtbHodhcUAwCAwNatj9wAAIDAQ7gBAAABhXADAAACCuEGAAAEFL8LN7Nnz9bf/vY39erVS/Hx8Tr11FOVn5/v0ufoo4+WxWJxeV166aUufTZt2qSTTjpJkZGRio+P13XXXac//vjDpc+nn36qww8/XGFhYbLZbHrhhRda1PPEE08oKSlJ4eHhGjNmjFatWuXx79yauXPn6pBDDnHeMCk1NVXvv/++c/nvv/+uGTNmKDY2VlFRUTrjjDP0yy+/uKzD38eg2Z7GojtsD6257777ZLFYdOWVVzrbutN2savWxqK7bBe33357i+85ZMgQ5/LutE3saSy6yzbR7KefftL555+v2NhYRUREaMSIEVqzZo1zuTFGt912mwYMGKCIiAiNHz9eBQUFLuuorKzU5MmTFR0drd69e2vatGmqra116fPNN9/oqKOOUnh4uBISEvSvf/2rRS2vvfaahgwZovDwcI0YMULvvffevn0542cmTpxo5s2bZ9avX2/y8vLMiSeeaA444ABTW1vr7DNu3DhzySWXmK1btzpf1dXVzuV//PGHGT58uBk/frxZu3atee+994zVajU33XSTs09RUZGJjIw0V199tfn+++9NVlaWCQ4ONh988IGzzyuvvGJCQ0PN888/b7777jtzySWXmN69e5tffvml08dh8eLF5t133zU//vijyc/PNzfffLMJCQkx69evN8YYc+mll5qEhASzbNkys2bNGnPEEUeYsWPHBtQYdHQsusP2sLtVq1aZpKQkc8ghh5iZM2c627vTdtGsrbHoLtvFrFmzzLBhw1y+p8PhcC7vTtvEnsaiu2wTxhhTWVlpEhMTzQUXXGBWrlxpioqKzIcffmgKCwudfe677z4TExNjFi1aZNatW2dOOeUUk5ycbH777Tdnn+OPP94ceuihZsWKFebzzz83NpvNZGRkOJdXV1ebfv36mcmTJ5v169eb7OxsExERYf797387++Tm5prg4GDzr3/9y3z//ffmlltuMSEhIebbb7/d6+/nd+Fmd7/++quRZD777DNn27hx41z+I7a79957zwQFBZmysjJn29y5c010dLTZsWOHMcaY66+/3gwbNszlc+ecc46ZOHGi8/3o0aPNjBkznO8bGxvNwIEDzezZs/f1a+2VPn36mGeffdZUVVWZkJAQ89prrzmXbdiwwUgyy5cvN8YE7hg0ax4LY7rf9rB9+3aTkpJilixZ4vLdu+N20dZYGNN9totZs2aZQw89tNVl3W2baG8sjOk+24Qxxtxwww3myCOPbHN5U1OT6d+/v3nggQecbVVVVSYsLMxkZ2cbY4z5/vvvjSSzevVqZ5/333/fWCwW89NPPxljjHnyySdNnz59nOPT/LcHDx7sfH/22Webk046yeXvjxkzxvzjH//Y6+/nd6eldlddXS1J6tu3r0v7ggULZLVaNXz4cN10002qr693Llu+fLlGjBihfv36OdsmTpyompoafffdd84+48ePd1nnxIkTtXz5cklSQ0ODvvrqK5c+QUFBGj9+vLNPV2lsbNQrr7yiuro6paam6quvvtLOnTtdahsyZIgOOOAAZ22BNgbNdh+LZt1pe5gxY4ZOOumkFvV2x+2irbFo1l22i4KCAg0cOFCDBg3S5MmTtWnTJkndc5toayyadZdtYvHixRo1apTOOussxcfHy26365lnnnEuLy4uVllZmUudMTExGjNmjMu20bt3b40aNcrZZ/z48QoKCtLKlSudfdLT0xUaGursM3HiROXn52vbtm3OPu2N2d7w6wdnNjU16corr1RaWpqGDx/ubD/vvPOUmJiogQMH6ptvvtENN9yg/Px8vfHGG5KksrIyl41TkvN9WVlZu31qamr022+/adu2bWpsbGy1zw8//ODx79qab7/9Vqmpqfr9998VFRWlN998UwcffLDy8vIUGhqq3r17t6htT9+veVl7fXxpDJq1NRZS99keJOmVV17R119/rdWrV7dYVlZW1q22i/bGQuo+28WYMWP0wgsvaPDgwdq6davuuOMOHXXUUVq/fn232ybaG4tevXp1m21CkoqKijR37lxdffXVuvnmm7V69WplZmYqNDRUU6dOdX6f1urc9bvGx8e7LO/Ro4f69u3r0ic5ObnFOpqX9enTp80xa17H3vDrcDNjxgytX79eX3zxhUv79OnTnf8eMWKEBgwYoGOPPVYbN27UgQce2NVldprBgwcrLy9P1dXV+u9//6upU6fqs88+83ZZXtHWWBx88MHdZnvYvHmzZs6cqSVLlig8PNzb5XhVR8aiu2wXJ5xwgvPfhxxyiMaMGaPExEQtXLhQERERXqys67U3FtOmTes224T058GBUaNG6d5775Uk2e12rV+/Xk899ZSmTp3q5er2nd+elrr88sv1zjvv6JNPPtH+++/fbt8xY8ZIkgoLCyVJ/fv3bzEboPl9//792+0THR2tiIgIWa1WBQcHt9qneR2dLTQ0VDabTSNHjtTs2bN16KGH6tFHH1X//v3V0NCgqqqqNmsLlDFo1tZYtCZQt4evvvpKv/76qw4//HD16NFDPXr00GeffabHHntMPXr0UL9+/brNdrGnsWhsbGzxmUDdLnbXu3dvHXTQQSosLOyW/63Y1a5j0ZpA3iYGDBjgPLrdbOjQoc7TdM21tFdn//799euvv7os/+OPP1RZWemR7WdfxsPvwo0xRpdffrnefPNNffzxxy0Od7UmLy9P0p8/piSlpqbq22+/dflRlixZoujoaOePnZqaqmXLlrmsZ8mSJc7rOEJDQzVy5EiXPk1NTVq2bJnLtR5dqampSTt27NDIkSMVEhLiUlt+fr42bdrkrC1Qx2DXOnbs2NHqskDdHo499lh9++23ysvLc75GjRqlyZMnO//dXbaLPY1FcHBwi88E6naxu9raWm3cuFEDBgzo9v+t2HUsWhPI20RaWlqL26j8+OOPSkxMlCQlJyerf//+LnXW1NRo5cqVLttGVVWVvvrqK2efjz/+WE1NTc5gmJqaqpycHO3cudPZZ8mSJRo8eLD69Onj7NPemO2Vvb4U2Usuu+wyExMTYz799FOX6Xr19fXGGGMKCwvNnXfeadasWWOKi4vNW2+9ZQYNGmTS09Od62ieznfccceZvLw888EHH5i4uLhWp/Ndd911ZsOGDeaJJ55odTpfWFiYeeGFF8z3339vpk+fbnr37u1yJX1nufHGG81nn31miouLzTfffGNuvPFGY7FYzEcffWSM+XN65wEHHGA+/vhjs2bNGpOammpSU1MDagw6MhbdZXtoy+6zP7rTdrG7XceiO20X11xzjfn0009NcXGxyc3NNePHjzdWq9X8+uuvxpjutU20NxbdaZsw5s9bJPTo0cPcc889pqCgwCxYsMBERkaal156ydnnvvvuM7179zZvvfWW+eabb8ykSZNanQput9vNypUrzRdffGFSUlJcpoJXVVWZfv36mf/7v/8z69evN6+88oqJjIxsMRW8R48e5sEHHzQbNmwws2bN6n5TwSW1+po3b54xxphNmzaZ9PR007dvXxMWFmZsNpu57rrrXO5VYIwxJSUl5oQTTjARERHGarWaa665xuzcudOlzyeffGIOO+wwExoaagYNGuT8G7vKysoyBxxwgAkNDTWjR482K1as6Kyv7uKiiy4yiYmJJjQ01MTFxZljjz3WGWyMMea3334z//znP02fPn1MZGSkOe2008zWrVtd1uHvY9CsvbHoLttDW3YPN91pu9jdrmPRnbaLc845xwwYMMCEhoaa/fbbz5xzzjku9zLpTttEe2PRnbaJZm+//bYZPny4CQsLM0OGDDFPP/20y/KmpiZz6623mn79+pmwsDBz7LHHmvz8fJc+FRUVJiMjw0RFRZno6Ghz4YUXmu3bt7v0WbdunTnyyCNNWFiY2W+//cx9993XopaFCxeagw46yISGhpphw4aZd999d5++m8UYY/b+uA8AAIBv8btrbgAAANpDuAEAAAGFcAMAAAIK4QYAAAQUwg0AAAgohBsAABBQCDcAACCgEG4AAEBAIdwA6PaSkpI0Z86cTlt/enq6Xn755U5bf0d88MEHOuyww9TU1OTVOoCuQLgB/EhZWZlmzpwpm82m8PBw9evXT2lpaZo7d67q6+ud/ZKSkmSxWGSxWBQREaGkpCSdffbZ+vjjj13WV1JS4uxnsVgUGxur4447TmvXru3qr+ZVq1ev1vTp053vLRaLFi1a5JF1L168WL/88ovOPffcPa7/ggsu0Kmnnup8X1xcrPPOO08DBw5UeHi49t9/f02aNEk//PCDy7qaXz179lRKSoouuOACl4cZStLxxx+vkJAQLViwwCPfC/BlhBvATxQVFclut+ujjz7Svffeq7Vr12r58uW6/vrr9c4772jp0qUu/e+8805t3bpV+fn5mj9/vnr37q3x48frnnvuabHupUuXauvWrfrwww9VW1urE044QVVVVV30zf6061ODu1pcXJwiIyM7Zd2PPfaYLrzwQgUFufef2507d2rChAmqrq7WG2+8ofz8fL366qsaMWJEi99m3rx52rp1q7777js98cQTqq2t1ZgxYzR//nyXfhdccIEee+yxff1KgO/bpydTAegyEydONPvvv7+pra1tdXlTU5Pz34mJieaRRx5p0ee2224zQUFB5ocffjDGGFNcXGwkmbVr1zr75ObmGkkuTzHe1axZs8yhhx5qnnrqKbP//vubiIgIc9ZZZ5mqqiqXfs8884wZMmSICQsLM4MHDzZPPPGEc1nz333llVdMenq6CQsLa/XhgsYYs23bNjN9+nQTHx9vwsLCzLBhw8zbb79tjDGmvLzcnHvuuWbgwIEmIiLCDB8+3Lz88ssunx83bpyZMWOGmTFjhomOjjaxsbHmlltuaXO8EhMTXR7Km5iYaIz580nip5xyiomPjzc9e/Y0o0aNMkuWLGm15ma//vqrsVgsZv369S7tksybb77Zov/UqVPNpEmTjDHGrF271kgyJSUl7f6NttY1ZcoU06tXL1NZWelsKy0tNZJcHpwJBCKO3AB+oKKiQh999JFmzJihnj17ttrHYrHscT0zZ86UMUZvvfVWm30iIiIkSQ0NDW32KSws1MKFC/X222/rgw8+0Nq1a/XPf/7TuXzBggW67bbbdM8992jDhg269957deutt+rFF190Wc+NN96omTNnasOGDZo4cWKLv9PU1KQTTjhBubm5eumll/T999/rvvvuU3BwsCTp999/18iRI/Xuu+9q/fr1mj59uv7v//5Pq1atclnPiy++qB49emjVqlV69NFH9fDDD+vZZ59t9butXr1a0l9HQ5rf19bW6sQTT9SyZcu0du1aHX/88Tr55JO1adOmNsfpiy++UGRkpIYOHdpmn7bExcUpKChI//3vf9XY2Oj256+66ipt375dS5YscbYdcMAB6tevnz7//HO31wf4FW+nKwB7tmLFCiPJvPHGGy7tsbGxpmfPnqZnz57m+uuvd7a3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",
- "text/plain": [
- "<Figure size 640x480 with 1 Axes>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "df.plot(kind='scatter', x='GDP per capita (USD)', y='Life satisfaction')"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "notebook",
- "language": "python",
- "name": "notebook"
- },
- "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.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/linearRegression/LinearRegressionHousing.ipynb b/linearRegression/LinearRegressionHousing.ipynb
@@ -0,0 +1,109 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from pathlib import Path\n",
+ "import pandas as pd\n",
+ "import tarfile\n",
+ "import requests\n",
+ "\n",
+ "# Download tar file and write it out to a csv then read that back into a pandas dataframe\n",
+ "def load_data():\n",
+ " filePath = Path(\"../datasets/housing.tgz\")\n",
+ " if not filePath.is_file():\n",
+ " Path(\"../datasets\").mkdir(parents=True, exist_ok=True)\n",
+ " url = \"https://github.com/ageron/data/raw/main/housing.tgz\"\n",
+ " req = requests.get(url)\n",
+ " with open('../datasets/housing.tgz', 'wb') as f:\n",
+ " f.write(req.content)\n",
+ "\n",
+ " with tarfile.open(filePath) as housingFile:\n",
+ " housingFile.extractall(path=\"../datasets\")\n",
+ " return pd.read_csv(Path(\"../datasets/housing/housing.csv\"))\n",
+ "\n",
+ "housing = load_data()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " longitude latitude housing_median_age total_rooms total_bedrooms \\\n",
+ "0 -122.23 37.88 41.0 880.0 129.0 \n",
+ "1 -122.22 37.86 21.0 7099.0 1106.0 \n",
+ "2 -122.24 37.85 52.0 1467.0 190.0 \n",
+ "3 -122.25 37.85 52.0 1274.0 235.0 \n",
+ "4 -122.25 37.85 52.0 1627.0 280.0 \n",
+ "... ... ... ... ... ... \n",
+ "20635 -121.09 39.48 25.0 1665.0 374.0 \n",
+ "20636 -121.21 39.49 18.0 697.0 150.0 \n",
+ "20637 -121.22 39.43 17.0 2254.0 485.0 \n",
+ "20638 -121.32 39.43 18.0 1860.0 409.0 \n",
+ "20639 -121.24 39.37 16.0 2785.0 616.0 \n",
+ "\n",
+ " population households median_income median_house_value \\\n",
+ "0 322.0 126.0 8.3252 452600.0 \n",
+ "1 2401.0 1138.0 8.3014 358500.0 \n",
+ "2 496.0 177.0 7.2574 352100.0 \n",
+ "3 558.0 219.0 5.6431 341300.0 \n",
+ "4 565.0 259.0 3.8462 342200.0 \n",
+ "... ... ... ... ... \n",
+ "20635 845.0 330.0 1.5603 78100.0 \n",
+ "20636 356.0 114.0 2.5568 77100.0 \n",
+ "20637 1007.0 433.0 1.7000 92300.0 \n",
+ "20638 741.0 349.0 1.8672 84700.0 \n",
+ "20639 1387.0 530.0 2.3886 89400.0 \n",
+ "\n",
+ " ocean_proximity \n",
+ "0 NEAR BAY \n",
+ "1 NEAR BAY \n",
+ "2 NEAR BAY \n",
+ "3 NEAR BAY \n",
+ "4 NEAR BAY \n",
+ "... ... \n",
+ "20635 INLAND \n",
+ "20636 INLAND \n",
+ "20637 INLAND \n",
+ "20638 INLAND \n",
+ "20639 INLAND \n",
+ "\n",
+ "[20640 rows x 10 columns]\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(housing)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "notebook",
+ "language": "python",
+ "name": "notebook"
+ },
+ "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.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/meanAbsoluteError/MAE.ipynb b/meanAbsoluteError/MAE.ipynb
@@ -0,0 +1,60 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Often you would use ordered pairs for expected and inference.\n",
+ "expected = [10, 10, 4, 3, 2, 4, 5, 5]\n",
+ "inference = [9 , 7, 3, 2, 1, 3, 2, 5]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1.375\n"
+ ]
+ }
+ ],
+ "source": [
+ "count = 0\n",
+ "total = 0\n",
+ "while count < len(expected):\n",
+ " total += abs(expected[count] - inference[count])\n",
+ " count += 1\n",
+ "\n",
+ "total = total / len(expected)\n",
+ "print(total)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "notebook",
+ "language": "python",
+ "name": "notebook"
+ },
+ "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.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/rootMeanSquareError/RMSE.ipynb b/rootMeanSquareError/RMSE.ipynb
@@ -15,7 +15,7 @@
},
{
"cell_type": "code",
- "execution_count": 11,
+ "execution_count": 12,
"metadata": {},
"outputs": [
{