|
6 | 6 | "source": [
|
7 | 7 | "# Logistic Regression\n",
|
8 | 8 | "\n",
|
9 |
| - "Logistic regression is a classification method. The main goal is learning a function that returns a yes or no answer\n", |
10 |
| - "when presented as input a so-called feature vector. \n", |
| 9 | + "Logistic regression is a classification method. Its main goal is learning a function that __returns a yes or no answer__\n", |
| 10 | + "when presented as input a so-called __feature__ vector. \n", |
11 | 11 | "\n",
|
12 | 12 | "As an example, suppose we are given a dataset, such as the one below:\n",
|
13 | 13 | "\n",
|
|
94 | 94 | "\\end{eqnarray}"
|
95 | 95 | ]
|
96 | 96 | },
|
97 |
| - { |
98 |
| - "cell_type": "code", |
99 |
| - "execution_count": 1, |
100 |
| - "metadata": { |
101 |
| - "collapsed": true, |
102 |
| - "scrolled": true |
103 |
| - }, |
104 |
| - "outputs": [], |
105 |
| - "source": [ |
106 |
| - "%matplotlib inline\n", |
107 |
| - "import numpy as np\n", |
108 |
| - "import matplotlib as mpl\n", |
109 |
| - "import matplotlib.pylab as plt\n" |
110 |
| - ] |
111 |
| - }, |
112 | 97 | {
|
113 | 98 | "cell_type": "markdown",
|
114 | 99 | "metadata": {},
|
|
184 | 169 | "\n"
|
185 | 170 | ]
|
186 | 171 | },
|
| 172 | + { |
| 173 | + "cell_type": "code", |
| 174 | + "execution_count": 153, |
| 175 | + "metadata": { |
| 176 | + "collapsed": true |
| 177 | + }, |
| 178 | + "outputs": [], |
| 179 | + "source": [ |
| 180 | + "%matplotlib inline\n", |
| 181 | + "import numpy as np\n", |
| 182 | + "import matplotlib as mpl\n", |
| 183 | + "import matplotlib.pylab as plt\n", |
| 184 | + "\n", |
| 185 | + "from ipywidgets import interact, interactive, fixed\n", |
| 186 | + "import ipywidgets as widgets\n", |
| 187 | + "from IPython.display import clear_output, display, HTML\n", |
| 188 | + "from matplotlib import rc\n", |
| 189 | + "\n", |
| 190 | + "import scipy as sc\n", |
| 191 | + "import scipy.optimize as opt\n", |
| 192 | + "\n", |
| 193 | + "mpl.rc('font',**{'size': 26, 'family':'sans-serif','sans-serif':['Helvetica']})\n", |
| 194 | + "mpl.rc('text', usetex=True)\n" |
| 195 | + ] |
| 196 | + }, |
| 197 | + { |
| 198 | + "cell_type": "code", |
| 199 | + "execution_count": 155, |
| 200 | + "metadata": {}, |
| 201 | + "outputs": [], |
| 202 | + "source": [ |
| 203 | + "\n", |
| 204 | + "def sigmoid(x):\n", |
| 205 | + " return 1/(1+np.exp(-x))\n", |
| 206 | + "\n", |
| 207 | + "def dsigmoid(x):\n", |
| 208 | + " s = sigmoid(x)\n", |
| 209 | + " return s*(1-s)\n", |
| 210 | + "\n", |
| 211 | + "def inv_sigmoid(p=0.5):\n", |
| 212 | + " xs = opt.bisect(lambda x: sigmoid(x)-p, a=-100, b=100)\n", |
| 213 | + " return xs\n", |
| 214 | + "\n", |
| 215 | + "def inv_sigmoid1D(w, b, p=0.5):\n", |
| 216 | + " xs = opt.bisect(lambda x: sigmoid(w*x+b)-p, a=-100, b=100)\n", |
| 217 | + " return xs\n", |
| 218 | + " " |
| 219 | + ] |
| 220 | + }, |
| 221 | + { |
| 222 | + "cell_type": "markdown", |
| 223 | + "metadata": {}, |
| 224 | + "source": [ |
| 225 | + "### Plotting the Sigmoid" |
| 226 | + ] |
| 227 | + }, |
| 228 | + { |
| 229 | + "cell_type": "code", |
| 230 | + "execution_count": 158, |
| 231 | + "metadata": {}, |
| 232 | + "outputs": [ |
| 233 | + { |
| 234 | + "data": { |
| 235 | + "application/vnd.jupyter.widget-view+json": { |
| 236 | + "model_id": "60ca092bd27947bb9d636bedf46d5c61", |
| 237 | + "version_major": 2, |
| 238 | + "version_minor": 0 |
| 239 | + }, |
| 240 | + "text/html": [ |
| 241 | + "<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\n", |
| 242 | + "<p>\n", |
| 243 | + " If you're reading this message in Jupyter Notebook or JupyterLab, it may mean\n", |
| 244 | + " that the widgets JavaScript is still loading. If this message persists, it\n", |
| 245 | + " likely means that the widgets JavaScript library is either not installed or\n", |
| 246 | + " not enabled. See the <a href=\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\">Jupyter\n", |
| 247 | + " Widgets Documentation</a> for setup instructions.\n", |
| 248 | + "</p>\n", |
| 249 | + "<p>\n", |
| 250 | + " If you're reading this message in another notebook frontend (for example, a static\n", |
| 251 | + " rendering on GitHub or <a href=\"https://nbviewer.jupyter.org/\">NBViewer</a>),\n", |
| 252 | + " it may mean that your frontend doesn't currently support widgets.\n", |
| 253 | + "</p>\n" |
| 254 | + ], |
| 255 | + "text/plain": [ |
| 256 | + "interactive(children=(FloatSlider(value=0.0, description='w', max=3.0, min=-3.0), FloatSlider(value=0.0, description='b', max=10.0, min=-10.0), Output()), _dom_classes=('widget-interact',))" |
| 257 | + ] |
| 258 | + }, |
| 259 | + "metadata": {}, |
| 260 | + "output_type": "display_data" |
| 261 | + } |
| 262 | + ], |
| 263 | + "source": [ |
| 264 | + " \n", |
| 265 | + "fig = plt.figure(figsize=(10,6))\n", |
| 266 | + "ax = fig.gca()\n", |
| 267 | + "ax.set_ylim([-0.1,1.1])\n", |
| 268 | + "x = np.linspace(-10,10,100)\n", |
| 269 | + "ax.set_xlim([-10,10])\n", |
| 270 | + "\n", |
| 271 | + "ln = plt.Line2D(x, sigmoid(x))\n", |
| 272 | + "ln2 = plt.axvline([0], ls= ':', color='k')\n", |
| 273 | + "ln_left = plt.axvline([0], ls= ':', color='b')\n", |
| 274 | + "ln_right = plt.axvline([0], ls= ':', color='r')\n", |
| 275 | + "\n", |
| 276 | + "ax.add_line(ln)\n", |
| 277 | + "plt.close(fig)\n", |
| 278 | + "ax.set_xlabel('$x$')\n", |
| 279 | + "ax.set_ylabel('$\\sigma(wx + b)$')\n", |
| 280 | + "\n", |
| 281 | + "def plot_fun(w, b):\n", |
| 282 | + " ln.set_ydata(sigmoid(w*x+b))\n", |
| 283 | + " if np.abs(w)>0.00001:\n", |
| 284 | + " ln2.set_xdata(inv_sigmoid1D(w,b,0.5))\n", |
| 285 | + " ln_left.set_xdata(inv_sigmoid1D(w,b,0.25))\n", |
| 286 | + " ln_right.set_xdata(inv_sigmoid1D(w,b,0.75))\n", |
| 287 | + " display(fig)\n", |
| 288 | + " \n", |
| 289 | + "res = interact(plot_fun, w=(-3, 3, 0.1), b=(-10.0,10.0,0.1)) " |
| 290 | + ] |
| 291 | + }, |
| 292 | + { |
| 293 | + "cell_type": "code", |
| 294 | + "execution_count": 157, |
| 295 | + "metadata": { |
| 296 | + "scrolled": true |
| 297 | + }, |
| 298 | + "outputs": [ |
| 299 | + { |
| 300 | + "data": { |
| 301 | + "application/vnd.jupyter.widget-view+json": { |
| 302 | + "model_id": "338bb9459a3a4a5993f8821def86ef1e", |
| 303 | + "version_major": 2, |
| 304 | + "version_minor": 0 |
| 305 | + }, |
| 306 | + "text/html": [ |
| 307 | + "<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\n", |
| 308 | + "<p>\n", |
| 309 | + " If you're reading this message in Jupyter Notebook or JupyterLab, it may mean\n", |
| 310 | + " that the widgets JavaScript is still loading. If this message persists, it\n", |
| 311 | + " likely means that the widgets JavaScript library is either not installed or\n", |
| 312 | + " not enabled. See the <a href=\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\">Jupyter\n", |
| 313 | + " Widgets Documentation</a> for setup instructions.\n", |
| 314 | + "</p>\n", |
| 315 | + "<p>\n", |
| 316 | + " If you're reading this message in another notebook frontend (for example, a static\n", |
| 317 | + " rendering on GitHub or <a href=\"https://nbviewer.jupyter.org/\">NBViewer</a>),\n", |
| 318 | + " it may mean that your frontend doesn't currently support widgets.\n", |
| 319 | + "</p>\n" |
| 320 | + ], |
| 321 | + "text/plain": [ |
| 322 | + "interactive(children=(FloatSlider(value=-0.2999999999999998, description='w0', max=3.0, min=-3.5), FloatSlider(value=0.5, description='w1', max=4.0, min=-3.0), FloatSlider(value=0.5, description='w2', max=4.0, min=-3.0), Output()), _dom_classes=('widget-interact',))" |
| 323 | + ] |
| 324 | + }, |
| 325 | + "metadata": {}, |
| 326 | + "output_type": "display_data" |
| 327 | + } |
| 328 | + ], |
| 329 | + "source": [ |
| 330 | + "xl = -5.\n", |
| 331 | + "xr = 5.\n", |
| 332 | + "yl = -5.\n", |
| 333 | + "yr = 5.\n", |
| 334 | + "\n", |
| 335 | + "w = np.array([0.5, 2, 3])\n", |
| 336 | + "\n", |
| 337 | + "fig = plt.figure(figsize=(5,5))\n", |
| 338 | + "ax = fig.gca()\n", |
| 339 | + "ax.set_ylim([yl, yr])\n", |
| 340 | + "ax.set_xlim([xl, xr])\n", |
| 341 | + "ln = plt.Line2D([],[],color='k')\n", |
| 342 | + "ln_left = plt.Line2D([],[],ls= ':', color='b')\n", |
| 343 | + "ln_right = plt.Line2D([],[],ls= ':', color='r')\n", |
| 344 | + "\n", |
| 345 | + "ax.add_line(ln)\n", |
| 346 | + "ax.add_line(ln_left)\n", |
| 347 | + "ax.add_line(ln_right)\n", |
| 348 | + "plt.close(fig)\n", |
| 349 | + "ax.set_xlabel('$x_1$')\n", |
| 350 | + "#ax.grid(xdata=np.linspace(xl,xr,0.1))\n", |
| 351 | + "#ax.grid(ydata=np.linspace(yl,yr,0.1))\n", |
| 352 | + "ax.set_ylabel('$x_2$')\n", |
| 353 | + "\n", |
| 354 | + "ax.grid(True)\n", |
| 355 | + "def plot_boundry(w0,w1,w2):\n", |
| 356 | + " if w1 != 0:\n", |
| 357 | + " xa = -(w0+w2*yl)/w1\n", |
| 358 | + " xb = -(w0+w2*yr)/w1\n", |
| 359 | + " ln.set_xdata([xa, xb])\n", |
| 360 | + " ln.set_ydata([yl, yr])\n", |
| 361 | + "\n", |
| 362 | + " xa = -(-inv_sigmoid(0.25) + w0+w2*yl)/w1\n", |
| 363 | + " xb = -(-inv_sigmoid(0.25) + w0+w2*yr)/w1\n", |
| 364 | + " ln_left.set_xdata([xa, xb])\n", |
| 365 | + " ln_left.set_ydata([yl, yr])\n", |
| 366 | + "\n", |
| 367 | + " xa = -(-inv_sigmoid(0.75) + w0+w2*yl)/w1\n", |
| 368 | + " xb = -(-inv_sigmoid(0.75) + w0+w2*yr)/w1\n", |
| 369 | + " ln_right.set_xdata([xa, xb])\n", |
| 370 | + " ln_right.set_ydata([yl, yr])\n", |
| 371 | + " \n", |
| 372 | + " \n", |
| 373 | + " elif w2!=0:\n", |
| 374 | + " ya = -(w0+w1*xl)/w2\n", |
| 375 | + " yb = -(w0+w1*xr)/w2\n", |
| 376 | + " ln.set_xdata([xl, xr])\n", |
| 377 | + " ln.set_ydata([ya, yb])\n", |
| 378 | + "\n", |
| 379 | + " ya = -(-inv_sigmoid(0.25) + w0+w1*xl)/w2\n", |
| 380 | + " yb = -(-inv_sigmoid(0.25) + w0+w1*xr)/w2\n", |
| 381 | + " ln_left.set_xdata([xl, xr])\n", |
| 382 | + " ln_left.set_ydata([ya, yb])\n", |
| 383 | + "\n", |
| 384 | + " ya = -(-inv_sigmoid(0.75) + w0+w1*xl)/w2\n", |
| 385 | + " yb = -(-inv_sigmoid(0.75) + w0+w1*xr)/w2\n", |
| 386 | + " ln_right.set_xdata([xl, xr])\n", |
| 387 | + " ln_right.set_ydata([ya, yb]) \n", |
| 388 | + " \n", |
| 389 | + " else:\n", |
| 390 | + " ln.set_xdata([])\n", |
| 391 | + " ln.set_ydata([])\n", |
| 392 | + " \n", |
| 393 | + " display(fig)\n", |
| 394 | + "\n", |
| 395 | + "res = interact(plot_boundry, w0=(-3.5, 3, 0.1), w1=(-3.,4,0.1), w2=(-3.,4,0.1)) " |
| 396 | + ] |
| 397 | + }, |
187 | 398 | {
|
188 | 399 | "cell_type": "markdown",
|
189 | 400 | "metadata": {},
|
|
483 | 694 | },
|
484 | 695 | {
|
485 | 696 | "cell_type": "code",
|
486 |
| - "execution_count": 52, |
| 697 | + "execution_count": 165, |
487 | 698 | "metadata": {
|
488 | 699 | "collapsed": true
|
489 | 700 | },
|
|
494 | 705 | "def sigmoid(t):\n",
|
495 | 706 | " return np.exp(t)/(1+np.exp(t))\n",
|
496 | 707 | "\n",
|
497 |
| - "D = 5\n", |
498 |
| - "N = 200\n", |
| 708 | + "D = 3\n", |
| 709 | + "N = 100\n", |
499 | 710 | "\n",
|
500 | 711 | "# Some random features\n",
|
501 | 712 | "X = np.random.randn(N,D)\n",
|
| 713 | + "X[:,0] = 1\n", |
502 | 714 | "\n",
|
503 | 715 | "# Generate a random paramater vector\n",
|
504 | 716 | "w_true = np.random.randn(D,1)\n",
|
505 | 717 | "\n",
|
506 | 718 | "# Generate class labels\n",
|
507 | 719 | "pi = sigmoid(np.dot(X, w_true))\n",
|
508 |
| - "y = np.array([1 if u else 0 for u in np.random.rand(N,1) < pi]).reshape((N,1))\n" |
| 720 | + "y = np.array([1 if u else 0 for u in np.random.rand(N,1) < pi]).reshape((N))\n" |
| 721 | + ] |
| 722 | + }, |
| 723 | + { |
| 724 | + "cell_type": "code", |
| 725 | + "execution_count": 168, |
| 726 | + "metadata": { |
| 727 | + "scrolled": true |
| 728 | + }, |
| 729 | + "outputs": [ |
| 730 | + { |
| 731 | + "data": { |
| 732 | + "image/png": "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\nxBbhUivRL14AAAAASUVORK5CYII=\n", |
| 733 | + "text/plain": [ |
| 734 | + "<matplotlib.figure.Figure at 0x11d3cf518>" |
| 735 | + ] |
| 736 | + }, |
| 737 | + "metadata": {}, |
| 738 | + "output_type": "display_data" |
| 739 | + } |
| 740 | + ], |
| 741 | + "source": [ |
| 742 | + "plt.plot(X[y==1,1],X[y==1,2],'xb')\n", |
| 743 | + "plt.plot(X[y==0,1],X[y==0,2],'or')\n", |
| 744 | + "plt.show()\n", |
| 745 | + "\n" |
509 | 746 | ]
|
510 | 747 | },
|
511 | 748 | {
|
|
573 | 810 | }
|
574 | 811 | ],
|
575 | 812 | "source": [
|
| 813 | + "\n", |
| 814 | + "\n", |
576 | 815 | "# Implement Gradient Descent\n",
|
577 | 816 | "w = np.random.randn(D,1)\n",
|
578 | 817 | "\n",
|
|
588 | 827 | "print(w_true.T)\n"
|
589 | 828 | ]
|
590 | 829 | },
|
591 |
| - { |
592 |
| - "cell_type": "code", |
593 |
| - "execution_count": 34, |
594 |
| - "metadata": {}, |
595 |
| - "outputs": [ |
596 |
| - { |
597 |
| - "data": { |
598 |
| - "text/plain": [ |
599 |
| - "array([[1],\n", |
600 |
| - " [1],\n", |
601 |
| - " [0],\n", |
602 |
| - " [1],\n", |
603 |
| - " [1],\n", |
604 |
| - " [1],\n", |
605 |
| - " [1],\n", |
606 |
| - " [0],\n", |
607 |
| - " [1],\n", |
608 |
| - " [0],\n", |
609 |
| - " [1],\n", |
610 |
| - " [1],\n", |
611 |
| - " [0],\n", |
612 |
| - " [0],\n", |
613 |
| - " [0],\n", |
614 |
| - " [1],\n", |
615 |
| - " [1],\n", |
616 |
| - " [1],\n", |
617 |
| - " [0],\n", |
618 |
| - " [0]])" |
619 |
| - ] |
620 |
| - }, |
621 |
| - "execution_count": 34, |
622 |
| - "metadata": {}, |
623 |
| - "output_type": "execute_result" |
624 |
| - } |
625 |
| - ], |
626 |
| - "source": [ |
627 |
| - "y.reshape((N,1))" |
628 |
| - ] |
629 |
| - }, |
630 | 830 | {
|
631 | 831 | "cell_type": "markdown",
|
632 | 832 | "metadata": {},
|
|
656 | 856 | },
|
657 | 857 | {
|
658 | 858 | "cell_type": "code",
|
659 |
| - "execution_count": 1, |
| 859 | + "execution_count": 152, |
660 | 860 | "metadata": {},
|
661 | 861 | "outputs": [
|
662 | 862 | {
|
663 |
| - "name": "stderr", |
664 |
| - "output_type": "stream", |
665 |
| - "text": [ |
666 |
| - "/Users/cemgil/anaconda/lib/python2.7/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n", |
667 |
| - " warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n" |
| 863 | + "ename": "ModuleNotFoundError", |
| 864 | + "evalue": "No module named 'cvxpy'", |
| 865 | + "output_type": "error", |
| 866 | + "traceback": [ |
| 867 | + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", |
| 868 | + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", |
| 869 | + "\u001b[0;32m<ipython-input-152-53c98774130d>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mget_ipython\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmagic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'matplotlib inline'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mcvxpy\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mmpl\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpylab\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", |
| 870 | + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'cvxpy'" |
668 | 871 | ]
|
669 | 872 | }
|
670 | 873 | ],
|
|
1486 | 1689 | ],
|
1487 | 1690 | "metadata": {
|
1488 | 1691 | "kernelspec": {
|
1489 |
| - "display_name": "Python 2", |
| 1692 | + "display_name": "Python [conda root]", |
1490 | 1693 | "language": "python",
|
1491 |
| - "name": "python2" |
| 1694 | + "name": "conda-root-py" |
1492 | 1695 | },
|
1493 | 1696 | "language_info": {
|
1494 | 1697 | "codemirror_mode": {
|
1495 | 1698 | "name": "ipython",
|
1496 |
| - "version": 2 |
| 1699 | + "version": 3 |
1497 | 1700 | },
|
1498 | 1701 | "file_extension": ".py",
|
1499 | 1702 | "mimetype": "text/x-python",
|
1500 | 1703 | "name": "python",
|
1501 | 1704 | "nbconvert_exporter": "python",
|
1502 |
| - "pygments_lexer": "ipython2", |
1503 |
| - "version": "2.7.13" |
| 1705 | + "pygments_lexer": "ipython3", |
| 1706 | + "version": "3.6.1" |
| 1707 | + }, |
| 1708 | + "toc": { |
| 1709 | + "nav_menu": {}, |
| 1710 | + "number_sections": true, |
| 1711 | + "sideBar": true, |
| 1712 | + "skip_h1_title": false, |
| 1713 | + "toc_cell": false, |
| 1714 | + "toc_position": {}, |
| 1715 | + "toc_section_display": "block", |
| 1716 | + "toc_window_display": false |
1504 | 1717 | }
|
1505 | 1718 | },
|
1506 | 1719 | "nbformat": 4,
|
|
0 commit comments