diff --git a/Interpolation.ipynb b/Interpolation.ipynb index 96e8317..6fd479f 100644 --- a/Interpolation.ipynb +++ b/Interpolation.ipynb @@ -570,7 +570,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.7" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/Kullback_Leibler.ipynb b/Kullback_Leibler.ipynb index 8f8054f..6b1e452 100644 --- a/Kullback_Leibler.ipynb +++ b/Kullback_Leibler.ipynb @@ -260,21 +260,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.14" + "pygments_lexer": "ipython3", + "version": "3.6.8" } }, "nbformat": 4, diff --git a/data/Convolution.pdf b/data/Convolution.pdf new file mode 100644 index 0000000..4adaf8f Binary files /dev/null and b/data/Convolution.pdf differ diff --git a/gradient_descent.ipynb b/gradient_descent.ipynb new file mode 100644 index 0000000..6979fb5 --- /dev/null +++ b/gradient_descent.ipynb @@ -0,0 +1,990 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Gradient descent\n", + "\n", + "$\\alpha$ parameter regulates the size of the step.\n", + "We multiple alpha by the value of the derivative in the given point.\n", + "The derivative in a point tells us how steep in the curve at the point.\n", + "\n", + "**Question**: Why can't we just set alpha and only use the sign of the derivative? Since we just need to know in which direction to move?\n", + "\n", + "In this case, we succeded only if we get the step correctly. In the example below, the only value for $\\alpha$ that works in this case is $\\alpha = 0.5$, since we start at $-2.0$. In all other cases, how ever small they are we are most likely to never reach the minimum.\n", + "\n", + "**Question**: Why should $\\alpha \\in (0,1)$?\n", + "\n", + "If $\\alpha <= 1$ the process diverges (in case of symmetric quadratic function) and we can't reach minimum ever." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "import numpy as np\n", + "\n", + "def f(x):\n", + " return np.square(x);\n", + "\n", + "def jacobian(x):\n", + " ## jacobians for x^2\n", + " return 2*x;\n", + "\n", + "x = np.arange(-2.0,2.0,0.1)\n", + "\n", + "alpha = 0.1;\n", + "error = 1000;\n", + "x_prev = -2.0;\n", + "opt_way = []\n", + "numOfIter =0;\n", + "while error >1e-05:\n", + "# print(\"Step is: \", alpha *jacobian(x_prev))\n", + "# x_opt = x_prev - alpha *np.sign(jacobian(x_prev)); # just using sign of the derivative\n", + " x_opt = x_prev - alpha *jacobian(x_prev); # using value of the derivative\n", + " error = abs(x_prev -x_opt);\n", + " x_prev = x_opt;\n", + " opt_way.append(x_opt)\n", + " numOfIter+=1;\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Converged with 49 iterations\n", + "\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "print(\"Converged with \", numOfIter, \"iterations\\n\")\n", + "\n", + "plt.figure(1)\n", + "plt.plot(x, f(x))\n", + "y = np.zeros((len(opt_way),1))\n", + "plt.plot(opt_way,y, 'r*')\n", + "plt.plot(opt_way, f(opt_way), 'g*-')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "TODO; two dimensional variant" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Converged with 51 iterations\n", + "\n" + ] + } + ], + "source": [ + "# Very sloppy functions and derivatives\n", + "def f(x,y):\n", + " return np.square(x) + np.square(y);\n", + "\n", + "def jacobian(x,y):\n", + " return np.array([2*x, 2*y])\n", + "\n", + "\n", + "\n", + "alpha = 0.1;\n", + "error = 1000;\n", + "x_prev = [-2.0, 2.0];\n", + "opt_way = []\n", + "numOfIter =0;\n", + "while error >1e-05:\n", + "# print(\"Step is: \", alpha *jacobian(x_prev))\n", + "# x_opt = x_prev - alpha *np.sign(jacobian(x_prev)); # just using sign of the derivative\n", + " x_opt = x_prev - alpha *jacobian(x_prev[0], x_prev[1]); # using value of the derivative\n", + " error = np.linalg.norm(x_prev -x_opt);\n", + " x_prev = x_opt;\n", + " opt_way.append(x_opt)\n", + " numOfIter+=1;\n", + "print(\"Converged with \", numOfIter, \"iterations\\n\")\n", + "opt_way = np.array(opt_way)\n", + "# print(opt_way)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('