Created
June 17, 2016 02:43
-
-
Save olgabot/a34e8805a64cd6f7a9d232fc0b307cf5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"collapsed": true | |
}, | |
"source": [ | |
"# Getting colors for plotting and evaluating clustering\n", | |
"\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'/Users/olga/workspace-git/single-cell-bioinformatics/notebooks'" | |
] | |
}, | |
"execution_count": 5, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"pwd" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"# Baked-in within python modules\n", | |
"from collections import defaultdict\n", | |
"\n", | |
"# Alphabetical order for nonstandard python modules is conventional\n", | |
"# We're doing \"import superlongname as abbrev\" for our laziness - this way we don't have to type out the whole thing each time.\n", | |
"\n", | |
"# Python plotting library\n", | |
"import matplotlib as mpl\n", | |
"import matplotlib.pyplot as plt\n", | |
"\n", | |
"# Numerical python library (pronounced \"num-pie\")\n", | |
"import numpy as np\n", | |
"\n", | |
"# Dataframes in Python\n", | |
"import pandas as pd\n", | |
"\n", | |
"# T-test of independent samples\n", | |
"from scipy.stats import ttest_ind\n", | |
"\n", | |
"# Statistical plotting library we'll use\n", | |
"import seaborn as sns\n", | |
"sns.set(style='whitegrid')\n", | |
"\n", | |
"# Matrix decomposition\n", | |
"from sklearn.decomposition import PCA, FastICA\n", | |
"\n", | |
"# Manifold learning\n", | |
"from sklearn.manifold import MDS, TSNE\n", | |
"\n", | |
"# Clustering\n", | |
"from sklearn.cluster import KMeans, MiniBatchKMeans\n", | |
"\n", | |
"# Plotting dendrograms\n", | |
"from scipy.cluster import hierarchy\n", | |
"\n", | |
"# This is necessary to show the plotted figures inside the notebook -- \"inline\" with the notebook cells\n", | |
"%matplotlib inline" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"macaulay2016_expression_filtered.shape (363, 20672)\n" | |
] | |
} | |
], | |
"source": [ | |
"macaulay2016_expression = pd.read_csv('../data/macaulay2016/gene_expression_s.csv', index_col=0)\n", | |
"\n", | |
"\n", | |
"# Set maximum columns to display as 50 because the dataframe has 49 columns\n", | |
"pd.options.display.max_columns = 50\n", | |
"\n", | |
"macaulay2016_metadata = pd.read_csv('../data/macaulay2016/sample_info_qc.csv', index_col=0)\n", | |
"# Add column for gfp\n", | |
"macaulay2016_metadata['gfp_color'] = ['#31a354' if c == 'HIGH' else '#e5f5e0' for c in macaulay2016_metadata['condition']]\n", | |
"\n", | |
"# Necessary step for converting the parsed cluster color to be usable with matplotlib\n", | |
"macaulay2016_metadata['cluster_color'] = macaulay2016_metadata['cluster_color'].map(eval)\n", | |
"\n", | |
"# --- Filter macaulay2016 data --- #\n", | |
"ensembl_genes = [x for x in macaulay2016_expression.index if x.startswith('ENS')]\n", | |
"cells_pass_qc = macaulay2016_metadata[\"Pass QC\"].index[macaulay2016_metadata[\"Pass QC\"]]\n", | |
"\n", | |
"macaulay2016_expression_filtered = macaulay2016_expression.loc[ensembl_genes, cells_pass_qc]\n", | |
"\n", | |
"# Recalculate TPM\n", | |
"macaulay2016_expression_filtered = 1e6 * macaulay2016_expression_filtered / macaulay2016_expression_filtered.sum()\n", | |
"\n", | |
"# Transpose so it's machine learning format\n", | |
"macaulay2016_expression_filtered = macaulay2016_expression_filtered.T\n", | |
"\n", | |
"# Take only \"expressed genes\" with expression greater than 1 in at least 3 cells\n", | |
"mask = (macaulay2016_expression_filtered > 1).sum() >= 3\n", | |
"macaulay2016_expression_filtered = macaulay2016_expression_filtered.loc[:, mask]\n", | |
"print('macaulay2016_expression_filtered.shape', macaulay2016_expression_filtered.shape)\n", | |
"\n", | |
"# Add 1 and log10\n", | |
"macaulay2016_expression_log10 = np.log10(macaulay2016_expression_filtered + 1)\n", | |
"\n", | |
"# Macaulay2016 plotting colors\n", | |
"macaulay2016_gfp_colors = macaulay2016_metadata.loc[macaulay2016_expression_log10.index, 'gfp_color']\n", | |
"\n", | |
"# Get cluster colors from the paper\n", | |
"macaulay2016_cluster_colors_from_paper = macaulay2016_metadata.loc[macaulay2016_expression_log10.index, 'cluster_color']\n", | |
"macaulay2016_clusters_from_paper = macaulay2016_metadata.loc[macaulay2016_expression_log10.index, 'cluster']\n", | |
"macaulay2016_cluster_to_color_from_paper = dict(zip(macaulay2016_clusters_from_paper, macaulay2016_cluster_colors_from_paper))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Clarification of hierarchical clustering goals\n", | |
"\n", | |
"Use hierarchical clustering on either PCA or ICA to assign clusters to the Macaulay data and plot the PCA (or ICA) plot with the reduced clusters. **Are you able to recover the original clusters?** Use as many code cells as you need.\n", | |
"\n", | |
"To clarify, the full steps for evaluating your hierarchical clustering on the Macaulay2016 dataset are:\n", | |
"\n", | |
"1. Perform dimensionality reduction\n", | |
"2. Cluster the reduced data\n", | |
"3. Cut the dendrogram from the clustered data\n", | |
"4. Get the cluster colors and assignments\n", | |
"5. Re-plot the data with the sample colors\n", | |
"6. See how your clusters match with the Macaulay dataset" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## How to get any number of colors for your data" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 33, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"KMeans(copy_x=True, init='k-means++', max_iter=300, n_clusters=6, n_init=10,\n", | |
" n_jobs=1, precompute_distances='auto', random_state=0, tol=0.0001,\n", | |
" verbose=0)" | |
] | |
}, | |
"execution_count": 33, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"kmeans = KMeans(n_clusters=6, random_state=0)\n", | |
"kmeans.fit(macaulay2016_expression_log10)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 34, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"macaulay2016_smusher = PCA(n_components=2)\n", | |
"macaulay2016_smushed = pd.DataFrame(\n", | |
" macaulay2016_smusher.fit_transform(macaulay2016_expression_log10),\n", | |
" index=macaulay2016_expression_log10.index)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 35, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>0</th>\n", | |
" <th>1</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>12.833591</td>\n", | |
" <td>-3.415328</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>-27.517659</td>\n", | |
" <td>8.839435</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>19.114796</td>\n", | |
" <td>-5.499131</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>-13.953338</td>\n", | |
" <td>13.809434</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>-44.785815</td>\n", | |
" <td>-14.814970</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>2.857253</td>\n", | |
" <td>9.130688</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" 0 1\n", | |
"0 12.833591 -3.415328\n", | |
"1 -27.517659 8.839435\n", | |
"2 19.114796 -5.499131\n", | |
"3 -13.953338 13.809434\n", | |
"4 -44.785815 -14.814970\n", | |
"5 2.857253 9.130688" | |
] | |
}, | |
"execution_count": 35, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"macaulay2016_kmeans_centroids = pd.DataFrame(macaulay2016_smusher.transform(\n", | |
" kmeans.cluster_centers_))\n", | |
"macaulay2016_kmeans_centroids" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 36, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<matplotlib.collections.PathCollection at 0x111dbd0f0>" | |
] | |
}, | |
"execution_count": 36, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/Users/olga/anaconda3/envs/single-cell-bioinformatics/lib/python3.5/site-packages/matplotlib/figure.py:1744: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.\n", | |
" warnings.warn(\"This figure includes Axes that are not \"\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "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\nWbnSx9KlvnNWrvSd6OlJejmefvppHxD878ZbbvE5u7t9vV6vr7e311dbWxt2/9NPP93vGL1er+9E\nT49v77FjvhM9Pb5er3fA8qfzs+/t7fWd6OnxvRtRvsE8Jtr98Rw3msi69/b2+hbU1IS9z5H/Laip\n8b3b1ubrcrt97x475mPp0uB//zx0yHd+fb3vnJUrfR1dXb7OkyfD3vfOkyd9t27cmJLvTyLkdx9/\njElmC+rbwCpFUfKAt4E/JPHYIgelo+ussrKS2tra4Pbpf3j0UcwFBdTX17N48eKwbdVra2uprKzs\nd4xY3Vrxlj/Vq1XEM0Y20GOi3Q/0u63QYBh0XfR6PasbG4G+rUIiLaipYczNN3PWihXBfadCW6xT\nR43i8S98gfH+VHafz8fzCxey325nstWKXqfj13PnStr5MDSkT0xV1Q+Ai/z/fhe4LAllEgJIfGB/\nMCd8vX/fJCAYjJqamsICE/QFp3j3Vxps+VOdZBFPoBzoMdHuzzcYwm77qLOTcSZTQnUxGgw0rFoV\nNUDd86tfoaxcCfTtO9Xe1RU2J+qXL73E5r17mTFuHN+/+GIeffNN/vMzn2FMcTEFBgM6nY58vV4S\nJIYhuaQQmpXowP5gT/jRglSoRILTYMqf6pbiYFaCiPWYWPdH3hZtqaZ46uL1evnKbbdFve8n3/kO\nn7zgAt5sa+OcsWMpNBq5+ckneeKmmzjc2cmyHTsA2G+3899XX83fDxxAP2sW3/3rX3lu3z4mmEx9\n34Ek7zAsUk8ClNCsRCetJnLC1+v11NfXRw1Q9fX1CW2fHm/5Y538k9X1N5iVIGI9Jtb9obflGwxx\nBcMSqzVsxfZ8vZ7Ft94a9b2Hvm6/W7xennzgAcaMGMEdW7aw6d13g8kngdebYDJh0Ot58qab+KCj\ngw179gDQ5nJx0OHgrFGjBv3eicySACU0I1kn5ES6Bj0eD4v84yqRFi9enFALKl56na7fmAkkr+tv\nMCtBDLS3U+T9kbfFEwzHl5f328Y+tGvvC7fcwuqGBr5+xx3BHYIfXbcOnU5Hy+zZvHjgQPBzzdPr\n+wVJvU5HecQ6gBMtlsG8ZUIjJEAJzUjkhBwtqA22a9Dr9bLIZos6/gEfd/ulKkgdcDiY1djIZKuV\n/XY7u+rqmDJyZMyWoJb35IonGB4M6QaM3Ma+dNYs/vfMM/n3mjW88tvfBncIBvj9737H49dfz8rK\n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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x111c12320>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig, ax = plt.subplots()\n", | |
"\n", | |
"ax.scatter(macaulay2016_smushed[0], macaulay2016_smushed[1], color=\"Teal\", \n", | |
" linewidth=1, edgecolor='white')\n", | |
"ax.scatter(macaulay2016_kmeans_centroids[0], macaulay2016_kmeans_centroids[1], \n", | |
" color='k', marker='x', s=100, linewidth=3)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 37, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([3, 3, 4, 3, 5, 3, 4, 5, 5, 4, 1, 5, 4, 5, 1, 3, 5, 4, 4, 3, 1, 5, 1,\n", | |
" 5, 4, 5, 5, 5, 3, 3, 3, 5, 5, 3, 5, 5, 1, 5, 1, 3, 3, 2, 4, 5, 3, 5,\n", | |
" 5, 4, 3, 3, 4, 5, 5, 4, 5, 2, 4, 4, 5, 3, 1, 5, 3, 1, 1, 3, 5, 5, 5,\n", | |
" 4, 4, 5, 3, 1, 1, 3, 5, 5, 4, 4, 1, 4, 1, 5, 5, 3, 5, 1, 5, 2, 4, 4,\n", | |
" 5, 4, 4, 1, 5, 1, 0, 1, 2, 5, 5, 4, 5, 4, 5, 5, 5, 4, 3, 3, 5, 5, 5,\n", | |
" 4, 2, 3, 5, 3, 3, 4, 2, 4, 1, 2, 5, 4, 5, 5, 5, 1, 4, 3, 5, 1, 4, 4,\n", | |
" 5, 3, 5, 4, 5, 2, 5, 4, 1, 5, 5, 4, 5, 3, 5, 3, 3, 1, 1, 5, 5, 5, 5,\n", | |
" 2, 3, 5, 1, 4, 3, 1, 5, 5, 5, 4, 4, 4, 1, 4, 5, 5, 5, 4, 3, 4, 4, 5,\n", | |
" 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 5,\n", | |
" 2, 2, 1, 2, 2, 2, 2, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", | |
" 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", | |
" 2, 2, 3, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 5, 2, 2,\n", | |
" 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 1, 2, 2,\n", | |
" 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2,\n", | |
" 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 3, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2,\n", | |
" 2, 2, 5, 4, 2, 5, 2, 2, 2, 3, 2, 2, 2, 2, 5, 2, 2, 2], dtype=int32)" | |
] | |
}, | |
"execution_count": 37, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"kmeans.predict(macaulay2016_expression_log10)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 38, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[(0.89411765336990356, 0.10196078568696976, 0.1098039224743836),\n", | |
" (0.21602460800432688, 0.49487120380588578, 0.71987698697576341),\n", | |
" (0.30426760128900115, 0.68329106055054012, 0.29293349969620797),\n", | |
" (0.60083047361934894, 0.30814303335021531, 0.63169552298153153),\n", | |
" (1.0, 0.50591311045721454, 0.0031372549487094226),\n", | |
" (0.99315647868549106, 0.98700499826786559, 0.19915417450315831),\n", | |
" (0.65845446095747096, 0.34122261685483596, 0.17079585352364723),\n", | |
" (0.95850826852461857, 0.50846600392285535, 0.7449288887136124),\n", | |
" (0.60000002384185791, 0.60000002384185791, 0.60000002384185791)]" | |
] | |
}, | |
"execution_count": 38, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/Users/olga/anaconda3/envs/single-cell-bioinformatics/lib/python3.5/site-packages/matplotlib/figure.py:1744: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.\n", | |
" warnings.warn(\"This figure includes Axes that are not \"\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAABACAYAAACKusa+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAAexJREFUeJzt2zErx0EAxvH7y25SJptSBum8CyXvwGYxW4nVbLF5B1Le\nhUsGpWwmZfIKfnbx37jj+XzGu+UZv3XdbJqmAgBAjoXeAwAA+F0CEAAgjAAEAAgjAAEAwghAAIAw\ni/MuW2u+CAMA/GG11tnns7kBWEopK7t7P7PmD3u9uS6HN2+9ZwzlYne5nL4c954xnJPVs9LOHnvP\nGE493ij1drv3jKG0nbuytXnQe8Zw7h8uy/P5fu8ZQ1k7uirrt++9ZwznaWeptNZ6zxhOrfXLc0/A\nAABhBCAAQBgBCAAQRgACAIQRgAAAYQQgAEAYAQgAEEYAAgCEEYAAAGEEIABAGAEIABBGAAIAhBGA\nAABhBCAAQBgBCAAQRgACAIQRgAAAYQQgAEAYAQgAEEYAAgCEEYAAAGEEIABAGAEIABBGAAIAhBGA\nAABhBCAAQBgBCAAQRgACAIQRgAAAYQQgAEAYAQgAEEYAAgCEEYAAAGEEIABAGAEIABBGAAIAhBGA\nAABhBCAAQBgBCAAQRgACAIQRgAAAYQQgAEAYAQgAEEYAAgCEEYAAAGEEIABAGAEIABBGAAIAhBGA\nAABhZtM0fXvZWvv+EgCA4dVaZ5/P5gYgAAD/jydgAIAwAhAAIIwABAAIIwABAMIIQACAMB9i1Sx5\nnb/DLwAAAABJRU5ErkJggg==\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x111d8f898>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"sns.choose_colorbrewer_palette('qualitative')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 39, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/Users/olga/anaconda3/envs/single-cell-bioinformatics/lib/python3.5/site-packages/matplotlib/figure.py:1744: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.\n", | |
" warnings.warn(\"This figure includes Axes that are not \"\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAABACAYAAABP0uObAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAAZxJREFUeJzt2jFKHVEUgOH7REgjuILYuII4YpkyXTo34AJcjQvIIuyy\nBHF0BTZKFhBIYxEmbXg8XxWZP/B95TnNqeaHy2yWZRkAUHOw9gEAsItAAZAkUAAkCRQASQIFQNLh\nvuU8z37xA+DdTdO02Z7tDdQYY9z+vn2fa/5Dn39cjuOT1/Hz+cPap2Qcn7yOT7++r31GxuPRl3F2\ndr/2GSkPD+fj+tvL2mdk3Fx9HKcXvqt/e7r7unPuiQ+AJIECIEmgAEgSKACSBAqAJIECIEmgAEgS\nKACSBAqAJIECIEmgAEgSKACSBAqAJIECIEmgAEgSKACSBAqAJIECIEmgAEgSKACSBAqAJIECIEmg\nAEgSKACSBAqAJIECIEmgAEgSKACSBAqAJIECIEmgAEgSKACSBAqAJIECIEmgAEgSKACSBAqAJIEC\nIEmgAEgSKACSBAqAJIECIEmgAEgSKACSBAqAJIECIEmgAEgSKACSBAqApM2yLG8u53l+ewkA/8g0\nTZvt2d5AAcBaPPEBkCRQACQJFABJAgVAkkABkPQHwz0leYoIxsIAAAAASUVORK5CYII=\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x104e61358>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"sns.palplot(sns.color_palette('Accent'))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 40, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/Users/olga/anaconda3/envs/single-cell-bioinformatics/lib/python3.5/site-packages/matplotlib/figure.py:1744: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.\n", | |
" warnings.warn(\"This figure includes Axes that are not \"\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAABACAYAAACKusa+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAAfhJREFUeJzt26FKZkEAhuE5oiDYNWvwAvZYBftisRoUwQvYtVkWi029\nAGHRYLWIXbB6vADDbl67IBiO/Uf/uDO73/PEmfLFF4bpxnEsAADkmKk9AACAv0sAAgCEEYAAAGEE\nIABAGAEIABBmdtrlMAy+CAMA/MP6vu8mz6YGYCmlLM9pwEm/37qy+Oe59oymPC8tlvmHp9ozmvO6\ntlpebh5rz2jOwuaX8uv8vvaMpqzsr5e749vaM5qzcfi1XB5c1Z7RlJ2T7fJj77T2jOYc/fxedre+\n1Z7RnIvrsw/PPQEDAIQRgAAAYQQgAEAYAQgAEEYAAgCEEYAAAGEEIABAGAEIABBGAAIAhBGAAABh\nBCAAQBgBCAAQRgACAIQRgAAAYQQgAEAYAQgAEEYAAgCEEYAAAGEEIABAGAEIABBGAAIAhBGAAABh\nBCAAQBgBCAAQRgACAIQRgAAAYQQgAEAYAQgAEEYAAgCEEYAAAGEEIABAGAEIABBGAAIAhBGAAABh\nBCAAQBgBCAAQRgACAIQRgAAAYQQgAEAYAQgAEEYAAgCEEYAAAGEEIABAGAEIABBGAAIAhBGAAABh\nBCAAQBgBCAAQRgACAITpxnH89HIYhs8vAQBoXt/33eTZ1AAEAOD/4wkYACCMAAQACCMAAQDCCEAA\ngDACEAAgzDuJtCx5xTH/DAAAAABJRU5ErkJggg==\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x114485f60>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"alskdjflkasjdf_palette = sns.choose_cubehelix_palette()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 41, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[array([ 0.25199714, 0.49873371, 0.57516028, 1. ]),\n", | |
" array([ 0.43026136, 0.62000665, 0.67878019, 1. ]),\n", | |
" array([ 0.60852558, 0.74127959, 0.7824001 , 1. ]),\n", | |
" array([ 0.7867898 , 0.86255253, 0.88602001, 1. ]),\n", | |
" array([ 0.95, 0.95, 0.95, 1. ]),\n", | |
" array([ 0.95457726, 0.76653099, 0.78032569, 1. ]),\n", | |
" array([ 0.91971827, 0.58735877, 0.61174 , 1. ]),\n", | |
" array([ 0.88485928, 0.40818655, 0.44315432, 1. ]),\n", | |
" array([ 0.85104086, 0.23436275, 0.27960104, 1. ])]" | |
] | |
}, | |
"execution_count": 41, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/Users/olga/anaconda3/envs/single-cell-bioinformatics/lib/python3.5/site-packages/matplotlib/figure.py:1744: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.\n", | |
" warnings.warn(\"This figure includes Axes that are not \"\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAABACAYAAACKusa+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAAfVJREFUeJzt2yEvhVEAxvFzDZtgkkq7mu3uDTbfwScQFF3RZE3RFcEn\n8B1swjub5jaqZIIN26sbt3EOz+8XzylP/G9nZzQMQwEAIMdc7QEAAPwuAQgAEEYAAgCEEYAAAGEE\nIABAmPlZl33f+yIMAPCHdV03+nw2MwBLKeXw8upn1vxhJzvb5fz2vvaMpuxtrpebp7faM5ozWVko\n7yurtWc0Z/7psYzH49ozmjKdTsvGy2vtGc25W1osa9c3tWc05WFrUlbPLmrPaM7j/m5ZPjiqPaM5\nz6fHX557AgYACCMAAQDCCEAAgDACEAAgjAAEAAgjAAEAwghAAIAwAhAAIIwABAAIIwABAMIIQACA\nMAIQACCMAAQACCMAAQDCCEAAgDACEAAgjAAEAAgjAAEAwghAAIAwAhAAIIwABAAIIwABAMIIQACA\nMAIQACCMAAQACCMAAQDCCEAAgDACEAAgjAAEAAgjAAEAwghAAIAwAhAAIIwABAAIIwABAMIIQACA\nMAIQACCMAAQACCMAAQDCCEAAgDACEAAgjAAEAAgjAAEAwghAAIAwAhAAIIwABAAIIwABAMIIQACA\nMAIQACCMAAQACDMahuHby77vv78EAKB5XdeNPp/NDEAAAP4fT8AAAGEEIABAGAEIABBGAAIAhBGA\nAABhPgBvUSx5GIplwwAAAABJRU5ErkJggg==\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x111bab940>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"sns.choose_diverging_palette()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 42, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/Users/olga/anaconda3/envs/single-cell-bioinformatics/lib/python3.5/site-packages/matplotlib/figure.py:1744: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.\n", | |
" warnings.warn(\"This figure includes Axes that are not \"\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA6AAAABACAYAAAAEaRquAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAAntJREFUeJzt3L9LlVEAxvFz+/F/1CTN79YoQVM4XcStQmoQBKF00SkX\nMxAEh0K0LeJO0RREU7S9W9AS2Bz0F4S87eK9EORzTvj5jOcsz/qFwxkNw1AAAADgol2pPQAAAIDL\nQYACAAAQIUABAACIEKAAAABECFAAAAAirs267PveF7kAAAD8ta7rRmfPZgZoKaV8/Tx3MWv+Yz9/\nfS/zC6fl07urtac0Z37htLw9Oqk9ozmLD2+W/ecfas9o0ur63bK5cVB7RnO2d1bKo+W12jOa8+pw\nr4zH49ozmjSZTMra/eXaM5qz9/qwHKxu1J7RnJX9nfJx60XtGU268+xJ+bF7XHtGc248fVCuv3xf\ne0Zzfj++V269+VJ7RpO+Ld0+99wTXAAAACIEKAAAABECFAAAgAgBCgAAQIQABQAAIEKAAgAAECFA\nAQAAiBCgAAAARAhQAAAAIgQoAAAAEQIUAACACAEKAABAhAAFAAAgQoACAAAQIUABAACIEKAAAABE\nCFAAAAAiBCgAAAARAhQAAIAIAQoAAECEAAUAACBCgAIAABAhQAEAAIgQoAAAAEQIUAAAACIEKAAA\nABECFAAAgAgBCgAAQIQABQAAIEKAAgAAECFAAQAAiBCgAAAARAhQAAAAIgQoAAAAEQIUAACACAEK\nAABAhAAFAAAgQoACAAAQIUABAACIEKAAAABECFAAAAAiBCgAAAARAhQAAIAIAQoAAECEAAUAACBC\ngAIAABAhQAEAAIgQoAAAAEQIUAAAACJGwzBMvez7fvolAAAATNF13ejs2cwABQAAgH/FE1wAAAAi\nBCgAAAARAhQAAIAIAQoAAECEAAUAACDiD5Q9O3ms0O8UAAAAAElFTkSuQmCC\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x111d90fd0>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"palette = sns.diverging_palette(271, 0, 88, 65, 10, 13, 'dark')\n", | |
"sns.palplot(palette)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 43, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/Users/olga/anaconda3/envs/single-cell-bioinformatics/lib/python3.5/site-packages/matplotlib/figure.py:1744: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.\n", | |
" warnings.warn(\"This figure includes Axes that are not \"\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAABZgAAABACAYAAACX+BIhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAAztJREFUeJzt3LGLz3Ecx/HPT0pZlI3kELk7i/xKMhnuLyBZpAzXISl2\nk52ScP0GJYt0/oIbTJL6yeLuJ8JJbMqiTD/79b0rr+LzuTwe4+e7vHqPz+HbG4/HBQAAAAAA/tSm\n2gMAAAAAANiYBGYAAAAAACICMwAAAAAAEYEZAAAAAICIwAwAAAAAQGTzeh+Hw+H4Xw0BAAAAAKBd\n/X6/t/pt3cBcSinTjxb/zpoNbunsTDn0+EbtGU16c+Z62bY4W3tGk37MDMrPF27TZeuxQVl57TZd\nJg4Pystlt+lydGpQnnxwmy6n9w3K7NdrtWc0abDzZpn78rT2jObM7zpZLnx+XntGk+7vPl4ufhrV\nntGke3smy6WP32rPaNLdvTvK5fe/as9o0p39W8qVt9trz2jS7YPfy8NXk7VnNOnckVFZfuY2XaZO\njEpZcJtOp0Zl8taB2iuaNLr6rkzN117RpuW5UqYfrNSe0aSl8xOd736RAQAAAABARGAGAAAAACAi\nMAMAAAAAEBGYAQAAAACICMwAAAAAAEQEZgAAAAAAIgIzAAAAAAARgRkAAAAAgIjADAAAAABARGAG\nAAAAACAiMAMAAAAAEBGYAQAAAACICMwAAAAAAEQEZgAAAAAAIgIzAAAAAAARgRkAAAAAgIjADAAA\nAABARGAGAAAAACAiMAMAAAAAEBGYAQAAAACICMwAAAAAAEQEZgAAAAAAIgIzAAAAAAARgRkAAAAA\ngIjADAAAAABARGAGAAAAACAiMAMAAAAAEBGYAQAAAACICMwAAAAAAEQEZgAAAAAAIgIzAAAAAAAR\ngRkAAAAAgIjADAAAAABARGAGAAAAACAiMAMAAAAAEBGYAQAAAACICMwAAAAAAEQEZgAAAAAAIgIz\nAAAAAAARgRkAAAAAgIjADAAAAABARGAGAAAAACAiMAMAAAAAEBGYAQAAAACICMwAAAAAAEQEZgAA\nAAAAIgIzAAAAAAARgRkAAAAAgIjADAAAAABApDcej9f8OBwO1/4IAAAAAMB/o9/v91a/rRuYAQAA\nAABgLX6RAQAAAABARGAGAAAAACAiMAMAAAAAEBGYAQAAAACICMwAAAAAAER+Aw9uS3mHMnOfAAAA\nAElFTkSuQmCC\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x112425ef0>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"husl_palette = sns.color_palette('husl', n_colors=20)\n", | |
"sns.palplot(husl_palette)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 61, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/Users/olga/anaconda3/envs/single-cell-bioinformatics/lib/python3.5/site-packages/matplotlib/figure.py:1744: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.\n", | |
" warnings.warn(\"This figure includes Axes that are not \"\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAABACAYAAABP0uObAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAAZdJREFUeJzt2jFKXUEAhtG5ki0IVm7AQsJ1F8IjkC1IGvdgyNvDa8wu\nAu7CS7DIBtJmETe96KuU+wnnlDPN330wzLSu6wCAmpOtBwDASwQKgCSBAiBJoABIEigAkj4du1yW\nxRc/AN7dPM/T87OjgRpjjLPdl/dZ8wF9vfk5DrvTcfvr39ZTMg670/Hj793WMzK+n+/Hsv+z9YyU\n+e5izA9XW8/IWK4fx+fLb1vPSPn9dP/iuSc+AJIECoAkgQIgSaAASBIoAJIECoAkgQIgSaAASBIo\nAJIECoAkgQIgSaAASBIoAJIECoAkgQIgSaAASBIoAJIECoAkgQIgSaAASBIoAJIECoAkgQIgSaAA\nSBIoAJIECoAkgQIgSaAASBIoAJIECoAkgQIgSaAASBIoAJIECoAkgQIgSaAASBIoAJIECoAkgQIg\nSaAASBIoAJIECoAkgQIgSaAASBIoAJIECoAkgQIgSaAASBIoAJKmdV1fvVyW5fVLAHgj8zxPz8+O\nBgoAtuKJD4AkgQIgSaAASBIoAJIECoCk/4/YI3niawF0AAAAAElFTkSuQmCC\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x111eac208>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"kmeans_palette = sns.color_palette('Set1', n_colors=6)\n", | |
"sns.palplot(kmeans_palette)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 55, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Well\n", | |
"DIM_1_A1 3\n", | |
"DIM_1_A10 3\n", | |
"DIM_1_A11 4\n", | |
"DIM_1_A12 3\n", | |
"DIM_1_A2 5\n", | |
"dtype: int32" | |
] | |
}, | |
"execution_count": 55, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"labels = pd.Series(kmeans.predict(macaulay2016_expression_log10), \n", | |
" index=macaulay2016_expression_log10.index)\n", | |
"labels.head()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 56, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(0.14357555420959697, 0.22523645092459285, 0.5905421235982109)" | |
] | |
}, | |
"execution_count": 56, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"kmeans_palette[5]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 57, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(0.91012687963597916, 0.96493656495038205, 0.6956401565495659)" | |
] | |
}, | |
"execution_count": 57, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"kmeans_palette[0]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 58, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"363\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"[(0.17296425104141233, 0.629511748341953, 0.75952327461803659),\n", | |
" (0.17296425104141233, 0.629511748341953, 0.75952327461803659),\n", | |
" (0.12764321927930794, 0.42666667968619104, 0.68613612020716952),\n", | |
" (0.17296425104141233, 0.629511748341953, 0.75952327461803659),\n", | |
" (0.14357555420959697, 0.22523645092459285, 0.5905421235982109)]" | |
] | |
}, | |
"execution_count": 58, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"colors = []\n", | |
"for i in labels:\n", | |
" colors.append(kmeans_palette[i])\n", | |
"print(len(colors))\n", | |
"colors[:5]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 59, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"363\n", | |
"363\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"[(0.17296425104141233, 0.629511748341953, 0.75952327461803659),\n", | |
" (0.17296425104141233, 0.629511748341953, 0.75952327461803659),\n", | |
" (0.12764321927930794, 0.42666667968619104, 0.68613612020716952),\n", | |
" (0.17296425104141233, 0.629511748341953, 0.75952327461803659),\n", | |
" (0.14357555420959697, 0.22523645092459285, 0.5905421235982109)]" | |
] | |
}, | |
"execution_count": 59, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"colors = [kmeans_palette[i] for i in labels]\n", | |
"print(len(labels))\n", | |
"print(len(colors))\n", | |
"colors[:5]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"to add a legend, you must ....... say it with me ......... GROUPBY!!!!!!!!!" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 64, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"0 (1, 2)\n", | |
"1 (28, 2)\n", | |
"2 (162, 2)\n", | |
"3 (38, 2)\n", | |
"4 (46, 2)\n", | |
"5 (88, 2)\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"<matplotlib.legend.Legend at 0x10dbbb320>" | |
] | |
}, | |
"execution_count": 64, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/Users/olga/anaconda3/envs/single-cell-bioinformatics/lib/python3.5/site-packages/matplotlib/figure.py:1744: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.\n", | |
" warnings.warn(\"This figure includes Axes that are not \"\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "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\nAAAASUVORK5CYII=\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x10dbd4048>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig, ax = plt.subplots()\n", | |
"\n", | |
"for cluster, df in macaulay2016_smushed.groupby(labels):\n", | |
" print(cluster, df.shape)\n", | |
" color = kmeans_palette[cluster]\n", | |
" ax.scatter(df[0], df[1], color=colors, label=cluster,\n", | |
" linewidth=1, edgecolor='grey', alpha=0.5)\n", | |
"ax.scatter(macaulay2016_kmeans_centroids[0], macaulay2016_kmeans_centroids[1], \n", | |
" color='k', marker='x', s=100, linewidth=3, alpha=0.5, label='Centroids')\n", | |
"ax.legend()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Exercise 1\n", | |
"\n", | |
"Change the number of clusters to 20 and use the `\"husl\"` palette for coloring" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Evaluating clustering\n", | |
"\n", | |
"How do we evaluate the clusters that we found versus the clusters from the paper?" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 66, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'1a': 0, '1b': 1, '2': 2, '3': 3, '4': 4, 'x': 5}" | |
] | |
}, | |
"execution_count": 66, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# Get the unique names of the original Macaulay2016 clusters\n", | |
"cluster_names = macaulay2016_metadata.cluster.unique()\n", | |
"cluster_names = macaulay2016_metadata['cluster'].unique()\n", | |
"\n", | |
"# Sort them in alphabetical order so that they're in the order we want\n", | |
"cluster_names.sort()\n", | |
"\n", | |
"# Map the cluster name to an integer number\n", | |
"cluster_name_to_integer = dict(zip(cluster_names, range(len(cluster_names))))\n", | |
"cluster_name_to_integer" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 65, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Well\n", | |
"DIM_1_A1 2\n", | |
"DIM_1_A10 3\n", | |
"DIM_1_A11 2\n", | |
"DIM_1_A12 2\n", | |
"DIM_1_A2 3\n", | |
"Name: cluster, dtype: int64" | |
] | |
}, | |
"execution_count": 65, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"paper_cluster_integers = macaulay2016_metadata.cluster.map(cluster_name_to_integer)\n", | |
"paper_cluster_integers.head()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 67, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/Users/olga/anaconda3/envs/single-cell-bioinformatics/lib/python3.5/site-packages/matplotlib/figure.py:1744: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.\n", | |
" warnings.warn(\"This figure includes Axes that are not \"\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAABACAYAAABP0uObAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAAZBJREFUeJzt2rFpW1EAhtErkSbgCTJAurh5Awg8jjbIBF4gpMguCag2\nr1GqeABPYOzOL72IVMW8T3BOeW/zdx9c7mZZlgEANdu1BwDAvwgUAEkCBUCSQAGQJFAAJH24dDnP\nsy9+ALy7aZo2p2cXAzXGGD9e/rzPmiv07eHnOO724/bwfe0pGcfdfhx+v609I2P3ZTs+/Xpde0bK\n093H8Xhzv/aMjM/PX9eecDU88QGQJFAAJAkUAEkCBUCSQAGQJFAAJAkUAEkCBUCSQAGQJFAAJAkU\nAEkCBUCSQAGQJFAAJAkUAEkCBUCSQAGQJFAAJAkUAEkCBUCSQAGQJFAAJAkUAEkCBUCSQAGQJFAA\nJAkUAEkCBUCSQAGQJFAAJAkUAEkCBUCSQAGQJFAAJAkUAEkCBUCSQAGQJFAAJAkUAEkCBUCSQAGQ\nJFAAJAkUAEkCBUCSQAGQJFAAJAkUAEkCBUCSQAGQtFmW5ezlPM/nLwHgP5mmaXN6djFQALAWT3wA\nJAkUAEkCBUCSQAGQJFAAJP0FwnMjeY+wK/8AAAAASUVORK5CYII=\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x112410400>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"macaulay2016_palette = [macaulay2016_cluster_to_color_from_paper[x] for x in cluster_names]\n", | |
"sns.palplot(macaulay2016_palette)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 69, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"6" | |
] | |
}, | |
"execution_count": 69, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"len(kmeans_palette)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 68, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/Users/olga/anaconda3/envs/single-cell-bioinformatics/lib/python3.5/site-packages/matplotlib/figure.py:1744: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.\n", | |
" warnings.warn(\"This figure includes Axes that are not \"\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "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\nYJ9HxFJNAAAAAElFTkSuQmCC\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x11305e5f8>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"from sklearn.metrics import confusion_matrix\n", | |
"\n", | |
"confusion = pd.DataFrame(confusion_matrix(paper_cluster_integers, labels), \n", | |
" index=cluster_names)\n", | |
"confusion.index.name = 'Macaulay2016 Labels'\n", | |
"confusion.columns.name = 'K-Means Predicted'\n", | |
"\n", | |
"confusiongrid = sns.clustermap(confusion, annot=True, fmt='d', figsize=(4, 4),\n", | |
" col_cluster=False, row_cluster=False, \n", | |
" row_colors=macaulay2016_palette, col_colors=kmeans_palette)\n", | |
"\n", | |
"# rotate the ylabels to be horizontal instead of vertical\n", | |
"plt.setp(confusiongrid.ax_heatmap.get_yticklabels(), rotation=0);" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Evaluating clustering: Rand score\n", | |
"\n", | |
"The [Rand index](https://en.wikipedia.org/wiki/Rand_index) is a numeric value indicating " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 70, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"1.0" | |
] | |
}, | |
"execution_count": 70, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"from sklearn.metrics.cluster import adjusted_rand_score\n", | |
"adjusted_rand_score([0, 0, 1, 1], [0, 0, 1, 1])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 71, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"1.0" | |
] | |
}, | |
"execution_count": 71, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"adjusted_rand_score([0, 0, 1, 1], [1, 1, 0, 0])" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"\n", | |
"### Exercise 2\n", | |
"\n", | |
"Try your own labels and values to see the rand score. You can try as many samples or classes as you want" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 86, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"0.3478260869565217" | |
] | |
}, | |
"execution_count": 86, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"adjusted_rand_score([0, 1, 0, 1, 1, 1], [0, 0, 2, 2, 2, 2])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 87, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"-0.07142857142857141" | |
] | |
}, | |
"execution_count": 87, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"adjusted_rand_score([0, 2, 0, 2, 2, 2], [0, 0, 2, 2, 2, 2])" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Exercise 3\n", | |
"\n", | |
"Get the Rand score of your clustering" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"# YOUR CODE HERE" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3 (single-cell-bioinformatics)", | |
"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.5.1" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment