Source: networks/stochastic.js

var _ = require('underscore');
var Network = require('./interface');
var util = require('util');

/**
Network that samples training data
into mini batches, in order to learn
more quickly with less processing
without sacrificing significant accuracy.

@class
@implements Network
*/
function StochasticNetwork () {
  return Network.apply(this, arguments);
}

util.inherits(StochasticNetwork, Network);

/*
Stochastic training function.
Breaks training data into small batches 
and learns from them one batch at a time.

@function
@param {array} training_data - [input, output] pairs used to guide learning.
@param {number} epochs - Number of rounds to train against the data.
@param {number} learning_rate - Small, positive number (ex: 0.3) indicating the rate of learning.
@param {number} batch_size - Size of batches of training data to train against at a time.
**/
StochasticNetwork.prototype.train = function (training_data, epochs, learning_rate, batch_size) {
  epochs = epochs || 300;
  learning_rate = learning_rate || 0.3;
  batch_size = batch_size || 10;

  for (var i = 0; i < epochs; i++) {
    var batch = _.sample(training_data, batch_size);
    for (var j = 0; j < batch.length; j++) {
      var data = batch[j];
      this._backpropogate(data[0], data[1], learning_rate);
    }
  }
};

module.exports = StochasticNetwork;