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 +15 -0
- data/lib/rbutils/neuralnet/neuralnetwork.rb +135 -0
- data/lib/rbutils.rb +25 -0
- metadata +44 -0
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: []
|