2.0.1 • Published 4 years ago

@seregpie/k-means-plus-plus v2.0.1

Weekly downloads
11
License
MIT
Repository
github
Last release
4 years ago

KMeansPlusPlus

KMeansPlusPlus(values, clustersCount, {
  distance(value, otherValue) { /* euclidean distance */ },
  map(value) { /* identity */ },
  maxIterations: 1024,
  mean(...values) { /* centroid */ },
  random: Math.random,
})

Implementation of the k-means-plus-plus algorithm to partition the values into the clusters.

argumentdescription
valuesAn iterable of the values to be clustered.
clustersCountNhe number of the clusters.
distanceA function to calculate the distance between two values.
mapA function to map the values.
maxIterationsThe maximum number of iterations until the convergence.
meanA function to calculate the mean value.
randomA function as the pseudo-random number generator.

Returns the clustered values as an array of arrays.

dependencies

setup

npm

npm install @seregpie/k-means-plus-plus

ES module

import KMeansPlusPlus from '@seregpie/k-means-plus-plus';

Node

let KMeansPlusPlus = require('@seregpie/k-means-plus-plus');

browser

<script src="https://unpkg.com/just-my-luck"></script>
<script src="https://unpkg.com/@seregpie/vector-math"></script>
<script src="https://unpkg.com/@seregpie/k-means"></script>
<script src="https://unpkg.com/@seregpie/k-means-plus-plus"></script>

The module is globally available as KMeansPlusPlus.

usage

let vectors = [[1, 4], [6, 2], [0, 4], [1, 3], [5, 1], [4, 0]];
let clusters = KMeans(vectors, 2);
// => [[[1, 4], [0, 4], [1, 3]], [[6, 2], [5, 1], [4, 0]]]

Provide a map function to convert a value to a vector.

let Athlete = class {
  constructor(name, height, weight) {
    this.name = name;
    this.height = height;
    this.weight = weight;
  }
  toJSON() {
    return this.name;
  }
};
let athletes = [
  new Athlete('A', 185, 72), new Athlete('B', 183, 84), new Athlete('C', 168, 60),
  new Athlete('D', 179, 68), new Athlete('E', 182, 72), new Athlete('F', 188, 77),
  new Athlete('G', 180, 71), new Athlete('H', 180, 70), new Athlete('I', 170, 56),
  new Athlete('J', 180, 88), new Athlete('K', 180, 67), new Athlete('L', 177, 76),
];
let clusteredAthletes = KMeansPlusPlus(athletes, 2, {
  map: athlete => [athlete.weight / athlete.height],
});
console.log(JSON.parse(JSON.stringify(clusteredAthletes)));
// => [['A', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K'], ['B', 'J', 'L']]