Skip to content

Instantly share code, notes, and snippets.

@saketkc
Last active July 12, 2017 03:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save saketkc/f0964c27230911fa82a5a7b8ed65b4a8 to your computer and use it in GitHub Desktop.
Save saketkc/f0964c27230911fa82a5a7b8ed65b4a8 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {
"run_control": {
"frozen": false,
"read_only": false
}
},
"cell_type": "markdown",
"source": "# Determining knee point using [Finding a \"Kneedle\" in a Haystack: Detecting Knee Points in System Behavior](https://www1.icsi.berkeley.edu/~barath/papers/kneedle-simplex11.pdf)\n\nAnother example [here](https://github.com/saketkc/notebooks/blob/master/python/Kneedle%20Algorithm.ipynb)"
},
{
"metadata": {
"run_control": {
"frozen": false,
"read_only": false
},
"trusted": true
},
"cell_type": "code",
"source": "%pylab inline\nimport scipy as sp\nimport seaborn as sns\nfrom scipy.interpolate import UnivariateSpline\nsns.set_style('white')\n\ndef 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='--')",
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": "Populating the interactive namespace from numpy and matplotlib\n",
"name": "stdout"
}
]
},
{
"metadata": {
"run_control": {
"frozen": false,
"read_only": false
},
"trusted": true
},
"cell_type": "code",
"source": "X = [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000]\nY = [2314, 802, 519, 417, 358, 318, 302, 284, 280]\nn = len(X)\nS = 1",
"execution_count": 2,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"run_control": {
"frozen": false,
"read_only": false
},
"trusted": true
},
"cell_type": "code",
"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\ndef 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]) or (np.sign(Y_d[i + 1]) != np.sign(Y_d[i - 1])):\n X_lm.append(X_d[i])\n Y_lm.append(Y_d[i])\n maxima_ids.append(i)\n print(Y_lm)\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",
"execution_count": 3,
"outputs": []
},
{
"metadata": {
"run_control": {
"frozen": false,
"read_only": false
},
"trusted": true
},
"cell_type": "code",
"source": "knee_point, _ = find_knee_point(X, Y, S)\ndraw_plot(X, Y, knee_point)",
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"text": "[0.13219578562607948, -0.13339603454922289]\n",
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "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\nigpZsmSJpKSkKN/r5MmTEhkZKadOnZIrV65IUlKSbNy40SPn9d9UWVkp4eHhsn37dmlsbHT5Ymbu\ntbe3y6xZs2TBggVSWVkpBQUFEhcXJ4cOHZL29naZOXMmc+vGqlWrlMeEca+598cff8jkyZNl+fLl\ncuPGDSkoKJCJEyfKvn37uNe68MYbb8iLL74o5eXlUlhYKLGxsZKTk8PMHsDTTz8tJ0+edKnxGu1c\na2urxMfHS0ZGhlRXV8vp06clJiZGcnNzude68eyzz8rq1aultrZWcnNzRaPRyNWrV71ir3n9gPvP\nX/RQW1srqampMn78eElKSpLi4mKX9xcWFkpiYqJotVqZP3++y/PZRP56RtuECRMkKipK1qxZIw6H\n46GcR0/Kzs4WtVrt8hUaGipqtVpERGpqapiZGxaLRRYtWiSRkZEyceJEyc7OVnrca937+4Arwsy6\nUllZKfPnz5eIiAiZOHGifP7550qPuXWutbVVMjIyJCIiQuLi4mTXrl1Kj5l1TaPRSFFR0X115ta5\ne9dnZGSkGAwG+fLLL5UeM3OvurpaUlNTRavVSlJSkhQUFCg9T+fWT+RvD5olIiIiIurletU9uERE\nRERE3eGAS0RERER9CgdcIiIiIupTOOASERERUZ/CAZeIiIiI+hQOuERERETUp3DAJSIiIqI+hQMu\nEREREfUpHHCJiIiIqE/hgEtEREREfQoHXCIiIiLqU/4DgkKPlmfpsQIAAAAASUVORK5CYII=\n",
"text/plain": "<matplotlib.figure.Figure at 0x7f7a00298c50>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true,
"collapsed": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"kernelspec": {
"name": "conda-env-clipseq-py",
"display_name": "Python [conda env:clipseq]",
"language": "python"
},
"latex_envs": {
"eqNumInitial": 1,
"eqLabelWithNumbers": true,
"current_citInitial": 1,
"cite_by": "apalike",
"bibliofile": "biblio.bib",
"LaTeX_envs_menu_present": true,
"labels_anchors": false,
"latex_user_defs": false,
"user_envs_cfg": false,
"report_style_numbering": false,
"autocomplete": true,
"hotkeys": {
"equation": "Ctrl-E",
"itemize": "Ctrl-I"
}
},
"hide_input": false,
"language_info": {
"mimetype": "text/x-python",
"nbconvert_exporter": "python",
"name": "python",
"file_extension": ".py",
"version": "3.5.2",
"pygments_lexer": "ipython3",
"codemirror_mode": {
"version": 3,
"name": "ipython"
}
},
"toc": {
"threshold": 4,
"number_sections": true,
"toc_cell": false,
"toc_window_display": true,
"toc_section_display": "block",
"sideBar": true,
"navigate_menu": true,
"moveMenuLeft": true,
"widenNotebook": false,
"colors": {
"hover_highlight": "#DAA520",
"selected_highlight": "#FFD700",
"running_highlight": "#FF0000"
},
"nav_menu": {
"width": "252px",
"height": "80px"
}
},
"gist": {
"id": "312d107d3ba52b96ed69ef0e6a23a1e0",
"data": {
"description": "Kneedle Algorithm-Copy1.ipynb",
"public": true
}
},
"_draft": {
"nbviewer_url": "https://gist.github.com/312d107d3ba52b96ed69ef0e6a23a1e0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment