Mean shift and friends
Ignoring the quick update below, its been a while since I published anything - since the end of last year I have moved university, from Queen Mary to University College London, and in doing so changed project. As such I have been more than a little busy on it (Details will appear when I have something sufficiently cool!).

Anyway, this bank holiday weekend I found the time to polish and upload my mean shift module, which is of course based on Mean Shift, Mode Seeking, and Clustering by Y. Cheng (Ignoring the fact it was previously discovered by Fukunaga and Hostetler in 1975.). Furthermore, the provided MeanShift class also does kernel density estimation and subspace constrained mean shift, from the paper Face Alignment through Subspace Constrained Mean-Shifts by J. M. Saragih, S. Lucey and J. Cohn. This latter technique is a manifold finding method, and it can, for instance, be used to find lines in an image. The module includes multiple spatial indexing structures, clustering and seven kernels. These include a von-Mises Fisher kernel, which allows you to do mean shift on directional data. An extensive set of test scripts are included, which demonstrate its working. As ever it can be obtained from my Google code repository, haines.

From a technical point of view this was an experiment in making a 'proper' machine learning module - all the code is in C, with a properly separated Python interface. It has the ability to automatically rebuild the C code if it is changed between imports, but also includes a setup.py, so it can be installed as a normal python module, or built as a package. I also make extensive use of function pointers, to effectively implement v-tables in C - some people really hate this, but it does make for very elegant code, and works perfectly for the modular nature, where I have lots of different kernel types providing the same interface. I suspect I will be following this pattern in the future, as it works very well if you know exactly what you want. Not sure I would use it for current research code however, as its not a pattern that encourages iterative development.