{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Week 5: Introduction to neural Networks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solutions
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Perceptron learning rule" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This week, we will start working with neural networks. For each of the exercises below you can use the method of your choice but you should display the final boundary of your classifier." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Exercise 1. \n", "As a first exercise, load the binary dataset below and code a few steps of the perceptron learning rule. " ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "2\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "3\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "4\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "5\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "6\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "7\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "8\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "9\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "10\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "11\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "12\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "13\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "14\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "15\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "16\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "17\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "18\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "19\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "20\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "21\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "22\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "23\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "24\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "25\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "26\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "27\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "28\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "29\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "30\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "31\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "32\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "33\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "34\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "35\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "36\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "37\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "38\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "39\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "40\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "41\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "42\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "43\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "44\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "45\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "46\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "47\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "48\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "49\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "50\n", "gradient\n", "[ 22. 372.75345622 793.64963504]\n", "norm of gradient\n", "877.1025494880358\n", "[372.75345622 793.64963504]\n", "51\n", "gradient\n", "[ 21. 345.01728111 790.69343066]\n", "norm of gradient\n", "862.9449724900206\n", "[345.01728111 790.69343066]\n", "52\n", "gradient\n", "[ 20. 327.07373272 787.88321168]\n", "norm of gradient\n", "853.3095463429563\n", "[327.07373272 787.88321168]\n", "53\n", "gradient\n", "[ 20. 327.07373272 787.88321168]\n", "norm of gradient\n", "853.3095463429563\n", "[327.07373272 787.88321168]\n", "54\n", "gradient\n", "[ 19. 293.23156682 783.46715328]\n", "norm of gradient\n", "836.7595425544075\n", "[293.23156682 783.46715328]\n", "55\n", "gradient\n", "[ 19. 293.23156682 783.46715328]\n", "norm of gradient\n", "836.7595425544075\n", "[293.23156682 783.46715328]\n", "56\n", "gradient\n", "[ 19. 293.23156682 783.46715328]\n", "norm of gradient\n", "836.7595425544075\n", "[293.23156682 783.46715328]\n", "57\n", "gradient\n", "[ 18. 253.28341014 776.86131387]\n", "norm of gradient\n", "817.3065439826896\n", "[253.28341014 776.86131387]\n", "58\n", "gradient\n", "[ 18. 253.28341014 776.86131387]\n", "norm of gradient\n", "817.3065439826896\n", "[253.28341014 776.86131387]\n", "59\n", "gradient\n", "[ 18. 253.28341014 776.86131387]\n", "norm of gradient\n", "817.3065439826896\n", "[253.28341014 776.86131387]\n", "60\n", "gradient\n", "[ 17. 214.25691244 768.50364964]\n", "norm of gradient\n", "797.9930350771989\n", "[214.25691244 768.50364964]\n", "61\n", "gradient\n", "[ 16. 192.62672811 761.89781022]\n", "norm of gradient\n", "786.0339239492583\n", "[192.62672811 761.89781022]\n", "62\n", "gradient\n", "[ 16. 192.62672811 761.89781022]\n", "norm of gradient\n", "786.0339239492583\n", "[192.62672811 761.89781022]\n", "63\n", "gradient\n", "[ 14. 110.65668203 739.34306569]\n", "norm of gradient\n", "747.7092149133439\n", "[110.65668203 739.34306569]\n", "64\n", "gradient\n", "[ 12. 41.359447 717.08029197]\n", "norm of gradient\n", "718.372291356967\n", "[ 41.359447 717.08029197]\n", "65\n", "gradient\n", "[ 10. -15.72580645 696.71532847]\n", "norm of gradient\n", "696.9645255747577\n", "[-15.72580645 696.71532847]\n", "66\n", "gradient\n", "[ 10. -15.72580645 696.71532847]\n", "norm of gradient\n", "696.9645255747577\n", "[-15.72580645 696.71532847]\n", "67\n", "gradient\n", "[ 10. -15.72580645 696.71532847]\n", "norm of gradient\n", "696.9645255747577\n", "[-15.72580645 696.71532847]\n", "68\n", "gradient\n", "[ 10. -15.72580645 696.71532847]\n", "norm of gradient\n", "696.9645255747577\n", "[-15.72580645 696.71532847]\n", "69\n", "gradient\n", "[ 9. -28.25460829 688.94160584]\n", "norm of gradient\n", "689.5794799343245\n", "[-28.25460829 688.94160584]\n", "70\n", "gradient\n", "[ 9. -28.25460829 688.94160584]\n", "norm of gradient\n", "689.5794799343245\n", "[-28.25460829 688.94160584]\n", "71\n", "gradient\n", "[ 8. -71.42857143 671.09489051]\n", "norm of gradient\n", "674.9328802823502\n", "[-71.42857143 671.09489051]\n", "72\n", "gradient\n", "[ 6. -130.5875576 641.38686131]\n", "norm of gradient\n", "654.5733083978846\n", "[-130.5875576 641.38686131]\n", "73\n", "gradient\n", "[ 3. -228.54262673 592.66423358]\n", "norm of gradient\n", "635.209907032922\n", "[-228.54262673 592.66423358]\n", "74\n", "gradient\n", "[ 3. -228.54262673 592.66423358]\n", "norm of gradient\n", "635.209907032922\n", "[-228.54262673 592.66423358]\n", "75\n", "gradient\n", "[ 3. -228.54262673 592.66423358]\n", "norm of gradient\n", "635.209907032922\n", "[-228.54262673 592.66423358]\n", "76\n", "gradient\n", "[ 3. -228.54262673 592.66423358]\n", "norm of gradient\n", "635.209907032922\n", "[-228.54262673 592.66423358]\n", "77\n", "gradient\n", "[ 3. -228.54262673 592.66423358]\n", "norm of gradient\n", "635.209907032922\n", "[-228.54262673 592.66423358]\n", "78\n", "gradient\n", "[ 2. -257.89170507 574.81751825]\n", "norm of gradient\n", "630.0216748878181\n", "[-257.89170507 574.81751825]\n", "79\n", "gradient\n", "[ 2. -257.89170507 574.81751825]\n", "norm of gradient\n", "630.0216748878181\n", "[-257.89170507 574.81751825]\n", "80\n", "gradient\n", "[ 2. -257.89170507 574.81751825]\n", "norm of gradient\n", "630.0216748878181\n", "[-257.89170507 574.81751825]\n", "81\n", "gradient\n", "[ 1. -263.39285714 560.91240876]\n", "norm of gradient\n", "619.6769541413013\n", "[-263.39285714 560.91240876]\n", "82\n", "gradient\n", "[ 0. -287.32718894 541.60583942]\n", "norm of gradient\n", "613.1017850192484\n", "[-287.32718894 541.60583942]\n", "83\n", "gradient\n", "[ -2. -300.63364055 505.62043796]\n", "norm of gradient\n", "588.2487680490048\n", "[-300.63364055 505.62043796]\n", "84\n", "gradient\n", "[ -4. -359.10138249 459.41605839]\n", "norm of gradient\n", "583.1234154238397\n", "[-359.10138249 459.41605839]\n", "85\n", "gradient\n", "[ -6. -390.61059908 410.87591241]\n", "norm of gradient\n", "566.94942941154\n", "[-390.61059908 410.87591241]\n", "86\n", "gradient\n", "[ -4. -250.69124424 425.10948905]\n", "norm of gradient\n", "493.5384256769653\n", "[-250.69124424 425.10948905]\n", "87\n", "gradient\n", "[ -8. -215.43778802 191.97080292]\n", "norm of gradient\n", "288.6697588593456\n", "[-215.43778802 191.97080292]\n", "88\n", "gradient\n", "[ -4. -34.33179724 150.3649635 ]\n", "norm of gradient\n", "154.28640429681616\n", "[-34.33179724 150.3649635 ]\n", "89\n", "gradient\n", "[ -13. -316.33064516 -163.39416058]\n", "norm of gradient\n", "356.2747939176852\n", "[-316.33064516 -163.39416058]\n", "90\n", "gradient\n", "[ 1. 98.58870968 219.30656934]\n", "norm of gradient\n", "240.44979732343998\n", "[ 98.58870968 219.30656934]\n", "91\n", "gradient\n", "[ -11. -255.78917051 -144.19708029]\n", "norm of gradient\n", "293.8399185157514\n", "[-255.78917051 -144.19708029]\n", "92\n", "gradient\n", "[ 3. 141.96428571 238.21167883]\n", "norm of gradient\n", "277.32230770419983\n", "[141.96428571 238.21167883]\n", "93\n", "gradient\n", "[ -10. -228.05299539 -134.52554745]\n", "norm of gradient\n", "264.96281177285\n", "[-228.05299539 -134.52554745]\n", "94\n", "gradient\n", "[ 3. 141.96428571 238.21167883]\n", "norm of gradient\n", "277.32230770419983\n", "[141.96428571 238.21167883]\n", "95\n", "gradient\n", "[ -9. -198.70391705 -116.67883212]\n", "norm of gradient\n", "230.60398200253536\n", "[-198.70391705 -116.67883212]\n", "96\n", "gradient\n", "[ 4. 159.9078341 241.02189781]\n", "norm of gradient\n", "289.27162085319554\n", "[159.9078341 241.02189781]\n", "97\n", "gradient\n", "[ -8. -168.20276498 -93.43065693]\n", "norm of gradient\n", "192.57584947513544\n", "[-168.20276498 -93.43065693]\n", "98\n", "gradient\n", "[ 3. 132.40207373 197.48175182]\n", "norm of gradient\n", "237.77794563946242\n", "[132.40207373 197.48175182]\n", "99\n", "gradient\n", "[ -6. -121.02534562 -72.77372263]\n", "norm of gradient\n", "141.34761755350667\n", "[-121.02534562 -72.77372263]\n", "100\n", "gradient\n", "[ 2. 102.24654378 151.16788321]\n", "norm of gradient\n", "182.51050553162744\n", "[102.24654378 151.16788321]\n", "101\n", "gradient\n", "[ -6. -121.02534562 -72.77372263]\n", "norm of gradient\n", "141.34761755350667\n", "[-121.02534562 -72.77372263]\n", "102\n", "gradient\n", "[ 1. 74.04953917 112.15328467]\n", "norm of gradient\n", "134.3975204904403\n", "[ 74.04953917 112.15328467]\n", "103\n", "gradient\n", "[ -5. -103.08179724 -69.96350365]\n", "norm of gradient\n", "124.68259206535166\n", "[-103.08179724 -69.96350365]\n", "104\n", "gradient\n", "[ 2. 90.9562212 119.7810219]\n", "norm of gradient\n", "150.41451851976154\n", "[ 90.9562212 119.7810219]\n", "105\n", "gradient\n", "[ -5. -103.08179724 -69.96350365]\n", "norm of gradient\n", "124.68259206535166\n", "[-103.08179724 -69.96350365]\n", "106\n", "gradient\n", "[ 2. 90.9562212 119.7810219]\n", "norm of gradient\n", "150.41451851976154\n", "[ 90.9562212 119.7810219]\n", "107\n", "gradient\n", "[ -5. -103.08179724 -69.96350365]\n", "norm of gradient\n", "124.68259206535166\n", "[-103.08179724 -69.96350365]\n", "108\n", "gradient\n", "[ 2. 90.9562212 119.7810219]\n", "norm of gradient\n", "150.41451851976154\n", "[ 90.9562212 119.7810219]\n", "109\n", "gradient\n", "[ -5. -103.08179724 -69.96350365]\n", "norm of gradient\n", "124.68259206535166\n", "[-103.08179724 -69.96350365]\n", "110\n", "gradient\n", "[ 2. 90.9562212 119.7810219]\n", "norm of gradient\n", "150.41451851976154\n", "[ 90.9562212 119.7810219]\n", "111\n", "gradient\n", "[ -4. -81.33640553 -57.66423358]\n", "norm of gradient\n", "99.78363943309886\n", "[-81.33640553 -57.66423358]\n", "112\n", "gradient\n", "[ 1. 58.03571429 75.51094891]\n", "norm of gradient\n", "95.2420471073733\n", "[58.03571429 75.51094891]\n", "113\n", "gradient\n", "[ -4. -81.33640553 -57.66423358]\n", "norm of gradient\n", "99.78363943309886\n", "[-81.33640553 -57.66423358]\n", "114\n", "gradient\n", "[ 1. 58.03571429 75.51094891]\n", "norm of gradient\n", "95.2420471073733\n", "[58.03571429 75.51094891]\n", "115\n", "gradient\n", "[ -4. -81.33640553 -57.66423358]\n", "norm of gradient\n", "99.78363943309886\n", "[-81.33640553 -57.66423358]\n", "116\n", "gradient\n", "[ 1. 58.03571429 75.51094891]\n", "norm of gradient\n", "95.2420471073733\n", "[58.03571429 75.51094891]\n", "117\n", "gradient\n", "[ -3. -53.36981567 -34.7080292 ]\n", "norm of gradient\n", "63.73369999618191\n", "[-53.36981567 -34.7080292 ]\n", "118\n", "gradient\n", "[ 1. 58.03571429 75.51094891]\n", "norm of gradient\n", "95.2420471073733\n", "[58.03571429 75.51094891]\n", "119\n", "gradient\n", "[ -3. -53.36981567 -34.7080292 ]\n", "norm of gradient\n", "63.73369999618191\n", "[-53.36981567 -34.7080292 ]\n", "120\n", "gradient\n", "[ 1. 58.03571429 75.51094891]\n", "norm of gradient\n", "95.2420471073733\n", "[58.03571429 75.51094891]\n", "121\n", "gradient\n", "[ -2. -36.46313364 -27.08029197]\n", "norm of gradient\n", "45.4631975130738\n", "[-36.46313364 -27.08029197]\n", "122\n", "gradient\n", "[ 1. 58.03571429 75.51094891]\n", "norm of gradient\n", "95.2420471073733\n", "[58.03571429 75.51094891]\n", "123\n", "gradient\n", "[ -2. -36.46313364 -27.08029197]\n", "norm of gradient\n", "45.4631975130738\n", "[-36.46313364 -27.08029197]\n", "124\n", "gradient\n", "[ 1. 58.03571429 75.51094891]\n", "norm of gradient\n", "95.2420471073733\n", "[58.03571429 75.51094891]\n", "125\n", "gradient\n", "[ -2. -36.46313364 -27.08029197]\n", "norm of gradient\n", "45.4631975130738\n", "[-36.46313364 -27.08029197]\n", "126\n", "gradient\n", "[ 1. 58.03571429 75.51094891]\n", "norm of gradient\n", "95.2420471073733\n", "[58.03571429 75.51094891]\n", "127\n", "gradient\n", "[ -2. -36.46313364 -27.08029197]\n", "norm of gradient\n", "45.4631975130738\n", "[-36.46313364 -27.08029197]\n", "128\n", "gradient\n", "[ 1. 58.03571429 75.51094891]\n", "norm of gradient\n", "95.2420471073733\n", "[58.03571429 75.51094891]\n", "129\n", "gradient\n", "[ -2. -36.46313364 -27.08029197]\n", "norm of gradient\n", "45.4631975130738\n", "[-36.46313364 -27.08029197]\n", "130\n", "gradient\n", "[ 1. 58.03571429 75.51094891]\n", "norm of gradient\n", "95.2420471073733\n", "[58.03571429 75.51094891]\n", "131\n", "gradient\n", "[ -2. -36.46313364 -27.08029197]\n", "norm of gradient\n", "45.4631975130738\n", "[-36.46313364 -27.08029197]\n", "132\n", "gradient\n", "[ 1. 58.03571429 75.51094891]\n", "norm of gradient\n", "95.2420471073733\n", "[58.03571429 75.51094891]\n", "133\n", "gradient\n", "[ -2. -36.46313364 -27.08029197]\n", "norm of gradient\n", "45.4631975130738\n", "[-36.46313364 -27.08029197]\n", "134\n", "gradient\n", "[ 1. 58.03571429 75.51094891]\n", "norm of gradient\n", "95.2420471073733\n", "[58.03571429 75.51094891]\n", "135\n", "gradient\n", "[ -2. -36.46313364 -27.08029197]\n", "norm of gradient\n", "45.4631975130738\n", "[-36.46313364 -27.08029197]\n", "136\n", "gradient\n", "[ 0. 24.07834101 35.18248175]\n", "norm of gradient\n", "42.633009842087475\n", "[24.07834101 35.18248175]\n", "137\n", "gradient\n", "[ -2. -36.46313364 -27.08029197]\n", "norm of gradient\n", "45.4631975130738\n", "[-36.46313364 -27.08029197]\n", "138\n", "gradient\n", "[ 0. 24.07834101 35.18248175]\n", "norm of gradient\n", "42.633009842087475\n", "[24.07834101 35.18248175]\n", "139\n", "gradient\n", "[ -2. -36.46313364 -27.08029197]\n", "norm of gradient\n", "45.4631975130738\n", "[-36.46313364 -27.08029197]\n", "140\n", "gradient\n", "[ 0. 24.07834101 35.18248175]\n", "norm of gradient\n", "42.633009842087475\n", "[24.07834101 35.18248175]\n", "141\n", "gradient\n", "[ -1. -12.52880184 -7.77372263]\n", "norm of gradient\n", "14.778418018249504\n", "[-12.52880184 -7.77372263]\n", "142\n", "gradient\n", "[ 0. 24.07834101 35.18248175]\n", "norm of gradient\n", "42.633009842087475\n", "[24.07834101 35.18248175]\n", "143\n", "gradient\n", "[ -1. -12.52880184 -7.77372263]\n", "norm of gradient\n", "14.778418018249504\n", "[-12.52880184 -7.77372263]\n", "144\n", "gradient\n", "[ 0. 24.07834101 35.18248175]\n", "norm of gradient\n", "42.633009842087475\n", "[24.07834101 35.18248175]\n", "145\n", "gradient\n", "[ -1. -12.52880184 -7.77372263]\n", "norm of gradient\n", "14.778418018249504\n", "[-12.52880184 -7.77372263]\n", "146\n", "gradient\n", "[ -1. -12.52880184 -7.77372263]\n", "norm of gradient\n", "14.778418018249504\n", "[-12.52880184 -7.77372263]\n", "147\n", "gradient\n", "[ 3. 103.48502304 127.55474453]\n", "norm of gradient\n", "164.28135269978821\n", "[103.48502304 127.55474453]\n", "148\n", "gradient\n", "[ -1. -12.52880184 -7.77372263]\n", "norm of gradient\n", "14.778418018249504\n", "[-12.52880184 -7.77372263]\n", "149\n", "gradient\n", "[ 2. 70.56451613 83.28467153]\n", "norm of gradient\n", "109.17732112878855\n", "[70.56451613 83.28467153]\n", "150\n", "gradient\n", "[ -1. -12.52880184 -7.77372263]\n", "norm of gradient\n", "14.778418018249504\n", "[-12.52880184 -7.77372263]\n", "151\n", "gradient\n", "[ 2. 70.56451613 83.28467153]\n", "norm of gradient\n", "109.17732112878855\n", "[70.56451613 83.28467153]\n", "152\n", "gradient\n", "[ -1. -12.52880184 -7.77372263]\n", "norm of gradient\n", "14.778418018249504\n", "[-12.52880184 -7.77372263]\n", "153\n", "gradient\n", "[ 2. 70.56451613 83.28467153]\n", "norm of gradient\n", "109.17732112878855\n", "[70.56451613 83.28467153]\n", "154\n", "gradient\n", "[ -1. -12.52880184 -7.77372263]\n", "norm of gradient\n", "14.778418018249504\n", "[-12.52880184 -7.77372263]\n", "155\n", "gradient\n", "[ 2. 70.56451613 83.28467153]\n", "norm of gradient\n", "109.17732112878855\n", "[70.56451613 83.28467153]\n", "156\n", "gradient\n", "[ -1. -12.52880184 -7.77372263]\n", "norm of gradient\n", "14.778418018249504\n", "[-12.52880184 -7.77372263]\n", "157\n", "gradient\n", "[ 2. 70.56451613 83.28467153]\n", "norm of gradient\n", "109.17732112878855\n", "[70.56451613 83.28467153]\n", "158\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "159\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "160\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "161\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "162\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "163\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "164\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "165\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "166\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "167\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "168\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "169\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "170\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "171\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "172\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "173\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "174\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "175\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "176\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "177\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "178\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "179\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "180\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "181\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "182\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "183\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "184\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "185\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "186\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "187\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "188\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "189\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "190\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "191\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "192\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "193\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "194\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "195\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "196\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "197\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "198\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "199\n", "gradient\n", "[0. 0. 0.]\n", "norm of gradient\n", "0.0\n", "[0. 0.]\n", "200\n" ] } ], "source": [ "# \n", "\n", "\n", "import scipy.io as sio\n", "data1 = sio.loadmat('perceptron_data_class1.mat')\n", "data2 = sio.loadmat('perceptron_data_class2.mat')\n", "\n", "from numpy import linalg as LA\n", "\n", "data1 = data1['perceptron_data_class1']\n", "data2 = data2['perceptron_data_class2']\n", "\n", "# We first build the matrix of features (here [1, x, y])\n", "\n", "sz1 = np.shape(data1)\n", "sz2 = np.shape(data2)\n", "\n", "targetsClass1 = np.ones((sz1[0],))\n", "targetsClass2 = -1 * np.ones((sz2[0],))\n", "\n", "total_targets = np.hstack((targetsClass1, targetsClass2))\n", "total_data = np.vstack((data1, data2))\n", "\n", "# precomputing the product y(x_i)t_i\n", "product_yiti = np.multiply(np.vstack((data1, data2)),(np.ones((2,1))* total_targets).T)\n", "\n", "\n", "total_Xtilde = np.hstack((np.ones((np.shape(total_data)[0],1)), total_data))\n", "\n", "# Then we initialize the beta_tilde (here I chose to take beta_tilde random Gaussian but any other choice is also possible)\n", "\n", "sigma = 1\n", "beta = np.random.normal(0, 1, (2,))\n", "beta0 = np.random.normal(0, 1, 1)\n", "\n", "beta_tilde_int = np.hstack((beta0, beta))\n", "betaTotal = beta_tilde_int\n", "\n", "# Initialization of the max number of iter and learning rate\n", "eta = .01\n", "iter_num = 1\n", "max_iter = 100\n", "\n", "\n", "while iter_num < 200:\n", " \n", " \n", " # We start by looking for the misclassified points (in the case of the perceptron, \n", " # the misclassified points are the points for which the sign of the product y(x_i)t_i is negative)\n", " \n", " sign = np.sign(np.multiply(np.matmul(betaTotal,total_Xtilde.T),total_targets))\n", " ind_misclassified = np.where(sign < 0)\n", " misclassified_targets = total_targets[sign < 0]\n", " # we then extract the misclassified products $x_it_i$\n", " misclassified_yiti = product_yiti[sign < 0,:]\n", " # now summing each of the misclassified vectors to get the gradient, we get \n", " gradient_beta0 = np.sum(misclassified_targets, axis=0)\n", " gradient_beta = np.sum(misclassified_yiti, axis=0)\n", " gradient_betaTotal = np.hstack((gradient_beta0, gradient_beta))\n", " print('gradient')\n", " print(gradient_betaTotal)\n", " print('norm of gradient')\n", " print(LA.norm(gradient_betaTotal))\n", " if LA.norm(gradient_betaTotal)!=0:\n", " gradient_betaTotal = np.true_divide(gradient_betaTotal,LA.norm(gradient_betaTotal))\n", " \n", " print(gradient_beta)\n", " \n", " # updating Beta with learning rate eta\n", " betaTotal += gradient_betaTotal * eta\n", "\n", " \n", " iter_num +=1\n", " print(iter_num)\n", "\n" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "\n", "# we now plot the classification\n", "\n", "xx, yy = np.meshgrid(np.linspace(0,50,100),\n", " np.linspace(0,50,100))\n", " \n", " \n", "tmp = np.array([xx.ravel(), yy.ravel()]).T\n", "tmp1 = np.ones((np.shape(tmp)[0],1))\n", "\n", "phi_tilde = np.hstack((tmp1, tmp))\n", "\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "C = np.array([ 'Red','Blue'])\n", "\n", "Z = np.matmul(betaTotal, phi_tilde.T)\n", "Z = Z.reshape(xx.shape)\n", "plt.contourf(xx, yy, np.sign(Z), alpha=0.3, colors=C)\n", "\n", "plt.scatter(data1[:,0], data1[:,1], facecolor='blue')\n", "plt.scatter(data2[:,0], data2[:,1], facecolor='red')\n", "plt.show()\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Exercise 2.\n", "\n", "__2a.__ Load the data below. Using the neural_network module from scikit-learn and its MLPClassifier model, learn a classifier, for the dataset below using \n", "\n", "- One hidden layer with a linear activation function and \n", " - One neuron\n", " - Two neurons\n", " \n", " \n", " \n", "- One hidden layer with a non linear activation function (take Relu for example or a binary step)\n", " - One neuron\n", " - Two neurons\n", "\n", "How many neurons, hidden layers do you need to learn the distribution of the data? Do you have an idea why?\n", "\n", "Try increasing the number of neurons and hidden layers. Then try different values of the learning rate. \n" ] }, { "cell_type": "code", "execution_count": 160, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "172\n", "195\n", "(172,)\n", "(195,)\n", "(367,)\n" ] }, { "data": { "image/png": "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\nRK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "## 1) This is the solution for the one neuron exercise\n", "import scipy.io as sio\n", "data1 = sio.loadmat('neural_net_class1.mat')\n", "data2 = sio.loadmat('neural_net_class2.mat')\n", "\n", "data1 = data1['neural_net_class1']\n", "data2 = data2['neural_net_class2']\n", "\n", "from sklearn.neural_network import MLPClassifier\n", "\n", "# put your code here\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "\n", "sz1 = np.shape(data1)\n", "sz2 = np.shape(data2)\n", "targetsClass1 = np.ones((sz1[0],))\n", "targetsClass2 = -1 * np.ones((sz2[0],))\n", "\n", "total_targets = np.hstack((targetsClass1, targetsClass2))\n", "\n", "total_data = np.vstack((data1, data2))\n", "\n", "from sklearn.neural_network import MLPClassifier\n", "\n", "my_classifier = MLPClassifier(hidden_layer_sizes = 1, activation = 'identity')\n", "\n", "my_classifier.fit(total_data, total_targets)\n", "\n", "\n", "from matplotlib.colors import ListedColormap\n", "# plot the decision surface\n", " \n", "colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')\n", "cmap = ListedColormap(colors[:2])\n", " \n", "xx, yy = np.meshgrid(np.linspace(0,50,100),\n", " np.linspace(0,50,100))\n", "Z = my_classifier.predict(np.array([xx.ravel(), yy.ravel()]).T)\n", "Z = Z.reshape(xx.shape)\n", "plt.contourf(xx, yy, Z, alpha=0.2, cmap=cmap)\n", "plt.xlim(xx.min(), xx.max())\n", "plt.ylim(yy.min(), yy.max())\n", "\n", "\n", "plt.scatter(data1[:,0], data1[:,1], facecolor='blue')\n", "plt.scatter(data2[:,0], data2[:,1], facecolor='red')\n", "plt.show()\n", "\n", "## 2) Adding a couple more neurons won't change the ouptut a lot. " ] }, { "cell_type": "code", "execution_count": 164, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "## 2) Using a non linear activation function \n", "\n", "\n", "my_classifier = MLPClassifier(hidden_layer_sizes = (100,), activation = 'relu')\n", "\n", "my_classifier.fit(total_data, total_targets)\n", "\n", "\n", "from matplotlib.colors import ListedColormap\n", "# plot the decision surface\n", " \n", "colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')\n", "cmap = ListedColormap(colors[:2])\n", " \n", "xx, yy = np.meshgrid(np.linspace(0,50,100),\n", " np.linspace(0,50,100))\n", "Z = my_classifier.predict(np.array([xx.ravel(), yy.ravel()]).T)\n", "Z = Z.reshape(xx.shape)\n", "plt.contourf(xx, yy, Z, alpha=0.2, cmap=cmap)\n", "plt.xlim(xx.min(), xx.max())\n", "plt.ylim(yy.min(), yy.max())\n", "\n", "\n", "plt.scatter(data1[:,0], data1[:,1], facecolor='blue')\n", "plt.scatter(data2[:,0], data2[:,1], facecolor='red')\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": 149, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "## 3) changing the learning rate\n", "## Try various values for the learning rate between .0001 and 1. What do you observe ?\n", "\n", "my_classifier = MLPClassifier(hidden_layer_sizes = (20,20,20), activation = 'relu', learning_rate = 'constant', learning_rate_init =.001, max_iter=20000)\n", "\n", "my_classifier.fit(total_data, total_targets)\n", "\n", "\n", "from matplotlib.colors import ListedColormap\n", "# plot the decision surface\n", " \n", "colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')\n", "cmap = ListedColormap(colors[:2])\n", " \n", "xx, yy = np.meshgrid(np.linspace(0,50,100),\n", " np.linspace(0,50,100))\n", "Z = my_classifier.predict(np.array([xx.ravel(), yy.ravel()]).T)\n", "Z = Z.reshape(xx.shape)\n", "plt.contourf(xx, yy, Z, alpha=0.2, cmap=cmap)\n", "plt.xlim(xx.min(), xx.max())\n", "plt.ylim(yy.min(), yy.max())\n", "\n", "\n", "plt.scatter(data1[:,0], data1[:,1], facecolor='blue')\n", "plt.scatter(data2[:,0], data2[:,1], facecolor='red')\n", "plt.show()\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__2b.__ Keep the dataset from above. try to change the intialization of the training algorithm. Plot the resulting classifier for a couple of different initializations. What do you see?\n", "\n", "Do it for a small network first. Then repeat those experiments for larger architectures. I.e. increase the number of neurons and the number of layers. What do you see when you change the initialization?\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "# Although it is a little more tricky, it is possible to use object oriented programming and inheritance to modify \n", "# the _init_coef method from the MLPClassifier class in scikit learn. As an illustration of this, in the example below, \n", "# we replace the built-in initialization of the MLP class and replace the initial weights by zeros. \n", "\n", "from sklearn.neural_network import MLPClassifier\n", "\n", "class MLPClassifierOverride(MLPClassifier):\n", "\n", " def _init_coef(self, fan_in, fan_out):\n", " \n", " if self.activation == 'logistic':\n", " \n", " init_bound = np.sqrt(2. / (fan_in + fan_out))\n", " \n", " elif self.activation in ('identity', 'tanh', 'relu'):\n", " \n", " init_bound = np.sqrt(6. / (fan_in + fan_out))\n", " \n", " else:\n", " \n", " raise ValueError(\"Unknown activation function %s\" %\n", " self.activation)\n", " coef_init = np.zeros(np.shape(self._random_state.uniform(-init_bound, init_bound,\n", " (fan_in, fan_out))))\n", "\n", " intercept_init = np.zeros(np.shape(self._random_state.uniform(-init_bound, init_bound,\n", " fan_out)))\n", " return coef_init, intercept_init\n", "\n", "\n", "\n", "## Try various values for the learning rate between .0001 and 1. What do you observe ?\n", "\n", "import scipy.io as sio\n", "data1 = sio.loadmat('neural_net_class1.mat')\n", "data2 = sio.loadmat('neural_net_class2.mat')\n", "\n", "data1 = data1['neural_net_class1']\n", "data2 = data2['neural_net_class2']\n", "\n", "from sklearn.neural_network import MLPClassifier\n", "\n", "# put your code here\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "\n", "sz1 = np.shape(data1)\n", "sz2 = np.shape(data2)\n", "targetsClass1 = np.ones((sz1[0],))\n", "targetsClass2 = -1 * np.ones((sz2[0],))\n", "\n", "total_targets = np.hstack((targetsClass1, targetsClass2))\n", "\n", "total_data = np.vstack((data1, data2))\n", "\n", "my_classifier = MLPClassifier(hidden_layer_sizes = (100,), activation = 'relu', learning_rate = 'constant', learning_rate_init =.001)\n", "\n", "my_classifier.fit(total_data, total_targets)\n", "\n", "from matplotlib.colors import ListedColormap\n", "## plot the decision surface\n", " \n", "colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')\n", "cmap = ListedColormap(colors[:2])\n", " \n", "xx, yy = np.meshgrid(np.linspace(0,50,100),\n", " np.linspace(0,50,100))\n", "Z = my_classifier.predict(np.array([xx.ravel(), yy.ravel()]).T)\n", "Z = Z.reshape(xx.shape)\n", "plt.contourf(xx, yy, Z, alpha=0.2, cmap=cmap)\n", "plt.xlim(xx.min(), xx.max())\n", "plt.ylim(yy.min(), yy.max())\n", "\n", "\n", "plt.scatter(data1[:,0], data1[:,1], facecolor='blue')\n", "plt.scatter(data2[:,0], data2[:,1], facecolor='red')\n", "plt.show()\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Exercise 3. \n", "\n", "__3a.__Load the data below. Try to build the best neural network you can for this dataset. Split the data between a training and a test set and evaluate the models you built. What is the best validation error you can get?\n" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# The spiral is relatively hard because of its strong non-linearity. However, as shown below, \n", "# it remains of course possible to fit it with a neural network provided that (1) the network is sufficiently over-parametrized \n", "# (i.e. taking a sufficiently large number of layers and neurons in each layer) and (2) that one takes a sufficiently \n", "# small learning with a (batch) gradient descent algorithm (taking all the samples into account, thus avoiding any randomness in the iterations). \n", "# To avoid disproportionate complexity of the classifier, it is also good to set the regularization parameter to some relatively \n", "# large constant, here I choose alpha = .1\n", "\n", "\n", "import scipy.io as sio\n", "data1 = sio.loadmat('neural_net_ex2_class1.mat')\n", "data2 = sio.loadmat('neural_net_ex2_class2.mat')\n", "\n", "data1 = data1['neural_net_ex2_class1']\n", "data2 = data2['neural_net_ex2_class2']\n", "\n", "\n", "from sklearn.neural_network import MLPClassifier\n", "\n", "# put your code here\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "sz1 = np.shape(data1)\n", "sz2 = np.shape(data2)\n", "targetsClass1 = np.ones((sz1[0],))\n", "targetsClass2 = -1 * np.ones((sz2[0],))\n", "\n", "total_targets = np.hstack((targetsClass1, targetsClass2))\n", "total_data = np.vstack((data1, data2))\n", "\n", "from sklearn.neural_network import MLPClassifier\n", "\n", "## We first try a simple MLP with Relu activation and without any additional features\n", "\n", "my_classifier = MLPClassifier(hidden_layer_sizes = (100,100), activation = 'tanh', max_iter=40000, solver = 'lbfgs', alpha = .1)\n", "\n", "my_classifier.fit(total_data, total_targets)\n", "\n", "\n", "from matplotlib.colors import ListedColormap\n", "# plot the decision surface\n", " \n", "colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')\n", "cmap = ListedColormap(colors[:2])\n", " \n", "xx, yy = np.meshgrid(np.linspace(0,50,100),\n", " np.linspace(0,50,100))\n", "Z = my_classifier.predict(np.array([xx.ravel(), yy.ravel()]).T)\n", "Z = Z.reshape(xx.shape)\n", "plt.contourf(xx, yy, Z, alpha=0.2, cmap=cmap)\n", "\n", "\n", "\n", "plt.scatter(data1[:,0], data1[:,1], facecolor='blue')\n", "plt.scatter(data2[:,0], data2[:,1], facecolor='red')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "__3b.__ With the same dataset, add additional features to your model, e.g. $\\sin(x), \\sin(y)$ or other monomials. Can you improve your classifier ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Even when using Neural networks, it might be interesting to add additional features. Not because the network won't \n", "# be able to learn the classifier, in fact we know from the Universal approximation Theorem that a sufficiently large \n", "# Perceptron can learn any distribution, but because adding a couple of features such as sin(x), cos(x) and x^2, y^2 \n", "# might lead to a simpler architecture. Random initialization however makes the learning tricky. \n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Why is the spiral example so difficult to learn?" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(557, 2)\n" ] }, { "data": { "image/png": "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\nAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "## 1) Once again, the difficulty for the spiral comes from the strong non linearity of the data. Such a non linearity \n", "# requires a sufficiently large architecture and some relatively good intuition on the way neural networks can capture a \n", "# distribution. However, as shown below on yet another example, neural networks are perfectly able to recover a \n", "# relatively regular boundary even on such strongly non linear dataset. \n", "\n", "import numpy as np\n", "import scipy.io as sio\n", "data1 = sio.loadmat('pointsSpiralClass1_1.mat')\n", "data2 = sio.loadmat('pointsSpiralClass1_2.mat')\n", "data3 = sio.loadmat('pointsSpiralClass2_1.mat')\n", "\n", "\n", "data1 = data1['pointsSpiralClass1_1']\n", "data2 = data2['pointsSpiralClass1_2']\n", "data3 = data3['pointsSpiralClass2_1']\n", "\n", "\n", "\n", "data1 = np.vstack((data1,data2))\n", "print(np.shape(data1))\n", "\n", "sz1 = np.shape(data1)\n", "sz2 = np.shape(data3)\n", "\n", "targets_class1 = np.ones((sz1[0],))\n", "targets_class2 = -1*np.ones((sz2[0],))\n", "\n", "\n", "\n", "total_data = np.vstack((data1, data3))\n", "total_targets = np.hstack((targets_class1, targets_class2))\n", "\n", "from sklearn.neural_network import MLPClassifier\n", "\n", "## We first try a simple MLP with Relu activation and without any additional features\n", "\n", "my_classifier = MLPClassifier(hidden_layer_sizes = (100,100), activation = 'tanh', max_iter=10000, batch_size=1000,learning_rate_init=0.001)\n", "\n", "my_classifier.fit(total_data, total_targets)\n", "\n", "from matplotlib.colors import ListedColormap\n", "\n", "colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')\n", "cmap = ListedColormap(colors[:2])\n", " \n", "xx, yy = np.meshgrid(np.linspace(1,14,100),\n", " np.linspace(-2,12,100))\n", "\n", "preprocessed = np.array([xx.ravel(), yy.ravel()]).T\n", "\n", "# from sklearn.preprocessing import PolynomialFeatures\n", "# poly = PolynomialFeatures(2)\n", "# preprocessed = poly.fit_transform(preprocessed)\n", "# preprocessed = preprocessed[:,1:]\n", "# preprocessed = np.hstack((preprocessed,np.sin(preprocessed)) )\n", "\n", "Z = my_classifier.predict(preprocessed)\n", "Z = Z.reshape(xx.shape)\n", "\n", "\n", "import matplotlib.pyplot as plt\n", "plt.contourf(xx, yy, Z, alpha=0.2, cmap=cmap)\n", "plt.scatter(data1[:,0], data1[:,1], facecolor='blue')\n", "plt.scatter(data3[:,0], data3[:,1], facecolor='red')\n", "plt.xlim(xx.min(), xx.max())\n", "plt.ylim(yy.min(), yy.max())\n", "plt.show()\n", "\n", "\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 2 }