UNPKG

greataptic

Version:

A simplistic neural network library.

139 lines (98 loc) 3.86 kB
/* @flow */ function _logit(x: number) { return Math.log(x / (1 - x)); } let Vector = module.exports.Vector = class Vector { data: number[]; dims: number; constructor(data: VectorLike) { if (data.data != null) data = (data: any).data; this.data = Array.from((data: any)); this.dims = this.data.length; } co(coord: number) : ?number { return this.data[coord] != null ? this.data[coord] : null; } size() : number { return Math.sqrt(this.data.reduce((a, b) => a + Math.pow(b, 2), 0)); } sum() : number { return this.data.reduce((a, b) => a + b, 0); } add(_b: VectorLike) : Vector { let b: Vector = _b.dims != null ? (_b: any) : new Vector(_b); let res: number[] = []; for (let i = 0; i < Math.min(this.dims, b.dims); i++) res[i] = this.data[i] + b.data[i]; return new Vector(res); } pow(pow: number) : Vector { return new Vector(this.data.map((x) => Math.pow(x, pow))); } sub(_b: VectorLike) : Vector { let b: Vector = _b.dims != null ? (_b: any) : new Vector(_b); let res: number[] = []; for (let i = 0; i < Math.min(this.dims, b.dims); i++) res[i] = this.data[i] - b.data[i]; return new Vector(res); } multiplyVec(_b: VectorLike) : Vector { let b: Vector = _b.dims != null ? (_b: any) : new Vector(_b); let res: number[] = []; for (let i = 0; i < Math.min(this.dims, b.dims); i++) res[i] = this.data[i] * b.data[i]; return new Vector(res); } divideVec(_b: VectorLike) : Vector { let b: Vector = _b.dims != null ? (_b: any) : new Vector(_b); let res: number[] = []; for (let i = 0; i < Math.min(this.dims, b.dims); i++) res[i] = this.data[i] / b.data[i]; return new Vector(res); } multiplyFac(b: number) : Vector { return new Vector(this.data.map((a) => a * b)); } divideFac(b: number) : Vector { return new Vector(this.data.map((a) => a / b)); } combiner(combinerFunc: (number, number) => number) : (Vector) => Vector { return function(b: Vector) { if (!b.dims) b = new Vector(b); return new Vector(this.data.map((x, i) => combinerFunc(x, b.data[i]))); }; } map(func: (number) => number) : Vector { return new Vector(this.data.map(func)); } dot(b: Vector) : number { if (this.data.length === 0 || b.dims === 0) return 0; let res = 0; for (let i = 0; i < Math.min(this.dims, b.dims); i++) res += this.data[i] * b.data[i]; return res; } static is(vec: Vector | any) { return !!(vec && vec.data && vec.dims && vec.size && vec.combiner && vec.map); }; static fill(opts: { map: ?((number, number[]) => number), length: number } | { value: ?number, length: number } | { length: number }) : Vector { if (opts.map != null) return new Vector(new Array(opts.length).fill(0).map((_, i, a) => (opts: any).map(i, a))); else return new Vector(new Array(opts.length).fill((opts: any).value != null ? (opts: any).value : 0)); }; static random(dims: number) : Vector { return new Vector(new Array(dims).fill(0).map(() => _logit(0.25 + 0.5 * Math.random()))); }; static randomOne() : number { return _logit(0.25 + 0.5 * Math.random()); }; static randomSize(dims: number, size: number) : Vector { return new Vector(new Array(dims).fill(0).map(() => (Math.random() * 2 - 1) * size)); }; static zero(dims: number) : Vector { return new Vector(new Array(dims).fill(0)); }; } type VectorLike = number[] | Vector;