novabrain
Version:
Neural network library for NodeJS and browser
1 lines • 8.86 kB
JavaScript
var Novabrain=function(t){function e(n){if(r[n])return r[n].exports;var i=r[n]={exports:{},id:n,loaded:!1};return t[n].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){"use strict";t.exports={Neuron:r(1),Layer:r(3),Network:r(4),Trainer:r(5),Transfer:r(2),Samples:r(6)}},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=function(){function t(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,r,n){return r&&t(e.prototype,r),n&&t(e,n),e}}(),a=r(2),s=function(){function t(e){n(this,t),this.bias=.4*Math.random()-.2,this.weights=[],this.changes=[],this.error=0,this.delta=0;for(var r=0;r<e;r++)this.weights.push(.4*Math.random()-.2),this.changes.push(0)}return i(t,[{key:"output",value:function(t,e){if(!Array.isArray(t))throw new Error("Inputs array expected");if(t.length!==this.weights.length)throw new Error("Inputs length "+this.weights.length+" expected");e=e||a.LOGISTIC;for(var r=this.bias,n=0,i=this.weights.length;n<i;n++)r+=this.weights[n]*t[n];return e(r)}},{key:"export",value:function(){return{bias:this.bias,weights:this.weights.slice()}}}]),t}();t.exports=s},function(t,e){"use strict";t.exports={LOGISTIC:function(t){return 1/(1+Math.exp(-t))},HARDLIMIT:function(t){return t>0?1:0},BOOLEAN:function(t){return t>0},IDENTITY:function(t){return t},TANH:function(t){var e=Math.exp(t),r=1/e;return(e-r)/(e+r)}}},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=function(){function t(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,r,n){return r&&t(e.prototype,r),n&&t(e,n),e}}(),a=r(1),s=function(){function t(e,r){n(this,t),this.neurons=[];for(var i=0;i<e;i++)this.neurons.push(new a(r))}return i(t,[{key:"output",value:function(t,e){for(var r=[],n=0;n<this.neurons.length;n++)r.push(this.neurons[n].output(t,e));return r}},{key:"export",value:function(){for(var t=[],e=0;e<this.neurons.length;e++)t.push(this.neurons[e].export());return t}}]),t}();t.exports=s},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=function(){function t(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,r,n){return r&&t(e.prototype,r),n&&t(e,n),e}}(),a=r(3),s=r(2),o=function(){function t(){n(this,t),this.layers=[];var e=Array.prototype.slice.call(arguments);if(e<2)throw new Error("Network expected 2 integers or more");2===e.length&&e.splice(1,0,Math.max(3,Math.floor(e[0]/2))),this.layers.push(new a(e[0],1));for(var r=1;r<e.length;r++)this.layers.push(new a(e[r],this.layers[r-1].neurons.length));this.transfer=s.LOGISTIC}return i(t,[{key:"output",value:function(t,e){for(var r=[],n=1;n<this.layers.length;n++)r=t=this.layers[n].output(t,e||this.transfer);return r}},{key:"export",value:function(){for(var t=[],e=0;e<this.layers.length;e++)t.push(this.layers[e].export());return t}},{key:"import",value:function(e){if(e instanceof t&&(e=e.export()),e.length!==this.layers.length)throw new Error("Network expected ["+this.layers.length+"] layers");for(var r=0;r<this.layers.length;r++){var n=this.layers[r].neurons;if(e[r].length!==n.length)throw new Error("Layer ["+r+"] expected ["+n.length+"] neurons");for(var i=0;i<n.length;i++){var a=n[i];if(void 0===e[r][i].bias)throw new Error("Neuron ["+i+"] expected a [bias] value");if(a.bias=e[r][i].bias,!Array.isArray(e[r][i].weights))throw new Error("Neuron ["+i+"] expected a [weights] array of ["+a.weights.length+"] values");for(var s=0;s<a.weights.length;s++)a.weights[s]=e[r][i].weights[s]}}return this}},{key:"standalone",value:function(t){t=s.LOGISTIC.toString();var e=JSON.stringify(this.export()),r="";return r+="transfer = transfer || "+t+";",r+="var layers = "+e+";",r+="for (var i = 1; i < layers.length; i++) {",r+="var layer = layers[i];",r+="var outputs = [];",r+="for (var j = 0; j < layer.length; j++) {",r+="var neuron = layer[j];",r+="var result = neuron.bias;",r+="for (var k = 0; k < neuron.weights.length; k++) {",r+="result += neuron.weights[k] * inputs[k];",r+="}",r+="outputs[j] = transfer(result);",r+="}",r+="inputs = outputs;",r+="}",r+="return outputs;",new Function("inputs","transfer",r)}}]),t}();t.exports=o},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=function(){function t(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,r,n){return r&&t(e.prototype,r),n&&t(e,n),e}}(),a=r(4),s=function(){function t(e){if(n(this,t),!(e instanceof a))throw new Error("Network instance expected");this.network=e,this.inputSize=e.layers[0].neurons.length,this.outputSize=e.layers[e.layers.length-1].neurons.length,this.nbLayers=this.network.layers.length,this.lastLayerId=this.nbLayers-1}return i(t,[{key:"train",value:function(t,e){if(e=e||{},e.iterations=e.iterations||2e4,e.learning=e.learning||.3,e.momentum=e.momentum||.1,e.treshold=e.treshold||.005,e.callback=e.callback||null,e.interval=e.interval||10,!Array.isArray(t[0].input)||t[0].input.length!==this.inputSize)throw new Error("Train expected an input data array of "+this.inputSize);if(!Array.isArray(t[0].output)||t[0].output.length!==this.outputSize)throw new Error("Train expected an output data array of "+this.outputSize);for(var r=(new Date).getTime(),n={error:10,iterations:0,time:0},i=0;i<e.iterations&&n.error>e.treshold;i++){for(var a=0,s=0;s<t.length;s++)a+=this.trainPattern(t[s].input,t[s].output,e.learning,e.momentum);n.error=a/t.length,e.callback&&i%e.interval==0&&e.callback(n),n.iterations++,n.time=(new Date).getTime()-r}return n}},{key:"trainPattern",value:function(t,e,r,n){r=r||.3,n=n||.1;for(var i=this.getOutputs(t),a=this.lastLayerId;a>=0;a--)for(var s=this.network.layers[a].neurons,o=0;o<s.length;o++){var u=i[a][o],h=0;if(a===this.lastLayerId)h=e[o]-u;else for(var l=this.network.layers[a+1].neurons,f=0;f<l.length;f++)h+=l[f].delta*l[f].weights[o];s[o].error=h,s[o].delta=h*u*(1-u)}for(var a=1;a<this.nbLayers;a++)for(var p=i[a-1],s=this.network.layers[a].neurons,o=0;o<s.length;o++){for(var c=s[o],g=c.delta,f=0;f<p.length;f++){var w=c.changes[f];w=r*g*p[f]+n*w,c.weights[f]+=w,c.changes[f]=w}c.bias+=r*g}for(var y=[],s=this.network.layers[this.lastLayerId].neurons,v=0;v<s.length;v++)y.push(s[v].error);return this.getErrorSum(y)}},{key:"getOutputs",value:function(t){for(var e=[],r=e[0]=t.slice(),n=this.network.layers,i=1;i<n.length;i++)r=e[i]=n[i].output(r);return e}},{key:"getErrorSum",value:function(t){for(var e=0,r=0;r<t.length;r++)e+=Math.pow(t[r],2);return e/t.length}}]),t}();t.exports=s},function(t,e){"use strict";t.exports={XOR:{training:[{input:[0,0],output:[0]},{input:[0,1],output:[1]},{input:[1,0],output:[1]},{input:[1,1],output:[0]}],config:[[{bias:.1804561257362366,weights:[-.167204974219203]},{bias:-.04569602627307176,weights:[.18746992871165274]}],[{bias:4.594158542478944,weights:[-3.040062330305626,-3.362846210091373]},{bias:2.253482826600183,weights:[-5.98762513515333,-5.965287921412066]},{bias:2.2578395038508865,weights:[-2.0587523788017017,-1.562316369066697]}],[{bias:-3.8152869540660492,weights:[5.941256505289369,-8.507284881253804,3.1455340193310843]}]]},AND:{training:[{input:[0,0],output:[0]},{input:[0,1],output:[0]},{input:[1,0],output:[0]},{input:[1,1],output:[1]}],config:[[{bias:.05568741559982299,weights:[-.07880215616896749]},{bias:.11339050624519587,weights:[-.08192619075998664]}],[{bias:1.2162003373115722,weights:[-1.5325596790646399,-1.6694862833366626]},{bias:3.5218949042093537,weights:[-2.9473826605615274,-2.6480166644816325]},{bias:1.2894144846904376,weights:[-1.3971381146583233,-1.8841189975945027]}],[{bias:3.4025251093426854,weights:[-2.7717050850924494,-5.672159962134176,-2.836860716358213]}]]},OR:{training:[{input:[0,0],output:[0]},{input:[0,1],output:[1]},{input:[1,0],output:[1]},{input:[1,1],output:[1]}],config:[[{bias:.023853175062686194,weights:[-.05087699200958015]},{bias:-.04783560279756785,weights:[-.12696466147899627]}],[{bias:.7767897854256859,weights:[-1.7520145026333327,-1.7771349756367834]},{bias:-.47207093390546423,weights:[1.0731066688291095,1.040178424526655]},{bias:-1.5422804887749049,weights:[3.1529762364879015,3.1483531621536285]}],[{bias:-1.2640437852289894,weights:[-3.1821062179619575,1.162433847357973,4.845167062525612]}]]}}}]);