all these changes

This commit is contained in:
Jake Kasper
2026-04-09 13:19:47 -05:00
parent e83a51a051
commit 65315f36d1
39102 changed files with 7932979 additions and 567 deletions

17
frontend/node_modules/skmeans/.gitattributes generated vendored Normal file
View File

@@ -0,0 +1,17 @@
# Auto detect text files and perform LF normalization
* text=auto
# Custom for Visual Studio
*.cs diff=csharp
# Standard to msysgit
*.doc diff=astextplain
*.DOC diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot diff=astextplain
*.DOT diff=astextplain
*.pdf diff=astextplain
*.PDF diff=astextplain
*.rtf diff=astextplain
*.RTF diff=astextplain

52
frontend/node_modules/skmeans/.npmignore generated vendored Normal file
View File

@@ -0,0 +1,52 @@
# Windows image file caches
Thumbs.db
ehthumbs.db
# Folder config file
Desktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msm
*.msp
# Windows shortcuts
*.lnk
# =========================
# Operating System Files
# =========================
# OSX
# =========================
.DS_Store
.AppleDouble
.LSOverride
# Thumbnails
._*
# Node
node_modules
test/perf
test/out
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

49
frontend/node_modules/skmeans/Gruntfile.js generated vendored Normal file
View File

@@ -0,0 +1,49 @@
module.exports = function(grunt) {
require('load-grunt-tasks')(grunt);
// Project configuration.
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
browserify: {
dist: {
watch: true,
keepAlive: true,
files: {
'dist/browser/skmeans.js': ['browser.js']
}
}
},
babel: {
options: {
sourceMap: true,
presets: ['es2015']
},
dist: {
files: [
{
expand: true,
src: ['*.js'],
dest: 'dist/node',
ext: '.js'
},
{
'dist/browser/skmeans.js': ['dist/browser/skmeans.js'],
}
]
}
},
uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
},
dist : {
files: {
'dist/browser/skmeans.min.js' : ['dist/browser/skmeans.js']
}
}
},
clean: ['dist/browser/*.js','dist/browser/*.map']
});
grunt.registerTask('default', ['browserify','babel','uglify']);
};

62
frontend/node_modules/skmeans/README.md generated vendored Normal file
View File

@@ -0,0 +1,62 @@
# skmeans
Super fast simple k-means and [k-means++](https://en.wikipedia.org/wiki/K-means%2B%2B) implementation for unidimiensional and multidimensional data. Works on nodejs and browser.
## Installation
```
npm install skmeans
```
## Usage
### NodeJS
```javascript
const skmeans = require("skmeans");
var data = [1,12,13,4,25,21,22,3,14,5,11,2,23,24,15];
var res = skmeans(data,3);
```
### Browser
```html
<!doctype html>
<html>
<head>
<script src="skmeans.js"></script>
</head>
<body>
<script>
var data = [1,12,13,4,25,21,22,3,14,5,11,2,23,24,15];
var res = skmeans(data,3);
console.log(res);
</script>
</body>
</html>
```
## Results
```javascript
{
it: 2,
k: 3,
idxs: [ 2, 0, 0, 2, 1, 1, 1, 2, 0, 2, 0, 2, 1, 1, 0 ],
centroids: [ 13, 23, 3 ]
}
```
## API
### skmeans(data,k,[centroids],[iterations])
Calculates unidimiensional and multidimensional k-means clustering on *data*. Parameters are:
* **data** Unidimiensional or multidimensional array of values to be clustered. for unidimiensional data, takes the form of a simple array *[1,2,3.....,n]*. For multidimensional data, takes a
NxM array *[[1,2],[2,3]....[n,m]]*
* **k** Number of clusters
* **centroids** Optional. Initial centroid values. If not provided, the algorith will try to choose an apropiate ones. Alternative values can be:
* **"kmrand"** Cluster initialization will be random, but with extra checking, so there will no be two equal initial centroids.
* **"kmpp"** The algorythm will use the [k-means++](https://en.wikipedia.org/wiki/K-means%2B%2B) cluster initialization method.
* **iterations** Optional. Maximum number of iterations. If not provided, it will be set to 10000.
The function will return an object with the following data:
* **it** The number of iterations performed until the algorithm has converged
* **k** The cluster size
* **centroids** The value for each centroid of the cluster
* **idxs** The index to the centroid corresponding to each value of the data array

19
frontend/node_modules/skmeans/browser.js generated vendored Normal file
View File

@@ -0,0 +1,19 @@
"use strict";
(function() {
var root = this
var previous_skmeans = root.skmeans;
var skmeans = require('./main.js');
if( typeof exports !== 'undefined' ) {
if( typeof module !== 'undefined' && module.exports ) {
exports = module.exports = skmeans;
}
exports.skmeans = skmeans;
}
if(typeof window !== 'undefined') {
window.skmeans = skmeans;
}
}).call(this);

339
frontend/node_modules/skmeans/dist/browser/skmeans.js generated vendored Normal file
View File

@@ -0,0 +1,339 @@
"use strict";
(function e(t, n, r) {
function s(o, u) {
if (!n[o]) {
if (!t[o]) {
var a = typeof require == "function" && require;if (!u && a) return a(o, !0);if (i) return i(o, !0);var f = new Error("Cannot find module '" + o + "'");throw f.code = "MODULE_NOT_FOUND", f;
}var l = n[o] = { exports: {} };t[o][0].call(l.exports, function (e) {
var n = t[o][1][e];return s(n ? n : e);
}, l, l.exports, e, t, n, r);
}return n[o].exports;
}var i = typeof require == "function" && require;for (var o = 0; o < r.length; o++) {
s(r[o]);
}return s;
})({ 1: [function (require, module, exports) {
"use strict";
(function () {
var root = this;
var previous_skmeans = root.skmeans;
var skmeans = require('./main.js');
if (typeof exports !== 'undefined') {
if (typeof module !== 'undefined' && module.exports) {
exports = module.exports = skmeans;
}
exports.skmeans = skmeans;
}
if (typeof window !== 'undefined') {
window.skmeans = skmeans;
}
}).call(this);
}, { "./main.js": 4 }], 2: [function (require, module, exports) {
module.exports = {
/**
* Euclidean distance
*/
eudist: function eudist(v1, v2, sqrt) {
var len = v1.length;
var sum = 0;
for (var i = 0; i < len; i++) {
var d = (v1[i] || 0) - (v2[i] || 0);
sum += d * d;
}
// Square root not really needed
return sqrt ? Math.sqrt(sum) : sum;
},
mandist: function mandist(v1, v2, sqrt) {
var len = v1.length;
var sum = 0;
for (var i = 0; i < len; i++) {
sum += Math.abs((v1[i] || 0) - (v2[i] || 0));
}
// Square root not really needed
return sqrt ? Math.sqrt(sum) : sum;
},
/**
* Unidimensional distance
*/
dist: function dist(v1, v2, sqrt) {
var d = Math.abs(v1 - v2);
return sqrt ? d : d * d;
}
};
}, {}], 3: [function (require, module, exports) {
var Distance = require("./distance.js"),
eudist = Distance.eudist,
dist = Distance.dist;
module.exports = {
kmrand: function kmrand(data, k) {
var map = {},
ks = [],
t = k << 2;
var len = data.length;
var multi = data[0].length > 0;
while (ks.length < k && t-- > 0) {
var d = data[Math.floor(Math.random() * len)];
var key = multi ? d.join("_") : "" + d;
if (!map[key]) {
map[key] = true;
ks.push(d);
}
}
if (ks.length < k) throw new Error("Error initializating clusters");else return ks;
},
/**
* K-means++ initial centroid selection
*/
kmpp: function kmpp(data, k) {
var distance = data[0].length ? eudist : dist;
var ks = [],
len = data.length;
var multi = data[0].length > 0;
var map = {};
// First random centroid
var c = data[Math.floor(Math.random() * len)];
var key = multi ? c.join("_") : "" + c;
ks.push(c);
map[key] = true;
// Retrieve next centroids
while (ks.length < k) {
// Min Distances between current centroids and data points
var dists = [],
lk = ks.length;
var dsum = 0,
prs = [];
for (var i = 0; i < len; i++) {
var min = Infinity;
for (var j = 0; j < lk; j++) {
var _dist = distance(data[i], ks[j]);
if (_dist <= min) min = _dist;
}
dists[i] = min;
}
// Sum all min distances
for (var _i = 0; _i < len; _i++) {
dsum += dists[_i];
}
// Probabilities and cummulative prob (cumsum)
for (var _i2 = 0; _i2 < len; _i2++) {
prs[_i2] = { i: _i2, v: data[_i2], pr: dists[_i2] / dsum, cs: 0 };
}
// Sort Probabilities
prs.sort(function (a, b) {
return a.pr - b.pr;
});
// Cummulative Probabilities
prs[0].cs = prs[0].pr;
for (var _i3 = 1; _i3 < len; _i3++) {
prs[_i3].cs = prs[_i3 - 1].cs + prs[_i3].pr;
}
// Randomize
var rnd = Math.random();
// Gets only the items whose cumsum >= rnd
var idx = 0;
while (idx < len - 1 && prs[idx++].cs < rnd) {}
ks.push(prs[idx - 1].v);
/*
let done = false;
while(!done) {
// this is our new centroid
c = prs[idx-1].v
key = multi? c.join("_") : `${c}`;
if(!map[key]) {
map[key] = true;
ks.push(c);
done = true;
}
else {
idx++;
}
}
*/
}
return ks;
}
};
}, { "./distance.js": 2 }], 4: [function (require, module, exports) {
/*jshint esversion: 6 */
var Distance = require("./distance.js"),
ClusterInit = require("./kinit.js"),
eudist = Distance.eudist,
mandist = Distance.mandist,
dist = Distance.dist,
kmrand = ClusterInit.kmrand,
kmpp = ClusterInit.kmpp;
var MAX = 10000;
/**
* Inits an array with values
*/
function init(len, val, v) {
v = v || [];
for (var i = 0; i < len; i++) {
v[i] = val;
}return v;
}
function skmeans(data, k, initial, maxit) {
var ks = [],
old = [],
idxs = [],
dist = [];
var conv = false,
it = maxit || MAX;
var len = data.length,
vlen = data[0].length,
multi = vlen > 0;
var count = [];
if (!initial) {
var _idxs = {};
while (ks.length < k) {
var idx = Math.floor(Math.random() * len);
if (!_idxs[idx]) {
_idxs[idx] = true;
ks.push(data[idx]);
}
}
} else if (initial == "kmrand") {
ks = kmrand(data, k);
} else if (initial == "kmpp") {
ks = kmpp(data, k);
} else {
ks = initial;
}
do {
// Reset k count
init(k, 0, count);
// For each value in data, find the nearest centroid
for (var i = 0; i < len; i++) {
var min = Infinity,
_idx = 0;
for (var j = 0; j < k; j++) {
// Multidimensional or unidimensional
var dist = multi ? eudist(data[i], ks[j]) : Math.abs(data[i] - ks[j]);
if (dist <= min) {
min = dist;
_idx = j;
}
}
idxs[i] = _idx; // Index of the selected centroid for that value
count[_idx]++; // Number of values for this centroid
}
// Recalculate centroids
var sum = [],
old = [],
dif = 0;
for (var _j = 0; _j < k; _j++) {
// Multidimensional or unidimensional
sum[_j] = multi ? init(vlen, 0, sum[_j]) : 0;
old[_j] = ks[_j];
}
// If multidimensional
if (multi) {
for (var _j2 = 0; _j2 < k; _j2++) {
ks[_j2] = [];
} // Sum values and count for each centroid
for (var _i4 = 0; _i4 < len; _i4++) {
var _idx2 = idxs[_i4],
// Centroid for that item
vsum = sum[_idx2],
// Sum values for this centroid
vect = data[_i4]; // Current vector
// Accumulate value on the centroid for current vector
for (var h = 0; h < vlen; h++) {
vsum[h] += vect[h];
}
}
// Calculate the average for each centroid
conv = true;
for (var _j3 = 0; _j3 < k; _j3++) {
var ksj = ks[_j3],
// Current centroid
sumj = sum[_j3],
// Accumulated centroid values
oldj = old[_j3],
// Old centroid value
cj = count[_j3]; // Number of elements for this centroid
// New average
for (var _h = 0; _h < vlen; _h++) {
ksj[_h] = sumj[_h] / cj || 0; // New centroid
}
// Find if centroids have moved
if (conv) {
for (var _h2 = 0; _h2 < vlen; _h2++) {
if (oldj[_h2] != ksj[_h2]) {
conv = false;
break;
}
}
}
}
}
// If unidimensional
else {
// Sum values and count for each centroid
for (var _i5 = 0; _i5 < len; _i5++) {
var _idx3 = idxs[_i5];
sum[_idx3] += data[_i5];
}
// Calculate the average for each centroid
for (var _j4 = 0; _j4 < k; _j4++) {
ks[_j4] = sum[_j4] / count[_j4] || 0; // New centroid
}
// Find if centroids have moved
conv = true;
for (var _j5 = 0; _j5 < k; _j5++) {
if (old[_j5] != ks[_j5]) {
conv = false;
break;
}
}
}
conv = conv || --it <= 0;
} while (!conv);
return {
it: MAX - it,
k: k,
idxs: idxs,
centroids: ks
};
}
module.exports = skmeans;
}, { "./distance.js": 2, "./kinit.js": 3 }] }, {}, [1]);
//# sourceMappingURL=skmeans.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,3 @@
/*! skmeans 2017-08-03 */
"use strict";!function r(t,n,o){function a(i,f){if(!n[i]){if(!t[i]){var s="function"==typeof require&&require;if(!f&&s)return s(i,!0);if(e)return e(i,!0);var u=new Error("Cannot find module '"+i+"'");throw u.code="MODULE_NOT_FOUND",u}var v=n[i]={exports:{}};t[i][0].call(v.exports,function(r){var n=t[i][1][r];return a(n||r)},v,v.exports,r,t,n,o)}return n[i].exports}for(var e="function"==typeof require&&require,i=0;i<o.length;i++)a(o[i]);return a}({1:[function(r,t,n){(function(){this.skmeans;var o=r("./main.js");void 0!==n&&(void 0!==t&&t.exports&&(n=t.exports=o),n.skmeans=o),"undefined"!=typeof window&&(window.skmeans=o)}).call(this)},{"./main.js":4}],2:[function(r,t,n){t.exports={eudist:function(r,t,n){for(var o=r.length,a=0,e=0;e<o;e++){var i=(r[e]||0)-(t[e]||0);a+=i*i}return n?Math.sqrt(a):a},mandist:function(r,t,n){for(var o=r.length,a=0,e=0;e<o;e++)a+=Math.abs((r[e]||0)-(t[e]||0));return n?Math.sqrt(a):a},dist:function(r,t,n){var o=Math.abs(r-t);return n?o:o*o}}},{}],3:[function(r,t,n){var o=r("./distance.js"),a=o.eudist,e=o.dist;t.exports={kmrand:function(r,t){for(var n={},o=[],a=t<<2,e=r.length,i=r[0].length>0;o.length<t&&a-- >0;){var f=r[Math.floor(Math.random()*e)],s=i?f.join("_"):""+f;n[s]||(n[s]=!0,o.push(f))}if(o.length<t)throw new Error("Error initializating clusters");return o},kmpp:function(r,t){var n=r[0].length?a:e,o=[],i=r.length,f=r[0].length>0,s={},u=r[Math.floor(Math.random()*i)],v=f?u.join("_"):""+u;for(o.push(u),s[v]=!0;o.length<t;){for(var h=[],c=o.length,d=0,l=[],p=0;p<i;p++){for(var m=1/0,g=0;g<c;g++){var k=n(r[p],o[g]);k<=m&&(m=k)}h[p]=m}for(var M=0;M<i;M++)d+=h[M];for(var j=0;j<i;j++)l[j]={i:j,v:r[j],pr:h[j]/d,cs:0};l.sort(function(r,t){return r.pr-t.pr}),l[0].cs=l[0].pr;for(var x=1;x<i;x++)l[x].cs=l[x-1].cs+l[x].pr;for(var w=Math.random(),q=0;q<i-1&&l[q++].cs<w;);o.push(l[q-1].v)}return o}}},{"./distance.js":2}],4:[function(r,t,n){function o(r,t,n){n=n||[];for(var o=0;o<r;o++)n[o]=t;return n}var a=r("./distance.js"),e=r("./kinit.js"),i=a.eudist,f=(a.mandist,a.dist,e.kmrand),s=e.kmpp,u=1e4;t.exports=function(r,t,n,a){var e=[],v=[],h=[],c=[],d=!1,l=a||u,p=r.length,m=r[0].length,g=m>0,k=[];if(n)e="kmrand"==n?f(r,t):"kmpp"==n?s(r,t):n;else for(var M={};e.length<t;){var j=Math.floor(Math.random()*p);M[j]||(M[j]=!0,e.push(r[j]))}do{o(t,0,k);for(var x=0;x<p;x++){for(var w=1/0,q=0,b=0;b<t;b++)(c=g?i(r[x],e[b]):Math.abs(r[x]-e[b]))<=w&&(w=c,q=b);h[x]=q,k[q]++}for(var E=[],v=[],_=0;_<t;_++)E[_]=g?o(m,0,E[_]):0,v[_]=e[_];if(g){for(var y=0;y<t;y++)e[y]=[];for(var O=0;O<p;O++)for(var D=E[h[O]],N=r[O],U=0;U<m;U++)D[U]+=N[U];d=!0;for(var z=0;z<t;z++){for(var C=e[z],F=E[z],L=v[z],T=k[z],A=0;A<m;A++)C[A]=F[A]/T||0;if(d)for(var B=0;B<m;B++)if(L[B]!=C[B]){d=!1;break}}}else{for(var G=0;G<p;G++)E[h[G]]+=r[G];for(var H=0;H<t;H++)e[H]=E[H]/k[H]||0;d=!0;for(var I=0;I<t;I++)if(v[I]!=e[I]){d=!1;break}}d=d||--l<=0}while(!d);return{it:u-l,k:t,idxs:h,centroids:e}}},{"./distance.js":2,"./kinit.js":3}]},{},[1]);

15
frontend/node_modules/skmeans/dist/index.html generated vendored Normal file
View File

@@ -0,0 +1,15 @@
<!doctype html>
<html>
<head>
<script src="browser/skmeans.js"></script>
</head>
<body>
<script>
var data = [1,12,13,4,25,21,22,3,14,5,11,2,23,24,15];
var res = skmeans(data,3);
console.log(data);
console.log(res);
</script>
</body>
</html>

49
frontend/node_modules/skmeans/dist/node/Gruntfile.js generated vendored Normal file
View File

@@ -0,0 +1,49 @@
'use strict';
module.exports = function (grunt) {
require('load-grunt-tasks')(grunt);
// Project configuration.
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
browserify: {
dist: {
watch: true,
keepAlive: true,
files: {
'dist/browser/skmeans.js': ['browser.js']
}
}
},
babel: {
options: {
sourceMap: true,
presets: ['es2015']
},
dist: {
files: [{
expand: true,
src: ['*.js'],
dest: 'dist/node',
ext: '.js'
}, {
'dist/browser/skmeans.js': ['dist/browser/skmeans.js']
}]
}
},
uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
},
dist: {
files: {
'dist/browser/skmeans.min.js': ['dist/browser/skmeans.js']
}
}
},
clean: ['dist/browser/*.js', 'dist/browser/*.map']
});
grunt.registerTask('default', ['browserify', 'babel', 'uglify']);
};
//# sourceMappingURL=Gruntfile.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../Gruntfile.js"],"names":["module","exports","grunt","require","initConfig","pkg","file","readJSON","browserify","dist","watch","keepAlive","files","babel","options","sourceMap","presets","expand","src","dest","ext","uglify","banner","clean","registerTask"],"mappings":";;AAAAA,OAAOC,OAAP,GAAiB,UAASC,KAAT,EAAgB;AAChCC,SAAQ,kBAAR,EAA4BD,KAA5B;;AAEA;AACAA,OAAME,UAAN,CAAiB;AACfC,OAAKH,MAAMI,IAAN,CAAWC,QAAX,CAAoB,cAApB,CADU;AAEhBC,cAAY;AACXC,SAAM;AACLC,WAAO,IADF;AAELC,eAAW,IAFN;AAGLC,WAAO;AACN,gCAA2B,CAAC,YAAD;AADrB;AAHF;AADK,GAFI;AAWhBC,SAAO;AACNC,YAAS;AACRC,eAAW,IADH;AAERC,aAAS,CAAC,QAAD;AAFD,IADH;AAKNP,SAAM;AACLG,WAAO,CACN;AACCK,aAAQ,IADT;AAECC,UAAK,CAAC,MAAD,CAFN;AAGCC,WAAM,WAHP;AAICC,UAAK;AAJN,KADM,EAON;AACC,gCAA2B,CAAC,yBAAD;AAD5B,KAPM;AADF;AALA,GAXS;AA8BfC,UAAQ;AACNP,YAAS;AACPQ,YAAQ;AADD,IADH;AAIRb,SAAO;AACNG,WAAO;AACN,oCAAgC,CAAC,yBAAD;AAD1B;AADD;AAJC,GA9BO;AAwChBW,SAAO,CAAC,mBAAD,EAAqB,oBAArB;AAxCS,EAAjB;;AA2CArB,OAAMsB,YAAN,CAAmB,SAAnB,EAA8B,CAAC,YAAD,EAAc,OAAd,EAAsB,QAAtB,CAA9B;AACA,CAhDD","file":"Gruntfile.js","sourcesContent":["module.exports = function(grunt) {\n\trequire('load-grunt-tasks')(grunt);\n\n\t// Project configuration.\n\tgrunt.initConfig({\n\t pkg: grunt.file.readJSON('package.json'),\n\t\tbrowserify: {\n\t\t\tdist: {\n\t\t\t\twatch: true,\n\t\t\t\tkeepAlive: true,\n\t\t\t\tfiles: {\n\t\t\t\t\t'dist/browser/skmeans.js': ['browser.js']\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tbabel: {\n\t\t\toptions: {\n\t\t\t\tsourceMap: true,\n\t\t\t\tpresets: ['es2015']\n\t\t\t},\n\t\t\tdist: {\n\t\t\t\tfiles: [\n\t\t\t\t\t{\n\t\t\t\t\t\texpand: true,\n\t\t\t\t\t\tsrc: ['*.js'],\n\t\t\t\t\t\tdest: 'dist/node',\n\t\t\t\t\t\text: '.js'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t'dist/browser/skmeans.js': ['dist/browser/skmeans.js'],\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t},\n\t uglify: {\n\t options: {\n\t banner: '/*! <%= pkg.name %> <%= grunt.template.today(\"yyyy-mm-dd\") %> */\\n'\n\t },\n\t\t\tdist : {\n\t\t\t\tfiles: {\n\t\t\t\t\t'dist/browser/skmeans.min.js' : ['dist/browser/skmeans.js']\n\t\t\t\t}\n\t\t\t}\n\t },\n\t\tclean: ['dist/browser/*.js','dist/browser/*.map']\n\t});\n\n\tgrunt.registerTask('default', ['browserify','babel','uglify']);\n};\n"]}

19
frontend/node_modules/skmeans/dist/node/browser.js generated vendored Normal file
View File

@@ -0,0 +1,19 @@
"use strict";
(function () {
var root = this;
var previous_skmeans = root.skmeans;
var skmeans = require('./main.js');
if (typeof exports !== 'undefined') {
if (typeof module !== 'undefined' && module.exports) {
exports = module.exports = skmeans;
}
exports.skmeans = skmeans;
}
if (typeof window !== 'undefined') {
window.skmeans = skmeans;
}
}).call(undefined);
//# sourceMappingURL=browser.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../browser.js"],"names":["root","previous_skmeans","skmeans","require","exports","module","window","call"],"mappings":"AAAA;;AAEA,CAAC,YAAW;AACV,MAAIA,OAAO,IAAX;AACA,MAAIC,mBAAmBD,KAAKE,OAA5B;AACD,MAAIA,UAAUC,QAAQ,WAAR,CAAd;;AAEA,MAAI,OAAOC,OAAP,KAAmB,WAAvB,EAAqC;AAClC,QAAI,OAAOC,MAAP,KAAkB,WAAlB,IAAiCA,OAAOD,OAA5C,EAAsD;AACpDA,gBAAUC,OAAOD,OAAP,GAAiBF,OAA3B;AACD;AACDE,YAAQF,OAAR,GAAkBA,OAAlB;AACD;;AAEF,MAAG,OAAOI,MAAP,KAAkB,WAArB,EAAkC;AAC/BA,WAAOJ,OAAP,GAAiBA,OAAjB;AACD;AAEF,CAhBD,EAgBGK,IAhBH","file":"browser.js","sourcesContent":["\"use strict\";\n\n(function() {\n var root = this\n var previous_skmeans = root.skmeans;\n\tvar skmeans = require('./main.js');\n\n\tif( typeof exports !== 'undefined' ) {\n if( typeof module !== 'undefined' && module.exports ) {\n exports = module.exports = skmeans;\n }\n exports.skmeans = skmeans;\n }\n\n\tif(typeof window !== 'undefined') {\n window.skmeans = skmeans;\n }\n\n}).call(this);\n"]}

39
frontend/node_modules/skmeans/dist/node/distance.js generated vendored Normal file
View File

@@ -0,0 +1,39 @@
"use strict";
module.exports = {
/**
* Euclidean distance
*/
eudist: function eudist(v1, v2, sqrt) {
var len = v1.length;
var sum = 0;
for (var i = 0; i < len; i++) {
var d = (v1[i] || 0) - (v2[i] || 0);
sum += d * d;
}
// Square root not really needed
return sqrt ? Math.sqrt(sum) : sum;
},
mandist: function mandist(v1, v2, sqrt) {
var len = v1.length;
var sum = 0;
for (var i = 0; i < len; i++) {
sum += Math.abs((v1[i] || 0) - (v2[i] || 0));
}
// Square root not really needed
return sqrt ? Math.sqrt(sum) : sum;
},
/**
* Unidimensional distance
*/
dist: function dist(v1, v2, sqrt) {
var d = Math.abs(v1 - v2);
return sqrt ? d : d * d;
}
};
//# sourceMappingURL=distance.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../distance.js"],"names":["module","exports","eudist","v1","v2","sqrt","len","length","sum","i","d","Math","mandist","abs","dist"],"mappings":";;AAAAA,OAAOC,OAAP,GAAiB;AAChB;;;AAGAC,OAJgB,kBAITC,EAJS,EAINC,EAJM,EAIHC,IAJG,EAIG;AAClB,MAAIC,MAAMH,GAAGI,MAAb;AACA,MAAIC,MAAM,CAAV;;AAEA,OAAI,IAAIC,IAAE,CAAV,EAAYA,IAAEH,GAAd,EAAkBG,GAAlB,EAAuB;AACtB,OAAIC,IAAI,CAACP,GAAGM,CAAH,KAAO,CAAR,KAAcL,GAAGK,CAAH,KAAO,CAArB,CAAR;AACAD,UAAOE,IAAEA,CAAT;AACA;AACD;AACA,SAAOL,OAAMM,KAAKN,IAAL,CAAUG,GAAV,CAAN,GAAuBA,GAA9B;AACA,EAde;AAgBhBI,QAhBgB,mBAgBRT,EAhBQ,EAgBLC,EAhBK,EAgBFC,IAhBE,EAgBI;AACnB,MAAIC,MAAMH,GAAGI,MAAb;AACA,MAAIC,MAAM,CAAV;;AAEA,OAAI,IAAIC,IAAE,CAAV,EAAYA,IAAEH,GAAd,EAAkBG,GAAlB,EAAuB;AACtBD,UAAOG,KAAKE,GAAL,CAAS,CAACV,GAAGM,CAAH,KAAO,CAAR,KAAcL,GAAGK,CAAH,KAAO,CAArB,CAAT,CAAP;AACA;;AAED;AACA,SAAOJ,OAAMM,KAAKN,IAAL,CAAUG,GAAV,CAAN,GAAuBA,GAA9B;AACA,EA1Be;;;AA4BhB;;;AAGAM,KA/BgB,gBA+BXX,EA/BW,EA+BRC,EA/BQ,EA+BLC,IA/BK,EA+BC;AAChB,MAAIK,IAAIC,KAAKE,GAAL,CAASV,KAAGC,EAAZ,CAAR;AACA,SAAOC,OAAMK,CAAN,GAAUA,IAAEA,CAAnB;AACA;AAlCe,CAAjB","file":"distance.js","sourcesContent":["module.exports = {\n\t/**\n\t * Euclidean distance\n\t */\n\teudist(v1,v2,sqrt) {\n\t\tvar len = v1.length;\n\t\tvar sum = 0;\n\n\t\tfor(let i=0;i<len;i++) {\n\t\t\tvar d = (v1[i]||0) - (v2[i]||0);\n\t\t\tsum += d*d;\n\t\t}\n\t\t// Square root not really needed\n\t\treturn sqrt? Math.sqrt(sum) : sum;\n\t},\n\n\tmandist(v1,v2,sqrt) {\n\t\tvar len = v1.length;\n\t\tvar sum = 0;\n\n\t\tfor(let i=0;i<len;i++) {\n\t\t\tsum += Math.abs((v1[i]||0) - (v2[i]||0));\n\t\t}\n\n\t\t// Square root not really needed\n\t\treturn sqrt? Math.sqrt(sum) : sum;\n\t},\n\n\t/**\n\t * Unidimensional distance\n\t */\n\tdist(v1,v2,sqrt) {\n\t\tvar d = Math.abs(v1-v2);\n\t\treturn sqrt? d : d*d;\n\t}\n\n}\n"]}

110
frontend/node_modules/skmeans/dist/node/kinit.js generated vendored Normal file
View File

@@ -0,0 +1,110 @@
"use strict";
var Distance = require("./distance.js"),
eudist = Distance.eudist,
dist = Distance.dist;
module.exports = {
kmrand: function kmrand(data, k) {
var map = {},
ks = [],
t = k << 2;
var len = data.length;
var multi = data[0].length > 0;
while (ks.length < k && t-- > 0) {
var d = data[Math.floor(Math.random() * len)];
var key = multi ? d.join("_") : "" + d;
if (!map[key]) {
map[key] = true;
ks.push(d);
}
}
if (ks.length < k) throw new Error("Error initializating clusters");else return ks;
},
/**
* K-means++ initial centroid selection
*/
kmpp: function kmpp(data, k) {
var distance = data[0].length ? eudist : dist;
var ks = [],
len = data.length;
var multi = data[0].length > 0;
var map = {};
// First random centroid
var c = data[Math.floor(Math.random() * len)];
var key = multi ? c.join("_") : "" + c;
ks.push(c);
map[key] = true;
// Retrieve next centroids
while (ks.length < k) {
// Min Distances between current centroids and data points
var dists = [],
lk = ks.length;
var dsum = 0,
prs = [];
for (var i = 0; i < len; i++) {
var min = Infinity;
for (var j = 0; j < lk; j++) {
var _dist = distance(data[i], ks[j]);
if (_dist <= min) min = _dist;
}
dists[i] = min;
}
// Sum all min distances
for (var _i = 0; _i < len; _i++) {
dsum += dists[_i];
}
// Probabilities and cummulative prob (cumsum)
for (var _i2 = 0; _i2 < len; _i2++) {
prs[_i2] = { i: _i2, v: data[_i2], pr: dists[_i2] / dsum, cs: 0 };
}
// Sort Probabilities
prs.sort(function (a, b) {
return a.pr - b.pr;
});
// Cummulative Probabilities
prs[0].cs = prs[0].pr;
for (var _i3 = 1; _i3 < len; _i3++) {
prs[_i3].cs = prs[_i3 - 1].cs + prs[_i3].pr;
}
// Randomize
var rnd = Math.random();
// Gets only the items whose cumsum >= rnd
var idx = 0;
while (idx < len - 1 && prs[idx++].cs < rnd) {}
ks.push(prs[idx - 1].v);
/*
let done = false;
while(!done) {
// this is our new centroid
c = prs[idx-1].v
key = multi? c.join("_") : `${c}`;
if(!map[key]) {
map[key] = true;
ks.push(c);
done = true;
}
else {
idx++;
}
}
*/
}
return ks;
}
};
//# sourceMappingURL=kinit.js.map

1
frontend/node_modules/skmeans/dist/node/kinit.js.map generated vendored Normal file

File diff suppressed because one or more lines are too long

161
frontend/node_modules/skmeans/dist/node/main.js generated vendored Normal file
View File

@@ -0,0 +1,161 @@
"use strict";
/*jshint esversion: 6 */
var Distance = require("./distance.js"),
ClusterInit = require("./kinit.js"),
eudist = Distance.eudist,
mandist = Distance.mandist,
dist = Distance.dist,
kmrand = ClusterInit.kmrand,
kmpp = ClusterInit.kmpp;
var MAX = 10000;
/**
* Inits an array with values
*/
function init(len, val, v) {
v = v || [];
for (var i = 0; i < len; i++) {
v[i] = val;
}return v;
}
function skmeans(data, k, initial, maxit) {
var ks = [],
old = [],
idxs = [],
dist = [];
var conv = false,
it = maxit || MAX;
var len = data.length,
vlen = data[0].length,
multi = vlen > 0;
var count = [];
if (!initial) {
var _idxs = {};
while (ks.length < k) {
var idx = Math.floor(Math.random() * len);
if (!_idxs[idx]) {
_idxs[idx] = true;
ks.push(data[idx]);
}
}
} else if (initial == "kmrand") {
ks = kmrand(data, k);
} else if (initial == "kmpp") {
ks = kmpp(data, k);
} else {
ks = initial;
}
do {
// Reset k count
init(k, 0, count);
// For each value in data, find the nearest centroid
for (var i = 0; i < len; i++) {
var min = Infinity,
_idx = 0;
for (var j = 0; j < k; j++) {
// Multidimensional or unidimensional
var dist = multi ? eudist(data[i], ks[j]) : Math.abs(data[i] - ks[j]);
if (dist <= min) {
min = dist;
_idx = j;
}
}
idxs[i] = _idx; // Index of the selected centroid for that value
count[_idx]++; // Number of values for this centroid
}
// Recalculate centroids
var sum = [],
old = [],
dif = 0;
for (var _j = 0; _j < k; _j++) {
// Multidimensional or unidimensional
sum[_j] = multi ? init(vlen, 0, sum[_j]) : 0;
old[_j] = ks[_j];
}
// If multidimensional
if (multi) {
for (var _j2 = 0; _j2 < k; _j2++) {
ks[_j2] = [];
} // Sum values and count for each centroid
for (var _i = 0; _i < len; _i++) {
var _idx2 = idxs[_i],
// Centroid for that item
vsum = sum[_idx2],
// Sum values for this centroid
vect = data[_i]; // Current vector
// Accumulate value on the centroid for current vector
for (var h = 0; h < vlen; h++) {
vsum[h] += vect[h];
}
}
// Calculate the average for each centroid
conv = true;
for (var _j3 = 0; _j3 < k; _j3++) {
var ksj = ks[_j3],
// Current centroid
sumj = sum[_j3],
// Accumulated centroid values
oldj = old[_j3],
// Old centroid value
cj = count[_j3]; // Number of elements for this centroid
// New average
for (var _h = 0; _h < vlen; _h++) {
ksj[_h] = sumj[_h] / cj || 0; // New centroid
}
// Find if centroids have moved
if (conv) {
for (var _h2 = 0; _h2 < vlen; _h2++) {
if (oldj[_h2] != ksj[_h2]) {
conv = false;
break;
}
}
}
}
}
// If unidimensional
else {
// Sum values and count for each centroid
for (var _i2 = 0; _i2 < len; _i2++) {
var _idx3 = idxs[_i2];
sum[_idx3] += data[_i2];
}
// Calculate the average for each centroid
for (var _j4 = 0; _j4 < k; _j4++) {
ks[_j4] = sum[_j4] / count[_j4] || 0; // New centroid
}
// Find if centroids have moved
conv = true;
for (var _j5 = 0; _j5 < k; _j5++) {
if (old[_j5] != ks[_j5]) {
conv = false;
break;
}
}
}
conv = conv || --it <= 0;
} while (!conv);
return {
it: MAX - it,
k: k,
idxs: idxs,
centroids: ks
};
}
module.exports = skmeans;
//# sourceMappingURL=main.js.map

1
frontend/node_modules/skmeans/dist/node/main.js.map generated vendored Normal file

File diff suppressed because one or more lines are too long

37
frontend/node_modules/skmeans/distance.js generated vendored Normal file
View File

@@ -0,0 +1,37 @@
module.exports = {
/**
* Euclidean distance
*/
eudist(v1,v2,sqrt) {
var len = v1.length;
var sum = 0;
for(let i=0;i<len;i++) {
var d = (v1[i]||0) - (v2[i]||0);
sum += d*d;
}
// Square root not really needed
return sqrt? Math.sqrt(sum) : sum;
},
mandist(v1,v2,sqrt) {
var len = v1.length;
var sum = 0;
for(let i=0;i<len;i++) {
sum += Math.abs((v1[i]||0) - (v2[i]||0));
}
// Square root not really needed
return sqrt? Math.sqrt(sum) : sum;
},
/**
* Unidimensional distance
*/
dist(v1,v2,sqrt) {
var d = Math.abs(v1-v2);
return sqrt? d : d*d;
}
}

102
frontend/node_modules/skmeans/kinit.js generated vendored Normal file
View File

@@ -0,0 +1,102 @@
const
Distance = require("./distance.js"),
eudist = Distance.eudist,
dist = Distance.dist;
module.exports = {
kmrand(data,k) {
var map = {}, ks = [], t = k<<2;
var len = data.length;
var multi = data[0].length>0;
while(ks.length<k && (t--)>0) {
let d = data[Math.floor(Math.random()*len)];
let key = multi? d.join("_") : `${d}`;
if(!map[key]) {
map[key] = true;
ks.push(d);
}
}
if(ks.length<k) throw new Error("Error initializating clusters");
else return ks;
},
/**
* K-means++ initial centroid selection
*/
kmpp(data,k) {
var distance = data[0].length? eudist : dist;
var ks = [], len = data.length;
var multi = data[0].length>0;
var map = {};
// First random centroid
var c = data[Math.floor(Math.random()*len)];
var key = multi? c.join("_") : `${c}`;
ks.push(c);
map[key] = true;
// Retrieve next centroids
while(ks.length<k) {
// Min Distances between current centroids and data points
let dists = [], lk = ks.length;
let dsum = 0, prs = [];
for(let i=0;i<len;i++) {
let min = Infinity;
for(let j=0;j<lk;j++) {
let dist = distance(data[i],ks[j]);
if(dist<=min) min = dist;
}
dists[i] = min;
}
// Sum all min distances
for(let i=0;i<len;i++) {
dsum += dists[i]
}
// Probabilities and cummulative prob (cumsum)
for(let i=0;i<len;i++) {
prs[i] = {i:i, v:data[i], pr:dists[i]/dsum, cs:0}
}
// Sort Probabilities
prs.sort((a,b)=>a.pr-b.pr);
// Cummulative Probabilities
prs[0].cs = prs[0].pr;
for(let i=1;i<len;i++) {
prs[i].cs = prs[i-1].cs + prs[i].pr;
}
// Randomize
let rnd = Math.random();
// Gets only the items whose cumsum >= rnd
let idx = 0;
while(idx<len-1 && prs[idx++].cs<rnd);
ks.push(prs[idx-1].v);
/*
let done = false;
while(!done) {
// this is our new centroid
c = prs[idx-1].v
key = multi? c.join("_") : `${c}`;
if(!map[key]) {
map[key] = true;
ks.push(c);
done = true;
}
else {
idx++;
}
}
*/
}
return ks;
}
}

147
frontend/node_modules/skmeans/main.js generated vendored Normal file
View File

@@ -0,0 +1,147 @@
/*jshint esversion: 6 */
const
Distance = require("./distance.js"),
ClusterInit = require("./kinit.js"),
eudist = Distance.eudist,
mandist = Distance.mandist,
dist = Distance.dist,
kmrand = ClusterInit.kmrand,
kmpp = ClusterInit.kmpp;
const MAX = 10000;
/**
* Inits an array with values
*/
function init(len,val,v) {
v = v || [];
for(let i=0;i<len;i++) v[i] = val;
return v;
}
function skmeans(data,k,initial,maxit) {
var ks = [], old = [], idxs = [], dist = [];
var conv = false, it = maxit || MAX;
var len = data.length, vlen = data[0].length, multi = vlen>0;
var count = [];
if(!initial) {
let idxs = {};
while(ks.length<k) {
let idx = Math.floor(Math.random()*len);
if(!idxs[idx]) {
idxs[idx] = true;
ks.push(data[idx]);
}
}
}
else if(initial=="kmrand") {
ks = kmrand(data,k);
}
else if(initial=="kmpp") {
ks = kmpp(data,k);
}
else {
ks = initial;
}
do {
// Reset k count
init(k,0,count);
// For each value in data, find the nearest centroid
for(let i=0;i<len;i++) {
let min = Infinity, idx = 0;
for(let j=0;j<k;j++) {
// Multidimensional or unidimensional
var dist = multi? eudist(data[i],ks[j]) : Math.abs(data[i]-ks[j]);
if(dist<=min) {
min = dist;
idx = j;
}
}
idxs[i] = idx; // Index of the selected centroid for that value
count[idx]++; // Number of values for this centroid
}
// Recalculate centroids
var sum = [], old = [], dif = 0;
for(let j=0;j<k;j++) {
// Multidimensional or unidimensional
sum[j] = multi? init(vlen,0,sum[j]) : 0;
old[j] = ks[j];
}
// If multidimensional
if(multi) {
for(let j=0;j<k;j++) ks[j] = [];
// Sum values and count for each centroid
for(let i=0;i<len;i++) {
let idx = idxs[i], // Centroid for that item
vsum = sum[idx], // Sum values for this centroid
vect = data[i]; // Current vector
// Accumulate value on the centroid for current vector
for(let h=0;h<vlen;h++) {
vsum[h] += vect[h];
}
}
// Calculate the average for each centroid
conv = true;
for(let j=0;j<k;j++) {
let ksj = ks[j], // Current centroid
sumj = sum[j], // Accumulated centroid values
oldj = old[j], // Old centroid value
cj = count[j]; // Number of elements for this centroid
// New average
for(let h=0;h<vlen;h++) {
ksj[h] = (sumj[h])/(cj) || 0; // New centroid
}
// Find if centroids have moved
if(conv) {
for(let h=0;h<vlen;h++) {
if(oldj[h]!=ksj[h]) {
conv = false;
break;
}
}
}
}
}
// If unidimensional
else {
// Sum values and count for each centroid
for(let i=0;i<len;i++) {
let idx = idxs[i];
sum[idx] += data[i];
}
// Calculate the average for each centroid
for(let j=0;j<k;j++) {
ks[j] = sum[j]/count[j] || 0; // New centroid
}
// Find if centroids have moved
conv = true;
for(let j=0;j<k;j++) {
if(old[j]!=ks[j]) {
conv = false;
break;
}
}
}
conv = conv || (--it<=0);
}while(!conv);
return {
it : MAX-it,
k : k,
idxs : idxs,
centroids : ks
};
}
module.exports = skmeans;

33
frontend/node_modules/skmeans/package.json generated vendored Normal file
View File

@@ -0,0 +1,33 @@
{
"name": "skmeans",
"version": "0.9.7",
"description": "Super fast simple k-means and k-means++ clustering for unidimiensional and multidimensional data. Works in node and browser",
"author": "David Gómez Matarrodona <solzimer@gmail.com>",
"url": "https://github.com/owner/project/issues",
"email": "solzimer@gmail.com",
"main": "dist/node/main.js",
"license": "MIT",
"repository": "solzimer/skmeans",
"keywords": [
"k-means",
"k-means++",
"kmeans++",
"kmeans",
"simple",
"cluster",
"fast",
"unidimiensional",
"multidimensional"
],
"dependencies": {},
"devDependencies": {
"babel-preset-es2015": "^6.24.1",
"grunt": "^1.0.1",
"grunt-babel": "^6.0.0",
"grunt-browserify": "^5.0.0",
"grunt-contrib-clean": "^1.1.0",
"grunt-contrib-uglify": "^3.0.1",
"load-grunt-tasks": "^3.5.2",
"uglify": "^0.1.5"
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
module.exports = [[-82.46337890625,23.059516273509303],[-82.353515625,23.120153621695614],[-82.36450195312499,23.074678175027337],[-82.19970703125,23.221154981846556],[-82.19970703125,23.089838367476705],[-82.28759765625,22.99379497224218],[-75.8551025390625,20.035289711352377],[-75.6683349609375,20.128155311797183],[-75.73974609375,20.122997556207757],[-75.6683349609375,20.030128899024707],[-75.80017089843749,20.040450354169483],[-76.0089111328125,20.226120295836992],[-76.0308837890625,19.926877111209265],[-75.7562255859375,20.014645445341365],[-80.46936035156249,22.070368801349257],[-80.34027099609375,22.2026634080092],[-80.35675048828125,22.12126604542578],[-80.43914794921875,22.271305748177635],[-80.38970947265625,22.021999432851782],[-80.55999755859375,22.118721619281263],[-80.54351806640625,22.0525504317147],[-75.87158203125,20.86907773201848],[-75.640869140625,20.571081893508193],[-76.640625,21.053744493156348],[-76.7724609375,20.56079574020845],[-76.278076171875,20.992214250886114],[-76.058349609375,20.50935458871459],[-76.365966796875,20.776659051878816],[-77.091064453125,19.932041306115536],[-79.87060546875,22.40087159030595],[-79.903564453125,22.31958944283391],[-80.079345703125,22.28909641872304],[-80.035400390625,22.004174972902003],[-79.4970703125,22.156883186860703],[-80.343017578125,21.309846141087192],[-79.4970703125,21.58593511478851],[-78.79394531249999,22.51255695405145],[-79.07958984375,21.922663209325922],[-78.782958984375,21.3303150734318],[-82.452392578125,23.976214626638292],[-82.6171875,23.68477416688374],[-82.056884765625,23.68477416688374],[-83.43017578125,22.6038688428957],[-83.001708984375,23.200960808078566],[-82.72705078125,22.92804166565176]];

15
frontend/node_modules/skmeans/test/multi.js generated vendored Normal file
View File

@@ -0,0 +1,15 @@
const skmeans = require("../main.js");
var data = [];
for(let i=0;i<2000;i++) {
var r = Math.random();
if(r>=0 && r<0.33) data.push([r,r*2]);
else if(r>=0.33 && r<0.66) data.push([r+4,2*(r+4)]);
else data.push([r+9,2*(r+9)]);
}
var res = skmeans(data,3,"kmrand");
console.log(res.it,res.centroids);
var res = skmeans(data,3,"kmpp");
console.log(res.it,res.centroids);

65
frontend/node_modules/skmeans/test/stats.js generated vendored Normal file
View File

@@ -0,0 +1,65 @@
const skmeans = require("../main.js");
const data1 = require("./data/well-separated.js");
const data2 = require("./data/random_pts.js");
const MAX = 1000;
function testCentroids(ks) {
ks.forEach(k=>{
k.forEach(v=>{
if(v==0) {
console.error(`Centroid on 0 ${k}`);
process.exit(1);
}
})
})
}
console.log("Simple data (k=3)");
var its = 0;
for(var i=0;i<MAX;i++) {
var res = skmeans(data1,3);
testCentroids(res.centroids);
its += res.it;
}
console.log("skmeans default\t\t=>",its/MAX);
var its = 0;
for(var i=0;i<MAX;i++) {
var res = skmeans(data1,3,"kmrand");
testCentroids(res.centroids);
its += res.it;
}
console.log("skmeans kmrand\t\t=>",its/MAX);
var its = 0;
for(var i=0;i<MAX;i++) {
var res = skmeans(data1,3,"kmpp");
testCentroids(res.centroids);
its += res.it;
}
console.log("skmeans kmpp\t\t=>",its/MAX);
console.log("Complex data (k=16)");
var its = 0;
for(var i=0;i<MAX;i++) {
var res = skmeans(data2,16);
testCentroids(res.centroids);
its += res.it;
}
console.log("skmeans default\t\t=>",its/MAX);
var its = 0;
for(var i=0;i<MAX;i++) {
var res = skmeans(data2,16,"kmrand");
testCentroids(res.centroids);
its += res.it;
}
console.log("skmeans kmrand\t\t=>",its/MAX);
var its = 0;
for(var i=0;i<MAX;i++) {
var res = skmeans(data2,16,"kmpp");
testCentroids(res.centroids);
its += res.it;
}
console.log("skmeans kmpp\t\t=>",its/MAX);

42
frontend/node_modules/skmeans/test/test.js generated vendored Normal file
View File

@@ -0,0 +1,42 @@
const skmeans = require("../main.js");
function testUni() {
var data = [];
for(let i=0;i<1000;i++) {
var r = Math.random();
if(r>=0 && r<0.33) data.push(r);
else if(r>=0.33 && r<0.66) data.push(r+4);
else data.push(r+9);
}
var its = 10000;
var ti = Date.now();
for(var i=0;i<its;i++) {
var res = skmeans(data,3);
}
var tf = Date.now();
console.log("Unidimensional",1000*its/(tf-ti) + " ops/sec");
}
function testMulti() {
var data = [];
for(let i=0;i<1000;i++) {
var r = Math.random();
if(r>=0 && r<0.33) data.push([r,r*2]);
else if(r>=0.33 && r<0.66) data.push([r+4,2*(r+4)]);
else data.push([r+9,2*(r+9)]);
}
var its = 10000;
var ti = Date.now();
for(var i=0;i<its;i++) {
var res = skmeans(data,3);
}
var tf = Date.now();
console.log("Multidimensional",1000*its/(tf-ti) + " ops/sec");
}
testUni();
testMulti();

23
frontend/node_modules/skmeans/test/test_rand.js generated vendored Normal file
View File

@@ -0,0 +1,23 @@
const skmeans = require("../main.js");
const data = require("./data/random_pts.js");
var method = process.argv[2] || null;
var res = skmeans(data,16,method);
console.error(res);
var out = data.map((d,i)=>{
return {
cluster: "CLUSTER_"+res.idxs[i],
x:d[0],
y:d[1]
}
});
res.centroids.forEach((k,i)=>{
out.push({
cluster: "K_"+i,
x:k[0],
y:k[1]
})
});
console.log(JSON.stringify(out,null,2));

23
frontend/node_modules/skmeans/test/test_ws.js generated vendored Normal file
View File

@@ -0,0 +1,23 @@
const skmeans = require("../main.js");
const data = require("./data/well-separated.js");
var method = process.argv[2] || null;
var res = skmeans(data,3,method);
console.error(res);
var out = data.map((d,i)=>{
return {
cluster: "CLUSTER_"+res.idxs[i],
x:d[0],
y:d[1]
}
});
res.centroids.forEach((k,i)=>{
out.push({
cluster: "K_"+i,
x:k[0],
y:k[1]
})
});
console.log(JSON.stringify(out,null,2));

15
frontend/node_modules/skmeans/test/uni.js generated vendored Normal file
View File

@@ -0,0 +1,15 @@
const skmeans = require("../main.js");
var data = [];
for(let i=0;i<2000;i++) {
var r = Math.random();
if(r>=0 && r<0.33) data.push(r);
else if(r>=0.33 && r<0.66) data.push(r+4);
else data.push(r+9);
}
var res = skmeans(data,3,[1,5,9]);
console.log(res.it,res.centroids);
var res = skmeans(data,3,"kmpp");
console.log(res.it,res.centroids);