From d6f717a562d814341e97893b39da3a8038c28029 Mon Sep 17 00:00:00 2001
From: Anni <39795105+annigue@users.noreply.github.com>
Date: Mon, 7 Apr 2025 17:26:09 +0200
Subject: [PATCH 1/2] Aufgaben begonnen
---
ex1/PE1 - Linear Regression (Exercises).ipynb | 2252 +++++++++++------
1 file changed, 1477 insertions(+), 775 deletions(-)
diff --git a/ex1/PE1 - Linear Regression (Exercises).ipynb b/ex1/PE1 - Linear Regression (Exercises).ipynb
index 38a0f19..6030f40 100644
--- a/ex1/PE1 - Linear Regression (Exercises).ipynb
+++ b/ex1/PE1 - Linear Regression (Exercises).ipynb
@@ -1,781 +1,1483 @@
{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Linear Regression\n",
- "\n",
- "Stanford CS229 - Machine Learning by Andrew Ng. Programming exercise 1.\n",
- "\n",
- "Please check out [the repository on GitHub](https://github.com/rickwierenga/CS229-Python/). If you spot any mistakes or inconcistencies, please create an issue. For questions you can find me on Twitter: [@rickwierenga](https://twitter.com/rickwierenga). Starring the project on GitHub means a ton to me!"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "import pandas as pd\n",
- "import matplotlib.pylab as plt\n",
- "%matplotlib inline"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Linear Regression with a single variable\n",
- "---\n",
- "In this part of this exercise, you will implement linear regression with one variable to predict profits for a food truck. Suppose you are the CEO of a restaurant franchise and are considering different cities for opening a new outlet. The chain already has trucks in various cities and you have data for profits and populations from the cities. You would like to use this data to help you select which city to expand to next. "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
Population
\n",
- "
Profit
\n",
- "
\n",
- " \n",
- " \n",
- "
\n",
- "
0
\n",
- "
6.1101
\n",
- "
17.5920
\n",
- "
\n",
- "
\n",
- "
1
\n",
- "
5.5277
\n",
- "
9.1302
\n",
- "
\n",
- "
\n",
- "
2
\n",
- "
8.5186
\n",
- "
13.6620
\n",
- "
\n",
- "
\n",
- "
3
\n",
- "
7.0032
\n",
- "
11.8540
\n",
- "
\n",
- "
\n",
- "
4
\n",
- "
5.8598
\n",
- "
6.8233
\n",
- "
\n",
- " \n",
- "
\n",
- "
"
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "d6kJ-cfLedBp"
+ },
+ "source": [
+ "# Linear Regression\n",
+ "\n",
+ "Stanford CS229 - Machine Learning by Andrew Ng. Programming exercise 1.\n",
+ "\n",
+ "Please check out [the repository on GitHub](https://github.com/rickwierenga/CS229-Python/). If you spot any mistakes or inconcistencies, please create an issue. For questions you can find me on Twitter: [@rickwierenga](https://twitter.com/rickwierenga). Starring the project on GitHub means a ton to me!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {
+ "id": "D1MDtlCBedBq"
+ },
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import matplotlib.pylab as plt\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "PI6agDGzedBq"
+ },
+ "source": [
+ "## Linear Regression with a single variable\n",
+ "---\n",
+ "In this part of this exercise, you will implement linear regression with one variable to predict profits for a food truck. Suppose you are the CEO of a restaurant franchise and are considering different cities for opening a new outlet. The chain already has trucks in various cities and you have data for profits and populations from the cities. You would like to use this data to help you select which city to expand to next."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 417
+ },
+ "id": "fOqzaCGCedBq",
+ "outputId": "d19f3c83-31ef-446a-fa88-b5a08707a285"
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "--2025-04-07 14:26:32-- https://raw.githubusercontent.com/annigue/CS229-Python/master/ex1/ex1data1.txt\n",
+ "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n",
+ "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n",
+ "HTTP request sent, awaiting response... 200 OK\n",
+ "Length: 1359 (1.3K) [text/plain]\n",
+ "Saving to: ‘ex1data1.txt.1’\n",
+ "\n",
+ "\rex1data1.txt.1 0%[ ] 0 --.-KB/s \rex1data1.txt.1 100%[===================>] 1.33K --.-KB/s in 0s \n",
+ "\n",
+ "2025-04-07 14:26:33 (50.8 MB/s) - ‘ex1data1.txt.1’ saved [1359/1359]\n",
+ "\n"
+ ]
+ },
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " Population Profit\n",
+ "0 6.1101 17.5920\n",
+ "1 5.5277 9.1302\n",
+ "2 8.5186 13.6620\n",
+ "3 7.0032 11.8540\n",
+ "4 5.8598 6.8233"
+ ],
+ "text/html": [
+ "\n",
+ "
\n"
+ ],
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "type": "dataframe",
+ "variable_name": "data",
+ "summary": "{\n \"name\": \"data\",\n \"rows\": 97,\n \"fields\": [\n {\n \"column\": \"Population\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 3.869883527882332,\n \"min\": 5.0269,\n \"max\": 22.203,\n \"num_unique_values\": 97,\n \"samples\": [\n 21.279,\n 5.4069,\n 5.3054\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Profit\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 5.510262255231544,\n \"min\": -2.6807,\n \"max\": 24.147,\n \"num_unique_values\": 97,\n \"samples\": [\n 17.929,\n 0.55657,\n 1.9869\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
+ }
+ },
+ "metadata": {},
+ "execution_count": 29
+ }
],
- "text/plain": [
- " Population Profit\n",
- "0 6.1101 17.5920\n",
- "1 5.5277 9.1302\n",
- "2 8.5186 13.6620\n",
- "3 7.0032 11.8540\n",
- "4 5.8598 6.8233"
- ]
- },
- "execution_count": 2,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# start by loading the data\n",
- "data = pd.read_csv('ex1data1.txt', header=None, names=['Population', 'Profit'])\n",
- "\n",
- "# initialize some useful variables\n",
- "m = len(data) # the number of training examples\n",
- "X = np.append(np.ones((m, 1)), np.array(data[\"Population\"]).reshape((m,1)), axis=1) # Add x0, a vector of 1's, to X.\n",
- "y = np.array(data[\"Profit\"]).reshape(m, 1)\n",
- "\n",
- "data.head()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Visualising the data\n",
- "Plotting helps us get insight in the data we are working with. Using the `'bx'` option, we get blue crosses. You can read more about markers [here](https://matplotlib.org/api/markers_api.html)."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Text(0.5, 1.0, 'Relation between profit and population')"
- ]
- },
- "execution_count": 3,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "
"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "plt.plot(data['Population'], data['Profit'], 'bx')\n",
- "plt.xlabel('Population in 10,000')\n",
- "plt.ylabel('Profit in $10,000')\n",
- "plt.title('Relation between profit and population')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### The hypotheses function\n",
- "Our hypothesis function has the general form:\n",
- "$y= h_\\theta(x)= \\theta_0 + \\theta_1x$\n",
- "Note that this is like the equation of a straight line. We give to $h_\\theta(x)$ values for $\\theta_0$ and $\\theta_1$ to get our estimated output y. In other words, we are trying to create a function called $h_\\theta$ that is trying to map our input data (the x's) to our output data (the y's).\n",
- "\n",
- "### Cost function\n",
- "\n",
- "The cost functions yields \"how far off\" our hypotheses $h_\\theta$ is. It takes the avarage of the distance between our hypothesis and the actual point and squares it. Formally, the cost function has the following definition:\n",
- "\n",
- "$J(\\theta) = \\frac{1}{2m} \\displaystyle\\sum_{i = 0}^{m}(h_θ(x^{(i)}) - y^{(i)})^2$\n",
- "\n",
- "#### Vectorization\n",
- "Vectorizations is the act of replacing the loops in a computer program with matrix operations. If you have a good linear algebra library (like numpy), the library will optimize the code automatically for the computer the code runs on. Mathematically, the 'regular' function should mean the same as the vectorized function.\n",
- "\n",
- "Gradient descent vectorized:\n",
- "$\\theta = \\frac{1}{2m}(X\\theta - \\vec{y})^T(X\\theta-\\vec{y})$\n",
- "\n",
- "**Exercise**: Implement a vectorized implementation of the cost function."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [],
- "source": [
- "def cost_function(X, y, theta):\n",
- " \"\"\" Computes the cost of using theta as the parameter for linear gression to fit the data in X and y. \"\"\"\n",
- " \n",
- " return 0"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "With $\\theta = \\begin{bmatrix}0 & 0\\end{bmatrix}$, $J(\\theta)$ should return 32.07."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "0\n"
- ]
- }
- ],
- "source": [
- "initial_theta = np.zeros((2,1))\n",
- "print(cost_function(X, y, initial_theta))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Gradient descent\n",
- "We want are hypothesis $h_\\theta(x)$ to function as good as possibly. Therefore, we want to minimalize the cost function $J(\\theta)$. Gradient descent is an algorithm used to do that. \n",
- "\n",
- "The formal definition of gradient descent:\n",
- "\n",
- "$repeat \\ \\{ \\\\ \\enspace \\theta_j := \\theta_j - \\alpha \\frac{1}{m}\\displaystyle\\sum_{i = 1}^{m}(h_\\theta(x^{(i)})-y^{(i)})x_j^{(i)}\\\\\\}$\n",
- "\n",
- "An illustration of gradient descent on a single variable:\n",
- "
"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "plt.plot(J_history)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Making a prediction using the model\n",
- "The model can be used by calculating the dot product of the input and $\\theta$."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'In a city with a population of 35000, we predict a profit of $0.00'"
- ]
- },
- "execution_count": 10,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "prediction = np.array([1, 3.5]).dot(theta) * 10000 # don't forget to multiply the prediction by 10000\n",
- "'In a city with a population of 35000, we predict a profit of $%.2f' % prediction"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "## Multivariate Linear Regression\n",
- "\n",
- "---\n",
- "In this part, you will implement linear regression with multiple variables to predict the prices of houses. Suppose you are selling your house and you want to know what a good market price would be. One way to do this is to first collect information on recent houses sold and make a model of housing prices."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
Size
\n",
- "
Bedrooms
\n",
- "
Price
\n",
- "
\n",
- " \n",
- " \n",
- "
\n",
- "
0
\n",
- "
2104
\n",
- "
3
\n",
- "
399900
\n",
- "
\n",
- "
\n",
- "
1
\n",
- "
1600
\n",
- "
3
\n",
- "
329900
\n",
- "
\n",
- "
\n",
- "
2
\n",
- "
2400
\n",
- "
3
\n",
- "
369000
\n",
- "
\n",
- "
\n",
- "
3
\n",
- "
1416
\n",
- "
2
\n",
- "
232000
\n",
- "
\n",
- "
\n",
- "
4
\n",
- "
3000
\n",
- "
4
\n",
- "
539900
\n",
- "
\n",
- " \n",
- "
\n",
- "
"
+ "source": [
+ "# start by loading the data\n",
+ "!wget https://raw.githubusercontent.com/annigue/CS229-Python/master/ex1/ex1data1.txt\n",
+ "data = pd.read_csv('ex1data1.txt', header=None, names=['Population', 'Profit'])\n",
+ "\n",
+ "# initialize some useful variables\n",
+ "m = len(data) # the number of training examples\n",
+ "X = np.append(np.ones((m, 1)), np.array(data[\"Population\"]).reshape((m,1)), axis=1) # Add x0, a vector of 1's, to X.\n",
+ "y = np.array(data[\"Profit\"]).reshape(m, 1)\n",
+ "\n",
+ "data.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "#from google.colab import drive\n",
+ "#drive.mount('/content/drive')"
],
- "text/plain": [
- " Size Bedrooms Price\n",
- "0 2104 3 399900\n",
- "1 1600 3 329900\n",
- "2 2400 3 369000\n",
- "3 1416 2 232000\n",
- "4 3000 4 539900"
- ]
- },
- "execution_count": 11,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# load data\n",
- "data = pd.read_csv(\"ex1data2.txt\", header = None, names=[\"Size\", \"Bedrooms\",\"Price\"])\n",
- "m = len(data)\n",
- "\n",
- "# Initialize X, y and theta\n",
- "x0 = np.ones(m)\n",
- "size = np.array((data[\"Size\"]))\n",
- "bedrooms = np.array((data[\"Bedrooms\"]))\n",
- "X = np.array([x0, size, bedrooms]).T\n",
- "y = np.array(data[\"Price\"]).reshape(len(data.index), 1)\n",
- "theta_init = np.zeros((3,1))\n",
- "\n",
- "data.head()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Feature Normalization\n",
- "When features differ by order of magnitude, first performing feature scaling can make gradient descent converge much more quickly. Formally:\n",
- "\n",
- "$x := \\frac{x - \\mu}{\\sigma}$\n",
- "\n",
- "Where $\\mu$ is the average and $\\sigma$ the standard deviation.\n",
- "\n",
- "**Important**: It is crucial to store $\\mu$ and $\\sigma$ if you want to make predictions using the model later.\n",
- "\n",
- "**Exercise**: Perform feature normalization on the following dataset."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[1.000e+00, 2.104e+03, 3.000e+00],\n",
- " [1.000e+00, 1.600e+03, 3.000e+00],\n",
- " [1.000e+00, 2.400e+03, 3.000e+00],\n",
- " [1.000e+00, 1.416e+03, 2.000e+00],\n",
- " [1.000e+00, 3.000e+03, 4.000e+00]])"
- ]
- },
- "execution_count": 12,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# perform normalization\n",
- "def normalize(X):\n",
- " \"\"\" Normalizes the features in X\n",
- " \n",
- " returns a normalized version of X where\n",
- " the mean value of each feature is 0 and the standard deviation\n",
- " is 1. This is often a good preprocessing step to do when\n",
- " working with learning algorithms.\n",
- " \"\"\"\n",
- " mu = np.zeros(len(X))\n",
- " sigma = np.zeros(len(X))\n",
- " \n",
- " return X, mu, sigma\n",
- "\n",
- "X, mu, sigma = normalize(X)\n",
- "X[0:5]"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Gradient Descent\n",
- "\n",
- "Remember the algorithm for gradient descent:\n",
- "\n",
- "$repeat \\ \\{ \\\\ \\enspace \\theta_j := \\theta_j - \\alpha \\frac{1}{m}\\displaystyle\\sum_{i = 1}^{m}(h_\\theta(x^{(i)})-y^{(i)})x_j^{(i)}\\\\\\}$\n",
- "\n",
- "The vectorization for multivariate gradient descent:\n",
- "\n",
- "$\\theta := \\theta - \\frac{\\alpha}{m}X^T(X\\theta - \\vec{y})$\n",
- "\n",
- "**Exercise**: Implement gradient descent for multiple features. Make sure your solution is vectorized and supports any number of features."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[0.],\n",
- " [0.],\n",
- " [0.]])"
- ]
- },
- "execution_count": 13,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "def gradient_descent_multi(X, y, theta, alpha, iterations):\n",
- " J_history = []\n",
- " return theta, J_history\n",
- "\n",
- "alpha = 0.01\n",
- "iterations = 1500\n",
- "initial_theta = np.zeros((3,1))\n",
- "theta, J_history = gradient_descent_multi(X, y, initial_theta, alpha, iterations)\n",
- "theta"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "As before we see how the cost decreases over time."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Text(0, 0.5, 'cost')"
- ]
- },
- "execution_count": 14,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "
"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "plt.plot(J_history)\n",
- "plt.title('J per iteration')\n",
- "plt.xlabel('iteration')\n",
- "plt.ylabel('cost')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "If we want to make a prediction on a normalized dataset, we have to normalize our input too."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/ipykernel_launcher.py:1: RuntimeWarning: divide by zero encountered in double_scalars\n",
- " \"\"\"Entry point for launching an IPython kernel.\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "'In a house of 1650 square feet with 3 rooms, we predict a price of $nan'"
- ]
- },
- "execution_count": 15,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "price = theta.transpose() @ np.array([1, (1650-mu[1])/sigma[1], (3-mu[2])/sigma[2]]) # normalize the input\n",
- "'In a house of 1650 square feet with 3 rooms, we predict a price of $%.2f' % price"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Using normal equations\n",
- "We can use normal equations to get the exact solution in only one calculation. Although using normal equations is very fast for a small datasets with a small number of features, it can be inefficient for larger datasets because the complexity of matrix multiplication is $O(n^3)$.\n",
- "\n",
- "The normal equation for linear regression is:\n",
- "\n",
- "$\\theta = (X^TX)^{−1}X^T\\vec{y}$\n",
- "\n",
- "**Exercise**: Find theta using normal equations."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[89597.9095428 ],\n",
- " [ 139.21067402],\n",
- " [-8738.01911233]])"
- ]
- },
- "execution_count": 16,
- "metadata": {},
- "output_type": "execute_result"
+ "metadata": {
+ "id": "AdZe3c6yfDkO"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "8CptRfr1edBr"
+ },
+ "source": [
+ "### Visualising the data\n",
+ "Plotting helps us get insight in the data we are working with. Using the `'bx'` option, we get blue crosses. You can read more about markers [here](https://matplotlib.org/api/markers_api.html)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 489
+ },
+ "id": "WRB6XX7wedBr",
+ "outputId": "f8e579d2-4da4-4bfe-ae4e-f627e1329394"
+ },
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "Text(0.5, 1.0, 'Relation between profit and population')"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 30
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ "
"
+ ],
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAHHCAYAAABKudlQAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAWR5JREFUeJzt3XlYU1feB/BvQBJAWRRZFRSXilqrM7ZSbVFERlxqtbaunamoU61FrVqny8wgCM7YbTpVa9W+7xS0y7Raq7W2o+O+DWpd61IdtW6tgntQlMVw3j/y3pCEm5BAthu+n+fJo7n35uTcm8D9cc7vnKMSQggQERERKZSPuytAREREVBcMZoiIiEjRGMwQERGRojGYISIiIkVjMENERESKxmCGiIiIFI3BDBERESkagxkiIiJSNAYzREREpGgMZsjjbN26FSqVClu3bnVouSqVCtnZ2Q4t0xbp6elo1KiRy9+XbHfq1Cn07dsXISEhUKlUWL16NfLz86FSqXDu3Dl3V69G2dnZUKlU7q6GwzjjZzU5ORnJyckOLZM8B4MZqhPpF770aNCgAZo1a4b09HT88ssvLq/Pd99955aAxdU++OAD5Ofnu7saXmPMmDE4cuQI/vKXv+Djjz/Gww8/LHscr7tnO378OLKzsxURgJJjNXB3Bcg75OTkID4+HqWlpdi9ezfy8/Oxc+dOHD16FP7+/i6rx3fffYeFCxfKBjT37t1Dgwbe8ZX/4IMP0LRpU6Snp7u7Kop37949FBQU4E9/+hMmT55s2P673/0OI0eOhEajMWzjdfdsx48fx+zZs5GcnIyWLVua7Pv3v//tnkqRS3jHb3Zyu/79+xv+mv3973+Ppk2b4s0338SaNWswfPhwN9dOz5VBFblPZWUlysvLbf68r169CgAIDQ012e7r6wtfX19HV4/cRK1Wu7sK5ETsZiKnSEpKAgCcOXPGZPuJEyfwzDPPoEmTJvD398fDDz+MNWvW1Fjejh07MGzYMMTFxUGj0SA2NhbTp0/HvXv3DMekp6dj4cKFAGDS9SWR64c/ePAg+vfvj+DgYDRq1Ah9+vTB7t27TY6RutJ27dqFGTNmIDw8HA0bNsRTTz1luBHa4qeffkJaWhoaNmyImJgY5OTkwHzR+srKSrz33nvo2LEj/P39ERkZiYkTJ+LmzZuGY1q2bIljx45h27ZthnNMTk7GrVu34Ovri/nz5xuOvXbtGnx8fBAWFmbyXpMmTUJUVJTJe+/Zswf9+vVDSEgIAgMD0atXL+zatavaefzyyy8YN24cIiMjodFo0LFjR3z00Ucmx0h5T8uXL8df/vIXNG/eHP7+/ujTpw9Onz5d47WSckBOnDiB4cOHIzg4GGFhYXjppZdQWlpqcqxKpcLkyZPx6aefomPHjtBoNFi3bh2Amj/f7OxstGjRAgDwhz/8ASqVyvAXvXnOjKXrbs0777yDHj16ICwsDAEBAejatSu+/PLLasdJ57B69Wo8+OCDhusqnYexnTt34pFHHoG/vz9at26NJUuW1Hg9JcnJyXjwwQexf/9+9OjRAwEBAYiPj8fixYurHXvlyhWMHz8ekZGR8Pf3R+fOnbF06VKTY86dOweVSoV33nkHf//739GiRQsEBASgV69eOHr0aLX3lrte6enp1VpRzJ0/fx4vvvgi2rVrh4CAAISFhWHYsGEm3Un5+fkYNmwYAKB3796Gz0jKvZN7f3vP8cMPP0Tr1q2h0WjwyCOP4Pvvv7dab3IdtsyQU0i/ZBo3bmzYduzYMTz22GNo1qwZXnvtNTRs2BDLly/HkCFDsHLlSjz11FMWy1uxYgXu3r2LSZMmISwsDHv37sWCBQvw888/Y8WKFQCAiRMn4tKlS9iwYQM+/vjjGut47NgxJCUlITg4GK+88gr8/PywZMkSJCcnY9u2bUhMTDQ5fsqUKWjcuDGysrJw7tw5vPfee5g8eTK++OKLGt9Lp9OhX79+ePTRR/HWW29h3bp1yMrKwv3795GTk2M4buLEicjPz8fYsWMxdepUnD17Fu+//z4OHjyIXbt2wc/PD++99x6mTJmCRo0a4U9/+hMAIDIyEqGhoXjwwQexfft2TJ06FYD+xqdSqXDjxg0cP34cHTt2BKAPDqWAEwA2b96M/v37o2vXrsjKyoKPjw/y8vKQkpKCHTt2oFu3bgCAoqIiPProo4abb3h4OP71r39h/PjxKC4uxrRp00zO+4033oCPjw9mzpwJrVaLt956C88++yz27NlT4zUDgOHDh6Nly5aYO3cudu/ejfnz5+PmzZtYtmyZyXGbN2/G8uXLMXnyZDRt2tQQeNT0+Q4dOhShoaGYPn06Ro0ahQEDBlhM1rZ03a2ZN28ennzySTz77LMoLy/H559/jmHDhmHt2rUYOHCgybE7d+7EV199hRdffBFBQUGYP38+nn76aVy4cAFhYWEAgCNHjqBv374IDw9HdnY27t+/j6ysrBrrYezmzZsYMGAAhg8fjlGjRmH58uWYNGkS1Go1xo0bB0Df9ZacnIzTp09j8uTJiI+Px4oVK5Ceno5bt27hpZdeMilz2bJluH37NjIyMlBaWop58+YhJSUFR44csatulnz//ff4z3/+g5EjR6J58+Y4d+4cFi1ahOTkZBw/fhyBgYHo2bMnpk6divnz5+OPf/wj2rdvDwCGf83Ze46fffYZbt++jYkTJ0KlUuGtt97C0KFD8dNPP8HPz6/O50h1JIjqIC8vTwAQGzduFFevXhUXL14UX375pQgPDxcajUZcvHjRcGyfPn1Ep06dRGlpqWFbZWWl6NGjh2jbtq1h25YtWwQAsWXLFsO2u3fvVnvvuXPnCpVKJc6fP2/YlpGRISx9rQGIrKwsw/MhQ4YItVotzpw5Y9h26dIlERQUJHr27FntHFNTU0VlZaVh+/Tp04Wvr6+4deuW1Ws0ZswYAUBMmTLF5LwHDhwo1Gq1uHr1qhBCiB07dggA4tNPPzV5/bp166pt79ixo+jVq1e198rIyBCRkZGG5zNmzBA9e/YUERERYtGiRUIIIa5fvy5UKpWYN2+eoS5t27YVaWlpJud39+5dER8fL37zm98Yto0fP15ER0eLa9eumbzvyJEjRUhIiOFzkj7D9u3bi7KyMsNx8+bNEwDEkSNHrF6zrKwsAUA8+eSTJttffPFFAUAcPnzYsA2A8PHxEceOHTM51tbP9+zZswKAePvtt01eL33uZ8+eNWyzdN0tMf/elpeXiwcffFCkpKSYbAcg1Gq1OH36tGHb4cOHBQCxYMECk3Py9/c3+c4fP35c+Pr6WvzeG+vVq5cAIP72t78ZtpWVlYkuXbqIiIgIUV5eLoQQ4r333hMAxCeffGJS9+7du4tGjRqJ4uJiIUTVtQsICBA///yz4dg9e/YIAGL69Okm7y137caMGSNatGhR7XoY/6zK/fwXFBQIAGLZsmWGbStWrKj2u8PS+9t7jmFhYeLGjRuGY7/++msBQHzzzTfV3otcj91M5BCpqakIDw9HbGwsnnnmGTRs2BBr1qxB8+bNAQA3btzA5s2bMXz4cNy+fRvXrl3DtWvXcP36daSlpeHUqVNWRz8FBAQY/l9SUoJr166hR48eEELg4MGDdtdXp9Ph3//+N4YMGYJWrVoZtkdHR2P06NHYuXMniouLTV4zYcIEk26rpKQk6HQ6nD9/3qb3NE4ulVo2ysvLsXHjRgD61qeQkBD85je/MVyfa9euoWvXrmjUqBG2bNlS43skJSWhqKgIJ0+eBKBvgenZsyeSkpKwY8cOAPoWACGEoWXm0KFDOHXqFEaPHo3r168b3rekpAR9+vTB9u3bUVlZCSEEVq5ciUGDBkEIYVLHtLQ0aLVaHDhwwKQ+Y8eONclVkN7zp59+sumaZWRkmDyfMmUKAH2it7FevXqhQ4cOhue1+Xydwfh7e/PmTWi1WiQlJVW7ToD+Z6h169aG5w899BCCg4MN10qn02H9+vUYMmQI4uLiDMe1b98eaWlpNtepQYMGmDhxouG5Wq3GxIkTceXKFezfvx+A/vpGRUVh1KhRhuP8/PwwdepU3LlzB9u2bTMpc8iQIWjWrJnhebdu3ZCYmFjtc6ot4+tYUVGB69evo02bNggNDZW9lraw9xxHjBhh0tJs73eZnIvdTOQQCxcuxAMPPACtVouPPvoI27dvNxkFcvr0aQghkJmZiczMTNkyrly5YvIL0diFCxcwa9YsrFmzxiR/BAC0Wq3d9b169Sru3r2Ldu3aVdvXvn17VFZW4uLFi4ZuGQAmNxCgqgvNvD5yfHx8TG6qAPDAAw8AqOqSO3XqFLRaLSIiImTLuHLlSo3vI/2C3bFjB5o3b46DBw9izpw5CA8PxzvvvGPYFxwcjM6dOxveF9APT7ZEq9WioqICt27dwocffogPP/zQpjrW5ZoBQNu2bU2et27dGj4+PtWG3sbHx5s8r83n6wxr167FnDlzcOjQIZSVlRm2y80JY36tAP31kq7V1atXce/evWrXBADatWtnc+AQExODhg0bmmwz/i4++uijOH/+PNq2bQsfH9O/d6UuG/MAXq5ODzzwAJYvX25TnWpy7949zJ07F3l5efjll19M8r9q8/MPwO5zrOt3mZyLwQw5RLdu3QyjmYYMGYLHH38co0ePxsmTJ9GoUSNUVlYCAGbOnGnxr8g2bdrIbtfpdPjNb36DGzdu4NVXX0VCQgIaNmyIX375Benp6Yaync3SyBZhlsRbW5WVlYiIiMCnn34quz88PLzGMmJiYhAfH4/t27ejZcuWEEKge/fuCA8Px0svvYTz589jx44d6NGjh+GXuHT93n77bXTp0kW23EaNGuH69esAgN/+9rcWA5+HHnrI5Lmjr5mlieGM/3L3FDt27MCTTz6Jnj174oMPPkB0dDT8/PyQl5eHzz77rNrxzv5+uZtKpZI9F51OV+Nrp0yZgry8PEybNg3du3c3TG44cuRIr/n5p7phMEMO5+vri7lz56J37954//338dprrxlaJfz8/JCammpXeUeOHMF///tfLF26FM8995xh+4YNG6oda+ssqOHh4QgMDDR0xxg7ceIEfHx8EBsba1c9ramsrMRPP/1k+AsYAP773/8CgGEkR+vWrbFx40Y89thjNd6crZ1nUlIStm/fjvj4eHTp0gVBQUHo3LkzQkJCsG7dOhw4cACzZ882HC91bQQHB1v9bMLDwxEUFASdTmf3Z1hbp06dMml1OX36NCorK2sc/eKsz9eeWXZXrlwJf39/rF+/3qSVMi8vz+73BfTnFBAQYGhJMyZ3npZcunQJJSUlJq0z5t/FFi1a4IcffkBlZaVJy8WJEycM+43J1em///2vyefUuHFj2S4ZW7ppv/zyS4wZMwZ/+9vfDNtKS0tx69Ytk+Ps+XzsPUfybMyZIadITk5Gt27d8N5776G0tBQRERFITk7GkiVLcPny5WrHWxviLP1FZPwXkBAC8+bNq3as9Ava/JecXJl9+/bF119/bdJlUVRUhM8++wyPP/44goODrZZhr/fff9/wfyEE3n//ffj5+aFPnz4A9CN3dDodcnNzq732/v37JufUsGFDi+eYlJSEc+fO4YsvvjB0O/n4+KBHjx549913UVFRYTKSqWvXrmjdujXeeecd3Llzp1p50mfj6+uLp59+GitXrqw27Nb4OEeShtpLFixYAEA/r5E1zvp8rV13uTqoVCqTlodz585h9erVdr+vVF5aWhpWr16NCxcuGLb/+OOPWL9+vc3l3L9/32Q4d3l5OZYsWYLw8HB07doVADBgwAAUFhaajNS7f/8+FixYgEaNGqFXr14mZa5evdok523v3r3Ys2ePyefUunVrnDhxwuR7cvjwYdnh/3Lnbt4CsmDBgmqtOrb+/NfmHMmzsWWGnOYPf/gDhg0bhvz8fLzwwgtYuHAhHn/8cXTq1AnPP/88WrVqhaKiIhQUFODnn3/G4cOHZctJSEhA69atMXPmTPzyyy8IDg7GypUr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m2tCREREtpLu27asuuT1wczt27cBALGxsW6uCREREdnr9u3bCAkJsXqM1y80WVlZiUuXLiEoKAgqlcph5RYXFyM2NhYXL16stwtY8hro8Tro8TrwGkh4HfR4Hep2DYQQuH37NmJiYuDjYz0rxutbZnx8fNC8eXOnlR8cHFxvv6QSXgM9Xgc9XgdeAwmvgx6vQ+2vQU0tMhImABMREZGiMZghIiIiRWMwU0sajQZZWVnQaDTurorb8Bro8Tro8TrwGkh4HfR4HVx3Dbw+AZiIiIi8G1tmiIiISNEYzBAREZGiMZghIiIiRWMwQ0RERIrGYEZGdnY2VCqVySMhIcHqa1asWIGEhAT4+/ujU6dO+O6771xUW+dp2bJlteugUqmQkZEhe3x+fn61Y/39/V1c67rZvn07Bg0ahJiYGKhUKqxevdpkvxACs2bNQnR0NAICApCamopTp07VWO7ChQvRsmVL+Pv7IzExEXv37nXSGTiGtetQUVGBV199FZ06dULDhg0RExOD5557DpcuXbJaZm1+rtyppu9Cenp6tfPp169fjeV603cBgOzvCJVKhbfffttimUr7LsydOxePPPIIgoKCEBERgSFDhuDkyZMmx5SWliIjIwNhYWFo1KgRnn76aRQVFVktt7a/T9ylputw48YNTJkyBe3atUNAQADi4uIwdepUaLVaq+XW9mfJGIMZCzp27IjLly8bHjt37rR47H/+8x+MGjUK48ePx8GDBzFkyBAMGTIER48edWGNHe/77783uQYbNmwAAAwbNszia4KDg01ec/78eVdV1yFKSkrQuXNnLFy4UHb/W2+9hfnz52Px4sXYs2cPGjZsiLS0NJSWllos84svvsCMGTOQlZWFAwcOoHPnzkhLS8OVK1ecdRp1Zu063L17FwcOHEBmZiYOHDiAr776CidPnsSTTz5ZY7n2/Fy5W03fBQDo16+fyfn885//tFqmt30XAJic/+XLl/HRRx9BpVLh6aeftlqukr4L27ZtQ0ZGBnbv3o0NGzagoqICffv2RUlJieGY6dOn45tvvsGKFSuwbds2XLp0CUOHDrVabm1+n7hTTdfh0qVLuHTpEt555x0cPXoU+fn5WLduHcaPH19j2fb+LFUjqJqsrCzRuXNnm48fPny4GDhwoMm2xMREMXHiRAfXzL1eeukl0bp1a1FZWSm7Py8vT4SEhLi2Uk4EQKxatcrwvLKyUkRFRYm3337bsO3WrVtCo9GIf/7znxbL6datm8jIyDA81+l0IiYmRsydO9cp9XY08+sgZ+/evQKAOH/+vMVj7P258iRy12DMmDFi8ODBdpVTH74LgwcPFikpKVaPUfJ3QQghrly5IgCIbdu2CSH0vwf8/PzEihUrDMf8+OOPAoAoKCiQLaO2v088ifl1kLN8+XKhVqtFRUWFxWNq87Nkji0zFpw6dQoxMTFo1aoVnn32WVy4cMHisQUFBUhNTTXZlpaWhoKCAmdX02XKy8vxySefYNy4cVYX7Lxz5w5atGiB2NhYDB48GMeOHXNhLZ3r7NmzKCwsNPmsQ0JCkJiYaPGzLi8vx/79+01e4+Pjg9TUVK/6fmi1WqhUKoSGhlo9zp6fKyXYunUrIiIi0K5dO0yaNAnXr1+3eGx9+C4UFRXh22+/tekvcSV/F6RukyZNmgAA9u/fj4qKCpPPNiEhAXFxcRY/29r8PvE05tfB0jHBwcFo0MD6UpD2/CzJYTAjIzEx0dA8tmjRIpw9exZJSUm4ffu27PGFhYWIjIw02RYZGYnCwkJXVNclVq9ejVu3biE9Pd3iMe3atcNHH32Er7/+Gp988gkqKyvRo0cP/Pzzz66rqBNJn6c9n/W1a9eg0+m8+vtRWlqKV199FaNGjbK6kJy9P1eerl+/fli2bBk2bdqEN998E9u2bUP//v2h0+lkj68P34WlS5ciKCioxu4VJX8XKisrMW3aNDz22GN48MEHAeh/N6jV6mrBvLXPtja/TzyJ3HUwd+3aNeTm5mLChAlWy7L3Z0mO16+aXRv9+/c3/P+hhx5CYmIiWrRogeXLl9v0F4c3+sc//oH+/fsjJibG4jHdu3dH9+7dDc979OiB9u3bY8mSJcjNzXVFNcnFKioqMHz4cAghsGjRIqvHetvP1ciRIw3/79SpEx566CG0bt0aW7duRZ8+fdxYM/f56KOP8Oyzz9aY+K/k70JGRgaOHj3q0Tk+rlDTdSguLsbAgQPRoUMHZGdnWy3LET9LbJmxQWhoKB544AGcPn1adn9UVFS1rPWioiJERUW5onpOd/78eWzcuBG///3v7Xqdn58ffvWrX1m8bkojfZ72fNZNmzaFr6+vV34/pEDm/Pnz2LBhg9VWGTk1/VwpTatWrdC0aVOL5+PN3wUA2LFjB06ePGn37wlAOd+FyZMnY+3atdiyZQuaN29u2B4VFYXy8nLcunXL5Hhrn21tfp94CkvXQXL79m3069cPQUFBWLVqFfz8/Owqv6afJTkMZmxw584dnDlzBtHR0bL7u3fvjk2bNpls27Bhg0krhZLl5eUhIiICAwcOtOt1Op0OR44csXjdlCY+Ph5RUVEmn3VxcTH27Nlj8bNWq9Xo2rWryWsqKyuxadMmRX8/pEDm1KlT2LhxI8LCwuwuo6afK6X5+eefcf36dYvn463fBck//vEPdO3aFZ07d7b7tZ7+XRBCYPLkyVi1ahU2b96M+Ph4k/1du3aFn5+fyWd78uRJXLhwweJnW5vfJ+5W03UA9OfQt29fqNVqrFmzplbTc9T0s2SpcmTm5ZdfFlu3bhVnz54Vu3btEqmpqaJp06biypUrQgghfve734nXXnvNcPyuXbtEgwYNxDvvvCN+/PFHkZWVJfz8/MSRI0fcdQoOo9PpRFxcnHj11Ver7TO/DrNnzxbr168XZ86cEfv37xcjR44U/v7+4tixY66scp3cvn1bHDx4UBw8eFAAEO+++644ePCgYZTOG2+8IUJDQ8XXX38tfvjhBzF48GARHx8v7t27ZygjJSVFLFiwwPD8888/FxqNRuTn54vjx4+LCRMmiNDQUFFYWOjy87OVtetQXl4unnzySdG8eXNx6NAhcfnyZcOjrKzMUIb5dajp58rTWLsGt2/fFjNnzhQFBQXi7NmzYuPGjeLXv/61aNu2rSgtLTWU4e3fBYlWqxWBgYFi0aJFsmUo/bswadIkERISIrZu3Wryfb97967hmBdeeEHExcWJzZs3i3379onu3buL7t27m5TTrl078dVXXxme2/L7xJPUdB20Wq1ITEwUnTp1EqdPnzY55v79+4ZyjK+DrT9LNWEwI2PEiBEiOjpaqNVq0axZMzFixAhx+vRpw/5evXqJMWPGmLxm+fLl4oEHHhBqtVp07NhRfPvtty6utXOsX79eABAnT56sts/8OkybNk3ExcUJtVotIiMjxYABA8SBAwdcWNu627JliwBQ7SGdZ2VlpcjMzBSRkZFCo9GIPn36VLs2LVq0EFlZWSbbFixYYLg23bp1E7t373bRGdWOtetw9uxZ2X0AxJYtWwxlmF+Hmn6uPI21a3D37l3Rt29fER4eLvz8/ESLFi3E888/Xy0o8fbvgmTJkiUiICBA3Lp1S7YMpX8XLH3f8/LyDMfcu3dPvPjii6Jx48YiMDBQPPXUU+Ly5cvVyjF+jS2/TzxJTdfB0ncFgDh79qxJOdJrbP1Zqonq/wsmIiIiUiTmzBAREZGiMZghIiIiRWMwQ0RERIrGYIaIiIgUjcEMERERKRqDGSIiIlI0BjNERESkaAxmiMguycnJmDZtmseUY83WrVuhUqmqrZlDRN6FwQyRQqSnp0OlUkGlUkGtVqNNmzbIycnB/fv33V01qywFFF999ZXTV1Pv0aMHLl++jJCQkDqVM3XqVHTt2hUajQZdunSRPeaHH35AUlIS/P39ERsbi7feeqvGci9cuICBAwciMDAQERER+MMf/lDt89y6dSt+/etfQ6PRoE2bNsjPz69WzsKFC9GyZUv4+/sjMTERe/furc1pEikWgxkiBenXrx8uX76MU6dO4eWXX0Z2djbefvttd1erVpo0aYKgoCCnvodarUZUVBRUKlWdyxo3bhxGjBghu09aXK9FixbYv38/3n77bWRnZ+PDDz+0WJ5Op8PAgQNRXl6O//znP1i6dCny8/Mxa9YswzFnz57FwIED0bt3bxw6dAjTpk3D73//e6xfv95wzBdffIEZM2YgKysLBw4cQOfOnZGWloYrV67U+ZyJFMMhCzYQkdONGTNGDB482GTbb37zG/Hoo48KIYS4ceOG+N3vfidCQ0NFQECA6Nevn/jvf/9rODYvL0+EhISIVatWiTZt2giNRiP69u0rLly4YPU9XnrpJdGrVy/D8169eomXXnrJ8HzZsmWia9euolGjRiIyMlKMGjVKFBUVCSGE7DpO0po+5uXYWv9169aJhIQE0bBhQ5GWliYuXbpk8ZpJa8XcvHmz1mUYy8rKEp07d662/YMPPhCNGzc2WWjz1VdfFe3atbNY1nfffSd8fHxM1qBZtGiRCA4ONpTzyiuviI4dO5q8bsSIESItLc3wvFu3biIjI8PwXKfTiZiYGDF37lybzonIG7BlhkjBAgICUF5eDkDfDbVv3z6sWbMGBQUFEEJgwIABqKioMBx/9+5d/OUvf8GyZcuwa9cu3Lp1CyNHjqxTHSoqKpCbm4vDhw9j9erVOHfuHNLT0wEAsbGxWLlyJQDg5MmTuHz5MubNmydbjq31f+edd/Dxxx9j+/btuHDhAmbOnGlXfR1RhrmCggL07NkTarXasC0tLQ0nT57EzZs3Lb6mU6dOiIyMNHlNcXExjh07ZjgmNTXV5HVpaWkoKCgAAJSXl2P//v0mx/j4+CA1NdVwDFF90MDdFSAi+wkhsGnTJqxfvx5TpkzBqVOnsGbNGuzatQs9evQAAHz66aeIjY3F6tWrMWzYMAD6wOP9999HYmIiAGDp0qVo37499u7di27dutWqLuPGjTP8v1WrVpg/fz4eeeQR3LlzB40aNUKTJk0AABEREQgNDZUtw576L168GK1btwYATJ48GTk5OXbV1xFlmCssLER8fLzJNilIKSwsROPGjWVfYxzImL/G2jHFxcW4d+8ebt68CZ1OJ3vMiRMn6nRORErClhkiBVm7di0aNWoEf39/9O/fHyNGjEB2djZ+/PFHNGjQwBCkAEBYWBjatWuHH3/80bCtQYMGeOSRRwzPExISEBoaanKMvfbv349BgwYhLi4OQUFB6NWrFwB9cqutbK1/YGCgIQgBgOjoaLtzQxxRBhF5FgYzRAoiJYKeOnUK9+7dw9KlS9GwYUOHle/j4wMhhMk2424ecyUlJUhLS0NwcDA+/fRTfP/991i1ahUAGLq/HMnPz8/kuUqlqlZfV5RhLioqCkVFRSbbpOdRUVG1fo2lY4KDgxEQEICmTZvC19dX9hhL70vkjRjMEClIw4YN0aZNG8TFxaFBg6pe4vbt2+P+/fvYs2ePYdv169dx8uRJdOjQwbDt/v372Ldvn+H5yZMncevWLbRv3x4AEB4ejsuXL5u856FDhyzW58SJE7h+/TreeOMNJCUlISEhoVorh5RHotPpLJZja/09Vffu3bF9+3aTwG/Dhg1o166dbBeT9JojR46YXK8NGzYgODjYcM7du3fHpk2bTF63YcMGdO/eHYD+2nbt2tXkmMrKSmzatMlwDFF9wGCGyAu0bdsWgwcPxvPPP4+dO3fi8OHD+O1vf4tmzZph8ODBhuP8/PwwZcoU7NmzB/v370d6ejoeffRRQ75MSkoK9u3bh2XLluHUqVPIysrC0aNHLb5vXFwc1Go1FixYgJ9++glr1qypNndMixYtoFKpsHbtWly9ehV37typdf3d5fTp0zh06BAKCwtx7949HDp0CIcOHTK0Po0ePRpqtRrjx4/HsWPH8MUXX2DevHmYMWOGxTL79u2LDh064He/+x0OHz6M9evX489//jMyMjKg0WgAAC+88AJ++uknvPLKKzhx4gQ++OADLF++HNOnTzeUM2PGDPzP//wPli5dih9//BGTJk1CSUkJxo4d69yLQuRJ3DmUiohsJzds2pg0tDkkJEQEBASItLQ02aHNK1euFK1atRIajUakpqaK8+fPm5Qza9YsERkZKUJCQsT06dPF5MmTrQ7N/uyzz0TLli2FRqMR3bt3F2vWrBEAxMGDBw3H5OTkiKioKKFSqWocml1T/Y2tWrVKWPs1Zmlotj1lSHWF2RBzAOLs2bOGYw4fPiwef/xxodFoRLNmzcQbb7whWxfj15w7d070799fBAQEiKZNm4qXX35ZVFRUVHtdly5dhFqtFq1atRJ5eXnV6rdgwQIRFxcn1Gq16Natm9i9e7fV8yHyNioh6thZTESKkJ+fj2nTpnFqfzfJy8vDX//6Vxw/frxa3g4R1Q27mYiIXOC7777DX//6VwYyRE7AeWaIiFxgxYoV7q4CkddiNxMREREpGruZiIiISNEYzBAREZGiMZghIiIiRWMwQ0RERIrGYIaIiIgUjcEMERERKRqDGSIiIlI0BjNERESkaAxmiIiISNH+D5LONek9qu3MAAAAAElFTkSuQmCC\n"
+ },
+ "metadata": {}
+ }
+ ],
+ "source": [
+ "plt.plot(data['Population'], data['Profit'], 'bx')\n",
+ "plt.xlabel('Population in 10,000')\n",
+ "plt.ylabel('Profit in $10,000')\n",
+ "plt.title('Relation between profit and population')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "dIlGBwuAedBr"
+ },
+ "source": [
+ "### The hypotheses function\n",
+ "Our hypothesis function has the general form:\n",
+ "$y= h_\\theta(x)= \\theta_0 + \\theta_1x$\n",
+ "Note that this is like the equation of a straight line. We give to $h_\\theta(x)$ values for $\\theta_0$ and $\\theta_1$ to get our estimated output y. In other words, we are trying to create a function called $h_\\theta$ that is trying to map our input data (the x's) to our output data (the y's).\n",
+ "\n",
+ "### Cost function\n",
+ "\n",
+ "The cost functions yields \"how far off\" our hypotheses $h_\\theta$ is. It takes the avarage of the distance between our hypothesis and the actual point and squares it. Formally, the cost function has the following definition:\n",
+ "\n",
+ "$J(\\theta) = \\frac{1}{2m} \\displaystyle\\sum_{i = 0}^{m}(h_θ(x^{(i)}) - y^{(i)})^2$\n",
+ "\n",
+ "#### Vectorization\n",
+ "Vectorizations is the act of replacing the loops in a computer program with matrix operations. If you have a good linear algebra library (like numpy), the library will optimize the code automatically for the computer the code runs on. Mathematically, the 'regular' function should mean the same as the vectorized function.\n",
+ "\n",
+ "Gradient descent vectorized:\n",
+ "$\\theta = \\frac{1}{2m}(X\\theta - \\vec{y})^T(X\\theta-\\vec{y})$\n",
+ "\n",
+ "**Exercise**: Implement a vectorized implementation of the cost function."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {
+ "id": "RgJswa1dedBr"
+ },
+ "outputs": [],
+ "source": [
+ "def cost_function(X, y, theta):\n",
+ " \"\"\" Computes the cost of using theta as the parameter for linear gression to fit the data in X and y. \"\"\"\n",
+ " #m = len(y)\n",
+ " predictions = X @ theta # oder np.dot(X, theta)\n",
+ " errors = predictions - y\n",
+ " cost = (1 / (2 * m)) * (errors.T @ errors) # oder np.dot(errors.T, errors)\n",
+ " return cost\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "print(cost_function(X,y,theta))"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "KVyFJTXzoMoM",
+ "outputId": "a59fe435-1615-4752-a9aa-2b3b869435ac"
+ },
+ "execution_count": 38,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "[[32.07273388 32.07273388 32.07273388 ... 32.07273388 32.07273388\n",
+ " 32.07273388]\n",
+ " [32.07273388 32.07273388 32.07273388 ... 32.07273388 32.07273388\n",
+ " 32.07273388]\n",
+ " [32.07273388 32.07273388 32.07273388 ... 32.07273388 32.07273388\n",
+ " 32.07273388]\n",
+ " ...\n",
+ " [32.07273388 32.07273388 32.07273388 ... 32.07273388 32.07273388\n",
+ " 32.07273388]\n",
+ " [32.07273388 32.07273388 32.07273388 ... 32.07273388 32.07273388\n",
+ " 32.07273388]\n",
+ " [32.07273388 32.07273388 32.07273388 ... 32.07273388 32.07273388\n",
+ " 32.07273388]]\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "uD9qXs16edBr"
+ },
+ "source": [
+ "With $\\theta = \\begin{bmatrix}0 & 0\\end{bmatrix}$, $J(\\theta)$ should return 32.07."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "i7f54jpLedBr",
+ "outputId": "9023013c-9635-4188-d415-cf7916776806"
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "[[32.07273388]]\n"
+ ]
+ }
+ ],
+ "source": [
+ "initial_theta = np.zeros((2,1))\n",
+ "print(cost_function(X, y, initial_theta))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "dAnaDdOcedBs"
+ },
+ "source": [
+ "### Gradient descent\n",
+ "We want are hypothesis $h_\\theta(x)$ to function as good as possibly. Therefore, we want to minimalize the cost function $J(\\theta)$. Gradient descent is an algorithm used to do that.\n",
+ "\n",
+ "The formal definition of gradient descent:\n",
+ "\n",
+ "$repeat \\ \\{ \\\\ \\enspace \\theta_j := \\theta_j - \\alpha \\frac{1}{m}\\displaystyle\\sum_{i = 1}^{m}(h_\\theta(x^{(i)})-y^{(i)})x_j^{(i)}\\\\\\}$\n",
+ "\n",
+ "An illustration of gradient descent on a single variable:\n",
+ "
"
+ ],
+ "image/png": "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aunSpaZLarGZM2fqzDPPVHx8vNLS0nTZZZcpLy+vSZuqqipNnTpVycnJiouL0xVXXKHCwsImbfLz8zVhwgTFxMQoLS1Nd911l+rq6k5nV07KrFmzZFmW7rjjjuC+cOzvnj17dNVVVyk5OVnR0dEaOHCgli9fHjxu27Z+/etfKzMzU9HR0Ro3bpw2b97c5DOKi4s1efJkJSQkKCkpSddff70qKipOd1dOyO/361e/+pWys7MVHR2tM844Q/fee2+Te1uEcn8//vhj/eAHP1BWVpYsy9Ibb7zR5Hhr9e2LL77Q2WefraioKPl8Pv3+979v664d1fH6W1tbq7vvvlsDBw5UbGyssrKyNGXKFO3du7fJZ4RLf7/plltukWVZeuSRR5rsD6X+thrboebOnWtHRkbazzzzjL1+/Xr7xhtvtJOSkuzCwkLTpbXI+PHj7WeffdZet26dvXr1avviiy+2u3TpYldUVATb3HLLLbbP57MXLlxoL1++3D7rrLPs0aNHB4/X1dXZAwYMsMeNG2evWrXKfuedd+yUlBR7xowZJrrUbEuXLrW7detmDxo0yJ42bVpwf7j1t7i42O7atat97bXX2p9//rm9bds2e/78+faWLVuCbWbNmmUnJibab7zxhr1mzRr7kksusbOzs+3KyspgmwsvvNAePHiw/dlnn9mffPKJ3aNHD3vSpEkmunRcv/vd7+zk5GT73//+t719+3b71VdftePi4uxHH3002CaU+/vOO+/Yv/zlL+3XXnvNlmS//vrrTY63Rt9KS0vt9PR0e/Lkyfa6devsl19+2Y6OjrafeOKJ09XNoOP1t6SkxB43bpz997//3d64caOdm5trjxgxwh4+fHiTzwiX/h7ptddeswcPHmxnZWXZDz/8cJNjodTf1uLYMDJixAh76tSpwdd+v9/OysqyZ86cabCqU1dUVGRLshctWmTbdv0ve0REhP3qq68G23z55Ze2JDs3N9e27fpfHpfLZRcUFATbzJ49205ISLCrq6tPbweaqby83O7Zs6e9YMEC+9xzzw2GkXDs7913322PHTv2mMcDgYCdkZFhP/DAA8F9JSUlttfrtV9++WXbtm17w4YNtiR72bJlwTbvvvuubVmWvWfPnrYr/iRMmDDB/ulPf9pk3w9/+EN78uTJtm2HV3+/+WXVWn177LHH7A4dOjT593z33XfbvXv3buMeHd/xvpwbLV261JZk79y507bt8Ozv7t277U6dOtnr1q2zu3bt2iSMhHJ/T4UjL9PU1NRoxYoVGjduXHCfy+XSuHHjlJuba7CyU1daWipJ6tixoyRpxYoVqq2tbdLXPn36qEuXLsG+5ubmauDAgUpPTw+2GT9+vMrKyrR+/frTWH3zTZ06VRMmTGjSLyk8+/vWW28pJydHEydOVFpamoYOHaqnnnoqeHz79u0qKCho0ufExESNHDmySZ+TkpKUk5MTbDNu3Di5XC59/vnnp68zzTB69GgtXLhQmzZtkiStWbNGixcv1kUXXSQp/Pp7pNbqW25urs455xxFRkYG24wfP155eXk6ePDgaerNySktLZVlWUpKSpIUfv0NBAK6+uqrddddd6l///7fOh5u/W0uR4aRAwcOyO/3N/kykqT09HQVFBQYqurUBQIB3XHHHRozZowGDBggSSooKFBkZGTwF7vRkX0tKCg46n+LxmPtzdy5c7Vy5UrNnDnzW8fCsb/btm3T7Nmz1bNnT82fP1+33nqrbr/9dj333HOSvq75eP+eCwoKlJaW1uS4x+NRx44d212f//u//1s/+clP1KdPH0VERGjo0KG64447NHnyZEnh198jtVbfQu3feKOqqirdfffdmjRpUvBGceHW3/vvv18ej0e33377UY+HW3+bKyTu2ovmmTp1qtatW6fFixebLqXN7Nq1S9OmTdOCBQsUFRVlupzTIhAIKCcnR/fdd58kaejQoVq3bp0ef/xxXXPNNYara32vvPKKXnzxRb300kvq37+/Vq9erTvuuENZWVlh2V/Uq62t1ZVXXinbtjV79mzT5bSJFStW6NFHH9XKlStlWZbpctoVR54ZSUlJkdvt/tYMi8LCQmVkZBiq6tTcdttt+ve//60PP/xQnTt3Du7PyMhQTU2NSkpKmrQ/sq8ZGRlH/W/ReKw9WbFihYqKijRs2DB5PB55PB4tWrRIf/zjH+XxeJSenh5W/ZWkzMxM9evXr8m+vn37Kj8/X9LXNR/v33NGRoaKioqaHK+rq1NxcXG76/Ndd90VPDsycOBAXX311Zo+fXrwTFi49fdIrdW3UPs33hhEdu7cqQULFgTPikjh1d9PPvlERUVF6tKlS/Dv186dO3XnnXeqW7duksKrvy3hyDASGRmp4cOHa+HChcF9gUBACxcu1KhRowxW1nK2beu2227T66+/rg8++EDZ2dlNjg8fPlwRERFN+pqXl6f8/PxgX0eNGqW1a9c2+QVo/IPwzS9B0y644AKtXbtWq1evDm45OTmaPHly8Hk49VeSxowZ863p2ps2bVLXrl0lSdnZ2crIyGjS57KyMn3++edN+lxSUqIVK1YE23zwwQcKBAIaOXLkaehF8x0+fFguV9M/TW63W4FAQFL49fdIrdW3UaNG6eOPP1ZtbW2wzYIFC9S7d2916NDhNPWmeRqDyObNm/X+++8rOTm5yfFw6u/VV1+tL774osnfr6ysLN11112aP3++pPDqb4uYHkFryty5c22v12vPmTPH3rBhg33TTTfZSUlJTWZYhIJbb73VTkxMtD/66CN73759we3w4cPBNrfccovdpUsX+4MPPrCXL19ujxo1yh41alTweONU1+9973v26tWr7Xnz5tmpqantdqrrNx05m8a2w6+/S5cutT0ej/273/3O3rx5s/3iiy/aMTEx9gsvvBBsM2vWLDspKcl+88037S+++MK+9NJLjzoddOjQofbnn39uL1682O7Zs2e7mOr6Tddcc43dqVOn4NTe1157zU5JSbF/8YtfBNuEcn/Ly8vtVatW2atWrbIl2Q899JC9atWq4OyR1uhbSUmJnZ6ebl999dX2unXr7Llz59oxMTFGpn4er781NTX2JZdcYnfu3NlevXp1k79hR84UCZf+Hs03Z9PYdmj1t7U4NozYtm3/6U9/srt06WJHRkbaI0aMsD/77DPTJbWYpKNuzz77bLBNZWWl/bOf/czu0KGDHRMTY19++eX2vn37mnzOjh077IsuusiOjo62U1JS7DvvvNOura09zb05Od8MI+HY33/961/2gAEDbK/Xa/fp08d+8sknmxwPBAL2r371Kzs9Pd32er32BRdcYOfl5TVp89VXX9mTJk2y4+Li7ISEBPu6666zy8vLT2c3mqWsrMyeNm2a3aVLFzsqKsru3r27/ctf/rLJl1Mo9/fDDz886u/sNddcY9t26/VtzZo19tixY22v12t36tTJnjVr1unqYhPH6+/27duP+Tfsww8/DH5GuPT3aI4WRkKpv63Fsu0jljUEAAA4zRw5ZgQAALQfhBEAAGAUYQQAABhFGAEAAEYRRgAAgFGEEQAAYBRhBAAAGEUYAQAARhFGAACAUYQRAABgFGEEAAAYRRgBAABG/X87ggngwR2PEgAAAABJRU5ErkJggg==\n"
+ },
+ "metadata": {}
+ }
+ ],
+ "source": [
+ "plt.plot(J_history)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "iveY7X8TedBs"
+ },
+ "source": [
+ "#### Making a prediction using the model\n",
+ "The model can be used by calculating the dot product of the input and $\\theta$."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 90
+ },
+ "id": "B5p6OEededBs",
+ "outputId": "819d12e2-9b91-4798-9e8b-80abae2749e5"
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ ":2: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n",
+ " 'In a city with a population of 35000, we predict a profit of $%.2f' % prediction\n"
+ ]
+ },
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "'In a city with a population of 35000, we predict a profit of $4519.77'"
+ ],
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "type": "string"
+ }
+ },
+ "metadata": {},
+ "execution_count": 48
+ }
+ ],
+ "source": [
+ "prediction = np.array([1, 3.5]).dot(theta) * 10000 # don't forget to multiply the prediction by 10000\n",
+ "'In a city with a population of 35000, we predict a profit of $%.2f' % prediction"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "W59iLif5edBs"
+ },
+ "source": [
+ "\n",
+ "## Multivariate Linear Regression\n",
+ "\n",
+ "---\n",
+ "In this part, you will implement linear regression with multiple variables to predict the prices of houses. Suppose you are selling your house and you want to know what a good market price would be. One way to do this is to first collect information on recent houses sold and make a model of housing prices."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "metadata": {
+ "scrolled": true,
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 417
+ },
+ "id": "6ovhUjB3edBs",
+ "outputId": "fc7c581a-4c28-4d5f-f8b8-cdaa622e9533"
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "--2025-04-07 14:53:25-- https://raw.githubusercontent.com/annigue/CS229-Python/master/ex1/ex1data2.txt\n",
+ "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n",
+ "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n",
+ "HTTP request sent, awaiting response... 200 OK\n",
+ "Length: 657 [text/plain]\n",
+ "Saving to: ‘ex1data2.txt’\n",
+ "\n",
+ "\rex1data2.txt 0%[ ] 0 --.-KB/s \rex1data2.txt 100%[===================>] 657 --.-KB/s in 0s \n",
+ "\n",
+ "2025-04-07 14:53:25 (30.0 MB/s) - ‘ex1data2.txt’ saved [657/657]\n",
+ "\n"
+ ]
+ },
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " Size Bedrooms Price\n",
+ "0 2104 3 399900\n",
+ "1 1600 3 329900\n",
+ "2 2400 3 369000\n",
+ "3 1416 2 232000\n",
+ "4 3000 4 539900"
+ ],
+ "text/html": [
+ "\n",
+ "