ai4r 1.13 → 2.0
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 +7 -0
- data/README.md +174 -0
- data/examples/classifiers/hyperpipes_data.csv +14 -0
- data/examples/classifiers/hyperpipes_example.rb +22 -0
- data/examples/classifiers/ib1_example.rb +12 -0
- data/examples/classifiers/id3_example.rb +15 -10
- data/examples/classifiers/id3_graphviz_example.rb +17 -0
- data/examples/classifiers/logistic_regression_example.rb +11 -0
- data/examples/classifiers/naive_bayes_attributes_example.rb +13 -0
- data/examples/classifiers/naive_bayes_example.rb +12 -13
- data/examples/classifiers/one_r_example.rb +27 -0
- data/examples/classifiers/parameter_tutorial.rb +29 -0
- data/examples/classifiers/prism_nominal_example.rb +15 -0
- data/examples/classifiers/prism_numeric_example.rb +21 -0
- data/examples/classifiers/simple_linear_regression_example.rb +14 -11
- data/examples/classifiers/zero_and_one_r_example.rb +34 -0
- data/examples/classifiers/zero_one_r_data.csv +8 -0
- data/examples/clusterers/clusterer_example.rb +40 -34
- data/examples/clusterers/dbscan_example.rb +17 -0
- data/examples/clusterers/dendrogram_example.rb +17 -0
- data/examples/clusterers/hierarchical_dendrogram_example.rb +20 -0
- data/examples/clusterers/kmeans_custom_example.rb +26 -0
- data/examples/genetic_algorithm/bitstring_example.rb +41 -0
- data/examples/genetic_algorithm/genetic_algorithm_example.rb +26 -18
- data/examples/genetic_algorithm/kmeans_seed_tuning.rb +45 -0
- data/examples/neural_network/backpropagation_example.rb +48 -48
- data/examples/neural_network/hopfield_example.rb +45 -0
- data/examples/neural_network/patterns_with_base_noise.rb +39 -39
- data/examples/neural_network/patterns_with_noise.rb +41 -39
- data/examples/neural_network/train_epochs_callback.rb +25 -0
- data/examples/neural_network/training_patterns.rb +39 -39
- data/examples/neural_network/transformer_text_classification.rb +78 -0
- data/examples/neural_network/xor_example.rb +23 -22
- data/examples/reinforcement/q_learning_example.rb +10 -0
- data/examples/som/som_data.rb +155 -152
- data/examples/som/som_multi_node_example.rb +12 -13
- data/examples/som/som_single_example.rb +12 -15
- data/examples/transformer/decode_classifier_example.rb +68 -0
- data/examples/transformer/deterministic_example.rb +10 -0
- data/examples/transformer/seq2seq_example.rb +16 -0
- data/lib/ai4r/classifiers/classifier.rb +24 -16
- data/lib/ai4r/classifiers/gradient_boosting.rb +64 -0
- data/lib/ai4r/classifiers/hyperpipes.rb +119 -43
- data/lib/ai4r/classifiers/ib1.rb +122 -32
- data/lib/ai4r/classifiers/id3.rb +524 -145
- data/lib/ai4r/classifiers/logistic_regression.rb +96 -0
- data/lib/ai4r/classifiers/multilayer_perceptron.rb +75 -59
- data/lib/ai4r/classifiers/naive_bayes.rb +95 -34
- data/lib/ai4r/classifiers/one_r.rb +112 -44
- data/lib/ai4r/classifiers/prism.rb +167 -76
- data/lib/ai4r/classifiers/random_forest.rb +72 -0
- data/lib/ai4r/classifiers/simple_linear_regression.rb +83 -58
- data/lib/ai4r/classifiers/support_vector_machine.rb +91 -0
- data/lib/ai4r/classifiers/votes.rb +57 -0
- data/lib/ai4r/classifiers/zero_r.rb +71 -30
- data/lib/ai4r/clusterers/average_linkage.rb +46 -27
- data/lib/ai4r/clusterers/bisecting_k_means.rb +50 -44
- data/lib/ai4r/clusterers/centroid_linkage.rb +52 -36
- data/lib/ai4r/clusterers/cluster_tree.rb +50 -0
- data/lib/ai4r/clusterers/clusterer.rb +29 -14
- data/lib/ai4r/clusterers/complete_linkage.rb +42 -31
- data/lib/ai4r/clusterers/dbscan.rb +134 -0
- data/lib/ai4r/clusterers/diana.rb +75 -49
- data/lib/ai4r/clusterers/k_means.rb +270 -135
- data/lib/ai4r/clusterers/median_linkage.rb +49 -33
- data/lib/ai4r/clusterers/single_linkage.rb +196 -88
- data/lib/ai4r/clusterers/ward_linkage.rb +51 -35
- data/lib/ai4r/clusterers/ward_linkage_hierarchical.rb +25 -10
- data/lib/ai4r/clusterers/weighted_average_linkage.rb +48 -32
- data/lib/ai4r/data/data_set.rb +223 -103
- data/lib/ai4r/data/parameterizable.rb +31 -25
- data/lib/ai4r/data/proximity.rb +62 -62
- data/lib/ai4r/data/statistics.rb +46 -35
- data/lib/ai4r/experiment/classifier_evaluator.rb +84 -32
- data/lib/ai4r/experiment/split.rb +39 -0
- data/lib/ai4r/genetic_algorithm/chromosome_base.rb +43 -0
- data/lib/ai4r/genetic_algorithm/genetic_algorithm.rb +92 -170
- data/lib/ai4r/genetic_algorithm/tsp_chromosome.rb +83 -0
- data/lib/ai4r/hmm/hidden_markov_model.rb +134 -0
- data/lib/ai4r/neural_network/activation_functions.rb +37 -0
- data/lib/ai4r/neural_network/backpropagation.rb +399 -134
- data/lib/ai4r/neural_network/hopfield.rb +175 -58
- data/lib/ai4r/neural_network/transformer.rb +194 -0
- data/lib/ai4r/neural_network/weight_initializations.rb +40 -0
- data/lib/ai4r/reinforcement/policy_iteration.rb +66 -0
- data/lib/ai4r/reinforcement/q_learning.rb +51 -0
- data/lib/ai4r/search/a_star.rb +76 -0
- data/lib/ai4r/search/bfs.rb +50 -0
- data/lib/ai4r/search/dfs.rb +50 -0
- data/lib/ai4r/search/mcts.rb +118 -0
- data/lib/ai4r/search.rb +12 -0
- data/lib/ai4r/som/distance_metrics.rb +29 -0
- data/lib/ai4r/som/layer.rb +28 -17
- data/lib/ai4r/som/node.rb +61 -32
- data/lib/ai4r/som/som.rb +158 -41
- data/lib/ai4r/som/two_phase_layer.rb +21 -25
- data/lib/ai4r/version.rb +3 -0
- data/lib/ai4r.rb +57 -28
- metadata +79 -109
- data/README.rdoc +0 -39
- data/test/classifiers/hyperpipes_test.rb +0 -84
- data/test/classifiers/ib1_test.rb +0 -78
- data/test/classifiers/id3_test.rb +0 -220
- data/test/classifiers/multilayer_perceptron_test.rb +0 -79
- data/test/classifiers/naive_bayes_test.rb +0 -43
- data/test/classifiers/one_r_test.rb +0 -62
- data/test/classifiers/prism_test.rb +0 -85
- data/test/classifiers/simple_linear_regression_test.rb +0 -37
- data/test/classifiers/zero_r_test.rb +0 -50
- data/test/clusterers/average_linkage_test.rb +0 -51
- data/test/clusterers/bisecting_k_means_test.rb +0 -66
- data/test/clusterers/centroid_linkage_test.rb +0 -53
- data/test/clusterers/complete_linkage_test.rb +0 -57
- data/test/clusterers/diana_test.rb +0 -69
- data/test/clusterers/k_means_test.rb +0 -167
- data/test/clusterers/median_linkage_test.rb +0 -53
- data/test/clusterers/single_linkage_test.rb +0 -122
- data/test/clusterers/ward_linkage_hierarchical_test.rb +0 -81
- data/test/clusterers/ward_linkage_test.rb +0 -53
- data/test/clusterers/weighted_average_linkage_test.rb +0 -53
- data/test/data/data_set_test.rb +0 -104
- data/test/data/proximity_test.rb +0 -87
- data/test/data/statistics_test.rb +0 -65
- data/test/experiment/classifier_evaluator_test.rb +0 -76
- data/test/genetic_algorithm/chromosome_test.rb +0 -57
- data/test/genetic_algorithm/genetic_algorithm_test.rb +0 -81
- data/test/neural_network/backpropagation_test.rb +0 -82
- data/test/neural_network/hopfield_test.rb +0 -72
- data/test/som/som_test.rb +0 -97
@@ -1,31 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Author:: Sergio Fierens
|
2
4
|
# License:: MPL 1.1
|
3
5
|
# Project:: ai4r
|
4
6
|
# Url:: http://www.ai4r.org/
|
5
7
|
#
|
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
|
+
# You can redistribute it and/or modify it under the terms of
|
9
|
+
# the Mozilla Public License version 1.1 as published by the
|
8
10
|
# Mozilla Foundation at http://www.mozilla.org/MPL/MPL-1.1.txt
|
9
|
-
|
10
11
|
|
11
12
|
TRIANGLE = [
|
12
|
-
[
|
13
|
-
[
|
14
|
-
[
|
15
|
-
[
|
16
|
-
[
|
17
|
-
[
|
18
|
-
[
|
19
|
-
[
|
20
|
-
[
|
21
|
-
[
|
22
|
-
[
|
23
|
-
[
|
24
|
-
[
|
25
|
-
[
|
26
|
-
[
|
13
|
+
[0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
14
|
+
[0, 0, 0, 0, 0, 0, 1, 9, 9, 1, 0, 0, 0, 0, 0, 0],
|
15
|
+
[0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0],
|
16
|
+
[0, 0, 0, 0, 0, 1, 9, 1, 1, 9, 1, 0, 0, 0, 0, 0],
|
17
|
+
[0, 0, 0, 0, 0, 5, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0],
|
18
|
+
[0, 0, 0, 0, 1, 9, 1, 0, 0, 1, 9, 1, 0, 0, 0, 0],
|
19
|
+
[0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0],
|
20
|
+
[0, 0, 0, 1, 9, 1, 0, 0, 0, 0, 1, 9, 1, 0, 0, 0],
|
21
|
+
[0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0],
|
22
|
+
[0, 0, 1, 9, 1, 0, 0, 0, 0, 0, 0, 1, 9, 1, 0, 0],
|
23
|
+
[0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0],
|
24
|
+
[0, 1, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9, 1, 0],
|
25
|
+
[0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0],
|
26
|
+
[1, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9, 1],
|
27
|
+
[5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5],
|
27
28
|
[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
|
28
|
-
]
|
29
|
+
].freeze
|
29
30
|
|
30
31
|
SQUARE = [
|
31
32
|
[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10],
|
@@ -44,25 +45,24 @@ SQUARE = [
|
|
44
45
|
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
45
46
|
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
46
47
|
[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
|
47
|
-
|
48
|
-
]
|
48
|
+
|
49
|
+
].freeze
|
49
50
|
|
50
51
|
CROSS = [
|
51
|
-
[
|
52
|
-
[
|
53
|
-
[
|
54
|
-
[
|
55
|
-
[
|
56
|
-
[
|
57
|
-
[
|
58
|
-
[
|
59
|
-
[
|
60
|
-
[
|
61
|
-
[
|
62
|
-
[
|
63
|
-
[
|
64
|
-
[
|
65
|
-
[
|
66
|
-
[
|
67
|
-
]
|
68
|
-
|
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
|
+
[0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0],
|
59
|
+
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
|
60
|
+
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
|
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
|
+
[0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0]
|
68
|
+
].freeze
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Author:: OpenAI Assistant
|
4
|
+
# License:: MPL 1.1
|
5
|
+
# Project:: ai4r
|
6
|
+
# Url:: http://www.ai4r.org/
|
7
|
+
#
|
8
|
+
# Toy example of using the minimal Transformer encoder for
|
9
|
+
# text classification. We build random sentence embeddings
|
10
|
+
# with the Transformer and train a logistic regression
|
11
|
+
# classifier on a tiny sentiment dataset.
|
12
|
+
|
13
|
+
require_relative '../../lib/ai4r/neural_network/transformer'
|
14
|
+
require_relative '../../lib/ai4r/classifiers/logistic_regression'
|
15
|
+
require_relative '../../lib/ai4r/data/data_set'
|
16
|
+
|
17
|
+
# Vocabulary for our miniature dataset
|
18
|
+
VOCAB = {
|
19
|
+
'good' => 0,
|
20
|
+
'great' => 1,
|
21
|
+
'bad' => 2,
|
22
|
+
'awful' => 3,
|
23
|
+
'movie' => 4,
|
24
|
+
'film' => 5,
|
25
|
+
'<pad>' => 6
|
26
|
+
}.freeze
|
27
|
+
|
28
|
+
MAX_LEN = 2
|
29
|
+
|
30
|
+
# Helper that converts space separated text into an array of token ids
|
31
|
+
# and pads it to MAX_LEN tokens.
|
32
|
+
def encode(text)
|
33
|
+
tokens = text.split.map { |w| VOCAB[w] }
|
34
|
+
tokens.fill(VOCAB['<pad>'], tokens.length...MAX_LEN)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Build encoder only Transformer
|
38
|
+
model = Ai4r::NeuralNetwork::Transformer.new(
|
39
|
+
vocab_size: VOCAB.size,
|
40
|
+
max_len: MAX_LEN
|
41
|
+
)
|
42
|
+
|
43
|
+
train_texts = ['good movie', 'great film', 'bad movie', 'awful film']
|
44
|
+
labels = [1, 1, 0, 0]
|
45
|
+
|
46
|
+
# Obtain sentence embeddings by averaging token representations
|
47
|
+
train_features = train_texts.map do |text|
|
48
|
+
tokens = encode(text)
|
49
|
+
enc = model.eval(tokens)
|
50
|
+
mean = Array.new(model.embed_dim, 0.0)
|
51
|
+
enc.each do |vec|
|
52
|
+
vec.each_with_index { |v, i| mean[i] += v }
|
53
|
+
end
|
54
|
+
mean.map { |v| v / enc.length }
|
55
|
+
end
|
56
|
+
|
57
|
+
data_items = train_features.each_with_index.map { |feat, i| feat + [labels[i]] }
|
58
|
+
labels_names = (0...model.embed_dim).map { |i| "f#{i}" } + ['class']
|
59
|
+
|
60
|
+
dataset = Ai4r::Data::DataSet.new(
|
61
|
+
data_items: data_items,
|
62
|
+
data_labels: labels_names
|
63
|
+
)
|
64
|
+
|
65
|
+
classifier = Ai4r::Classifiers::LogisticRegression.new
|
66
|
+
classifier.set_parameters(lr: 0.5, iterations: 2000).build(dataset)
|
67
|
+
|
68
|
+
puts 'Predictions:'
|
69
|
+
['good film', 'awful movie'].each do |text|
|
70
|
+
tokens = encode(text)
|
71
|
+
enc = model.eval(tokens)
|
72
|
+
mean = Array.new(model.embed_dim, 0.0)
|
73
|
+
enc.each do |vec|
|
74
|
+
vec.each_with_index { |v, i| mean[i] += v }
|
75
|
+
end
|
76
|
+
mean.map! { |v| v / enc.length }
|
77
|
+
puts "#{text} => #{classifier.eval(mean)}"
|
78
|
+
end
|
@@ -1,35 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Author:: Sergio Fierens
|
2
4
|
# License:: MPL 1.1
|
3
5
|
# Project:: ai4r
|
4
6
|
# Url:: http://www.ai4r.org/
|
5
7
|
#
|
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
|
+
# You can redistribute it and/or modify it under the terms of
|
9
|
+
# the Mozilla Public License version 1.1 as published by the
|
8
10
|
# Mozilla Foundation at http://www.mozilla.org/MPL/MPL-1.1.txt
|
9
11
|
|
10
|
-
|
12
|
+
require_relative '../../lib/ai4r/neural_network/backpropagation'
|
11
13
|
require 'benchmark'
|
12
14
|
|
13
15
|
times = Benchmark.measure do
|
16
|
+
srand 1
|
17
|
+
|
18
|
+
net = Ai4r::NeuralNetwork::Backpropagation.new([2, 2, 1])
|
19
|
+
|
20
|
+
puts 'Training the network, please wait.'
|
21
|
+
2001.times do |i|
|
22
|
+
net.train([0, 0], [0])
|
23
|
+
net.train([0, 1], [1])
|
24
|
+
net.train([1, 0], [1])
|
25
|
+
error = net.train([1, 1], [0])
|
26
|
+
puts "Error after iteration #{i}:\t#{error}" if (i % 200).zero?
|
27
|
+
end
|
14
28
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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}"
|
29
|
+
puts 'Test data'
|
30
|
+
puts "[0,0] = > #{net.eval([0, 0]).inspect}"
|
31
|
+
puts "[0,1] = > #{net.eval([0, 1]).inspect}"
|
32
|
+
puts "[1,0] = > #{net.eval([1, 0]).inspect}"
|
33
|
+
puts "[1,1] = > #{net.eval([1, 1]).inspect}"
|
33
34
|
end
|
34
35
|
|
35
|
-
|
36
|
+
puts "Elapsed time: #{times}"
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'ai4r/reinforcement/q_learning'
|
2
|
+
|
3
|
+
agent = Ai4r::Reinforcement::QLearning.new
|
4
|
+
agent.set_parameters(learning_rate: 0.5, discount: 1.0, exploration: 0.0)
|
5
|
+
|
6
|
+
# Simple two-state MDP
|
7
|
+
agent.update(:s1, :a, 0, :s2)
|
8
|
+
agent.update(:s1, :b, 1, :s1)
|
9
|
+
|
10
|
+
puts "Best action from s1: #{agent.choose_action(:s1)}"
|
data/examples/som/som_data.rb
CHANGED
@@ -1,156 +1,159 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# data is from the iris dataset (http://archive.ics.uci.edu/ml/datasets/Iris)
|
2
4
|
# it is the full dataset, removing the last column
|
3
|
-
# website provides additional information on the dataset itself
|
5
|
+
# website provides additional information on the dataset itself
|
6
|
+
# (attributes, class distribution, etc)
|
4
7
|
|
5
8
|
SOM_DATA = [
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
]
|
9
|
+
[5.1, 3.5, 1.4, 0.2],
|
10
|
+
[4.9, 3.0, 1.4, 0.2],
|
11
|
+
[4.7, 3.2, 1.3, 0.2],
|
12
|
+
[4.6, 3.1, 1.5, 0.2],
|
13
|
+
[5.0, 3.6, 1.4, 0.2],
|
14
|
+
[5.4, 3.9, 1.7, 0.4],
|
15
|
+
[4.6, 3.4, 1.4, 0.3],
|
16
|
+
[5.0, 3.4, 1.5, 0.2],
|
17
|
+
[4.4, 2.9, 1.4, 0.2],
|
18
|
+
[4.9, 3.1, 1.5, 0.1],
|
19
|
+
[5.4, 3.7, 1.5, 0.2],
|
20
|
+
[4.8, 3.4, 1.6, 0.2],
|
21
|
+
[4.8, 3.0, 1.4, 0.1],
|
22
|
+
[4.3, 3.0, 1.1, 0.1],
|
23
|
+
[5.8, 4.0, 1.2, 0.2],
|
24
|
+
[5.7, 4.4, 1.5, 0.4],
|
25
|
+
[5.4, 3.9, 1.3, 0.4],
|
26
|
+
[5.1, 3.5, 1.4, 0.3],
|
27
|
+
[5.7, 3.8, 1.7, 0.3],
|
28
|
+
[5.1, 3.8, 1.5, 0.3],
|
29
|
+
[5.4, 3.4, 1.7, 0.2],
|
30
|
+
[5.1, 3.7, 1.5, 0.4],
|
31
|
+
[4.6, 3.6, 1.0, 0.2],
|
32
|
+
[5.1, 3.3, 1.7, 0.5],
|
33
|
+
[4.8, 3.4, 1.9, 0.2],
|
34
|
+
[5.0, 3.0, 1.6, 0.2],
|
35
|
+
[5.0, 3.4, 1.6, 0.4],
|
36
|
+
[5.2, 3.5, 1.5, 0.2],
|
37
|
+
[5.2, 3.4, 1.4, 0.2],
|
38
|
+
[4.7, 3.2, 1.6, 0.2],
|
39
|
+
[4.8, 3.1, 1.6, 0.2],
|
40
|
+
[5.4, 3.4, 1.5, 0.4],
|
41
|
+
[5.2, 4.1, 1.5, 0.1],
|
42
|
+
[5.5, 4.2, 1.4, 0.2],
|
43
|
+
[4.9, 3.1, 1.5, 0.1],
|
44
|
+
[5.0, 3.2, 1.2, 0.2],
|
45
|
+
[5.5, 3.5, 1.3, 0.2],
|
46
|
+
[4.9, 3.1, 1.5, 0.1],
|
47
|
+
[4.4, 3.0, 1.3, 0.2],
|
48
|
+
[5.1, 3.4, 1.5, 0.2],
|
49
|
+
[5.0, 3.5, 1.3, 0.3],
|
50
|
+
[4.5, 2.3, 1.3, 0.3],
|
51
|
+
[4.4, 3.2, 1.3, 0.2],
|
52
|
+
[5.0, 3.5, 1.6, 0.6],
|
53
|
+
[5.1, 3.8, 1.9, 0.4],
|
54
|
+
[4.8, 3.0, 1.4, 0.3],
|
55
|
+
[5.1, 3.8, 1.6, 0.2],
|
56
|
+
[4.6, 3.2, 1.4, 0.2],
|
57
|
+
[5.3, 3.7, 1.5, 0.2],
|
58
|
+
[5.0, 3.3, 1.4, 0.2],
|
59
|
+
[7.0, 3.2, 4.7, 1.4],
|
60
|
+
[6.4, 3.2, 4.5, 1.5],
|
61
|
+
[6.9, 3.1, 4.9, 1.5],
|
62
|
+
[5.5, 2.3, 4.0, 1.3],
|
63
|
+
[6.5, 2.8, 4.6, 1.5],
|
64
|
+
[5.7, 2.8, 4.5, 1.3],
|
65
|
+
[6.3, 3.3, 4.7, 1.6],
|
66
|
+
[4.9, 2.4, 3.3, 1.0],
|
67
|
+
[6.6, 2.9, 4.6, 1.3],
|
68
|
+
[5.2, 2.7, 3.9, 1.4],
|
69
|
+
[5.0, 2.0, 3.5, 1.0],
|
70
|
+
[5.9, 3.0, 4.2, 1.5],
|
71
|
+
[6.0, 2.2, 4.0, 1.0],
|
72
|
+
[6.1, 2.9, 4.7, 1.4],
|
73
|
+
[5.6, 2.9, 3.6, 1.3],
|
74
|
+
[6.7, 3.1, 4.4, 1.4],
|
75
|
+
[5.6, 3.0, 4.5, 1.5],
|
76
|
+
[5.8, 2.7, 4.1, 1.0],
|
77
|
+
[6.2, 2.2, 4.5, 1.5],
|
78
|
+
[5.6, 2.5, 3.9, 1.1],
|
79
|
+
[5.9, 3.2, 4.8, 1.8],
|
80
|
+
[6.1, 2.8, 4.0, 1.3],
|
81
|
+
[6.3, 2.5, 4.9, 1.5],
|
82
|
+
[6.1, 2.8, 4.7, 1.2],
|
83
|
+
[6.4, 2.9, 4.3, 1.3],
|
84
|
+
[6.6, 3.0, 4.4, 1.4],
|
85
|
+
[6.8, 2.8, 4.8, 1.4],
|
86
|
+
[6.7, 3.0, 5.0, 1.7],
|
87
|
+
[6.0, 2.9, 4.5, 1.5],
|
88
|
+
[5.7, 2.6, 3.5, 1.0],
|
89
|
+
[5.5, 2.4, 3.8, 1.1],
|
90
|
+
[5.5, 2.4, 3.7, 1.0],
|
91
|
+
[5.8, 2.7, 3.9, 1.2],
|
92
|
+
[6.0, 2.7, 5.1, 1.6],
|
93
|
+
[5.4, 3.0, 4.5, 1.5],
|
94
|
+
[6.0, 3.4, 4.5, 1.6],
|
95
|
+
[6.7, 3.1, 4.7, 1.5],
|
96
|
+
[6.3, 2.3, 4.4, 1.3],
|
97
|
+
[5.6, 3.0, 4.1, 1.3],
|
98
|
+
[5.5, 2.5, 4.0, 1.3],
|
99
|
+
[5.5, 2.6, 4.4, 1.2],
|
100
|
+
[6.1, 3.0, 4.6, 1.4],
|
101
|
+
[5.8, 2.6, 4.0, 1.2],
|
102
|
+
[5.0, 2.3, 3.3, 1.0],
|
103
|
+
[5.6, 2.7, 4.2, 1.3],
|
104
|
+
[5.7, 3.0, 4.2, 1.2],
|
105
|
+
[5.7, 2.9, 4.2, 1.3],
|
106
|
+
[6.2, 2.9, 4.3, 1.3],
|
107
|
+
[5.1, 2.5, 3.0, 1.1],
|
108
|
+
[5.7, 2.8, 4.1, 1.3],
|
109
|
+
[6.3, 3.3, 6.0, 2.5],
|
110
|
+
[5.8, 2.7, 5.1, 1.9],
|
111
|
+
[7.1, 3.0, 5.9, 2.1],
|
112
|
+
[6.3, 2.9, 5.6, 1.8],
|
113
|
+
[6.5, 3.0, 5.8, 2.2],
|
114
|
+
[7.6, 3.0, 6.6, 2.1],
|
115
|
+
[4.9, 2.5, 4.5, 1.7],
|
116
|
+
[7.3, 2.9, 6.3, 1.8],
|
117
|
+
[6.7, 2.5, 5.8, 1.8],
|
118
|
+
[7.2, 3.6, 6.1, 2.5],
|
119
|
+
[6.5, 3.2, 5.1, 2.0],
|
120
|
+
[6.4, 2.7, 5.3, 1.9],
|
121
|
+
[6.8, 3.0, 5.5, 2.1],
|
122
|
+
[5.7, 2.5, 5.0, 2.0],
|
123
|
+
[5.8, 2.8, 5.1, 2.4],
|
124
|
+
[6.4, 3.2, 5.3, 2.3],
|
125
|
+
[6.5, 3.0, 5.5, 1.8],
|
126
|
+
[7.7, 3.8, 6.7, 2.2],
|
127
|
+
[7.7, 2.6, 6.9, 2.3],
|
128
|
+
[6.0, 2.2, 5.0, 1.5],
|
129
|
+
[6.9, 3.2, 5.7, 2.3],
|
130
|
+
[5.6, 2.8, 4.9, 2.0],
|
131
|
+
[7.7, 2.8, 6.7, 2.0],
|
132
|
+
[6.3, 2.7, 4.9, 1.8],
|
133
|
+
[6.7, 3.3, 5.7, 2.1],
|
134
|
+
[7.2, 3.2, 6.0, 1.8],
|
135
|
+
[6.2, 2.8, 4.8, 1.8],
|
136
|
+
[6.1, 3.0, 4.9, 1.8],
|
137
|
+
[6.4, 2.8, 5.6, 2.1],
|
138
|
+
[7.2, 3.0, 5.8, 1.6],
|
139
|
+
[7.4, 2.8, 6.1, 1.9],
|
140
|
+
[7.9, 3.8, 6.4, 2.0],
|
141
|
+
[6.4, 2.8, 5.6, 2.2],
|
142
|
+
[6.3, 2.8, 5.1, 1.5],
|
143
|
+
[6.1, 2.6, 5.6, 1.4],
|
144
|
+
[7.7, 3.0, 6.1, 2.3],
|
145
|
+
[6.3, 3.4, 5.6, 2.4],
|
146
|
+
[6.4, 3.1, 5.5, 1.8],
|
147
|
+
[6.0, 3.0, 4.8, 1.8],
|
148
|
+
[6.9, 3.1, 5.4, 2.1],
|
149
|
+
[6.7, 3.1, 5.6, 2.4],
|
150
|
+
[6.9, 3.1, 5.1, 2.3],
|
151
|
+
[5.8, 2.7, 5.1, 1.9],
|
152
|
+
[6.8, 3.2, 5.9, 2.3],
|
153
|
+
[6.7, 3.3, 5.7, 2.5],
|
154
|
+
[6.7, 3.0, 5.2, 2.3],
|
155
|
+
[6.3, 2.5, 5.0, 1.9],
|
156
|
+
[6.5, 3.0, 5.2, 2.0],
|
157
|
+
[6.2, 3.4, 5.4, 2.3],
|
158
|
+
[5.9, 3.0, 5.1, 1.8]
|
159
|
+
].freeze
|
@@ -1,22 +1,21 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Demonstrates how map size impacts error and uses early stopping.
|
4
|
+
require_relative '../../lib/ai4r/som/som'
|
5
|
+
require_relative 'som_data'
|
4
6
|
require 'benchmark'
|
5
7
|
|
6
8
|
10.times do |t|
|
7
|
-
t
|
9
|
+
nodes = t + 3 # minimum number of nodes
|
8
10
|
|
9
|
-
puts "Nodes: #{
|
10
|
-
som = Ai4r::Som::Som.new 4, 8, Ai4r::Som::TwoPhaseLayer.new(
|
11
|
+
puts "Nodes: #{nodes}"
|
12
|
+
som = Ai4r::Som::Som.new 4, 8, 8, Ai4r::Som::TwoPhaseLayer.new(nodes)
|
11
13
|
som.initiate_map
|
12
14
|
|
13
|
-
puts "
|
14
|
-
puts "\ntraining the som\n"
|
15
|
-
|
15
|
+
puts "Initial error: #{som.global_error(SOM_DATA)}"
|
16
16
|
times = Benchmark.measure do
|
17
|
-
som.train
|
17
|
+
som.train(SOM_DATA, error_threshold: 1000)
|
18
18
|
end
|
19
|
-
|
20
19
|
puts "Elapsed time for training: #{times}"
|
21
|
-
puts "
|
22
|
-
end
|
20
|
+
puts "Final error: #{som.global_error(SOM_DATA)}\n\n"
|
21
|
+
end
|
@@ -1,24 +1,21 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../lib/ai4r/som/som'
|
4
|
+
require_relative 'som_data'
|
3
5
|
require 'benchmark'
|
4
6
|
|
5
|
-
|
7
|
+
# Train a small SOM and stop early when the global error drops below 1000.
|
8
|
+
som = Ai4r::Som::Som.new 4, 8, 8, Ai4r::Som::TwoPhaseLayer.new(10)
|
6
9
|
som.initiate_map
|
7
10
|
|
8
|
-
som.
|
9
|
-
p node.weights
|
10
|
-
end
|
11
|
-
|
12
|
-
puts "global error distance: #{som.global_error(SOM_DATA)}"
|
13
|
-
puts "\ntraining the som\n"
|
11
|
+
puts "Initial global error: #{som.global_error(SOM_DATA)}"
|
14
12
|
|
13
|
+
puts "\nTraining the SOM (early stopping threshold = 1000)\n"
|
15
14
|
times = Benchmark.measure do
|
16
|
-
som.train
|
17
|
-
|
18
|
-
|
19
|
-
som.nodes.each do |node|
|
20
|
-
p node.weights
|
15
|
+
som.train(SOM_DATA, error_threshold: 1000) do |error|
|
16
|
+
puts "Epoch #{som.epoch}: error = #{error}"
|
17
|
+
end
|
21
18
|
end
|
22
19
|
|
23
20
|
puts "Elapsed time for training: #{times}"
|
24
|
-
puts "global error
|
21
|
+
puts "Final global error: #{som.global_error(SOM_DATA)}\n"
|