class NeuralNetwork::Neuron
Constants
- LEARNING_RATE
make this a variable in the future to be configurable
Attributes
delta[RW]
incoming[RW]
input[RW]
outgoing[RW]
output[RW]
Public Class Methods
new()
click to toggle source
# File lib/neural_network/neuron.rb, line 9 def initialize @incoming = [] @outgoing = [] end
Public Instance Methods
activate(value = nil)
click to toggle source
# File lib/neural_network/neuron.rb, line 14 def activate(value = nil) return @output = 1 if bias? @input = value || incoming.reduce(0) do |sum, connection| sum + connection.source.output * connection.weight end @output = activation_function(input) end
bias?()
click to toggle source
# File lib/neural_network/neuron.rb, line 49 def bias? false end
connect(target)
click to toggle source
# File lib/neural_network/neuron.rb, line 24 def connect(target) connection = Connection.new(self, target) outgoing << connection target.incoming << connection end
input?()
click to toggle source
# File lib/neural_network/neuron.rb, line 30 def input? incoming.empty? end
train(target_output = nil)
click to toggle source
# File lib/neural_network/neuron.rb, line 34 def train(target_output = nil) if !bias? && !input? if output? # this is the derivative of the error function # not simply difference in output # http://whiteboard.ping.se/MachineLearning/BackProp @delta = @output - target_output else calculate_outgoing_delta end end update_weights end
Private Instance Methods
activation_function(input)
click to toggle source
# File lib/neural_network/neuron.rb, line 72 def activation_function(input) 1 / (1+ Math.exp(-input)) end
calculate_outgoing_delta()
click to toggle source
# File lib/neural_network/neuron.rb, line 59 def calculate_outgoing_delta @delta = @outgoing.reduce(0) do |sum, connection| sum + connection.weight * connection.target.delta end end
output?()
click to toggle source
# File lib/neural_network/neuron.rb, line 55 def output? @outgoing.empty? end
update_weights()
click to toggle source
# File lib/neural_network/neuron.rb, line 65 def update_weights @outgoing.each do |connection| gradient = output * connection.target.delta connection.weight -= gradient * LEARNING_RATE end end