sdbscan
Version:
DBSCAN implementation (density based spatial clustering) for javascript. Works in node and browser
3 lines (2 loc) • 2.67 kB
JavaScript
/*! sdbscan 2017-07-27 */
;function _classCallCheck(t,n){if(!(t instanceof n))throw new TypeError("Cannot call a class as a function")}var _createClass=function(){function t(t,n){for(var r=0;r<n.length;r++){var i=n[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(n,r,i){return r&&t(n.prototype,r),i&&t(n,i),n}}();!function t(n,r,i){function e(s,u){if(!r[s]){if(!n[s]){var o="function"==typeof require&&require;if(!u&&o)return o(s,!0);if(a)return a(s,!0);var f=new Error("Cannot find module '"+s+"'");throw f.code="MODULE_NOT_FOUND",f}var c=r[s]={exports:{}};n[s][0].call(c.exports,function(t){var r=n[s][1][t];return e(r||t)},c,c.exports,t,n,r,i)}return r[s].exports}for(var a="function"==typeof require&&require,s=0;s<i.length;s++)e(i[s]);return e}({1:[function(t,n,r){!function(n){var r=t("./main.js");n.sdbscan=r}(window)},{"./main.js":3}],2:[function(t,n,r){n.exports={eudist:function(t,n,r){for(var i=t.length,e=0,a=0;a<i;a++){var s=(t[a]||0)-(n[a]||0);e+=s*s}return r?Math.sqrt(e):e},mandist:function(t,n,r){for(var i=t.length,e=0,a=0;a<i;a++)e+=Math.abs((t[a]||0)-(n[a]||0));return r?Math.sqrt(e):e},dist:function(t,n,r){var i=Math.abs(t-n);return r?i:i*i}}},{}],3:[function(t,n,r){var i=t("./distance.js").eudist,e=function t(n,r){_classCallCheck(this,t),this.v=n,this.idx=r||0,this.k=0,this.visited=!1},a=function(){function t(n,r,i){_classCallCheck(this,t),this._multi=n[0].length>0,this._data=this.initData(n),this._eps=r,this._min=i}return _createClass(t,[{key:"initData",value:function(t){for(var n=[],r=t.length,i=this._multi,a=0;a<r;a++)n.push(new e(i?t[a]:[t[a]],a));return n}},{key:"regionQuery",value:function(t){for(var n=this._eps,r=this._data,e=[],a=r.length,s=0;s<a;s++){var u=r[s];u!=t&&u.visited||i(u.v,t.v,!0)<=n&&e.push(u)}return e}},{key:"expandCluster",value:function(t,n,r){this._eps,this._data;var i=this._min;t.k=r.id,r.data.push(t.v);for(var e=0;e<n.length;e++){var a=n[e];if(!a.visited){a.visited=!0;var s=this.regionQuery(a),u=s.length;if(u>=i)for(var o=0;o<u;o++)n.push(s[o]);a.k||(a.k=r.id,r.data.push(a.v))}}}},{key:"dbscan",value:function(){for(var t=this._data,n=this._min,r=t.length,i=0,e=[],a=[],s=null,u=0;u<r;u++){var o=t[u];if(!o.visited){o.visited=!0;var f=this.regionQuery(o);f.length<n?a.push(o):(s={id:i++,data:[]},e.push(s),this.expandCluster(o,f,s))}}return this._multi||(e.forEach(function(t){t.data=t.data.map(function(t){return t[0]})}),a.forEach(function(t){return t.v=t.v[0]})),{noise:a.map(function(t){return t.v}),clusters:e}}}]),t}();n.exports=function(t,n,r){return new a(t,n,r).dbscan()}},{"./distance.js":2}]},{},[1]);