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