| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 | "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
 |