UNPKG

gs-pca-no-console

Version:

Principal Components Analysis in javascript

1 lines 5.01 kB
var PCA=function(){function r(r){return i(r,c(u(l(r.length),r),1/r.length))}function n(r){return u(h(r),r)}function t(r,n){return c(r,n?1/(r.length-1):1/r.length)}function e(r){var n=function(r){var n,t=Math.pow(2,-52),e=1e-64/t,o=0,a=0,f=0,u=0,i=0,c=s(r),l=c.length,h=c[0].length;if(l<h)throw"Need more rows than columns";var g=new Array(h),v=new Array(h);for(a=0;a<h;a++)g[a]=v[a]=0;var m=function r(n,t,e){void 0===e&&(e=0);var o,a=n[e],f=Array(a);if(e===n.length-1){for(o=a-2;o>=0;o-=2)f[o+1]=t,f[o]=t;return-1===o&&(f[0]=t),f}for(o=a-1;o>=0;o--)f[o]=r(n,t,e+1);return f}([h,h],0);function d(r,n){return r=Math.abs(r),n=Math.abs(n),r>n?r*Math.sqrt(1+n*n/r/r):0==n?r:n*Math.sqrt(1+r*r/n/n)}var p=0,M=0,w=0,b=0,A=0,D=0,y=0;for(a=0;a<h;a++){for(g[a]=M,y=0,i=a+1,f=a;f<l;f++)y+=c[f][a]*c[f][a];if(y<=e)M=0;else for(p=c[a][a],M=Math.sqrt(y),p>=0&&(M=-M),w=p*M-y,c[a][a]=p-M,f=i;f<h;f++){for(y=0,u=a;u<l;u++)y+=c[u][a]*c[u][f];for(p=y/w,u=a;u<l;u++)c[u][f]+=p*c[u][a]}for(v[a]=M,y=0,f=i;f<h;f++)y+=c[a][f]*c[a][f];if(y<=e)M=0;else{for(p=c[a][a+1],M=Math.sqrt(y),p>=0&&(M=-M),w=p*M-y,c[a][a+1]=p-M,f=i;f<h;f++)g[f]=c[a][f]/w;for(f=i;f<l;f++){for(y=0,u=i;u<h;u++)y+=c[f][u]*c[a][u];for(u=i;u<h;u++)c[f][u]+=y*g[u]}}(A=Math.abs(v[a])+Math.abs(g[a]))>b&&(b=A)}for(a=h-1;-1!=a;a+=-1){if(0!=M){for(w=M*c[a][a+1],f=i;f<h;f++)m[f][a]=c[a][f]/w;for(f=i;f<h;f++){for(y=0,u=i;u<h;u++)y+=c[a][u]*m[u][f];for(u=i;u<h;u++)m[u][f]+=y*m[u][a]}}for(f=i;f<h;f++)m[a][f]=0,m[f][a]=0;m[a][a]=1,M=g[a],i=a}for(a=h-1;-1!=a;a+=-1){for(i=a+1,M=v[a],f=i;f<h;f++)c[a][f]=0;if(0!=M){for(w=c[a][a]*M,f=i;f<h;f++){for(y=0,u=i;u<l;u++)y+=c[u][a]*c[u][f];for(p=y/w,u=a;u<l;u++)c[u][f]+=p*c[u][a]}for(f=a;f<l;f++)c[f][a]=c[f][a]/M}else for(f=a;f<l;f++)c[f][a]=0;c[a][a]+=1}for(t*=b,u=h-1;-1!=u;u+=-1)for(var S=0;S<50;S++){var E=!1;for(i=u;-1!=i;i+=-1){if(Math.abs(g[i])<=t){E=!0;break}if(Math.abs(v[i-1])<=t)break}if(!E){o=0,y=1;var V=i-1;for(a=i;a<u+1&&(p=y*g[a],g[a]=o*g[a],!(Math.abs(p)<=t));a++)for(M=v[a],w=d(p,M),v[a]=w,o=M/w,y=-p/w,f=0;f<l;f++)A=c[f][V],D=c[f][a],c[f][V]=A*o+D*y,c[f][a]=-A*y+D*o}if(D=v[u],i==u){if(D<0)for(v[u]=-D,f=0;f<h;f++)m[f][u]=-m[f][u];break}if(S>=49)throw"Error: no convergence.";for(b=v[i],A=v[u-1],M=g[u-1],w=g[u],M=d(p=((A-D)*(A+D)+(M-w)*(M+w))/(2*w*A),1),p=p<0?((b-D)*(b+D)+w*(A/(p-M)-w))/b:((b-D)*(b+D)+w*(A/(p+M)-w))/b,o=1,y=1,a=i+1;a<u+1;a++){for(M=g[a],A=v[a],w=y*M,M*=o,D=d(p,w),g[a-1]=D,p=b*(o=p/D)+M*(y=w/D),M=-b*y+M*o,w=A*y,A*=o,f=0;f<h;f++)b=m[f][a-1],D=m[f][a],m[f][a-1]=b*o+D*y,m[f][a]=-b*y+D*o;for(D=d(p,w),v[a-1]=D,p=(o=p/D)*M+(y=w/D)*A,b=-y*M+o*A,f=0;f<l;f++)A=c[f][a-1],D=c[f][a],c[f][a-1]=A*o+D*y,c[f][a]=-A*y+D*o}g[i]=0,g[u]=p,v[u]=b}for(a=0;a<v.length;a++)v[a]<t&&(v[a]=0);for(a=0;a<h;a++)for(f=a-1;f>=0;f--)if(v[f]<v[a]){for(o=v[f],v[f]=v[a],v[a]=o,u=0;u<c.length;u++)n=c[u][a],c[u][a]=c[u][f],c[u][f]=n;for(u=0;u<m.length;u++)n=m[u][a],m[u][a]=m[u][f],m[u][f]=n;a=f}return{U:c,S:v,V:m}}(r);var t=n.U;return n.S.map(function(r,n){var e={};return e.eigenvalue=r,e.vector=t.map(function(r,t){return-1*r[n]}),e})}function o(n,...t){var e=t.map(function(r){return r.vector}),o=u(e,h(r(n))),a=c(u(l(n.length),n),-1/n.length);return{adjustedData:o,formattedAdjustedData:f(o,2),avgData:a,selectedVectors:e}}function a(o){return e(t(n(r(o)),!1))}function f(r,n){var t=Math.pow(10,n||2);return r.map(function(r,n){return r.map(function(r){return Math.round(r*t)/t})})}function u(r,n){if(!(r[0]&&n[0]&&r.length&&n.length))throw new Error("Both A and B should be matrices");if(n.length!==r[0].length)throw new Error("Columns in A should be the same as the number of rows in B");for(var t=[],e=0;e<r.length;e++){t[e]=[];for(var o=0;o<n[0].length;o++)for(var a=0;a<r[0].length;a++)t[e][o]=t[e][o]?t[e][o]+r[e][a]*n[a][o]:r[e][a]*n[a][o]}return t}function i(r,n){if(r.length!==n.length||r[0].length!==n[0].length)throw new Error("Both A and B should have the same dimensions");for(var t=[],e=0;e<r.length;e++){t[e]=[];for(var o=0;o<n[0].length;o++)t[e][o]=r[e][o]-n[e][o]}return t}function c(r,n){for(var t=[],e=0;e<r.length;e++){t[e]=[];for(var o=0;o<r[0].length;o++)t[e][o]=r[e][o]*n}return t}function l(r){for(var n=[],t=0;t<r;t++){n[t]=[];for(var e=0;e<r;e++)n[t][e]=1}return n}function h(r){return s(r)[0].map(function(n,t){return r.map(function(r){return r[t]})})}function s(r){var n=JSON.stringify(r);return JSON.parse(n)}return{computeDeviationScores:n,computeDeviationMatrix:r,computeSVD:e,computePercentageExplained:function(r,...n){var t=r.map(function(r){return r.eigenvalue}).reduce(function(r,n){return r+n});return n.map(function(r){return r.eigenvalue}).reduce(function(r,n){return r+n})/t},computeOriginalData:function(r,n,t){var e=i(h(u(h(n),r)),t);return{originalData:e,formattedOriginalData:f(e,2)}},computeVarianceCovariance:t,computeAdjustedData:o,getEigenVectors:a,analyseTopResult:function(r){var n=a(r).sort(function(r,n){return n.eigenvalue-r.eigenvalue});return o(r,n[0].vector)},transpose:h,multiply:u,clone:s,scale:c}}();"undefined"!=typeof module&&(module.exports=PCA);