Skip to content

Instantly share code, notes, and snippets.

@vals
Created June 9, 2016 00:46
Show Gist options
  • Save vals/a01a37b14c4918df7937b30d43327837 to your computer and use it in GitHub Desktop.
Save vals/a01a37b14c4918df7937b30d43327837 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"source": [
"%pylab inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import seaborn as sns\n",
"sns.set_style('white')\n",
"matplotlib.rcParams['axes.spines.right'] = False\n",
"matplotlib.rcParams['axes.spines.top'] = False"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I have been getting a bit interested in the new fancy [TensorFlow](www.tensorflow.org) package. As a little exercise to figure out roughly how to use it, I figured I could implement a simple model. I chose to implement [k-means clustering](https://en.wikipedia.org/wiki/K-means_clustering), since it's very simple, but a bit different from the regression/classification models in TensorFlows [examples](https://github.com/aymericdamien/TensorFlow-Examples/tree/master/notebooks).\n",
"\n",
"We'll make some ideal clustered data using scikit-learn."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sklearn import datasets"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAecAAAFXCAYAAACYx4YhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X9wHOV9x/HPnY0MdgqDLUToEJKJjY5CgvtjQJZd14Cl\nNkbSuE2H1AVL0CkzmaEEJlDb8i8o6O4s2W1Sx8mUpkAb2aQmIVCPbYKRiU2bSBZM0zgtTGQwbTBh\nwBYheGoc/bjb/uHu5XZvd2/vtKfbu3u/Zjyg093uc7/02ed5vvtsxDAMQwAAIDSi5W4AAACwIpwB\nAAgZwhkAgJAhnAEACBnCGQCAkCGcAQAImSmF87Fjx9Ta2qonnnhCkrR+/Xp1dHSoq6tLXV1devHF\nFwNpJAAAtWRmsQ88e/as4vG4mpubLbf/5V/+pZYtWzblhgEAUKuK7jnPmjVLjz76qBoaGoJsDwAA\nNa/ocI5Go6qrq8u5fdeuXbr99tt1//336xe/+MWUGgcAQC0KtCBs5cqVuv/++/WNb3xDsVhMO3bs\ncL3v5OSk3nrrLU1OTgbZBAAAKl6g4bxo0SJdddVVkqTly5fr2LFjrvd95513tHz5cr3zzjtBNgEA\ngIoXaDjfc889OnHihCRpeHhYjY2NQW4eAICaUHS19iuvvKLe3l69/fbbmjlzpg4cOKDOzk598Ytf\n1AUXXKA5c+YomUwG2VYAAGpCpFyXjHzrrbe0fPlyvfDCC7r88svL0QQAAEKJFcIAAAgZwhkAgJAh\nnAEACBnCGQCAkCGcAQAIGcIZAICQIZwBAAgZwhkAgJAhnAEACBnCGQCAkCGcAQAIGcIZAICQIZwB\nAAgZwhkAgJAhnAEACBnCGQCAkCGcAQAIGcIZAICQIZwBAAgZwhkAgJAhnAEACBnCGQCAkCGcAQAI\nGcIZAICQIZwBAAgZwhkAgJAhnAEACBnCGQCAkCGcAQAIGcIZAICQIZwBAAgZwhkAgJAhnAEACBnC\nGQCAkCGcAQAIGcIZAICQIZwBAAgZwhkAgJAhnAEACBnCGSiBVCqlZDKpjo4OJZNJpdPpcjcJQAWZ\nWe4GANWor69PGzdulCTt27dPkrRhw4ZyNglABaHnjIpQaT3RoaEhz58BwAs9Z1SESuuJNjc3Z9pp\n/gwAfhHOqAiV1hPt7u6WdK6dzc3NmZ8BwA/CGRWh0nqi0Wg01D17AOFGOKMi0BMFUEsIZ1SE6e6J\n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\n0ocffqg9e/boD/7gD6a7aYFwen7VuK767bffrv3792vFihV64IEHdM8995S7SYH62c9+prffflt3\n3nmn/uzP/kw/+clPyt2kQE1MTOhrX/uavvjFL5a7KSUxY8YM1dXVSZK+8Y1vqL29vcwtmrrR0VHL\nQfDFF1+s0dHRMrYoWJFIROeff76kc8tiL1u2zHOUeMorhHnxuy73xMSEvvKVr+jv/u7vStmcwBW6\n7viHH36ou+66S3/+53+uT37yk9Pc2sKVal31sHF6nr/7u7+rm2++WZ///Of14osvqq+vTzt27Ch3\nU4uS/fykc6v6vffee1q6dKkeffRR/fu//7s2bdqkp556qswtLY7b+/e5z30uM8JTyQf8Xt/DJ554\nQq+++qoeeeSRcjczcJX8nnk5ePCgnn76aT322GPedzTKpLu72zh8+LBhGIZx9OhR4zOf+YzxJ3/y\nJ8bnPvc549Of/rRx3333latpgch+foZhGJOTk8Ydd9xhfOc73yljq4KT/fwmJiaMG264IfO7Z555\nxujr6ytX0wJx5513Gq+88ophGIYxNjZmeX7VYMeOHcb+/fszPzc3N5exNcFbtWpV5u/JokWLjLa2\nNuP1118vd7MC9a1vfcu48847jfHx8XI3JRA7duwwnnzyyczPy5cvN86cOVPGFgXvX//1X41bbrnF\nOH36dN77lvVUKuP/j4yuvfZaffe739Xu3bv15JNPqr6+Xn/zN39TzqYFwsg68vv617+upqYmffaz\nny1ji4JlOKyrLknPP/+8li5dWs6mTdnHP/5x/ehHP5Ik/fjHP9YnPvGJ8jYoYEuXLs0U7R0/fjzv\nOr+V5p//+Z8zf09uuOEGPfjgg5o/f365mxWYEydO6Mknn9RXv/pVnXfeeeVuTiCWLFmiAwcOSJJe\neeUVXXrppZo9e3aZWxWc//3f/9W2bdv0yCOP6Nd+7dfy3n/al+90W5c72/Lly/XCCy9MZ7MC4/b8\nli5dqssvv1wzZ85UJBLRokWLdNddd5W7uQWrlXXVT506pY0bN+rs2bOKRCLatGlT1RUW7dixQz/4\nwQ8kSevXr9fChQvL3KLSWL9+vT772c/quuuuK3dTAvPlL39Zzz77rC677LLMUPfjjz/ueQnCSvCl\nL31JL730kmbMmKEHHnhAsVis3E0KzLe+9S199atf1Sc+8YnMe7Z161bXA2PW1gYAIGRYIQwAgJAh\nnAEACBnCGQCAkCGcAQAIGcIZAICQIZwBAAgZwhkAgJAhnAEACJn/AxtPFwUZ87X+AAAAAElFTkSu\nQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x2ae6713a6710>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"Xi, yi = datasets.make_blobs(500, random_state=1111)\n",
"plt.scatter(*Xi.T, c='k', lw=0);"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"Now we want to divide these in to clusters. We will use the objective used by [Bottou & Bengio 1995](https://papers.nips.cc/paper/989-convergence-properties-of-the-k-means-algorithms.pdf),\n",
"\n",
"$$\n",
"E(w) = \\sum_i \\min_k (x_i - w_k)^2.\n",
"$$\n",
"\n",
"Or in words: the sum of the (squared) distances to the closest prototype $ w_k $.\n",
"\n",
"For our implementation, first we need to put in data. Secondly, we need to define the variables we want to optimize. In this case we want the prototypes $ w $."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import tensorflow as tf"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Number of clusters\n",
"k = 3\n",
"\n",
"# Input\n",
"Xi = Xi.astype(np.float32)\n",
"X = tf.placeholder_with_default(Xi, Xi.shape, name='data')\n",
"\n",
"# Model variables, initiate randomly from data\n",
"idx = np.random.choice(range(Xi.shape[0]), k, replace=False)\n",
"Wi = Xi[idx].copy()\n",
"W = tf.Variable(Wi, name='prototypes')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we only need to write out how the objective function value is calculated from the data and the variables."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Reshape data and prototypes tensors\n",
"Xc = tf.concat(2, k * [tf.expand_dims(X, 2)])\n",
"Wc = tf.transpose(tf.expand_dims(W, 2), [2, 1, 0])\n",
"\n",
"# Define objective of model\n",
"\n",
"distances = tf.reduce_sum((Xc - Wc) ** 2, 1)\n",
"\n",
"cost = tf.reduce_sum(tf.reduce_min(distances, 1))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"After the tensors have been formatted correctly this is very simple. We just calculate the distances from each point to each prototype. Then we sum the smallest of these per data-point.\n",
"\n",
"The final value in `cost` is represented in such a way that TensorFlow automatically can figure out the gradients for minimizing it with respect to the variables in `W`."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Make an object which will minimize cost w.r.t. W\n",
"optimizer = tf.train.GradientDescentOptimizer(0.001).minimize(cost)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is the nice thing with TensorFlow, you don't need to care about finding gradients for objective functions."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"sess = tf.Session()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Iteration 0, cost 21533.69140625\n",
"Iteration 10, cost 950.78369140625\n",
"Iteration 20, cost 940.453369140625\n",
"Iteration 30, cost 940.4503784179688\n",
"Iteration 40, cost 940.450439453125\n",
"Iteration 50, cost 940.450439453125\n",
"Iteration 60, cost 940.450439453125\n",
"Iteration 70, cost 940.450439453125\n",
"Iteration 80, cost 940.450439453125\n",
"Iteration 90, cost 940.450439453125\n",
"Iteration 100, cost 940.450439453125\n"
]
}
],
"source": [
"sess.run(tf.initialize_all_variables())\n",
"\n",
"for i in range(100 + 1):\n",
" sess.run(optimizer)\n",
" if i % 10 == 0:\n",
" print('Iteration {}, cost {}'.format(i, sess.run(cost)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Once we've optimized the `W` we get the number for them. Then we can make cluster labels for the data points by looking at which prototype $ w_k $ is closest to a data point."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"W_learned = sess.run(W)\n",
"y = sess.run(tf.arg_min(distances, 1))"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x2ae740995748>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(*Xi.T, c=y, lw=0, cmap=cm.Greys_r, vmax=k + 0.5, label='data');\n",
"plt.scatter(*W_learned.T, c='none', s=100, edgecolor='r', lw=2, label='prototypes');\n",
"plt.legend(scatterpoints=3);"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"sess.close()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"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.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