hierarchical-clustering

Agglomerative Hierarchical clustering based on How to Explain Hierarchical Clustering.
Example
From clusterfck:
var cluster = require('hierarchical-clustering');
var colors = [
[20, 20, 80],
[22, 22, 90],
[250, 255, 253],
[100, 54, 255]
];
function distance(a, b) {
var d = 0;
for (var i = 0; i < a.length; i++) {
d += Math.pow(a[i] - b[i], 2);
}
return Math.sqrt(d);
}
function linkage(distances) {
return Math.min.apply(null, distances);
}
var levels = cluster({
input: colors,
distance: distance,
linkage: linkage,
minClusters: 2,
});
var clusters = levels[levels.length - 1].clusters;
console.log(clusters);
clusters = clusters.map(function (cluster) {
return cluster.map(function (index) {
return colors[index];
});
});
console.log(clusters);
API
var cluster = require('hierarchical-clustering')
var levels = cluster(options)
Options:
.input <Array> (required) - input array
.distance <Function> (required) - distance function
.linkage <Function> (required) - linkage function or string of 'single', 'complete or 'average'
.minClusters <Integer> (1) - number of clusters you want to iterate to
.maxLinkage <Integer> (Infinity) - maximum linkage until you stop iteration
Function definitions:
function distance(a, b) {
return <Number>
}
function linkage(distances) {
return <Number>
}
The output is an array of levels, each which have the property:
.linkage <Number> - the linkage of this level
.cluster <Array> - the clusters at this level
.from <Integer> - index of the last cluster which got merged and deleted
.to <Integer> - index of the last cluster which got merged and appended