{ "metadata": { "name": "hierarchical_clustering" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Hierarchical clustering" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pandas as pd\n", "import numpy as np" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We'll use `rpy2` to create the same sample data as in video." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%load_ext rmagic" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "%%R -o x,y\n", "set.seed(1234); par(mar=c(0,0,0,0))\n", "x <- rnorm(12,mean=rep(1:3,each=4),sd=0.2)\n", "y <- rnorm(12,mean=rep(c(1,2,1),each=4),sd=0.2)\n", "plot(x,y,col='blue',pch=19,cex=2)\n", "text(x+0.05,y+0.05,labels=as.character(0:11))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "display_data", "png": "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\n+n+BkunjqrR7ZQAAAABJRU5ErkJggg==\n" } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "dataFrame = pd.DataFrame(zip(x, y), columns=['x', 'y'])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Performing hierarchical clustering and plotting dendrogram can be done with `scipy`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# compute distance matrix\n", "from scipy.spatial.distance import pdist, squareform\n", "\n", "# not printed as pretty, but the values are correct\n", "distxy = squareform(pdist(dataFrame, metric='euclidean'))\n", "print distxy" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[[ 0. 0.34120511 0.57493739 0.26381786 1.694247 1.65812902\n", " 1.49823399 1.99149025 2.13629539 2.06419586 2.14702468 2.05664233]\n", " [ 0.34120511 0. 0.2410275 0.52578819 1.35818182 1.31960442\n", " 1.16620981 1.69093111 1.83167669 1.76999236 1.85183204 1.74662555]\n", " [ 0.57493739 0.2410275 0. 0.71861759 1.11952883 1.08338841\n", " 0.92568723 1.45648906 1.67835968 1.6310979 1.71074417 1.58658782]\n", " [ 0.26381786 0.52578819 0.71861759 0. 1.80666768 1.78081321\n", " 1.60131659 2.0284949 2.35675598 2.2923948 2.37461984 2.27232243]\n", " [ 1.694247 1.35818182 1.11952883 1.80666768 0. 0.08150268\n", " 0.21110433 0.617042 1.18349654 1.23847877 1.28153948 1.07700974]\n", " [ 1.65812902 1.31960442 1.08338841 1.78081321 0.08150268 0.\n", " 0.21666557 0.69791931 1.11500116 1.16550201 1.21077373 1.00777231]\n", " [ 1.49823399 1.16620981 0.92568723 1.60131659 0.21110433 0.21666557\n", " 0. 0.65062566 1.28582631 1.32063059 1.37369662 1.17740375]\n", " [ 1.99149025 1.69093111 1.45648906 2.0284949 0.617042 0.69791931\n", " 0.65062566 0. 1.76460709 1.83517785 1.86999431 1.66223814]\n", " [ 2.13629539 1.83167669 1.67835968 2.35675598 1.18349654 1.11500116\n", " 1.28582631 1.76460709 0. 0.14090406 0.11624471 0.10848966]\n", " [ 2.06419586 1.76999236 1.6310979 2.2923948 1.23847877 1.16550201\n", " 1.32063059 1.83517785 0.14090406 0. 0.0831757 0.19128645]\n", " [ 2.14702468 1.85183204 1.71074417 2.37461984 1.28153948 1.21077373\n", " 1.37369662 1.86999431 0.11624471 0.0831757 0. 0.20802789]\n", " [ 2.05664233 1.74662555 1.58658782 2.27232243 1.07700974 1.00777231\n", " 1.17740375 1.66223814 0.10848966 0.19128645 0.20802789 0. ]]\n" ] } ], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "# perform clustering and plot the dendrogram\n", "from scipy.cluster.hierarchy import linkage, dendrogram\n", "\n", "R = dendrogram(linkage(distxy, method='complete'))\n", "\n", "xlabel('points')\n", "ylabel('Height')\n", "suptitle('Cluster Dendrogram', fontweight='bold', fontsize=14);" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "display_data", "png": "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\n" } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Heatmap\n", "\n", "We'll again use `rpy2` to create the data:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%R -i x,y -o dataMatrix\n", "dataFrame <- data.frame(x=x,y=y)\n", "set.seed(143)\n", "dataMatrix <- as.matrix(dataFrame)[sample(1:12),]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "To plot dendrograms with heatmap as in the video, we'll need to create our own function." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# a simple function to compute hierarchical cluster on both rows and columns, and plot heatmaps\n", "def heatmap(dm):\n", " from scipy.cluster.hierarchy import linkage, dendrogram\n", " from scipy.spatial.distance import pdist, squareform\n", " \n", " D1 = squareform(pdist(dm, metric='euclidean'))\n", " D2 = squareform(pdist(dm.T, metric='euclidean'))\n", " \n", " f = figure(figsize=(8, 8))\n", "\n", " # add first dendrogram\n", " ax1 = f.add_axes([0.09, 0.1, 0.2, 0.6])\n", " Y = linkage(D1, method='complete')\n", " Z1 = dendrogram(Y, orientation='right')\n", " ax1.set_xticks([])\n", " ax1.set_yticks([])\n", "\n", " # add second dendrogram\n", " ax2 = f.add_axes([0.3, 0.71, 0.6, 0.2])\n", " Y = linkage(D2, method='complete')\n", " Z2 = dendrogram(Y)\n", " ax2.set_xticks([])\n", " ax2.set_yticks([])\n", "\n", " # add matrix plot\n", " axmatrix = f.add_axes([0.3, 0.1, 0.6, 0.6])\n", " idx1 = Z1['leaves']\n", " idx2 = Z2['leaves']\n", " D = D1[idx1, :]\n", " D = D[:, idx2]\n", " im = axmatrix.matshow(D, aspect='auto', origin='lower', cmap='hot')\n", " axmatrix.set_xticks([])\n", " axmatrix.set_yticks([])\n", " \n", " return {'ordered' : D, 'rorder' : Z1['leaves'], 'corder' : Z2['leaves']}" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "heatmap(dataMatrix)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 13, "text": [ "{'corder': [0, 1],\n", " 'ordered': array([[ 2.05664233, 0. ],\n", " [ 2.27232243, 0.26381786],\n", " [ 1.58658782, 0.57493739],\n", " [ 1.74662555, 0.34120511],\n", " [ 0. , 2.05664233],\n", " [ 0.10848966, 2.13629539],\n", " [ 0.20802789, 2.14702468],\n", " [ 0.19128645, 2.06419586],\n", " [ 1.66223814, 1.99149025],\n", " [ 1.17740375, 1.49823399],\n", " [ 1.07700974, 1.694247 ],\n", " [ 1.00777231, 1.65812902]]),\n", " 'rorder': [1, 3, 7, 9, 0, 6, 4, 10, 2, 5, 8, 11]}" ] }, { "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAeAAAAHgCAYAAAB91L6VAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADUNJREFUeJzt3V1onYUdx/H/06a282WdlQm2blSGY+ALgjKlZVqGqxNU\n0Jt5M/TKG5FBHV6IjnY4GKJjiIiMXTgd6FTwYmHgLM5SrBfzpSBjoNUVq9V1bZ1d21gTc3YR5tzs\nSXOSc/LLc/L5QC6SE3N+EJqvT54n52k6nU6nAIB5tSQ9AAAWIwEGgAABBoAAAQaAgJH0AHKapklP\nABh63a51FuBFzkXwAIMz3YGOX0EDQIAAA0CAAANAgAADQICLsGAAbryx6p130itg5i68sOrhh9Mr\nFpfGa0EvXk3TuAp6QFaurHrqqapTT00vgRN7992qO++s2rUrvWT4TPdz1hEwDMill06FGBY64c1w\nDhgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIE\nGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQY\nAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgA\nAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAAC\nBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIE\nGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQY\nAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgA\nAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAppOp9NJjyCjaZr0BICh1y2zI/O8gwXE/3sB5PgVNAAE\nCDAABAgwAAQIMAAEdL0IyxWyw+V4F1z5HgMM3qyugnaV7HCYLrSdS+ZxCPTDn9IDYOaa07o/5lfQ\nABAgwAAQIMAAECDAABAgwAAQIMAAECDAABAgwAAQIMAAECDAABAgwAAQIMAAECDAABAw7d2QaKd9\nn3xS33711fpkcjI9BYAuBHgI/XNiopZU1csXX1xVVWuycwA4DgEeUiNNU6uXL0/PAKAL54ABIECA\nASBAgAEgQIABIECAASBAgAEgQIABIECAASBAgAEgQIABIECAASDAa0G31KedTt23Z0+NHeeORwfG\nx+vYTO+E9NU+D4NBOyU9APrDEXBL7R8fr5/u3p2eAcAsOQJusVOXLq3Na9d+4eNvHD1azx48OP+D\nAJgxR8AAECDAABAgwAAQIMAAECDAABAgwAAQIMAAECDAABAgwAAQIMAAECDAABDgtaCH1ESnU3uP\nHUvPAKALAR5CXxkZqcmquuSVV9JTAOhCgIfQmSedVLsvu+yz95vgFgCOzzlgAAgQYAAIEGAACBBg\nAAgQYAAIcBX0ANy+a1c9vm/fQJ9jstOpscnJgT4HAIMjwAOwa2ysfnbOOXXVqlUDe45/jI/X93bu\nHNjXB2CwBHhAVi1bVquXLx/Y11/aNNU0/sIXoK2cAwaAAAEGgAABBoAAAQaAABdhLXZfSw+AHu1I\nD4D+cAQMAAECDAABAgwAAQIMAAECDAABAgwAAQIMAAECDAABAgwAAQIMAAECDAABAgwAAQIMAAHu\nhtRixzqd+v3+/ekZAMyCALfUypGR2nj66fWr999PTwFgFgS4pVYsWVJPnnfejD63GfAWAHrnHDAA\nBLTuCPi++6q2bUuvmN5fVp5V9cv0CgAWstYFeHS0auPGqgsuSC/p7uf7D1XVl9MzAFjAWhfgqqp1\n66o2bEiv6O7Xrx8pAQZgOs4BA0CAAANAgAADQIAAA0CAAANAgAADQIAAA0CAAANAQCtfiIM+8pKZ\ntM2X7kkvgB7c1fURR8AAECDAABAgwAAQIMAAECDAABAgwAAQIMAAECDAABAgwAAQIMAAECDAABAg\nwAAQIMAAEOBuSAPy+L599drhw+kZACxQjoAH4NY1a+pbJ5+cngHAAuYIeAA2rlpVG1etSs/4zJb0\nAAC+wBEwAAQIMAAECDAABAgwAAQIMAAECDAABAgwAAQIMAAECDAABAgwAAQIMAAECDAABLgZwyL3\nXTdtomWe76xNT4C+cAQMAAECDAABAgwAAQIMAAECDAABAgwAAQIMAAECDAABAgwAAQIMAAECDAAB\nAgwAAQIMAAHuhjSMdu6suvvu9AoApiHAw+j116sOH67atGnq/dHR7B4AvkCAh9XZZ1dde216BQBd\n9Bzgw4erDh0axJSZGR/PPTcA9EvPAb7yyqq33qpatmwQc05MgAEYBj0H+OOPq557ruqiiwYx58Q2\nbMg8LwD0kz9DAoAAAQaAAAEGgAABBoAAAQaAAAEGgAABBoAAAQaAAAEeNh98UPXaa1UTE+klAEzD\nzRiGzYMPVj3xRNW6dTP69NArisIcfCM9APpCgIfN5GTV+vVVK1aklwAwDb+CBoAAAQaAAAEGgAAB\nBoAAAQaAAAEGgAABBoAAAQaAAAEGgAABBoAAAQaAAAEGgAABHkYjI1VPP121evXUGwALjgAPo/PP\nr3r77aqXX556A2DBcTvCYdQ0VWedlV4BwDQcAQNAgAADQIAAA0CAAANAgIuw2uzee6u2b//fj73x\nRtVNN2X2ADBjAtxmo6NVV1899WdH//HYY7k9AMyYALfd+vVVl1/+3/dfeim3BYAZcw4YAAIEGAAC\nBBgAAgQYAAIEGAACXAW9yL2bHgA9m0gPgL5wBAwAAQIMAAECDAABAgwAAQIMAAECDAABAgwAAQIM\nAAECDAABAgwAAQIMAAECDAABbsYwjA4dqtq7N70CgGkI8LBZu7Zq8+aqRx9NLwFgGgI8bG65Zert\n85omswWArpwDBoCAVh4BP/JI1QsvpFfknfP3q+qm9AgAZqV1R8CbNk2d5gSANmvdEfB11029UVXP\nP1tV30mvAGAWWncEDADDQIABIECAASBAgAEgQIABIECAASBAgAEgQIABIKB1L8RBf+1OD4CevZUe\nAH3hCBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAtwN\nqe1efLHqo4/SKwDokQC32TXXVG3fXrVjR3oJAD0S4Da7446ptxNpmsFvAaAnzgEDQIAAA0CAAANA\ngAADQIAAA0CAAANAgAADQIAAA0CAAANAgAADQIAAA0CAAANAgJsxLHJHOmemJ0BPftTcnJ4AfeEI\nGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAAC3A2pZR76\n80O178i+9AwA5sgRcMtsenZTTUxOpGcAMEeOgFvorsvvqhUjK2b8+VtqywDXADAbjoABIECAASBA\ngAEgQIABIECAASBAgAEgQIABIECAASBAgAEgQIABIECAASDAa0HP0YdjH9bYxNi8PV+n05m35wJg\ncAR4jtb8Yk2tXLGymmrm5fk+7Xza3y/4N7c2pF2uTA+AHjwwzWMCPEdjE2N1ZNORapr5CfCKe2Z+\nFyQAFi7ngAEgQIABIECAASBAgAEgQIABIECAASBAgAEgQIABIECAASBAgAEgQIABIECAASDAzRha\npmmauuF3N9TSJUvTUwCYAwFuma0/3FoHxw729N+M1uiA1gAwWwLcMuu/vj49AYA+cA4YAAIEGAAC\nBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACZvVa0Nu2Ve3Z0+8pLbX/m+kFALRQ\nzwG+/vqqrVsHMaWlTrokvWBuzumkF0BPfltNegL0RdPpdI77E7hpmuryEJ/TbGlq8ieT1TQL94dC\nt++l7zFt9IMF/G8N/t+TVV1/zjoHDAABAgwAAQIMAAECDAABAgwAAQIMAAECDAABAgwAAQIMAAEC\nDAABAgwAAQIMAAGzuh0hWbf+4dZ65q/PpGcAMAcC3EJvHniz7t94f12x9ooZff6aH68Z8CIAeiXA\nLXXGyWfU6tNWp2cAMEvOAQNAgAADQIAAA0CAAANAgAADQIAAA0CAAANAgAADQIAAA0CAAANAgAAD\nQIDXgu6Dzds2V1PNvD3fe4fem7fnAmAwBHiOHvj+A3Vg7EB6xhz8Jj0AejKaHgB9IsBzdNult837\nc+7Ys2PenxOA/nIOGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAAgQYAAIEGAACBBgAArwW\ndEsdOHqg9v5rb3oGALMkwC107hnn1u1/vD09A4A5aDqdTue4DzRNdXmIlun2vZz6+CPzPwjm4JTm\n5vQEmLGjVV1b6hwwAAQIMAAECDAABAgwAAQIMAAECDAABAgwAAQIMAAECDAABAgwAAQIMAAECDAA\nBEx7MwaGR7ebMQAwWN1uxtA1wADA4PgVNAAECDAABAgwAAQIMAAECDAABAgwAAT8G3rudhLxpAed\nAAAAAElFTkSuQmCC\n" } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }