UNPKG

kmeans-ts

Version:

A fast, efficient k-means clustering implementation in TypeScript

3 lines (2 loc) 2.37 kB
"use strict";function r(r,n,t){t=t||[];for(var a=0;a<r;a++)t[a]=n;return t}Object.defineProperty(exports,"__esModule",{value:!0});var n=function(){function r(){}return r.k_means=function(r,n){for(var t=[],a=n<<2,e={};t.length<n&&a-- >0;){var o=r[Math.floor(Math.random()*r.length)],i=r[0].length>0?o.join("_"):""+o;e[i]||(e[i]=!0,t.push(o))}if(t.length<n)throw Error("Failed to initialize clusters");return t},r.k_means_pp=function(r,n){var a=r[0].length?t.euclideanDist:t.dist,e=[],o=r[Math.floor(Math.random()*r.length)];for(e.push(o),{}[r[0].length>0?o.join("_"):""+o]=!0;e.length<n;){var i=[],f=[],v=0;for(var s in r){var l=Infinity;for(var h in e){var u=a(r[s],e[h]);u<=l&&(l=u)}i[s]=l}for(var c in r)v+=i[c];for(var g in r)f[g]={i:g,v:r[g],pr:i[g]/v,cs:0};f.sort((function(r,n){return r.pr-n.pr})),f[0].cs=f[0].pr;for(var p=1;p<r.length;p++)f[p].cs=f[p-1].cs+f[p].pr;for(var d=Math.random(),m=0;m<r.length-1&&f[m++].cs<d;);e.push(f[m-1].v)}return e},r}(),t=function(){function r(){}return r.dist=function(r,n,t){var a=Math.abs(r-n);return t?a:a*a},r.euclideanDist=function(r,n){var t=0;for(var a in r){var e=(r[a]||0)-(n[a]||0);t+=e*e}return t},r.manhattanDist=function(r,n){var t=0,a=0;for(var e in r)t+=(a=(r[e]||0)-(n[e]||0))>=0?a:-a;return t},r}();exports.Cluster=n,exports.Distance=t,exports.default=function(a,e,o,i){var f=[],v=[],s=!1,l=i||1e4,h=[];if(o)f="kmeans"===o?n.k_means(a,e):"kmeans++"===o?n.k_means_pp(a,e):Array.from(o);else for(var u=[],c=0;f.length<e;){var g=Math.floor(Math.random()*a.length);u[g]||(u[g]=!0,f[c++]=a[g])}do{for(var p in r(e,0,h),a){for(var d=Infinity,m=0,M=0;M<e;M++){var _=a[0].length>0?t.euclideanDist(a[p],f[M]):Math.abs(a[p][0]-f[M][0]);_<=d&&(d=_,m=M)}v[p]=m,h[m]++}var k=[],b=[];if(a[0].length>0)for(var x=0;x<e;x++)k[x]=r(a[0].length,0,k[x]),b[x]=f[x];else for(var D=0;D<e;D++)k[D]=0,b[D]=f[D];if(a[0].length>0){for(var y=0;y<e;y++)f[y]=[];for(var j in a)for(var w=0;w<a[0].length;w++)k[v[j]][w]+=a[j][w];s=!0;for(var I=0;I<e;I++){for(var z=f[I],A=0;A<a[0].length;A++)z[A]=k[I][A]/h[I]||0;if(s)for(var C=0;C<a[0].length;C++)if(b[I][C]!=z[C]){s=!1;break}}}else{for(var E in a)k[v[E]]+=a[E];for(var F=0;F<e;F++)f[F]=[k[F]/h[F]]||[0];s=!0;for(var O=0;O<e;O++)if(b[O]!=f[O]){s=!1;break}}s=s||--l<=0}while(!s);return{iterations:(i||1e4)-l,k:e,indexes:v,centroids:f}}; //# sourceMappingURL=kmeans-ts.cjs.production.min.js.map