{ "cells": [ { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy.optimize import minimize" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "data = np.array(pd.read_csv(\"ex2data1.txt\",sep=\",\",header=None))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def plotData(data, label_x, label_y, label_pos, label_neg, axes=None):\n", " # Get indexes for class 0 and class 1\n", " neg = data[:,2] == 0\n", " pos = data[:,2] == 1\n", " \n", " # If no specific axes object has been passed, get the current axes.\n", " if axes == None:\n", " axes = plt.gca()\n", " axes.scatter(data[pos][:,0], data[pos][:,1], marker='+', c='k', s=60, linewidth=2, label=label_pos)\n", " axes.scatter(data[neg][:,0], data[neg][:,1], c='y', s=60, label=label_neg)\n", " axes.set_xlabel(label_x)\n", " axes.set_ylabel(label_y)\n", " axes.legend(frameon= True, fancybox = True);\n" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "pt = plt.figure()\n", "plotData(data,\"Nota 1\",\"Nota 2\",\"Aprovado\",\"Reprovado\",pt.gca())" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "pt.savefig(\"curso.png\")" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "def sigmoid(z):\n", " return(1 / (1 + np.exp(-z)))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def costFunction(theta, X, y):\n", " m = y.size\n", " h = sigmoid(X.dot(theta))\n", " \n", " J = -1*(1/m)*(np.log(h).T.dot(y)+np.log(1-h).T.dot(1-y))\n", " \n", " if np.isnan(J[0]):\n", " return(np.inf)\n", " return(J[0])" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "def gradient(theta, X, y):\n", " m = y.size\n", " h = sigmoid(X.dot(theta.reshape(-1,1)))\n", " \n", " grad =(1/m)*X.T.dot(h-y)\n", "\n", " return(grad.flatten())" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "def predict(theta, X, threshold=0.5):\n", " p = sigmoid(X.dot(theta.T)) >= threshold\n", " return(p.astype('int'))" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cost: \n", " 0.6931471805599453\n", "Grad: \n", " [ -0.1 -12.00921659 -11.26284221]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/ronaldoprati/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in log\n", " \"\"\"\n", "/home/ronaldoprati/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in log\n", " \"\"\"\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "from scipy.optimize import minimize\n", "\n", "data = np.array(pd.read_csv(\"ex2data1.txt\",sep=\",\",header=None))\n", "\n", "X = np.c_[np.ones((data.shape[0],1)), data[:,0:2]]\n", "y = np.c_[data[:,2]]\n", "initial_theta = np.zeros(X.shape[1])\n", "cost = costFunction(initial_theta, X, y)\n", "grad = gradient(initial_theta, X, y)\n", "print('Cost: \\n', cost)\n", "print('Grad: \\n', grad)\n", "res = minimize(costFunction, initial_theta, args=(X,y), method=None, jac=gradient, options={'maxiter':400})\n", "\n" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.scatter(35, 90, s=60, c='r', marker='v', label='(45, 85)')\n", "plotData(data, \"Nota 1\",\"Nota 2\",\"Aprovado\",\"Reprovado\")\n", "x1_min, x1_max = X[:,1].min(), X[:,1].max(),\n", "x2_min, x2_max = X[:,2].min(), X[:,2].max(),\n", "xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))\n", "h = sigmoid(np.c_[np.ones((xx1.ravel().shape[0],1)), xx1.ravel(), xx2.ravel(), xx1.ravel()**2, xx2.ravel()**2].dot(res.x))\n", "h = h.reshape(xx1.shape)\n", "plt.contour(xx1, xx2, h, [0.5], linewidths=1, colors='b');\n", "plt.savefig(\"quad.png\")" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[30.05882245, 31.48268031, 32.90653818, ..., 96.98014207,\n", " 98.40399993, 99.8278578 ],\n", " [30.05882245, 31.48268031, 32.90653818, ..., 96.98014207,\n", " 98.40399993, 99.8278578 ],\n", " [30.05882245, 31.48268031, 32.90653818, ..., 96.98014207,\n", " 98.40399993, 99.8278578 ],\n", " ...,\n", " [30.05882245, 31.48268031, 32.90653818, ..., 96.98014207,\n", " 98.40399993, 99.8278578 ],\n", " [30.05882245, 31.48268031, 32.90653818, ..., 96.98014207,\n", " 98.40399993, 99.8278578 ],\n", " [30.05882245, 31.48268031, 32.90653818, ..., 96.98014207,\n", " 98.40399993, 99.8278578 ]])" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cost: \n", " 0.6931471805599453\n", "Grad: \n", " [-1.00000000e-01 -1.20092166e+01 -1.12628422e+01 -1.13895134e+03\n", " -1.06939408e+03]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/ronaldoprati/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in log\n", " \"\"\"\n", "/home/ronaldoprati/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in log\n", " \"\"\"\n", "/home/ronaldoprati/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in log\n", " \"\"\"\n", "/home/ronaldoprati/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in log\n", " \"\"\"\n", "/home/ronaldoprati/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in log\n", " \"\"\"\n", "/home/ronaldoprati/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in log\n", " \"\"\"\n", "/home/ronaldoprati/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in log\n", " \"\"\"\n", "/home/ronaldoprati/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in log\n", " \"\"\"\n" ] } ], "source": [ "X = np.c_[np.ones((data.shape[0],1)), data[:,0:2], data[:,0:2]**2 ]\n", "y = np.c_[data[:,2]]\n", "initial_theta = np.zeros(X.shape[1])\n", "cost = costFunction(initial_theta, X, y)\n", "grad = gradient(initial_theta, X, y)\n", "print('Cost: \\n', cost)\n", "print('Grad: \\n', grad)\n", "res = minimize(costFunction, initial_theta, args=(X,y), method=None, jac=gradient, options={'maxiter':400})\n" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "data = np.array(pd.read_csv(\"ex2data2.txt\",sep=\",\",header=None))" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "pt = plt.figure()\n", "plotData(data,'Microchip Teste 1', 'Microchip Teste 2', 'y = 1', 'y = 0',pt.gca())\n", "pt.savefig(\"microchip.png\")" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'PolynomialFeatures' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpoly\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mPolynomialFeatures\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mXX\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpoly\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit_transform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata2\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mXX\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mNameError\u001b[0m: name 'PolynomialFeatures' is not defined" ] } ], "source": [ "poly = PolynomialFeatures(6)\n", "XX = poly.fit_transform(data2[:,0:2])\n", "XX.shape" ] }, { "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.6.8" } }, "nbformat": 4, "nbformat_minor": 2 }