From d06a7b74c5a3c9e301db90a7a772c9a22a8b068b Mon Sep 17 00:00:00 2001 From: Opeyemi Osakuade <59209191+opeyemiferanmi1@users.noreply.github.com> Date: Fri, 17 Apr 2020 23:51:38 +0100 Subject: [PATCH 1/5] Create Opeyemi Osakuade --- Opeyemi Osakuade | 1 + 1 file changed, 1 insertion(+) create mode 100644 Opeyemi Osakuade diff --git a/Opeyemi Osakuade b/Opeyemi Osakuade new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Opeyemi Osakuade @@ -0,0 +1 @@ + From cf1b3575a9b1f4aa765a34e6ad3de49311345ff0 Mon Sep 17 00:00:00 2001 From: Opeyemi Osakuade <59209191+opeyemiferanmi1@users.noreply.github.com> Date: Fri, 17 Apr 2020 23:53:20 +0100 Subject: [PATCH 2/5] Delete Opeyemi Osakuade --- Opeyemi Osakuade | 1 - 1 file changed, 1 deletion(-) delete mode 100644 Opeyemi Osakuade diff --git a/Opeyemi Osakuade b/Opeyemi Osakuade deleted file mode 100644 index 8b13789..0000000 --- a/Opeyemi Osakuade +++ /dev/null @@ -1 +0,0 @@ - From 288a45bdcd40cee9b35e41655c53bc9dc3c79224 Mon Sep 17 00:00:00 2001 From: Opeyemi Osakuade <59209191+opeyemiferanmi1@users.noreply.github.com> Date: Wed, 22 Apr 2020 21:54:48 +0100 Subject: [PATCH 3/5] Create README.md --- Opeyemi Osakuade/README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Opeyemi Osakuade/README.md diff --git a/Opeyemi Osakuade/README.md b/Opeyemi Osakuade/README.md new file mode 100644 index 0000000..c231d3b --- /dev/null +++ b/Opeyemi Osakuade/README.md @@ -0,0 +1,25 @@ +## Design and develop the Logistic Regression algorithm from scratch using Python +Logistic regression is a classification algorithm,used to model the probability of a certain class or event. It transforms the output into a probability value (i.e. a number between 0 and 1) using logistic sigmoid function. + +For a binary classifier, we want the classifier to output values that are between 0 and 1. +
+i.e. + 0 ≤ yθ(x)≤1 + +### Hypothesis Representation + +The term logistic regression refers to "logit function" which refers to "log odds". Odds refers to the ratio of the probability of an event occuring to the probability it does not occur. +Taking the log, log odds for the model turns out to be the equation of the *Sigmoid Function* + +### Cost function +Since the logistic regression function(sigmoid) is *non linear*, to get a *convex function*, i.e a bowl-shaped function that eases the gradient descent function's work to converge to the optimal minimum point,a logistic regression cost function is derived + +### Gradient descent +To choose the values of weights that corresponds to a convex function and fits the data well(so we reach a global minimum), ensure that + +the prediction(h) is at least close to the actual *y*, minimize the cost function using gradient descent. + +Repeat until convergence, updating all weights. + +#### Data +Comprise of two written test scores at DMV driving school and also contains the result whether passed or failed, the objective is to predict if each person with the test scores passed or failed From 596b00773797ef327f7faae11fd599b8c29a427d Mon Sep 17 00:00:00 2001 From: Opeyemi Osakuade <59209191+opeyemiferanmi1@users.noreply.github.com> Date: Wed, 22 Apr 2020 23:29:44 +0100 Subject: [PATCH 4/5] Add files via upload --- Opeyemi Osakuade/DMV_Written_Tests.csv | 101 ++++++ .../DSN-Algorithm Challenge.ipynb | 332 ++++++++++++++++++ 2 files changed, 433 insertions(+) create mode 100644 Opeyemi Osakuade/DMV_Written_Tests.csv create mode 100644 Opeyemi Osakuade/DSN-Algorithm Challenge.ipynb diff --git a/Opeyemi Osakuade/DMV_Written_Tests.csv b/Opeyemi Osakuade/DMV_Written_Tests.csv new file mode 100644 index 0000000..b9acb0a --- /dev/null +++ b/Opeyemi Osakuade/DMV_Written_Tests.csv @@ -0,0 +1,101 @@ +DMV_Test_1,DMV_Test_2,Results +34.62365962451697,78.0246928153624,0 +30.28671076822607,43.89499752400101,0 +35.84740876993872,72.90219802708364,0 +60.18259938620976,86.30855209546826,1 +79.0327360507101,75.3443764369103,1 +45.08327747668339,56.3163717815305,0 +61.10666453684766,96.51142588489624,1 +75.02474556738889,46.55401354116538,1 +76.09878670226257,87.42056971926803,1 +84.43281996120035,43.53339331072109,1 +95.86155507093572,38.22527805795094,0 +75.01365838958247,30.60326323428011,0 +82.30705337399482,76.48196330235604,1 +69.36458875970939,97.71869196188608,1 +39.53833914367223,76.03681085115882,0 +53.9710521485623,89.20735013750205,1 +69.07014406283025,52.74046973016765,1 +67.94685547711617,46.67857410673128,0 +70.66150955499435,92.92713789364831,1 +76.97878372747498,47.57596364975532,1 +67.37202754570876,42.83843832029179,0 +89.67677575072079,65.79936592745237,1 +50.534788289883,48.85581152764205,0 +34.21206097786789,44.20952859866288,0 +77.9240914545704,68.9723599933059,1 +62.27101367004632,69.95445795447587,1 +80.1901807509566,44.82162893218353,1 +93.114388797442,38.80067033713209,0 +61.83020602312595,50.25610789244621,0 +38.78580379679423,64.99568095539578,0 +61.379289447425,72.80788731317097,1 +85.40451939411645,57.05198397627122,1 +52.10797973193984,63.12762376881715,0 +52.04540476831827,69.43286012045222,1 +40.23689373545111,71.16774802184875,0 +54.63510555424817,52.21388588061123,0 +33.91550010906887,98.86943574220611,0 +64.17698887494485,80.90806058670817,1 +74.78925295941542,41.57341522824434,0 +34.1836400264419,75.2377203360134,0 +83.90239366249155,56.30804621605327,1 +51.54772026906181,46.85629026349976,0 +94.44336776917852,65.56892160559052,1 +82.36875375713919,40.61825515970618,0 +51.04775177128865,45.82270145776001,0 +62.22267576120188,52.06099194836679,0 +77.19303492601364,70.45820000180959,1 +97.77159928000232,86.7278223300282,1 +62.07306379667647,96.76882412413983,1 +91.56497449807442,88.69629254546599,1 +79.94481794066932,74.16311935043758,1 +99.2725269292572,60.99903099844988,1 +90.54671411399852,43.39060180650027,1 +34.52451385320009,60.39634245837173,0 +50.2864961189907,49.80453881323059,0 +49.58667721632031,59.80895099453265,0 +97.64563396007767,68.86157272420604,1 +32.57720016809309,95.59854761387875,0 +74.24869136721598,69.82457122657193,1 +71.79646205863379,78.45356224515052,1 +75.3956114656803,85.75993667331619,1 +35.28611281526193,47.02051394723416,0 +56.25381749711624,39.26147251058019,0 +30.05882244669796,49.59297386723685,0 +44.66826172480893,66.45008614558913,0 +66.56089447242954,41.09209807936973,0 +40.45755098375164,97.53518548909936,1 +49.07256321908844,51.88321182073966,0 +80.27957401466998,92.11606081344084,1 +66.74671856944039,60.99139402740988,1 +32.72283304060323,43.30717306430063,0 +64.0393204150601,78.03168802018232,1 +72.34649422579923,96.22759296761404,1 +60.45788573918959,73.09499809758037,1 +58.84095621726802,75.85844831279042,1 +99.82785779692128,72.36925193383885,1 +47.26426910848174,88.47586499559782,1 +50.45815980285988,75.80985952982456,1 +60.45555629271532,42.50840943572217,0 +82.22666157785568,42.71987853716458,0 +88.9138964166533,69.80378889835472,1 +94.83450672430196,45.69430680250754,1 +67.31925746917527,66.58935317747915,1 +57.23870631569862,59.51428198012956,1 +80.36675600171273,90.96014789746954,1 +68.46852178591112,85.59430710452014,1 +42.0754545384731,78.84478600148043,0 +75.47770200533905,90.42453899753964,1 +78.63542434898018,96.64742716885644,1 +52.34800398794107,60.76950525602592,0 +94.09433112516793,77.15910509073893,1 +90.44855097096364,87.50879176484702,1 +55.48216114069585,35.57070347228866,0 +74.49269241843041,84.84513684930135,1 +89.84580670720979,45.35828361091658,1 +83.48916274498238,48.38028579728175,1 +42.2617008099817,87.10385094025457,1 +99.31500880510394,68.77540947206617,1 +55.34001756003703,64.9319380069486,1 +74.77589300092767,89.52981289513276,1 diff --git a/Opeyemi Osakuade/DSN-Algorithm Challenge.ipynb b/Opeyemi Osakuade/DSN-Algorithm Challenge.ipynb new file mode 100644 index 0000000..e5e2318 --- /dev/null +++ b/Opeyemi Osakuade/DSN-Algorithm Challenge.ipynb @@ -0,0 +1,332 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Design and develop the Logistic Regression algorithm from scratch using Python" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For a binary classifier, we want the classifier to output values that are between 0 and 1. \n", + "i.e. $$0\\leq y_\\theta(x)\\leq1$$\n", + "\n", + "\n", + "\n", + "The term logistic regression refers to \"*logit function*\" which refers to \"*log odds*\".\n", + "*Odds refers to the ratio of the probability of an event occuring to the probability it does not occur.*\n", + "\n", + "Consider a model with feature $x_{1}$, $x_{2}$,...,$x_{n}$ and output denoted by $y$ that can take values 0 and 1. Let **p** be the probability of **Y=1**\n", + "$$\n", + "odd =\\frac p{1-p}\n", + "$$\n", + "Taking the log, log odds for the model becomes\n", + "$$\n", + "log (\\frac p{1-p}) = \\theta_{0}x_{0} + \\theta_{1}x_{1}+ ... + \\theta_{n}x_{n}\n", + "$$\n", + "where $\\theta_{1},\\theta_{2} ... \\theta_{n}$ are weights, $\\theta_{0}x_{0} $ serves as intercept with $x_{0}$ = 1\n", + "\n", + "Simplifying the equation to obtain **p**\n", + "$$\n", + "p =\\frac 1{1+e^{-( \\theta_{0} + \\theta_{1}x_{1}+ ... + \\theta_{n}x_{n})}}\n", + "$$ which turns out to be the equation of the *Sigmoid Function*\n", + "$$\n", + "S_{z} =\\frac 1{1+e^{-(z)}}\n", + "$$\n", + "\n", + "With $z = \\theta_{0}x_{0} + \\theta_{1}x_{1}+ \\theta_{2}x_{2}+ ... + \\theta_{n}x_{n}$,\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "def sigmoid(z): \n", + " return 1/ (1 + np.exp(-z))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Cost function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since the logistic regression function(sigmoid) is *non linear*, to get a *convex function*, i.e a bowl-shaped function that eases the gradient descent function's work to converge to the optimal minimum point,a logistic regression cost function is derived as shown below\n", + "\n", + "\n", + "\n", + "$$h = \\frac 1{1+e^{-(\\theta^Tx)}} $$\n", + "\n", + " $$Cost(h,y)= \\left( \\begin{array}{c} -log(h)\\;\\;if\\;y =1 \\\\-log(1-h)\\;\\;if\\;y =0\\end{array}\\right) $$\n", + " \n", + " where $h$ is the prediction label while y is the actual label\n", + "\n", + "*Log of numbers between 0 and 1 returns a negative value. The negative sign before the log counters that.*\n", + " \n", + " Making the equation more compact into a one-line expression, we have:\n", + "$$\n", + " Cost(h,y)=-ylog(h)-((1-y)log(1-h)\n", + "$$\n", + "substituting y=1 or 0 respectively returns the previous equation\n", + "\n", + "With *m* as the size of my training set and *i* as ith training example\n", + "\n", + "The cost function $J(\\theta)$ can be rewritten as:\n", + "$$J(\\theta)= \\frac1m\\sum \\limits _{i=1} ^{m}Cost(h,y)$$\n", + "$$J(\\theta)= āˆ’\\frac1m\\sum \\limits _{i=1} ^{m}y^{(i)}log(h^{(i)})+((1-y^{(i)})log(1-h^{(i)}))$$" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def Cost_function(x,y,theta):\n", + " m = len(y)\n", + " y_pred = sigmoid(np.dot(x, theta))\n", + " error =(y * np.log(y_pred)) + ((1-y)* np.log(1-y_pred))\n", + " cost = -1 / m * sum(error)\n", + " gradient = 1 / m * np.dot(x.transpose(), (y_pred - y))\n", + " return cost , gradient" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Gradient descent" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To choose the values of $\\theta$=$\\theta_{0}$,$\\theta_{1}$...$\\theta_{n}$ that corresponds to a convex function and fits the data well(so we reach a global minimum), ensure that $h = \\theta_{0} + \\theta_{1}x_{1}...\\theta_{n}x_{n}$is at least close to the actual $y$, minimize the cost function$J(\\theta)$ using gradient descent.\n", + "\n", + "Repeat until convergence, updating all $\\theta_j$:$\\left[ \\theta_{0},\\theta_{1},\\theta_{2}\\cdots,\\theta_{n}\\right] $$${\\theta_j}:=\\theta_jāˆ’\\alpha\\frac{\\partial}{\\partial \\theta_j}J(\\theta)\n", + "$$\n", + "where $\\alpha$ = Learning rate\n", + "\n", + "And partial deivative of cost function$J(\\theta)$ with respect to $\\theta$ :$$\n", + "\\frac{\\partial}{\\partial \\theta_j}J(\\theta)=āˆ’\\frac1m\\sum \\limits _{i=1} ^{m}(h^{(i)}+y^{(i)})x^{(i)}_j\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def gradient_descent(x, y, theta, alpha, iterations):\n", + " costs = []\n", + " for i in range(iterations):\n", + " cost, gradient = Cost_function(x,y,theta)\n", + " theta -= (alpha * gradient)\n", + " costs.append(cost)\n", + " return theta, costs\n", + "def predict(theta, x):\n", + " results = x.dot(theta)\n", + " return results > 0" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import pandas as pd\n", + "plt.style.use(\"ggplot\")\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cost at initialization [0.69314718]\n", + "Gradient at initialization: [[-0.1 ]\n", + " [-0.28122914]\n", + " [-0.25098615]]\n", + "Theta after running gradient descent: [[1.50850586]\n", + " [3.5468762 ]\n", + " [3.29383709]]\n", + "Resulting cost: [0.20489382]\n", + "Training Accuracy: 89 %\n", + "A person who scores 50 and 79 on their DMV written tests have a 0.71 probability of passing.\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "data = pd.read_csv(\"DMV_Written_Tests.csv\")\n", + "scores = data[['DMV_Test_1', 'DMV_Test_2']].values\n", + "results = data['Results'].values\n", + "#standardization\n", + "mean_scores = np.mean(scores, axis=0)\n", + "std_scores = np.std(scores, axis=0)\n", + "scores = (scores - mean_scores) / std_scores\n", + "\n", + "num_iter = 200\n", + "#include intercept\n", + "rows = scores.shape[0]\n", + "cols = scores.shape[1]\n", + "\n", + "X = np.append(np.ones((rows, 1)), scores, axis=1) \n", + "y = results.reshape(rows, 1)\n", + "\n", + "#initialization\n", + "theta_init = np.zeros((cols + 1, 1))\n", + "cost, gradient = Cost_function(X, y,theta_init)\n", + "\n", + "print(\"Cost at initialization\", cost)\n", + "print(\"Gradient at initialization:\", gradient)\n", + "\n", + "#Compute weights and cost function after running gradient descent\n", + "theta, costs = gradient_descent(X, y, theta_init, 1, 200)\n", + "print(\"Theta after running gradient descent:\", theta)\n", + "print(\"Resulting cost:\", costs[-1])\n", + "plt.plot(costs)\n", + "plt.xlabel(\"Iterations\")\n", + "plt.ylabel(\"$J(\\Theta)$\")\n", + "plt.title(\"Values of Cost Function over iterations of Gradient Descent\")\n", + "p = predict(theta, X)\n", + "print(\"Training Accuracy:\", sum(p==y)[0],\"%\")\n", + "\n", + "#Test\n", + "test = np.array([50,79])\n", + "test = (test - mean_scores)/std_scores\n", + "test = np.append(np.ones(1), test)\n", + "probability = sigmoid(test.dot(theta))\n", + "print(\"A person who scores 50 and 79 on their DMV written tests have a\",\n", + " np.round(probability[0], 2),\"probability of passing.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Plotting the decision boundary" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$h_\\theta(x) = \\sigma(z)$, where $\\sigma$ is the logistic sigmoid function and $z = \\theta^Tx$\n", + "\n", + "When $h_\\theta(x) \\geq 0.5$ the model predicts class \"1\":\n", + "\n", + "$\\implies \\sigma(\\theta^Tx) \\geq 0.5$\n", + "\n", + "$\\implies \\theta^Tx \\geq 0$ predict class \"1\" \n", + "\n", + "Hence, $\\theta_1 + \\theta_2x_2 + \\theta_3x_3 = 0$ is the equation for the decision boundary, giving us \n", + "\n", + "$ x_3 = \\frac{-(\\theta_1+\\theta_2x_2)}{\\theta_3}$" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYMAAAEMCAYAAAAmgtofAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOydeXxU1fmHn1myAkmQELWubbWKQrXanwoWURbZVBTxYEEB16K4WwtEgpY1aFXQoqiVVaUeFFwAK1GBuGBra5VQN9AqCFYIhBDJOsvvjzsThjD73G2S8/CZD7l37tx5586d855z3vd8X4ff70ehUCgUbRun1QYoFAqFwnqUM1AoFAqFcgYKhUKhUM5AoVAoFChnoFAoFAqUM1AoFAoF4LbaAAAhxDHAYuAIwAc8JaWcY61VCoVC0Xawy8jAA9wtpewCnAOME0KcYrFNCoVC0WZw2HHRmRDiFeDPUsqyKIfZz3CFQqFIDxwtd9himigUIcTxwK+Av8c6dseOHQdtFxYWUllZaYxhOpIOdqaDjZAedqaDjaDs1BM72/iTn/wk7H5bjQyEEO2B9cB0KeXyMM/fCNwIIKU8s7Gx8aDn3W43Ho/HDFNTIh3sTAcbIT3sTAcbQdmpJ3a2MTMzE8KMDGzjDIQQGcBK4A0p5cNxvMSvRgbGkQ42QnrYmQ42grJTT+xsY2BkcIgzsEUAWQjhAJ4BPovTESgUCoVCR+wSMzgXuBqoEEJ8HNhXLKVcbaFNCoUiDfD7/dTX1+Pz+XA4DunwWsIPP/xAQ0ODZe/v9/txOp1kZ2fHfU1s4QyklO8SZtiiUCgUsaivrycjIwO32xbNGaDFDFwul6U2eDwe6uvrycnJiet4W0wTKRQKRbL4fD5bOQK74Ha78fl8cR+vnIFCoUhr7DI1ZEcSuTbKGSSJw+Ggo8uF06ldQqfTSUeXS92YCoUiLVHOIAkcDgeFfj/ZU6dS6PGQkZFBYVOTtu33K4egULQxjjnmGPr160fv3r258cYbqa2tNfX9hw0bxieffJLSOZQzSIICpxP3jBk45s7FPWgQnaqrcQ8erG3PmEGBU11WhcLuZLXL0u1c2dnZlJWV8fbbb5OZmcnixYt1O7dZqKhLElT7/WSMH4+7vBwqKnCeeKL2RLdueCdMoNrghXxZ7bJo2G9d2prCXNT3rT+uTBf72U9WZhbeRq+u5z7rrLP44osvALj22mvZsWMHDQ0NXHfddVx11VV4vV7uvvtuNm7ciMPhYPjw4dx4440888wzLFmyBLfbzYknnsgTTzxBbW0tkyZN4vPPP8fj8XD33XfTv39/6urquOuuu9i8eTMnnHAC9fX1KdutnEES+Hw+qrKz6bR8+QFHAPiWL6cqKwtfU5Nh723kTaywH+r7NoZGVyM9nunBhms34GrULwXU4/Gwdu1a+vTpA8BDDz1Ex44dqaurY/DgwQwaNIjvvvuO//3vf7z99tsAVFdXAzB37lw2bNhAVlZW8745c+Zw7rnn8vDDD1NdXc3gwYPp2bMnS5YsIScnhzfffJNPP/2UAQMGpGy7ms9IAqfTScf6epxDhx68f+hQOjY0NAeVjSB4Eze6G2MfrNANPacUEkF93/rjynTxbMWzbK/ZznMVz+HKTN0Z1NfX069fPwYOHMhRRx3FiBEjAJg/fz59+/bl4osvZseOHfz3v//l2GOPZevWrUyaNIm1a9fSoUMHALp06cItt9zCSy+91JwqW15ezty5c+nXrx/Dhg2joaGB7du38/e//52hgfbnlFNOoUuXLil/BuUMkiDf4cA1axZUVEC3bvg2b4Zu3aCiAldpKfkGBZCNuIkV4Qlt/IO9c7Ovd7p831Y5ymRpdDUy872ZAMx8b6YujjYYMygrK2PatGlkZmby/vvv88477/Daa6/x5ptv0rVrVxoaGigoKKCsrIzu3buzcOFCfv/73wOwePFixowZw8aNGxkwYAAejwe/389TTz3VfO4PP/yQEwOzEXonqihnkAR7fT48xcX4x43Ds3o1u/Pz8axapW0XF7M3gYUeiWDETaw4lJaNv1W981S+b7MaaKscZbIEHWxNYw0A+xr2GeZoa2pqyM/PJycnhy1btvDRRx8BsGfPHnw+H4MHD+aee+6hoqICn8/Hjh07OPfcc5k0aRL79u1j//799OrViwULFhAUFN20aRMAZ599NitWrADg888/57PPPkvZXuUMYhBuPUGB08lup5P6khIq3W6ampqozMjQth0OjFCCNfMmbuuENv5W9c5T+b7NbKDTbRor1MEGMapjdf755+P1eunbty8PPPAAZ5xxBgDff/89w4YNo1+/ftx5551MnDgRr9fLrbfeSp8+fejfvz833HAD+fn53HHHHTQ1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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "passed = (results == 1).reshape(100, 1)\n", + "failed = (results == 0).reshape(100, 1)\n", + "sns.scatterplot(x = X[passed[:, 0], 1],\n", + " y = X[passed[:, 0], 2],\n", + " marker = \"^\",\n", + " color = \"green\",\n", + " s = 60)\n", + "ax = sns.scatterplot(x = X[failed[:, 0], 1],\n", + " y = X[failed[:, 0], 2],\n", + " marker = \"X\",\n", + " color = \"red\",\n", + " s = 60)\n", + "\n", + "ax.legend([\"Passed\", \"Failed\"])\n", + "ax.set(xlabel=\"DMV Written Test 1 Scores\", ylabel=\"DMV Written Test 2 Scores\")\n", + "\n", + "x_boundary = np.array([np.min(X[:, 1]), np.max(X[:, 1])])\n", + "y_boundary = -(theta[0] + theta[1] * x_boundary) / theta[2]\n", + "\n", + "sns.lineplot(x = x_boundary, y = y_boundary, color=\"blue\")\n", + "plt.show();" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 5418acc83b275ff4c872bc8c6863a1ac6dc0caec Mon Sep 17 00:00:00 2001 From: Opeyemi Osakuade <59209191+opeyemiferanmi1@users.noreply.github.com> Date: Wed, 22 Apr 2020 23:30:45 +0100 Subject: [PATCH 5/5] Update README.md --- Opeyemi Osakuade/README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Opeyemi Osakuade/README.md b/Opeyemi Osakuade/README.md index c231d3b..c9e7f94 100644 --- a/Opeyemi Osakuade/README.md +++ b/Opeyemi Osakuade/README.md @@ -15,9 +15,7 @@ Taking the log, log odds for the model turns out to be the equation of the *Sigm Since the logistic regression function(sigmoid) is *non linear*, to get a *convex function*, i.e a bowl-shaped function that eases the gradient descent function's work to converge to the optimal minimum point,a logistic regression cost function is derived ### Gradient descent -To choose the values of weights that corresponds to a convex function and fits the data well(so we reach a global minimum), ensure that - -the prediction(h) is at least close to the actual *y*, minimize the cost function using gradient descent. +To choose the values of weights that corresponds to a convex function and fits the data well(so we reach a global minimum), ensure that the prediction(h) is at least close to the actual *y*, minimize the cost function using gradient descent. Repeat until convergence, updating all weights.