{ "cells": [ { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false }, "toc": "true" }, "source": [ "# Table of Contents\n", "

1  Python implementation of Finding a \"Kneedle\" in a Haystack: Detecting Knee Points in System Behavior
1.1  Example 1
1.2  Example 2
" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "# Python implementation of [Finding a \"Kneedle\" in a Haystack: Detecting Knee Points in System Behavior](https://www1.icsi.berkeley.edu/~barath/papers/kneedle-simplex11.pdf)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true, "run_control": { "frozen": false, "read_only": false } }, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import scipy as sp\n", "import seaborn as sns\n", "from scipy.interpolate import UnivariateSpline\n", "import matplotlib.pyplot as plt\n", "sns.set_style('white')\n", "\n", "np.random.seed(42)\n", "\n", "def draw_plot(X, Y, knee_point=None):\n", " plt.plot(X, Y)\n", " if knee_point:\n", " plt.axvline(x=knee_point, color='k', linestyle='--')\n", "\n", "\n", "mu = 50\n", "sigma = 10\n", "S = 1\n", "n = 1000" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "## Example 1\n", "\n", "$$ X \\sim N(50, 10) $$\n", "\n", "Knee point(expected) : $\\mu+\\sigma=60$\n", "\n", "Knee point(simulation) : 66" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true, "run_control": { "frozen": false, "read_only": false } }, "outputs": [], "source": [ "X = np.random.normal(mu, sigma, n)\n", "\n", "sorted_X = np.sort(X)\n", "Y = np.arange(len(X))/float(len(sorted_X))\n", " \n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true, "run_control": { "frozen": false, "read_only": false } }, "outputs": [], "source": [ "def _locate(Y_d, T_lm, maxima_ids):\n", " n = len(Y_d)\n", " for j in range(0, n):\n", " for index, i in enumerate(maxima_ids):\n", " if j <= i:\n", " continue\n", " if Y_d[j] <= T_lm[index]:\n", " return index\n", "\n", "\n", "def find_knee_point(X, Y, S):\n", " n = len(X)\n", " spl = UnivariateSpline(X, Y)\n", " X_s = np.linspace(np.min(X), np.max(X), n)\n", " Y_s = spl(X_s)\n", " X_sn = (X_s - np.min(X_s)) / (np.max(X_s) - np.min(X_s))\n", " Y_sn = (Y_s - np.min(Y_s)) / (np.max(Y_s) - np.min(Y_s))\n", " X_d = X_sn\n", " Y_d = Y_sn - X_sn\n", " X_lm = []\n", " Y_lm = []\n", " maxima_ids = []\n", " for i in range(1, n - 1):\n", " if (Y_d[i] > Y_d[i - 1] and Y_d[i] > Y_d[i + 1]):\n", " X_lm.append(X_d[i])\n", " Y_lm.append(Y_d[i])\n", " maxima_ids.append(i)\n", " T_lm = Y_lm - S * np.sum(np.diff(X_sn)) / (n - 1)\n", " knee_point_index = _locate(Y_d, T_lm, maxima_ids)\n", " knee_point = X_lm[knee_point_index] * (np.max(X_s) - np.min(X_s)\n", " ) + np.min(X_s)\n", " return knee_point, Y_d" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "data": { "image/png": "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\nSUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "knee_point, yd = find_knee_point(sorted_X, Y, S)\n", "draw_plot(sorted_X, Y, knee_point)\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "data": { "text/plain": [ "67.366037113196967" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "knee_point" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "## Example 2\n", "\n", "$$ y = -1/x + 5$$\n", "\n", "Knee point(expected): $0.22$\n", " \n", "Knee point(simulation): $0.4$" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.linspace(0.1,1,10)\n", "y = -1/x+5\n", "knee_point, _ = find_knee_point(x, y, S)\n", "draw_plot(x, y, knee_point)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "data": { "text/plain": [ "0.40000000000000002" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "knee_point" ] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python [conda env:clipseq]", "language": "python", "name": "conda-env-clipseq-py" }, "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.5.2" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false }, "toc": { "colors": { "hover_highlight": "#DAA520", "running_highlight": "#FF0000", "selected_highlight": "#FFD700" }, "moveMenuLeft": true, "nav_menu": { "height": "80px", "width": "252px" }, "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 4, "toc_cell": true, "toc_section_display": "block", "toc_window_display": true, "widenNotebook": false } }, "nbformat": 4, "nbformat_minor": 2 }