UNPKG

uapca

Version:

Uncertainty-aware principal component analysis.

3 lines (2 loc) 3.8 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var d3=require("d3-random"),mlMatrix=require("ml-matrix"),d3$1=require("d3-array");class MultivariateNormal{constructor(t,r){this.meanVec=t instanceof mlMatrix.Matrix?t:mlMatrix.Matrix.rowVector(t),this.covMat=r instanceof mlMatrix.Matrix?r:new mlMatrix.Matrix(r)}static standard(t){return new MultivariateNormal(mlMatrix.Matrix.zeros(1,t),mlMatrix.Matrix.eye(t,t))}mean(){return this.meanVec}covariance(){return this.covMat}affineTransformation(t,r){const a=this.meanVec.mmul(t).add(r),e=t.transpose().mmul(this.covMat).mmul(t);return new MultivariateNormal(a,e)}project(t){return this.affineTransformation(t,mlMatrix.Matrix.zeros(1,t.columns))}}class RandomStdNormal{constructor(){this.random=d3.randomNormal()}}function transformationMatrix(t){const r=new mlMatrix.EigenvalueDecomposition(t.covariance(),{assumeSymmetric:!0}),a=r.eigenvectorMatrix.transpose();return mlMatrix.Matrix.diag(r.realEigenvalues.map(t=>Math.sqrt(t))).mmul(a)}class Sampler{constructor(t){this.mean=t.mean(),this.A=transformationMatrix(t),this.gen=new RandomStdNormal}sampleN(t){return mlMatrix.Matrix.random(t,this.dims(),this.gen).mmul(this.A).addRowVector(this.mean).to2DArray()}dims(){return this.mean.columns}}function outerProduct(t){return t.transpose().mmul(t)}function arithmeticMean(t){const r=t[0].rows,a=t[0].columns,e=t.length;return t.reduce((t,r)=>t.add(r),mlMatrix.Matrix.zeros(r,a)).div(e)}class UaPCA{constructor(t,r,a){this.lengths=t,this.vectors=r,this.mean=a}static fit(t,r=1){const a=arithmeticMean(t.map(t=>t.mean())),e=outerProduct(a),i=arithmeticMean(t.map(t=>outerProduct(t.mean()).add(mlMatrix.Matrix.mul(t.covariance(),r*r)).sub(e))),s=new mlMatrix.EigenvalueDecomposition(i,{assumeSymmetric:!0}),o=s.realEigenvalues,n=s.eigenvectorMatrix.transpose().to2DArray(),m=o.map((t,r)=>[t,n[r]]).sort((t,r)=>r[0]-t[0]);return new UaPCA(m.map(t=>t[0]),new mlMatrix.Matrix(m.map(t=>t[1])),a)}aligned(){const t=this.vectors;for(let r=0;r<t.rows;++r)t.get(r,r)<0&&t.setRow(r,t.getRowVector(r).mul(-1));return new UaPCA(this.lengths,t,this.mean)}eigenvalues(t){return t?this.lengths.slice(0,t):this.lengths}projectionMatrix(t){return t?new mlMatrix.MatrixSubView(this.vectors,0,t-1,0,this.vectors.columns-1):this.vectors}transform(t,r){const a=this.projectionMatrix(r);return t.map(t=>t.affineTransformation(mlMatrix.Matrix.eye(this.mean.columns,this.mean.columns),mlMatrix.Matrix.mul(this.mean,-1))).map(t=>t.project(a.transpose()))}}class Trace{constructor(t){this.samples=t}points(){return this.samples.to2DArray()}pointsFlipped(){return this.samples.mul(-1).to2DArray()}}class FactorTraces{constructor(t,r,a,e,i){this.N=r||100,this.min=a||0,this.max=e||1e3,this.components=i||2;const s=Math.pow(this.min,2),o=(Math.pow(this.max,2)-s)/this.N,n=d3$1.range(this.N).map(t=>Math.sqrt(s+t*o)).map(r=>UaPCA.fit(t,r).aligned()),m=t[0].mean().columns;this.traceSamples=n.map(t=>{const r=t.projectionMatrix(this.components).transpose();return mlMatrix.Matrix.eye(m,m).mmul(r)})}getTrace(t){const r=this.traceSamples[0],a=mlMatrix.Matrix.zeros(this.N,this.components);a.setRow(0,r.getRowVector(t));for(let r=1;r<this.traceSamples.length;++r){const e=this.traceSamples[r],i=e.getRowVector(t),s=e.getRowVector(t).mul(-1),o=mlMatrix.Matrix.sub(i,a.getRowVector(r-1)),n=mlMatrix.Matrix.sub(s,a.getRowVector(r-1));o.dot(o)<n.dot(n)?a.setRow(r,i):a.setRow(r,s)}return new Trace(a)}}Object.defineProperty(exports,"Matrix",{enumerable:!0,get:function(){return mlMatrix.Matrix}}),exports.FactorTraces=FactorTraces,exports.MultivariateNormal=MultivariateNormal,exports.Sampler=Sampler,exports.Trace=Trace,exports.UaPCA=UaPCA,exports.arithmeticMean=arithmeticMean,exports.transformationMatrix=transformationMatrix; //# sourceMappingURL=uapca.node.js.map