Skip to content

Instantly share code, notes, and snippets.

@kevindavenport
Last active June 6, 2019 10:28
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save kevindavenport/7771325 to your computer and use it in GitHub Desktop.
Save kevindavenport/7771325 to your computer and use it in GitHub Desktop.
An IPython notebook created for my blog post on http://kldavenport.com about the Mahalanobis Distance function and outlier detection.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Mahalanobis Distance and Outliers blog post at <a href=\"http://kldavenport.com\">http://kldavenport.com</a>\n"
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Calculating the Mahalanobis Distance and detecting outliers"
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"1. Generate two random 1-D arrays:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"seed(59)\n",
"# as column vectors\n",
"x = np.random.poisson(5,10)\n",
"y = np.random.poisson(5,10)\n",
"\n",
"# examine the shape of the numpy arrays\n",
"print x, y\n",
"print x.shape\n",
"print y.shape"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[4 4 5 2 3 6 9 7 4 5] [3 7 5 7 9 5 6 2 2 7]\n",
"(10,)\n",
"(10,)\n"
]
}
],
"prompt_number": 97
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"2. Estimate a covariance matrix for (x,y):"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"An examination of what numpy's cov expects: A 1-D or 2-D array containing multiple variables and observations. Each row of m represents a variable, and each column a single observation of all those variables. In the event we are dealing with column vectors instead of row vectors, the rowvar parameter can be set to 1."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we calculate the covariance matrix:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"covariance_xy = np.cov(x,y, rowvar=0)\n",
"inv_covariance_xy = np.linalg.inv(covariance_xy)\n",
"\n",
"# Examine inverse covariance matrix and shape\n",
"print inv_covariance_xy\n",
"print inv_covariance_xy.shape"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[ 0.26721584 0.06773735]\n",
" [ 0.06773735 0.19681166]]\n",
"(2, 2)\n"
]
}
],
"prompt_number": 98
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"3. Center each value by the mean:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Center each value by the mean by subtracting the mean from i in array x and y."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"xy_mean = np.mean(x),np.mean(y)\n",
"x_diff = np.array([x_i - xy_mean[0] for x_i in x])\n",
"y_diff = np.array([y_i - xy_mean[1] for y_i in y])\n",
"print x_diff.shape"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"(10,)\n"
]
}
],
"prompt_number": 99
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Join the x_diff and y_diff arrays into (10 x 2) array to be used in our formula later. Consider these coordinate pairs."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"diff_xy = np.transpose([x_diff, y_diff])\n",
"diff_xy.shape, diff_xy"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 100,
"text": [
"((10, 2),\n",
" array([[-0.9, -2.3],\n",
" [-0.9, 1.7],\n",
" [ 0.1, -0.3],\n",
" [-2.9, 1.7],\n",
" [-1.9, 3.7],\n",
" [ 1.1, -0.3],\n",
" [ 4.1, 0.7],\n",
" [ 2.1, -3.3],\n",
" [-0.9, -3.3],\n",
" [ 0.1, 1.7]]))"
]
}
],
"prompt_number": 100
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"4. Formula building"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As stated above: $ MD = \\sqrt{ (x - \\mu)^T {\\rm \\bf \\Sigma}^{-1} (x - \\mu)}$, <br>So to put together this formula we'll need the square root of the transpose of our _diff_xy_ array, the inverse of our _covariance_xy_ matrix which we've assigned to _inv_covariance_xy_, and our original _diff_xy_ array. Examining their shapes below for one final check before performing dot multiplication (remember u\u2022v = v\u2022u and u\u2022(v + w) = u\u2022w + v\u2022w):\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print np.transpose(diff_xy[1]).shape\n",
"print inv_covariance_xy.shape\n",
"print diff_xy.shape\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"(2,)\n",
"(2, 2)\n",
"(10, 2)\n"
]
}
],
"prompt_number": 101
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"md = []\n",
"for i in range(len(diff_xy)):\n",
" md.append(np.sqrt(np.dot(np.dot(np.transpose(diff_xy[i]),inv_covariance_xy),diff_xy[i])))\n",
"md"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 102,
"text": [
"[1.2401657717422185,\n",
" 0.76023302292171568,\n",
" 0.12775354072754608,\n",
" 1.4656672995350604,\n",
" 1.6451789341156158,\n",
" 0.54436895644805128,\n",
" 2.2309523247827063,\n",
" 1.5436519059004268,\n",
" 1.6619517679622449,\n",
" 0.77103084392595633]"
]
}
],
"prompt_number": 102
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"We can wrap all this sequential code up into one function as follows:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def MahalanobisDist(x, y):\n",
" covariance_xy = np.cov(x,y, rowvar=0)\n",
" inv_covariance_xy = np.linalg.inv(covariance_xy)\n",
" xy_mean = np.mean(x),np.mean(y)\n",
" x_diff = np.array([x_i - xy_mean[0] for x_i in x])\n",
" y_diff = np.array([y_i - xy_mean[1] for y_i in y])\n",
" diff_xy = np.transpose([x_diff, y_diff])\n",
" \n",
" md = []\n",
" for i in range(len(diff_xy)):\n",
" md.append(np.sqrt(np.dot(np.dot(np.transpose(diff_xy[i]),inv_covariance_xy),diff_xy[i])))\n",
" return md"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 103
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"MahalanobisDist(x,y)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 104,
"text": [
"[1.2401657717422185,\n",
" 0.76023302292171568,\n",
" 0.12775354072754608,\n",
" 1.4656672995350604,\n",
" 1.6451789341156158,\n",
" 0.54436895644805128,\n",
" 2.2309523247827063,\n",
" 1.5436519059004268,\n",
" 1.6619517679622449,\n",
" 0.77103084392595633]"
]
}
],
"prompt_number": 104
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def MD_removeOutliers(x, y):\n",
" MD = MahalanobisDist(x, y)\n",
" threshold = np.mean(MD) * 1.5 # adjust 1.5 accordingly \n",
" nx, ny, outliers = [], [], []\n",
" for i in range(len(MD)):\n",
" if MD[i] <= threshold:\n",
" nx.append(x[i])\n",
" ny.append(y[i])\n",
" else:\n",
" outliers.append(i) # position of removed pair\n",
" return (np.array(nx), np.array(ny), np.array(outliers))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 105
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print 'x:', x\n",
"print 'y:', y\n",
"MD_removeOutliers(x,y)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"x: [4 4 5 2 3 6 9 7 4 5]\n",
"y: [3 7 5 7 9 5 6 2 2 7]\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 106,
"text": [
"(array([4, 4, 5, 2, 3, 6, 7, 4, 5]),\n",
" array([3, 7, 5, 7, 9, 5, 2, 2, 7]),\n",
" array([6]))"
]
}
],
"prompt_number": 106
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The pair in position 6 is removed which is *(9,6)* where *MD = 2.230* Graphing them below:"
]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Plotting in R's ggplot2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we create a dataframe that both the R and Python versions of ggplot will utilize:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas as pd\n",
"\n",
"DF_diff_xy = pd.DataFrame(diff_xy)\n",
"DF_diff_xy.rename(columns = lambda x: str(x), inplace=True)\n",
"DF_diff_xy.rename(columns={\"0\": \"X\"}, inplace=True) # rename a dfcolumn \n",
"DF_diff_xy.rename(columns={\"1\": \"Y\"}, inplace=True) # rename a dfcolumn \n",
"DF_diff_xy"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>X</th>\n",
" <th>Y</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>-0.9</td>\n",
" <td>-2.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>-0.9</td>\n",
" <td> 1.7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td> 0.1</td>\n",
" <td>-0.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>-2.9</td>\n",
" <td> 1.7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>-1.9</td>\n",
" <td> 3.7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td> 1.1</td>\n",
" <td>-0.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td> 4.1</td>\n",
" <td> 0.7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td> 2.1</td>\n",
" <td>-3.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>-0.9</td>\n",
" <td>-3.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td> 0.1</td>\n",
" <td> 1.7</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 118,
"text": [
" X Y\n",
"0 -0.9 -2.3\n",
"1 -0.9 1.7\n",
"2 0.1 -0.3\n",
"3 -2.9 1.7\n",
"4 -1.9 3.7\n",
"5 1.1 -0.3\n",
"6 4.1 0.7\n",
"7 2.1 -3.3\n",
"8 -0.9 -3.3\n",
"9 0.1 1.7"
]
}
],
"prompt_number": 118
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#%load_ext rmagic\n",
"%reload_ext rmagic"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 119
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%R -i DF_diff_xy # list object to be transferred to python here\n",
"install.packages(\"ggplot2\") # Had to add this for some reason, shouldn't be necessary\n",
"library(ggplot2)\n",
"df = data.frame(DF_diff_xy)\n",
"plot = ggplot(df, aes(x = X, y = Y)) + \n",
"geom_point(alpha = .8, color = 'dodgerblue',size = 5) +\n",
"geom_point(data=subset(df, Y >= 0.7 & X >= 4.1), color = 'red',size = 6) +\n",
"theme(axis.text.x = element_text(size= rel(1.5),angle=90, hjust=1)) +\n",
"ggtitle('Distance Pairs with outliers highlighted in red')\n",
"print(plot)\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n1PTp00ecnjmh0LLUe5dddnGLZMcjcznZr/3EpxSfG92Wb7755uzVu+/LGZOcFXBG5qvfSGUY708g\n6TNPM1sEBZzEJDvvvLNbM2dnId/97nflq1/9qjg7Gzn55JPF+eCIni1ut912BWv/pz/9SfRMIcpD\nZnu1nsuWLZNPfOIT8pGPfETOOOOMglX/n//5H/esueCMJZwhOwY33HCDnHnmmSVcQ3GLyrf+MHxG\nqv2pp54qhx9++EiTjcdnx8N4Qe8XDPpzE6WYjNaK8sMFSMDDTWI5prm5Wf7t3/5N/va3v8mFF17o\nJmDtQvvtb38rn/3sZ2WbbbaRnp4e+d///V956qmnZNKkSeIcXcuBBx7ovn/ggQfkzTffFOcMSf7+\n7/9eampq3G672267zR3vnK3IZz7zGZkxY4br8+tf/9rtHly3bp3ceeed4px9u4lF5/OG119/XW65\n5RbRLsJjjz3W3aEmk+9tcn19ffKzn/1MnLMvt25ax8yy3jLy/T3ttNPcgw1NzF4C1q7GkersnK3I\nhAkTZP78+fLMM8/IihUrXAed/1Of+pTstddeOX2y66Dd39dff71cdNFF6a79JUuWyA477OAeDOj8\nuuz77rtPzjnnnHQM/vznP4t66U572223dU103u7ubrnmmmtk5cqVMm/ePPnCF74gnpNOzx60S1CX\nofN89KMflaOPPtqdpaurS6666io3DnrZQYfXXnvNXf8ll1wi//d//zdk/UceeaQ7j/dfpo+Oyxej\n0fh569O/evnk5z//uXR2drrbo1cn3Y51mzz//PPd2devXy833XSTG7fDDjvM3VZ0Hj0A84aRluVN\n17/Znwntkr7jjjtcT/2MLFy4UJYuXep+BrxyI8VHP0e5PjdaLz3Qeeutt9Lx1M+TNzz77LPy+9//\n3vXVWOcbMmPi5zOXuawbb7xRdt11V7nnnntEt41FixaJ02vm7iNKVb/M9fG6eAFuwireLNIljjji\nCPeDrzt6vcZ36aWXuglQK61nXldffbWb8HS67sj0GrHuaDU5O125omfSTueJuxPSnaEmG71GqGeb\nc+fOlY0bN7rtv+666+Tss89OJ2vdOe63337idPG505cvXy777ruvu9MfM2aMnHvuufJ3f/d37jRd\n18EHHyz//u//7iZurYMmP92hFTOsXbtWNMnrwYQOuuPMV2enW9Ntr86r1x8vu+wyN9k98cQTbsIc\n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\nAALxEyABxy9m1BgBBBBAwAIBErAFQaQJCCCAAALxEyABxy9m1BgBBBBAwAIBErAFQaQJCCCAAALx\nEyABxy9m1BgBBBBAwAIBErAFQaQJCCCAAALxEyABxy9m1BgBBBBAwAIBErAFQaQJCCCAAALxEyAB\nxy9m1BgBBBBAwAIBErAFQaQJCCCAAALxEyABxy9m1BgBBBBAwAKBZFTbkEqlJJFIFF09LWNSrugV\nhVTA5vbZ3DbdXGxun81tszl2Gjevfe4LC/+L8rYZ6QRcU1NT9OZQVVUlJuWKXlEIBbRttrfP5thV\nV1dbvW3aGjvdgSeTSWtjZ/N26cUuhN21r1VGNgFrount7fXViMyZTMtlLiOqrwcHB2VgYMDIJapt\nyqyX7bHr7+8ndpkBj8lr7Y3r6+uzMnbe2aHJvjYO4fNip/ELaqitrTVeNNeAjekoiAACCCCAgLkA\nCdjcjpIIIIAAAggYC5CAjekoiAACCCCAgLkACdjcjpIIIIAAAggYC5CAjekoiAACCCCAgLkACdjc\njpIIIIAAAggYC5CAjekoiAACCCCAgLkACdjcjpIIIIAAAggYC5CAjekoiAACCCCAgLkACdjcjpII\nIIAAAggYC5CAjekoiAACCCCAgLkACdjcjpIIIIAAAggYC5CAjekoiAACCCCAgLkACdjcjpIIIIAA\nAggYC5CAjekoiAACCCCAgLkACdjcjpIIIIAAAggYC5CAjekoiAACCCCAgLkACdjcjpIIIIAAAggY\nC5CAjekoiAACCCCAgLkACdjcjpIIIIAAAggYC5CAjekoiAACCCCAgLkACdjcjpIIIIAAAggYC5CA\njekoiAACCCCAgLkACdjcjpIIIIAAAggYC5CAjekoiAACCCCAgLkACdjcjpIIIIAAAggYC5CAjeko\niAACCCCAgLkACdjcjpIIIIAAAggYC5CAjekoiAACCCCAgLkACdjcjpIIIIAAAggYC5CAjekoiAAC\nCCCAgLkACdjcjpIIIIAAAggYC5CAjekoiAACCCCAgLkACdjcjpIIIIAAAggYC5CAjekoiAACCCCA\ngLkACdjcjpIIIIAAAggYC5CAjekoiAACCCCAgLkACdjcjpIIIIAAAggYC5CAjekoiAACCCCAgLkA\nCdjcjpIIIIAAAggYC5CAjekoiAACCCCAgLkACdjcjpIIIIAAAggYC5CAjekoiAACCCCAgLkACdjc\n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\nAAAASUVORK5CYII=\n"
}
],
"prompt_number": 120
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Plotting in the python ggplot port from yhat "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**2013/12/13 Update**\n",
"I can now specify a dataframe per geom, thanks <a href src=\"https://twitter.com/janschulz\">JanSchulz</a> :)<br>\n",
"https://github.com/yhat/ggplot/issues/116#issuecomment-29842170\n",
"________________\n",
"<del>My attempt to plot a subset of the points in the yhat port of ggplot was not succesful. View the discussion here: https://github.com/yhat/ggplot/issues/116</del>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"ggplot(DF_diff_xy, aes(x = 'X', y ='Y')) + \\\n",
" geom_point(alpha=1, size=100, color='dodgerblue') + \\\n",
" geom_point(data = DF_diff_xy[(DF_diff_xy.Y >= 0.7) & (DF_diff_xy.X >= 4.1)],alpha=1, size = 100, color='red') "
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nPgAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x10c748350>"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 122,
"text": [
"<ggplot: (274861849)>"
]
}
],
"prompt_number": 122
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment