UNPKG

@aidanconnelly/tsnejs

Version:

t-SNE visualization algorithm

3 lines 4.46 kB
/*! @aidanconnelly/tsnejs - 0.1.4 */ !function(t){function r(e){if(i[e])return i[e].exports;var n=i[e]={exports:{},id:e,loaded:!1};return t[e].call(n.exports,n,n.exports,r),n.loaded=!0,n.exports}var i={};return r.m=t,r.c=i,r.p="",r(0)}([function(t,r,i){window.tsnejs=i(1)},function(t,r){"use strict";function i(t,r){if(!(t instanceof r))throw new TypeError("Cannot call a class as a function")}function e(t){return t>0?1:t<0?-1:0}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function t(t,r){for(var i=0;i<r.length;i++){var e=r[i];e.enumerable=e.enumerable||!1,e.configurable=!0,"value"in e&&(e.writable=!0),Object.defineProperty(t,e.key,e)}}return function(r,i,e){return i&&t(r.prototype,i),e&&t(r,e),r}}();r.sign=e;var a=function(t,r){if(!t)throw r||"Assertion failed"},o=function(t,r,i){return t.hasOwnProperty(r)?t[r]:i},s=!1,h=0,u=r.gaussRandom=function t(){if(s)return s=!1,h;var r=2*Math.random()-1,i=2*Math.random()-1,e=r*r+i*i;if(0==e||e>1)return t();var n=Math.sqrt(-2*Math.log(e)/e);return h=i*n,s=!0,r*n},f=r.randn=function(t,r){return t+u()*r},v=function(t){if("undefined"==typeof t||isNaN(t))return[];if("undefined"==typeof ArrayBuffer){for(var r=new Array(t),i=0;i<t;i++)r[i]=0;return r}return new Float64Array(t)},l=r.randn2d=function(t,r,i){for(var e="undefined"!=typeof i,n=[],a=0;a<t;a++){for(var o=[],s=0;s<r;s++)e?o.push(i):o.push(f(0,1e-4));n.push(o)}return n},d=r.L2=function(t,r){for(var i=t.length,e=0,n=0;n<i;n++){var a=t[n],o=r[n];e+=(a-o)*(a-o)}return e},c=r.xtod=function(t){for(var r=t.length,i=v(r*r),e=0;e<r;e++)for(var n=e+1;n<r;n++){var a=d(t[e],t[n]);i[e*r+n]=a,i[n*r+e]=a}return i},p=r.d2p=function(t,r,i){var e=Math.sqrt(t.length),n=Math.floor(e);a(n===e,"D should have square number of elements.");for(var o=Math.log(r),s=v(n*n),h=v(n),u=0;u<n;u++){for(var f=-(1/0),l=1/0,d=1,c=!1,p=50,y=0;!c;){for(var m=0,g=0;g<n;g++){var Y=Math.exp(-t[u*n+g]*d);u===g&&(Y=0),h[g]=Y,m+=Y}for(var M=0,g=0;g<n;g++){if(0==m)var Y=0;else var Y=h[g]/m;h[g]=Y,Y>1e-7&&(M-=Y*Math.log(Y))}M>o?(f=d,l===1/0?d*=2:d=(d+l)/2):(l=d,f===-(1/0)?d/=2:d=(d+f)/2),y++,Math.abs(M-o)<i&&(c=!0),y>=p&&(c=!0)}for(var g=0;g<n;g++)s[u*n+g]=h[g]}for(var x=v(n*n),w=2*n,u=0;u<n;u++)for(var g=0;g<n;g++)x[u*n+g]=Math.max((s[u*n+g]+s[g*n+u])/w,1e-100);return x};r.tSNE=function(){function t(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};i(this,t),this.perplexity=o(r,"perplexity",30),this.dim=o(r,"dim",2),this.epsilon=o(r,"epsilon",10),this.iter=0}return n(t,[{key:"initDataRaw",value:function(t){var r=t.length,i=t[0].length;a(r>0," X is empty? You must have some data!"),a(i>0," X[0] is empty? Where is the data?");var e=c(t);this.P=p(e,this.perplexity,1e-4),this.N=r,this.initSolution()}},{key:"initDataDist",value:function(t){var r=t.length;a(r>0," X is empty? You must have some data!");for(var i=v(r*r),e=0;e<r;e++)for(var n=e+1;n<r;n++){var o=t[e][n];i[e*r+n]=o,i[n*r+e]=o}this.P=p(i,this.perplexity,1e-4),this.N=r,this.initSolution()}},{key:"initSolution",value:function(){this.Y=l(this.N,this.dim),this.gains=l(this.N,this.dim,1),this.ystep=l(this.N,this.dim,0),this.iter=0}},{key:"getSolution",value:function(){return this.Y}},{key:"step",value:function(){this.iter+=1;for(var t=this.N,r=this.costGrad(this.Y),i=r.cost,n=r.grad,a=v(this.dim),o=0;o<t;o++)for(var s=0;s<this.dim;s++){var h=n[o][s],u=this.ystep[o][s],f=this.gains[o][s],l=e(h)===e(u)?.8*f:f+.2;l<.01&&(l=.01),this.gains[o][s]=l;var d=this.iter<250?.5:.8,c=d*u-this.epsilon*l*n[o][s];this.ystep[o][s]=c,this.Y[o][s]+=c,a[s]+=this.Y[o][s]}for(var o=0;o<t;o++)for(var s=0;s<this.dim;s++)this.Y[o][s]-=a[s]/t;return i}},{key:"debugGrad",value:function(){for(var t=this.N,r=this.costGrad(this.Y),i=(r.grad,1e-5),e=0;e<t;e++)for(var n=0;n<this.dim;n++){var a=this.Y[e][n];this.Y[e][n]=a+i;this.costGrad(this.Y);this.Y[e][n]=a-i;this.costGrad(this.Y);this.Y[e][n]=a}}},{key:"costGrad",value:function(t){for(var r=this.N,i=this.dim,e=this.P,n=this.iter<100?4:1,a=v(r*r),o=0,s=0;s<r;s++)for(var h=s+1;h<r;h++){for(var u=0,f=0;f<i;f++){var l=t[s][f]-t[h][f];u+=l*l}var d=1/(1+u);a[s*r+h]=d,a[h*r+s]=d,o+=2*d}for(var c=r*r,p=v(c),y=0;y<c;y++)p[y]=Math.max(a[y]/o,1e-100);for(var m=0,g=[],s=0;s<r;s++){for(var Y=new Array(i),f=0;f<i;f++)Y[f]=0;for(var h=0;h<r;h++){m+=-e[s*r+h]*Math.log(p[s*r+h]);for(var M=4*(n*e[s*r+h]-p[s*r+h])*a[s*r+h],f=0;f<i;f++)Y[f]+=M*(t[s][f]-t[h][f])}g.push(Y)}return{cost:m,grad:g}}}]),t}()}]); //# sourceMappingURL=bundle.min.js.map