Class: Neural::Perceptron

Inherits:
Object
  • Object
show all
Defined in:
lib/Algorithmically/Neural/perceptron.rb

Instance Method Summary collapse

Constructor Details

#initialize(or_problem, inputs, iterations, learning_rate) ⇒ Perceptron

Returns a new instance of Perceptron.



5
6
7
# File 'lib/Algorithmically/Neural/perceptron.rb', line 5

def initialize(or_problem, inputs, iterations, learning_rate)
  execute(or_problem, inputs, iterations, learning_rate)
end

Instance Method Details

#activate(weights, vector) ⇒ Object



27
28
29
30
31
32
33
# File 'lib/Algorithmically/Neural/perceptron.rb', line 27

def activate(weights, vector)
  sum = weights[weights.size-1] * 1.0
  vector.each_with_index do |input, i|
    sum += weights[i] * input
  end
  sum
end

#execute(domain, num_inputs, iterations, learning_rate) ⇒ Object



69
70
71
72
73
74
# File 'lib/Algorithmically/Neural/perceptron.rb', line 69

def execute(domain, num_inputs, iterations, learning_rate)
  weights = initialize_weights(num_inputs)
  train_weights(weights, domain, num_inputs, iterations, learning_rate)
  test_weights(weights, domain, num_inputs)
  weights
end

#get_output(weights, vector) ⇒ Object



39
40
41
42
# File 'lib/Algorithmically/Neural/perceptron.rb', line 39

def get_output(weights, vector)
  activation = activate(weights, vector)
  transfer(activation)
end

#initialize_weights(problem_size) ⇒ Object



15
16
17
18
# File 'lib/Algorithmically/Neural/perceptron.rb', line 15

def initialize_weights(problem_size)
  minmax = Array.new(problem_size + 1) { [-1.0, 1.0] }
  random_vector(minmax)
end

#random_vector(minmax) ⇒ Object



9
10
11
12
13
# File 'lib/Algorithmically/Neural/perceptron.rb', line 9

def random_vector(minmax)
  Array.new(minmax.size) do |i|
    minmax[i][0] + ((minmax[i][1] - minmax[i][0]) * rand())
  end
end

#test_weights(weights, domain, num_inputs) ⇒ Object



58
59
60
61
62
63
64
65
66
67
# File 'lib/Algorithmically/Neural/perceptron.rb', line 58

def test_weights(weights, domain, num_inputs)
  correct = 0
  domain.each do |pattern|
    input_vector = Array.new(num_inputs) { |k| pattern[k].to_f }
    output = get_output(weights, input_vector)
    correct += 1 if output.round == pattern.last
  end
  puts "Finished test with a score of #{correct}/#{domain.size}"
  correct
end

#train_weights(weights, domain, num_inputs, iterations, lrate) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/Algorithmically/Neural/perceptron.rb', line 44

def train_weights(weights, domain, num_inputs, iterations, lrate)
  iterations.times do |epoch|
    error = 0.0
    domain.each do |pattern|
      input = Array.new(num_inputs) { |k| pattern[k].to_f }
      output = get_output(weights, input)
      expected = pattern.last.to_f
      error += (output - expected).abs
      update_weights(num_inputs, weights, input, expected, output, lrate)
    end
    puts "> epoch=#{epoch}, error=#{error}"
  end
end

#transfer(activation) ⇒ Object



35
36
37
# File 'lib/Algorithmically/Neural/perceptron.rb', line 35

def transfer(activation)
  (activation >= 0) ? 1.0 : 0.0
end

#update_weights(num_inputs, weights, input, out_exp, out_act, l_rate) ⇒ Object



20
21
22
23
24
25
# File 'lib/Algorithmically/Neural/perceptron.rb', line 20

def update_weights(num_inputs, weights, input, out_exp, out_act, l_rate)
  num_inputs.times do |i|
    weights[i] += l_rate * (out_exp - out_act) * input[i]
  end
  weights[num_inputs] += l_rate * (out_exp - out_act) * 1.0
end