diff --git a/Module 1/.ipynb_checkpoints/Getting Familiar with Numpy-checkpoint.ipynb b/Module 1/.ipynb_checkpoints/Getting Familiar with Numpy-checkpoint.ipynb index cb19a1b..136bfb5 100644 --- a/Module 1/.ipynb_checkpoints/Getting Familiar with Numpy-checkpoint.ipynb +++ b/Module 1/.ipynb_checkpoints/Getting Familiar with Numpy-checkpoint.ipynb @@ -34,7 +34,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -45,13 +45,13 @@ " [1., 1., 1.]])" ] }, - "execution_count": 5, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "np.matrix(np.ones((3,3)))" + "np.matrix(np.ones([3,3]))" ] }, { @@ -102,7 +102,9 @@ { "cell_type": "code", "execution_count": 25, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "X = np.matrix([5,5]).transpose()\n", @@ -119,7 +121,9 @@ { "cell_type": "code", "execution_count": 30, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# ====================== YOUR CODE HERE ======================\n", diff --git a/Module 1/Getting Familiar with Numpy.ipynb b/Module 1/Getting Familiar with Numpy.ipynb index cb19a1b..136bfb5 100644 --- a/Module 1/Getting Familiar with Numpy.ipynb +++ b/Module 1/Getting Familiar with Numpy.ipynb @@ -34,7 +34,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -45,13 +45,13 @@ " [1., 1., 1.]])" ] }, - "execution_count": 5, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "np.matrix(np.ones((3,3)))" + "np.matrix(np.ones([3,3]))" ] }, { @@ -102,7 +102,9 @@ { "cell_type": "code", "execution_count": 25, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "X = np.matrix([5,5]).transpose()\n", @@ -119,7 +121,9 @@ { "cell_type": "code", "execution_count": 30, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# ====================== YOUR CODE HERE ======================\n", diff --git a/Module 1/README.md b/Module 1/README.md new file mode 100644 index 0000000..b656cbe --- /dev/null +++ b/Module 1/README.md @@ -0,0 +1,8 @@ + +Module 1 - Anaconda Installation + +Anaconda is a python data science platform which helps you install and manage python packages on your systems. + +Downloading Anaconda will help save you the hassle of installing the libraries that this course requires manually, as it already includes most commonly used libraries. + +Download Link - https://www.anaconda.com/download diff --git a/Module 2/Linear Regression.ipynb b/Module 2/Linear Regression.ipynb index aa94276..4652c5d 100644 --- a/Module 2/Linear Regression.ipynb +++ b/Module 2/Linear Regression.ipynb @@ -115,6 +115,7 @@ "theta = np.zeros((2,1))\n", "theta = np.matrix(theta)\n", "X = np.matrix(X)\n", + "y=y_init\n", "X[0:5]" ] }, diff --git a/Module 2/README.md b/Module 2/README.md new file mode 100644 index 0000000..74a66c6 --- /dev/null +++ b/Module 2/README.md @@ -0,0 +1,4 @@ +Task 2 +1. Complete the implementation of linear regression. +2. Go through the first section of https://scikit-learn.org/stable/tutorial/index.html - Introduction to machine learining with scikit learn. +3. Refer to the blog (https://medium.com/deep-math-machine-learning-ai/chapter-1-complete-linear-regression-with-math-25b2639dde23?fbclid=IwAR1hyAw2RWw-eLcKrPKLDaVmfhXvDkY-u4hxk5tlBiqX9k4Au95yoJ9x4-w) for clarity on linear regression. diff --git a/Module 3/.ipynb_checkpoints/Logistic Regression-checkpoint.ipynb b/Module 3/.ipynb_checkpoints/Logistic Regression-checkpoint.ipynb new file mode 100644 index 0000000..d6fb70d --- /dev/null +++ b/Module 3/.ipynb_checkpoints/Logistic Regression-checkpoint.ipynb @@ -0,0 +1,438 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Logistic Regression" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.datasets import make_classification\n", + "%matplotlib inline\n", + "\n", + "import os" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reading Classification Data" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Exam 1Exam 2Admitted
00.5594262.3886940
11.312175-0.7173151
2-1.559849-1.9248740
3-2.281386-0.1368560
41.560704-0.4279581
\n", + "
" + ], + "text/plain": [ + " Exam 1 Exam 2 Admitted\n", + "0 0.559426 2.388694 0\n", + "1 1.312175 -0.717315 1\n", + "2 -1.559849 -1.924874 0\n", + "3 -2.281386 -0.136856 0\n", + "4 1.560704 -0.427958 1" + ] + }, + "execution_count": 153, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data=make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, random_state=42)\n", + "d = {'Exam 1': data[0][:,0], 'Exam 2': data[0][:,1], 'Admitted': data[1]}\n", + "data = pd.DataFrame(d)\n", + "data.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting the data" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0,0.5,'Exam 2 Score')" + ] + }, + "execution_count": 154, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtMAAAHjCAYAAADhZpMBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3X143HWd7//Xe6BSSQYV7HUWA1KW\nRtdyY5VwPHhyzCIsYstNGtaNuJd39Leoi6dpi8fW9fzU9XLFxT3G9OdRli03uy5bcoAk4EV3vUGE\nDct6TNmuAgVTd8vaDS6likyCyM28f3988u1MJjPJzGRmvnPzfFxXrm/m853MfGosfeWT9+f9MXcX\nAAAAgNIl4p4AAAAA0KgI0wAAAECZCNMAAABAmQjTAAAAQJkI0wAAAECZCNMAAABAmQjTAAAAQJkI\n0wAAAECZCNMAAABAmY6MewKlePWrX+0rV66MexoAAABocrt3737K3Vcs9ryGCtMrV67UxMRE3NMA\nAABAkzOzx4t5HmUeAAAAQJkI0wAAAECZCNMAAABAmRqqZjqfF154QQcOHNBzzz0X91Qwa/ny5Trh\nhBO0bNmyuKcCAABQVQ0fpg8cOKBkMqmVK1fKzOKeTstzdx06dEgHDhzQySefHPd0AAAAqqrhyzye\ne+45HXfccQTpOmFmOu644/hNAQAAaAkNH6YlEaTrDN8PAADQKpoiTAMAAABxaLkwnUpJO3ZIW7eG\naypVmdcdHR2VmenRRx/Ne/8DH/iAbrvttqJfb2pqSr/7u78rSdqzZ4927dp1+N73vvc9/cM//EPJ\nc1y5cqWeeuqpkr8OAAAA+bVUmB4flzo6pE2bpGuuCdeOjjC+VDt37lR3d7duueWWpb+YpNe85jWH\nw3elwjQAAAAqq2XCdColrV0brjMzYWxmJjM+PV3+a09PT+v+++/X9ddffzhMu7s++tGPavXq1Vq3\nbp2efPLJw89fuXKl/uiP/khnn322urq69OCDD+od73iHTjnlFF177bWSpP379+u0007T888/r099\n6lMaHh7WmjVr9Kd/+qe69tprNTg4qDVr1ujv//7vdfDgQV166aU666yzdNZZZ+n++++XJB06dEjn\nn3++3vSmN+lDH/qQ3L38PyQAAADmafjWeMUaHpbS6fz30ulwf8OG8l57bGxMF1xwgV73utfp2GOP\n1YMPPqj9+/frscce049+9CP9x3/8h1avXq3LL7/88NeceOKJeuCBB7R582Z94AMf0P3336/nnntO\np556qj784Q8fft7LXvYyffazn9XExIS+8pWvSJJ+9atfqb29XR/72MckSe95z3u0efNmdXd369/+\n7d/0jne8Q3v37tUf//Efq7u7W5/61Kd011136brrrivvDwgAAIC8WiZMT05mVqRzzcxI+/aV/9o7\nd+7Upk2bJEnvfve7tXPnTr3wwgu67LLLdMQRR+g1r3mN3v72t8/5mosvvliSdPrpp2t6elrJZFLJ\nZFLLly/X008/XdL7f+c739Ejjzxy+PEzzzyjVCql++67TyMjI5KkdevW6VWvelX5f0gAAADM0zJh\nurNTamvLH6jb2qRVq8p73UOHDum73/2uHnroIZmZXnrpJZmZ1q9fv2CLuKOOOkqSlEgkDn8ePX7x\nxRdLmkM6ndYDDzygl7/85fPu0aYOAACgelqmZrq/X0oU+NMmEuF+OW677Ta9733v0+OPP679+/fr\npz/9qU4++WQde+yxuuWWW/TSSy/piSee0D333FP23JPJpFJZbUdyH59//vmHS0CksGFRkt72trfp\n5ptvliT97d/+rX7xi1+UPQcAAADM1zJhOpmUdu0K17a2MNbWlhlvby/vdXfu3Kn169fPGbv00kv1\ns5/9TJ2dnTr99NP1kY98RD09PWXP/ZxzztEjjzyiNWvWaHh4WBdddJFGR0cPb0Dcvn27JiYmdMYZ\nZ2j16tWHNzF++tOf1n333ac3v/nN+ta3vqXXvva1Zc8BAAAA81kjdXjo6uryiYmJOWN79+7VG97w\nhqJfY3o6bDbcty+UdvT3lx+kUVip3xcAAIB6Yma73b1rsee1TM10pL29/K4dAIAG4i6NjUm9vVL2\n/pFC4wBQhpYp8wAAtJixMamvT9q8OQRoKVw3bw7jY2Pxzg9AU2i5lWkAQIvo7ZUGBqShofB4cDAE\n6aGhMN7bG+/8ADQFwjQAoDmZhQAthQAdheqBgTBOiQeACqDMAwDQvLIDdYQgDaCCCNMAgOYV1Uhn\ny66hBoAlap0w7S6Njs7/D2ih8RKYma666qrDj//sz/5Mn/nMZxb8mrGxsTlHgOfzxje+UZdddlnB\n+/v379dpp51W0lw/9alP6Tvf+Y4k6ctf/rKeffbZw/c+//nPl/RaknTTTTfpox/9aMlfBwBVFwXp\nqEY6nc7UUBOoAVRI64TpKu7qPuqoozQyMqKnnnqqhOksHKb37t2rdDqt++67TzP5zkAv02c/+1md\nd955kioTpgGgbo2NZYJ0VNoxOJgJ1HTzwBKkUtKOHdLWreGadTAxWkzrbECs4q7uI488UldccYUG\nBwf1J3/yJ3PuPf7447r88st18OBBrVixQjfeeKMOHDigO++8U/fee68+97nP6fbbb9cpp5wy5+v+\n5m/+Ru9973u1d+9e3XnnnYdXqHfv3q3LL79cRx99tLq7uw8//6abbtLY2JheeuklPfTQQ7rqqqv0\n/PPP6+tf/7qOOuoo7dq1S8cee6w+8IEP6MILL9TU1JSmpqZ0zjnn6NWvfrXe8pa36Fe/+pXWrFmj\nU089VTfffLP++q//Wtu3b9fzzz+vt7zlLfrqV7+qI444QjfeeKOuvvpqHX/88Xrd616no446quz/\n7QCganp7pZGRuf2ko0Dd00M3D5RtfFxauzb8smNmJpyovGVLOFE5659mtAp3b5iPM88803M98sgj\n88YKSqfdBwbcw5p0+BgYCONL0NbW5r/85S/9pJNO8qefftq/+MUv+qc//Wl3d7/wwgv9pptucnf3\n66+/3i+55BJ3d3//+9/vt956a8HX7Ozs9P379/s3v/lNv+iiiw6Pn3766f69733P3d0/9rGP+amn\nnuru7jfeeKOfcsop/swzz/iTTz7pxxxzjH/ta19zd/dNmzb54ODgvPc96aST/ODBg3P+HJFHHnnE\nL7zwQn/++efd3f0jH/mI/+Vf/qVPTU35iSee6E8++aT/+te/9re+9a1+5ZVXzpt/Sd8XAAAaxDPP\nuCeTc6NE9JFMuqdScc8QlSJpwovIp61T5iFVdVf3Mccco/e9733avn37nPEHHnhA73nPeyRJ733v\nezU+Pr7oa/3gBz/QihUrdNJJJ+ncc8/Vgw8+qF/84hf65S9/qaefflo9PT2HXy/bOeeco2QyqRUr\nVugVr3iFLrroIknS6aefrv3795f057n77ru1e/dunXXWWVqzZo3uvvtu/cu//Iu+//3v67d/+7e1\nYsUKvexlL1N/f39JrwsAQCMbHg4r0vmk0+F+s6K0Jb/WCtNV3tW9adMmXX/99QvWOFsRwX3nzp16\n9NFHtXLlSp1yyil65plndPvtt8vdF/z67HKLRCJx+HEikdCLL75Ywp8k/Mbi/e9/v/bs2aM9e/bo\n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\nNAAAAFCm/x8ubvnG1GDlzQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "positive = data[data['Admitted'].isin([1])]\n", + "negative = data[data['Admitted'].isin([0])]\n", + "\n", + "fig, ax = plt.subplots(figsize=(12,8))\n", + "ax.scatter(positive['Exam 1'], positive['Exam 2'], s=50, c='b', marker='o', label='Admitted')\n", + "ax.scatter(negative['Exam 1'], negative['Exam 2'], s=50, c='r', marker='x', label='Not Admitted')\n", + "ax.legend()\n", + "ax.set_xlabel('Exam 1 Score')\n", + "ax.set_ylabel('Exam 2 Score')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining the sigmoid function" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sigmoid(z):\n", + " # ====================== YOUR CODE HERE ======================\n", + " # Instructions: Compute the sigmoid of each value of z (z can be a matrix,\n", + " # vector or scalar). \n", + "\n", + " \n", + " # =============================================================\n", + " return sig" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Evalutating sigmoid(0) should give you exactly 0.5" + ] + }, + { + "cell_type": "code", + "execution_count": 156, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 156, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nkiQB8P8Al/eBSu2Vh88AAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "nums = np.arange(-10, 10, step=1)\n", + "\n", + "fig, ax = plt.subplots(figsize=(12,8))\n", + "ax.plot(nums, sigmoid(nums), 'r')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Computing the cost J(θ)" + ] + }, + { + "cell_type": "code", + "execution_count": 157, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def cost(theta, X, y):\n", + " theta = np.matrix(theta)\n", + " X = np.matrix(X)\n", + " y = np.matrix(y)\n", + " # ====================== YOUR CODE HERE ======================\n", + " # Instructions: Compute the cost of a particular choice of theta.\n", + " # You should set J to the cost.\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " # =============================================================\n", + " return J" + ] + }, + { + "cell_type": "code", + "execution_count": 158, + "metadata": {}, + "outputs": [], + "source": [ + "data.insert(0, 'Ones', 1)\n", + "\n", + "cols = data.shape[1]\n", + "X = data.iloc[:,0:cols-1]\n", + "y = data.iloc[:,cols-1:cols]\n", + "\n", + "X = np.array(X.values)\n", + "y = np.array(y.values)\n", + "theta = np.zeros(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.6931471805599453" + ] + }, + "execution_count": 160, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cost(theta, X, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Evaluating the cost should return 0.69314718055994529" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Computing the Gradient" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def gradient(theta, X, y):\n", + " theta = np.matrix(theta)\n", + " X = np.matrix(X)\n", + " y = np.matrix(y)\n", + " \n", + " # ====================== YOUR CODE HERE ======================\n", + " # Instructions: Compute the partial derivatives and set grad to the partial\n", + " # derivatives of the cost w.r.t. each parameter in theta\n", + " # \n", + " # Note: grad should have the same dimensions as theta\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " # =============================================================\n", + " return grad" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Learning parameters using Scipy" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/vrishank/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:10: RuntimeWarning: divide by zero encountered in log\n", + " # Remove the CWD from sys.path while we load stuff.\n", + "/Users/vrishank/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:10: RuntimeWarning: invalid value encountered in multiply\n", + " # Remove the CWD from sys.path while we load stuff.\n" + ] + }, + { + "data": { + "text/plain": [ + "0.024086758583295755" + ] + }, + "execution_count": 164, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import scipy.optimize as opt\n", + "result = opt.fmin_tnc(cost, x0=theta, fprime=gradient, args=(X, y))\n", + "cost(result[0], X, y)" + ] + }, + { + "cell_type": "code", + "execution_count": 165, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "accuracy = 99.000000\n" + ] + } + ], + "source": [ + "def predict(theta, X):\n", + " probability = sigmoid(X * theta.T)\n", + " return [1 if x >= 0.5 else 0 for x in probability]\n", + "\n", + "theta_min = np.matrix(result[0])\n", + "predictions = predict(theta_min, X)\n", + "correct = [1 if ((a == 1 and b == 1) or (a == 0 and b == 0)) else 0 for (a, b) in zip(predictions, y)]\n", + "accuracy = (sum(map(int, correct)) % len(correct))\n", + "print ('accuracy = %f' % (accuracy))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Final accuracy should be 99.00%" + ] + } + ], + "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.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Module 3/Logistic Regression using Scikit-Learn.ipynb b/Module 3/Logistic Regression using Scikit-Learn.ipynb new file mode 100644 index 0000000..0305ba6 --- /dev/null +++ b/Module 3/Logistic Regression using Scikit-Learn.ipynb @@ -0,0 +1,269 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Logistic Regression" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.datasets import make_classification\n", + "%matplotlib inline\n", + "\n", + "import os" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generating Classification Data" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Exam 1Exam 2Admitted
00.5594262.3886940
11.312175-0.7173151
2-1.559849-1.9248740
3-2.281386-0.1368560
41.560704-0.4279581
\n", + "
" + ], + "text/plain": [ + " Exam 1 Exam 2 Admitted\n", + "0 0.559426 2.388694 0\n", + "1 1.312175 -0.717315 1\n", + "2 -1.559849 -1.924874 0\n", + "3 -2.281386 -0.136856 0\n", + "4 1.560704 -0.427958 1" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data=make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, random_state=42)\n", + "d = {'Exam 1': data[0][:,0], 'Exam 2': data[0][:,1], 'Admitted': data[1]}\n", + "data = pd.DataFrame(d)\n", + "data.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting Data" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0,0.5,'Exam 2 Score')" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtMAAAHjCAYAAADhZpMBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3X143HWd7//Xe6BSSQYV7HUWA1KW\nRtdyY5VwPHhyzCIsYstNGtaNuJd39Leoi6dpi8fW9fzU9XLFxT3G9OdRli03uy5bcoAk4EV3vUGE\nDct6TNmuAgVTd8vaDS6likyCyM28f3988u1MJjPJzGRmvnPzfFxXrm/m853MfGosfeWT9+f9MXcX\nAAAAgNIl4p4AAAAA0KgI0wAAAECZCNMAAABAmQjTAAAAQJkI0wAAAECZCNMAAABAmQjTAAAAQJkI\n0wAAAECZCNMAAABAmY6MewKlePWrX+0rV66MexoAAABocrt3737K3Vcs9ryGCtMrV67UxMRE3NMA\nAABAkzOzx4t5HmUeAAAAQJkI0wAAAECZCNMAAABAmRqqZjqfF154QQcOHNBzzz0X91Qwa/ny5Trh\nhBO0bNmyuKcCAABQVQ0fpg8cOKBkMqmVK1fKzOKeTstzdx06dEgHDhzQySefHPd0AAAAqqrhyzye\ne+45HXfccQTpOmFmOu644/hNAQAAaAkNH6YlEaTrDN8PAADQKpoiTAMAAABxaLkwnUpJO3ZIW7eG\naypVmdcdHR2VmenRRx/Ne/8DH/iAbrvttqJfb2pqSr/7u78rSdqzZ4927dp1+N73vvc9/cM//EPJ\nc1y5cqWeeuqpkr8OAAAA+bVUmB4flzo6pE2bpGuuCdeOjjC+VDt37lR3d7duueWWpb+YpNe85jWH\nw3elwjQAAAAqq2XCdColrV0brjMzYWxmJjM+PV3+a09PT+v+++/X9ddffzhMu7s++tGPavXq1Vq3\nbp2efPLJw89fuXKl/uiP/khnn322urq69OCDD+od73iHTjnlFF177bWSpP379+u0007T888/r099\n6lMaHh7WmjVr9Kd/+qe69tprNTg4qDVr1ujv//7vdfDgQV166aU666yzdNZZZ+n++++XJB06dEjn\nn3++3vSmN+lDH/qQ3L38PyQAAADmafjWeMUaHpbS6fz30ulwf8OG8l57bGxMF1xwgV73utfp2GOP\n1YMPPqj9+/frscce049+9CP9x3/8h1avXq3LL7/88NeceOKJeuCBB7R582Z94AMf0P3336/nnntO\np556qj784Q8fft7LXvYyffazn9XExIS+8pWvSJJ+9atfqb29XR/72MckSe95z3u0efNmdXd369/+\n7d/0jne8Q3v37tUf//Efq7u7W5/61Kd011136brrrivvDwgAAIC8WiZMT05mVqRzzcxI+/aV/9o7\nd+7Upk2bJEnvfve7tXPnTr3wwgu67LLLdMQRR+g1r3mN3v72t8/5mosvvliSdPrpp2t6elrJZFLJ\nZFLLly/X008/XdL7f+c739Ejjzxy+PEzzzyjVCql++67TyMjI5KkdevW6VWvelX5f0gAAADM0zJh\nurNTamvLH6jb2qRVq8p73UOHDum73/2uHnroIZmZXnrpJZmZ1q9fv2CLuKOOOkqSlEgkDn8ePX7x\nxRdLmkM6ndYDDzygl7/85fPu0aYOAACgelqmZrq/X0oU+NMmEuF+OW677Ta9733v0+OPP679+/fr\npz/9qU4++WQde+yxuuWWW/TSSy/piSee0D333FP23JPJpFJZbUdyH59//vmHS0CksGFRkt72trfp\n5ptvliT97d/+rX7xi1+UPQcAAADM1zJhOpmUdu0K17a2MNbWlhlvby/vdXfu3Kn169fPGbv00kv1\ns5/9TJ2dnTr99NP1kY98RD09PWXP/ZxzztEjjzyiNWvWaHh4WBdddJFGR0cPb0Dcvn27JiYmdMYZ\nZ2j16tWHNzF++tOf1n333ac3v/nN+ta3vqXXvva1Zc8BAAAA81kjdXjo6uryiYmJOWN79+7VG97w\nhqJfY3o6bDbcty+UdvT3lx+kUVip3xcAAIB6Yma73b1rsee1TM10pL29/K4dAIAG4i6NjUm9vVL2\n/pFC4wBQhpYp8wAAtJixMamvT9q8OQRoKVw3bw7jY2Pxzg9AU2i5lWkAQIvo7ZUGBqShofB4cDAE\n6aGhMN7bG+/8ADQFwjQAoDmZhQAthQAdheqBgTBOiQeACqDMAwDQvLIDdYQgDaCCCNMAgOYV1Uhn\ny66hBoAlap0w7S6Njs7/D2ih8RKYma666qrDj//sz/5Mn/nMZxb8mrGxsTlHgOfzxje+UZdddlnB\n+/v379dpp51W0lw/9alP6Tvf+Y4k6ctf/rKeffbZw/c+//nPl/RaknTTTTfpox/9aMlfBwBVFwXp\nqEY6nc7UUBOoAVRI64TpKu7qPuqoozQyMqKnnnqqhOksHKb37t2rdDqt++67TzP5zkAv02c/+1md\nd955kioTpgGgbo2NZYJ0VNoxOJgJ1HTzwBKkUtKOHdLWreGadTAxWkzrbECs4q7uI488UldccYUG\nBwf1J3/yJ3PuPf7447r88st18OBBrVixQjfeeKMOHDigO++8U/fee68+97nP6fbbb9cpp5wy5+v+\n5m/+Ru9973u1d+9e3XnnnYdXqHfv3q3LL79cRx99tLq7uw8//6abbtLY2JheeuklPfTQQ7rqqqv0\n/PPP6+tf/7qOOuoo7dq1S8cee6w+8IEP6MILL9TU1JSmpqZ0zjnn6NWvfrXe8pa36Fe/+pXWrFmj\nU089VTfffLP++q//Wtu3b9fzzz+vt7zlLfrqV7+qI444QjfeeKOuvvpqHX/88Xrd616no446quz/\n7QCganp7pZGRuf2ko0Dd00M3D5RtfFxauzb8smNmJpyovGVLOFE5659mtAp3b5iPM88803M98sgj\n88YKSqfdBwbcw5p0+BgYCONL0NbW5r/85S/9pJNO8qefftq/+MUv+qc//Wl3d7/wwgv9pptucnf3\n66+/3i+55BJ3d3//+9/vt956a8HX7Ozs9P379/s3v/lNv+iiiw6Pn3766f69733P3d0/9rGP+amn\nnuru7jfeeKOfcsop/swzz/iTTz7pxxxzjH/ta19zd/dNmzb54ODgvPc96aST/ODBg3P+HJFHHnnE\nL7zwQn/++efd3f0jH/mI/+Vf/qVPTU35iSee6E8++aT/+te/9re+9a1+5ZVXzpt/Sd8XAAAaxDPP\nuCeTc6NE9JFMuqdScc8QlSJpwovIp61T5iFVdVf3Mccco/e9733avn37nPEHHnhA73nPeyRJ733v\nezU+Pr7oa/3gBz/QihUrdNJJJ+ncc8/Vgw8+qF/84hf65S9/qaefflo9PT2HXy/bOeeco2QyqRUr\nVugVr3iFLrroIknS6aefrv3795f057n77ru1e/dunXXWWVqzZo3uvvtu/cu//Iu+//3v67d/+7e1\nYsUKvexlL1N/f39JrwsAQCMbHg4r0vmk0+F+s6K0Jb/WCtNV3tW9adMmXX/99QvWOFsRwX3nzp16\n9NFHtXLlSp1yyil65plndPvtt8vdF/z67HKLRCJx+HEikdCLL75Ywp8k/Mbi/e9/v/bs2aM9e/bo\n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\nNAAAAFCm/x8ubvnG1GDlzQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "positive = data[data['Admitted'].isin([1])]\n", + "negative = data[data['Admitted'].isin([0])]\n", + "\n", + "fig, ax = plt.subplots(figsize=(12,8))\n", + "ax.scatter(positive['Exam 1'], positive['Exam 2'], s=50, c='b', marker='o', label='Admitted')\n", + "ax.scatter(negative['Exam 1'], negative['Exam 2'], s=50, c='r', marker='x', label='Not Admitted')\n", + "ax.legend()\n", + "ax.set_xlabel('Exam 1 Score')\n", + "ax.set_ylabel('Exam 2 Score')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reshaping Data" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "data.insert(0, 'Ones', 1)\n", + "\n", + "cols = data.shape[1]\n", + "X = data.iloc[:,0:cols-1]\n", + "y = data.iloc[:,cols-1:cols]\n", + "\n", + "X = np.array(X.values)\n", + "y = np.array(y.values)\n", + "theta = np.zeros(3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using Scikit-Learn" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.linear_model import LogisticRegression" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/vrishank/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py:578: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " y = column_or_1d(y, warn=True)\n" + ] + } + ], + "source": [ + "model = LogisticRegression()\n", + "model.fit(X, y)\n", + "predictions = model.predict(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "accuracy = 99.000000\n" + ] + } + ], + "source": [ + "correct = [1 if ((a == 1 and b == 1) or (a == 0 and b == 0)) else 0 for (a, b) in zip(predictions, y)]\n", + "accuracy = (sum(map(int, correct)) % len(correct))\n", + "print ('accuracy = %f' % (accuracy))" + ] + } + ], + "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.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Module 3/Logistic Regression.ipynb b/Module 3/Logistic Regression.ipynb index 0d0275d..d6fb70d 100644 --- a/Module 3/Logistic Regression.ipynb +++ b/Module 3/Logistic Regression.ipynb @@ -9,36 +9,113 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 137, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "import pandas as pd\n", "import numpy as np\n", + "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from sklearn.datasets import make_classification\n", + "%matplotlib inline\n", "\n", - "%matplotlib inline" + "import os" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Generate Dummy Classification Data" + "## Reading Classification Data" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 153, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Exam 1Exam 2Admitted
00.5594262.3886940
11.312175-0.7173151
2-1.559849-1.9248740
3-2.281386-0.1368560
41.560704-0.4279581
\n", + "
" + ], + "text/plain": [ + " Exam 1 Exam 2 Admitted\n", + "0 0.559426 2.388694 0\n", + "1 1.312175 -0.717315 1\n", + "2 -1.559849 -1.924874 0\n", + "3 -2.281386 -0.136856 0\n", + "4 1.560704 -0.427958 1" + ] + }, + "execution_count": 153, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "dataset = make_classification(n_classes=2, n_samples=100, n_features=2, random_state=42, n_informative=2, n_redundant=0, n_repeated=0, n_clusters_per_class=1)\n", - "X_init = dataset[0]\n", - "y_init = dataset[1]" + "data=make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, random_state=42)\n", + "d = {'Exam 1': data[0][:,0], 'Exam 2': data[0][:,1], 'Admitted': data[1]}\n", + "data = pd.DataFrame(d)\n", + "data.head()" ] }, { @@ -50,45 +127,24 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 154, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "matrix([[ 1. , 1.22831184, -0.75717844],\n", - " [ 1. , 0.69840909, -1.38029525],\n", - " [ 1. , 2.54881729, 2.50225822],\n", - " [ 1. , 0.57357881, -1.35297943],\n", - " [ 1. , 0.58590018, -1.33745666]])" + "Text(0,0.5,'Exam 2 Score')" ] }, - "execution_count": 38, + "execution_count": 154, "metadata": {}, "output_type": "execute_result" - } - ], - "source": [ - "X_0 = X_init[:,0]\n", - "X_1 = X_init[:,1]\n", - "\n", - "X = np.concatenate((np.ones((100,1)), X_init), axis=1)\n", - "theta = np.zeros((3,1))\n", - "theta = np.matrix(theta)\n", - "X = np.matrix(X)\n", - "X[0:5]" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ + }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtMAAAHjCAYAAADhZpMBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3X143HWd7//Xe6BSSQYV7HUWA1KW\nRtdyY5VwPHhyzCIsYstNGtaNuJd39Leoi6dpi8fW9fzU9XLFxT3G9OdRli03uy5bcoAk4EV3vUGE\nDct6TNmuAgVTd8vaDS6likyCyM28f3988u1MJjPJzGRmvnPzfFxXrm/m853MfGosfeWT9+f9MXcX\nAAAAgNIl4p4AAAAA0KgI0wAAAECZCNMAAABAmQjTAAAAQJkI0wAAAECZCNMAAABAmQjTAAAAQJkI\n0wAAAECZCNMAAABAmY6MewKlePWrX+0rV66MexoAAABocrt3737K3Vcs9ryGCtMrV67UxMRE3NMA\nAABAkzOzx4t5HmUeAAAAQJkI0wAAAECZCNMAAABAmRqqZjqfF154QQcOHNBzzz0X91Qwa/ny5Trh\nhBO0bNmyuKcCAABQVQ0fpg8cOKBkMqmVK1fKzOKeTstzdx06dEgHDhzQySefHPd0AAAAqqrhyzye\ne+45HXfccQTpOmFmOu644/hNAQAAaAkNH6YlEaTrDN8PAADQKpoiTAMAAABxaLkwnUpJO3ZIW7eG\naypVmdcdHR2VmenRRx/Ne/8DH/iAbrvttqJfb2pqSr/7u78rSdqzZ4927dp1+N73vvc9/cM//EPJ\nc1y5cqWeeuqpkr8OAAAA+bVUmB4flzo6pE2bpGuuCdeOjjC+VDt37lR3d7duueWWpb+YpNe85jWH\nw3elwjQAAAAqq2XCdColrV0brjMzYWxmJjM+PV3+a09PT+v+++/X9ddffzhMu7s++tGPavXq1Vq3\nbp2efPLJw89fuXKl/uiP/khnn322urq69OCDD+od73iHTjnlFF177bWSpP379+u0007T888/r099\n6lMaHh7WmjVr9Kd/+qe69tprNTg4qDVr1ujv//7vdfDgQV166aU666yzdNZZZ+n++++XJB06dEjn\nn3++3vSmN+lDH/qQ3L38PyQAAADmafjWeMUaHpbS6fz30ulwf8OG8l57bGxMF1xwgV73utfp2GOP\n1YMPPqj9+/frscce049+9CP9x3/8h1avXq3LL7/88NeceOKJeuCBB7R582Z94AMf0P3336/nnntO\np556qj784Q8fft7LXvYyffazn9XExIS+8pWvSJJ+9atfqb29XR/72MckSe95z3u0efNmdXd369/+\n7d/0jne8Q3v37tUf//Efq7u7W5/61Kd011136brrrivvDwgAAIC8WiZMT05mVqRzzcxI+/aV/9o7\nd+7Upk2bJEnvfve7tXPnTr3wwgu67LLLdMQRR+g1r3mN3v72t8/5mosvvliSdPrpp2t6elrJZFLJ\nZFLLly/X008/XdL7f+c739Ejjzxy+PEzzzyjVCql++67TyMjI5KkdevW6VWvelX5f0gAAADM0zJh\nurNTamvLH6jb2qRVq8p73UOHDum73/2uHnroIZmZXnrpJZmZ1q9fv2CLuKOOOkqSlEgkDn8ePX7x\nxRdLmkM6ndYDDzygl7/85fPu0aYOAACgelqmZrq/X0oU+NMmEuF+OW677Ta9733v0+OPP679+/fr\npz/9qU4++WQde+yxuuWWW/TSSy/piSee0D333FP23JPJpFJZbUdyH59//vmHS0CksGFRkt72trfp\n5ptvliT97d/+rX7xi1+UPQcAAADM1zJhOpmUdu0K17a2MNbWlhlvby/vdXfu3Kn169fPGbv00kv1\ns5/9TJ2dnTr99NP1kY98RD09PWXP/ZxzztEjjzyiNWvWaHh4WBdddJFGR0cPb0Dcvn27JiYmdMYZ\nZ2j16tWHNzF++tOf1n333ac3v/nN+ta3vqXXvva1Zc8BAAAA81kjdXjo6uryiYmJOWN79+7VG97w\nhqJfY3o6bDbcty+UdvT3lx+kUVip3xcAAIB6Yma73b1rsee1TM10pL29/K4dAIAG4i6NjUm9vVL2\n/pFC4wBQhpYp8wAAtJixMamvT9q8OQRoKVw3bw7jY2Pxzg9AU2i5lWkAQIvo7ZUGBqShofB4cDAE\n6aGhMN7bG+/8ADQFwjQAoDmZhQAthQAdheqBgTBOiQeACqDMAwDQvLIDdYQgDaCCCNMAgOYV1Uhn\ny66hBoAlap0w7S6Njs7/D2ih8RKYma666qrDj//sz/5Mn/nMZxb8mrGxsTlHgOfzxje+UZdddlnB\n+/v379dpp51W0lw/9alP6Tvf+Y4k6ctf/rKeffbZw/c+//nPl/RaknTTTTfpox/9aMlfBwBVFwXp\nqEY6nc7UUBOoAVRI64TpKu7qPuqoozQyMqKnnnqqhOksHKb37t2rdDqt++67TzP5zkAv02c/+1md\nd955kioTpgGgbo2NZYJ0VNoxOJgJ1HTzwBKkUtKOHdLWreGadTAxWkzrbECs4q7uI488UldccYUG\nBwf1J3/yJ3PuPf7447r88st18OBBrVixQjfeeKMOHDigO++8U/fee68+97nP6fbbb9cpp5wy5+v+\n5m/+Ru9973u1d+9e3XnnnYdXqHfv3q3LL79cRx99tLq7uw8//6abbtLY2JheeuklPfTQQ7rqqqv0\n/PPP6+tf/7qOOuoo7dq1S8cee6w+8IEP6MILL9TU1JSmpqZ0zjnn6NWvfrXe8pa36Fe/+pXWrFmj\nU089VTfffLP++q//Wtu3b9fzzz+vt7zlLfrqV7+qI444QjfeeKOuvvpqHX/88Xrd616no446quz/\n7QCganp7pZGRuf2ko0Dd00M3D5RtfFxauzb8smNmJpyovGVLOFE5659mtAp3b5iPM88803M98sgj\n88YKSqfdBwbcw5p0+BgYCONL0NbW5r/85S/9pJNO8qefftq/+MUv+qc//Wl3d7/wwgv9pptucnf3\n66+/3i+55BJ3d3//+9/vt956a8HX7Ozs9P379/s3v/lNv+iiiw6Pn3766f69733P3d0/9rGP+amn\nnuru7jfeeKOfcsop/swzz/iTTz7pxxxzjH/ta19zd/dNmzb54ODgvPc96aST/ODBg3P+HJFHHnnE\nL7zwQn/++efd3f0jH/mI/+Vf/qVPTU35iSee6E8++aT/+te/9re+9a1+5ZVXzpt/Sd8XAAAaxDPP\nuCeTc6NE9JFMuqdScc8QlSJpwovIp61T5iFVdVf3Mccco/e9733avn37nPEHHnhA73nPeyRJ733v\nezU+Pr7oa/3gBz/QihUrdNJJJ+ncc8/Vgw8+qF/84hf65S9/qaefflo9PT2HXy/bOeeco2QyqRUr\nVugVr3iFLrroIknS6aefrv3795f057n77ru1e/dunXXWWVqzZo3uvvtu/cu//Iu+//3v67d/+7e1\nYsUKvexlL1N/f39JrwsAQCMbHg4r0vmk0+F+s6K0Jb/WCtNV3tW9adMmXX/99QvWOFsRwX3nzp16\n9NFHtXLlSp1yyil65plndPvtt8vdF/z67HKLRCJx+HEikdCLL75Ywp8k/Mbi/e9/v/bs2aM9e/bo\n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\nNAAAAFCm/x8ubvnG1GDlzQAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -96,8 +152,15 @@ } ], "source": [ - "plt.scatter(x=X_0, y=X_1)\n", - "plt.show()" + "positive = data[data['Admitted'].isin([1])]\n", + "negative = data[data['Admitted'].isin([0])]\n", + "\n", + "fig, ax = plt.subplots(figsize=(12,8))\n", + "ax.scatter(positive['Exam 1'], positive['Exam 2'], s=50, c='b', marker='o', label='Admitted')\n", + "ax.scatter(negative['Exam 1'], negative['Exam 2'], s=50, c='r', marker='x', label='Not Admitted')\n", + "ax.legend()\n", + "ax.set_xlabel('Exam 1 Score')\n", + "ax.set_ylabel('Exam 2 Score')" ] }, { @@ -109,25 +172,20 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 155, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def sigmoid(z):\n", - " g = np.matrix(np.zeros(np.matrix(z).shape))\n", - " \n", " # ====================== YOUR CODE HERE ======================\n", " # Instructions: Compute the sigmoid of each value of z (z can be a matrix,\n", - " # vector or scalar).\n", - " \n", - " \n", - " \n", - " \n", + " # vector or scalar). \n", + "\n", " \n", " # =============================================================\n", - " return g" + " return sig" ] }, { @@ -139,19 +197,35 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 156, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[0.]]\n" - ] + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 156, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsYAAAHVCAYAAADywj0dAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3Xmc1XXd///Hi1VN3HEFFbdMW9RI\nK70ylxTJUHEBLH9eZZeXmfWrq8Ul43IpTb2y1Vzy0go9A4obKZhp5k6J5oZGIoWiXoqigin7+/vH\nZ4hhmGEOzJl5n+Vxv93Obc7ymZkn53bmzJP3vD6fT6SUkCRJkhpdj9wBJEmSpGpgMZYkSZKwGEuS\nJEmAxViSJEkCLMaSJEkSYDGWJEmSAIuxJEmSBFiMJUmSJMBiLEmSJAHQK9c33mSTTdK2226b69tL\nkiSpQTzyyCOvpZT6d7RdtmK87bbbMmXKlFzfXpIkSQ0iImaWs52jFJIkSRIWY0mSJAmwGEuSJEmA\nxViSJEkCLMaSJEkSYDGWJEmSAIuxJEmSBFiMJUmSJMBiLEmSJAEWY0mSJAmwGEuSJEmAxViSJEkC\nLMaSJEkSYDGWJEmSgDKKcURcFRGvRsRT7TweEfHTiJgeEU9ExB6VjylJkiR1rXJWjH8FDFnF44cA\nOzZfTgQu7XwsSZIkqXv16miDlNK9EbHtKjY5DPhNSikBkyNig4jYIqX0coUySpIkqSultPxjV17f\ncMOu/Xd0UofFuAxbAS+0uD2r+T6LsSRJymvpUnj7bZg3D955BxYtavuyeHH7j63qsjqft2RJkafl\nJaWV71vV/WvyOS3vb6usdpcePYrnoIpVohhHG/e1+UxHxIkU4xZsvfXWFfjWkiSp7ixZUhTZefNg\n7tw1u77s49tvd13O3r1X79KzJ/TpUxTEHj0gYvn1lpfVvb/cz4lYfoHuv96j+o/5UIliPAsY2OL2\nAOCltjZMKV0BXAEwePDgbv5viiRJ6lZLl8KLL8L06fDcc/Dyy+WV23feKe/r9+kD/frBeusVH/v1\ng/79YbvtVr6/Xz9YZ53ic5YV1V69Vr/ctiy5qjuVKMYTgFMiYiywF/CW88WSJDWIRYvg+eeL8rus\nAC+7PmMGLFiw4vZrr71yad1yS3jve1e+v3WxbX27b988/2bVrQ6LcUQ0AZ8ENomIWcB/A70BUkqX\nAROBocB04B3g810VVpIkZTB/flFyW5beZdf/8Y8V50bXWQd22AF23hkOPbS4vv32xccttyxWW6Uq\nVc5RKUZ18HgCvlyxRJIkqfvNm7e87LYuwLNmrbij1gYbFEX3Ix+BkSOL68sK8OabL58rlWpMJUYp\nJElSLZgzZ3nhbV2AX311xW033bQou/vtt3zFd9llo43y5Je6mMVYkqR69ve/wzXXFJe//W3FxwYO\nLErvsGErjjxsv30xwys1GIuxJEn15o034PrrYcwYuP/+4r5PfhJOPBF22qkovoMGFTvCSfoXi7Ek\nSfVg4UKYNKkow7/9bXH7fe+D886Dz34WPH+A1CGLsSRJtSol+NOfijI8bhy8/noxG/ylL8Fxx8Ee\ne7gjnLQaLMaSJNWaGTOWzw0/+yystRYcfnhRhg86qDhxhaTV5k+OJEm14I034LrritXhBx4oVoI/\n+Uk4/XQ48sji5BeSOsViLElStVq4ECZOLMrwrbcWt3fZBc4/v5gbHjgwd0KprliMJUmqJinB5MnL\n54bnzCnmhk8+uRiV2H1354alLmIxliSpGjz33PK54enTi0OpLZsb/tSnnBuWuoE/ZZIk5bJsbvg3\nv4EHHyxWgvfbD77zHRg+3LlhqZtZjCVJ6k4LFhRzw9dcs3xueNdd4Qc/gGOPdW5YyshiLElSd3j6\nafj5z5fPDW+2GXz5y8WoxG67OTcsVQGLsSRJXe3WW2HEiGLHuiOOKMrwgQc6NyxVGX8iJUnqSr/8\nJZx0UnE0iVtvhc03z51IUjt65A4gSVJdSglGj4YTT4SDD4Y//tFSLFU5V4wlSaq0RYuKQvyrX8EX\nvgCXXQa9e+dOJakDrhhLklRJ8+bBZz5TlOKzzoIrr7QUSzXCFWNJkirl//4PPv1pePzxohCfcELu\nRJJWg8VYkqRKmDYNhgyBV1+FCRNg6NDciSStJouxJEmd9cADMGxYcfi1e+6BwYNzJ5K0BpwxliSp\nM266qTgm8cYbw0MPWYqlGmYxliRpTf3853DkkcWZ6x58ELbbLnciSZ1gMZYkaXUtXQqnngpf+Uox\nQnHXXbDJJrlTSeokZ4wlSVodCxYUxyYuleBLX4Kf/Qx69sydSlIFWIwlSSrXW2/BEUfA3XfD+ecX\nq8YRuVNJqhCLsSRJ5Zg1qzgE2zPPwG9+A8cdlzuRpAqzGEuS1JGnnoJDDilWjCdNKo5CIanuuPOd\nJEmr8sc/wj77wJIlcO+9lmKpjlmMJUlqz9ixcPDBsOWWMHlycVg2SXXLYixJUmspwQ9/CKNGwV57\nFWe223rr3KkkdTGLsSRJLS1ZAl//Onzzm3D00XDHHbDhhrlTSeoG7nwnSdIy8+fD5z4HN9wAX/ta\nsWrcwzUkqVFYjCVJApgzBw47DO6/Hy6+uFg1ltRQLMaSJM2cWRyO7bnnYNw4OOaY3IkkZWAxliQ1\ntsceK0rx/PnFPPG+++ZOJCkTB6ckSY3r97+Hf/s36NWrGKGwFEsNzWIsSWpMv/lNcYrnQYOKYxTv\numvuRJIysxhLkhpLSnDeeXD88fCJT8B998FWW+VOJakKOGMsSWocixfDV74Cl10Gxx4LV18Nffrk\nTiWpSrhiLElqDO+8A8OHF6X41FNhzBhLsaQVuGIsSap/KRVnsZs0CX7+c/jyl3MnklSFLMaSpPp3\nxx0wcSL8z/9YiiW1y1EKSVJ9W7q0GJ0YNKiYL5akdrhiLEmqb6USPP548dGZYkmr4IqxJKl+zZ8P\nZ54Je+wBI0bkTiOpyrliLEmqX5deCjNnwpVXQg/XgiStmu8SkqT69Oab8L3vwUEHwYEH5k4jqQZY\njCVJ9enCC2HOHLjggtxJJNUIi7Ekqf68+CL8+Mfw2c/CbrvlTiOpRliMJUn156yzYMmSYpRCkspk\nMZYk1Zenn4arroKTT4Ztt82dRlINsRhLkurLGWfAuuvCd76TO4mkGmMxliTVjwcegFtuKc50t8km\nudNIqjEWY0lSfUgJvv1t2GIL+NrXcqeRVIM8wYckqT7ccgs8+CBccQWss07uNJJqkCvGkqTat3gx\nnH467LwzfP7zudNIqlGuGEuSat/VV8Nf/wo33QS9/NUmac24YixJqm3//Cf893/Dxz8Ohx2WO42k\nGuZ/qyVJte0nP4GXX4brr4eI3Gkk1TBXjCVJteu11+CCC4qV4r33zp1GUo2zGEuSatf3vw9vvw3n\nnZc7iaQ6YDGWJNWmv/8dLrkEvvAF2GWX3Gkk1QGLsSSpNn33u8URKM46K3cSSXXCYixJqj1/+Qtc\ne21xhruttsqdRlKdsBhLkmrPaafBRhsVp4CWpArxcG2SpNpy551wxx1w8cWwwQa500iqI64YS5Jq\nx9KlcOqpsM02cPLJudNIqjOuGEuSase4cfDoozBmDPTtmzuNpDrjirEkqTYsXAjf+Q586ENw7LG5\n00iqQ64YS5Jqw2WXFccuvv126OG6jqTKK+udJSKGRMS0iJgeEae18fjWEXF3RPwlIp6IiKGVjypJ\nalhz58K558L++8NBB+VOI6lOdViMI6IncAlwCLALMCoiWp9i6EzgupTS7sBI4BeVDipJamAXXQSv\nvQYXXAARudNIqlPlrBjvCUxPKc1IKS0ExgKHtdomAes1X18feKlyESVJDe3ll4tDs40YAYMH504j\nqY6VU4y3Al5ocXtW830tnQV8LiJmAROBr7T1hSLixIiYEhFTZs+evQZxJUkN5+yzYdEi+P73cyeR\nVOfKKcZt/c0qtbo9CvhVSmkAMBQYExErfe2U0hUppcEppcH9+/df/bSSpMYybRpceSWcdBJsv33u\nNJLqXDnFeBYwsMXtAaw8KnECcB1ASukhYC1gk0oElCQ1sDPOgLXXhjPPzJ1EUgMopxg/DOwYEYMi\nog/FznUTWm3zPHAAQES8j6IYOyshSVpzkyfDjTfCt78Nm26aO42kBtBhMU4pLQZOAX4HPENx9Imp\nEXFORAxr3uwbwH9ExONAE/DvKaXW4xaSJJUnpaIQb7YZfP3rudNIahBlneAjpTSRYqe6lveNbnH9\naWDvykaTJDWs226D++6DSy+FddfNnUZSg/DUQZKk6rJkCZx2Guy0E5xwQu40khqIp4SWJFWXX/8a\npk6F8eOhd+/caSQ1EFeMJUnV4913YfRo2GsvGD48dxpJDcYVY0lS9fjpT+HFF+Haaz31s6Ru54qx\nJKk6zJkD558Pn/407Ltv7jSSGpDFWJJUHc47D+bOhR/8IHcSSQ3KYixJym/mTPjZz+D44+H978+d\nRlKDshhLkvIbPbqYKT7nnNxJJDUwi7EkKa8nnoAxY+CrX4WBA3OnkdTALMaSpLxOOw3WXx9OPz13\nEkkNzsO1SZLyuftumDQJLrwQNtwwdxpJDc4VY0lSHinBqacW4xNf+UruNJLkirEkKZPx4+Hhh+Hq\nq2GttXKnkSRXjCVJGSxaBGecURya7bjjcqeRJMAVY0lSDr/8JUyfDrfeCj175k4jSYArxpKk7jZv\nHpx9dnHa56FDc6eRpH9xxViS1L0uvhhefRUmTChO6iFJVcIVY0lS93nlFbjoIjjqKNhrr9xpJGkF\nFmNJUvc591yYPx++//3cSSRpJRZjSVL3ePZZuPxyOPFE2Gmn3GkkaSUWY0lS9xg9Gvr2LT5KUhWy\nGEuSut6cOXDDDcVq8eab504jSW2yGEuSut4NNxQn9fjc53InkaR2WYwlSV2vVIL3vhd23z13Eklq\nl8VYktS1XnwR7rkHjj3W4xZLqmoWY0lS1xo3DlKCUaNyJ5GkVbIYS5K6VqkEH/kI7Lhj7iSStEoW\nY0lS15k2DR55xNViSTXBYixJ6jpNTcVc8YgRuZNIUocsxpKkrpFSMUax336w5Za500hShyzGkqSu\n8eijxWmgjz02dxJJKovFWJLUNUol6N0bhg/PnUSSymIxliRV3pIlMHYsDB0KG26YO40klcViLEmq\nvHvvhZdecoxCUk2xGEuSKq+pCdZdFw49NHcSSSqbxViSVFkLFsD48XD44bDOOrnTSFLZLMaSpMr6\n3e/gjTcco5BUcyzGkqTKKpVgk03gwANzJ5Gk1WIxliRVzttvw4QJcMwxxaHaJKmGWIwlSZVzyy3w\n7ruOUUiqSRZjSVLllEqw9dbwsY/lTiJJq81iLEmqjNmzix3vRo2CHv56kVR7fOeSJFXG+PHFGe8c\no5BUoyzGkqTKaGqCXXeFD3wgdxJJWiMWY0lS5z3/PNx3XzFGEZE7jSStEYuxJKnzxo4tPo4alTeH\nJHWCxViS1HmlEnz0o7DddrmTSNIasxhLkjrn6afh8cfd6U5SzbMYS5I6p6mpODzbMcfkTiJJnWIx\nliStuZSKMYoDDoDNNsudRpI6xWIsSVpzf/4zzJjhGIWkumAxliStuVIJ+vaFI47InUSSOs1iLEla\nM0uWwLhxcOihsP76udNIUqdZjCVJa+buu+GVVzx2saS6YTGWJK2ZUgnWWw+GDs2dRJIqwmIsSVp9\n8+fDDTfA8OGw9tq500hSRViMJUmrb9IkmDvXo1FIqisWY0nS6iuVYNNNYb/9cieRpIqxGEuSVs/c\nufDb38KIEdCrV+40klQxFmNJ0uq56SZYsMAxCkl1x2IsSVo9pRIMGgR77ZU7iSRVlMVYklS+V16B\nu+4qVosjcqeRpIqyGEuSynf99cUZ7zyph6Q6ZDGWJJWvVIIPfhB23TV3EkmqOIuxJKk8f/87PPSQ\nO91JqlsWY0lSecaOLT6OHJk3hyR1EYuxJKk8pRLsvTdss03uJJLUJSzGkqSOPfkkPPWUYxSS6prF\nWJLUsVIJevaEo4/OnUSSuozFWJK0ailBUxMcdBD07587jSR1mbKKcUQMiYhpETE9Ik5rZ5tjIuLp\niJgaEaXKxpQkZfPQQzBzpmMUkuper442iIiewCXAp4BZwMMRMSGl9HSLbXYETgf2Tim9ERGbdlVg\nSVI3K5VgrbXgsMNyJ5GkLlXOivGewPSU0oyU0kJgLND63fE/gEtSSm8ApJRerWxMSVIWixbBddfB\nsGHQr1/uNJLUpcopxlsBL7S4Pav5vpZ2AnaKiAciYnJEDGnrC0XEiRExJSKmzJ49e80SS5K6z113\nwezZjlFIagjlFONo477U6nYvYEfgk8Ao4MqI2GClT0rpipTS4JTS4P7uwCFJ1a+pCTbYAIa0ud4h\nSXWlnGI8CxjY4vYA4KU2trklpbQopfR3YBpFUZYk1ap334Ubb4Qjj4S+fXOnkaQuV04xfhjYMSIG\nRUQfYCQwodU2NwP7AUTEJhSjFTMqGVSS1M1uvRXeftsxCkkNo8NinFJaDJwC/A54BrgupTQ1Is6J\niGHNm/0OeD0ingbuBr6VUnq9q0JLkrpBqQRbbAH77ps7iSR1iw4P1waQUpoITGx13+gW1xPwX80X\nSVKte/NNmDgRvvzl4ox3ktQAPPOdJGllN94ICxfCqFG5k0hSt7EYS5JWVirBDjvA4MG5k0hSt7EY\nS5JW9PLL8Ic/FDvdRVtH7JSk+mQxliStaNw4SMkxCkkNx2IsSVpRUxPssQfsvHPuJJLUrSzGkqTl\npk+HP//Z1WJJDcliLElarqmpmCseOTJ3EknqdhZjSVIhpeJoFJ/4BAwYkDuNJHU7i7EkqfD44/DX\nv3oKaEkNy2IsSSqUStCrFxx5ZO4kkpSFxViSBEuXFvPFQ4bAxhvnTiNJWViMJUlw//0wa5ZjFJIa\nmsVYklSsFq+zDgwbljuJJGVjMZakRrdwIVx3HRx+OLznPbnTSFI2FmNJanS//z3MmeNJPSQ1PIux\nJDW6Ugk22ggOOih3EknKymIsSY3sn/+Em2+Go4+GPn1yp5GkrCzGktTIfvtbeOcdj0YhSViMJamx\nlUrF6Z/32Sd3EknKzmIsSY3q9ddh0iQYORJ6+OtAknwnlKRGdcMNsHixYxSS1MxiLEmNqqkJdt4Z\ndtstdxJJqgoWY0lqRLNmwT33FMcujsidRpKqgsVYkhrRuHGQkif1kKQWLMaS1IhKJfjIR2DHHXMn\nkaSqYTGWpEYzbRo8+qg73UlSKxZjSWo0TU3FXPGIEbmTSFJVsRhLUiNJqRij2G8/2GKL3GkkqapY\njCWpkTzyCDz7rGMUktQGi7EkNZJSCfr0geHDcyeRpKpjMZakRrFkSXGYtqFDYcMNc6eRpKpjMZak\nRnHvvfDSSx67WJLaYTGWpEZRKsG668Khh+ZOIklVyWIsSY1gwQIYPx4OPxzWWSd3GkmqShZjSWoE\nt98Ob74Jn/1s7iSSVLUsxpLUCJqaoH9/OOCA3EkkqWpZjCWp3s2bBxMmwNFHQ+/eudNIUtWyGEtS\nvbvlFnj3XU/qIUkdsBhLUr0rlWCbbeBjH8udRJKqmsVYkurZ7Nlwxx3FsYt7+JYvSaviu6Qk1bPx\n44sz3nlSD0nqkMVYkupZqQS77gof+EDuJJJU9SzGklSvnn8e7r+/2OkuIncaSap6FmNJqldjxxYf\nHaOQpLJYjCWpXpVK8NGPwqBBuZNIUk2wGEtSPZo6FR5/3GMXS9JqsBhLUj1qaioOz3bMMbmTSFLN\nsBhLUr1JqSjGBx4Im22WO40k1QyLsSTVmz//GWbMcIxCklaTxViS6k2pBH37whFH5E4iSTXFYixJ\n9WTxYhg3Dg49FNZbL3caSaopFmNJqid33w2vvOIYhSStAYuxJNWTpqZipXjo0NxJJKnmWIwlqV7M\nnw833ADDh8Naa+VOI0k1x2IsSfVi4kSYO9cxCklaQxZjSaoXpVJx3OL99sudRJJqksVYkurBW2/B\nrbfCiBHQq1fuNJJUkyzGklQPbr4ZFixwjEKSOsFiLEn1oFSC7baDPffMnUSSapbFWJJq3SuvwJ13\nwqhREJE7jSTVLIuxJNW6666DpUsdo5CkTrIYS1Kta2qCD30IdtkldxJJqmkWY0mqZTNmwEMPFWMU\nkqROsRhLUi0bO7b4OHJk3hySVAcsxpJUq1KCa6+FffaBbbbJnUaSap7FWJJq1ZNPwtNPu9OdJFWI\nxViSalVTE/TsCUcdlTuJJNUFi7Ek1aKlS4tifNBB0L9/7jSSVBcsxpJUix56CGbOdIxCkirIYixJ\ntahUgrXXhsMOy51EkupGWcU4IoZExLSImB4Rp61iu6MiIkXE4MpFlCStYNEiuP56GDYM+vXLnUaS\n6kaHxTgiegKXAIcAuwCjImKl0ytFRD/gq8CfKh1SktTCXXfB7Nme1EOSKqycFeM9gekppRkppYXA\nWKCtv92dC1wIzK9gPklSa6USbLABDBmSO4kk1ZVyivFWwAstbs9qvu9fImJ3YGBK6dZVfaGIODEi\npkTElNmzZ692WElqeO+8AzfdVByirW/f3Gkkqa6UU4yjjfvSvx6M6AH8CPhGR18opXRFSmlwSmlw\nfw8vJEmr79Zb4e23PRqFJHWBcorxLGBgi9sDgJda3O4HvB/4Y0T8A/goMMEd8CSpCzQ1wRZbwCc+\nkTuJJNWdcorxw8COETEoIvoAI4EJyx5MKb2VUtokpbRtSmlbYDIwLKU0pUsSS1KjeuMNmDgRRo4s\nzngnSaqoDotxSmkxcArwO+AZ4LqU0tSIOCcihnV1QElSsxtvhIULHaOQpC4SKaWOt+oCgwcPTlOm\nuKgsSWU74AB44QWYNg2ird0/JEltiYhHUkodjvl65jtJqgUvvwx3312sFluKJalLWIwlqRaMGwcp\neVIPSepCFmNJqgWlEuyxB7z3vbmTSFLdshhLUrV79ll4+GF3upOkLmYxlqRq19RUzBWPGJE7iSTV\nNYuxJFWzlIoxik98AgYMyJ1GkuqaxViSqtljjxWHZ3OMQpK6nMVYkqpZqQS9e8ORR+ZOIkl1z2Is\nSdVq6VIYOxaGDIGNN86dRpLqnsVYkqrV/ffDrFmOUUhSN7EYS1K1KpVgnXXgM5/JnUSSGoLFWJKq\n0cKFcP31cPjh8J735E4jSQ3BYixJ1eiOO2DOHMcoJKkbWYwlqRqVSsUOdwcdlDuJJDUMi7EkVZt/\n/hNuuQWOOqo4VJskqVtYjCWp2kyYAO+84xiFJHUzi7EkVZtSqTj98z775E4iSQ3FYixJ1eT11+H2\n22HUKOjhW7QkdSffdSWpmtxwAyxeXBRjSVK3shhLUjUplWDnnWG33XInkaSGYzGWpGrxwgtw773F\nTncRudNIUsOxGEtStRg3DlJyjEKSMrEYS1K1KJVgzz1hhx1yJ5GkhmQxlqRq8Ne/wl/+4mqxJGVk\nMZakatDUVMwVjxiRO4kkNSyLsSTlllIxRrH//rDFFrnTSFLDshhLUm5TpsD06Z4CWpIysxhLUm5N\nTdCnDwwfnjuJJDU0i7Ek5bRkCYwdC0OHwgYb5E4jSQ3NYixJOd1zD7z8smMUklQFLMaSlFOpBOuu\nC4cemjuJJDU8i7Ek5bJgAYwfX8wWr7127jSS1PAsxpKUy+23w1tveVIPSaoSFmNJyqVUgv794YAD\ncieRJGExlqQ85s2DCRPgmGOgd+/caSRJWIwlKY+bb4b58z0ahSRVEYuxJOXQ1ATbbAMf+1juJJKk\nZhZjSepus2fDHXcUO91F5E4jSWpmMZak7nb99cUZ7xyjkKSqYjGWpO5WKsH73w8f+EDuJJKkFizG\nktSdZs6EBx7w2MWSVIUsxpLUncaOLT5ajCWp6liMJak7lUrFkSgGDcqdRJLUisVYkrrLU0/BE0+4\n050kVSmLsSR1l6Ym6NkTjj46dxJJUhssxpLUHRYuhGuugQMOgM02y51GktSGXrkDSFJDuOwyeP55\nuPzy3EkkSe1wxViSutrcuXDuubD//nDwwbnTSJLaYTGWpK520UXw2mtwwQWeAlqSqpjFWJK60ssv\nw8UXw4gRMHhw7jSSpFWwGEtSVzr77GLHu+99L3cSSVIHLMaS1FWmTYMrr4STToIddsidRpLUAYux\nJHWVM86AtdeG7343dxJJUhksxpLUFSZPhhtvhG99CzbdNHcaSVIZLMaSVGkpwbe/XZzI47/+K3ca\nSVKZPMGHJFXabbfBfffBL34B666bO40kqUyuGEtSJS1ZAqedBjvuCF/8Yu40kqTV4IqxJFXSr38N\nU6fC9ddD796500iSVoMrxpJUKe++C6NHw557wpFH5k4jSVpNrhhLUqX89Kfw4otw7bWe+lmSapAr\nxpJUCXPmwPnnw6c/DfvumzuNJGkNWIwlqRLOOw/mzi3KsSSpJlmMJamzZs6En/0Mjj8ePvCB3Gkk\nSWvIYixJnTV6dDFTfPbZuZNIkjrBYixJnfHEEzBmDHz1q7D11rnTSJI6wWIsSZ1x2mmw/vrFR0lS\nTfNwbZK0pu6+GyZNggsvhI02yp1GktRJrhhL0ppICU49FQYMgFNOyZ1GklQBrhhL0poYPx4efhiu\nvhrWXjt3GklSBbhiLEmra9EiOOMMeP/74bjjcqeRJFVIWcU4IoZExLSImB4RK+1hEhH/FRFPR8QT\nEXFXRGxT+aiSVCV++UuYPh1+8APo2TN3GklShXRYjCOiJ3AJcAiwCzAqInZptdlfgMEppQ8C44EL\nKx1UkqrCvHnF8Yr33ReGDs2dRpJUQeWsGO8JTE8pzUgpLQTGAoe13CCldHdK6Z3mm5OBAZWNKUlV\n4uKL4dVX4YILipN6SJLqRjnFeCvghRa3ZzXf154TgEltPRARJ0bElIiYMnv27PJTSlI1eOUVuOgi\nOOoo2Guv3GkkSRVWTjFua0kktblhxOeAwcBFbT2eUroipTQ4pTS4f//+5aeUpGpw7rkwfz58//u5\nk0iSukA5h2ubBQxscXsA8FLrjSLiQOA7wL4ppQWViSdJVeLZZ+Hyy+HEE2GnnXKnkSR1gXJWjB8G\ndoyIQRHRBxgJTGi5QUTsDlwODEspvVr5mJKU2ZlnQt++MHp07iSSpC7SYTFOKS0GTgF+BzwDXJdS\nmhoR50TEsObNLgLWBa6PiMei2MovAAAP9UlEQVQiYkI7X06Sas/DD8N118E3vgGbb547jSSpi0RK\nbY4Ld7nBgwenKVOmZPneklS2lGD//WHqVHjuOejXL3ciSdJqiohHUkqDO9rOU0JL0qrcfjv88Y/w\ns59ZiiWpznlKaElqz5IlcOqpsP32xU53kqS65oqxJLXn2mvhySdh7Fjo0yd3GklSF3PFWJLaMn8+\nfPe78OEPw9FH504jSeoGrhhLUlsuuQSefx6uvhp6uIYgSY3Ad3tJau2NN4qz2x18cHFECklSQ7AY\nS1JrF1wAb75ZfJQkNQyLsSS19MIL8JOfwOc+Bx/6UO40kqRuZDGWpJbOOguWLoVzzsmdRJLUzSzG\nkrTM1Knwq1/BKafAttvmTiNJ6mYWY0la5vTTi7PbnXFG7iSSpAwsxpIEcN998NvfwmmnwcYb504j\nScrAYixJKcG3vw1bbQVf/WruNJKkTDzBhyTddBNMngxXXgnrrJM7jSQpE1eMJTW2xYuL2eL3vQ+O\nPz53GklSRq4YS2ps//u/8Le/wS23QC/fEiWpkbliLKlx/fOfxXGL994bPvOZ3GkkSZm5PCKpcf3o\nR/B//wc33AARudNIkjJzxVhSY5o9Gy68EA4/HD7+8dxpJElVwGIsqTF973vFKMX55+dOIkmqEhZj\nSY1nxgy49FI44QTYeefcaSRJVcJiLKnxnHlmcQSKs87KnUSSVEUsxpIay6OPQlMTfP3rsOWWudNI\nkqqIxVhSYzn1VNh44+IU0JIkteDh2iQ1jt//Hu68E378Y1h//dxpJElVxhVjSY3htdeK8Yltt4WT\nTsqdRpJUhVwxllT/ZsyAQw6BmTOLUz/37Zs7kSSpClmMJdW3Rx6BoUNh0SK4667i9M+SJLXBUQpJ\n9WvSJNh3X1h7bXjwQUuxJGmVLMaS6tNVV8FnPgM77QQPPeSJPCRJHbIYS6ovKcHZZxdntTvgALjn\nHthii9ypJEk1wBljSfVj8WL40pfgyivh+OPhl7+E3r1zp5Ik1QhXjCXVh7ffhsMOK0rxmWfC1Vdb\niiVJq8UVY0m175VX4NBDi9M9X3YZ/Od/5k4kSapBFmNJte1vfyuOUfzyy3DzzcUOd5IkrQGLsaTa\nNXlysVIcAX/8I+y5Z+5EkqQa5oyxpNo0YQLsvz9ssEFxODZLsSSpkyzGkmrPpZfCEUfA+99fnLhj\nhx1yJ5Ik1QGLsaTakRKccQacfHIxV3z33bDpprlTSZLqhDPGkmrDwoXwxS/CmDHwH/8Bv/gF9PIt\nTJJUOa4YS6p+c+fCpz9dlOJzzoHLL7cUS5Iqzt8skqrbSy/B0KHw1FNw1VXw+c/nTiRJqlMWY0nV\n6+mni1ni11+H226Dgw/OnUiSVMcsxpKq0333wbBh0Lcv3Hsv7LFH7kSSpDrnjLGk6jN+PHzqU7DZ\nZsUxii3FkqRuYDGWVF1+/GM45hj48IfhgQdg0KDciSRJDcJiLKk6LF0K3/wmfP3rcPjhcOedsPHG\nuVNJkhqIM8aS8luwAP7932HsWDjllGLVuGfP3KkkSQ3GYiwprzffLFaI77kHLrgAvvUtiMidSpLU\ngCzGkvJ54YXicGx/+xtcey0ce2zuRJKkBmYxlpTHk08WpXjePLj9dth//9yJJEkNzp3vJHW/P/wB\n9tmnuH7ffZZiSVJVsBhL6l6lEgwZAgMHFsco/uAHcyeSJAmwGEvqLm+8AWedBZ/9LHz843D//UU5\nliSpSjhjLKnrLFwIEyfCmDFw663F7ZEj4Ve/Kk71LElSFbEYS6qslGDy5KIMjxsHc+bAppvCl74E\nxx1XnN7Zw7FJkqqQxVhSZTz3HFxzTXGZPh3WWqs4PvFxx8FBB0Ev324kSdXN31SS1tycOXDddcXq\n8IMPFivBn/wknHEGHHkkrLde7oSSJJXNYixp9SxYsHxu+LbbirnhXXaB888vdqxzhzpJUo2yGEvq\nWErFodWWzQ2/8QZsthmcfHIxKrH77s4NS5JqnsVYUvuee64ow9dcU1xfe+3lc8Of+pRzw5KkuuJv\nNUkrmjOnWBUeM6ZYJY6A/faDM8+E4cOdG5Yk1S2LsaRibvi225bPDS9aBLvuCj/4QTE3PGBA7oSS\nJHU5i7HUqFIqjiQxZkxxZIllc8OnnFKMSuy2m3PDkqSGYjGWGs306cvnhmfMKOaGjziiKMMHHujc\nsCSpYfkbUKpHKcGrrxYlePr0Yse56dPhmWfgsceKleD994fRo4u54X79cieWJCk7i7FUq5YuhVmz\nlpfelgX4uefg7beXb9ujB2yzDeywA1xwARx7rHPDkiS1YjGWqtmiRTBzZtvld8aMYqe5Zfr0ge22\ng+23L84+t8MOxfUddihKcZ8+2f4ZkiTVAouxlNv8+UXJbVl6l13/xz9gyZLl266zTlF0d94ZDj10\nxfI7YAD07JntnyFJUq2zGEtdYcECmDcP5s4tPi67/tZbK68Av/hiMRO8zPrrw447wuDBMHJkUXqX\nFeDNN/dIEZIkdZGyinFEDAF+AvQErkwp/aDV432B3wAfBl4HRqSU/lHZqFIXSqlYuW1dZNsqt+Vc\nX7Ro1d9v002LsrvffsuL77Lyu9FGll9JkjLosBhHRE/gEuBTwCzg4YiYkFJ6usVmJwBvpJR2iIiR\nwAXAiK4IrCqXUrFT2NKlK15veVm8uCiOq3NZk89p73PffrvtUttyZGFV1l23OPtbv37FZb31itne\nZddb3t/WfQMHehQISZKqUDkrxnsC01NKMwAiYixwGNCyGB8GnNV8fTzw84iIlFr+fbgKPPUUfPOb\ny2+3jtfy9po+Vu62KXX99fYeb11Y2yuwbd3f0X259eoFvXsXl5bXW17WXbcopltuuXKJ7ej6e95T\nHOFBkiTVnXKK8VbACy1uzwL2am+blNLiiHgL2Bh4reVGEXEicCLA1ltvvYaRO2HxYnjzzRXva/0n\n65a31/SxVW0bsfx2d1xv674ePZZfWt9e1f2dua/l/e0V1vYu5W7fq5cjCJIkaY2VU4zbahqtV4LL\n2YaU0hXAFQCDBw/u/tXk3XaDyZO7/dtKkiSp+pXzN+FZwMAWtwcAL7W3TUT0AtYH5lQioCRJktQd\nyinGDwM7RsSgiOgDjAQmtNpmAnB88/WjgD9U3XyxJEmStAodjlI0zwyfAvyO4nBtV6WUpkbEOcCU\nlNIE4H+BMRExnWKleGRXhpYkSZIqrazjGKeUJgITW903usX1+cDRlY0mSZIkdR+POyVJkiRhMZYk\nSZIAi7EkSZIEWIwlSZIkwGIsSZIkARZjSZIkCbAYS5IkSYDFWJIkSQIsxpIkSRJgMZYkSZIAi7Ek\nSZIEWIwlSZIkwGIsSZIkARZjSZIkCYBIKeX5xhGzgZlZvjlsAryW6XvXA5+/zvH56xyfv87x+esc\nn7/O8fnrHJ+/NbdNSql/RxtlK8Y5RcSUlNLg3Dlqlc9f5/j8dY7PX+f4/HWOz1/n+Px1js9f13OU\nQpIkScJiLEmSJAGNW4yvyB2gxvn8dY7PX+f4/HWOz1/n+Px1js9f5/j8dbGGnDGWJEmSWmvUFWNJ\nkiRpBRZjSZIkiTotxhFxdERMjYilETG41WOnR8T0iJgWEQe38/mDIuJPEfFsRIyLiD7dk7w6NT8H\njzVf/hERj7Wz3T8i4snm7aZ0d85qFRFnRcSLLZ7Doe1sN6T5dTk9Ik7r7pzVKiIuioi/RsQTEXFT\nRGzQzna+/lro6PUUEX2bf7anN7/fbdv9KatTRAyMiLsj4pnm3yX/fxvbfDIi3mrxcz06R9Zq1dHP\nYxR+2vz6eyIi9siRsxpFxHtbvK4ei4i5EfG1Vtv4+usivXIH6CJPAcOBy1veGRG7ACOBXYEtgTsj\nYqeU0pJWn38B8KOU0tiIuAw4Abi062NXp5TSiGXXI+KHwFur2Hy/lJIHH1/Zj1JK/9PegxHRE7gE\n+BQwC3g4IiaklJ7uroBV7PfA6SmlxRFxAXA6cGo72/r6o+zX0wnAGymlHSJiJMX73oiVv1pDWgx8\nI6X0aET0Ax6JiN+38fN4X0rp0Az5asWqfh4PAXZsvuxF8Tt2r+4KVs1SStOA3eBfP8svAje1samv\nvy5QlyvGKaVnml9YrR0GjE0pLUgp/R2YDuzZcoOICGB/YHzzXb8GDu/KvLWi+bk5BmjKnaUO7QlM\nTynNSCktBMZSvF4bXkrpjpTS4uabk4EBOfPUiHJeT4dRvL9B8X53QPPPeMNLKb2cUnq0+fo84Blg\nq7yp6s5hwG9SYTKwQURskTtUFToAeC6llOtMwQ2nLovxKmwFvNDi9ixWfrPbGHizxS/itrZpVP8G\nvJJSeradxxNwR0Q8EhEndmOuWnBK858Lr4qIDdt4vJzXpuALwKR2HvP1t1w5r6d/bdP8fvcWxfuf\nWmgeMdkd+FMbD38sIh6PiEkRsWu3Bqt+Hf08+p5XnpG0vxjl668L1OwoRUTcCWzexkPfSSnd0t6n\ntXFf6+PVlbNN3Snz+RzFqleL904pvRQRmwK/j4i/ppTurXTWarSq54/iT4TnUryOzgV+SFHwVvgS\nbXxu3b/ulinn9RcR36H4E/e17XyZhn39tcH3ugqIiHWBG4CvpZTmtnr4UWCblNLbzfsN3EwxFqBC\nRz+Pvv460Lx/0zCK8bHWfP11kZotximlA9fg02YBA1vcHgC81Gqb1yj+pNOreRWlrW3qTkfPZ0T0\nopjb/vAqvsZLzR9fjYibKP6c2xDFpNzXY0T8Eri1jYfKeW3WrTJef8cDhwIHpHYOvt7Ir782lPN6\nWrbNrOaf7/WBOd0Tr/pFRG+KUnxtSunG1o+3LMoppYkR8YuI2MQZ90IZP48N/Z5XpkOAR1NKr7R+\nwNdf12m0UYoJwMjmvbEHUfzv6s8tN2j+pXs3cFTzXccD7a1AN5IDgb+mlGa19WBEvKd5JxUi4j3A\nQRQ7QTa8VnNzR9D28/IwsGMUR0TpQ/Hnswndka/aRcQQip3thqWU3mlnG19/Kyrn9TSB4v0Nive7\nP7T3n45G0zxr/b/AMymli9vZZvNlM9kRsSfF79PXuy9l9Srz53EC8P81H53io8BbKaWXuzlqtWv3\nr7S+/rpOza4Yr0pEHAH8DOgP3BYRj6WUDk4pTY2I64CnKf4k++VlR6SIiInAF5v/l3sqMDYivgf8\nheINstGtNOcUEVsCV6aUhgKbATc1/5z2Akoppdu7PWV1ujAidqP4M+E/gP+EFZ+/5iMunAL8DugJ\nXJVSmporcJX5OdCX4s+xAJNTSif5+mtfe6+niDgHmJJSmkDxvjYmIqZTrBSPzJe46uwNHAc8GcsP\nT3kGsDVASukyiv9MfCkiFgPvAiP9j8W/tPnzGBEnwb+ev4nAUIqd4N8BPp8pa1WKiHUojirzny3u\na/n8+frrIp4SWpIkSaLxRikkSZKkNlmMJUmSJCzGkiRJEmAxliRJkgCLsSRJkgRYjCVJkiTAYixJ\nkiQB8P8Al/eBSu2Vh88AAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "print(sigmoid(0))" + "nums = np.arange(-10, 10, step=1)\n", + "\n", + "fig, ax = plt.subplots(figsize=(12,8))\n", + "ax.plot(nums, sigmoid(nums), 'r')" ] }, { @@ -163,17 +237,16 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 157, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "def costFunction(theta, X, y):\n", - " m = len(y)\n", - " J = 0;\n", - " grad = np.zeros(theta.shape)\n", - " \n", + "def cost(theta, X, y):\n", + " theta = np.matrix(theta)\n", + " X = np.matrix(X)\n", + " y = np.matrix(y)\n", " # ====================== YOUR CODE HERE ======================\n", " # Instructions: Compute the cost of a particular choice of theta.\n", " # You should set J to the cost.\n", @@ -183,13 +256,54 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", " # =============================================================\n", " return J" ] }, + { + "cell_type": "code", + "execution_count": 158, + "metadata": {}, + "outputs": [], + "source": [ + "data.insert(0, 'Ones', 1)\n", + "\n", + "cols = data.shape[1]\n", + "X = data.iloc[:,0:cols-1]\n", + "y = data.iloc[:,cols-1:cols]\n", + "\n", + "X = np.array(X.values)\n", + "y = np.array(y.values)\n", + "theta = np.zeros(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.6931471805599453" + ] + }, + "execution_count": 160, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cost(theta, X, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Evaluating the cost should return 0.69314718055994529" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -199,17 +313,17 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 161, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "def costFunction(theta, X, y):\n", - " m = len(y)\n", - " J = 0;\n", - " grad = np.zeros(theta.shape)\n", - " \n", + "def gradient(theta, X, y):\n", + " theta = np.matrix(theta)\n", + " X = np.matrix(X)\n", + " y = np.matrix(y)\n", + " \n", " # ====================== YOUR CODE HERE ======================\n", " # Instructions: Compute the partial derivatives and set grad to the partial\n", " # derivatives of the cost w.r.t. each parameter in theta\n", @@ -225,7 +339,7 @@ " \n", " \n", " # =============================================================\n", - " return grad.flatten()" + " return grad" ] }, { @@ -237,23 +351,67 @@ }, { "cell_type": "code", - "execution_count": 40, - "metadata": { - "collapsed": true - }, - "outputs": [], + "execution_count": 164, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/vrishank/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:10: RuntimeWarning: divide by zero encountered in log\n", + " # Remove the CWD from sys.path while we load stuff.\n", + "/Users/vrishank/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:10: RuntimeWarning: invalid value encountered in multiply\n", + " # Remove the CWD from sys.path while we load stuff.\n" + ] + }, + { + "data": { + "text/plain": [ + "0.024086758583295755" + ] + }, + "execution_count": 164, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "from scipy.optimize import fmin_bfgs" + "import scipy.optimize as opt\n", + "result = opt.fmin_tnc(cost, x0=theta, fprime=gradient, args=(X, y))\n", + "cost(result[0], X, y)" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] + "execution_count": 165, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "accuracy = 99.000000\n" + ] + } + ], + "source": [ + "def predict(theta, X):\n", + " probability = sigmoid(X * theta.T)\n", + " return [1 if x >= 0.5 else 0 for x in probability]\n", + "\n", + "theta_min = np.matrix(result[0])\n", + "predictions = predict(theta_min, X)\n", + "correct = [1 if ((a == 1 and b == 1) or (a == 0 and b == 0)) else 0 for (a, b) in zip(predictions, y)]\n", + "accuracy = (sum(map(int, correct)) % len(correct))\n", + "print ('accuracy = %f' % (accuracy))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Final accuracy should be 99.00%" + ] } ], "metadata": { diff --git a/Module 3/README.md b/Module 3/README.md new file mode 100644 index 0000000..3284a60 --- /dev/null +++ b/Module 3/README.md @@ -0,0 +1,5 @@ +Task 3 + +1. Go through week 3 of the Andrew Ng course on Coursera +2. Use "git pull" to get the latest version of the repository +3. Complete the implementation of Logistic Regression in module 3. diff --git a/Module 4/.ipynb_checkpoints/Multi-class Classification and Neural Networks-checkpoint.ipynb b/Module 4/.ipynb_checkpoints/Multi-class Classification and Neural Networks-checkpoint.ipynb new file mode 100644 index 0000000..03caacc --- /dev/null +++ b/Module 4/.ipynb_checkpoints/Multi-class Classification and Neural Networks-checkpoint.ipynb @@ -0,0 +1,341 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Multi-class Classification" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from scipy.io import loadmat\n", + "from scipy.optimize import minimize\n", + "\n", + "from sklearn.linear_model import LogisticRegression\n", + "\n", + "pd.set_option('display.notebook_repr_html', False)\n", + "pd.set_option('display.max_columns', None)\n", + "pd.set_option('display.max_rows', 150)\n", + "pd.set_option('display.max_seq_items', None)\n", + " \n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Loading Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data = loadmat('ex3data1.mat')\n", + "data.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "y = data['y']\n", + "X = np.c_[np.ones((data['X'].shape[0],1)), data['X']]\n", + "\n", + "print('X: {} (with intercept)'.format(X.shape))\n", + "print('y: {}'.format(y.shape))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualizing the data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sample = np.random.choice(X.shape[0], 20)\n", + "plt.figure(figsize=(15,10))\n", + "plt.imshow(X[sample,1:].reshape(-1,20).T, cmap=\"Greys\")\n", + "plt.axis('off');" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sigmoid(z):\n", + " return(1 / (1 + np.exp(-z)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Vectorizing Logistic Regression" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def lrcostFunctionReg(theta, reg, X, y):\n", + " m = y.size\n", + " \n", + " # ====================== YOUR CODE HERE ======================\n", + " # Instructions: Compute the cost of a particular choice of theta.\n", + " # You should set J to the cost.\n", + " # Compute the partial derivatives and set grad to the partial\n", + " # derivatives of the cost w.r.t. each parameter in theta\n", + " # Hint you may find np.dot() useful in vectorizing computations\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " # =============================================================\n", + " if np.isnan(J[0]):\n", + " return(np.inf)\n", + " return(J[0]) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def lrgradientReg(theta, reg, X,y):\n", + " m = y.size\n", + " \n", + " # ====================== YOUR CODE HERE ======================\n", + " # Instructions: Compute the partial derivatives and set grad to the partial\n", + " # derivatives of the cost w.r.t. each parameter in theta\n", + " # Hint you may find np.dot() useful in vectorizing computations\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " # =============================================================\n", + " return(grad.flatten())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## One-vs-all Classification" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def oneVsAll(features, classes, n_labels, reg):\n", + " initial_theta = np.zeros((X.shape[1],1)) # 401x1\n", + " all_theta = np.zeros((n_labels, X.shape[1])) #10x401\n", + "\n", + " for c in np.arange(1, n_labels+1):\n", + " res = minimize(lrcostFunctionReg, initial_theta, args=(reg, features, (classes == c)*1), method=None,\n", + " jac=lrgradientReg, options={'maxiter':50})\n", + " all_theta[c-1] = res.x\n", + " return(all_theta)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "theta = oneVsAll(X, y, 10, 0.1)\n", + "theta" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def predictOneVsAll(all_theta, features):\n", + " # ====================== YOUR CODE HERE ======================\n", + " # Instructions: Complete the following code to make predictions using\n", + " # your learned logistic regression parameters (theta).\n", + " # You should set p to a vector of predictions (from 1 to\n", + " # num_labels).\n", + " # Hint: Use np.argmax()\n", + " \n", + " \n", + " \n", + " # =============================================================\n", + " return p" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pred = predictOneVsAll(theta, X)\n", + "print('Training set accuracy: {} %'.format(np.mean(pred == y.ravel())*100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Multiclass Logistic Regression with scikit-learn" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "clf = LogisticRegression(C=10, penalty='l2', solver='liblinear')\n", + "# Scikit-learn fits intercept automatically, so we exclude first column with 'ones' from X when fitting.\n", + "clf.fit(X[:,1:],y.ravel())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pred2 = clf.predict(X[:,1:])\n", + "print('Training set accuracy: {} %'.format(np.mean(pred2 == y.ravel())*100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Neural Networks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model representation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "theta1, theta2 = weights['Theta1'], weights['Theta2']\n", + "\n", + "weights = loadmat('ex3weights.mat')\n", + "weights.keys()\n", + "\n", + "print('theta1: {}'.format(theta1.shape))\n", + "print('theta2: {}'.format(theta2.shape))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Feedforward Propagation and Prediction" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def predict(theta_1, theta_2, features):\n", + " # ====================== YOUR CODE HERE ======================\n", + " # Instructions: Complete the following code to make predictions using\n", + " # your learned neural network. You should set p to a \n", + " # vector containing labels between 1 to num_labels.\n", + " \n", + " \n", + " \n", + " \n", + " # =============================================================\n", + " return p" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pred = predict(theta1, theta2, X)\n", + "print('Training set accuracy: {} %'.format(np.mean(pred == y.ravel())*100))" + ] + } + ], + "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.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Module 4/Multi-class Classification and Neural Networks.ipynb b/Module 4/Multi-class Classification and Neural Networks.ipynb new file mode 100644 index 0000000..03caacc --- /dev/null +++ b/Module 4/Multi-class Classification and Neural Networks.ipynb @@ -0,0 +1,341 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Multi-class Classification" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from scipy.io import loadmat\n", + "from scipy.optimize import minimize\n", + "\n", + "from sklearn.linear_model import LogisticRegression\n", + "\n", + "pd.set_option('display.notebook_repr_html', False)\n", + "pd.set_option('display.max_columns', None)\n", + "pd.set_option('display.max_rows', 150)\n", + "pd.set_option('display.max_seq_items', None)\n", + " \n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Loading Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data = loadmat('ex3data1.mat')\n", + "data.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "y = data['y']\n", + "X = np.c_[np.ones((data['X'].shape[0],1)), data['X']]\n", + "\n", + "print('X: {} (with intercept)'.format(X.shape))\n", + "print('y: {}'.format(y.shape))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualizing the data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sample = np.random.choice(X.shape[0], 20)\n", + "plt.figure(figsize=(15,10))\n", + "plt.imshow(X[sample,1:].reshape(-1,20).T, cmap=\"Greys\")\n", + "plt.axis('off');" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sigmoid(z):\n", + " return(1 / (1 + np.exp(-z)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Vectorizing Logistic Regression" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def lrcostFunctionReg(theta, reg, X, y):\n", + " m = y.size\n", + " \n", + " # ====================== YOUR CODE HERE ======================\n", + " # Instructions: Compute the cost of a particular choice of theta.\n", + " # You should set J to the cost.\n", + " # Compute the partial derivatives and set grad to the partial\n", + " # derivatives of the cost w.r.t. each parameter in theta\n", + " # Hint you may find np.dot() useful in vectorizing computations\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " # =============================================================\n", + " if np.isnan(J[0]):\n", + " return(np.inf)\n", + " return(J[0]) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def lrgradientReg(theta, reg, X,y):\n", + " m = y.size\n", + " \n", + " # ====================== YOUR CODE HERE ======================\n", + " # Instructions: Compute the partial derivatives and set grad to the partial\n", + " # derivatives of the cost w.r.t. each parameter in theta\n", + " # Hint you may find np.dot() useful in vectorizing computations\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " # =============================================================\n", + " return(grad.flatten())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## One-vs-all Classification" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def oneVsAll(features, classes, n_labels, reg):\n", + " initial_theta = np.zeros((X.shape[1],1)) # 401x1\n", + " all_theta = np.zeros((n_labels, X.shape[1])) #10x401\n", + "\n", + " for c in np.arange(1, n_labels+1):\n", + " res = minimize(lrcostFunctionReg, initial_theta, args=(reg, features, (classes == c)*1), method=None,\n", + " jac=lrgradientReg, options={'maxiter':50})\n", + " all_theta[c-1] = res.x\n", + " return(all_theta)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "theta = oneVsAll(X, y, 10, 0.1)\n", + "theta" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def predictOneVsAll(all_theta, features):\n", + " # ====================== YOUR CODE HERE ======================\n", + " # Instructions: Complete the following code to make predictions using\n", + " # your learned logistic regression parameters (theta).\n", + " # You should set p to a vector of predictions (from 1 to\n", + " # num_labels).\n", + " # Hint: Use np.argmax()\n", + " \n", + " \n", + " \n", + " # =============================================================\n", + " return p" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pred = predictOneVsAll(theta, X)\n", + "print('Training set accuracy: {} %'.format(np.mean(pred == y.ravel())*100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Multiclass Logistic Regression with scikit-learn" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "clf = LogisticRegression(C=10, penalty='l2', solver='liblinear')\n", + "# Scikit-learn fits intercept automatically, so we exclude first column with 'ones' from X when fitting.\n", + "clf.fit(X[:,1:],y.ravel())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pred2 = clf.predict(X[:,1:])\n", + "print('Training set accuracy: {} %'.format(np.mean(pred2 == y.ravel())*100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Neural Networks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model representation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "theta1, theta2 = weights['Theta1'], weights['Theta2']\n", + "\n", + "weights = loadmat('ex3weights.mat')\n", + "weights.keys()\n", + "\n", + "print('theta1: {}'.format(theta1.shape))\n", + "print('theta2: {}'.format(theta2.shape))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Feedforward Propagation and Prediction" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def predict(theta_1, theta_2, features):\n", + " # ====================== YOUR CODE HERE ======================\n", + " # Instructions: Complete the following code to make predictions using\n", + " # your learned neural network. You should set p to a \n", + " # vector containing labels between 1 to num_labels.\n", + " \n", + " \n", + " \n", + " \n", + " # =============================================================\n", + " return p" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pred = predict(theta1, theta2, X)\n", + "print('Training set accuracy: {} %'.format(np.mean(pred == y.ravel())*100))" + ] + } + ], + "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.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Module 4/README.md b/Module 4/README.md new file mode 100644 index 0000000..7c9af6c --- /dev/null +++ b/Module 4/README.md @@ -0,0 +1,10 @@ +Task 4 + +1. Go through week 4 of the Andrew Ng course on Coursera +2. Use "git pull" to get the latest version of the repository +3. Complete the implementations of Multi Class Logistic Regression and Feed Forward Neural Networks in module 4. + +PS - Try using ex3.pdf from Module 4 while working on the assignment + +Resources - +Numpy Cheat Sheet - https://s3.amazonaws.com/assets.datacamp.com/blog_assets/Numpy_Python_Cheat_Sheet.pdf?fbclid=IwAR2zsffIMPygqjSJkXLdqDdhwFFHn5basIck8mS9SMJ69XGC49hcJGGZMx0 diff --git a/Module 4/ex3data1.mat b/Module 4/ex3data1.mat new file mode 100644 index 0000000..371bd0c Binary files /dev/null and b/Module 4/ex3data1.mat differ diff --git a/Module 4/ex3weights.mat b/Module 4/ex3weights.mat new file mode 100644 index 0000000..ace2a09 Binary files /dev/null and b/Module 4/ex3weights.mat differ diff --git a/README.md b/README.md index ee163da..e636f86 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,11 @@ Module 3 - Logistic Regression Module 4 - Neural Networks : Representation and Forward pass -Moudle 5 - Neural Networks : Learning and Backpropagation +Moudle 5 - Neural Networks : Learning and Backpropagation (Coming Soon!!) ## Setup 1. Install Anaconda for Python3 from https://www.anaconda.com/download/ -2. Install Git +2. Install Git https://www.atlassian.com/git/tutorials/install-git 3. Clone/Download this repository -4. Launch the Jupter Notebook in the Module 1 sub-directory +4. How Jupyter notebook works! http://cs231n.github.io/ipython-tutorial/?fbclid=IwAR2ZhC3strNko9CmKJdskF4tt4ERMNviWVoj4wr9pBsQ3dsfJrxK1JF5UDc +5. Launch the Jupter Notebook in the Module 1 sub-directory