From c0f7e9d3396f4bcd1a050b8d9f5ebe5e8903a764 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Mon, 20 Jan 2025 15:05:31 +0100 Subject: [PATCH] 01: i tried to do it all, but this is all crap --- .gitignore | 2 +- .../00 - Python Kurzeinführung.ipynb | 0 .../01 - linear regression - 1 feature.ipynb | 1103 ++++++++++++++++ ...inear regression - multiple features.ipynb | 1163 +++++++++++++++++ {notebooks => Aufgaben}/data | 0 README.md | 1 + tasks/01-melbourne.py | 87 +- 7 files changed, 2344 insertions(+), 12 deletions(-) rename {notebooks => Aufgaben}/00 - Python Kurzeinführung.ipynb (100%) create mode 100644 Aufgaben/01 - linear regression - 1 feature.ipynb create mode 100644 Aufgaben/02 - linear regression - multiple features.ipynb rename {notebooks => Aufgaben}/data (100%) create mode 100644 README.md diff --git a/.gitignore b/.gitignore index c66c39d..e902b72 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -notebooks/.ipynb_checkpoints +**/.ipynb_checkpoints diff --git a/notebooks/00 - Python Kurzeinführung.ipynb b/Aufgaben/00 - Python Kurzeinführung.ipynb similarity index 100% rename from notebooks/00 - Python Kurzeinführung.ipynb rename to Aufgaben/00 - Python Kurzeinführung.ipynb diff --git a/Aufgaben/01 - linear regression - 1 feature.ipynb b/Aufgaben/01 - linear regression - 1 feature.ipynb new file mode 100644 index 0000000..937e5f7 --- /dev/null +++ b/Aufgaben/01 - linear regression - 1 feature.ipynb @@ -0,0 +1,1103 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9496e038", + "metadata": {}, + "source": [ + "# Lineare Regression mit 1 Feature ($d=1$)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "5754d665", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "# plotting settings\n", + "pd.plotting.register_matplotlib_converters()\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "markdown", + "id": "282549b7", + "metadata": {}, + "source": [ + "Wir verwenden hier beispielhaft den Datensatz [Melbourne Housing Snapshot](https://www.kaggle.com/datasets/dansbecker/melbourne-housing-snapshot). Diesen finden Sie auch im Moodle unter `data/melb_data.csv`." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cfe20800", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Suburb', 'Address', 'Rooms', 'Type', 'Price', 'Method', 'SellerG',\n", + " 'Date', 'Distance', 'Postcode', 'Bedroom2', 'Bathroom', 'Car',\n", + " 'Landsize', 'BuildingArea', 'YearBuilt', 'CouncilArea', 'Lattitude',\n", + " 'Longtitude', 'Regionname', 'Propertycount'],\n", + " dtype='object')" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "melbourne_file_path = 'data/melb_data.csv'\n", + "melbourne_data = pd.read_csv(melbourne_file_path)\n", + "melbourne_data = melbourne_data.dropna(axis=0) # entfernen von Daten mit fehlenden Werten\n", + "melbourne_data.columns # Spaltennamen der Tabelle (potentielle Features)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e13b23ac", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SuburbAddressRoomsTypePriceMethodSellerGDateDistancePostcode...BathroomCarLandsizeBuildingAreaYearBuiltCouncilAreaLattitudeLongtitudeRegionnamePropertycount
1Abbotsford25 Bloomburg St2h1035000.0SBiggin4/02/20162.53067.0...1.00.0156.079.01900.0Yarra-37.8079144.9934Northern Metropolitan4019.0
2Abbotsford5 Charles St3h1465000.0SPBiggin4/03/20172.53067.0...2.00.0134.0150.01900.0Yarra-37.8093144.9944Northern Metropolitan4019.0
4Abbotsford55a Park St4h1600000.0VBNelson4/06/20162.53067.0...1.02.0120.0142.02014.0Yarra-37.8072144.9941Northern Metropolitan4019.0
6Abbotsford124 Yarra St3h1876000.0SNelson7/05/20162.53067.0...2.00.0245.0210.01910.0Yarra-37.8024144.9993Northern Metropolitan4019.0
7Abbotsford98 Charles St2h1636000.0SNelson8/10/20162.53067.0...1.02.0256.0107.01890.0Yarra-37.8060144.9954Northern Metropolitan4019.0
\n", + "

5 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " Suburb Address Rooms Type Price Method SellerG \\\n", + "1 Abbotsford 25 Bloomburg St 2 h 1035000.0 S Biggin \n", + "2 Abbotsford 5 Charles St 3 h 1465000.0 SP Biggin \n", + "4 Abbotsford 55a Park St 4 h 1600000.0 VB Nelson \n", + "6 Abbotsford 124 Yarra St 3 h 1876000.0 S Nelson \n", + "7 Abbotsford 98 Charles St 2 h 1636000.0 S Nelson \n", + "\n", + " Date Distance Postcode ... Bathroom Car Landsize BuildingArea \\\n", + "1 4/02/2016 2.5 3067.0 ... 1.0 0.0 156.0 79.0 \n", + "2 4/03/2017 2.5 3067.0 ... 2.0 0.0 134.0 150.0 \n", + "4 4/06/2016 2.5 3067.0 ... 1.0 2.0 120.0 142.0 \n", + "6 7/05/2016 2.5 3067.0 ... 2.0 0.0 245.0 210.0 \n", + "7 8/10/2016 2.5 3067.0 ... 1.0 2.0 256.0 107.0 \n", + "\n", + " YearBuilt CouncilArea Lattitude Longtitude Regionname \\\n", + "1 1900.0 Yarra -37.8079 144.9934 Northern Metropolitan \n", + "2 1900.0 Yarra -37.8093 144.9944 Northern Metropolitan \n", + "4 2014.0 Yarra -37.8072 144.9941 Northern Metropolitan \n", + "6 1910.0 Yarra -37.8024 144.9993 Northern Metropolitan \n", + "7 1890.0 Yarra -37.8060 144.9954 Northern Metropolitan \n", + "\n", + " Propertycount \n", + "1 4019.0 \n", + "2 4019.0 \n", + "4 4019.0 \n", + "6 4019.0 \n", + "7 4019.0 \n", + "\n", + "[5 rows x 21 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "melbourne_data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "8680d0c9", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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E8xhEepmUuoHKQCwvaAU8z46BJ3eFKSRERFRWxLUGZV58+ahsrISKSkpkEgksFqteOGFFzB58mSP1xuNRhiNRsfvKysrm2uobU5ptcktSLHbXlCK0moTl4CIiKjJBXVG5T//+Q/ef/99fPDBB9i/fz/Wrl2LV155BWvXrvV4/dKlSxEdHe34lZCQ0MwjbjsqDWaf56v8nCciIgoEkRDEEpuEhATMmzcPM2fOdBx7/vnn8a9//QsnTpxwu97TjEpCQgJ0Oh2ioqKaZcxtxemSaox47Xuv57c+fhu6x0U044iIiKi1qKysRHR0dIO+v4O69KPX6yEWu07qSCQS2Gw2j9fL5XLI5fLmGFqbp4mQYViyBts9LP8MS9ZAE8FlHyIianpBXfoZP348XnjhBWzZsgU///wzNmzYgNdeew0TJ04M5rAIQLRKhmWT+mJYssbl+LBkDZZP6sv8FCIiahZBXfqpqqrCggULsGHDBpSUlCA+Ph7Z2dl49tlnIZP5/yJszNQRXR97H5UqgxmRCik0EeyjQkREN6Yx399BDVRuFAMVIiKilqcx39/c64eIiIhCFgMVIiIiClkMVIiIiChkBbU8ma4fNwskIqK2gIFKC8TNAomIqK3g0k8Lw80CiYioLWGg0sI0ZLNAIiKi1oKBSgvDzQKJiKgtYaDSwkQppD7PR/o5T0RE1JIwUGlh7JsFesLNAomIqLVhoNLCcLNAIiJqS1ie3ALFxyixMjuNmwUSEVGrx0ClhYpWMTAhIqLWj0s/REREFLIYqBAREVHIYqBCREREIYuBChEREYUsBipEREQUshioEBERUchioEJEREQhi4EKERERhSwGKkRERBSyGKgQERFRyGKgQkRERCGLgQoRERGFLAYqREREFLIYqBAREVHIYqBCREREIYuBChEREYUsBipEREQUshioEBERUchioEJEREQhi4EKERERhSwGKkRERBSyGKgQERFRyGKgQkRERCGLgQoRERGFLAYqREREFLIYqBAREVHIYqBCREREIYuBChEREYUsBipEREQUshioEBERUchioEJEREQhi4EKERERhSwGKkRERBSyGKgQERFRyAoL9gCoeej0JpRWm1BpMCNKKYUmXIZolSzYwyIiIvKJgUobcL6iFnM/OoQdBaWOY8OSNVg2qS/iY5RBHBkREZFvXPpp5XR6k1uQAgDb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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.scatterplot(x=melbourne_data['BuildingArea'], y=melbourne_data['Price'])" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "da3b8409", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1 79.00\n", + "2 150.00\n", + "4 142.00\n", + "6 210.00\n", + "7 107.00\n", + " ... \n", + "12205 149.00\n", + "12206 115.00\n", + "12207 35.64\n", + "12209 61.60\n", + "12212 388.50\n", + "Name: BuildingArea, Length: 6196, dtype: float64" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "melbourne_data['BuildingArea']" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c1172236", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
BuildingAreaPrice
179.01035000.0
2150.01465000.0
4142.01600000.0
6210.01876000.0
7107.01636000.0
\n", + "
" + ], + "text/plain": [ + " BuildingArea Price\n", + "1 79.0 1035000.0\n", + "2 150.0 1465000.0\n", + "4 142.0 1600000.0\n", + "6 210.0 1876000.0\n", + "7 107.0 1636000.0" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# wählen für unser Beispiel einen kleinen Ausschnitt aus den Daten\n", + "max_area = 400\n", + "max_datapoints = 100\n", + "data = melbourne_data[melbourne_data['BuildingArea'] < max_area][:max_datapoints][['BuildingArea', 'Price']]\n", + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "8f9dec63", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "100" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(data)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "f1293084", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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sQgqAADAWAQVAABgLIIKAAAwFkEFAAAYi6ACAACMRVABAADGiuol9Fu2KaqsrLS5JQAAoKNartsd2W4wqoPK2bNnJUn5+fk2twQAAHTW2bNn5XK5/D4mqndPbm5u1rFjx9S9e3c5HA67m2OryspK5efn6+jRo+wk3Qmct+Bx7oLDeQse5y44Jp43y7J09uxZ9e7dWwkJ/qtQorpHJSEhQX369LG7GUZxOp3GvBCjCecteJy74HDegse5C45p5y1QT0oLimkBAICxCCoAAMBYBJUYkZKSop/97GdKSUmxuylRhfMWPM5dcDhvwePcBSfaz1tUF9MCAIDYRo8KAAAwFkEFAAAYi6ACAACMRVCJIg8++KAcDofX1+DBgz3319bWatasWcrOzlZmZqamTJmizz77zMYW22fTpk2aOHGievfuLYfDodWrV3vdb1mWHnjgAeXl5SktLU3jxo3TwYMHvR5z+vRp3X777XI6ncrKytKdd96pqqqqCD6LyAt03qZPn97mNTh+/Hivx8TjeVu4cKGuuuoqde/eXbm5ubr55pt14MABr8d05O/zyJEjuvHGG5Wenq7c3Fz96Ec/UmNjYySfSsR15Nxdc801bV53d911l9dj4u3cLVmyRMXFxZ61UUaOHKnXX3/dc38svd4IKlHm8ssv1/Hjxz1fmzdv9tz3gx/8QK+99ppWrlypjRs36tixY7rllltsbK19zp07p6FDh+q///u/fd7/+OOPa/HixXrmmWf07rvvKiMjQzfccINqa2s9j7n99tv1/vvv66233tKaNWu0adMmfe9734vUU7BFoPMmSePHj/d6Da5YscLr/ng8bxs3btSsWbP0t7/9TW+99ZYaGhp0/fXX69y5c57HBPr7bGpq0o033qj6+npt3bpVf/jDH7R8+XI98MADdjyliOnIuZOk7373u16vu8cff9xzXzyeuz59+mjRokXauXOnduzYoeuuu06TJk3S+++/LynGXm8WosbPfvYza+jQoT7vq6iosJKSkqyVK1d6btu/f78lydq2bVuEWmgmSdaqVas83zc3N1u9evWynnjiCc9tFRUVVkpKirVixQrLsixr3759liRr+/btnse8/vrrlsPhsD799NOItd1O5583y7KsadOmWZMmTWr3ZzhvXzh58qQlydq4caNlWR37+/zLX/5iJSQkWCdOnPA8ZsmS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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ax = sns.scatterplot(x=data['BuildingArea'], y=data['Price'])" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "00dc4dee", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "BuildingArea 79.0\n", + "Price 1035000.0\n", + "Name: 1, dtype: float64\n", + "[[1, 79.0]]\n" + ] + } + ], + "source": [ + "X = []\n", + "Y = []\n", + "for _, row in data.iterrows():\n", + " X.append([1] + [row['BuildingArea']])\n", + " Y.append(row['Price'])\n", + " break\n", + "X = np.array(X)\n", + "Y = np.array(Y)\n", + "print(X[:5], Y[:5])" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "efecad93", + "metadata": {}, + "outputs": [], + "source": [ + "def h_w(x, w):\n", + " return w[0] + w[1]*x" + ] + }, + { + "cell_type": "markdown", + "id": "e0577f21", + "metadata": {}, + "source": [ + "## Analytische Lösung der linearen Regression\n", + "\n", + "`np.linalg.solve(A, b)` berechnet $w$ im linearen Gleichungssystem\n", + "\n", + "$ A w = b $\n", + "\n", + "$A$ - Matrix,\n", + "$w$ - Vektor (unsere unbekannten),\n", + "$b$ - Vektor.\n", + "\n", + "Wir suchen die Lösung $w$ im folgenden Gleichungssystem:\n", + "\n", + "$$ X^T X w = X^T Y $$\n", + "\n", + "Mit $A = X^TX$ und $b = X^T Y$ berechnet `np.linalg.solve(A, b)` unsere gesuchten Paramter für die lineare Regression." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "35a78137", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 42 µs, sys: 7 µs, total: 49 µs\n", + "Wall time: 51.3 µs\n" + ] + } + ], + "source": [ + "%%time\n", + "w_ana = np.linalg.solve(X.T @ X, X.T @ Y)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "9a6041bd", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[441524.42083181 6024.22929588]\n" + ] + } + ], + "source": [ + "print(w_ana)" + ] + }, + { + "cell_type": "markdown", + "id": "f51a85af", + "metadata": {}, + "source": [ + "Plot der analytischen Lösung" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "6486ec38", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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3bp1uP7667F8+XK5m0JERESCCZXzh7/11lv47LPPcPjw4VE932QywWQy2b82Go3eahoREREJQLYelfr6ejz44IN44403EBkZOarv2bRpE9Rqtf1fenq6l1tJREREclJIkiTJ8YN37NiBm2++GSEhIfbHLBYLFAoFlEolTCaTwzHAeY9Keno6DAYDVCqVz9pORERE7jMajVCr1aO6f8s29FNUVIQTJ044PHb33XdDp9Nhw4YNQ0IKAERERCAiIsJXTSQiIiKZyRZU4uLikJub6/BYTEwMkpKShjxOREREwUn2VT9EREREw5F11c9gpaWlcjeBiIiIBMIeFSIiIhIWgwoREREJi0GFiIiIhMWgQkRERMJiUCEiIiJhMagQERGRsBhUiIiISFgMKkRERCQsBhUiIiISFoMKERERCYtBhYiIiITFoEJERETCYlAhIiIiYTGoEBERkbAYVIiIiEhYDCpEREQkLAYVIiIiEhaDChEREQmLQYWIiIiExaBCREREwmJQISIiImExqBAREZGwGFSIiIhIWAwqREREJCwGFSIiIhIWgwoREREJi0GFiIiIhMWgQkRERMJiUCEiIiJhMagQERGRsBhUiIiISFgMKkRERCQsBhUiIiISFoMKERERCYtBhYiIiITFoEJERETCYlAhIiIiYTGoEBERkbAYVIiIiEhYDCpEREQkLAYVIiIiEhaDChEREQmLQYWIiIiExaBCREREwmJQISIiImExqBAREZGwGFSIiIhIWAwqREREJCwGFSIiIhIWgwoREREJi0GFiIiIhMWgQkRERMJiUCEiIiJhMagQERGRsBhUiIiISFgMKkRERCQsBhUiIiISFoMKERERCYtBhYiIiITFoEJERETCYlAhIiIiYTGoEBERkbAYVIiIiEhYDCpEREQkLAYVIiIiEhaDChEREQkrVO4GEJG4DF1mNHWYYezphSoqDJqYcKijw+VuFhEFEVl7VF5++WXk5eVBpVJBpVKhoKAAH3zwgZxNIqJLzrd1Y/22MhS9uAc3//4Ail7Ygwe2leF8W7fcTSOiICJrUJk0aRI2b96Mo0eP4siRIygsLMSqVavw+eefy9ksoqBn6DJjw9+P45PqJofH91Y34dG/H4ehyyxTy4go2Mg69HPjjTc6fP3UU0/h5ZdfxqeffopZs2bJ1CoiauowDwkp/fZWN6Gpw8wh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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ax = sns.scatterplot(x=data['BuildingArea'], y=data['Price'])\n", + "\n", + "xplot = [min(data['BuildingArea']), max(data['BuildingArea'])]\n", + "yplot = [h_w(x, w_ana) for x in xplot]\n", + "sns.lineplot(x=xplot, y=yplot, ax=ax)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "aab92a40", + "metadata": {}, + "outputs": [], + "source": [ + "# Definition der Kostenfunktion\n", + "def J(w, x, y):\n", + " \"\"\"w, x, y müssen numpy arrays sein\"\"\"\n", + " errors = y - h_w(x=x, w=w)\n", + " mse = 1.0/(2.0*len(errors)) * ( errors @ errors )\n", + " return mse" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "7ef64eb2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Kosten der analytischen Lösung: 200141433273.1325\n" + ] + } + ], + "source": [ + "x = data['BuildingArea'].to_numpy(copy=True)\n", + "y = data['Price'].to_numpy(copy=True)\n", + "J_ana = J(w=w_ana, x=x, y=y)\n", + "print('Kosten der analytischen Lösung: {}'.format(J_ana))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "0272e5ad", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([441524.42083181, 6024.22929588])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "w_ana" + ] + }, + { + "cell_type": "markdown", + "id": "217f80c5", + "metadata": {}, + "source": [ + "## Numerische Lösung mit Gradient Descent" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "6cda3066", + "metadata": {}, + "outputs": [], + "source": [ + "def grad_desc_upd(w, alpha, x, y):\n", + " \"\"\"y, x sind Vektoren (numpy-arrays)\"\"\"\n", + " errors = y - h_w(x=x, w=w)\n", + " w_0_upd = w[0] + alpha / len(x) * sum(errors)\n", + " \n", + " errors_x_x1 = errors @ x\n", + " w_1_upd = w[1] + alpha / len(x) * errors_x_x1\n", + " return [w_0_upd, w_1_upd]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "b349e5ab", + "metadata": {}, + "outputs": [], + "source": [ + "def grad_desc(w, alpha, x, y, n_iterations):\n", + " J_all = [J(w=w, x=x, y=y)]\n", + " for it in range(n_iterations):\n", + " w = grad_desc_upd(w=w, alpha=alpha, x=x, y=y)\n", + " J_all.append(J(w=w, x=x, y=y))\n", + " return w, J_all" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "b87084ca", + "metadata": {}, + "outputs": [], + "source": [ + "w_tmp, J_tmp = grad_desc(w=[1e5, 1000.], alpha=1e-9, x=data['BuildingArea'].to_numpy(), y=data['Price'].to_numpy(), n_iterations=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "a129a532", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9999715711803561" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "J_tmp[1]/J_tmp[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "fd1bb601", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "w_gd_1e4: [915045.6766397628, 2959.2952860626924]\n", + "Vergleich zu Startkosten: 0.8899738097177349\n", + "Vergleich zu analytischer Lösung: 1.0924465228987312\n", + "(w0_gd - w0_ana)/w0_ana: 1.0724690039021088\n", + "(w1_gd - w1_ana)/w1_ana: -0.5087678206259784\n", + "CPU times: user 256 ms, sys: 8.18 ms, total: 264 ms\n", + "Wall time: 90.6 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "n_iterations = 10000\n", + "alpha = 0.0001 # mit alpha experimentieren\n", + "w_init = [1e6, 1000.]\n", + "x = data['BuildingArea'].to_numpy()\n", + "y = data['Price'].to_numpy()\n", + "w_gd_1e4, J_all_1e4 = grad_desc(w=w_init, alpha=alpha, x=x, y=y, n_iterations=n_iterations)\n", + "\n", + "print('w_gd_1e4: {}'.format(w_gd_1e4))\n", + "print('Vergleich zu Startkosten: {}'.format(J_all_1e4[-1]/J_all_1e4[0]))\n", + "print('Vergleich zu analytischer Lösung: {}'.format(J_all_1e4[-1]/J_ana))\n", + "print('(w0_gd - w0_ana)/w0_ana: {}'.format((w_gd_1e4[0]-w_ana[0])/w_ana[0]))\n", + "print('(w1_gd - w1_ana)/w1_ana: {}'.format((w_gd_1e4[1]-w_ana[1])/w_ana[1]))" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "1c26fde8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "w_gd_1e5: [548748.7304152894, 5330.2046262550075]\n", + "Vergleich zu Startkosten: 0.8185228834109243\n", + "Vergleich zu analytischer Lösung: 1.004740216095697\n", + "(w0_gd - w0_ana)/w0_ana: 0.24285023551238794\n", + "(w1_gd - w1_ana)/w1_ana: -0.1152055533638727\n", + "CPU times: user 958 ms, sys: 20.8 ms, total: 978 ms\n", + "Wall time: 825 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "n_iterations = 100000\n", + "alpha = 0.0001 # mit alpha experimentieren\n", + "w_init = [1e6, 1000.]\n", + "x = data['BuildingArea'].to_numpy()\n", + "y = data['Price'].to_numpy()\n", + "w_gd_1e5, J_all_1e5 = grad_desc(w=w_init, alpha=alpha, x=x, y=y, n_iterations=n_iterations)\n", + "\n", + "print('w_gd_1e5: {}'.format(w_gd_1e5))\n", + "print('Vergleich zu Startkosten: {}'.format(J_all_1e5[-1]/J_all_1e5[0]))\n", + "print('Vergleich zu analytischer Lösung: {}'.format(J_all_1e5[-1]/J_ana))\n", + "print('(w0_gd - w0_ana)/w0_ana: {}'.format((w_gd_1e5[0]-w_ana[0])/w_ana[0]))\n", + "print('(w1_gd - w1_ana)/w1_ana: {}'.format((w_gd_1e5[1]-w_ana[1])/w_ana[1]))" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "ebff7a0b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "w_gd_3e5: [445476.78736763657, 5998.647038552499]\n", + "Vergleich zu Startkosten: 0.8146664601191632\n", + "Vergleich zu analytischer Lösung: 1.000006440595892\n", + "(w0_gd - w0_ana)/w0_ana: 0.008951637439164814\n", + "(w1_gd - w1_ana)/w1_ana: -0.0042465610235696925\n", + "CPU times: user 2.4 s, sys: 53.3 ms, total: 2.45 s\n", + "Wall time: 2.46 s\n" + ] + } + ], + "source": [ + "%%time\n", + "n_iterations = 300000\n", + "alpha = 0.0001 # mit alpha experimentieren\n", + "w_init = [1e6, 1000.]\n", + "x = data['BuildingArea'].to_numpy()\n", + "y = data['Price'].to_numpy()\n", + "w_gd_3e5, J_all_3e5 = grad_desc(w=w_init, alpha=alpha, x=x, y=y, n_iterations=n_iterations)\n", + "\n", + "print('w_gd_3e5: {}'.format(w_gd_3e5))\n", + "print('Vergleich zu Startkosten: {}'.format(J_all_3e5[-1]/J_all_3e5[0]))\n", + "print('Vergleich zu analytischer Lösung: {}'.format(J_all_3e5[-1]/J_ana))\n", + "print('(w0_gd - w0_ana)/w0_ana: {}'.format((w_gd_3e5[0]-w_ana[0])/w_ana[0]))\n", + "print('(w1_gd - w1_ana)/w1_ana: {}'.format((w_gd_3e5[1]-w_ana[1])/w_ana[1]))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "a1b5db98", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "w_gd_1e6: [441524.45883596264, 6024.229049890118]\n", + "Vergleich zu Startkosten: 0.8146612132155007\n", + "Vergleich zu analytischer Lösung: 1.0000000000000007\n", + "(w0_gd - w0_ana)/w0_ana: 8.60748531445252e-08\n", + "(w1_gd - w1_ana)/w1_ana: -4.0832990952070806e-08\n", + "CPU times: user 7.99 s, sys: 155 ms, total: 8.14 s\n", + "Wall time: 8.22 s\n" + ] + } + ], + "source": [ + "%%time\n", + "n_iterations = 1000000\n", + "alpha = 0.0001 # mit alpha experimentieren\n", + "w_init = [1e6, 1000.]\n", + "x = data['BuildingArea'].to_numpy()\n", + "y = data['Price'].to_numpy()\n", + "w_gd_1e6, J_all_1e6 = grad_desc(w=w_init, alpha=alpha, x=x, y=y, n_iterations=n_iterations)\n", + "\n", + "print('w_gd_1e6: {}'.format(w_gd_1e6))\n", + "print('Vergleich zu Startkosten: {}'.format(J_all_1e6[-1]/J_all_1e6[0]))\n", + "print('Vergleich zu analytischer Lösung: {}'.format(J_all_1e6[-1]/J_ana))\n", + "print('(w0_gd - w0_ana)/w0_ana: {}'.format((w_gd_1e6[0]-w_ana[0])/w_ana[0]))\n", + "print('(w1_gd - w1_ana)/w1_ana: {}'.format((w_gd_1e6[1]-w_ana[1])/w_ana[1]))" + ] + }, + { + "cell_type": "markdown", + "id": "f35b62d4", + "metadata": {}, + "source": [ + "### Kosten J als Funktion von Gradient Descent Schritten" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "b18c5272", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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OFADBgzQI488EvTMCGEEAABcpqysTCtWrNCaNWs0ceJEDR48WE8++aRuv/12rVixQpJUWlqqo0ePas2aNVq1apVWrlypoqIi3XfffUF9Fj0jAADgMvv27ZPf79eQIUNabPd6verdu7ckKRAIyOv1atWqVc37vfbaa7rllltUUlLS7lM3hBEAAHCZ6upqxcbGqqioSLGxsS1e69mzpyQpKytLcXFxLQLLjTfeKKlhZoUwAgAAQjZ69Gj5/X6dOXNGEydObHWfCRMmqL6+Xp988okGDx4sSfroo48kSddee227P4uraQAAsKnq6modOnRIUkP4eOmllzRlyhSlp6erf//++s53vqOdO3fqxRdf1OjRo3X27Flt2bJFI0aM0L333qtAIKCxY8eqZ8+eevnllxUIBOR2u5WSkqJ333233XUQRgAAsKnCwkJNmTLlsu2zZ8/WypUr5fP5tGjRIq1atUonTpxQRkaGbrvtNi1cuFDDhw+XJJ08eVKPP/643n33XSUnJ+vuu+/Wiy++qPT09HbXQRgBAABGcWkvAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAo/4/RHKJwieaoB0AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.lineplot(x=list(range(len(J_all_1e6))), y=J_all_1e6)" + ] + }, + { + "cell_type": "markdown", + "id": "5ec059f6", + "metadata": {}, + "source": [ + "### Plotten der Ergebnisse und Vergleich zwischen analytischer und numerischer Lösung\n", + "Nach $10^4$ Schritten des Gradient Descent Algorithmus weicht der lineare Fit noch sichtbar von der analytischen Lösung ab. Nach $10^5$ Schritten ist der Unterschied im Plot kaum zu erkennen.\n", + "Die numerische Lösung war in diesem Beispiel deutlich langsamer als die analytische. Allerdings haben wir für die analytische Lösung auch eine effiziente numpy-Implementierung genutzt und für die numerische unoptimierten Python-Code." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "21c941e4", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAHACAYAAACMB0PKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABhfklEQVR4nO3daXhb1b02/FuzJduSB1m25FGeMzmEBGiaECBJISmlTKUtpT0MPe0DJJxS2h6g7elIS2ihp4f2lE4M5XkgbSlDX2iZGkgCIaVJyDw4HuR5niTLtsa93w/CimVLnm1tSffvunIVa0vbS7u29u21/mstmSiKIoiIiIgkSB7tBhARERFFwqBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJLFoEJERESSFTdBZe/evbjqqqtgsVggk8nw0ksvzfgcoiji4YcfRnl5OTQaDXJzc/GjH/1o/htLRERE06KMdgPmy9DQEFauXInbbrsN11133azO8ZWvfAVvvPEGHn74YaxYsQJ9fX3o6+ub55YSERHRdMnicVNCmUyGF198Eddcc03wMbfbjW9961vYuXMnBgYGsHz5cjz00EO49NJLAQCnT59GVVUVTpw4gYqKiug0nIiIiELEzdDPVLZv3479+/fjj3/8I44dO4YbbrgBW7ZsQU1NDQDg5ZdfRnFxMV555RVYrVYUFRXh3//939mjQkREFEUJEVSamprw5JNP4rnnnsPFF1+MkpISfP3rX8f69evx5JNPAgDq6+vR2NiI5557Dk8//TSeeuopHDp0CJ/61Kei3HoiIqLEFTc1KpM5fvw4/H4/ysvLQx53u93IzMwEAAiCALfbjaeffjr4vMcffxyrV69GdXU1h4OIiIiiICGCitPphEKhwKFDh6BQKEKOpaSkAADMZjOUSmVImFmyZAmAQI8MgwoREdHiS4igsmrVKvj9fnR1deHiiy8O+5x169bB5/Ohrq4OJSUlAICzZ88CAAoLCxetrURERHRO3Mz6cTqdqK2tBRAIJj/72c9w2WWXISMjAwUFBfj85z+Pffv24ZFHHsGqVavQ3d2NXbt2oaqqCldeeSUEQcAFF1yAlJQU/PznP4cgCNi2bRv0ej3eeOONKL87IiKixBQ3QWX37t247LLLJjx+880346mnnoLX68UDDzyAp59+Gq2trTAajfjIRz6C73//+1ixYgUAoK2tDXfddRfeeOMNJCcnY+vWrXjkkUeQkZGx2G+HiIiIEEdBhYiIiOJPQkxPJiIiotjEoEJERESSFdOzfgRBQFtbG1JTUyGTyaLdHCIiIpoGURQxODgIi8UCuXzyPpOYDiptbW3Iz8+PdjOIiIhoFpqbm5GXlzfpc2I6qKSmpgIIvFG9Xh/l1hAREdF0OBwO5OfnB+/jk4npoDI63KPX6xlUiIiIYsx0yjZYTEtERESSxaBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJLFoEJERESSFdNL6BMRxSv7sAc9Tg8cLi/0WhWMyWoYdOpoN4to0TGoEBFJTNvACO59/hjeqekJPrahzIgd11fBkqaNYsuIFh+HfoiIJMQ+7JkQUgBgb00P7nv+GOzDnii1jCg6GFSIiCSkx+mZEFJG7a3pQY+TQYUSC4MKEZGEOFzeSY8PTnGcKN4wqBARSYg+STXp8dQpjhPFGwYVIiIJMaaosaHMGPbYhjIjjCmc+UOJhUGFiEhCDDo1dlxfNSGsbCgz4qHrqzhFmRIOpycTEUmMJU2LX9y4Cj1ODwZdXqQmqWBM4ToqlJgYVIiIJMigYzAhAjj0Q0RERBLGoEJERESSxaBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJLFoEJERESSxaBCREREksWgQkRERJIlmaCyY8cOyGQy3H333dFuChEREUmEJILKgQMH8Jvf/AZVVVXRbgoRERFJSNSDitPpxE033YTf/e53SE9Pj3ZziIiISEKi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+93vcPnllwNASE2J1+tdlHapVKqQr2Uy2YyGVUaHmLxeLx577LHg436/H0888QR+9KMfBR9LTk4Oea3T6cRVV12Fhx56aMJ5zWYzAOCqq65CYWEhfve738FisUAQBCxfvpzFuEQLiD0qRASZTAa5XI6RkRFkZWUBANrb24PHxxerTsZgMMBsNuP9998PPubz+XDo0KE5tbGiogLHjx+H2+0OPjZ+6vEzzzyDvLw8HD16NNhjdOTIkWDNjN/vj3j+888/HydPnkRRURFKS0tD/iUnJ6O3txfV1dX49re/jU2bNmHJkiXo7++f03sioqkxqBAlILfbjY6ODnR0dOD06dO46667gj0KpaWlyM/Px/e+9z3U1NTgb3/7Gx555JEZnf8rX/kKduzYgZdeeglnzpzBnXfeGTKLaDY+97nPQRAEfPnLX8bp06fx+uuv4+GHHwYQCFoA8Pjjj+NTn/oUli9fHvLvi1/8Inp6evDaa69FPP+2bdvQ19eHG2+8EQcOHEBdXR1ef/113HrrrfD7/UhPT0dmZiZ++9vfora2Fm+99RbuueeeOb0nIpoagwpRAnrttddgNpthNptx0UUX4cCBA3juuedw6aWXQqVSYefOnThz5gyqqqrw0EMP4YEHHpjR+b/2ta/hC1/4Am6++WasXbsWqampuPbaa+fUZr1ej5dffhlHjhzBeeedh29961v4zne+AwBISkrCoUOHcPTo0QkFr0Cgl2fTpk14/PHHI57fYrFg37598Pv9uPzyy7FixQrcfffdSEtLg1wuh1wuxx//+EccOnQIy5cvx1e/+lX89Kc/ndN7IqKpycTxixsQEcWIZ555Brfeeivsdju0Wm20m0NEC4DFtEQUM55++mkUFxcjNzcXR48exb333otPf/rTDClEcYxBhYhiRkdHB77zne+go6MDZrMZN9xwQ8hMHiKKPxz6ISIiIsliMS0RERFJFoMKERERSRaDChEREUkWgwoRERFJFoMKERERSRaDChEREUkWgwoRERFJFoMKERERSRaDChEREUnW/w8tk/1QG0NcpAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot\n", + "xplot = [min(data['BuildingArea']), max(data['BuildingArea'])]\n", + "yplot_ana = [h_w(x, w_ana) for x in xplot]\n", + "yplot_gd_1e4 = [h_w(x, w_gd_1e4) for x in xplot]\n", + "yplot_gd_1e5 = [h_w(x, w_gd_1e5) for x in xplot]\n", + "# yplot_gd_3e5 = [h_w(x, w_gd_3e5) for x in xplot]\n", + "yplot_gd_1e6 = [h_w(x, w_gd_1e6) for x in xplot]\n", + "ax = sns.scatterplot(x=data['BuildingArea'], y=data['Price'])\n", + "ax = sns.lineplot(x=xplot, y=yplot_ana, ax=ax)\n", + "ax = sns.lineplot(x=xplot, y=yplot_gd_1e4, color='red', ax=ax)\n", + "ax = sns.lineplot(x=xplot, y=yplot_gd_1e5, color='grey', ax=ax)\n", + "# ax = sns.lineplot(x=xplot, y=yplot_gd_3e5, color='green', linestyle='dotted', ax=ax)\n", + "ax = sns.lineplot(x=xplot, y=yplot_gd_1e6, color='pink', linestyle='--', ax=ax)" + ] + }, + { + "cell_type": "markdown", + "id": "60bc96a1", + "metadata": {}, + "source": [ + "## Vorhersagen unseres Modells\n", + "\n", + "Man kann die Vorhersagen des Modells entweder im Plot oben auf der Geraden ablesen. Zu jedem Wert von `BuildingArea` (x-Achse des Plots) kann so der `Preis` auf der y-Achse abgelesen werden.\n", + "\n", + "Alternativ können wir die von uns oben definierte Funktion `h_w(x, w)` aufrufen. Der Parameter `w` ist die gefunden Lösung und `x` die `BuildingArea` für die wir einen Preis vorhersagen wollen." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "e13003c8", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Preis laut analytischem Modell: 2170478.23\n", + "Preis laut Gradient Descent Modell nach 10^5 Iterationen: 2078517.46\n", + "Preis laut Gradient Descent Modell nach 3*10^5 Iterationen: 2167088.49\n", + "Preis laut Gradient Descent Modell nach 1*10^6 Iterationen: 2170478.20\n" + ] + } + ], + "source": [ + "# Beispiel: Vorhersage unseres Modells für ein Haus mit Wohnfläche 287:\n", + "# wir machen je eine Vorhersage mit\n", + "# 1. den analytisch gefundenen Paramtern\n", + "# 2. den mit Gradient Descent nach 10^5 Iterationen gefundenen Parametern\n", + "# 3. den mit Gradient Descent nach 3*10^5 Iterationen gefundenen Parametern\n", + "building_area_new = 287\n", + "price_ana = h_w(x=building_area_new, w=w_ana)\n", + "price_1e5 = h_w(x=building_area_new, w=w_gd_1e5)\n", + "price_3e5 = h_w(x=building_area_new, w=w_gd_3e5)\n", + "price_1e6 = h_w(x=building_area_new, w=w_gd_1e6)\n", + "print('Preis laut analytischem Modell: {:.2f}'.format(price_ana))\n", + "print('Preis laut Gradient Descent Modell nach 10^5 Iterationen: {:.2f}'.format(price_1e5))\n", + "print('Preis laut Gradient Descent Modell nach 3*10^5 Iterationen: {:.2f}'.format(price_3e5))\n", + "print('Preis laut Gradient Descent Modell nach 1*10^6 Iterationen: {:.2f}'.format(price_1e6))" + ] + }, + { + "cell_type": "markdown", + "id": "fca62677", + "metadata": {}, + "source": [ + "## $R^2$" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "f1703c7f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "erklärte Varianz (R^2): 0.22971025499088604\n" + ] + } + ], + "source": [ + "x = data['BuildingArea'].to_numpy(copy=True)\n", + "y = data['Price'].to_numpy(copy=True)\n", + "J_ana = J(w=w_ana, x=x, y=y)\n", + "MSE = 2*J_ana\n", + "mu_y = sum(y)/len(y)\n", + "sigma_y_quadrat = ( (y - mu_y) @ (y - mu_y) ) / len(y)\n", + "R2 = 1 - MSE/sigma_y_quadrat\n", + "print('erklärte Varianz (R^2): {}'.format(R2))" + ] + } + ], + "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.10.12" + }, + "varInspector": { + "cols": { + "lenName": 16, + "lenType": 16, + "lenVar": 40 + }, + "kernels_config": { + "python": { + "delete_cmd_postfix": "", + "delete_cmd_prefix": "del ", + "library": "var_list.py", + "varRefreshCmd": "print(var_dic_list())" + }, + "r": { + "delete_cmd_postfix": ") ", + "delete_cmd_prefix": "rm(", + "library": "var_list.r", + "varRefreshCmd": "cat(var_dic_list()) " + } + }, + "types_to_exclude": [ + "module", + "function", + "builtin_function_or_method", + "instance", + "_Feature" + ], + "window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Aufgaben/02 - linear regression - multiple features.ipynb b/Aufgaben/02 - linear regression - multiple features.ipynb new file mode 100644 index 0000000..f0910e4 --- /dev/null +++ b/Aufgaben/02 - linear regression - multiple features.ipynb @@ -0,0 +1,1163 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2f8e19e4", + "metadata": {}, + "source": [ + "# Lineare Regression mit mehreren Features ($d>1$)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "643861b2", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "# plotting settings\n", + "pd.plotting.register_matplotlib_converters()\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "import seaborn as sns\n", + "from tqdm.notebook import tqdm" + ] + }, + { + "cell_type": "markdown", + "id": "315bd31f", + "metadata": {}, + "source": [ + "Wir verwenden hier beispielhaft den Datensatz [Melbourne Housing Snapshot](https://www.kaggle.com/datasets/dansbecker/melbourne-housing-snapshot). Diesen finden Sie auch im Moodle unter `data/kaggle/melb_data.csv`." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e3381ac0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Suburb', 'Address', 'Rooms', 'Type', 'Price', 'Method', 'SellerG',\n", + " 'Date', 'Distance', 'Postcode', 'Bedroom2', 'Bathroom', 'Car',\n", + " 'Landsize', 'BuildingArea', 'YearBuilt', 'CouncilArea', 'Lattitude',\n", + " 'Longtitude', 'Regionname', 'Propertycount'],\n", + " dtype='object')" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "melbourne_file_path = 'data/melb_data.csv'\n", + "melbourne_data = pd.read_csv(melbourne_file_path)\n", + "melbourne_data = melbourne_data.dropna(axis=0) # entfernen von Daten mit fehlenden Werten\n", + "melbourne_data.columns # Spaltennamen der Tabelle (potentielle Features)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "0f80237c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SuburbAddressRoomsTypePriceMethodSellerGDateDistancePostcode...BathroomCarLandsizeBuildingAreaYearBuiltCouncilAreaLattitudeLongtitudeRegionnamePropertycount
1Abbotsford25 Bloomburg St2h1035000.0SBiggin4/02/20162.53067.0...1.00.0156.079.01900.0Yarra-37.8079144.9934Northern Metropolitan4019.0
2Abbotsford5 Charles St3h1465000.0SPBiggin4/03/20172.53067.0...2.00.0134.0150.01900.0Yarra-37.8093144.9944Northern Metropolitan4019.0
4Abbotsford55a Park St4h1600000.0VBNelson4/06/20162.53067.0...1.02.0120.0142.02014.0Yarra-37.8072144.9941Northern Metropolitan4019.0
6Abbotsford124 Yarra St3h1876000.0SNelson7/05/20162.53067.0...2.00.0245.0210.01910.0Yarra-37.8024144.9993Northern Metropolitan4019.0
7Abbotsford98 Charles St2h1636000.0SNelson8/10/20162.53067.0...1.02.0256.0107.01890.0Yarra-37.8060144.9954Northern Metropolitan4019.0
\n", + "

5 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " Suburb Address Rooms Type Price Method SellerG \\\n", + "1 Abbotsford 25 Bloomburg St 2 h 1035000.0 S Biggin \n", + "2 Abbotsford 5 Charles St 3 h 1465000.0 SP Biggin \n", + "4 Abbotsford 55a Park St 4 h 1600000.0 VB Nelson \n", + "6 Abbotsford 124 Yarra St 3 h 1876000.0 S Nelson \n", + "7 Abbotsford 98 Charles St 2 h 1636000.0 S Nelson \n", + "\n", + " Date Distance Postcode ... Bathroom Car Landsize BuildingArea \\\n", + "1 4/02/2016 2.5 3067.0 ... 1.0 0.0 156.0 79.0 \n", + "2 4/03/2017 2.5 3067.0 ... 2.0 0.0 134.0 150.0 \n", + "4 4/06/2016 2.5 3067.0 ... 1.0 2.0 120.0 142.0 \n", + "6 7/05/2016 2.5 3067.0 ... 2.0 0.0 245.0 210.0 \n", + "7 8/10/2016 2.5 3067.0 ... 1.0 2.0 256.0 107.0 \n", + "\n", + " YearBuilt CouncilArea Lattitude Longtitude Regionname \\\n", + "1 1900.0 Yarra -37.8079 144.9934 Northern Metropolitan \n", + "2 1900.0 Yarra -37.8093 144.9944 Northern Metropolitan \n", + "4 2014.0 Yarra -37.8072 144.9941 Northern Metropolitan \n", + "6 1910.0 Yarra -37.8024 144.9993 Northern Metropolitan \n", + "7 1890.0 Yarra -37.8060 144.9954 Northern Metropolitan \n", + "\n", + " Propertycount \n", + "1 4019.0 \n", + "2 4019.0 \n", + "4 4019.0 \n", + "6 4019.0 \n", + "7 4019.0 \n", + "\n", + "[5 rows x 21 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "melbourne_data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b4939e52", + "metadata": {}, + "outputs": [], + "source": [ + "#features = ['BuildingArea', Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude', 'YearBuilt', 'Distance']\n", + "features = ['Rooms', 'BuildingArea']\n", + "data = melbourne_data[features + ['Price']]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "47f35849", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RoomsBuildingAreaPrice
count6196.0000006196.0000006.196000e+03
mean2.931407141.5686451.068828e+06
std0.97107990.8348246.751564e+05
min1.0000000.0000001.310000e+05
25%2.00000091.0000006.200000e+05
50%3.000000124.0000008.800000e+05
75%4.000000170.0000001.325000e+06
max8.0000003112.0000009.000000e+06
\n", + "
" + ], + "text/plain": [ + " Rooms BuildingArea Price\n", + "count 6196.000000 6196.000000 6.196000e+03\n", + "mean 2.931407 141.568645 1.068828e+06\n", + "std 0.971079 90.834824 6.751564e+05\n", + "min 1.000000 0.000000 1.310000e+05\n", + "25% 2.000000 91.000000 6.200000e+05\n", + "50% 3.000000 124.000000 8.800000e+05\n", + "75% 4.000000 170.000000 1.325000e+06\n", + "max 8.000000 3112.000000 9.000000e+06" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "ed0fdea0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RoomsBuildingAreaPrice
1279.01035000.0
23150.01465000.0
44142.01600000.0
63210.01876000.0
72107.01636000.0
\n", + "
" + ], + "text/plain": [ + " Rooms BuildingArea Price\n", + "1 2 79.0 1035000.0\n", + "2 3 150.0 1465000.0\n", + "4 4 142.0 1600000.0\n", + "6 3 210.0 1876000.0\n", + "7 2 107.0 1636000.0" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.head()" + ] + }, + { + "cell_type": "markdown", + "id": "b5126919", + "metadata": {}, + "source": [ + "## Definition der Funktionen für die Lineare Regression" + ] + }, + { + "cell_type": "markdown", + "id": "dacabf66", + "metadata": {}, + "source": [ + "Aus der Vorlesung:\n", + "\n", + "$$ h(x, w) = w^T x . $$\n", + "\n", + "In der Vorlesung haben wir $\\theta$ statt $w$ verwendet.\n", + "\n", + "**Wichtig:** Diese Definition von $h$ nimmt an, dass die erste Komponente von $x$, also in Python code `x[0]`, immer 1 ist.\n", + "\n", + "Wir können auch eine vektorisierte Form von $h(x, w)$ definieren, bei der der Input $X$ mehrere (oder alle) Trainingsbeispiele umfasst und der Output ein Vektor aus den zugehörigen Werten von h zu jedem der Trainingsbeispiele ist. In Matrixschreibweise:\n", + "\n", + "$$ h(X, w) = X w , $$\n", + "\n", + "wobei die Zeilen von $X$ aus je einem Trainingsbeispiel (inkl. der \"1\" in der ersten Komponente) bestehen.\n", + "\n", + "Aufgrund der Art wie `numpy` den Spezialfall der Multiplikation zweier Vektoren handhabt können wir den Code für beide oben erwähnten Varianten von $h$ vereinheitlichen und eine Funktion $h(x, w)$ definieren, die sowohl mit einer Inputzeile als auch mit mehreren Inputzeilen umgehen kann.\n", + "\n", + "Bei der Multiplikation zweier numpy arrays (also zweier Vektoren) mittels `@`-Operator bildet numpy stets das Skalarprodukt der Vektoren, ohne dass man einen der Vektoren transponieren müsste. D.h., wenn wir zwei Spaltenvektoren $w, x$ haben, lautet die korrekte Schreibweise eigentlich:\n", + "$$w^T x$$\n", + "numpy erlaubt es uns aber einfach `w @ x` oder auch `x @ w` zu schreiben anstelle (des ebenfalls möglichen) `w.T @ x`.\n", + "\n", + "Dies ermöglicht es uns eine vektorisierte Form von $h(x, w)$ leicht aufzuschreiben, die sowohl mit einem Parameter `x` bestehend aus einer Zeile an Inputdaten (also z.B. einem einzelnen Trainingsbeispiel) funktioniert als auch mit der gesamten Feature-Matrix `X`, bestehend aus allen (oder mehreren) Trainingsdaten auf einmal." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "14116a52", + "metadata": {}, + "outputs": [], + "source": [ + "def h(x, w):\n", + " \"\"\"x und w sind numpy arrays; x kann auch die komplette Feature-Matrix sein\"\"\"\n", + " # Diese Form erlaubt es für x eine ganze (Feature-)Matrix zu übergeben. Die Matrix enthält\n", + " # zeilenweise je einen Datenpunkt, für den h berechnet werden soll.\n", + " # w @ x.T ist dann ein Vektor mit je einem Ergebnis in den Komponenten des Vektors pro Zeile\n", + " # der übergebenen (Feature-)Matrix.\n", + " return x @ w" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "82129a25", + "metadata": {}, + "outputs": [], + "source": [ + "# Definition der Kostenfunktion\n", + "def J(w, X, y):\n", + " \"\"\"\n", + " w, X, y müssen numpy arrays sein\n", + " X: Feature-Matrix aller Trainingsdaten inkl. Spalte mit 1; Dimension: n x (d+1)\n", + " y: Vektor aller Targets zu X\n", + " \"\"\"\n", + " errors = y - h(x=X, w=w)\n", + " mse = 1.0/(2.0*len(y)) * ( errors @ errors )\n", + " return mse" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "4209dc9c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(6196, 3)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "8b34a5c7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1.],\n", + " [1.],\n", + " [1.],\n", + " ...,\n", + " [1.],\n", + " [1.],\n", + " [1.]])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.ones((len(data),1))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "6632cabe", + "metadata": {}, + "outputs": [], + "source": [ + "def feature_matrix_from_data(data):\n", + " # hier erzeugen wir die Matrix mit unseren Input-Daten (Features) inklusive der Spalte mit \"1\"\n", + " return np.hstack((np.ones((len(data),1)), data.to_numpy(copy=True)))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "74556a69", + "metadata": {}, + "outputs": [], + "source": [ + "# hier erzeugen wir die Matrix mit unseren Input-Daten (Features) inklusive der Spalte mit \"1\"\n", + "#X = np.hstack((np.ones((len(data),1)), data[features].to_numpy(copy=True)))\n", + "X = feature_matrix_from_data(data[features])\n", + "# und ausserdem den Vektor der Targets\n", + "y = data.Price.to_numpy(copy=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "79f5e3e0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(6196, 3)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "8f9724c3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1. , 2. , 79. ],\n", + " [ 1. , 3. , 150. ],\n", + " [ 1. , 4. , 142. ],\n", + " ...,\n", + " [ 1. , 1. , 35.64],\n", + " [ 1. , 2. , 61.6 ],\n", + " [ 1. , 6. , 388.5 ]])" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X" + ] + }, + { + "cell_type": "markdown", + "id": "85733d6b", + "metadata": {}, + "source": [ + "**Hinweis:** Die Matrix $X$ hat zwar die gleiche Dimension wie `data`, allerdings enthält data eine Spalte `Price`, die in $X$ nicht enthalten ist. Dafür hat $X$ als erste Spalte die \"1er\"." + ] + }, + { + "cell_type": "markdown", + "id": "1d8e64e6", + "metadata": {}, + "source": [ + "## Analytische Lösung der linearen Regression\n", + "\n", + "Die analytische Lösung verläuft identisch zum Fall mit nur einem Feature.\n", + "\n", + "`np.linalg.solve(A, b)` berechnet $w$ im linearen Gleichungssystem\n", + "\n", + "$ A w = b $\n", + "\n", + "$A$ - Matrix,\n", + "$w$ - Vektor (unsere unbekannten),\n", + "$b$ - Vektor.\n", + "\n", + "Wir suchen die Lösung $w$ im folgenden Gleichungssystem:\n", + "\n", + "$$ X^T X w = X^T Y $$\n", + "\n", + "Mit $A = X^TX$ und $b = X^T Y$ berechnet `np.linalg.solve(A, b)` unsere gesuchten Paramter für die lineare Regression." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "fc1d2c0a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Die 3 Parameter der linearen Regression:\n", + "[ 42769.88494072 232612.86504788 2431.15453776]\n", + "Kostenfunktion J(w_ana): 147658829426.14856\n", + "CPU times: user 11.3 ms, sys: 2.13 ms, total: 13.4 ms\n", + "Wall time: 1.7 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "w_ana = np.linalg.solve(X.T @ X, X.T @ y)\n", + "print('Die {} Parameter der linearen Regression:\\n{}'.format(len(w_ana), w_ana))\n", + "J_ana = J(w=w_ana, X=X, y=y)\n", + "print('Kostenfunktion J(w_ana): {}'.format(J_ana))" + ] + }, + { + "cell_type": "markdown", + "id": "daab4572", + "metadata": {}, + "source": [ + "## Numerische Lösung mit Gradient Descent" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "b314f36a", + "metadata": {}, + "outputs": [], + "source": [ + "## Numerische Lösung mit Gradient Descent\n", + "def grad_desc_upd(w, alpha, x, y):\n", + " \"\"\"y, x sind Vektoren (numpy-arrays)\"\"\"\n", + " errors = y - h(x=x, w=w)\n", + " w = w + alpha / len(y) * (x.T @ errors)\n", + " return w" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "3dc2775c", + "metadata": {}, + "outputs": [], + "source": [ + "def grad_desc(w, alpha, x, y, n_iterations):\n", + " J_all = [[0], [J(w=w, X=x, y=y)]]\n", + " for it in tqdm(range(n_iterations)):\n", + " w = grad_desc_upd(w=w, alpha=alpha, x=x, y=y)\n", + " if it % 100 == 0:\n", + " J_all[1].append(J(w=w, X=x, y=y))\n", + " J_all[0].append(it)\n", + " return w, J_all" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "a801cac3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 2.43686014, 5.00088371, 206.19316114])" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grad_desc_upd(w=np.ones(X.shape[1]), alpha=1e-6, x=X[:7], y=y[:7])" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "dc6f778a", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e9c9403f9b08472294edb52bb2c10c1d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/10000 [00:00" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.lineplot(x=J_all[0], y=J_all[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "31574b9a", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "16a65185cb4541ffbdb5a02b33027697", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/1000000 [00:00" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAG+CAYAAABBOgSxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA4xElEQVR4nO3deXxU5f3//ffMJDPZBwLZgAiyr2FzISh1o0WlFtp+rUUU2y/a2kKL7U+/LdXeLmiDrXjXb7UobtRbMRZvwRYRtShQDVhWjYDIngBZEMhMEmCSzJzfH0kGAknIJDNzMsnr+XicR5yT68z5zIGH8+a6rnMdi2EYhgAAAExiNbsAAADQuRFGAACAqQgjAADAVIQRAABgKsIIAAAwFWEEAACYijACAABMRRgBAACmIowAAABTEUYAAICpIiqMrFu3TjfddJN69Oghi8Wi5cuXB3T86dOn9aMf/UgjRoxQVFSUpk6del6boqIi3XrrrRo4cKCsVqvuueeeoNQOAAAaF1FhpLKyUiNHjtQzzzzTquO9Xq9iY2P1y1/+UhMnTmy0jcfjUUpKih544AGNHDmyLeUCAIAWiDK7gEDccMMNuuGGG5r8vcfj0f3336/XX39dZWVlGj58uB5//HFdffXVkqT4+HgtXLhQkvTJJ5+orKzsvPfo06ePnnrqKUnSSy+9FPTPAAAAGoqonpELmT17ttavX6/c3Fx9/vnnuvnmm3X99ddr9+7dZpcGAACa0GHCSEFBgV5++WUtXbpUEyZMUL9+/XTvvffqyiuv1Msvv2x2eQAAoAkRNUzTnPz8fHm9Xg0cOLDBfo/Ho27duplUFQAAuJAOE0YqKipks9m0efNm2Wy2Br9LSEgwqSoAAHAhHSaMjB49Wl6vV6WlpZowYYLZ5QAAgBaKqDBSUVGhPXv2+F/v379f27ZtU3JysgYOHKjp06drxowZWrBggUaPHq2jR49q9erVysrK0uTJkyVJO3bsUFVVlY4fP67y8nJt27ZNkjRq1Cj/+9bvq6io0NGjR7Vt2zbZ7XYNHTo0XB8VAIBOw2IYhmF2ES21Zs0aXXPNNeftv+OOO7R48WJVV1fr0Ucf1SuvvKLDhw+re/fuGjdunB5++GGNGDFCUu2tuwcPHjzvPc6+DBaL5bzf9+7dWwcOHAjehwEAAJIiLIwAAICOp8Pc2gsAACITYQQAAJgqIiaw+nw+HTlyRImJiY3O5wAAAO2PYRgqLy9Xjx49ZLU23f8REWHkyJEjyszMNLsMAADQCoWFherVq1eTv4+IMJKYmCip9sMkJSWZXA0AAGgJt9utzMxM//d4UyIijNQPzSQlJRFGAACIMBeaYhHQBNaHHnpIFoulwTZ48OAm2y9evPi89jExMYGcEgAAdHAB94wMGzZM//rXv868QVTzb5GUlKRdu3b5XzMBFQAAnC3gMBIVFaX09PQWt7dYLAG1BwAAnUvA64zs3r1bPXr0UN++fTV9+nQVFBQ0276iokK9e/dWZmampkyZou3bt1/wHB6PR263u8EGAAA6poDCyOWXX67Fixdr1apVWrhwofbv368JEyaovLy80faDBg3SSy+9pLfffluvvvqqfD6fxo8fr0OHDjV7npycHDmdTv/Gbb0AAHRcbXo2TVlZmXr37q0nn3xSM2fOvGD76upqDRkyRNOmTdO8efOabOfxeOTxePyv628Ncrlc3E0DAECEcLvdcjqdF/z+btOtvV26dNHAgQO1Z8+eFrWPjo7W6NGjL9je4XDI4XC0pTQAABAh2vRsmoqKCu3du1cZGRktau/1epWfn9/i9gAAoOMLKIzce++9Wrt2rQ4cOKC8vDx997vflc1m07Rp0yRJM2bM0Ny5c/3tH3nkEb3//vvat2+ftmzZottuu00HDx7UnXfeGdxPAQAAIlZAwzSHDh3StGnTdOzYMaWkpOjKK6/Uhg0blJKSIkkqKCho8CCcEydO6K677lJxcbG6du2qsWPHKi8vT0OHDg3upwAAABGrTRNYw6WlE2AAAED70dLv7zbNGQEAAGirTh1GfvH6Vt38bJ6KXafNLgUAgE4rIp7aGyob9x9Xsfu0SstPK93JA/wAADBDp+4Z6RpvlyQdr6wyuRIAADqvTh1GutWFkRMnCSMAAJilU4eR+p6RYxWEEQAAzNKpwwg9IwAAmK9Th5GuccwZAQDAbJ06jCQnEEYAADBb5w4j9IwAAGC6zh1GuLUXAADTEUZEGAEAwEyEEUllp6rl9bX75wUCANAhdeow0iUuWpJkGFIZt/cCAGCKTh1Gom1WOWNrAwlrjQAAYI5OHUakM0M1rMIKAIA5CCOswgoAgKk6fRipX4X1GHfUAABgik4fRvzPpyGMAABgik4fRvxP7iWMAABgik4fRugZAQDAXJ0+jNAzAgCAuTp9GOnG3TQAAJiq04eRrv5hmmqTKwEAoHPq9GGkm3+YxmNyJQAAdE6dPozU94ycrvbpVJXX5GoAAOh8On0YibfbZI+qvQz0jgAAEH6dPoxYLBYlxzFvBAAAs3T6MCKd9bA8ekYAAAg7woh4WB4AAGYijOisnpEKwggAAOFGGNGZMHKcVVgBAAg7woik7gm1YeTrCuaMAAAQboQRSd0THJIYpgEAwAyEEUnd6sIIPSMAAIQfYURnD9PQMwIAQLgRRnTWME2lR4ZhmFwNAACdC2FEUreEM8+nqeT5NAAAhBVhRFKcPUpxdpsk6RjzRgAACKuAwshDDz0ki8XSYBs8eHCzxyxdulSDBw9WTEyMRowYoZUrV7ap4FDpxu29AACYIuCekWHDhqmoqMi/ffzxx022zcvL07Rp0zRz5kxt3bpVU6dO1dSpU/XFF1+0qehQ6O6/o4ZJrAAAhFPAYSQqKkrp6en+rXv37k22feqpp3T99dfrvvvu05AhQzRv3jyNGTNGTz/9dJuKDoVu8dzeCwCAGQIOI7t371aPHj3Ut29fTZ8+XQUFBU22Xb9+vSZOnNhg36RJk7R+/fpmz+HxeOR2uxtsoZaSyPNpAAAwQ0Bh5PLLL9fixYu1atUqLVy4UPv379eECRNUXl7eaPvi4mKlpaU12JeWlqbi4uJmz5OTkyOn0+nfMjMzAymzVegZAQDAHAGFkRtuuEE333yzsrKyNGnSJK1cuVJlZWX6+9//HtSi5s6dK5fL5d8KCwuD+v6NqZ/ASs8IAADhFdWWg7t06aKBAwdqz549jf4+PT1dJSUlDfaVlJQoPT292fd1OBxyOBxtKS1g3VkSHgAAU7RpnZGKigrt3btXGRkZjf4+Oztbq1evbrDvgw8+UHZ2dltOGxLc2gsAgDkCCiP33nuv1q5dqwMHDigvL0/f/e53ZbPZNG3aNEnSjBkzNHfuXH/7OXPmaNWqVVqwYIG+/PJLPfTQQ9q0aZNmz54d3E8RBCn+JeEZpgEAIJwCGqY5dOiQpk2bpmPHjiklJUVXXnmlNmzYoJSUFElSQUGBrNYz+Wb8+PFasmSJHnjgAf3ud7/TgAEDtHz5cg0fPjy4nyII6p/cW3ayWtVen6JtLE4LAEA4WIwIeDKc2+2W0+mUy+VSUlJSSM7h8xka8MC78voMffq765SWFBOS8wAA0Fm09Pubf/7XsVotSo6vnTdytJx5IwAAhAth5Czd6sII80YAAAgfwshZUhLrbu+lZwQAgLAhjJzlTM8IYQQAgHAhjJylfuEzVmEFACB8CCNnqb+99ygLnwEAEDaEkbN05/k0AACEHWHkLDyfBgCA8COMnIXn0wAAEH6EkbPU39p7rKJKPl+7X5gWAIAOgTBylvphmhqfoRMnmTcCAEA4EEbOEm2z+peEL2XhMwAAwoIwco7UuqEank8DAEB4EEbOUT9vhJ4RAADCgzByjtTEGElSaflpkysBAKBzIIycw98z4qZnBACAcCCMnMM/Z4S1RgAACAvCyDlSk+rCCD0jAACEBWHkHCkJ9RNYmTMCAEA4EEbOkZpUO4GVW3sBAAgPwsg56ueMVFZ5VempMbkaAAA6PsLIOeIdUYqz2ySx1ggAAOFAGGkEq7ACABA+hJFGsPAZAADhQxhpREoSC58BABAuhJFG1N/ey8JnAACEHmGkEan0jAAAEDaEkUYwZwQAgPAhjDQihbtpAAAIG8JII7i1FwCA8CGMNKI+jByrrFK112dyNQAAdGyEkUZ0jbMrymqRJB2rqDK5GgAAOjbCSCOsVou68/ReAADCgjDSBG7vBQAgPAgjTaifN1JCzwgAACFFGGlCWlLtWiMlLsIIAAChRBhpQnpdGCl2E0YAAAglwkgT0pz1YYQ5IwAAhFKbwsj8+fNlsVh0zz33NNlm8eLFslgsDbaYmJi2nDYsMpwM0wAAEA5RrT1w48aNeu6555SVlXXBtklJSdq1a5f/tcViae1pw6Z+mKbIdcrkSgAA6Nha1TNSUVGh6dOn6/nnn1fXrl0v2N5isSg9Pd2/paWltea0YVU/TOM+XaNTVV6TqwEAoONqVRiZNWuWJk+erIkTJ7aofUVFhXr37q3MzExNmTJF27dvb7a9x+OR2+1usIVboiNKcXabJCaxAgAQSgGHkdzcXG3ZskU5OTktaj9o0CC99NJLevvtt/Xqq6/K5/Np/PjxOnToUJPH5OTkyOl0+rfMzMxAy2wzi8Vy5o4a5o0AABAyAYWRwsJCzZkzR6+99lqLJ6FmZ2drxowZGjVqlK666iq99dZbSklJ0XPPPdfkMXPnzpXL5fJvhYWFgZQZNP61RugZAQAgZAKawLp582aVlpZqzJgx/n1er1fr1q3T008/LY/HI5vN1ux7REdHa/To0dqzZ0+TbRwOhxwORyClhUS6k7VGAAAItYDCyHXXXaf8/PwG+3784x9r8ODB+s1vfnPBICLVhpf8/HzdeOONgVVqgjSGaQAACLmAwkhiYqKGDx/eYF98fLy6devm3z9jxgz17NnTP6fkkUce0bhx49S/f3+VlZXpT3/6kw4ePKg777wzSB8hdNLrHpZHGAEAIHRavc5IUwoKCmS1npmKcuLECd11110qLi5W165dNXbsWOXl5Wno0KHBPnXQMUwDAEDoWQzDMMwu4kLcbrecTqdcLpeSkpLCdt5thWWa+swnynDGaP3c68J2XgAAOoKWfn/zbJpm1N/aW1rukdfX7jMbAAARiTDSjO4Jdlktktdn6FgFD8wDACAUCCPNiLJZlZJYO4m1iEmsAACEBGHkAvyrsDKJFQCAkCCMXACrsAIAEFqEkQvw397LMA0AACFBGLmANIZpAAAIKcLIBfDkXgAAQoswcgEZXQgjAACEEmHkAnp2iZUkHS47pQhYrBYAgIhDGLmA+gmsnhqfTpysNrkaAAA6HsLIBTiibOqeULvw2ZGyUyZXAwBAx0MYaYGedfNGDhNGAAAIOsJIC/SomzdCzwgAAMFHGGkBwggAAKFDGGmBM2GE23sBAAg2wkgL9Ki7o+aIi54RAACCjTDSAgzTAAAQOoSRFqgPI6XlHlXV+EyuBgCAjoUw0gLd4u2yR1llGFIJD8wDACCoCCMtYLVa/PNGWGsEAIDgIoy0EPNGAAAIDcJIC9WHkSKe3gsAQFARRlqIYRoAAEKDMNJCDNMAABAahJEWIowAABAahJEWqg8jh0+ckmEYJlcDAEDHQRhpoR5daueMVFZ55T5dY3I1AAB0HISRFoqzR6lrXLQkhmoAAAgmwkgAzh6qAQAAwUEYCUBm1zhJUuGJkyZXAgBAx0EYCUBmcm3PSOFxekYAAAgWwkgAMpPpGQEAINgIIwHwD9McJ4wAABAshJEA9OrKWiMAAAQbYSQAvep6Rso9NXKdqja5GgAAOgbCSABi7TZ1T3BIYhIrAADBQhgJkP+OGiaxAgAQFISRADGJFQCA4GpTGJk/f74sFovuueeeZtstXbpUgwcPVkxMjEaMGKGVK1e25bSmqp/EeohVWAEACIpWh5GNGzfqueeeU1ZWVrPt8vLyNG3aNM2cOVNbt27V1KlTNXXqVH3xxRetPbWpWGsEAIDgalUYqaio0PTp0/X888+ra9euzbZ96qmndP311+u+++7TkCFDNG/ePI0ZM0ZPP/10qwo2G8M0AAAEV6vCyKxZszR58mRNnDjxgm3Xr19/XrtJkyZp/fr1TR7j8XjkdrsbbO1F/QTWQ6w1AgBAUEQFekBubq62bNmijRs3tqh9cXGx0tLSGuxLS0tTcXFxk8fk5OTo4YcfDrS0sMhwxspqkTw1Ph0t9yg1KcbskgAAiGgB9YwUFhZqzpw5eu211xQTE7ov4blz58rlcvm3wsLCkJ0rUPYoq9LrAkghk1gBAGizgHpGNm/erNLSUo0ZM8a/z+v1at26dXr66afl8Xhks9kaHJOenq6SkpIG+0pKSpSent7keRwOhxwORyClhVWv5DgdcZ3WoRMnNbZ383NmAABA8wLqGbnuuuuUn5+vbdu2+bdLLrlE06dP17Zt284LIpKUnZ2t1atXN9j3wQcfKDs7u22Vm4hJrAAABE9APSOJiYkaPnx4g33x8fHq1q2bf/+MGTPUs2dP5eTkSJLmzJmjq666SgsWLNDkyZOVm5urTZs2adGiRUH6COHnX4WVJeEBAGizoK/AWlBQoKKiIv/r8ePHa8mSJVq0aJFGjhypN998U8uXLz8v1ESSi+rWGimgZwQAgDazGBFwf6rb7ZbT6ZTL5VJSUpLZ5WjzwRP6/sI89XDGKG/udWaXAwBAu9TS72+eTdMKfbrV9owccZ3W6WqvydUAABDZCCOtkBxvV6KjdroNk1gBAGgbwkgrWCwW9ekeL0k6cIwwAgBAWxBGWql33VDNwWOVJlcCAEBkI4y0Up9u9T0jhBEAANqCMNJKZ3pGGKYBAKAtCCOtdGbOCD0jAAC0BWGklep7Rg6fOKWqGp/J1QAAELkII62UkuBQnN0mnyEdOsFQDQAArUUYaSWLxaLedZNYmTcCAEDrEUbaoH4lVuaNAADQeoSRNqBnBACAtiOMtAE9IwAAtB1hpA3oGQEAoO0II23Qp3ttz0jh8ZOq8XJ7LwAArUEYaYO0xBjFRFtV4zN06MQps8sBACAiEUbawGq16OLuCZKkfV9XmFwNAACRiTDSRv1SaueN7C1lEisAAK1BGGmjvim1PSN7j9IzAgBAaxBG2qi+Z2TfUXpGAABoDcJIG/WjZwQAgDYhjLRR37qekWOVVSo7WWVyNQAARB7CSBvF2aPUwxkjSdrLUA0AAAEjjARBv1SGagAAaC3CSBD07V53ey9hBACAgBFGgqC+Z4Q7agAACBxhJAj6dmeYBgCA1iKMBEG/1NphmoJjJ1XNA/MAAAgIYSQI0pNiFGe3qcZnqOD4SbPLAQAgohBGgsBisfjXG9lbylANAACBIIwEyZmVWJnECgBAIAgjQdK/LozsLi03uRIAACILYSRIBqQlSpJ2lzBMAwBAIAgjQTIovS6MlJbL6zNMrgYAgMhBGAmSi5Lj5Iiy6nS1T4XcUQMAQIsRRoLEZrWof91KrF+VMG8EAICWIowE0aC6eSOEEQAAWo4wEkQD/GGESawAALRUQGFk4cKFysrKUlJSkpKSkpSdna133323yfaLFy+WxWJpsMXExLS56PZqUDrDNAAABCoqkMa9evXS/PnzNWDAABmGob/97W+aMmWKtm7dqmHDhjV6TFJSknbt2uV/bbFY2lZxOzYgtbZnZO/RClV7fYq20fEEAMCFBBRGbrrppgavH3vsMS1cuFAbNmxoMoxYLBalp6e3vsII0rNLrOLtNlVWeXXwWKX614UTAADQtFb/093r9So3N1eVlZXKzs5usl1FRYV69+6tzMxMTZkyRdu3b7/ge3s8Hrnd7gZbJLBaLf55I7uKmTcCAEBLBBxG8vPzlZCQIIfDobvvvlvLli3T0KFDG207aNAgvfTSS3r77bf16quvyufzafz48Tp06FCz58jJyZHT6fRvmZmZgZZpmoFpzBsBACAQFsMwAloutKqqSgUFBXK5XHrzzTf1wgsvaO3atU0GkrNVV1dryJAhmjZtmubNm9dkO4/HI4/H43/tdruVmZkpl8ulpKSkQMoNuxf+vU+PvrNTNwxP18LbxppdDgAApnG73XI6nRf8/g5ozogk2e129e/fX5I0duxYbdy4UU899ZSee+65Cx4bHR2t0aNHa8+ePc22czgccjgcgZbWLgysH6ahZwQAgBZp8+0ePp+vQS9Gc7xer/Lz85WRkdHW07Zb9c+oOfB1pU5Xe02uBgCA9i+gnpG5c+fqhhtu0EUXXaTy8nItWbJEa9as0XvvvSdJmjFjhnr27KmcnBxJ0iOPPKJx48apf//+Kisr05/+9CcdPHhQd955Z/A/STuRmuhQt3i7jlVWaVdxuUZmdjG7JAAA2rWAwkhpaalmzJihoqIiOZ1OZWVl6b333tM3v/lNSVJBQYGs1jOdLSdOnNBdd92l4uJide3aVWPHjlVeXl6L5pdEKovFoqE9kvTv3V9rR5GbMAIAwAUEPIHVDC2dANNe5KzcqefW7dPt43pr3tThZpcDAIApWvr9zRKhITC0R+0F31kUGeujAABgJsJICAzNOBNGfL523/EEAICpCCMhcHH3eNmjrKqs8qrg+EmzywEAoF0jjIRAlM2qwXW3+O5gqAYAgGYRRkKkfqhmxxHCCAAAzSGMhEj9JFZ6RgAAaB5hJEToGQEAoGUIIyEyuC6MFLtP61hFy5bLBwCgMyKMhEiCI0p9usVJknYW8dA8AACaQhgJofp5I18ccZlcCQAA7RdhJIRG9OwiSfr8UJmpdQAA0J4RRkJoZC+nJOnzQ/SMAADQFMJICA3rWRtGDp04xSRWAACaQBgJIWdstPp2j5ckfX6Y3hEAABpDGAmxrLqhmnyGagAAaBRhJMSyenWRxCRWAACaQhgJsSwmsQIA0CzCSIgN6+GUzWpRablHxa7TZpcDAEC7QxgJsVi7TQNSEyRJnzFUAwDAeQgjYTCybt4Ik1gBADgfYSQMRtTNG6FnBACA8xFGwmBUZhdJ0meFZfL5DHOLAQCgnSGMhMHg9ETFRtvkPl2jvUcrzC4HAIB2hTASBlE2q793ZPPBE+YWAwBAO0MYCZMxvbtIIowAAHAuwkiYjO3dVZK0uYAwAgDA2QgjYTI6szaM7DtaqeOVVSZXAwBA+0EYCZOu8Xb1S6l9gu9WekcAAPAjjISRf6iGeSMAAPgRRsKoPoxsoWcEAAA/wkgYjbmoNox8VuhStddncjUAALQPhJEw6peSoKSYKJ2q9mpnkdvscgAAaBcII2FktVp0SZ9kSdJ/9h83uRoAANoHwkiYjetbG0Y27DtmciUAALQPhJEwG9e3m6TanhEvD80DAIAwEm5DM5KU4IiS+3QN80YAABBhJOyibFZd2qf2rhqGagAAIIyYon6oZsM+JrECAEAYMcGZeSPHmDcCAOj0AgojCxcuVFZWlpKSkpSUlKTs7Gy9++67zR6zdOlSDR48WDExMRoxYoRWrlzZpoI7gmE9zswb+bKYeSMAgM4toDDSq1cvzZ8/X5s3b9amTZt07bXXasqUKdq+fXuj7fPy8jRt2jTNnDlTW7du1dSpUzV16lR98cUXQSk+UkXZrLrEP2+EoRoAQOdmMQyjTeMEycnJ+tOf/qSZM2ee97tbbrlFlZWVWrFihX/fuHHjNGrUKD377LMtPofb7ZbT6ZTL5VJSUlJbym03nl27V/Pf/VITh6TphTsuMbscAACCrqXf362eM+L1epWbm6vKykplZ2c32mb9+vWaOHFig32TJk3S+vXrm31vj8cjt9vdYOtoxvernTfy6b5jPKcGANCpBRxG8vPzlZCQIIfDobvvvlvLli3T0KFDG21bXFystLS0BvvS0tJUXFzc7DlycnLkdDr9W2ZmZqBltnvDejjVNS5a5Z4afVZYZnY5AACYJuAwMmjQIG3btk2ffvqpfvazn+mOO+7Qjh07glrU3Llz5XK5/FthYWFQ3789sFktuqJ/d0nSuq+OmlwNAADmCTiM2O129e/fX2PHjlVOTo5Gjhypp556qtG26enpKikpabCvpKRE6enpzZ7D4XD479ip3zqibwxIkSSt2/21yZUAAGCeNq8z4vP55PF4Gv1ddna2Vq9e3WDfBx980OQck85mwsDanpHPD5Wp7GSVydUAAGCOgMLI3LlztW7dOh04cED5+fmaO3eu1qxZo+nTp0uSZsyYoblz5/rbz5kzR6tWrdKCBQv05Zdf6qGHHtKmTZs0e/bs4H6KCJXhjNWA1AT5DClvL0vDAwA6p4DCSGlpqWbMmKFBgwbpuuuu08aNG/Xee+/pm9/8piSpoKBARUVF/vbjx4/XkiVLtGjRIo0cOVJvvvmmli9fruHDhwf3U0SwCXVDNf/ezbwRAEDn1OZ1RsKhI64zUu+jXaX68csb1bNLrD7+zTWyWCxmlwQAQFCEfJ0RBMflFyfLbrPqcNkp7fu60uxyAAAIO8KIyeLsUbrs4mRJ0oc7S02uBgCA8COMtAPXDUmVJP1rZ8kFWgIA0PEQRtqBiUNqV6nddPAEt/gCADodwkg7kJkcp4FpCfL6DK3ZxV01AIDOhTDSTtT3jjBUAwDobAgj7cR1dWFk7VdHVVXDU3wBAJ0HYaSdGJXZRd3i7So/XaONB46bXQ4AAGFDGGknbFaLrh3MXTUAgM6HMNKOTBxaO1Tz/vYSRcDCuAAABAVhpB25amCK4u02HS47pW2FZWaXAwBAWBBG2pGYaJuurZvIujK/6AKtAQDoGAgj7czkERmSpJX5xQzVAAA6BcJIO3P1IIZqAACdC2GknWGoBgDQ2RBG2qHJI9IlMVQDAOgcCCPt0NWDUhVXN1SzlaEaAEAHRxhph2KibZo0rLZ3ZNmWwyZXAwBAaBFG2qnvjekpSfrn50d4Vg0AoEMjjLRT4/t1V1qSQ2Unq/XRrlKzywEAIGQII+2UzWrR1FG1vSNvbTlkcjUAAIQOYaQd+96YXpKkD78s1YnKKpOrAQAgNAgj7dig9EQNzUhStdfQis+PmF0OAAAhQRhp5+onsr6xqdDkSgAACA3CSDv3vTG9ZLdZ9cVhtz4/VGZ2OQAABB1hpJ1LjrfrhroVWZd8WmByNQAABB9hJALcetlFkqR/fHZE5aerTa4GAIDgIoxEgMsuTlb/1ASdrPJq+TYmsgIAOhbCSASwWCz+3pHXNhzk4XkAgA6FMBIhvj+mlxxRVn1ZXK7NB0+YXQ4AAEFDGIkQzrhofXd07W2+L3683+RqAAAIHsJIBPnvKy+WJL23vVgFx06aXA0AAMFBGIkgA9MSddXAFPkM6aVP6B0BAHQMhJEIc+eE2t6Rv28qlOsUt/kCACIfYSTCXNm/uwalJepklVev/4dF0AAAkY8wEmEsFotm1vWOvPjxfp2u9ppcEQAAbUMYiUBTR/VUzy6xOlru0RsbeYAeACCyEUYikD3Kqruv7idJWrhmrzw19I4AACIXYSRC/eCSXkpPilGx+7SWbjpkdjkAALRaQGEkJydHl156qRITE5WamqqpU6dq165dzR6zePFiWSyWBltMTEybiobkiLLp7qv6SqrtHamq8ZlcEQAArRNQGFm7dq1mzZqlDRs26IMPPlB1dbW+9a1vqbKystnjkpKSVFRU5N8OHjzYpqJR64eXXaSURIcOl53SG5uYOwIAiExRgTRetWpVg9eLFy9WamqqNm/erG984xtNHmexWJSent7i83g8Hnk8Hv9rt9sdSJmdRky0TbOv6a8H/7FdT/1rt743uqfiHQH9kQIAYLo2zRlxuVySpOTk5GbbVVRUqHfv3srMzNSUKVO0ffv2Ztvn5OTI6XT6t8zMzLaU2aFNu+wi9ekWp68rPHr+3/vMLgcAgIBZjFY+j97n8+k73/mOysrK9PHHHzfZbv369dq9e7eysrLkcrn0xBNPaN26ddq+fbt69erV6DGN9YxkZmbK5XIpKSmpNeV2aO98XqRZS7Yozm7T2vuuUUqiw+ySAACQ2+2W0+m84Pd3q8PIz372M7377rv6+OOPmwwVjamurtaQIUM0bdo0zZs3r0XHtPTDdFaGYWjqX/P0WWGZbht3kR6dOsLskgAAaPH3d6uGaWbPnq0VK1boo48+CiiISFJ0dLRGjx6tPXv2tObUaITFYtHcGwZLkpZ8WqAdR5hjAwCIHAGFEcMwNHv2bC1btkwffvihLr744oBP6PV6lZ+fr4yMjICPRdPG9e2myVkZ8hnS//P2F/L5WtXhBQBA2AUURmbNmqVXX31VS5YsUWJiooqLi1VcXKxTp07528yYMUNz5871v37kkUf0/vvva9++fdqyZYtuu+02HTx4UHfeeWfwPgUkSQ9MHqI4u02bDp7QW1sPm10OAAAtElAYWbhwoVwul66++mplZGT4tzfeeMPfpqCgQEVFRf7XJ06c0F133aUhQ4boxhtvlNvtVl5enoYOHRq8TwFJUoYzVnOuGyBJylm5U65T1SZXBADAhbV6Ams4MYG15apqfLrxf/+tPaUV+uGlmZr//SyzSwIAdFIhncCK9sseZdVjU4dLknI3FmrdV0dNrggAgOYRRjqgy/t204/G95Ek/fb//1zlpxmuAQC0X4SRDup/rh+ki5LjdMR1Wn9Y+aXZ5QAA0CTCSAcVZ4/SH/+rdr7I6/8p0Ac7SkyuCACAxhFGOrBxfbvpzitr14K5783PdKTs1AWOAAAg/AgjHdz/XD9YWb2cKjtZrV++vlU1Xp/ZJQEA0ABhpIOzR1n1l2mjleiI0qaDJ/TkB1+ZXRIAAA0QRjqB3t3ilfP92ofn/XXNXr3zedEFjgAAIHwII53Et7N6+OeP/J+l2/TFYZfJFQEAUIsw0onMvXGIrhqYotPVPt31yiaVlp82uyQAAAgjnYnNatH/ThutvinxKnKd1szFm1ThqTG7LABAJ0cY6WScsdF68Y5LlRxvV/5hl37yyiZ5arxmlwUA6MQII53Qxd3jtfjHlyreblPe3mP61Rvb5PW1++clAgA6KMJIJ5XVq4sWzbhEdptVK/OL9X/+vo01SAAApiCMdGJX9O+u/502SlFWi5ZvO6J73timagIJACDMCCOd3PXDM/TM9DGKtlm04vMi/WLJVuaQAADCijACTRqWruduHyu7zapV24s148X/yHWy2uyyAACdBGEEkqRrB6fppR9dqgRHlD7df1zffzZPhcdPml0WAKATIIzA78oB3bX07mylJ8VoT2mFvvvXPG08cNzssgAAHRxhBA0MyUjS8llXaEhGkr6u8OiHizbohX/vk2Fw6y8AIDQIIzhPujNGb96dre+M7CGvz9Cj7+zU7CVb5T7NPBIAQPARRtCoeEeUnvrhKD1001BFWS16J79I1/+/6/TJnq/NLg0A0MEQRtAki8WiH11xsd74abZ6d4vTEddpTX/hUz38z+06WcUzbQAAwUEYwQWN7d1VK385QdMvv0iS9PInB/TNJ9fpve3FzCUBALQZYQQtEu+I0mPfHaHFP75UPbvE6nDZKf30/9usHy/eqP1fV5pdHgAgglmMCPinrdvtltPplMvlUlJSktnldHqnqrx6+qPdWrRun6q9hqKsFt1yaabmXDdAqUkxZpcHAGgnWvr9TRhBq+09WqF5K3Zoza6jkqSYaKt+fMXFmnnlxeqe4DC5OgCA2QgjCJsN+47pj6u+1JaCMkmSI8qqmy/ppbsm9FXvbvHmFgcAMA1hBGFlGIb+tbNUT3+0R58VlkmSrBbpm0PTdOvlvTWhf3dZrRZziwQAhBVhBKYwDEOf7j+u59bu1Ud1wzeS1KtrrH54aaa+P7aXMpyxJlYIAAgXwghM91VJuZZ8WqC3thyS+/SZdUku65Osb4/M0A3DM5SSyNwSAOioCCNoN05VebUyv0i5Gwu08cAJ/36rRbq0T7KuHZyqawanakBqgiwWhnIAoKMgjKBdOlJ2Sivzi/TPz47os0OuBr/r2SVWVw1K0bi+3XT5xclK4zZhAIhohBG0e4XHT+rDL0v10a5Srd97TJ4aX4Pf9+4Wp0v7JOvSPl01omcXDUhLULSNdfoAIFIQRhBRTlV5tWHfMa396qg2HjiunUVu+c75m2mPsmpIeqKG93RqeE+nBqYlqn9qgpyx0eYUDQBoFmEEEc19ulqbD57Qxv3HtaXghLYfdqvc0/jD+VISHeqXEq/+qQnql5Kg3t3i1LNLnHp1jVW8IyrMlQMA6hFG0KH4fIYKjp/UF0dcyj/s0vbDbu0prVCx+3Szx3WNi1avrnHq2SVWPbvGKjXRoZSztwSHusbZWQMFAEKAMIJOocJTo72lFdp7tEJ76n4eOnFKh06ckutUdYvew2a1qFu8Xcnxdjljo9UlLlpdYu1yxkXLGRvt3+eMjVZiTLTi7TbF2m2Kt0cpzmGT3WblLiAAaERLv78D6sPOycnRW2+9pS+//FKxsbEaP368Hn/8cQ0aNKjZ45YuXarf//73OnDggAYMGKDHH39cN954YyCnBhqV4IjSyMwuGpnZ5bzflZ+u1uGyUzp0/JQOnTipI67T+rrco6MVHh0tr92OVVbJ6zNUWu5RabmnVTVEWS2Ks9sU74jy/4yNtikm2iZ7lFWOKGvdT5scda/P3nd2m2ibVVFWi6LqftqsljM/bRbZrPW/r9/fsF2UzSqb1SKrRbJaLLJaLLLU/bfFv0+EJwDtSkBhZO3atZo1a5YuvfRS1dTU6He/+52+9a1vaceOHYqPb/wZJHl5eZo2bZpycnL07W9/W0uWLNHUqVO1ZcsWDR8+PCgfAmhMYky0BqdHa3B602m82uvT8coqlbo9OnGySmWnquU6VS3XySqVnaz97zP7qlXhqdHJqhpVVnlVVXf3T43PkPt0TYOF3SJBfSg5+6fVYpFFZ4UXq8UfYKSzQ07tMRaLVJ9rao88+3Xdz7OCj+Wc/zi3zZnXjb+nmmjf4JgL1KMmzxUcwQh6waslSO8TjIqCVksQ3qMdXZeg1RKE93nm1jHqEmdv+xu1QpuGaY4eParU1FStXbtW3/jGNxptc8stt6iyslIrVqzw7xs3bpxGjRqlZ599tkXnYZgG7VG116eTVV6drKqp/enxqrKqLqx4vPLU+FRV45Onxlv3s6nXtfs8NT5Ve33y+gzV+Izan966nz6fahq8NuSt21f/usbrO+8OJABoqf/cf51SE4O7vlNIhmnO5XLVLlqVnJzcZJv169fr17/+dYN9kyZN0vLly5s8xuPxyOM502XudrvbUiYQEtE2q5yx1nZ1a7GvLpj46v6N4TMM+Yzan4ZPMnTmtc8wZNT/7pyfPqP2OUNn/2y8Xe156jPQmX/aGA1en/t7o4njDDU8oKnfn/++Dd9PTbW/0HFBEtyZeMF7s2DPEAzm2wWzNiPIf6LBrS2I7xXkP9CkGPP+X9bqMOLz+XTPPffoiiuuaHa4pbi4WGlpaQ32paWlqbi4uMljcnJy9PDDD7e2NKDTslotsnNnEIAI0+rlLGfNmqUvvvhCubm5waxHkjR37ly5XC7/VlhYGPRzAACA9qFVPSOzZ8/WihUrtG7dOvXq1avZtunp6SopKWmwr6SkROnp6U0e43A45HDwNFcAADqDgHpGDMPQ7NmztWzZMn344Ye6+OKLL3hMdna2Vq9e3WDfBx98oOzs7MAqBQAAHVJAPSOzZs3SkiVL9PbbbysxMdE/78PpdCo2NlaSNGPGDPXs2VM5OTmSpDlz5uiqq67SggULNHnyZOXm5mrTpk1atGhRkD8KAACIRAH1jCxcuFAul0tXX321MjIy/Nsbb7zhb1NQUKCioiL/6/Hjx2vJkiVatGiRRo4cqTfffFPLly9njREAACCJ5eABAECItPT7u9V30wAAAAQDYQQAAJiKMAIAAExFGAEAAKYijAAAAFMRRgAAgKkIIwAAwFStfmpvONUvheJ2u02uBAAAtFT99/aFljSLiDBSXl4uScrMzDS5EgAAEKjy8nI5nc4mfx8RK7D6fD4dOXJEiYmJslgsQXtft9utzMxMFRYWsrJrCHGdw4drHR5c5/DgOodHKK+zYRgqLy9Xjx49ZLU2PTMkInpGrFarevXqFbL3T0pK4i96GHCdw4drHR5c5/DgOodHqK5zcz0i9ZjACgAATEUYAQAApurUYcThcOjBBx+Uw+Ewu5QOjescPlzr8OA6hwfXOTzaw3WOiAmsAACg4+rUPSMAAMB8hBEAAGAqwggAADAVYQQAAJiqw4eRZ555Rn369FFMTIwuv/xy/ec//2m2/dKlSzV48GDFxMRoxIgRWrlyZZgqjWyBXOfnn39eEyZMUNeuXdW1a1dNnDjxgn8uqBXo3+d6ubm5slgsmjp1amgL7EACvdZlZWWaNWuWMjIy5HA4NHDgQP7/0QKBXuc///nPGjRokGJjY5WZmalf/epXOn36dJiqjUzr1q3TTTfdpB49eshisWj58uUXPGbNmjUaM2aMHA6H+vfvr8WLF4e2SKMDy83NNex2u/HSSy8Z27dvN+666y6jS5cuRklJSaPtP/nkE8Nmsxl//OMfjR07dhgPPPCAER0dbeTn54e58sgS6HW+9dZbjWeeecbYunWrsXPnTuNHP/qR4XQ6jUOHDoW58sgS6HWut3//fqNnz57GhAkTjClTpoSn2AgX6LX2eDzGJZdcYtx4443Gxx9/bOzfv99Ys2aNsW3btjBXHlkCvc6vvfaa4XA4jNdee83Yv3+/8d577xkZGRnGr371qzBXHllWrlxp3H///cZbb71lSDKWLVvWbPt9+/YZcXFxxq9//Wtjx44dxl/+8hfDZrMZq1atClmNHTqMXHbZZcasWbP8r71er9GjRw8jJyen0fY/+MEPjMmTJzfYd/nllxs//elPQ1pnpAv0Op+rpqbGSExMNP72t7+FqsQOoTXXuaamxhg/frzxwgsvGHfccQdhpIUCvdYLFy40+vbta1RVVYWrxA4h0Os8a9Ys49prr22w79e//rVxxRVXhLTOjqQlYeR//ud/jGHDhjXYd8sttxiTJk0KWV0ddpimqqpKmzdv1sSJE/37rFarJk6cqPXr1zd6zPr16xu0l6RJkyY12R6tu87nOnnypKqrq5WcnByqMiNea6/zI488otTUVM2cOTMcZXYIrbnW//jHP5Sdna1Zs2YpLS1Nw4cP1x/+8Ad5vd5wlR1xWnOdx48fr82bN/uHcvbt26eVK1fqxhtvDEvNnYUZ34UR8aC81vj666/l9XqVlpbWYH9aWpq+/PLLRo8pLi5utH1xcXHI6ox0rbnO5/rNb36jHj16nPeXH2e05jp//PHHevHFF7Vt27YwVNhxtOZa79u3Tx9++KGmT5+ulStXas+ePfr5z3+u6upqPfjgg+EoO+K05jrfeuut+vrrr3XllVfKMAzV1NTo7rvv1u9+97twlNxpNPVd6Ha7derUKcXGxgb9nB22ZwSRYf78+crNzdWyZcsUExNjdjkdRnl5uW6//XY9//zz6t69u9nldHg+n0+pqalatGiRxo4dq1tuuUX333+/nn32WbNL61DWrFmjP/zhD/rrX/+qLVu26K233tI777yjefPmmV0a2qjD9ox0795dNptNJSUlDfaXlJQoPT290WPS09MDao/WXed6TzzxhObPn69//etfysrKCmWZES/Q67x3714dOHBAN910k3+fz+eTJEVFRWnXrl3q169faIuOUK35O52RkaHo6GjZbDb/viFDhqi4uFhVVVWy2+0hrTkSteY6//73v9ftt9+uO++8U5I0YsQIVVZW6ic/+Ynuv/9+Wa38+zoYmvouTEpKCkmviNSBe0bsdrvGjh2r1atX+/f5fD6tXr1a2dnZjR6TnZ3doL0kffDBB022R+uusyT98Y9/1Lx587Rq1Spdcskl4Sg1ogV6nQcPHqz8/Hxt27bNv33nO9/RNddco23btikzMzOc5UeU1vydvuKKK7Rnzx5/4JOkr776ShkZGQSRJrTmOp88efK8wFEfAA0esxY0pnwXhmxqbDuQm5trOBwOY/HixcaOHTuMn/zkJ0aXLl2M4uJiwzAM4/bbbzd++9vf+tt/8sknRlRUlPHEE08YO3fuNB588EFu7W2BQK/z/PnzDbvdbrz55ptGUVGRfysvLzfrI0SEQK/zubibpuUCvdYFBQVGYmKiMXv2bGPXrl3GihUrjNTUVOPRRx816yNEhECv84MPPmgkJiYar7/+urFv3z7j/fffN/r162f84Ac/MOsjRITy8nJj69atxtatWw1JxpNPPmls3brVOHjwoGEYhvHb3/7WuP322/3t62/tve+++4ydO3cazzzzDLf2ttVf/vIX46KLLjLsdrtx2WWXGRs2bPD/7qqrrjLuuOOOBu3//ve/GwMHDjTsdrsxbNgw45133glzxZEpkOvcu3dvQ9J524MPPhj+wiNMoH+fz0YYCUyg1zovL8+4/PLLDYfDYfTt29d47LHHjJqamjBXHXkCuc7V1dXGQw89ZPTr18+IiYkxMjMzjZ///OfGiRMnwl94BPnoo48a/X9u/bW94447jKuuuuq8Y0aNGmXY7Xajb9++xssvvxzSGi2GQd8WAAAwT4edMwIAACIDYQQAAJiKMAIAAExFGAEAAKYijAAAAFMRRgAAgKkIIwAAwFSEEQAAYCrCCAAAndS6det00003qUePHrJYLFq+fHnA72EYhp544gkNHDhQDodDPXv21GOPPRbQe3TYp/YCAIDmVVZWauTIkfrv//5vfe9732vVe8yZM0fvv/++nnjiCY0YMULHjx/X8ePHA3oPloMHAACyWCxatmyZpk6d6t/n8Xh0//336/XXX1dZWZmGDx+uxx9/XFdffbUkaefOncrKytIXX3yhQYMGtfrcDNMAAIBGzZ49W+vXr1dubq4+//xz3Xzzzbr++uu1e/duSdI///lP9e3bVytWrNDFF1+sPn366M477wy4Z4QwAgAAzlNQUKCXX35ZS5cu1YQJE9SvXz/de++9uvLKK/Xyyy9Lkvbt26eDBw9q6dKleuWVV7R48WJt3rxZ//Vf/xXQuZgzAgAAzpOfny+v16uBAwc22O/xeNStWzdJks/nk8fj0SuvvOJv9+KLL2rs2LHatWtXi4duCCMAAOA8FRUVstls2rx5s2w2W4PfJSQkSJIyMjIUFRXVILAMGTJEUm3PCmEEAAC02ujRo+X1elVaWqoJEyY02uaKK65QTU2N9u7dq379+kmSvvrqK0lS7969W3wu7qYBAKCTqqio0J49eyTVho8nn3xS11xzjZKTk3XRRRfptttu0yeffKIFCxZo9OjROnr0qFavXq2srCxNnjxZPp9Pl156qRISEvTnP/9ZPp9Ps2bNUlJSkt5///0W10EYAQCgk1qzZo2uueaa8/bfcccdWrx4saqrq/Xoo4/qlVde0eHDh9W9e3eNGzdODz/8sEaMGCFJOnLkiH7xi1/o/fffV3x8vG644QYtWLBAycnJLa6DMAIAAEzFrb0AAMBUhBEAAGAqwggAADAVYQQAAJiKMAIAAExFGAEAAKYijAAAAFMRRgAAgKkIIwAAwFSEEQAAYCrCCAAAMNX/BS7/tMjM8pZgAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.lineplot(x=J_all2[0], y=J_all2[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "4d0fbfee", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d680d4cc18984adab5920af97da76e2e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/10000000 [00:00" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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3r27aGpqKjo6OoqLFy8W79271/LBtciRI0dq/Pv2z3s7e/ZsceTIkY8d4+bmJhobG4vdunUTw8LCmj2nIIp8vY2IiIi0H99TQ0RERDqBpYaIiIh0AksNERER6QSWGiIiItIJLDVERESkE1hqiIiISCew1BAREZFOYKkhIiIincBSQ0RERI3y22+/YcKECejYsSMEQcDevXs1On7FihUQBOGxrU2bNhqdh6WGiIiIGkWlUmHAgAFYv359g45/4403cOvWrWpbnz59MHnyZI3Ow1JDREREjTJu3Dh89NFHePbZZ2t8vLS0FG+88QY6deqENm3aYPjw4Th69GjV4xYWFrCzs6va8vLycP78ecybN0+jHCw1RERE1KyCgoKQlJSEiIgInD17FpMnT8bYsWNx6dKlGtd//fXXcHZ2ho+Pj0bXYakhIiKiZpOVlYWwsDBERkbCx8cH3bt3xxtvvAFvb2+EhYU9tr6kpAQ7d+7U+FUaADBsisBERERENTl37hwqKyvh7OxcbX9paSmsra0fWx8VFYWioiLMnj1b42ux1BAREVGzefDgAQwMDHDq1CkYGBhUe8zCwuKx9V9//TXGjx8PW1tbja/FUkNERETNZuDAgaisrMTt27frfI/MtWvXcOTIEezfv79B12KpISIiokZ58OABLl++XPXna9euITU1FVZWVnB2dsaMGTMwa9YsrFq1CgMHDkR+fj4OHTqE/v37w9/fv+q4rVu3wt7eHuPGjWtQDkEURbHRPw0RERHpraNHj+Kpp556bP/s2bOxbds2lJeX46OPPsK3336Lmzdvon379nB3d8c///lPuLq6AgDUajW6dOmCWbNm4eOPP25QDpYaIiIi0gn8SDcRERHpBJYaIiIi0gksNURERKQTWGqIiIhIJ7DUEBERkU5gqSEiIiKdwFJDREREOoGlhoiIiHQCSw0RERHpBJYaIiIi0gksNURERKQT/h/o03QTlOeeQgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.lineplot(x=J_all3[0], y=J_all3[1])" + ] + }, + { + "cell_type": "markdown", + "id": "e8b1f648", + "metadata": {}, + "source": [ + "## $R^2$" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "50022cc2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "erklärte Varianz (R^2): 0.3520362618371272\n" + ] + } + ], + "source": [ + "X = feature_matrix_from_data(data[features])\n", + "y = data.Price.to_numpy(copy=True)\n", + "J_ana = J(w=w_ana, X=X, y=y)\n", + "MSE = 2*J_ana\n", + "mu_y = sum(y)/len(y)\n", + "sigma_y_quadrat = ( (y - mu_y) @ (y - mu_y) ) / len(y)\n", + "R2 = 1 - MSE/sigma_y_quadrat\n", + "print('erklärte Varianz (R^2): {}'.format(R2))" + ] + }, + { + "cell_type": "markdown", + "id": "104ad3d4", + "metadata": {}, + "source": [ + "$R^2$ ist größer als beim Modell mit nur 1 Feature (BuildingArea)." + ] + } + ], + "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.4" + }, + "varInspector": { + "cols": { + "lenName": 16, + "lenType": 16, + "lenVar": 40 + }, + "kernels_config": { + "python": { + "delete_cmd_postfix": "", + "delete_cmd_prefix": "del ", + "library": "var_list.py", + "varRefreshCmd": "print(var_dic_list())" + }, + "r": { + "delete_cmd_postfix": ") ", + "delete_cmd_prefix": "rm(", + "library": "var_list.r", + "varRefreshCmd": "cat(var_dic_list()) " + } + }, + "types_to_exclude": [ + "module", + "function", + "builtin_function_or_method", + "instance", + "_Feature" + ], + "window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/data b/Aufgaben/data similarity index 100% rename from notebooks/data rename to Aufgaben/data diff --git a/README.md b/README.md new file mode 100644 index 0000000..ebd5679 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +Note: ich mach das zeug mit Zed repl diff --git a/tasks/01-melbourne.py b/tasks/01-melbourne.py index e27c6f9..f97eb36 100644 --- a/tasks/01-melbourne.py +++ b/tasks/01-melbourne.py @@ -1,12 +1,15 @@ -from telnetlib import BM +#!/usr/bin/env python # %% Imports +from telnetlib import BM # imports überall im Code möglich, aber die Konvention ist alle benötigten import statements # gleich zu Beginn einer Datei zu machen - # numpy ist ein Python-Modul für Numerik, das sowohl Funktionalität als auch Effizienz bietet import numpy as np # pandas ist sehr gut zum Arbeiten mit tabellarischen Daten, egal ob csv, xls oder xlsx +from numpy.typing import NDArray as array +from numpy import float64 as float import pandas as pd +from pandas.core.dtypes.dtypes import time # plotting settings pd.plotting.register_matplotlib_converters() # matplotlib ist ein sehr umfangreiches Modul zum Erstellen von Visualisierungen/Plots @@ -17,23 +20,85 @@ import matplotlib.pyplot as plt # eine schöne Einführung in Seaborn: https://www.kaggle.com/learn/data-visualization import seaborn as sns - -# %% Data +# %% load data data = pd.read_csv("../data/melb_data.csv").dropna() -data = data[(data["BuildingArea"] < 1000) ] +# filter data: Less than 400 area, and max 100 data points +data = data[(data["BuildingArea"] < 400) ][:100][["BuildingArea", "Price"]] ax = sns.scatterplot(x=data['BuildingArea'], y=data['Price']) -# ax.set(xlim=(0, 1000)) # brauch ich nicht mehr wenn ich die outlier aus den daten rausschmeiße +data.head() - -# %% linear regression +# %% prepare data with useless math extra values because we need to add one as a factor to all of these X = [] Y = [] +# aufbereitung, x braucht noch den konstanten eins faktor for _, row in data.iterrows(): X.append([1]+ [row['BuildingArea']]) Y.append(row['Price']) X = np.array(X) Y = np.array(Y) -# aber das ist noch nicht die fertige eingabe, da fehlt die konstante 1! -# und mit Y ist auch irgendwas :( + +# %% solve the linear thing w_ana = np.linalg.solve(X.T @ X , X.T @ Y) -w_ana +print(f"w_ana: {w_ana}") + +# %% define that h function, this is just f(x) = mx + b + +def h(weights: array[float], x): + """ + x can be a float or an array because numpy does it all the same + the return type depends on the type of x + """ + return weights[0] + weights[1] * x + +# %% plot the h function combined with the calculated wieghts + + +ax = sns.scatterplot(x=data['BuildingArea'], y=data['Price']) + +xplot = [min(data['BuildingArea']), max(data['BuildingArea'])] +yplot = [h(w_ana, x) for x in xplot] +sns.lineplot(x=xplot, y=yplot, ax=ax) +# %% Bewertungsfunktion +def j(weights: array[float], x: array[float] ,y: array[float]) -> float: + # angeblich sollen x,y UNBEDINGT numpy arrays sein, idk warum, sehen für mich aus wie floats, nicht wie arrays + errw = y- h(weights, x=y) # pyright hat eigentlich recht, aber irgendwie kann ich doch nen array reinschmeißen auch wenns nen float frisst + return 1.0/(2.0 * len(errw) * (errw @ errw)) +# example usage +j(w_ana, np.array([1.1,1.3]), np.array([2.4,2.6])) +# %% calculate score of analytic approach +# pyright sagt to_numpy ist unknown, ist es aber aus irgendeinem grund nicht, python doof +x = data['BuildingArea'].to_numpy(copy=True) +y = data['Price'].to_numpy(copy=True) +j_ana = j(w_ana, x=x, y=y) +print('Kosten der analytischen Lösung: {}'.format(j_ana)) +# %% define grad_dsc functions +# Gradient Descent +# Let's be honest, no idea what I'm really doing here... +def __gradsc_iter(weights: array[float], alpha: float, x: array[float], y: array[float]) -> array[float]: + errw: array[float] = y - h(x=x, weights=weights) # weis nicht warum aber das geht doch datentypen mäßig + return np.array([ + weights[0] + alpha / len(x) * sum(errw), + weights[1] + alpha / len(x) * errw @ x + ]) + +def grad_dsc(weights: array[float], alpha: float, x, y, n: int) -> tuple[array[float], array[float]]: + j_all = [j(weights,x,y)] + for i in range(n): + w = __gradsc_iter(weights, alpha, x, y) + j_all.append(j(weights,x,y)) + return weights, np.array(j_all) +# %% no idea what this is +w_tmp, j_tmp = grad_dsc(np.array([1e5,1000.0]),alpha=1e-9, x=data["BuildingArea"].to_numpy(), y=data["Price"].to_numpy(), n=1) +j_tmp[1] / j_tmp[0] +# %% do the actual gradient descent +w_init = np.array([1e6, 1000.]) +x = np.array(data['BuildingArea']) +y = np.array(data['Price']) +w_gd_1e4, J_all_1e4 = grad_dsc(weights=w_init, alpha=np.float64(0.0001), x=x, y=y, n=100000) + +print('w_gd_1e4: {}'.format(w_gd_1e4)) +print('Vergleich zu Startkosten: {}'.format(J_all_1e4[-1]/J_all_1e4[0])) +print('Vergleich zu analytischer Lösung: {}'.format(J_all_1e4[-1]/j_ana)) +print('(w0_gd - w0_ana)/w0_ana: {}'.format((w_gd_1e4[0]-w_ana[0])/w_ana[0])) +print('(w1_gd - w1_ana)/w1_ana: {}'.format((w_gd_1e4[1]-w_ana[1])/w_ana[1])) +# again, no idea what these values mean?