K-means clustering aims to partition n observations into k clusters in which each observation belongs to the cluster with the nearest mean.
npm i ml-kmeans
const kmeans = require('ml-kmeans');
let data = [[1, 1, 1], [1, 2, 1], [-1, -1, -1], [-1, -1, -1.5]];
let centers = [[1, 2, 1], [-1, -1, -1]];
let ans = kmeans(data, 2, { initialization: centers });
console.log(ans);
/*
KMeansResult {
clusters: [ 0, 0, 1, 1 ],
centroids:
[ { centroid: [ 1, 1.5, 1 ], error: 0.25, size: 2 },
{ centroid: [ -1, -1, -1.25 ], error: 0.0625, size: 2 } ],
converged: true,
iterations: 1
}
*/
D. Arthur, S. Vassilvitskii, k-means++: The Advantages of Careful Seeding, in: Proc. of the 18th Annual ACM-SIAM Symposium on Discrete Algorithms, 2007, pp. 1027–1035. Link to article