ml-schoo-and-maybe-andrew-ng/work/.ipynb_checkpoints/C1_W2_Lab01_Model_Represent...

330 lines
9.5 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Ungraded Lab: Model Representation\n",
"\n",
"In this ungraded lab, you will implement the model $f_w$ for linear regression with one variable.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Problem Statement\n",
"\n",
"You will use the motivating example of housing price prediction. There are two data points - a house with 1000 square feet sold for \\\\$200,000 and a house with 2000 square feet sold for \\\\$400,000.\n",
"\n",
"Therefore, your dataset contains the following two points - \n",
"\n",
"| Size (feet$^2$) | Price (1000s of dollars) |\n",
"| -------------------| ------------------------ |\n",
"| 1000 | 200 |\n",
"| 2000 | 400 |\n",
"\n",
"You would like to fit a linear regression model (represented with a straight line) through these two points, so you can then predict price for other houses - say, a house with 1200 feet$^2$.\n",
"\n",
"### Notation: `X` and `y`\n",
"\n",
"For the next few labs, you will use lists in python to represent your dataset. As shown in the video:\n",
"- `X` represents input variables, also called input features (in this case - Size (feet$^2$)) and \n",
"- `y` represents output variables, also known as target variables (in this case - Price (1000s of dollars)). \n",
"\n",
"Please run the following code cell to create your `X` and `y` variables."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# X is the input variable (size in square feet)\n",
"# y in the output variable (price in 1000s of dollars)\n",
"X = [1000, 2000] \n",
"y = [200, 400]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Number of training examples `m`\n",
"You will use `m` to denote the number of training examples. In Python, use the `len()` function to get the number of examples in a list. You can get `m` by running the next code cell."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# m is the number of training examples\n",
"m = len(X)\n",
"print(f\"Number of training examples is: {m}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Training example `x_i, y_i`\n",
"\n",
"You will use (x$^i$, y$^i$) to denote the $i^{th}$ training example. Since Python is zero indexed, (x$^0$, y$^0$) is (1000, 200) and (x$^1$, y$^1$) is (2000, 400). \n",
"\n",
"Run the next code block below to get the $i^{th}$ training example in a Python list."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"i = 0 # Change this to 1 to see (x^1, y^1)\n",
"\n",
"x_i = X[i]\n",
"y_i = y[i]\n",
"print(f\"(x^({i}), y^({i})) = ({x_i}, {y_i})\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plotting the data\n",
"First, let's run the cell below to import [matplotlib](http://matplotlib.org), which is a famous library to plot graphs in Python. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can plot these two points using the `scatter()` function in the `matplotlib` library, as shown in the cell below. \n",
"- The function arguments `marker` and `c` show the points as red crosses (the default is blue dots).\n",
"\n",
"You can also use other functions in the `matplotlib` library to display the title and labels for the axes."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Plot the data points\n",
"plt.scatter(X, y, marker='x', c='r')\n",
"\n",
"# Set the title\n",
"plt.title(\"Housing Prices\")\n",
"# Set the y-axis label\n",
"plt.ylabel('Price (in 1000s of dollars)')\n",
"# Set the x-axis label\n",
"plt.xlabel('Size (feet^2)')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Model function\n",
"\n",
"The model function for linear regression (which is a function that maps from `X` to `y`) is represented as \n",
"\n",
"$f(x) = w_0 + w_1x$\n",
"\n",
"The formula above is how you can represent straight lines - different values of $w_0$ and $w_1$ give you different straight lines on the plot. Let's try to get a better intuition for this through the code blocks below.\n",
"\n",
"Let's represent $w$ as a list in python, with $w_0$ as the first item in the list and $w_1$ as the second. \n",
"\n",
"Let's start with $w_0 = 3$ and $w_1 = 1$ \n",
"\n",
"### Note: You can come back to this cell to adjust the model's w0 and w1 parameters"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# You can come back here later to adjust w0 and w1\n",
"w = [3, 1] \n",
"print(\"w_0:\", w[0])\n",
"print(\"w_1:\", w[1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, let's calculate the value of $f(x)$ for your two data points. You can explicitly write this out for each data point as - \n",
"\n",
"for $x^0$, `f = w[0]+w[1]*X[0]`\n",
"\n",
"for $x^1$, `f = w[0]+w[1]*X[1]`\n",
"\n",
"For a large number of data points, this can get unwieldy and repetitive. So instead, you can calculate the function output in a `for` loop as follows - \n",
"\n",
"```\n",
"f = []\n",
"for i in range(len(X)):\n",
" f_x = w[0] + w[1]*X[i]\n",
" f.append(f_x)\n",
"```\n",
"\n",
"Paste the code shown above in the `calculate_model_output` function below.\n",
"Please recall that in Python, indentation is significant. Incorrect indentation may result in a Python error message."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def calculate_model_output(w, X):\n",
" ### START CODE HERE ### \n",
"\n",
" ### END CODE HERE ###\n",
" return f"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's call the `calculate_model_output` function and plot the output using the `plot` method from `matplotlib` library."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"f = calculate_model_output(w, X)\n",
"\n",
"# Plot our model prediction\n",
"plt.plot(X, f, c='b',label='Our Prediction')\n",
"\n",
"# Plot the data points\n",
"plt.scatter(X, y, marker='x', c='r',label='Actual Values')\n",
"\n",
"# Set the title\n",
"plt.title(\"Housing Prices\")\n",
"# Set the y-axis label\n",
"plt.ylabel('Price (in 1000s of dollars)')\n",
"# Set the x-axis label\n",
"plt.xlabel('Size (feet^2)')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As you can see, setting $w_0 = 3$ and $w_1 = 1$ does not result in a line that fits our data. \n",
"\n",
"### Challenge\n",
"Try experimenting with different values of $w_0$ and $w_1$. What should the values be for getting a line that fits our data?\n",
"\n",
"#### Tip:\n",
"You can use your mouse to click on the triangle to the left of the green \"Hints\" below to reveal some hints for choosing w0 and w1."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
"<summary>\n",
" <font size='3', color='darkgreen'><b>Hints</b></font>\n",
"</summary>\n",
" <p>\n",
" <ul>\n",
" <li>Try w0 = 1 and w1 = 0.5, w = [1, 0.5] </li>\n",
" <li>Try w0 = 0 and w1 = 0.2, w = [0, 0.2] </li>\n",
" </ul>\n",
" </p>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Prediction\n",
"Now that we have a model, we can use it to make our original prediction. Write the expression to predict the price of a house with 1200 feet^2. You can check your answer below.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"\n",
"print(f\"{cost_1200sqft:.0f} thousand dollars\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<details>\n",
"<summary>\n",
" <font size='3', color='darkgreen'><b>Answer</b></font> \n",
"</summary> \n",
"\n",
"```\n",
" w = [0, 0.2] \n",
" cost_1200sqft = w[0] + w[1]*1200\n",
" ```\n",
"\n",
"240 thousand dollars"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.8.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}