KMEANS.test.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. require('should');
  2. var KMEANS = require('../lib/index.js').KMEANS;
  3. describe('KMEANS', function() {
  4. describe('run', function() {
  5. it('should return correct clusters', function() {
  6. var kmeans = new KMEANS();
  7. var k = 3;
  8. var dataset = [
  9. [1,1],[0,1],[1,0],
  10. [10,10],[10,13],[13,13],
  11. [54,54],[55,55],[89,89],[57,55]
  12. ];
  13. var clusters = kmeans.run(dataset, k);
  14. clusters.should.have.lengthOf(k);
  15. clusters.forEach(function(cluster) {
  16. (cluster instanceof Array).should.be.true;
  17. cluster.length.should.be.greaterThan(0);
  18. });
  19. });
  20. it('should return correct clusters for high dimensional data', function() {
  21. var kmeans = new KMEANS();
  22. var k = 4;
  23. var dataset = generateData(k, 10, 10);
  24. var clusters = kmeans.run(dataset, k);
  25. clusters.should.have.lengthOf(k);
  26. clusters.forEach(function(cluster) {
  27. (cluster instanceof Array).should.be.true;
  28. cluster.length.should.be.greaterThan(0);
  29. });
  30. });
  31. });
  32. describe('randomCentroid', function() {
  33. it('should return extremes', function() {
  34. var dataset = [
  35. [-10, -20], [0,0], [30, 20]
  36. ];
  37. var kmeans = new KMEANS(dataset);
  38. var centroid = kmeans.randomCentroid();
  39. centroid[0].should.be.within(-10, 30);
  40. centroid[1].should.be.within(-20, 20);
  41. });
  42. });
  43. });
  44. function generateData(clusters, points, dimensions) {
  45. var dataset = [];
  46. for (var i = 0; i < clusters; i++) {
  47. for (var p = 0; p < points; p++) {
  48. var point = new Array(dimensions);
  49. for (var d = 0; d < dimensions; d++) {
  50. point[d] = Math.random() + (i * 100);
  51. }
  52. dataset.push(point);
  53. }
  54. }
  55. return dataset;
  56. }