rbutils 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MGQ3MTJkMWRhZjU4MmE5MTAwOGRmZGQyMWNiNzJlY2RkMmIwMDZiMQ==
5
+ data.tar.gz: !binary |-
6
+ NzFlZDVhMDRiNDg0MDJkNGI0MTM2MDM0Y2M4YmU3YzliZTdlMjZjNg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ NzY2OWYzZjY5NTEyM2VmY2QzNjJiYmZiYjBmMzg2ZWE5N2RmOTUyNzhhYmFh
10
+ YTgzZWQ2ZjlhNDE3MWM0YzgyNzQ5ZDI5NDY2NTMyYTVhZDUyMjI3ZTk2ZTU2
11
+ YTEyN2JkZTZlN2MyZGYzZGM5YzU4MzUxOGM5NDkxNDVjN2UxNzI=
12
+ data.tar.gz: !binary |-
13
+ NzQ3ZDY5OWRmNzQ3M2U3ZmM3MmI2YWUyZTIwNjJlNzBhNjQ0Nzk0ODI2NjJi
14
+ NDdlMDc5NGZkNTQ1ZjczM2YyM2ExM2IzYWZhZGY1OTNjNzk5OTdkMDJlYzli
15
+ NzU0ZTg4ZTMyY2I3NzUzYzE0OWJhZDJiYjViYTU5OGRkNzM5NTk=
@@ -0,0 +1,135 @@
1
+ class neuralnetwork
2
+
3
+ attr_accessor :inputs,
4
+ :n_inputs,
5
+ :n_hidden,
6
+
7
+ :input_weights,
8
+ :hidden_weights,
9
+
10
+ :hidden_nodes,
11
+ :output_nodes,
12
+
13
+ :output_gradients,
14
+ :hidden_gradients,
15
+
16
+ :input_wdt,
17
+ :hidden_wdt
18
+
19
+ def initialize(settings)
20
+ # num inputs, hidden nodes, output nodes
21
+
22
+ self.n_inputs = settings[:inputs]
23
+ self.inputs = Array.new(n_inputs+1)
24
+ self.inputs[-1] = -1
25
+
26
+ self.n_hidden = settings[:hidden_nodes]
27
+ self.output_nodes = Array.new(settings[:output_nodes])
28
+ self.hidden_nodes = Array.new(n_hidden+1)
29
+
30
+ initialize_weights
31
+ end
32
+
33
+ def initialize_weights
34
+ self.input_weights = Array.new(hidden_nodes.size){Array.new(n_inputs+1)}
35
+ self.hidden_weights = Array.new(output_nodes.size){Array.new(n_hidden+1)}
36
+
37
+ randomize(input_weights)
38
+ randomize(hidden_weights)
39
+
40
+ self.input_wdt = Array.new(hidden_nodes.size){Array.new(n_inputs+1){0}}
41
+ self.hidden_wdt = Array.new(output_nodes.size){Array.new(n_hidden+1){0}}
42
+ end
43
+
44
+ def node_values(inputs)
45
+ inputs.each_index do |i|
46
+ self.inputs[i] = inputs[i]
47
+ end
48
+ set_nodes(self.inputs, input_weights, hidden_nodes)
49
+ set_nodes(hidden_nodes, hidden_weights, output_nodes)
50
+ end
51
+
52
+ def set_nodes(values, matrix, nodes)
53
+ (0...matrix.size).each do |i|
54
+ nodes[i] = sigmoid(values.zip(matrix[i]).map{|v,w| v*w}.reduce(:+))
55
+ end
56
+ end
57
+
58
+ def predict(inputs)
59
+ node_values(inputs)
60
+ output_nodes.size == 1 ? output_nodes[0] : output_nodes
61
+ end
62
+
63
+ def train(inputs, desired, rate, momentum)
64
+ node_values(inputs)
65
+ backpropogate(desired, rate, momentum)
66
+ end
67
+
68
+ def backpropogate(desired, rate, momentum)
69
+ output_gradients = output_error(desired)
70
+ hidden_gradients = hidden_error(output_gradients)
71
+ update(inputs, desired, hidden_gradients, output_gradients, rate, momentum)
72
+ end
73
+
74
+ def output_error(desired)
75
+ desired.zip(output_nodes).map{|desired, result| (desired - result) * dsigmoid(result)}
76
+ end
77
+
78
+ def hidden_error(output_gradients)
79
+ inverse = Array.new(hidden_nodes.size){Array.new(output_nodes.size)}
80
+ hidden_weights.each_index do |i|
81
+ hidden_weights[i].each_index do |j|
82
+ inverse[j][i] = hidden_weights[i][j];
83
+ end
84
+ end
85
+
86
+ hidden_nodes.each_with_index.map do |node, i|
87
+ dsigmoid(hidden_nodes[i]) * output_gradients.zip(inverse[i]).map{|error, weight| error*weight}.reduce(:+)
88
+ end
89
+ end
90
+
91
+ def update(inputs, desired, hidden_gradients, output_gradients, rate, momentum)
92
+ update_weights(hidden_nodes,
93
+ inputs,
94
+ input_weights,
95
+ hidden_gradients,
96
+ rate,
97
+ input_wdt,
98
+ momentum
99
+ )
100
+ update_weights(output_nodes,
101
+ hidden_nodes,
102
+ hidden_weights,
103
+ output_gradients,
104
+ rate,
105
+ hidden_wdt,
106
+ momentum
107
+ )
108
+ end
109
+
110
+ def update_weights(nodes, values, inp, gradients, rate, deltas, momentum)
111
+ inp.each_index do |i|
112
+ inp[i].each_index do |j|
113
+ dt = rate * gradients[i] * values[j]
114
+ inp[i][j] += dt + momentum * deltas[i][j]
115
+ deltas[i][j] = dt
116
+ end
117
+ end
118
+ end
119
+
120
+ def sigmoid(x)
121
+ 1.0 / (1 + Math::E**-x)
122
+ end
123
+
124
+ def dsigmoid(x)
125
+ sigmoid(x) * (1 - sigmoid(x))
126
+ end
127
+
128
+ def randomize(arr)
129
+ (0...arr.size).each do |i|
130
+ (0...arr[i].size).each do |j|
131
+ arr[i][j] = (rand(100)).to_f / 100
132
+ end
133
+ end
134
+ end
135
+ end
data/lib/rbutils.rb ADDED
@@ -0,0 +1,25 @@
1
+ #this needs to be changed to conform to gemspec standards
2
+ # it needs to allow for user interface with the different classes provided.
3
+ class RUtils
4
+ def test_neuralnet()
5
+ learning_rate = 10 #|rate|
6
+ momentum_rate = 1 #|momentum|
7
+
8
+ neural_net = NeuralNetwork.new(:inputs => 2, :hidden_nodes => 10, :output_nodes => 1)
9
+
10
+ 10000.times do |i|
11
+ neural_net.train([0, 0], [0], learning_rate, momentum_rate)
12
+ neural_net.train([0, 1], [0], learning_rate, momentum_rate)
13
+ neural_net.train([1, 0], [0], learning_rate, momentum_rate)
14
+ neural_net.train([1, 1], [1], learning_rate, momentum_rate)
15
+ end
16
+
17
+ puts "[0, 0] -> " + neural_net.predict([0, 0]).to_s
18
+ puts "[1, 0] -> " + neural_net.predict([1, 0]).to_s
19
+ puts "[0, 1] -> " + neural_net.predict([0, 1]).to_s
20
+ puts "[1, 1] -> " + neural_net.predict([1, 1]).to_s
21
+ puts "done."
22
+ end
23
+ end
24
+
25
+ require 'rutils/neuralnet/neuralnetwork'
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rbutils
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - manan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-19 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: ! 'Utilities for enhanced functionality. '
14
+ email: manan.shah.777@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/rbutils.rb
20
+ - lib/rbutils/neuralnet/neuralnetwork.rb
21
+ homepage:
22
+ licenses: []
23
+ metadata: {}
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ required_rubygems_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ requirements: []
39
+ rubyforge_project:
40
+ rubygems_version: 2.3.0
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: Utilities for Ruby.
44
+ test_files: []