ai4ruby 1.11
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +47 -0
- data/examples/classifiers/id3_data.csv +121 -0
- data/examples/classifiers/id3_example.rb +29 -0
- data/examples/classifiers/naive_bayes_data.csv +11 -0
- data/examples/classifiers/naive_bayes_example.rb +16 -0
- data/examples/classifiers/results.txt +31 -0
- data/examples/genetic_algorithm/genetic_algorithm_example.rb +37 -0
- data/examples/genetic_algorithm/travel_cost.csv +16 -0
- data/examples/neural_network/backpropagation_example.rb +67 -0
- data/examples/neural_network/patterns_with_base_noise.rb +68 -0
- data/examples/neural_network/patterns_with_noise.rb +66 -0
- data/examples/neural_network/training_patterns.rb +68 -0
- data/examples/neural_network/xor_example.rb +35 -0
- data/examples/som/som_data.rb +156 -0
- data/examples/som/som_multi_node_example.rb +22 -0
- data/examples/som/som_single_example.rb +24 -0
- data/lib/ai4r.rb +33 -0
- data/lib/ai4r/classifiers/classifier.rb +62 -0
- data/lib/ai4r/classifiers/hyperpipes.rb +118 -0
- data/lib/ai4r/classifiers/ib1.rb +121 -0
- data/lib/ai4r/classifiers/id3.rb +326 -0
- data/lib/ai4r/classifiers/multilayer_perceptron.rb +135 -0
- data/lib/ai4r/classifiers/naive_bayes.rb +259 -0
- data/lib/ai4r/classifiers/one_r.rb +110 -0
- data/lib/ai4r/classifiers/prism.rb +197 -0
- data/lib/ai4r/classifiers/zero_r.rb +73 -0
- data/lib/ai4r/clusterers/average_linkage.rb +59 -0
- data/lib/ai4r/clusterers/bisecting_k_means.rb +93 -0
- data/lib/ai4r/clusterers/centroid_linkage.rb +66 -0
- data/lib/ai4r/clusterers/clusterer.rb +61 -0
- data/lib/ai4r/clusterers/complete_linkage.rb +67 -0
- data/lib/ai4r/clusterers/diana.rb +139 -0
- data/lib/ai4r/clusterers/k_means.rb +126 -0
- data/lib/ai4r/clusterers/median_linkage.rb +61 -0
- data/lib/ai4r/clusterers/single_linkage.rb +194 -0
- data/lib/ai4r/clusterers/ward_linkage.rb +64 -0
- data/lib/ai4r/clusterers/ward_linkage_hierarchical.rb +31 -0
- data/lib/ai4r/clusterers/weighted_average_linkage.rb +61 -0
- data/lib/ai4r/data/data_set.rb +266 -0
- data/lib/ai4r/data/parameterizable.rb +64 -0
- data/lib/ai4r/data/proximity.rb +100 -0
- data/lib/ai4r/data/statistics.rb +77 -0
- data/lib/ai4r/experiment/classifier_evaluator.rb +95 -0
- data/lib/ai4r/genetic_algorithm/genetic_algorithm.rb +270 -0
- data/lib/ai4r/neural_network/backpropagation.rb +326 -0
- data/lib/ai4r/neural_network/hopfield.rb +149 -0
- data/lib/ai4r/som/layer.rb +68 -0
- data/lib/ai4r/som/node.rb +96 -0
- data/lib/ai4r/som/som.rb +155 -0
- data/lib/ai4r/som/two_phase_layer.rb +90 -0
- data/test/classifiers/hyperpipes_test.rb +84 -0
- data/test/classifiers/ib1_test.rb +78 -0
- data/test/classifiers/id3_test.rb +208 -0
- data/test/classifiers/multilayer_perceptron_test.rb +79 -0
- data/test/classifiers/naive_bayes_test.rb +43 -0
- data/test/classifiers/one_r_test.rb +62 -0
- data/test/classifiers/prism_test.rb +85 -0
- data/test/classifiers/zero_r_test.rb +49 -0
- data/test/clusterers/average_linkage_test.rb +51 -0
- data/test/clusterers/bisecting_k_means_test.rb +66 -0
- data/test/clusterers/centroid_linkage_test.rb +53 -0
- data/test/clusterers/complete_linkage_test.rb +57 -0
- data/test/clusterers/diana_test.rb +69 -0
- data/test/clusterers/k_means_test.rb +100 -0
- data/test/clusterers/median_linkage_test.rb +53 -0
- data/test/clusterers/single_linkage_test.rb +122 -0
- data/test/clusterers/ward_linkage_hierarchical_test.rb +61 -0
- data/test/clusterers/ward_linkage_test.rb +53 -0
- data/test/clusterers/weighted_average_linkage_test.rb +53 -0
- data/test/data/data_set_test.rb +96 -0
- data/test/data/proximity_test.rb +81 -0
- data/test/data/statistics_test.rb +65 -0
- data/test/experiment/classifier_evaluator_test.rb +76 -0
- data/test/genetic_algorithm/chromosome_test.rb +58 -0
- data/test/genetic_algorithm/genetic_algorithm_test.rb +81 -0
- data/test/neural_network/backpropagation_test.rb +82 -0
- data/test/neural_network/hopfield_test.rb +72 -0
- data/test/som/som_test.rb +97 -0
- metadata +168 -0
@@ -0,0 +1,66 @@
|
|
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
|
+
TRIANGLE_WITH_NOISE = [
|
11
|
+
[ 1, 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, 1, 0, 0, 0, 0],
|
12
|
+
[ 0, 0, 0, 0, 3, 0, 1, 9, 9, 1, 0, 0, 0, 0, 3, 0],
|
13
|
+
[ 0, 3, 0, 0, 0, 0, 5, 1, 5, 3, 0, 0, 0, 0, 0, 7],
|
14
|
+
[ 0, 0, 0, 7, 0, 1, 9, 1, 1, 9, 1, 0, 0, 0, 3, 0],
|
15
|
+
[ 0, 0, 0, 0, 0, 3, 5, 0, 3, 5, 5, 0, 0, 0, 0, 0],
|
16
|
+
[ 0, 1, 0, 0, 1, 9, 1, 0, 1, 1, 9, 1, 0, 0, 0, 0],
|
17
|
+
[ 1, 0, 0, 0, 5, 5, 0, 0, 0, 0, 5, 5, 7, 0, 0, 3],
|
18
|
+
[ 0, 0, 3, 3, 9, 1, 0, 0, 1, 0, 1, 9, 1, 0, 0, 0],
|
19
|
+
[ 0, 0, 0, 5, 5, 0, 3, 7, 0, 0, 0, 5, 5, 0, 0, 0],
|
20
|
+
[ 0, 0, 1, 9, 1, 0, 0, 0, 0, 0, 0, 1, 9, 1, 0, 0],
|
21
|
+
[ 0, 0, 5, 5, 0, 0, 0, 0, 3, 0, 0, 0, 5, 5, 0, 0],
|
22
|
+
[ 0, 1, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9, 1, 0],
|
23
|
+
[ 0, 5, 5, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 5, 5, 0],
|
24
|
+
[ 1, 9, 1, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1, 9, 1],
|
25
|
+
[ 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5],
|
26
|
+
[10, 10, 10, 10, 1, 10, 10, 10, 10, 10, 1, 10, 10, 10, 10, 10]
|
27
|
+
]
|
28
|
+
|
29
|
+
SQUARE_WITH_NOISE = [
|
30
|
+
[10, 3, 10, 10, 10, 6, 10, 10, 10, 10, 10, 4, 10, 10, 10, 10],
|
31
|
+
[10, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
32
|
+
[10, 0, 3, 0, 0, 0, 0, 7, 0, 6, 1, 0, 0, 0, 0, 0],
|
33
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
34
|
+
[10, 0, 4, 0, 4, 0, 0, 0, 1, 0, 3, 0, 0, 4, 0, 10],
|
35
|
+
[10, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
|
36
|
+
[10, 0, 0, 0, 3, 6, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10],
|
37
|
+
[10, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 7, 0, 0, 10],
|
38
|
+
[10, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
39
|
+
[10, 0, 7, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
40
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 7, 10],
|
41
|
+
[10, 0, 3, 0, 4, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 10],
|
42
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10],
|
43
|
+
[10, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 10],
|
44
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
45
|
+
[10, 10, 10, 10, 3, 10, 10, 10, 10, 0, 10, 10, 1, 10, 1, 10]
|
46
|
+
|
47
|
+
]
|
48
|
+
|
49
|
+
CROSS_WITH_NOISE = [
|
50
|
+
[ 0, 0, 0, 0, 0, 0, 3, 3, 5, 0, 3, 0, 0, 0, 1, 0],
|
51
|
+
[ 0, 1, 0, 0, 0, 1, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
52
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 3, 0, 0, 0],
|
53
|
+
[ 0, 0, 1, 8, 0, 0, 0, 5, 5, 0, 4, 0, 0, 0, 1, 0],
|
54
|
+
[ 0, 0, 0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 1, 0, 0, 0],
|
55
|
+
[ 0, 0, 0, 8, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 1],
|
56
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 3, 0, 0, 0, 0, 0],
|
57
|
+
[ 5, 5, 5, 8, 5, 3, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5],
|
58
|
+
[ 5, 5, 5, 5, 5, 5, 5, 5, 1, 5, 5, 5, 5, 1, 0, 0],
|
59
|
+
[ 0, 0, 0, 8, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0],
|
60
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 4, 0, 0, 0, 0, 0, 0],
|
61
|
+
[ 0, 0, 0, 0, 0, 4, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
62
|
+
[ 4, 0, 0, 4, 0, 0, 0, 5, 5, 0, 0, 0, 1, 0, 0, 0],
|
63
|
+
[ 0, 0, 0, 0, 0, 1, 0, 5, 4, 4, 3, 0, 0, 0, 0, 0],
|
64
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 10, 0, 0, 0],
|
65
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0]
|
66
|
+
]
|
@@ -0,0 +1,68 @@
|
|
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
|
+
|
11
|
+
TRIANGLE = [
|
12
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
13
|
+
[ 0, 0, 0, 0, 0, 0, 1, 9, 9, 1, 0, 0, 0, 0, 0, 0],
|
14
|
+
[ 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0],
|
15
|
+
[ 0, 0, 0, 0, 0, 1, 9, 1, 1, 9, 1, 0, 0, 0, 0, 0],
|
16
|
+
[ 0, 0, 0, 0, 0, 5, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0],
|
17
|
+
[ 0, 0, 0, 0, 1, 9, 1, 0, 0, 1, 9, 1, 0, 0, 0, 0],
|
18
|
+
[ 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0],
|
19
|
+
[ 0, 0, 0, 1, 9, 1, 0, 0, 0, 0, 1, 9, 1, 0, 0, 0],
|
20
|
+
[ 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0],
|
21
|
+
[ 0, 0, 1, 9, 1, 0, 0, 0, 0, 0, 0, 1, 9, 1, 0, 0],
|
22
|
+
[ 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0],
|
23
|
+
[ 0, 1, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9, 1, 0],
|
24
|
+
[ 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0],
|
25
|
+
[ 1, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9, 1],
|
26
|
+
[ 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5],
|
27
|
+
[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
|
28
|
+
]
|
29
|
+
|
30
|
+
SQUARE = [
|
31
|
+
[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10],
|
32
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
33
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
34
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
35
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
36
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
37
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
38
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
39
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
40
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
41
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
42
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
43
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
44
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
45
|
+
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
46
|
+
[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
|
47
|
+
|
48
|
+
]
|
49
|
+
|
50
|
+
CROSS = [
|
51
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
52
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
53
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
54
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
55
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
56
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
57
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
58
|
+
[ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
|
59
|
+
[ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
|
60
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
61
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
62
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
63
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
64
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
65
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
66
|
+
[ 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0]
|
67
|
+
]
|
68
|
+
|
@@ -0,0 +1,35 @@
|
|
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 File.dirname(__FILE__) + '/../../lib/ai4r/neural_network/backpropagation'
|
11
|
+
require 'benchmark'
|
12
|
+
|
13
|
+
times = Benchmark.measure do
|
14
|
+
|
15
|
+
srand 1
|
16
|
+
|
17
|
+
net = Ai4r::NeuralNetwork::Backpropagation.new([2, 2, 1])
|
18
|
+
|
19
|
+
puts "Training the network, please wait."
|
20
|
+
2001.times do |i|
|
21
|
+
net.train([0,0], [0])
|
22
|
+
net.train([0,1], [1])
|
23
|
+
net.train([1,0], [1])
|
24
|
+
error = net.train([1,1], [0])
|
25
|
+
puts "Error after iteration #{i}:\t#{error}" if i%200 == 0
|
26
|
+
end
|
27
|
+
|
28
|
+
puts "Test data"
|
29
|
+
puts "[0,0] = > #{net.eval([0,0]).inspect}"
|
30
|
+
puts "[0,1] = > #{net.eval([0,1]).inspect}"
|
31
|
+
puts "[1,0] = > #{net.eval([1,0]).inspect}"
|
32
|
+
puts "[1,1] = > #{net.eval([1,1]).inspect}"
|
33
|
+
end
|
34
|
+
|
35
|
+
puts "Elapsed time: #{times}"
|
@@ -0,0 +1,156 @@
|
|
1
|
+
# data is from the iris dataset (http://archive.ics.uci.edu/ml/datasets/Iris)
|
2
|
+
# it is the full dataset, removing the last column
|
3
|
+
# website provides additional information on the dataset itself (attributes, class distribution, etc)
|
4
|
+
|
5
|
+
SOM_DATA = [
|
6
|
+
[5.1, 3.5, 1.4, 0.2],
|
7
|
+
[4.9, 3.0, 1.4, 0.2],
|
8
|
+
[4.7, 3.2, 1.3, 0.2],
|
9
|
+
[4.6, 3.1, 1.5, 0.2],
|
10
|
+
[5.0, 3.6, 1.4, 0.2],
|
11
|
+
[5.4, 3.9, 1.7, 0.4],
|
12
|
+
[4.6, 3.4, 1.4, 0.3],
|
13
|
+
[5.0, 3.4, 1.5, 0.2],
|
14
|
+
[4.4, 2.9, 1.4, 0.2],
|
15
|
+
[4.9, 3.1, 1.5, 0.1],
|
16
|
+
[5.4, 3.7, 1.5, 0.2],
|
17
|
+
[4.8, 3.4, 1.6, 0.2],
|
18
|
+
[4.8, 3.0, 1.4, 0.1],
|
19
|
+
[4.3, 3.0, 1.1, 0.1],
|
20
|
+
[5.8, 4.0, 1.2, 0.2],
|
21
|
+
[5.7, 4.4, 1.5, 0.4],
|
22
|
+
[5.4, 3.9, 1.3, 0.4],
|
23
|
+
[5.1, 3.5, 1.4, 0.3],
|
24
|
+
[5.7, 3.8, 1.7, 0.3],
|
25
|
+
[5.1, 3.8, 1.5, 0.3],
|
26
|
+
[5.4, 3.4, 1.7, 0.2],
|
27
|
+
[5.1, 3.7, 1.5, 0.4],
|
28
|
+
[4.6, 3.6, 1.0, 0.2],
|
29
|
+
[5.1, 3.3, 1.7, 0.5],
|
30
|
+
[4.8, 3.4, 1.9, 0.2],
|
31
|
+
[5.0, 3.0, 1.6, 0.2],
|
32
|
+
[5.0, 3.4, 1.6, 0.4],
|
33
|
+
[5.2, 3.5, 1.5, 0.2],
|
34
|
+
[5.2, 3.4, 1.4, 0.2],
|
35
|
+
[4.7, 3.2, 1.6, 0.2],
|
36
|
+
[4.8, 3.1, 1.6, 0.2],
|
37
|
+
[5.4, 3.4, 1.5, 0.4],
|
38
|
+
[5.2, 4.1, 1.5, 0.1],
|
39
|
+
[5.5, 4.2, 1.4, 0.2],
|
40
|
+
[4.9, 3.1, 1.5, 0.1],
|
41
|
+
[5.0, 3.2, 1.2, 0.2],
|
42
|
+
[5.5, 3.5, 1.3, 0.2],
|
43
|
+
[4.9, 3.1, 1.5, 0.1],
|
44
|
+
[4.4, 3.0, 1.3, 0.2],
|
45
|
+
[5.1, 3.4, 1.5, 0.2],
|
46
|
+
[5.0, 3.5, 1.3, 0.3],
|
47
|
+
[4.5, 2.3, 1.3, 0.3],
|
48
|
+
[4.4, 3.2, 1.3, 0.2],
|
49
|
+
[5.0, 3.5, 1.6, 0.6],
|
50
|
+
[5.1, 3.8, 1.9, 0.4],
|
51
|
+
[4.8, 3.0, 1.4, 0.3],
|
52
|
+
[5.1, 3.8, 1.6, 0.2],
|
53
|
+
[4.6, 3.2, 1.4, 0.2],
|
54
|
+
[5.3, 3.7, 1.5, 0.2],
|
55
|
+
[5.0, 3.3, 1.4, 0.2],
|
56
|
+
[7.0, 3.2, 4.7, 1.4],
|
57
|
+
[6.4, 3.2, 4.5, 1.5],
|
58
|
+
[6.9, 3.1, 4.9, 1.5],
|
59
|
+
[5.5, 2.3, 4.0, 1.3],
|
60
|
+
[6.5, 2.8, 4.6, 1.5],
|
61
|
+
[5.7, 2.8, 4.5, 1.3],
|
62
|
+
[6.3, 3.3, 4.7, 1.6],
|
63
|
+
[4.9, 2.4, 3.3, 1.0],
|
64
|
+
[6.6, 2.9, 4.6, 1.3],
|
65
|
+
[5.2, 2.7, 3.9, 1.4],
|
66
|
+
[5.0, 2.0, 3.5, 1.0],
|
67
|
+
[5.9, 3.0, 4.2, 1.5],
|
68
|
+
[6.0, 2.2, 4.0, 1.0],
|
69
|
+
[6.1, 2.9, 4.7, 1.4],
|
70
|
+
[5.6, 2.9, 3.6, 1.3],
|
71
|
+
[6.7, 3.1, 4.4, 1.4],
|
72
|
+
[5.6, 3.0, 4.5, 1.5],
|
73
|
+
[5.8, 2.7, 4.1, 1.0],
|
74
|
+
[6.2, 2.2, 4.5, 1.5],
|
75
|
+
[5.6, 2.5, 3.9, 1.1],
|
76
|
+
[5.9, 3.2, 4.8, 1.8],
|
77
|
+
[6.1, 2.8, 4.0, 1.3],
|
78
|
+
[6.3, 2.5, 4.9, 1.5],
|
79
|
+
[6.1, 2.8, 4.7, 1.2],
|
80
|
+
[6.4, 2.9, 4.3, 1.3],
|
81
|
+
[6.6, 3.0, 4.4, 1.4],
|
82
|
+
[6.8, 2.8, 4.8, 1.4],
|
83
|
+
[6.7, 3.0, 5.0, 1.7],
|
84
|
+
[6.0, 2.9, 4.5, 1.5],
|
85
|
+
[5.7, 2.6, 3.5, 1.0],
|
86
|
+
[5.5, 2.4, 3.8, 1.1],
|
87
|
+
[5.5, 2.4, 3.7, 1.0],
|
88
|
+
[5.8, 2.7, 3.9, 1.2],
|
89
|
+
[6.0, 2.7, 5.1, 1.6],
|
90
|
+
[5.4, 3.0, 4.5, 1.5],
|
91
|
+
[6.0, 3.4, 4.5, 1.6],
|
92
|
+
[6.7, 3.1, 4.7, 1.5],
|
93
|
+
[6.3, 2.3, 4.4, 1.3],
|
94
|
+
[5.6, 3.0, 4.1, 1.3],
|
95
|
+
[5.5, 2.5, 4.0, 1.3],
|
96
|
+
[5.5, 2.6, 4.4, 1.2],
|
97
|
+
[6.1, 3.0, 4.6, 1.4],
|
98
|
+
[5.8, 2.6, 4.0, 1.2],
|
99
|
+
[5.0, 2.3, 3.3, 1.0],
|
100
|
+
[5.6, 2.7, 4.2, 1.3],
|
101
|
+
[5.7, 3.0, 4.2, 1.2],
|
102
|
+
[5.7, 2.9, 4.2, 1.3],
|
103
|
+
[6.2, 2.9, 4.3, 1.3],
|
104
|
+
[5.1, 2.5, 3.0, 1.1],
|
105
|
+
[5.7, 2.8, 4.1, 1.3],
|
106
|
+
[6.3, 3.3, 6.0, 2.5],
|
107
|
+
[5.8, 2.7, 5.1, 1.9],
|
108
|
+
[7.1, 3.0, 5.9, 2.1],
|
109
|
+
[6.3, 2.9, 5.6, 1.8],
|
110
|
+
[6.5, 3.0, 5.8, 2.2],
|
111
|
+
[7.6, 3.0, 6.6, 2.1],
|
112
|
+
[4.9, 2.5, 4.5, 1.7],
|
113
|
+
[7.3, 2.9, 6.3, 1.8],
|
114
|
+
[6.7, 2.5, 5.8, 1.8],
|
115
|
+
[7.2, 3.6, 6.1, 2.5],
|
116
|
+
[6.5, 3.2, 5.1, 2.0],
|
117
|
+
[6.4, 2.7, 5.3, 1.9],
|
118
|
+
[6.8, 3.0, 5.5, 2.1],
|
119
|
+
[5.7, 2.5, 5.0, 2.0],
|
120
|
+
[5.8, 2.8, 5.1, 2.4],
|
121
|
+
[6.4, 3.2, 5.3, 2.3],
|
122
|
+
[6.5, 3.0, 5.5, 1.8],
|
123
|
+
[7.7, 3.8, 6.7, 2.2],
|
124
|
+
[7.7, 2.6, 6.9, 2.3],
|
125
|
+
[6.0, 2.2, 5.0, 1.5],
|
126
|
+
[6.9, 3.2, 5.7, 2.3],
|
127
|
+
[5.6, 2.8, 4.9, 2.0],
|
128
|
+
[7.7, 2.8, 6.7, 2.0],
|
129
|
+
[6.3, 2.7, 4.9, 1.8],
|
130
|
+
[6.7, 3.3, 5.7, 2.1],
|
131
|
+
[7.2, 3.2, 6.0, 1.8],
|
132
|
+
[6.2, 2.8, 4.8, 1.8],
|
133
|
+
[6.1, 3.0, 4.9, 1.8],
|
134
|
+
[6.4, 2.8, 5.6, 2.1],
|
135
|
+
[7.2, 3.0, 5.8, 1.6],
|
136
|
+
[7.4, 2.8, 6.1, 1.9],
|
137
|
+
[7.9, 3.8, 6.4, 2.0],
|
138
|
+
[6.4, 2.8, 5.6, 2.2],
|
139
|
+
[6.3, 2.8, 5.1, 1.5],
|
140
|
+
[6.1, 2.6, 5.6, 1.4],
|
141
|
+
[7.7, 3.0, 6.1, 2.3],
|
142
|
+
[6.3, 3.4, 5.6, 2.4],
|
143
|
+
[6.4, 3.1, 5.5, 1.8],
|
144
|
+
[6.0, 3.0, 4.8, 1.8],
|
145
|
+
[6.9, 3.1, 5.4, 2.1],
|
146
|
+
[6.7, 3.1, 5.6, 2.4],
|
147
|
+
[6.9, 3.1, 5.1, 2.3],
|
148
|
+
[5.8, 2.7, 5.1, 1.9],
|
149
|
+
[6.8, 3.2, 5.9, 2.3],
|
150
|
+
[6.7, 3.3, 5.7, 2.5],
|
151
|
+
[6.7, 3.0, 5.2, 2.3],
|
152
|
+
[6.3, 2.5, 5.0, 1.9],
|
153
|
+
[6.5, 3.0, 5.2, 2.0],
|
154
|
+
[6.2, 3.4, 5.4, 2.3],
|
155
|
+
[5.9, 3.0, 5.1, 1.8],
|
156
|
+
]
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# this example shows the impact of the size of a som on the global error distance
|
2
|
+
require File.dirname(__FILE__) + '/../../lib/ai4r/som/som'
|
3
|
+
require File.dirname(__FILE__) + '/som_data'
|
4
|
+
require 'benchmark'
|
5
|
+
|
6
|
+
10.times do |t|
|
7
|
+
t += 3 # minimum number of nodes
|
8
|
+
|
9
|
+
puts "Nodes: #{t}"
|
10
|
+
som = Ai4r::Som::Som.new 4, 8, Ai4r::Som::TwoPhaseLayer.new(t)
|
11
|
+
som.initiate_map
|
12
|
+
|
13
|
+
puts "global error distance: #{som.global_error(SOM_DATA)}"
|
14
|
+
puts "\ntraining the som\n"
|
15
|
+
|
16
|
+
times = Benchmark.measure do
|
17
|
+
som.train SOM_DATA
|
18
|
+
end
|
19
|
+
|
20
|
+
puts "Elapsed time for training: #{times}"
|
21
|
+
puts "global error distance: #{som.global_error(SOM_DATA)}\n\n"
|
22
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../lib/ai4r/som/som'
|
2
|
+
require File.dirname(__FILE__) + '/som_data'
|
3
|
+
require 'benchmark'
|
4
|
+
|
5
|
+
som = Ai4r::Som::Som.new 4, 8, Ai4r::Som::TwoPhaseLayer.new(10)
|
6
|
+
som.initiate_map
|
7
|
+
|
8
|
+
som.nodes.each do |node|
|
9
|
+
p node.weights
|
10
|
+
end
|
11
|
+
|
12
|
+
puts "global error distance: #{som.global_error(SOM_DATA)}"
|
13
|
+
puts "\ntraining the som\n"
|
14
|
+
|
15
|
+
times = Benchmark.measure do
|
16
|
+
som.train SOM_DATA
|
17
|
+
end
|
18
|
+
|
19
|
+
som.nodes.each do |node|
|
20
|
+
p node.weights
|
21
|
+
end
|
22
|
+
|
23
|
+
puts "Elapsed time for training: #{times}"
|
24
|
+
puts "global error distance: #{som.global_error(SOM_DATA)}\n\n"
|
data/lib/ai4r.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# Data
|
2
|
+
require File.dirname(__FILE__) + "/ai4r/data/data_set"
|
3
|
+
require File.dirname(__FILE__) + "/ai4r/data/statistics"
|
4
|
+
require File.dirname(__FILE__) + "/ai4r/data/proximity"
|
5
|
+
require File.dirname(__FILE__) + "/ai4r/data/parameterizable"
|
6
|
+
# Clusterers
|
7
|
+
require File.dirname(__FILE__) + "/ai4r/clusterers/clusterer"
|
8
|
+
require File.dirname(__FILE__) + "/ai4r/clusterers/k_means"
|
9
|
+
require File.dirname(__FILE__) + "/ai4r/clusterers/bisecting_k_means"
|
10
|
+
require File.dirname(__FILE__) + "/ai4r/clusterers/single_linkage"
|
11
|
+
require File.dirname(__FILE__) + "/ai4r/clusterers/complete_linkage"
|
12
|
+
require File.dirname(__FILE__) + "/ai4r/clusterers/average_linkage"
|
13
|
+
require File.dirname(__FILE__) + "/ai4r/clusterers/weighted_average_linkage"
|
14
|
+
require File.dirname(__FILE__) + "/ai4r/clusterers/centroid_linkage"
|
15
|
+
require File.dirname(__FILE__) + "/ai4r/clusterers/median_linkage"
|
16
|
+
require File.dirname(__FILE__) + "/ai4r/clusterers/ward_linkage"
|
17
|
+
require File.dirname(__FILE__) + "/ai4r/clusterers/diana"
|
18
|
+
# Classifiers
|
19
|
+
require File.dirname(__FILE__) + "/ai4r/classifiers/classifier"
|
20
|
+
require File.dirname(__FILE__) + "/ai4r/classifiers/id3"
|
21
|
+
require File.dirname(__FILE__) + "/ai4r/classifiers/prism"
|
22
|
+
require File.dirname(__FILE__) + "/ai4r/classifiers/one_r"
|
23
|
+
require File.dirname(__FILE__) + "/ai4r/classifiers/zero_r"
|
24
|
+
require File.dirname(__FILE__) + "/ai4r/classifiers/hyperpipes"
|
25
|
+
require File.dirname(__FILE__) + "/ai4r/classifiers/naive_bayes"
|
26
|
+
require File.dirname(__FILE__) + "/ai4r/classifiers/ib1"
|
27
|
+
# Neural networks
|
28
|
+
require File.dirname(__FILE__) + "/ai4r/neural_network/backpropagation"
|
29
|
+
require File.dirname(__FILE__) + "/ai4r/neural_network/hopfield"
|
30
|
+
# Genetic Algorithms
|
31
|
+
require File.dirname(__FILE__) + "/ai4r/genetic_algorithm/genetic_algorithm"
|
32
|
+
# SOM
|
33
|
+
require File.dirname(__FILE__) + "/ai4r/som/som"
|
@@ -0,0 +1,62 @@
|
|
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 File.dirname(__FILE__) + '/../data/parameterizable'
|
11
|
+
|
12
|
+
module Ai4r
|
13
|
+
module Classifiers
|
14
|
+
|
15
|
+
# This class defines a common API for classifiers.
|
16
|
+
# All methods in this class must be implemented in subclasses.
|
17
|
+
class Classifier
|
18
|
+
|
19
|
+
include Ai4r::Data::Parameterizable
|
20
|
+
|
21
|
+
# Build a new classifier, using data examples found in data_set.
|
22
|
+
# The last attribute of each item is considered as the
|
23
|
+
# item class.
|
24
|
+
def build(data_set)
|
25
|
+
raise NotImplementedError
|
26
|
+
end
|
27
|
+
|
28
|
+
# You can evaluate new data, predicting its class.
|
29
|
+
# e.g.
|
30
|
+
# classifier.eval(['New York', '<30', 'F']) # => 'Y'
|
31
|
+
def eval(data)
|
32
|
+
raise NotImplementedError
|
33
|
+
end
|
34
|
+
|
35
|
+
# This method returns the generated rules in ruby code.
|
36
|
+
# e.g.
|
37
|
+
#
|
38
|
+
# classifier.get_rules
|
39
|
+
# # => if age_range=='<30' then marketing_target='Y'
|
40
|
+
# elsif age_range=='[30-50)' and city=='Chicago' then marketing_target='Y'
|
41
|
+
# elsif age_range=='[30-50)' and city=='New York' then marketing_target='N'
|
42
|
+
# elsif age_range=='[50-80]' then marketing_target='N'
|
43
|
+
# elsif age_range=='>80' then marketing_target='Y'
|
44
|
+
# else raise 'There was not enough information during training to do a proper induction for this data element' end
|
45
|
+
#
|
46
|
+
# It is a nice way to inspect induction results, and also to execute them:
|
47
|
+
# age_range = '<30'
|
48
|
+
# city='New York'
|
49
|
+
# marketing_target = nil
|
50
|
+
# eval classifier.get_rules
|
51
|
+
# puts marketing_target
|
52
|
+
# # => 'Y'
|
53
|
+
#
|
54
|
+
# Note, however, that not all classifiers are able to produce rules.
|
55
|
+
# This method is not implemented in such classifiers.
|
56
|
+
def get_rules
|
57
|
+
raise NotImplementedError
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|