ai4r 1.2 → 1.3
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.
- data/README.rdoc +12 -25
- data/examples/decision_trees/id3_example.rb +6 -9
- data/examples/decision_trees/results.txt +2 -0
- data/examples/genetic_algorithm/genetic_algorithm_example.rb +11 -13
- data/examples/neural_network/xor_example.rb +25 -0
- data/lib/ai4r.rb +10 -0
- data/lib/ai4r/classifiers/classifier.rb +46 -0
- data/lib/ai4r/classifiers/id3.rb +27 -58
- data/lib/ai4r/classifiers/one_r.rb +19 -58
- data/lib/ai4r/classifiers/prism.rb +21 -57
- data/lib/ai4r/classifiers/zero_r.rb +16 -48
- data/lib/ai4r/clusterers/bisecting_k_means.rb +115 -0
- data/lib/ai4r/clusterers/clusterer.rb +55 -0
- data/lib/ai4r/clusterers/k_means.rb +164 -0
- data/lib/ai4r/data/data_set.rb +250 -0
- data/lib/ai4r/genetic_algorithm/genetic_algorithm.rb +19 -19
- data/lib/ai4r/neural_network/backpropagation.rb +23 -24
- data/site/build/site/en/broken-links.xml +2 -0
- data/site/build/site/en/downloads.html +200 -0
- data/site/build/site/en/downloads.pdf +151 -0
- data/site/build/site/en/forum.html +197 -0
- data/site/build/site/en/forum.pdf +151 -0
- data/site/build/site/en/geneticAlgorithms.html +591 -0
- data/site/build/site/en/geneticAlgorithms.pdf +934 -0
- data/site/build/site/en/images/ai4r-logo.png +0 -0
- data/site/build/site/en/images/built-with-forrest-button.png +0 -0
- data/site/build/site/en/images/c.png +0 -0
- data/site/build/site/en/images/c_wbn.png +0 -0
- data/site/build/site/en/images/c_wn.png +0 -0
- data/site/build/site/en/images/ero.gif +0 -0
- data/site/build/site/en/images/europe2.png +0 -0
- data/site/build/site/en/images/europe3.png +0 -0
- data/site/build/site/en/images/fitness.png +0 -0
- data/site/build/site/en/images/genetic_algorithms_example.png +0 -0
- data/site/build/site/en/images/instruction_arrow.png +0 -0
- data/site/build/site/en/images/jadeferret.png +0 -0
- data/site/build/site/en/images/my_email.png +0 -0
- data/site/build/site/en/images/neural_network_example.png +0 -0
- data/site/build/site/en/images/rubyforge.png +0 -0
- data/site/build/site/en/images/s.png +0 -0
- data/site/build/site/en/images/s_wbn.png +0 -0
- data/site/build/site/en/images/s_wn.png +0 -0
- data/site/build/site/en/images/sigmoid.png +0 -0
- data/site/build/site/en/images/t.png +0 -0
- data/site/build/site/en/images/t_wbn.png +0 -0
- data/site/build/site/en/images/t_wn.png +0 -0
- data/site/build/site/en/index.html +336 -0
- data/site/build/site/en/index.pdf +508 -0
- data/site/build/site/en/linkmap.html +263 -0
- data/site/build/site/en/linkmap.pdf +94 -0
- data/site/build/site/en/locationmap.xml +72 -0
- data/site/build/site/en/machineLearning.html +339 -0
- data/site/build/site/en/machineLearning.pdf +337 -0
- data/site/build/site/en/neuralNetworks.html +484 -0
- data/site/build/site/en/neuralNetworks.pdf +604 -0
- data/site/build/site/en/skin/CommonMessages_de.xml +23 -0
- data/site/build/site/en/skin/CommonMessages_en_US.xml +23 -0
- data/site/build/site/en/skin/CommonMessages_es.xml +23 -0
- data/site/build/site/en/skin/CommonMessages_fr.xml +23 -0
- data/site/build/site/en/skin/basic.css +166 -0
- data/site/build/site/en/skin/breadcrumbs-optimized.js +90 -0
- data/site/build/site/en/skin/breadcrumbs.js +237 -0
- data/site/build/site/en/skin/fontsize.js +166 -0
- data/site/build/site/en/skin/getBlank.js +40 -0
- data/site/build/site/en/skin/getMenu.js +45 -0
- data/site/build/site/en/skin/images/README.txt +1 -0
- data/site/build/site/en/skin/images/add.jpg +0 -0
- data/site/build/site/en/skin/images/built-with-forrest-button.png +0 -0
- data/site/build/site/en/skin/images/chapter.gif +0 -0
- data/site/build/site/en/skin/images/chapter_open.gif +0 -0
- data/site/build/site/en/skin/images/current.gif +0 -0
- data/site/build/site/en/skin/images/error.png +0 -0
- data/site/build/site/en/skin/images/external-link.gif +0 -0
- data/site/build/site/en/skin/images/fix.jpg +0 -0
- data/site/build/site/en/skin/images/forrest-credit-logo.png +0 -0
- data/site/build/site/en/skin/images/hack.jpg +0 -0
- data/site/build/site/en/skin/images/header_white_line.gif +0 -0
- data/site/build/site/en/skin/images/info.png +0 -0
- data/site/build/site/en/skin/images/instruction_arrow.png +0 -0
- data/site/build/site/en/skin/images/label.gif +0 -0
- data/site/build/site/en/skin/images/page.gif +0 -0
- data/site/build/site/en/skin/images/pdfdoc.gif +0 -0
- data/site/build/site/en/skin/images/poddoc.png +0 -0
- data/site/build/site/en/skin/images/printer.gif +0 -0
- data/site/build/site/en/skin/images/rc-b-l-15-1body-2menu-3menu.png +0 -0
- data/site/build/site/en/skin/images/rc-b-r-15-1body-2menu-3menu.png +0 -0
- data/site/build/site/en/skin/images/rc-b-r-5-1header-2tab-selected-3tab-selected.png +0 -0
- data/site/build/site/en/skin/images/rc-t-l-5-1header-2searchbox-3searchbox.png +0 -0
- data/site/build/site/en/skin/images/rc-t-l-5-1header-2tab-selected-3tab-selected.png +0 -0
- data/site/build/site/en/skin/images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png +0 -0
- data/site/build/site/en/skin/images/rc-t-r-15-1body-2menu-3menu.png +0 -0
- data/site/build/site/en/skin/images/rc-t-r-5-1header-2searchbox-3searchbox.png +0 -0
- data/site/build/site/en/skin/images/rc-t-r-5-1header-2tab-selected-3tab-selected.png +0 -0
- data/site/build/site/en/skin/images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png +0 -0
- data/site/build/site/en/skin/images/remove.jpg +0 -0
- data/site/build/site/en/skin/images/rss.png +0 -0
- data/site/build/site/en/skin/images/spacer.gif +0 -0
- data/site/build/site/en/skin/images/success.png +0 -0
- data/site/build/site/en/skin/images/txtdoc.png +0 -0
- data/site/build/site/en/skin/images/update.jpg +0 -0
- data/site/build/site/en/skin/images/valid-html401.png +0 -0
- data/site/build/site/en/skin/images/vcss.png +0 -0
- data/site/build/site/en/skin/images/warning.png +0 -0
- data/site/build/site/en/skin/images/xmldoc.gif +0 -0
- data/site/build/site/en/skin/menu.js +48 -0
- data/site/build/site/en/skin/note.txt +50 -0
- data/site/build/site/en/skin/print.css +54 -0
- data/site/build/site/en/skin/profile.css +163 -0
- data/site/build/site/en/skin/prototype.js +1257 -0
- data/site/build/site/en/skin/screen.css +587 -0
- data/site/build/site/en/svn.html +252 -0
- data/site/build/site/en/svn.pdf +306 -0
- data/site/build/site/en/wholesite.pdf +1915 -0
- data/site/build/tmp/brokenlinks.xml +2 -0
- data/site/build/tmp/cocoon-work/cache-dir/cocoon-ehcache-1.data +0 -0
- data/site/build/tmp/cocoon-work/cache-dir/cocoon-ehcache-1.index +0 -0
- data/site/build/tmp/locationmap.xml +14 -14
- data/site/build/tmp/output.xmap +23 -23
- data/site/build/tmp/pluginlist2fetchbuild.xml +144 -144
- data/site/build/tmp/projfilters.properties +41 -41
- data/site/build/webapp/WEB-INF/logs/core.log +593 -679
- data/site/build/webapp/WEB-INF/logs/error.log +362 -279
- data/site/build/webapp/WEB-INF/logs/sitemap.log +368 -1015
- data/site/src/documentation/content/xdocs/index.xml +18 -10
- data/site/src/documentation/content/xdocs/machineLearning.xml +4 -3
- data/site/src/documentation/content/xdocs/site.xml +2 -1
- data/site/src/documentation/resources/images/sigmoid.png +0 -0
- data/test/classifiers/id3_test.rb +45 -44
- data/test/classifiers/one_r_test.rb +19 -17
- data/test/classifiers/prism_test.rb +22 -20
- data/test/classifiers/zero_r_test.rb +15 -12
- data/test/clusterers/bisecting_k_means_test.rb +59 -0
- data/test/clusterers/k_means_test.rb +93 -0
- data/test/data/data_set_test.rb +92 -0
- metadata +252 -128
- data/lib/ai4r/classifiers/classifier_helper.rb +0 -54
- data/site/src/documentation/content/xdocs/forum.html +0 -9
- data/site/src/documentation/resources/images/Thumbs.db +0 -0
- data/site/src/documentation/resources/images/sub-dir/Thumbs.db +0 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# Author:: Sergio Fierens
|
|
2
|
+
# License:: MPL 1.1
|
|
3
|
+
# Project:: ai4r
|
|
4
|
+
# Url:: http://ai4r.rubyforge.org/
|
|
5
|
+
#
|
|
6
|
+
# You can redistribute it and/or modify it under the terms of
|
|
7
|
+
# the Mozilla Public License version 1.1 as published by the
|
|
8
|
+
# Mozilla Foundation at http://www.mozilla.org/MPL/MPL-1.1.txt
|
|
9
|
+
|
|
10
|
+
require 'csv'
|
|
11
|
+
require 'set'
|
|
12
|
+
|
|
13
|
+
module Ai4r
|
|
14
|
+
module Data
|
|
15
|
+
class DataSet
|
|
16
|
+
|
|
17
|
+
attr_reader :data_labels, :data_items
|
|
18
|
+
|
|
19
|
+
# Create a new DataSet. By default, empty.
|
|
20
|
+
# Optionaly, you can provide the initial data items and data labels.
|
|
21
|
+
#
|
|
22
|
+
# e.g. DataSet.new(:data_items => data_items, :data_labels => labels)
|
|
23
|
+
#
|
|
24
|
+
# If you provide data items, but no data labels, the data set will
|
|
25
|
+
# use the default data label values (see set_data_labels)
|
|
26
|
+
def initialize(options = {})
|
|
27
|
+
@data_labels = options[:data_labels] || []
|
|
28
|
+
@data_items = options[:data_items] || []
|
|
29
|
+
set_data_labels(options[:data_labels]) if options[:data_labels]
|
|
30
|
+
set_data_items(options[:data_items]) if options[:data_items]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Retrieve data item(s) by index. You can specify a an index range, too.
|
|
34
|
+
def [](index)
|
|
35
|
+
return @data_items[index]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Load data items from csv file
|
|
39
|
+
def load_data_from_csv(filepath)
|
|
40
|
+
items = []
|
|
41
|
+
CSV::Reader.parse(File.open(filepath, 'r')) do |row|
|
|
42
|
+
items << row
|
|
43
|
+
end
|
|
44
|
+
set_data_items(items)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Load data items from csv file. The first row is used as data labels.
|
|
48
|
+
def load_data_and_labels_from_csv(filepath)
|
|
49
|
+
load_data_from_csv(filepath)
|
|
50
|
+
@data_labels = @data_items.shift
|
|
51
|
+
return self
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Set data labels.
|
|
55
|
+
# Data labels must have the following format:
|
|
56
|
+
# [ 'city', 'age_range', 'gender', 'marketing_target' ]
|
|
57
|
+
#
|
|
58
|
+
# If you do not provide labels for you data, the following labels will
|
|
59
|
+
# be created by default:
|
|
60
|
+
# [ 'attribute_1', 'attribute_2', 'attribute_3', 'class_value' ]
|
|
61
|
+
def set_data_labels(labels)
|
|
62
|
+
check_data_labels(labels)
|
|
63
|
+
@data_labels = labels
|
|
64
|
+
return self
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Set the data items.
|
|
68
|
+
# M data items with N attributes must have the following
|
|
69
|
+
# format:
|
|
70
|
+
#
|
|
71
|
+
# [ [ATT1_VAL1, ATT2_VAL1, ATT3_VAL1, ... , ATTN_VAL1, CLASS_VAL1],
|
|
72
|
+
# [ATT1_VAL2, ATT2_VAL2, ATT3_VAL2, ... , ATTN_VAL2, CLASS_VAL2],
|
|
73
|
+
# ...
|
|
74
|
+
# [ATTM1_VALM, ATT2_VALM, ATT3_VALM, ... , ATTN_VALM, CLASS_VALM],
|
|
75
|
+
# ]
|
|
76
|
+
#
|
|
77
|
+
# e.g.
|
|
78
|
+
# [ ['New York', '<30', 'M', 'Y'],
|
|
79
|
+
# ['Chicago', '<30', 'M', 'Y'],
|
|
80
|
+
# ['Chicago', '<30', 'F', 'Y'],
|
|
81
|
+
# ['New York', '<30', 'M', 'Y'],
|
|
82
|
+
# ['New York', '<30', 'M', 'Y'],
|
|
83
|
+
# ['Chicago', '[30-50)', 'M', 'Y'],
|
|
84
|
+
# ['New York', '[30-50)', 'F', 'N'],
|
|
85
|
+
# ['Chicago', '[30-50)', 'F', 'Y'],
|
|
86
|
+
# ['New York', '[30-50)', 'F', 'N'],
|
|
87
|
+
# ['Chicago', '[50-80]', 'M', 'N'],
|
|
88
|
+
# ['New York', '[50-80]', 'F', 'N'],
|
|
89
|
+
# ['New York', '[50-80]', 'M', 'N'],
|
|
90
|
+
# ['Chicago', '[50-80]', 'M', 'N'],
|
|
91
|
+
# ['New York', '[50-80]', 'F', 'N'],
|
|
92
|
+
# ['Chicago', '>80', 'F', 'Y']
|
|
93
|
+
# ]
|
|
94
|
+
#
|
|
95
|
+
# This method returns the classifier (self), allowing method chaining.
|
|
96
|
+
def set_data_items(items)
|
|
97
|
+
check_data_items(items)
|
|
98
|
+
@data_labels = default_data_labels(items) if @data_labels.empty?
|
|
99
|
+
@data_items = items
|
|
100
|
+
return self
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Returns an array with the domain of each attribute (Set instance
|
|
104
|
+
# containing all possible values)
|
|
105
|
+
# Return example:
|
|
106
|
+
# => [#<Set: {"New York", "Chicago"}>,
|
|
107
|
+
# #<Set: {"<30", "[30-50)", "[50-80]", ">80"}>,
|
|
108
|
+
# #<Set: {"M", "F"}>,
|
|
109
|
+
# #<Set: {"Y", "N"}>]
|
|
110
|
+
def build_domains
|
|
111
|
+
domains = Array.new(num_attributes) { Set.new }
|
|
112
|
+
@data_items.each do |data|
|
|
113
|
+
data.each_index {|attr_index| domains[attr_index] << data[attr_index]}
|
|
114
|
+
end
|
|
115
|
+
return domains
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Returns a Set instance containing all possible values for an attribute
|
|
119
|
+
# The parameter can be an attribute label or index (0 based).
|
|
120
|
+
#
|
|
121
|
+
# build_domain("city")
|
|
122
|
+
# => #<Set: {"New York", "Chicago"}>
|
|
123
|
+
#
|
|
124
|
+
# build_domain(2) # In this example, the third attribute is gender
|
|
125
|
+
# => #<Set: {"M", "F"}>
|
|
126
|
+
def build_domain(attr)
|
|
127
|
+
index = get_index(attr)
|
|
128
|
+
domain = Set.new
|
|
129
|
+
@data_items.each do |data|
|
|
130
|
+
domain << data[index]
|
|
131
|
+
end
|
|
132
|
+
return domain
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Returns attributes number, including class attribute
|
|
136
|
+
def num_attributes
|
|
137
|
+
return (@data_items.empty?) ? 0 : @data_items.first.size
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Returns the index of a given attribute (0-based).
|
|
141
|
+
# For example, if "gender" is the third attribute, then:
|
|
142
|
+
# get_index("gender")
|
|
143
|
+
# => 2
|
|
144
|
+
def get_index(attr)
|
|
145
|
+
return (attr.is_a?(String)) ? @data_labels.index(attr) : attr
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# Raise an exception if there is no data item.
|
|
149
|
+
def check_not_empty
|
|
150
|
+
if @data_items.empty?
|
|
151
|
+
raise ArgumentError,"Examples data set must not be empty."
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Add a data item to the data set
|
|
156
|
+
def << data_item
|
|
157
|
+
if data_item.nil? || !data_item.is_a?(Array) || data_item.empty?
|
|
158
|
+
raise ArgumentError,"Data must not be an non empty array."
|
|
159
|
+
elsif @data_items.empty?
|
|
160
|
+
set_data_items([data_item])
|
|
161
|
+
elsif data_item.length != num_attributes
|
|
162
|
+
raise ArgumentError,"Number of attributes do not match. " +
|
|
163
|
+
"#{data_item.length} attributes provided, " +
|
|
164
|
+
"#{num_attributes} attributes expected."
|
|
165
|
+
else
|
|
166
|
+
@data_items << data_item
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def get_attribute_mean(attribute)
|
|
171
|
+
index = get_index(attribute)
|
|
172
|
+
mean = 0.0
|
|
173
|
+
@data_items.each { |data_item| mean += data_item[index] }
|
|
174
|
+
mean /= @data_items.length
|
|
175
|
+
return mean
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def get_attribute_mode(attribute)
|
|
179
|
+
index = get_index(attribute)
|
|
180
|
+
domain = build_domain(attribute)
|
|
181
|
+
count = {}
|
|
182
|
+
domain.each {|value| count[value]=0}
|
|
183
|
+
@data_items.each { |data_item| count[data_item[index]] += 1 }
|
|
184
|
+
max_count = 0
|
|
185
|
+
mode = nil
|
|
186
|
+
count.each_pair do |value, value_count|
|
|
187
|
+
if value_count > max_count
|
|
188
|
+
mode = value
|
|
189
|
+
max_count = value_count
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
return mode
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def get_attribute_mean_or_mode(attribute)
|
|
196
|
+
index = get_index(attribute)
|
|
197
|
+
if @data_items.first[index].is_a?(Numeric)
|
|
198
|
+
return get_attribute_mean(attribute)
|
|
199
|
+
else
|
|
200
|
+
return get_attribute_mode(attribute)
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def get_mean_or_mode
|
|
205
|
+
mean = []
|
|
206
|
+
num_attributes.times {|i| mean[i] = get_attribute_mean_or_mode(i) }
|
|
207
|
+
return mean
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
protected
|
|
211
|
+
def check_data_items(data_items)
|
|
212
|
+
if !data_items || data_items.empty?
|
|
213
|
+
raise ArgumentError,"Examples data set must not be empty."
|
|
214
|
+
elsif !data_items.first.is_a?(Array)
|
|
215
|
+
raise ArgumentError,"Unkown format for example data."
|
|
216
|
+
end
|
|
217
|
+
attributes_num = data_items.first.length
|
|
218
|
+
data_items.each_index do |index|
|
|
219
|
+
if data_items[index].length != attributes_num
|
|
220
|
+
raise ArgumentError,
|
|
221
|
+
"Quantity of attributes is inconsistent. " +
|
|
222
|
+
"The first item has #{attributes_num} attributes "+
|
|
223
|
+
"and row #{index} has #{data_items[index].length} attributes"
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def check_data_labels(labels)
|
|
229
|
+
if !@data_items.empty?
|
|
230
|
+
if labels.length != @data_items.first.length
|
|
231
|
+
raise ArgumentError,
|
|
232
|
+
"Number of labels and attributes do not match. " +
|
|
233
|
+
"#{labels.length} labels and " +
|
|
234
|
+
"#{@data_items.first.length} attributes found."
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def default_data_labels(data_items)
|
|
240
|
+
data_labels = []
|
|
241
|
+
data_items[0][0..-2].each_index do |i|
|
|
242
|
+
data_labels[i] = "attribute_#{i+1}"
|
|
243
|
+
end
|
|
244
|
+
data_labels[data_labels.length]="class_value"
|
|
245
|
+
return data_labels
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
end
|
|
@@ -1,14 +1,4 @@
|
|
|
1
1
|
#
|
|
2
|
-
# The GeneticAlgorithm module implements the GeneticSearch and Chromosome
|
|
3
|
-
# classes. The GeneticSearch is a generic class, and can be used to solved
|
|
4
|
-
# any kind of problems. The GeneticSearch class performs a stochastic search
|
|
5
|
-
# of the solution of a given problem.
|
|
6
|
-
#
|
|
7
|
-
# The Chromosome is "problem specific". Ai4r built-in Chromosomeclass was
|
|
8
|
-
# designed to model the Travelling salesman problem. If you want to solve other
|
|
9
|
-
# type of problem, you will have to modify the Chromosome class, by overwriting
|
|
10
|
-
# its fitness, reproduce, and mutate functions, to model you specific problem.
|
|
11
|
-
#
|
|
12
2
|
# Author:: Sergio Fierens
|
|
13
3
|
# License:: MPL 1.1
|
|
14
4
|
# Project:: ai4r
|
|
@@ -19,7 +9,16 @@
|
|
|
19
9
|
# Mozilla Foundation at http://www.mozilla.org/MPL/MPL-1.1.txt
|
|
20
10
|
|
|
21
11
|
module Ai4r
|
|
22
|
-
|
|
12
|
+
|
|
13
|
+
# The GeneticAlgorithm module implements the GeneticSearch and Chromosome
|
|
14
|
+
# classes. The GeneticSearch is a generic class, and can be used to solved
|
|
15
|
+
# any kind of problems. The GeneticSearch class performs a stochastic search
|
|
16
|
+
# of the solution of a given problem.
|
|
17
|
+
#
|
|
18
|
+
# The Chromosome is "problem specific". Ai4r built-in Chromosomeclass was
|
|
19
|
+
# designed to model the Travelling salesman problem. If you want to solve other
|
|
20
|
+
# type of problem, you will have to modify the Chromosome class, by overwriting
|
|
21
|
+
# its fitness, reproduce, and mutate functions, to model you specific problem.
|
|
23
22
|
module GeneticAlgorithm
|
|
24
23
|
|
|
25
24
|
# This class is used to automatically:
|
|
@@ -156,10 +155,10 @@ module Ai4r
|
|
|
156
155
|
|
|
157
156
|
end
|
|
158
157
|
|
|
159
|
-
# A Chromosome is a representation of an individual
|
|
160
|
-
# problem. You will have to redifine
|
|
158
|
+
# A Chromosome is a representation of an individual solution for a specific
|
|
159
|
+
# problem. You will have to redifine the Chromosome representation for each
|
|
161
160
|
# particular problem, along with its fitness, mutate, reproduce, and seed
|
|
162
|
-
#
|
|
161
|
+
# methods.
|
|
163
162
|
class Chromosome
|
|
164
163
|
|
|
165
164
|
attr_accessor :data
|
|
@@ -169,7 +168,7 @@ module Ai4r
|
|
|
169
168
|
@data = data
|
|
170
169
|
end
|
|
171
170
|
|
|
172
|
-
# The fitness
|
|
171
|
+
# The fitness method quantifies the optimality of a solution
|
|
173
172
|
# (that is, a chromosome) in a genetic algorithm so that that particular
|
|
174
173
|
# chromosome may be ranked against all the other chromosomes.
|
|
175
174
|
#
|
|
@@ -188,7 +187,7 @@ module Ai4r
|
|
|
188
187
|
return @fitness
|
|
189
188
|
end
|
|
190
189
|
|
|
191
|
-
# mutation is
|
|
190
|
+
# mutation method is used to maintain genetic diversity from one
|
|
192
191
|
# generation of a population of chromosomes to the next. It is analogous
|
|
193
192
|
# to biological mutation.
|
|
194
193
|
#
|
|
@@ -214,8 +213,8 @@ module Ai4r
|
|
|
214
213
|
end
|
|
215
214
|
end
|
|
216
215
|
|
|
217
|
-
# Reproduction is used to
|
|
218
|
-
#
|
|
216
|
+
# Reproduction method is used to combine two chromosomes (solutions) into
|
|
217
|
+
# a single new chromosome. There are several ways to
|
|
219
218
|
# combine two chromosomes: One-point crossover, Two-point crossover,
|
|
220
219
|
# "Cut and splice", edge recombination, and more.
|
|
221
220
|
#
|
|
@@ -249,7 +248,8 @@ module Ai4r
|
|
|
249
248
|
|
|
250
249
|
# Initializes an individual solution (chromosome) for the initial
|
|
251
250
|
# population. Usually the chromosome is generated randomly, but you can
|
|
252
|
-
# use some problem domain knowledge, to generate
|
|
251
|
+
# use some problem domain knowledge, to generate a
|
|
252
|
+
# (probably) better initial solution.
|
|
253
253
|
def self.seed
|
|
254
254
|
data_size = @@costs[0].length
|
|
255
255
|
available = []
|
|
@@ -1,26 +1,3 @@
|
|
|
1
|
-
# The utility of artificial neural network
|
|
2
|
-
# models lies in the fact that they can be used
|
|
3
|
-
# to infer a function from observations.
|
|
4
|
-
# This is particularly useful in applications
|
|
5
|
-
# where the complexity of the data or task makes the
|
|
6
|
-
# design of such a function by hand impractical.
|
|
7
|
-
# Neural Networks are being used in many businesses and applications. Their
|
|
8
|
-
# ability to learn by example makes them attractive in environments where
|
|
9
|
-
# the business rules are either not well defined or are hard to enumerate and
|
|
10
|
-
# define. Many people believe that Neural Networks can only solve toy problems.
|
|
11
|
-
# Give them a try, and let you decide if they are good enough to solve your
|
|
12
|
-
# needs.
|
|
13
|
-
#
|
|
14
|
-
# In this module you will find an implementation of neural networks
|
|
15
|
-
# using the Backpropagation is a supervised learning technique (described
|
|
16
|
-
# by Paul Werbos in 1974, and further developed by David E.
|
|
17
|
-
# Rumelhart, Geoffrey E. Hinton and Ronald J. Williams in 1986)
|
|
18
|
-
#
|
|
19
|
-
# More about neural networks and backpropagation:
|
|
20
|
-
#
|
|
21
|
-
# * http://en.wikipedia.org/wiki/Backpropagation
|
|
22
|
-
# * http://en.wikipedia.org/wiki/Neural_networks
|
|
23
|
-
#
|
|
24
1
|
# Author:: Sergio Fierens
|
|
25
2
|
# License:: MPL 1.1
|
|
26
3
|
# Project:: ai4r
|
|
@@ -36,6 +13,28 @@
|
|
|
36
13
|
|
|
37
14
|
module Ai4r
|
|
38
15
|
|
|
16
|
+
# The utility of artificial neural network
|
|
17
|
+
# models lies in the fact that they can be used
|
|
18
|
+
# to infer a function from observations.
|
|
19
|
+
# This is particularly useful in applications
|
|
20
|
+
# where the complexity of the data or task makes the
|
|
21
|
+
# design of such a function by hand impractical.
|
|
22
|
+
# Neural Networks are being used in many businesses and applications. Their
|
|
23
|
+
# ability to learn by example makes them attractive in environments where
|
|
24
|
+
# the business rules are either not well defined or are hard to enumerate and
|
|
25
|
+
# define. Many people believe that Neural Networks can only solve toy problems.
|
|
26
|
+
# Give them a try, and let you decide if they are good enough to solve your
|
|
27
|
+
# needs.
|
|
28
|
+
#
|
|
29
|
+
# In this module you will find an implementation of neural networks
|
|
30
|
+
# using the Backpropagation is a supervised learning technique (described
|
|
31
|
+
# by Paul Werbos in 1974, and further developed by David E.
|
|
32
|
+
# Rumelhart, Geoffrey E. Hinton and Ronald J. Williams in 1986)
|
|
33
|
+
#
|
|
34
|
+
# More about neural networks and backpropagation:
|
|
35
|
+
#
|
|
36
|
+
# * http://en.wikipedia.org/wiki/Backpropagation
|
|
37
|
+
# * http://en.wikipedia.org/wiki/Neural_networks
|
|
39
38
|
module NeuralNetwork
|
|
40
39
|
|
|
41
40
|
# = Introduction
|
|
@@ -48,7 +47,7 @@ module Ai4r
|
|
|
48
47
|
# = How to use it
|
|
49
48
|
#
|
|
50
49
|
# # Create the network
|
|
51
|
-
# net = Backpropagation.new([4, 3, 2]) # 4 inputs
|
|
50
|
+
# net = Ai4r::NeuralNetwork::Backpropagation.new([4, 3, 2]) # 4 inputs
|
|
52
51
|
# # 1 hidden layer with 3 neurons,
|
|
53
52
|
# # 2 outputs
|
|
54
53
|
# # Train the network
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
|
5
|
+
<meta content="Apache Forrest" name="Generator">
|
|
6
|
+
<meta name="Forrest-version" content="0.8">
|
|
7
|
+
<meta name="Forrest-skin-name" content="pelt">
|
|
8
|
+
<meta name="generator" content="">
|
|
9
|
+
<title>Artificial intelligence for ruby :: ai4r :: download page at RubyForge</title>
|
|
10
|
+
<link type="text/css" href="skin/basic.css" rel="stylesheet">
|
|
11
|
+
<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
|
|
12
|
+
<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
|
|
13
|
+
<link type="text/css" href="skin/profile.css" rel="stylesheet">
|
|
14
|
+
<script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
|
|
15
|
+
<link rel="shortcut icon" href="">
|
|
16
|
+
</head>
|
|
17
|
+
<body onload="init()">
|
|
18
|
+
<script type="text/javascript">ndeSetTextSize();</script>
|
|
19
|
+
<div id="top">
|
|
20
|
+
<!--+
|
|
21
|
+
|header
|
|
22
|
+
+-->
|
|
23
|
+
<div class="header">
|
|
24
|
+
<!--+
|
|
25
|
+
|start group logo
|
|
26
|
+
+-->
|
|
27
|
+
<div class="grouplogo">
|
|
28
|
+
<a href="http://www.jadeferret.com"><img class="logoImage" alt="Jade Ferret" src="images/jadeferret.png" title="Jade Ferret"></a>
|
|
29
|
+
</div>
|
|
30
|
+
<!--+
|
|
31
|
+
|end group logo
|
|
32
|
+
+-->
|
|
33
|
+
<!--+
|
|
34
|
+
|start Project Logo
|
|
35
|
+
+-->
|
|
36
|
+
<div class="projectlogo">
|
|
37
|
+
<a href="http://ai4r.rubyforge.org/"><img class="logoImage" alt="ai4r" src="images/ai4r-logo.png" title="AI4R - Artificial Intelligence for Ruby"></a>
|
|
38
|
+
</div>
|
|
39
|
+
<!--+
|
|
40
|
+
|end Project Logo
|
|
41
|
+
+-->
|
|
42
|
+
<!--+
|
|
43
|
+
|start Search
|
|
44
|
+
+-->
|
|
45
|
+
<div class="searchbox">
|
|
46
|
+
<div class="roundtopsmall">
|
|
47
|
+
<form target="_top" action="http://www.google.com/custom" method="get">
|
|
48
|
+
<input value="ai4r.rubyforge.org;raa.ruby-lang.org;rubyforge.org" name="domains" type="hidden"><label style="display: none" for="sbi">Enter your search terms</label><input id="sbi" value="" maxlength="255" size="31" name="q" type="text"><label style="display: none" for="sbb">Submit search form</label><input id="sbb" value="Search" name="sa" type="submit"><span style="display:none"><input id="ss0" value="" name="sitesearch" style="display=none" type="radio"><input id="ss1" checked value="ai4r.rubyforge.org" name="sitesearch" style="display=none" type="radio"><input id="ss2" value="raa.ruby-lang.org" name="sitesearch" style="display=none" type="radio"><input id="ss3" value="rubyforge.org" name="sitesearch" style="display=none" type="radio"></span><input value="pub-2578934938711895" name="client" type="hidden"><input value="1" name="forid" type="hidden"><input value="ISO-8859-1" name="ie" type="hidden"><input value="ISO-8859-1" name="oe" type="hidden"><input value="active" name="safe" type="hidden"><input value="0000" name="flav" type="hidden"><input value="XEZZoGuMPMQqvUG_" name="sig" type="hidden"><input value="GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;LH:50;LW:78;L:http://ai4r.rubyforge.org/images/ai4r-logo.png;S:http://ai4r.rubyforge.org/;FORID:1" name="cof" type="hidden"><input value="en" name="hl" type="hidden">
|
|
49
|
+
</form>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
<!--+
|
|
53
|
+
|end search
|
|
54
|
+
+-->
|
|
55
|
+
<!--+
|
|
56
|
+
|start Tabs
|
|
57
|
+
+-->
|
|
58
|
+
<ul id="tabs">
|
|
59
|
+
<li class="current">
|
|
60
|
+
<a class="selected" href="index.html">Home</a>
|
|
61
|
+
</li>
|
|
62
|
+
</ul>
|
|
63
|
+
<!--+
|
|
64
|
+
|end Tabs
|
|
65
|
+
+-->
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
<div id="main">
|
|
69
|
+
<div id="publishedStrip">
|
|
70
|
+
<!--+
|
|
71
|
+
|start Subtabs
|
|
72
|
+
+-->
|
|
73
|
+
<div id="level2tabs"></div>
|
|
74
|
+
<!--+
|
|
75
|
+
|end Endtabs
|
|
76
|
+
+-->
|
|
77
|
+
<script type="text/javascript"><!--
|
|
78
|
+
document.write("Last Published: " + document.lastModified);
|
|
79
|
+
// --></script>
|
|
80
|
+
</div>
|
|
81
|
+
<!--+
|
|
82
|
+
|breadtrail
|
|
83
|
+
+-->
|
|
84
|
+
<div class="breadtrail">
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
</div>
|
|
88
|
+
<!--+
|
|
89
|
+
|start Menu, mainarea
|
|
90
|
+
+-->
|
|
91
|
+
<!--+
|
|
92
|
+
|start Menu
|
|
93
|
+
+-->
|
|
94
|
+
<div id="menu">
|
|
95
|
+
<div onclick="SwitchMenu('menu_selected_1.1', 'skin/')" id="menu_selected_1.1Title" class="menutitle" style="background-image: url('skin/images/chapter_open.gif');">Home</div>
|
|
96
|
+
<div id="menu_selected_1.1" class="selectedmenuitemgroup" style="display: block;">
|
|
97
|
+
<div class="menuitem">
|
|
98
|
+
<a href="index.html" title="ai4r - Artificial Intelligence for Ruby">Index</a>
|
|
99
|
+
</div>
|
|
100
|
+
<div onclick="SwitchMenu('menu_1.1.2', 'skin/')" id="menu_1.1.2Title" class="menutitle">Practical Examples</div>
|
|
101
|
+
<div id="menu_1.1.2" class="menuitemgroup">
|
|
102
|
+
<div class="menuitem">
|
|
103
|
+
<a href="geneticAlgorithms.html" title="Genetic Algorithms in ruby">Genetic Algorithms</a>
|
|
104
|
+
</div>
|
|
105
|
+
<div class="menuitem">
|
|
106
|
+
<a href="machineLearning.html" title="ID3 Decision Trees in ruby">Machine Learning</a>
|
|
107
|
+
</div>
|
|
108
|
+
<div class="menuitem">
|
|
109
|
+
<a href="neuralNetworks.html" title="Backpropagation Neural Network in ruby">Neural Networks</a>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
<div class="menupage">
|
|
113
|
+
<div class="menupagetitle">Downloads</div>
|
|
114
|
+
</div>
|
|
115
|
+
<div class="menuitem">
|
|
116
|
+
<a href="http://forum.jadeferret.com/viewforum.php?f=3" title="Ai4r Forum">Forum</a>
|
|
117
|
+
</div>
|
|
118
|
+
<div class="menuitem">
|
|
119
|
+
<a href="http://ai4r.rubyforge.org/rdoc/index.html" title="Ai4 RDoc docs">API doc (Rdoc)</a>
|
|
120
|
+
</div>
|
|
121
|
+
<div class="menuitem">
|
|
122
|
+
<a href="svn.html" title="ai4r Subversion repository">Source Code repository</a>
|
|
123
|
+
</div>
|
|
124
|
+
<div class="menuitem">
|
|
125
|
+
<a href="wholesite.pdf">ai4r project PDF</a>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
<div id="credit">
|
|
129
|
+
<script type="text/javascript">
|
|
130
|
+
google_ad_client = "pub-2578934938711895";
|
|
131
|
+
google_ad_slot = "6111091580";
|
|
132
|
+
google_ad_width = 125;
|
|
133
|
+
google_ad_height = 125;
|
|
134
|
+
</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
|
|
135
|
+
<hr>
|
|
136
|
+
</div>
|
|
137
|
+
<div id="roundbottom">
|
|
138
|
+
<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
|
|
139
|
+
<!--+
|
|
140
|
+
|alternative credits
|
|
141
|
+
+-->
|
|
142
|
+
<div id="credit2"></div>
|
|
143
|
+
</div>
|
|
144
|
+
<!--+
|
|
145
|
+
|end Menu
|
|
146
|
+
+-->
|
|
147
|
+
<!--+
|
|
148
|
+
|start content
|
|
149
|
+
+-->
|
|
150
|
+
<div id="content">
|
|
151
|
+
<div title="Portable Document Format" class="pdflink">
|
|
152
|
+
<a class="dida" href="downloads.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
|
|
153
|
+
PDF</a>
|
|
154
|
+
</div>
|
|
155
|
+
<h1>Artificial intelligence for ruby :: ai4r :: download page at RubyForge</h1>
|
|
156
|
+
<div id="minitoc-area">
|
|
157
|
+
<ul class="minitoc">
|
|
158
|
+
<li>
|
|
159
|
+
<a href="#intro">Artificial intelligence for ruby - ai4r - download page at RubyForge</a>
|
|
160
|
+
</li>
|
|
161
|
+
</ul>
|
|
162
|
+
</div>
|
|
163
|
+
<a name="N10010"></a><a name="intro"></a>
|
|
164
|
+
<h2 class="boxed">Artificial intelligence for ruby - ai4r - download page at RubyForge</h2>
|
|
165
|
+
<div class="section">
|
|
166
|
+
<iframe frameborder="0" height="800px" src="http://rubyforge.org/frs/?group_id=4942" width="100%"></iframe>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
<!--+
|
|
170
|
+
|end content
|
|
171
|
+
+-->
|
|
172
|
+
<div class="clearboth"> </div>
|
|
173
|
+
</div>
|
|
174
|
+
<div id="footer">
|
|
175
|
+
<!--+
|
|
176
|
+
|start bottomstrip
|
|
177
|
+
+-->
|
|
178
|
+
<div class="lastmodified">
|
|
179
|
+
<script type="text/javascript"><!--
|
|
180
|
+
document.write("Last Published: " + document.lastModified);
|
|
181
|
+
// --></script>
|
|
182
|
+
</div>
|
|
183
|
+
<div class="copyright">
|
|
184
|
+
Copyright ©
|
|
185
|
+
2007-2009 <a href="http://www.jadeferret.com/">Sergio Fierens, Jade Ferret</a>
|
|
186
|
+
</div>
|
|
187
|
+
<div class="host">
|
|
188
|
+
<a href="http://rubyforge.org/projects/ai4r/"><img class="logoImage" alt="" src="images/rubyforge.png"></a>
|
|
189
|
+
</div>
|
|
190
|
+
<!--+
|
|
191
|
+
|end bottomstrip
|
|
192
|
+
+-->
|
|
193
|
+
</div>
|
|
194
|
+
<script src="http://www.google-analytics.com/ga.js" type="text/javascript"></script><script type="text/javascript">
|
|
195
|
+
var pageTracker = _gat._getTracker("UA-3234625-1");
|
|
196
|
+
pageTracker._initData();
|
|
197
|
+
pageTracker._trackPageview();
|
|
198
|
+
</script>
|
|
199
|
+
</body>
|
|
200
|
+
</html>
|