Skip to main content

Posts

Showing posts from February, 2013

Implementing k-means clustering in Ruby

Inspired by the partitioning problem I set about to implement a well known algorithm, k-means clustering, from memory, for fun! ... and, for science... Interestingly, this is somehow the opposite of the partitioning problem. In the partitioning problem we tried to maximize variation of categorical variables within groups, whereas here we're trying to find groups of elements that are the most "similar" to each other in a n-dimensional continuous space. The main idea of k-means is the following - if you have a bunch of elements and a given number of clusters: Create the initial clusters randomly within the space spanned by the elements (typically (always?) you would pick randomly from your elements). Lob all elements into the cluster with the nearest center (using some Euclidean distance metric typically). Recenter each cluster on the average of its elements,  If necessary move the elements to their now nearest clusters.  Repeat the "re-centering" and mov

D3 Map Projections Morphing

Map of Australia mapped on Australia We had a very good geography teacher in high school. He taught us how one should be sceptical and keep an open mind in science (using an anecdote about a scientist proposing an alternative to the theory of tectonic drift). He was also the first person I met that had surfed the Internet - or whatever it was called back in the day. But the thing he showed me the importance of, most relevant to this blog post, is the choice of projections of world maps. You know, the whole 3D globe to 2D piece of paper business. Mapping, qoui. Some are just more equal than others. You see, yesterday evening I decided to finally take a closer look at the D3 visualization library. A couple of the demos on the d3js page , notably the excellent animated  show reel and some of the mapping examples , made me think of discussions I have had with colleagues and friends on map projections. I wondered if animating the transition from one projection to another would help

D3, gists, and bl.ocks.org

Yesterday I stumbled upon a very useful tool while (trying to) teach(ing) myself D3, namely http://bl.ocks.org . This lets you access, and preview, your webby gists in a browser - just by browsing to http://bl.ocks.org/<gist-id>. Most handy! (The only minor down side is that there seems to be a slight latency if you update your gist before it updates on bl.ocks.org.)

Sequel on the Pi - and how to access Access DBs from Ruby (in parenthesis)

Recently I had to liberate some data from an old MS Access DB, so I discovered a gem of a Ruby gem called " sequel " that generalizes database access (for many different databases) - ORM style. Most excellent, so I figured I wanted to run it on my raspberry pi to access various sqlite databases I have lying around. Assuming you already have ruby (1.9) installed, you can simply do (in any Debian flavored Linux, for that matter): sudo apt-get install sqlite3 libsqlite3-dev and sudo gem install sequel sqlite3 So now one can fire up irb and do things like: require 'sequel' db = Sequel.sqlite('some_db.db') Etc . (This will, of course, not let you access MS Access DBs on your pi, as they rely on the "win32ole" gem - only available on windows, and the " Microsoft Access Database Engine " - also only available on windows. More info on how to connect to those kinds of database can be found here  - under 'ado'.)