Skip to content

Instantly share code, notes, and snippets.

@wiseodd
Created October 27, 2015 05:27
Show Gist options
  • Save wiseodd/d6edcb12c511805fe807 to your computer and use it in GitHub Desktop.
Save wiseodd/d6edcb12c511805fe807 to your computer and use it in GitHub Desktop.
Gaussian MLE Anomaly Detection
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import numpy as np\n",
"import scipy.stats as st\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"sns.set()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x108932940>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Post rate per hour per user, i-th element represent the post rate of i-th user\n",
"X = np.array([10, 14, 12, 1200, 25, 120, 54, 32, 18, 23])\n",
"X_test = np.array([1500, 10, 35, 400])\n",
"\n",
"# Fit Gaussian with maximum likelihood estimation\n",
"mu, sigma = st.norm.fit(X)\n",
"\n",
"sns.distplot(np.random.normal(mu, sigma, size=10000));"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0.99993912 0.34420908 0.37077482 0.76106394]\n"
]
}
],
"source": [
"y_test = st.norm.cdf(X_test, mu, sigma)\n",
"\n",
"print(y_test)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1500: 1.00 - anomaly\n",
"10: 0.34 - normal\n",
"35: 0.37 - normal\n",
"400: 0.76 - anomaly\n"
]
}
],
"source": [
"# Define the anomaly threshold, for example, 25% right tail of the Gaussian are the anomalies\n",
"t = 0.75\n",
"\n",
"for x, y in zip(X_test, y_test):\n",
" print('{}: {:.2f} - {}'.format(x, y, 'normal' if y < t else 'anomaly'))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"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.4.3"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment