Skip to content

Instantly share code, notes, and snippets.

@Z30G0D
Created January 24, 2018 19:25
Show Gist options
  • Save Z30G0D/91181130c7f238ae901fa92abcd84007 to your computer and use it in GitHub Desktop.
Save Z30G0D/91181130c7f238ae901fa92abcd84007 to your computer and use it in GitHub Desktop.
Coursera's machine learning course,
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Exercise 1- Andrew NG Machine Learning Course\n",
"## Hey all!\n",
"This is the first task from Andrew NG course of machine learning concerning simple linear regression.\n",
"I implemented the exercise in python but the original implementation is in MATLAB.\n",
"feel free to review my work through tomer@nahshoh.net.\n",
"The task is locate <a href=\"https://github.com/jdwittenauer/ipython-notebooks/blob/master/exercises/ML/ex1.pdf\">here</a>"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [],
"source": [
"from scipy.io import loadmat\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from mpl_toolkits.mplot3d import axes3d\n",
"from matplotlib import cm\n",
"from pylab import *\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"df=pd.read_csv('../Exercise1/ex1/ex1data1.txt',names = [\"X\", \"Y\"])"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>X</th>\n",
" <th>Y</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>6.1101</td>\n",
" <td>17.59200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>5.5277</td>\n",
" <td>9.13020</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>8.5186</td>\n",
" <td>13.66200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>7.0032</td>\n",
" <td>11.85400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5.8598</td>\n",
" <td>6.82330</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>8.3829</td>\n",
" <td>11.88600</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>7.4764</td>\n",
" <td>4.34830</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>8.5781</td>\n",
" <td>12.00000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>6.4862</td>\n",
" <td>6.59870</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>5.0546</td>\n",
" <td>3.81660</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>5.7107</td>\n",
" <td>3.25220</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>14.1640</td>\n",
" <td>15.50500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>5.7340</td>\n",
" <td>3.15510</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>8.4084</td>\n",
" <td>7.22580</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>5.6407</td>\n",
" <td>0.71618</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>5.3794</td>\n",
" <td>3.51290</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>6.3654</td>\n",
" <td>5.30480</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>5.1301</td>\n",
" <td>0.56077</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>6.4296</td>\n",
" <td>3.65180</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>7.0708</td>\n",
" <td>5.38930</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>6.1891</td>\n",
" <td>3.13860</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>20.2700</td>\n",
" <td>21.76700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>5.4901</td>\n",
" <td>4.26300</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>6.3261</td>\n",
" <td>5.18750</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>5.5649</td>\n",
" <td>3.08250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>18.9450</td>\n",
" <td>22.63800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>12.8280</td>\n",
" <td>13.50100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>10.9570</td>\n",
" <td>7.04670</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>13.1760</td>\n",
" <td>14.69200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>22.2030</td>\n",
" <td>24.14700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>67</th>\n",
" <td>10.2360</td>\n",
" <td>7.77540</td>\n",
" </tr>\n",
" <tr>\n",
" <th>68</th>\n",
" <td>5.4994</td>\n",
" <td>1.01730</td>\n",
" </tr>\n",
" <tr>\n",
" <th>69</th>\n",
" <td>20.3410</td>\n",
" <td>20.99200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>70</th>\n",
" <td>10.1360</td>\n",
" <td>6.67990</td>\n",
" </tr>\n",
" <tr>\n",
" <th>71</th>\n",
" <td>7.3345</td>\n",
" <td>4.02590</td>\n",
" </tr>\n",
" <tr>\n",
" <th>72</th>\n",
" <td>6.0062</td>\n",
" <td>1.27840</td>\n",
" </tr>\n",
" <tr>\n",
" <th>73</th>\n",
" <td>7.2259</td>\n",
" <td>3.34110</td>\n",
" </tr>\n",
" <tr>\n",
" <th>74</th>\n",
" <td>5.0269</td>\n",
" <td>-2.68070</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75</th>\n",
" <td>6.5479</td>\n",
" <td>0.29678</td>\n",
" </tr>\n",
" <tr>\n",
" <th>76</th>\n",
" <td>7.5386</td>\n",
" <td>3.88450</td>\n",
" </tr>\n",
" <tr>\n",
" <th>77</th>\n",
" <td>5.0365</td>\n",
" <td>5.70140</td>\n",
" </tr>\n",
" <tr>\n",
" <th>78</th>\n",
" <td>10.2740</td>\n",
" <td>6.75260</td>\n",
" </tr>\n",
" <tr>\n",
" <th>79</th>\n",
" <td>5.1077</td>\n",
" <td>2.05760</td>\n",
" </tr>\n",
" <tr>\n",
" <th>80</th>\n",
" <td>5.7292</td>\n",
" <td>0.47953</td>\n",
" </tr>\n",
" <tr>\n",
" <th>81</th>\n",
" <td>5.1884</td>\n",
" <td>0.20421</td>\n",
" </tr>\n",
" <tr>\n",
" <th>82</th>\n",
" <td>6.3557</td>\n",
" <td>0.67861</td>\n",
" </tr>\n",
" <tr>\n",
" <th>83</th>\n",
" <td>9.7687</td>\n",
" <td>7.54350</td>\n",
" </tr>\n",
" <tr>\n",
" <th>84</th>\n",
" <td>6.5159</td>\n",
" <td>5.34360</td>\n",
" </tr>\n",
" <tr>\n",
" <th>85</th>\n",
" <td>8.5172</td>\n",
" <td>4.24150</td>\n",
" </tr>\n",
" <tr>\n",
" <th>86</th>\n",
" <td>9.1802</td>\n",
" <td>6.79810</td>\n",
" </tr>\n",
" <tr>\n",
" <th>87</th>\n",
" <td>6.0020</td>\n",
" <td>0.92695</td>\n",
" </tr>\n",
" <tr>\n",
" <th>88</th>\n",
" <td>5.5204</td>\n",
" <td>0.15200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>89</th>\n",
" <td>5.0594</td>\n",
" <td>2.82140</td>\n",
" </tr>\n",
" <tr>\n",
" <th>90</th>\n",
" <td>5.7077</td>\n",
" <td>1.84510</td>\n",
" </tr>\n",
" <tr>\n",
" <th>91</th>\n",
" <td>7.6366</td>\n",
" <td>4.29590</td>\n",
" </tr>\n",
" <tr>\n",
" <th>92</th>\n",
" <td>5.8707</td>\n",
" <td>7.20290</td>\n",
" </tr>\n",
" <tr>\n",
" <th>93</th>\n",
" <td>5.3054</td>\n",
" <td>1.98690</td>\n",
" </tr>\n",
" <tr>\n",
" <th>94</th>\n",
" <td>8.2934</td>\n",
" <td>0.14454</td>\n",
" </tr>\n",
" <tr>\n",
" <th>95</th>\n",
" <td>13.3940</td>\n",
" <td>9.05510</td>\n",
" </tr>\n",
" <tr>\n",
" <th>96</th>\n",
" <td>5.4369</td>\n",
" <td>0.61705</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>97 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" X Y\n",
"0 6.1101 17.59200\n",
"1 5.5277 9.13020\n",
"2 8.5186 13.66200\n",
"3 7.0032 11.85400\n",
"4 5.8598 6.82330\n",
"5 8.3829 11.88600\n",
"6 7.4764 4.34830\n",
"7 8.5781 12.00000\n",
"8 6.4862 6.59870\n",
"9 5.0546 3.81660\n",
"10 5.7107 3.25220\n",
"11 14.1640 15.50500\n",
"12 5.7340 3.15510\n",
"13 8.4084 7.22580\n",
"14 5.6407 0.71618\n",
"15 5.3794 3.51290\n",
"16 6.3654 5.30480\n",
"17 5.1301 0.56077\n",
"18 6.4296 3.65180\n",
"19 7.0708 5.38930\n",
"20 6.1891 3.13860\n",
"21 20.2700 21.76700\n",
"22 5.4901 4.26300\n",
"23 6.3261 5.18750\n",
"24 5.5649 3.08250\n",
"25 18.9450 22.63800\n",
"26 12.8280 13.50100\n",
"27 10.9570 7.04670\n",
"28 13.1760 14.69200\n",
"29 22.2030 24.14700\n",
".. ... ...\n",
"67 10.2360 7.77540\n",
"68 5.4994 1.01730\n",
"69 20.3410 20.99200\n",
"70 10.1360 6.67990\n",
"71 7.3345 4.02590\n",
"72 6.0062 1.27840\n",
"73 7.2259 3.34110\n",
"74 5.0269 -2.68070\n",
"75 6.5479 0.29678\n",
"76 7.5386 3.88450\n",
"77 5.0365 5.70140\n",
"78 10.2740 6.75260\n",
"79 5.1077 2.05760\n",
"80 5.7292 0.47953\n",
"81 5.1884 0.20421\n",
"82 6.3557 0.67861\n",
"83 9.7687 7.54350\n",
"84 6.5159 5.34360\n",
"85 8.5172 4.24150\n",
"86 9.1802 6.79810\n",
"87 6.0020 0.92695\n",
"88 5.5204 0.15200\n",
"89 5.0594 2.82140\n",
"90 5.7077 1.84510\n",
"91 7.6366 4.29590\n",
"92 5.8707 7.20290\n",
"93 5.3054 1.98690\n",
"94 8.2934 0.14454\n",
"95 13.3940 9.05510\n",
"96 5.4369 0.61705\n",
"\n",
"[97 rows x 2 columns]"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Great, we loaded the data. X will represent the population of the city, and Y will represent the profits we've made. Let's plot the data to see what we're talking about here."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0,0.5,'Profit in 10,000$')"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x2dcbf8191d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df = df.sort_values('X', ascending=True)\n",
"ax = df.plot.scatter(x = \"X\", y=\"Y\",title='City population vs. profit')\n",
"ax.set_xlabel(\"City Population in 10,000\")\n",
"ax.set_ylabel(\"Profit in 10,000$\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ok, we plotted the data after sorting it. We can see the data is not entirely balanced since there are many small cities but much less larger cities, this could harm us down the road. for fitting the linear regression."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"def computecost(X, y, theta):\n",
" m = X.shape[0]\n",
" J = np.sum((np.square((X * theta.T) - y)) / (2 * m))\n",
" return J"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's check the cost function we wrote:"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1.0"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"theta = np.array([1, 1])\n",
"xx = np.array([3, 2])\n",
"yy = np.array([1,2])\n",
"computecost(xx, yy, theta)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Playing with it a bit shows ok results. Let's add a bias column to our data for theta0 parameter."
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<bound method NDFrame.head of Bias X Y\n",
"74 1 5.0269 -2.68070\n",
"77 1 5.0365 5.70140\n",
"9 1 5.0546 3.81660\n",
"89 1 5.0594 2.82140\n",
"46 1 5.0702 5.13370\n",
"79 1 5.1077 2.05760\n",
"17 1 5.1301 0.56077\n",
"61 1 5.1793 -0.74279\n",
"81 1 5.1884 0.20421\n",
"30 1 5.2524 -1.22000\n",
"93 1 5.3054 1.98690\n",
"51 1 5.3077 1.83960\n",
"15 1 5.3794 3.51290\n",
"40 1 5.4069 0.55657\n",
"96 1 5.4369 0.61705\n",
"22 1 5.4901 4.26300\n",
"68 1 5.4994 1.01730\n",
"88 1 5.5204 0.15200\n",
"1 1 5.5277 9.13020\n",
"49 1 5.5416 1.01790\n",
"24 1 5.5649 3.08250\n",
"37 1 5.6063 3.39280\n",
"57 1 5.6397 4.60420\n",
"14 1 5.6407 0.71618\n",
"90 1 5.7077 1.84510\n",
"10 1 5.7107 3.25220\n",
"80 1 5.7292 0.47953\n",
"12 1 5.7340 3.15510\n",
"43 1 5.7737 2.44060\n",
"47 1 5.8014 1.84400\n",
".. ... ... ...\n",
"66 1 8.2951 5.74420\n",
"5 1 8.3829 11.88600\n",
"13 1 8.4084 7.22580\n",
"85 1 8.5172 4.24150\n",
"2 1 8.5186 13.66200\n",
"7 1 8.5781 12.00000\n",
"60 1 8.8254 5.16940\n",
"86 1 9.1802 6.79810\n",
"32 1 9.2482 12.13400\n",
"58 1 9.3102 3.96240\n",
"59 1 9.4536 5.41410\n",
"83 1 9.7687 7.54350\n",
"70 1 10.1360 6.67990\n",
"67 1 10.2360 7.77540\n",
"78 1 10.2740 6.75260\n",
"27 1 10.9570 7.04670\n",
"48 1 11.7000 8.00430\n",
"42 1 11.7080 5.38540\n",
"26 1 12.8280 13.50100\n",
"38 1 12.8360 10.11700\n",
"28 1 13.1760 14.69200\n",
"95 1 13.3940 9.05510\n",
"11 1 14.1640 15.50500\n",
"63 1 14.9080 12.05400\n",
"25 1 18.9450 22.63800\n",
"64 1 18.9590 17.05400\n",
"21 1 20.2700 21.76700\n",
"69 1 20.3410 20.99200\n",
"62 1 21.2790 17.92900\n",
"29 1 22.2030 24.14700\n",
"\n",
"[97 rows x 3 columns]>"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.insert(0, 'Bias', 1)\n",
"df.head"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"seperation = df.shape[1]\n",
"X = df.iloc[:,0:seperation-1]\n",
"y = df.iloc[:,seperation-1:seperation]"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"((97, 2), (97, 1), (1, 2))"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#turning to matrices for cost function multiplication\n",
"X = np.matrix(X.values)\n",
"y = np.matrix(y.values)\n",
"theta = np.matrix(np.array([0,0]))\n",
"X.shape, y.shape, theta.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can see we have 97 rows and 2 columns for training (97 samples for x0=1 and x1=City Population).\n",
"For y we have 97 samples of equivelant profits.\n",
"and we have the learned parameters vector theta which composed of theta 0 (the bias term) and theta 1."
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"32.072733877455676"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"computecost(X,y,theta)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Great, exactly what we expected fromt the exercise. Now let's build the gradient descent function."
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"def gradientDescent(X, y, theta, alpha, num_iters):\n",
" parameters = int(theta.ravel().shape[1])\n",
" cost_history= np.zeros(num_iters)\n",
" temp_theta = np.zeros(theta.shape)\n",
" temp_theta= np.matrix(temp_theta)\n",
" for i in range(num_iters):\n",
" e = (X * theta.T) - y # calculating just one -avoiding redundancy\n",
" for j in range(parameters):\n",
" temp_theta[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(np.multiply(e, X[:,j])))\n",
" theta = temp_theta\n",
" cost_history[i] = computecost(X, y, theta)\n",
" \n",
" return theta, cost_history"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(24.47289936878686, 19.08057847001107)"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"learning_rate = 0.001\n",
"iters = 14\n",
"theta = np.matrix(np.array([0,0]))\n",
"theta, cost = gradientDescent(X, y, theta, learning_rate, iters)\n",
"cost[1], cost[3]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ok, we can see that the cost is descending, So now let's draw the hypothesis we got with the data."
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"matrix([[0.04572468, 0.55590616]])"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"theta"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [],
"source": [
"# Create a list of values in the best fit line\n",
"abline_values = [theta[0,1]* i + theta[0,0] for i in X[:,1]]\n",
"abline_values = [float(i) for i in abline_values]"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0,0.5,'Profit in 10,000$')"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x2dcbf77bfd0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = df.plot.scatter(x = \"X\", y=\"Y\",title='City population vs. profit')\n",
"plt.plot(X[:,1], abline_values, 'g')\n",
"ax.set_xlabel(\"City Population in 10,000\")\n",
"ax.set_ylabel(\"Profit in 10,000$\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ok, so we have our new hypothesis drawn.let's try to have more iteration and get a better fit."
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"iters = 800\n",
"theta, cost = gradientDescent(X, y, theta, learning_rate, iters)\n",
"# Create a list of values in the best fit line\n",
"abline_values = [theta[0,1]* i + theta[0,0] for i in X[:,1]]\n",
"abline_values = [float(i) for i in abline_values]"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0,0.5,'Profit in 10,000$')"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x2dcbf8866a0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = df.plot.scatter(x = \"X\", y=\"Y\",title='City population vs. profit')\n",
"plt.plot(X[:,1], abline_values, 'g')\n",
"ax.set_xlabel(\"City Population in 10,000\")\n",
"ax.set_ylabel(\"Profit in 10,000$\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This looks better, Now let's try to visualize J(theta), the cost function as a function of theta(0) and theta(1)."
]
},
{
"cell_type": "code",
"execution_count": 109,
"metadata": {},
"outputs": [],
"source": [
"def visualize_cost():\n",
" theta0_vals = np.linspace(-10, 10, 100);\n",
" theta1_vals = np.linspace(-1, 4, 100);\n",
" J_vals = np.zeros((len(theta0_vals), len(theta1_vals)));\n",
" # Fill out J_vals\n",
" for i in range (0,len(theta0_vals)):\n",
" for j in range (0,len(theta1_vals)):\n",
" t = np.matrix([theta0_vals[i], theta1_vals[j]])\n",
" J_vals[i,j] = computecost(X, y, t)\n",
" # now let's build the contours and plot them\n",
" plt.figure()\n",
" cp = plt.contour(theta0_vals, theta1_vals, J_vals)\n",
" plt.clabel(cp, inline=True, fontsize=10)\n",
" plt.xlabel('theta0')\n",
" plt.ylabel('theta1')\n",
" plt.show()\n",
" return "
]
},
{
"cell_type": "code",
"execution_count": 110,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x2dcbfe05668>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"visualize_cost()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"OK, this is it for now,\n",
"<br>\n",
"For comments please send to my mail: tomer@nahshoh.net\n",
"<br>\n",
"Thank you!\n",
"<br>\n",
"Tomer Nahshon"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python (myenv)",
"language": "python",
"name": "myenv"
},
"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.5.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment