diff --git a/Exercise1/exercise1.ipynb b/Exercise1/exercise1.ipynb index 0d245b5c..028bccd3 100755 --- a/Exercise1/exercise1.ipynb +++ b/Exercise1/exercise1.ipynb @@ -19,7 +19,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -43,6 +43,23 @@ "%matplotlib inline" ] }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "test\n" + ] + } + ], + "source": [ + "print('test')" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -108,7 +125,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -126,7 +143,7 @@ " Return the 5x5 identity matrix.\n", " \"\"\" \n", " # ======== YOUR CODE HERE ======\n", - " A = [] # modify this line\n", + " A = np.identity(5) # modify this line\n", " \n", " # ==============================\n", " return A" @@ -149,9 +166,24 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1., 0., 0., 0., 0.],\n", + " [0., 1., 0., 0., 0.],\n", + " [0., 0., 1., 0., 0.],\n", + " [0., 0., 0., 1., 0.],\n", + " [0., 0., 0., 0., 1.]])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "warmUpExercise()" ] @@ -173,9 +205,33 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Submitting Solutions | Programming Exercise linear-regression\n", + "\n", + "Login (email address): 16kt16@gmail.com\n", + "Token: JhtugM1qRG8iU8i2\n", + " Part Name | Score | Feedback\n", + " --------- | ----- | --------\n", + " Warm up exercise | 10 / 10 | Nice work!\n", + " Computing Cost (for one variable) | 0 / 40 | \n", + " Gradient Descent (for one variable) | 0 / 50 | \n", + " Feature Normalization | 0 / 0 | \n", + " Computing Cost (for multiple variables) | 0 / 0 | \n", + " Gradient Descent (for multiple variables) | 0 / 0 | \n", + " Normal Equations | 0 / 0 | \n", + " --------------------------------\n", + " | 10 / 100 | \n", + "\n" + ] + } + ], "source": [ "# appends the implemented function in part 1 to the grader object\n", "grader[1] = warmUpExercise\n", @@ -199,7 +255,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 58, "metadata": {}, "outputs": [], "source": [ @@ -210,6 +266,33 @@ "m = y.size # number of training examples" ] }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 6.1101 5.5277 8.5186 7.0032 5.8598 8.3829 7.4764 8.5781 6.4862\n", + " 5.0546 5.7107 14.164 5.734 8.4084 5.6407 5.3794 6.3654 5.1301\n", + " 6.4296 7.0708 6.1891 20.27 5.4901 6.3261 5.5649 18.945 12.828\n", + " 10.957 13.176 22.203 5.2524 6.5894 9.2482 5.8918 8.2111 7.9334\n", + " 8.0959 5.6063 12.836 6.3534 5.4069 6.8825 11.708 5.7737 7.8247\n", + " 7.0931 5.0702 5.8014 11.7 5.5416 7.5402 5.3077 7.4239 7.6031\n", + " 6.3328 6.3589 6.2742 5.6397 9.3102 9.4536 8.8254 5.1793 21.279\n", + " 14.908 18.959 7.2182 8.2951 10.236 5.4994 20.341 10.136 7.3345\n", + " 6.0062 7.2259 5.0269 6.5479 7.5386 5.0365 10.274 5.1077 5.7292\n", + " 5.1884 6.3557 9.7687 6.5159 8.5172 9.1802 6.002 5.5204 5.0594\n", + " 5.7077 7.6366 5.8707 5.3054 8.2934 13.394 5.4369]\n" + ] + } + ], + "source": [ + "print(X)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -236,7 +319,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 59, "metadata": {}, "outputs": [], "source": [ @@ -269,8 +352,15 @@ " \"\"\"\n", " fig = pyplot.figure() # open a new figure\n", " \n", - " # ====================== YOUR CODE HERE ======================= \n", " \n", + " # ====================== YOUR CODE HERE ======================= \n", + " pyplot.scatter(x,y)\n", + " pyplot.xticks(np.arange(5,30,step=5))\n", + " pyplot.yticks(np.arange(-5,30,step=5))\n", + " pyplot.xlabel(\"Population of City (10,000s)\")\n", + " pyplot.ylabel(\"Profit ($10,000\")\n", + " pyplot.title(\"Profit Vs Population\")\n", + " \n", "\n", " # =============================================================\n" ] @@ -288,9 +378,22 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "plotData(X, y)" ] @@ -306,11 +409,11 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ - "?pyplot.plot" + "?pyplot.scatter" ] }, { @@ -352,7 +455,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 61, "metadata": {}, "outputs": [], "source": [ @@ -377,7 +480,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 62, "metadata": {}, "outputs": [], "source": [ @@ -419,6 +522,9 @@ " J = 0\n", " \n", " # ====================== YOUR CODE HERE =====================\n", + " H=X.dot(theta)\n", + " \n", + " J = (1/(2*m))*np.sum(np.square(H-y))\n", "\n", " \n", " # ===========================================================\n", @@ -434,9 +540,23 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "With theta = [0, 0] \n", + "Cost computed = 32.07\n", + "Expected cost value (approximately) 32.07\n", + "\n", + "With theta = [-1, 2]\n", + "Cost computed = 54.24\n", + "Expected cost value (approximately) 54.24\n" + ] + } + ], "source": [ "J = computeCost(X, y, theta=np.array([0.0, 0.0]))\n", "print('With theta = [0, 0] \\nCost computed = %.2f' % J)\n", @@ -459,7 +579,17 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Submitting Solutions | Programming Exercise linear-regression\n", + "\n" + ] + } + ], "source": [ "grader[2] = computeCost\n", "grader.grade()" @@ -548,6 +678,7 @@ " for i in range(num_iters):\n", " # ==================== YOUR CODE HERE =================================\n", " \n", + " theta = theta - (alpha/m)*(X.dot(theta)-y).dot(X)\n", "\n", " # =====================================================================\n", " \n", @@ -591,6 +722,16 @@ "![](Figures/regression_result.png)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(len(X[:,1]))\n", + "print(len(y))" + ] + }, { "cell_type": "code", "execution_count": null, @@ -641,9 +782,32 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Submitting Solutions | Programming Exercise linear-regression\n", + "\n", + "Use token from last successful submission (16kt16@gmail.com)? (Y/n): Y\n", + " Part Name | Score | Feedback\n", + " --------- | ----- | --------\n", + " Warm up exercise | 10 / 10 | Nice work!\n", + " Computing Cost (for one variable) | 40 / 40 | Nice work!\n", + " Gradient Descent (for one variable) | 50 / 50 | Nice work!\n", + " Feature Normalization | 0 / 0 | \n", + " Computing Cost (for multiple variables) | 0 / 0 | \n", + " Gradient Descent (for multiple variables) | 0 / 0 | \n", + " Normal Equations | 0 / 0 | \n", + " --------------------------------\n", + " | 100 / 100 | \n", + "\n" + ] + } + ], "source": [ "grader[3] = gradientDescent\n", "grader.grade()" @@ -669,6 +833,37 @@ "execution_count": null, "metadata": {}, "outputs": [], + "source": [ + "# test\n", + "test = np.linspace(-10, 10, 100)\n", + "print(test)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/tangkai/miniconda3/envs/fastAI/lib/python3.7/site-packages/ipykernel_launcher.py:33: UserWarning: No contour levels were found within the data range.\n" + ] + }, + { + "data": { + "image/png": "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pk2bkrPGRERENPUwuaW8LFy4EI899hi6urpw4MAB9PT04Ctf+Upe921vb8+6/91338U111yD6dOnw26341vf+hb6+/sBAJ2dnZg7d27G+506dQqf+cxn4HQ64XQ6sXDhQuj1+ryTbiIiIqo+TG6pYAsWLMAtt9yCAwcOoK6uDoFAILnv7Nmzo8bnunDsjjvuwIIFC3DkyBF4PB786Ec/gpQSQCIxPnbsWMb7tbe3Y/PmzXC73cmfUCiEGTNmTODRERER0WTG5JZyOnToEB544AF0dXUBSMymPv3001ixYgWWLFmCbdu24fTp0xgaGsJ9991X8PG9Xi/sdjusVisOHTqEX/7yl8l911xzDc6ePYsHH3wQ4XAYXq8XHR0dAIC1a9fi29/+Nk6dOgUA6OvrwwsvvFCER0xERESTFZNbyslms6GjowPLly9HXV0dVqxYgfe973144IEHcNVVV+Fzn/scFi9ejGXLluGaa64p+Pj/9m//ht/+9rew2Wz44he/iM997nNp53711Vfx0ksvYfr06bjgggvw2muvAQDWrVuHa6+9Fh/72Mdgs9mwYsWKZOJLREREU5NQv/4dQ9adREQVbko1U7700kvlrl27yh0GEdG4CCF2SykvnehxOHNLRERERFWDyS0RERERVQ0mt0RERERUNZjcEhEREVHVYHJLRERERFWDyS0RERERVQ0mt0RERERUNZjcEhEREVHVYHJLRERERFWDyS0RERERVQ0mt0RERERUNZjcEhEREVHVYHJLRERERFWDyS0RERERVQ0mt0RERERUNZjcEhEREVHVYHJLRERERFWDyS0RERERVQ0mt0RERERUNZjcEhEREVHVYHJLRERERFWDyS0RERERVQ0mt0RERERUNZjcEhEREVHVYHJLRERERFWDyS0RERERVQ0mt0RERERUNZjcEhEREVHVYHJLRERERFXDUO4AJjMpJaSU5Q6jYvG5KY5CnkchBPR6fQmjISIiqmxMbidAURREIpGc48LhMHp6ejB79mwNokro7e2FEALNzc3JbUKIMccXIxE9fPgwZs2aBbPZPOFj5Wvv3r1YsmSJZufr6+tDIBDA+eefr9k53377bcydOxcWiyXrOPX96HA4oNPxSxkiIpqamNxOgBAiryRCSgmPx6NpwqEm3fmeM1vim69gMJj3c1IsoVBI0/NJKaEoiqbn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xvLly2nfvr13VAVrLatXryY6Opp27drxwAMP8Mgjj5CSknJJMTblzGQiIiIilytH3U2an7JZoJxOJ8OGDePChQtcccUVpKSksGXLliqzRJVZv3493bp1Y8GCBUyePLnCsi+++IITJ05w+PBhli5dyvvvv09JSQkXLlzw+f6IiIiISONokVduy0yePJni4mIcDgexsbGMGjWK66+/nt/85jfVtn/00UeJi4vjscceq7JszZo1TJo0CXAPC3b27FlKS0vp2LGjT/dBRERERBpPi0xuy8oS7r33Xt544w06derEggULWLBgAfn5+dUOxVRcXMxHH31EmzZtWLVqFR07duS5557zTkWalpZG27ZtGThwIIGBgWRmZrJo0SKNByoiIiLSgrTI5DYlJcU7Bq3D4aCoqAhwz9R03XXXsWXLFu+QSMnJydx111106NCBzp07c+TIEZxOJ6+99hrXX3894B6f9JFHHiE5OZl27doxefJktmzZwpAhQ5psH0VERETk4rW45LagoIANGzawbNkyUlNTmT17Np06daJv374EBQXhdDorjPXZr18/kpKSAHeNblRUFFOmTGH37t3e5BbcszY988wzTJs2zbte9+7d/btzIiIiItIgLS65DQ0NZfbs2YwfP57t27cTHx/Pl19+yVdffUX79u1ZsmRJlXXy8vJwuVzs2LGD3r17s3v37ipDfHXp0oX33nuPqVOnsmvXLsLDw+nWrZu/dktEREREGkGLS27LZn7q27cvqampbNq0if/6r/9i5syZNa7z/fffc/vtt3Pq1ClCQkKYPXs2EydO9CbCP/rRjzhy5AhHjx6lXbt2REVF8cEHH/hrl0RERESkkbS4ocBcLhcA8+bNY8eOHbz11lts3boVgDfeeIM77riDzp07M3DgQO86ERERdOrUiaysLPr27cvDDz8MwMyZM5k5cybDhg3jxIkTLFy4kA4dOnDixAkOHjzo/50TERERkQZpcclt2Ri2W7duZfr06fTo0YOePXsCsGLFCiZMmMDatWsrrPPCCy8QFRXFjTfeyM0338wLL7xQYXn79u0pLi7m97//Pfv376dLly489dRTZGRk+GenRERERKRRtLjk1hiDy+XC5XIRHR1Nfn4+Q4cOBSA/P59p06YRGRlZYZ01a9aQlZXFtGnTmD59Op988kmF5WfPnmXt2rWMGzeOw4cP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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "# grid over which we will calculate J\n", "theta0_vals = np.linspace(-10, 10, 100)\n", @@ -693,6 +888,11 @@ "pyplot.xlabel('theta0')\n", "pyplot.ylabel('theta1')\n", "pyplot.title('Surface')\n", + "ax.view_init(10, angle)\n", + "# for angle in range(0, 360):\n", + "# ax.view_init(30, angle)\n", + "# pyplot.draw()\n", + "# pyplot.pause(.001)\n", "\n", "# contour plot\n", "# Plot J_vals as 15 contours spaced logarithmically between 0.01 and 100\n", @@ -730,9 +930,28 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " X[:,0] X[:, 1] y\n", + "--------------------------\n", + " 2104 3 399900\n", + " 1600 3 329900\n", + " 2400 3 369000\n", + " 1416 2 232000\n", + " 3000 4 539900\n", + " 1985 4 299900\n", + " 1534 3 314900\n", + " 1427 3 198999\n", + " 1380 3 212000\n", + " 1494 3 242500\n" + ] + } + ], "source": [ "# Load data\n", "data = np.loadtxt(os.path.join('Data', 'ex1data2.txt'), delimiter=',')\n", @@ -747,6 +966,28 @@ " print('{:8.0f}{:8.0f}{:10.0f}'.format(X[i, 0], X[i, 1], y[i]))" ] }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[399900. 329900. 369000. 232000. 539900. 299900. 314900. 198999. 212000.\n", + " 242500. 239999. 347000. 329999. 699900. 259900. 449900. 299900. 199900.\n", + " 499998. 599000. 252900. 255000. 242900. 259900. 573900. 249900. 464500.\n", + " 469000. 475000. 299900. 349900. 169900. 314900. 579900. 285900. 249900.\n", + " 229900. 345000. 549000. 287000. 368500. 329900. 314000. 299000. 179900.\n", + " 299900. 239500.]\n" + ] + } + ], + "source": [ + "print(y)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -773,7 +1014,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -815,12 +1056,83 @@ " sigma = np.zeros(X.shape[1])\n", "\n", " # =========================== YOUR CODE HERE =====================\n", + " num_of_feature = X.shape[1]\n", + " for i in range(num_of_feature):\n", + " mu[i] = np.mean(X_norm[:,i])\n", + " sigma[i] = np.std(X_norm[:,i])\n", + " X_norm[:,i] = (X_norm[:,i] - mu[i])/sigma[i]\n", + " \n", + " \n", "\n", " \n", " # ================================================================\n", " return X_norm, mu, sigma" ] }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 1.31415422e-01 -2.26093368e-01]\n", + " [-5.09640698e-01 -2.26093368e-01]\n", + " [ 5.07908699e-01 -2.26093368e-01]\n", + " [-7.43677059e-01 -1.55439190e+00]\n", + " [ 1.27107075e+00 1.10220517e+00]\n", + " [-1.99450507e-02 1.10220517e+00]\n", + " [-5.93588523e-01 -2.26093368e-01]\n", + " [-7.29685755e-01 -2.26093368e-01]\n", + " [-7.89466782e-01 -2.26093368e-01]\n", + " [-6.44465993e-01 -2.26093368e-01]\n", + " [-7.71822042e-02 1.10220517e+00]\n", + " [-8.65999486e-04 -2.26093368e-01]\n", + " [-1.40779041e-01 -2.26093368e-01]\n", + " [ 3.15099326e+00 2.43050370e+00]\n", + " [-9.31923697e-01 -2.26093368e-01]\n", + " [ 3.80715024e-01 1.10220517e+00]\n", + " [-8.65782986e-01 -1.55439190e+00]\n", + " [-9.72625673e-01 -2.26093368e-01]\n", + " [ 7.73743478e-01 1.10220517e+00]\n", + " [ 1.31050078e+00 1.10220517e+00]\n", + " [-2.97227261e-01 -2.26093368e-01]\n", + " [-1.43322915e-01 -1.55439190e+00]\n", + " [-5.04552951e-01 -2.26093368e-01]\n", + " [-4.91995958e-02 1.10220517e+00]\n", + " [ 2.40309445e+00 -2.26093368e-01]\n", + " [-1.14560907e+00 -2.26093368e-01]\n", + " [-6.90255715e-01 -2.26093368e-01]\n", + " [ 6.68172729e-01 -2.26093368e-01]\n", + " [ 2.53521350e-01 -2.26093368e-01]\n", + " [ 8.09357707e-01 -2.26093368e-01]\n", + " [-2.05647815e-01 -1.55439190e+00]\n", + " [-1.27280274e+00 -2.88269044e+00]\n", + " [ 5.00114703e-02 1.10220517e+00]\n", + " [ 1.44532608e+00 -2.26093368e-01]\n", + " [-2.41262044e-01 1.10220517e+00]\n", + " [-7.16966387e-01 -2.26093368e-01]\n", + " [-9.68809863e-01 -2.26093368e-01]\n", + " [ 1.67029651e-01 1.10220517e+00]\n", + " [ 2.81647389e+00 1.10220517e+00]\n", + " [ 2.05187753e-01 1.10220517e+00]\n", + " [-4.28236746e-01 -1.55439190e+00]\n", + " [ 3.01854946e-01 -2.26093368e-01]\n", + " [ 7.20322135e-01 1.10220517e+00]\n", + " [-1.01841540e+00 -2.26093368e-01]\n", + " [-1.46104938e+00 -1.55439190e+00]\n", + " [-1.89112638e-01 1.10220517e+00]\n", + " [-1.01459959e+00 -2.26093368e-01]]\n" + ] + } + ], + "source": [ + "X_norm, mu, sigma = featureNormalize(X)\n", + "print(X_norm)\n" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -830,9 +1142,18 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Computed mean: [2000.68085106 3.17021277]\n", + "Computed standard deviation: [7.86202619e+02 7.52842809e-01]\n" + ] + } + ], "source": [ "# call featureNormalize on the loaded data\n", "X_norm, mu, sigma = featureNormalize(X)\n", @@ -850,9 +1171,32 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Submitting Solutions | Programming Exercise linear-regression\n", + "\n", + "Use token from last successful submission (16kt16@gmail.com)? (Y/n): Y\n", + " Part Name | Score | Feedback\n", + " --------- | ----- | --------\n", + " Warm up exercise | 0 / 10 | \n", + " Computing Cost (for one variable) | 0 / 40 | \n", + " Gradient Descent (for one variable) | 0 / 50 | \n", + " Feature Normalization | 0 / 0 | Nice work!\n", + " Computing Cost (for multiple variables) | 0 / 0 | \n", + " Gradient Descent (for multiple variables) | 0 / 0 | \n", + " Normal Equations | 0 / 0 | \n", + " --------------------------------\n", + " | 0 / 100 | \n", + "\n" + ] + } + ], "source": [ "grader[4] = featureNormalize\n", "grader.grade()" @@ -867,12 +1211,67 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 1.00000000e+00 1.31415422e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 -5.09640698e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 5.07908699e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 -7.43677059e-01 -1.55439190e+00]\n", + " [ 1.00000000e+00 1.27107075e+00 1.10220517e+00]\n", + " [ 1.00000000e+00 -1.99450507e-02 1.10220517e+00]\n", + " [ 1.00000000e+00 -5.93588523e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 -7.29685755e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 -7.89466782e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 -6.44465993e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 -7.71822042e-02 1.10220517e+00]\n", + " [ 1.00000000e+00 -8.65999486e-04 -2.26093368e-01]\n", + " [ 1.00000000e+00 -1.40779041e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 3.15099326e+00 2.43050370e+00]\n", + " [ 1.00000000e+00 -9.31923697e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 3.80715024e-01 1.10220517e+00]\n", + " [ 1.00000000e+00 -8.65782986e-01 -1.55439190e+00]\n", + " [ 1.00000000e+00 -9.72625673e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 7.73743478e-01 1.10220517e+00]\n", + " [ 1.00000000e+00 1.31050078e+00 1.10220517e+00]\n", + " [ 1.00000000e+00 -2.97227261e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 -1.43322915e-01 -1.55439190e+00]\n", + " [ 1.00000000e+00 -5.04552951e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 -4.91995958e-02 1.10220517e+00]\n", + " [ 1.00000000e+00 2.40309445e+00 -2.26093368e-01]\n", + " [ 1.00000000e+00 -1.14560907e+00 -2.26093368e-01]\n", + " [ 1.00000000e+00 -6.90255715e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 6.68172729e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 2.53521350e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 8.09357707e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 -2.05647815e-01 -1.55439190e+00]\n", + " [ 1.00000000e+00 -1.27280274e+00 -2.88269044e+00]\n", + " [ 1.00000000e+00 5.00114703e-02 1.10220517e+00]\n", + " [ 1.00000000e+00 1.44532608e+00 -2.26093368e-01]\n", + " [ 1.00000000e+00 -2.41262044e-01 1.10220517e+00]\n", + " [ 1.00000000e+00 -7.16966387e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 -9.68809863e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 1.67029651e-01 1.10220517e+00]\n", + " [ 1.00000000e+00 2.81647389e+00 1.10220517e+00]\n", + " [ 1.00000000e+00 2.05187753e-01 1.10220517e+00]\n", + " [ 1.00000000e+00 -4.28236746e-01 -1.55439190e+00]\n", + " [ 1.00000000e+00 3.01854946e-01 -2.26093368e-01]\n", + " [ 1.00000000e+00 7.20322135e-01 1.10220517e+00]\n", + " [ 1.00000000e+00 -1.01841540e+00 -2.26093368e-01]\n", + " [ 1.00000000e+00 -1.46104938e+00 -1.55439190e+00]\n", + " [ 1.00000000e+00 -1.89112638e-01 1.10220517e+00]\n", + " [ 1.00000000e+00 -1.01459959e+00 -2.26093368e-01]]\n" + ] + } + ], "source": [ "# Add intercept term to X\n", - "X = np.concatenate([np.ones((m, 1)), X_norm], axis=1)" + "X = np.concatenate([np.ones((m, 1)), X_norm], axis=1)\n", + "print(X)" ] }, { @@ -912,7 +1311,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": {}, "outputs": [], "source": [ @@ -948,12 +1347,33 @@ " J = 0\n", " \n", " # ======================= YOUR CODE HERE ===========================\n", + " \n", + " result = X.dot(theta)-y\n", + " \n", + " J= (1/(2*m))*result.dot(result)\n", "\n", " \n", " # ==================================================================\n", " return J\n" ] }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "65590832049.42542\n" + ] + } + ], + "source": [ + "print(computeCostMulti(X, y, [1,2,3]))" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -963,9 +1383,32 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Submitting Solutions | Programming Exercise linear-regression\n", + "\n", + "Use token from last successful submission (16kt16@gmail.com)? (Y/n): Y\n", + " Part Name | Score | Feedback\n", + " --------- | ----- | --------\n", + " Warm up exercise | 0 / 10 | \n", + " Computing Cost (for one variable) | 0 / 40 | \n", + " Gradient Descent (for one variable) | 0 / 50 | \n", + " Feature Normalization | 0 / 0 | Nice work!\n", + " Computing Cost (for multiple variables) | 0 / 0 | Nice work!\n", + " Gradient Descent (for multiple variables) | 0 / 0 | \n", + " Normal Equations | 0 / 0 | \n", + " --------------------------------\n", + " | 0 / 100 | \n", + "\n" + ] + } + ], "source": [ "grader[5] = computeCostMulti\n", "grader.grade()" @@ -980,7 +1423,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": {}, "outputs": [], "source": [ @@ -1031,6 +1474,7 @@ " \n", " for i in range(num_iters):\n", " # ======================= YOUR CODE HERE ==========================\n", + " theta = theta - (alpha/m)*(X.dot(theta)-y).dot(X)\n", "\n", " \n", " # =================================================================\n", @@ -1041,6 +1485,36 @@ " return theta, J_history" ] }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([32550.45653132, 9987.6658534 , 4983.01138287]),\n", + " [64297079163.321175,\n", + " 63030339668.68422,\n", + " 61790033549.45175,\n", + " 60575593674.10555,\n", + " 59386465497.47227,\n", + " 58222106769.754196,\n", + " 57081987252.605965,\n", + " 55965588442.07851,\n", + " 54872403298.25567,\n", + " 53801935981.41389])" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gradientDescentMulti(X,y,[1,2,3], 0.01,10)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1050,9 +1524,32 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Submitting Solutions | Programming Exercise linear-regression\n", + "\n", + "Use token from last successful submission (16kt16@gmail.com)? (Y/n): Y\n", + " Part Name | Score | Feedback\n", + " --------- | ----- | --------\n", + " Warm up exercise | 0 / 10 | \n", + " Computing Cost (for one variable) | 0 / 40 | \n", + " Gradient Descent (for one variable) | 0 / 50 | \n", + " Feature Normalization | 0 / 0 | Nice work!\n", + " Computing Cost (for multiple variables) | 0 / 0 | Nice work!\n", + " Gradient Descent (for multiple variables) | 0 / 0 | Nice work!\n", + " Normal Equations | 0 / 0 | \n", + " --------------------------------\n", + " | 0 / 100 | \n", + "\n" + ] + } + ], "source": [ "grader[6] = gradientDescentMulti\n", "grader.grade()" @@ -1094,9 +1591,30 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "theta computed from gradient descent: [340412.65957447 109447.79558639 -6578.3539709 ]\n", + "Predicted price of a 1650 sq-ft, 3 br house (using gradient descent): $0\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXgAAAERCAYAAABxZrw0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAaqUlEQVR4nO3df5xddX3n8dd7fucXCSQDBoKEn7qUAuKAtVAU6gPRYqldECmt+pAu2/pjZbtdJetjq6uP7dby0LXbajVVirb4AxB2LS0iCkhrFZhACKH8VEAiPzIxhISETDIzn/3jfO/MnZ+5M5lz78z3vp+Px2TuPffccz5zZvKe73zP93yPIgIzM8tPS6MLMDOzcjjgzcwy5YA3M8uUA97MLFMOeDOzTDngzcwyNecCXtJVkjZL2ljDumdKulfSgKQLxrz2bkmPpY93l1exmdncNOcCHrgaOLfGdX8GvAf4WvVCSQcBHwNeB5wGfEzSgbNXopnZ3DfnAj4i7gS2Vi+TdLSk70haJ+mfJb06rftkRGwAhsZs5s3ArRGxNSJeAG6l9l8aZmZZaGt0ATVaC/xBRDwm6XXA54Gzp1j/MODpqueb0jIzs6Yx5wNe0mLgV4HrJFUWd+7rbRMs85wMZtZU5nzAU3QjbYuIk6fxnk3AG6uerwLumMWazMzmvDnXBz9WRGwHnpB0IYAKJ+3jbbcA50g6MJ1cPSctMzNrGnMu4CV9HfgR8CpJmyRdClwCXCrpfuBB4Py07qmSNgEXAl+U9CBARGwFPgnckz4+kZaZmTUNebpgM7M8zbkWvJmZzY45dZJ1xYoVsXr16kaXYWY2b6xbt25LRHRP9NqcCvjVq1fT29vb6DLMzOYNSU9N9pq7aMzMMuWANzPLlAPezCxTDngzs0w54M3MMuWANzPLlAPezCxT8z7gH3t+B+/44o9Yc8OGRpdiZjanzKkLnWZi155B7n5iKy/vGWx0KWZmc8q8b8G3tRb39tg7OPaufWZmzW3eB3xHa/ElOODNzEab9wHflgJ+YMjTHpuZVZv/Ad9SdNEMDDrgzcyqzfuAb3cXjZnZhOZ9wFdOsrqLxsxstHkf8O0tbsGbmU1k3gf8cAveffBmZqPkE/BDbsGbmVUr9UpWSU8CO4BBYCAiemZ7HyNdNEFEIGm2d2FmNi/VY6qCsyJiS1kbb2kRrS1icCgYGAraWx3wZmaQQRcNeCy8mdlEyg74AL4raZ2kyyZaQdJlknol9fb19c1oJ8Nj4d0Pb2Y2rOyAPz0iTgHeArxf0pljV4iItRHRExE93d3dM9qJR9KYmY1XasBHxDPp82bgRuC0MvbTlk60DngsvJnZsNICXtIiSUsqj4FzgI1l7KtyYnWvr2Y1MxtW5iiaQ4Ab07DFNuBrEfGdMnY00kXjFryZWUVpAR8RPwVOKmv71arHwpuZWSGPYZK+q5OZ2ThZBHxlmKRH0ZiZjcgi4Ns8Dt7MbJwsAr7dV7KamY2TRcB7FI2Z2XhZBPzIVAVuwZuZVWQR8COTjbkFb2ZWkUfAt3ocvJnZWFkEfLvHwZuZjZNFwA9PNuZhkmZmw7II+HZ30ZiZjZNJwHscvJnZWFkE/PA4eHfRmJkNyyPgPZukmdk4WQR8u69kNTMbJ4uAr4yDH/CVrGZmw7II+MpkYx4Hb2Y2IouAH7mS1QFvZlaRRcD7hh9mZuNlEvCVLhoHvJlZRSYB7y4aM7Oxsgj4jrbiy9gz4IA3M6vIIuDdgjczGy+LgB9uwTvgzcyG5RHw6SSru2jMzEZkEfDuojEzGy+LgHcXjZnZeFkE/HALfsDj4M3MKrIIeLfgzczGKz3gJbVKuk/STWXto6PV4+DNzMaqRwv+Q8BDZe7AJ1nNzMYrNeAlrQJ+A/hSmftxF42Z2Xhlt+A/C3wYmDR5JV0mqVdSb19f34x2MjzZmLtozMyGlRbwks4DNkfEuqnWi4i1EdETET3d3d0z2tdIC96jaMzMKspswZ8O/KakJ4FvAGdL+vsydjRyknWwjM2bmc1LpQV8RKyJiFURsRp4J3BbRPxuGfsaOcnqFryZWYXHwZuZZaqtHjuJiDuAO8raflu66fbgUDA4FLSm52ZmzSyLFryk4Va8x8KbmRWyCHioOtHqgDczAzIKeI+FNzMbLZuA94lWM7PRsgl4TxlsZjZaNgHvFryZ2Wj5BLynDDYzGyWbgPeUwWZmo2UT8O6iMTMbLZuA9zBJM7PRsgn4jrZWwC14M7OKfAI+teB9ktXMrJBPwLsP3sxslGwCvjN10fTvdcCbmUFWAV98Kf3uojEzA7IMeN+2z8wMcgr49tRF4xa8mRmQU8BXWvDugzczAzIM+D2D7qIxM4OsAt6jaMzMquUT8O0eRWNmVi2fgPcoGjOzUTIKeI+iMTOrllHAexSNmVm1bAK+w100ZmajZBPw7qIxMxstn4D3KBozs1HyCXh30ZiZjZJRwPtCJzOzahkFvLtozMyqtU32gqSDpnhff0TsnGrDkrqAO4HOtJ/rI+JjM6qyBiN98O6iMTODKQIeWAcEoIneJwngioi4ZpL39wNnR8RLktqBf5F0c0T8eL8qnoRH0ZiZjTZpwEfEkVO9UVI38ANgwoCPiABeSk/b00fMrMx9G55N0gFvZgbsRx98RPQBH5lqHUmtktYDm4FbI+KuCda5TFKvpN6+vr6ZluM+eDOzMfbrJGtE/MM+Xh+MiJOBVcBpkk6YYJ21EdETET3d3d0zrqWttYXWFjE4FAwMOuTNzOoyiiYitgF3AOeWuR+34s3MRuwz4CX9XS3LJlinW9Ky9HgB8Cbg4ZkUWatKwO/e65E0ZmZTjaKp+KXqJ5JagdfW8L6VwFfS+i3AtRFx0/RLrF1Xeyuwl91uwZuZTTkOfg3w34AFkrZXFgN7gLX72nBEbABeMxtF1mpBezFU8uU9bsGbmU3aRRMR/ysilgBXRsQB6WNJRCyPiDV1rLFmXSng3UVjZlbbSdabJC0CkPS7kj4j6YiS65qRBR2pBe+ANzOrKeD/Gtgl6STgw8BTwFdLrWqGutp9ktXMrKKWgB9IV6WeD/xFRPwFsKTcsmbGffBmZiNqGUWzI51w/T3g19KomPZyy5qZSh+8u2jMzGprwV9EMXHYeyPiOeAw4MpSq5qhBT7JamY2bJ8Bn0L9GmCppPOA3RExJ/vgh0+yuovGzKymK1nfAdwNXAi8A7hL0gVlFzYTw33wvquTmVlNffAfBU6NiM0wPE3w94DryyxsJjwO3sxsRC198C2VcE9+UeP76s4Bb2Y2opYW/Hck3QJ8PT2/CLi5vJJmbkEaB+9RNGZmNQR8RPxXSb8NnEExF83aiLix9MpmwCdZzcxGTDXZ2DHAIRHxw4i4AbghLT9T0tER8ZN6FVkrj4M3MxsxVV/6Z4EdEyzflV6bczwO3sxsxFQBvzpN+TtKRPQCq0uraD94sjEzsxFTBXzXFK8tmO1CZsPIKBqPgzczmyrg75H0H8YulHQpsK68kmbOk42ZmY2YahTN5cCNki5hJNB7gA7g7WUXNhM+yWpmNmLSgI+I54FflXQWcEJa/I8RcVtdKpuBRZ1FwO/sH2hwJWZmjVfLOPjbgdvrUMt+W9RZfDm73EVjZjY3pxyYqYWpi2bnngGKe5SYmTWvrAK+rbWFzrYWIjySxswsq4AHWJy6aV5yP7yZNbnsAn5hOtG6a48D3syaW3YBv6ijaMHv7PeJVjNrbtkF/MIOt+DNzCDDgK8MldzpoZJm1uTyC/jhLhq34M2suWUX8At9NauZGVBiwEs6XNLtkh6S9KCkD5W1r2qVFryvZjWzZlfLPVlnagD4LxFxr6QlwDpJt0bEv5W4z6o+eLfgzay5ldaCj4hnI+Le9HgH8BBwWFn7q1jU4S4aMzOoUx+8pNXAa4C7yt7Xwk6PgzczgzoEvKTFwLeAyyNi+wSvXyapV1JvX1/ffu9vsU+ympkBJQe8pHaKcL8mIm6YaJ2IWBsRPRHR093dvd/7XNLVDsCO3Q54M2tuZY6iEfBl4KGI+ExZ+xlrSVfRRbOjf2+9dmlmNieV2YI/Hfg94GxJ69PHW0vcH+AWvJlZRWnDJCPiXwCVtf3JDLfgHfBm1uSyu5K1EvDbX3YXjZk1t+wC/gB30ZiZARkGfGdbC+2tYs/gELv3eiy8mTWv7AJekk+0mpmRYcBD9YlW98ObWfPKMuDdD29mlmnAD4+kcQvezJpY1gHvFryZNbMsA77SReOx8GbWzLIM+AMXdQDwwi4HvJk1rywDfumCogW/bdeeBldiZtY4WQb8gQuLFvw2t+DNrIllGvBFC/4Ft+DNrIllGfDL3II3M8sz4A9c5Ba8mVmWAb9sQWrBe5ikmTWxPAN+4cgomohocDVmZo2RZcB3tbeyoL2VvYPBzj2eMtjMmlOWAQ9VI2l2uh/ezJpTtgG/fHEnAFte6m9wJWZmjZFtwK9YXJxo3fKSW/Bm1pwyDni34M2suWUb8N1LUsDvcMCbWXPKNuDdgjezZpdvwKcWfJ8D3syaVL4BXznJusMnWc2sOWUb8AcvcReNmTW3bAO+e0kXAM9t3+3pCsysKWUb8Ad0tbGwo5VdewbZ7ptvm1kTyjbgJbFyadGKf/bFlxtcjZlZ/ZUW8JKukrRZ0say9rEvhy5bAMCz23Y3qgQzs4YpswV/NXBuidvfp1ccUGnBO+DNrPmUFvARcSewtazt12JlpQXvLhoza0IN74OXdJmkXkm9fX19s7rtQ1Mf/DPuojGzJtTwgI+ItRHRExE93d3ds7rtVQcuBODpF3bN6nbNzOaDhgd8mY5YXgT8U7/Y2eBKzMzqL+uAX7m0i/ZW8fz2fnbv9a37zKy5lDlM8uvAj4BXSdok6dKy9jWZttaW4W6an211N42ZNZe2sjYcEReXte3peOVBC3liy06e3LKT4w5Z0uhyzMzqJusuGoDVqR/+iS3uhzez5pJ9wB+bWu2PPv9SgysxM6uv7AP+Va8oAv6xzTsaXImZWX1lH/DHHVxpwe9gaMjTBptZ88g+4JcubOeQAzrZvXfII2nMrKlkH/AAx688AIAHfv5igysxM6ufpgj4kw5fBsCGTdsaXImZWf00R8CvKgL+/qfdgjez5tEUAX/iqqUAbPj5NvYMDDW4GjOz+miKgF++uJNjD17M7r1DrH/a3TRm1hyaIuABTj9mBQD/+pMtDa7EzKw+mibgX3/0cgDufHR2bypiZjZXNU3An3HMCjraWrj3Z9vYvN13eDKz/DVNwC/qbOPMY4tumlsefK7B1ZiZla9pAh7gvBMPBeC6dZsaXImZWfmaKuDPPeEVHNDVxoZNL/LAJo+JN7O8NVXAd7W3ctGphwPw+Tseb3A1ZmblaqqAB/j9XzuKjrYWbt74HPf97IVGl2NmVpqmC/hDDuji9884EoA1NzxA/4Bvxm1meWq6gAd4/1nHcMTyhTz83A4+cv0GzxNvZllqyoBf1NnGX118Cos6Wvm/65/hI9/a4Ja8mWWnKQMe4JdXLeXL7zmVzrYWrlu3ifP/6ofc/cTWRpdlZjZrFDF3uid6enqit7e3rvtc//Q2Lv/GfTz5i+JuTycdvoy3nbiS1x+9nOMOWUJ7a9P+DjSzeUDSuojomfC1Zg94gJ39A3zxzp9y9Q+fYPvugeHlnW0tHLliEYcuW8DKpV0sX9zJ4s5WFne2s6izlUUdbbS3tdDeIlpbRFtrC23pcXtrC63pMYAAFQ8RaZlGapBAmnjdkceVf0a2YfOH/C2bd+r5LVu6oJ22GTQoHfA12tk/wG0Pb+b7Dz3P+qe3DbfqzczK9r0/egPHHLx42u+bKuDb9ruqjCzqbONtJx3K204qpjR4cddentq6k2e27ebZF1/mhV172dk/wM7+AXb0D7Crf4CBoWBgMBgcCvYODTGYng8MDTEwGAQQUXwGiIDKs4jig+HXpliP6nXnzi9lq80cakdZjer9Lav8tT+bHPBTWLqwnRMXLuPEVY2uxMxs+nwG0cwsUw54M7NMOeDNzDJVasBLOlfSI5Iel3RFmfsyM7PRSgt4Sa3A54C3AMcDF0s6vqz9mZnZaGW24E8DHo+In0bEHuAbwPkl7s/MzKqUGfCHAU9XPd+Ulo0i6TJJvZJ6+/r6SizHzKy5lBnwE43aH3ftQESsjYieiOjp7u4usRwzs+ZS5oVOm4DDq56vAp6Z6g3r1q3bIumpGe5vBbBlhu8tk+uaHtc1PXO1Lpi7teVW1xGTvVDaXDSS2oBHgV8Hfg7cA/xORDxY0v56J5uPoZFc1/S4rumZq3XB3K2tmeoqrQUfEQOSPgDcArQCV5UV7mZmNl6pc9FExD8B/1TmPszMbGI5Xcm6ttEFTMJ1TY/rmp65WhfM3dqapq45NR+8mZnNnpxa8GZmVsUBb2aWqXkf8HNpQjNJT0p6QNJ6Sb1p2UGSbpX0WPp8YJ1quUrSZkkbq5ZNWIsK/ycdww2STqlzXR+X9PN03NZLemvVa2tSXY9IenOJdR0u6XZJD0l6UNKH0vKGHrMp6mroMZPUJeluSfenuv5HWn6kpLvS8fqmpI60vDM9fzy9vrrOdV0t6Ymq43VyWl63n/20v1ZJ90m6KT0v93hFxLz9oBh++RPgKKADuB84voH1PAmsGLPsz4Er0uMrgE/VqZYzgVOAjfuqBXgrcDPF1ce/AtxV57o+DvzxBOsen76nncCR6XvdWlJdK4FT0uMlFNdwHN/oYzZFXQ09ZunrXpwetwN3peNwLfDOtPwLwB+mx+8DvpAevxP4ZknHa7K6rgYumGD9uv3sp/39EfA14Kb0vNTjNd9b8PNhQrPzga+kx18BfqseO42IO4GtNdZyPvDVKPwYWCZpZR3rmsz5wDcioj8ingAep/iel1HXsxFxb3q8A3iIYu6khh6zKeqaTF2OWfq6X0pP29NHAGcD16flY49X5TheD/y6pFm/CekUdU2mbj/7klYBvwF8KT0XJR+v+R7wNU1oVkcBfFfSOkmXpWWHRMSzUPxnBQ5uWHWT1zIXjuMH0p/IV1V1YzWkrvTn8GsoWn9z5piNqQsafMxSd8N6YDNwK8VfC9siYmCCfQ/XlV5/EVhej7oionK8/mc6Xv9bUufYuiaoebZ9FvgwMJSeL6fk4zXfA76mCc3q6PSIOIViDvz3SzqzgbVMR6OP418DRwMnA88Cn07L616XpMXAt4DLI2L7VKtOsKy02iaoq+HHLCIGI+JkinmmTgP+3RT7blhdkk4A1gCvBk4FDgI+Us+6JJ0HbI6IddWLp9j3rNQ13wN+2hOalSkinkmfNwM3UvzQP1/5ky993tyo+qaopaHHMSKeT/8ph4C/YaRLoa51SWqnCNFrIuKGtLjhx2yiuubKMUu1bAPuoOjDXqZiHqqx+x6uK72+lNq76va3rnNTV1dERD/wt9T/eJ0O/KakJym6ks+maNGXerzme8DfAxybzkR3UJyM+HYjCpG0SNKSymPgHGBjqufdabV3A/+vEfUlk9XybeBdaUTBrwAvVrol6mFMn+fbKY5bpa53phEFRwLHAneXVIOALwMPRcRnql5q6DGbrK5GHzNJ3ZKWpccLgDdRnB+4HbggrTb2eFWO4wXAbZHOINahroerfkmLop+7+niV/n2MiDURsSoiVlPk1G0RcQllH6+yzhbX64PiLPijFP1/H21gHUdRjF64H3iwUgtFv9n3gcfS54PqVM/XKf5030vRGrh0sloo/hz8XDqGDwA9da7r79J+N6Qf7JVV63801fUI8JYS6zqD4k/gDcD69PHWRh+zKepq6DEDTgTuS/vfCPxJ1f+DuylO7l4HdKblXen54+n1o+pc123peG0E/p6RkTZ1+9mvqvGNjIyiKfV4eaoCM7NMzfcuGjMzm4QD3swsUw54M7NMOeDNzDLlgDczy5QD3kojKSR9uur5H0v6+Cxt+2pJF+x7zf3ez4UqZnK8fczyQyVdnx6frKrZHGdhn8skvW+ifZlNhwPeytQP/LakFY0upJqk1mmsfinwvog4q3phRDwTEZVfMCdTjE2fTg1T3Q95GcVsghPty6xmDngr0wDFfSb/89gXxrbAJb2UPr9R0g8kXSvpUUl/JukSFXN8PyDp6KrNvEnSP6f1zkvvb5V0paR70sRS/7Fqu7dL+hrFBS1j67k4bX+jpE+lZX9CcaHRFyRdOWb91WndDuATwEUq5hm/KF3VfFWq4T5J56f3vEfSdZL+gWJSusWSvi/p3rTvykyofwYcnbZ3ZWVfaRtdkv42rX+fpLOqtn2DpO+omFv8z6uOx9Wp1gckjfteWL6makWYzYbPARsqgVOjkygmrtoK/BT4UkScpuJmFx8ELk/rrQbeQDHp1u2SjgHeRXG5+akqZgz8oaTvpvVPA06IYhrdYZIOBT4FvBZ4gSJ8fysiPiHpbIp513snKjQi9qRfBD0R8YG0vT+luLT8vemy+bslfS+95fXAiRGxNbXi3x4R29NfOT+W9G2KeedPiGLCrMoskhXvT/v9ZUmvTrUel147mWK2yX7gEUl/STH75WERcULa1rKpD73lxC14K1UUMx9+FfhP03jbPVFMDtVPcQl5JaAfoAj1imsjYigiHqP4RfBqijmA3qViuti7KKYaODatf/fYcE9OBe6IiL4opma9huLGJDN1DnBFquEOisvOX5leuzUiKpNGCfhTSRuA71FMEXvIPrZ9BsU0BUTEw8BTQCXgvx8RL0bEbuDfgCMojstRkv5S0rnAVDNkWmbcgrd6+CxwL8UsfhUDpAZGmgCqo+q1/qrHQ1XPhxj9Mzt2no2gCM0PRsQt1S9IeiOwc5L6ZvvGEwL+fUQ8MqaG142p4RKgG3htROxVMdNgVw3bnkz1cRsE2iLiBUknAW+maP2/A3hvTV+FzXtuwVvpUov1WooTlhVPUnSJQHH3mvYZbPpCSS2pX/4oism1bgH+UMUUu0g6TsXsnlO5C3iDpBXpBOzFwA+mUccOitvpVdwCfDD94kLSayZ531KKOcL3pr70IybZXrU7KX4xkLpmXknxdU8odf20RMS3gP9OcbtEaxIOeKuXTwPVo2n+hiJU7wbGtmxr9QhFEN8M/EHqmvgSRffEvenE5BfZx1+qUUwPu4Zi6tb7gXsjYjrTOt8OHF85yQp8kuIX1oZUwycned81QI+KG7RfAjyc6vkFxbmDjWNP7gKfB1olPQB8E3hP6sqazGHAHam76Or0dVqT8GySZmaZcgvezCxTDngzs0w54M3MMuWANzPLlAPezCxTDngzs0w54M3MMvX/AZGflFoLmw9NAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "\"\"\"\n", "Instructions\n", @@ -1171,7 +1689,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 42, "metadata": {}, "outputs": [], "source": [ @@ -1183,6 +1701,27 @@ "X = np.concatenate([np.ones((m, 1)), X], axis=1)" ] }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1.5999395e+07 3.5917829e+10 5.2657282e+07]\n", + "[[ 3.99642990e-01 -7.36150728e-06 -1.14704720e-01]\n", + " [-7.36150728e-06 5.01455797e-08 -2.93241497e-05]\n", + " [-1.14704720e-01 -2.93241497e-05 5.46881227e-02]]\n" + ] + } + ], + "source": [ + "print(np.transpose(X).dot(y))\n", + "print(np.linalg.inv(np.transpose(X).dot(X)))" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1194,7 +1733,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 49, "metadata": {}, "outputs": [], "source": [ @@ -1227,6 +1766,7 @@ " theta = np.zeros(X.shape[1])\n", " \n", " # ===================== YOUR CODE HERE ============================\n", + " theta=np.linalg.inv(np.transpose(X).dot(X)).dot(np.transpose(X).dot(y))\n", "\n", " \n", " # =================================================================\n", @@ -1299,7 +1839,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.7.0" } }, "nbformat": 4,