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
metadata
CHANGED
@@ -1,66 +1,90 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: ai4r
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease: false
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 13
|
9
|
-
version: "1.13"
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '2.0'
|
10
5
|
platform: ruby
|
11
|
-
authors:
|
6
|
+
authors:
|
12
7
|
- Sergio Fierens
|
13
|
-
autorequire:
|
14
8
|
bindir: bin
|
15
9
|
cert_chain: []
|
16
|
-
|
17
|
-
date: 2014-02-05 00:00:00 -06:00
|
18
|
-
default_executable:
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
19
11
|
dependencies: []
|
12
|
+
description: |
|
13
|
+
AI4R is a lightweight, educational Ruby library featuring clean implementations of core machine learning and AI algorithms—such as decision trees, neural networks, k-means, genetic algorithms, and even a bit size Transformers architecture covering encoder, decoder, and seq2seq variations. Designed with simplicity and clarity in mind, this library is ideal for students, educators, and developers who want to understand these algorithms line by line.
|
20
14
|
|
21
|
-
|
22
|
-
email:
|
15
|
+
With no external dependencies, no GPU support, and no production overhead, AI4R serves as a practical and transparent way to explore the foundations of AI in Ruby. It is a long-maintained open-source effort to bring accessible, hands-on machine learning to the Ruby community.
|
23
16
|
executables: []
|
24
|
-
|
25
17
|
extensions: []
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
18
|
+
extra_rdoc_files:
|
19
|
+
- README.md
|
20
|
+
files:
|
21
|
+
- README.md
|
22
|
+
- examples/classifiers/hyperpipes_data.csv
|
23
|
+
- examples/classifiers/hyperpipes_example.rb
|
24
|
+
- examples/classifiers/ib1_example.rb
|
30
25
|
- examples/classifiers/id3_data.csv
|
31
26
|
- examples/classifiers/id3_example.rb
|
27
|
+
- examples/classifiers/id3_graphviz_example.rb
|
28
|
+
- examples/classifiers/logistic_regression_example.rb
|
29
|
+
- examples/classifiers/naive_bayes_attributes_example.rb
|
32
30
|
- examples/classifiers/naive_bayes_data.csv
|
33
31
|
- examples/classifiers/naive_bayes_example.rb
|
32
|
+
- examples/classifiers/one_r_example.rb
|
33
|
+
- examples/classifiers/parameter_tutorial.rb
|
34
|
+
- examples/classifiers/prism_nominal_example.rb
|
35
|
+
- examples/classifiers/prism_numeric_example.rb
|
34
36
|
- examples/classifiers/results.txt
|
35
37
|
- examples/classifiers/simple_linear_regression_example.csv
|
36
38
|
- examples/classifiers/simple_linear_regression_example.rb
|
39
|
+
- examples/classifiers/zero_and_one_r_example.rb
|
40
|
+
- examples/classifiers/zero_one_r_data.csv
|
37
41
|
- examples/clusterers/clusterer_example.rb
|
42
|
+
- examples/clusterers/dbscan_example.rb
|
43
|
+
- examples/clusterers/dendrogram_example.rb
|
44
|
+
- examples/clusterers/hierarchical_dendrogram_example.rb
|
45
|
+
- examples/clusterers/kmeans_custom_example.rb
|
46
|
+
- examples/genetic_algorithm/bitstring_example.rb
|
38
47
|
- examples/genetic_algorithm/genetic_algorithm_example.rb
|
48
|
+
- examples/genetic_algorithm/kmeans_seed_tuning.rb
|
39
49
|
- examples/genetic_algorithm/travel_cost.csv
|
40
50
|
- examples/neural_network/backpropagation_example.rb
|
51
|
+
- examples/neural_network/hopfield_example.rb
|
41
52
|
- examples/neural_network/patterns_with_base_noise.rb
|
42
53
|
- examples/neural_network/patterns_with_noise.rb
|
54
|
+
- examples/neural_network/train_epochs_callback.rb
|
43
55
|
- examples/neural_network/training_patterns.rb
|
56
|
+
- examples/neural_network/transformer_text_classification.rb
|
44
57
|
- examples/neural_network/xor_example.rb
|
58
|
+
- examples/reinforcement/q_learning_example.rb
|
45
59
|
- examples/som/som_data.rb
|
46
60
|
- examples/som/som_multi_node_example.rb
|
47
61
|
- examples/som/som_single_example.rb
|
62
|
+
- examples/transformer/decode_classifier_example.rb
|
63
|
+
- examples/transformer/deterministic_example.rb
|
64
|
+
- examples/transformer/seq2seq_example.rb
|
48
65
|
- lib/ai4r.rb
|
49
66
|
- lib/ai4r/classifiers/classifier.rb
|
67
|
+
- lib/ai4r/classifiers/gradient_boosting.rb
|
50
68
|
- lib/ai4r/classifiers/hyperpipes.rb
|
51
69
|
- lib/ai4r/classifiers/ib1.rb
|
52
70
|
- lib/ai4r/classifiers/id3.rb
|
71
|
+
- lib/ai4r/classifiers/logistic_regression.rb
|
53
72
|
- lib/ai4r/classifiers/multilayer_perceptron.rb
|
54
73
|
- lib/ai4r/classifiers/naive_bayes.rb
|
55
74
|
- lib/ai4r/classifiers/one_r.rb
|
56
75
|
- lib/ai4r/classifiers/prism.rb
|
76
|
+
- lib/ai4r/classifiers/random_forest.rb
|
57
77
|
- lib/ai4r/classifiers/simple_linear_regression.rb
|
78
|
+
- lib/ai4r/classifiers/support_vector_machine.rb
|
79
|
+
- lib/ai4r/classifiers/votes.rb
|
58
80
|
- lib/ai4r/classifiers/zero_r.rb
|
59
81
|
- lib/ai4r/clusterers/average_linkage.rb
|
60
82
|
- lib/ai4r/clusterers/bisecting_k_means.rb
|
61
83
|
- lib/ai4r/clusterers/centroid_linkage.rb
|
84
|
+
- lib/ai4r/clusterers/cluster_tree.rb
|
62
85
|
- lib/ai4r/clusterers/clusterer.rb
|
63
86
|
- lib/ai4r/clusterers/complete_linkage.rb
|
87
|
+
- lib/ai4r/clusterers/dbscan.rb
|
64
88
|
- lib/ai4r/clusterers/diana.rb
|
65
89
|
- lib/ai4r/clusterers/k_means.rb
|
66
90
|
- lib/ai4r/clusterers/median_linkage.rb
|
@@ -73,104 +97,50 @@ files:
|
|
73
97
|
- lib/ai4r/data/proximity.rb
|
74
98
|
- lib/ai4r/data/statistics.rb
|
75
99
|
- lib/ai4r/experiment/classifier_evaluator.rb
|
100
|
+
- lib/ai4r/experiment/split.rb
|
101
|
+
- lib/ai4r/genetic_algorithm/chromosome_base.rb
|
76
102
|
- lib/ai4r/genetic_algorithm/genetic_algorithm.rb
|
103
|
+
- lib/ai4r/genetic_algorithm/tsp_chromosome.rb
|
104
|
+
- lib/ai4r/hmm/hidden_markov_model.rb
|
105
|
+
- lib/ai4r/neural_network/activation_functions.rb
|
77
106
|
- lib/ai4r/neural_network/backpropagation.rb
|
78
107
|
- lib/ai4r/neural_network/hopfield.rb
|
108
|
+
- lib/ai4r/neural_network/transformer.rb
|
109
|
+
- lib/ai4r/neural_network/weight_initializations.rb
|
110
|
+
- lib/ai4r/reinforcement/policy_iteration.rb
|
111
|
+
- lib/ai4r/reinforcement/q_learning.rb
|
112
|
+
- lib/ai4r/search.rb
|
113
|
+
- lib/ai4r/search/a_star.rb
|
114
|
+
- lib/ai4r/search/bfs.rb
|
115
|
+
- lib/ai4r/search/dfs.rb
|
116
|
+
- lib/ai4r/search/mcts.rb
|
117
|
+
- lib/ai4r/som/distance_metrics.rb
|
79
118
|
- lib/ai4r/som/layer.rb
|
80
119
|
- lib/ai4r/som/node.rb
|
81
120
|
- lib/ai4r/som/som.rb
|
82
121
|
- lib/ai4r/som/two_phase_layer.rb
|
83
|
-
-
|
84
|
-
|
85
|
-
|
86
|
-
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
- test/classifiers/prism_test.rb
|
91
|
-
- test/classifiers/simple_linear_regression_test.rb
|
92
|
-
- test/classifiers/zero_r_test.rb
|
93
|
-
- test/clusterers/average_linkage_test.rb
|
94
|
-
- test/clusterers/bisecting_k_means_test.rb
|
95
|
-
- test/clusterers/centroid_linkage_test.rb
|
96
|
-
- test/clusterers/complete_linkage_test.rb
|
97
|
-
- test/clusterers/diana_test.rb
|
98
|
-
- test/clusterers/k_means_test.rb
|
99
|
-
- test/clusterers/median_linkage_test.rb
|
100
|
-
- test/clusterers/single_linkage_test.rb
|
101
|
-
- test/clusterers/ward_linkage_hierarchical_test.rb
|
102
|
-
- test/clusterers/ward_linkage_test.rb
|
103
|
-
- test/clusterers/weighted_average_linkage_test.rb
|
104
|
-
- test/data/data_set_test.rb
|
105
|
-
- test/data/proximity_test.rb
|
106
|
-
- test/data/statistics_test.rb
|
107
|
-
- test/experiment/classifier_evaluator_test.rb
|
108
|
-
- test/genetic_algorithm/chromosome_test.rb
|
109
|
-
- test/genetic_algorithm/genetic_algorithm_test.rb
|
110
|
-
- test/neural_network/backpropagation_test.rb
|
111
|
-
- test/neural_network/hopfield_test.rb
|
112
|
-
- test/som/som_test.rb
|
113
|
-
has_rdoc: true
|
114
|
-
homepage: http://www.ai4r.org
|
115
|
-
licenses: []
|
116
|
-
|
117
|
-
post_install_message:
|
122
|
+
- lib/ai4r/version.rb
|
123
|
+
homepage: https://github.com/SergioFierens/ai4r
|
124
|
+
licenses:
|
125
|
+
- Unlicense
|
126
|
+
metadata:
|
127
|
+
source_code_uri: https://github.com/SergioFierens/ai4r
|
128
|
+
rubygems_mfa_required: 'true'
|
118
129
|
rdoc_options: []
|
119
|
-
|
120
|
-
require_paths:
|
130
|
+
require_paths:
|
121
131
|
- lib
|
122
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
123
|
-
|
124
|
-
requirements:
|
132
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
125
134
|
- - ">="
|
126
|
-
- !ruby/object:Gem::Version
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
version: "0"
|
131
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
|
-
none: false
|
133
|
-
requirements:
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '3.1'
|
137
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
134
139
|
- - ">="
|
135
|
-
- !ruby/object:Gem::Version
|
136
|
-
|
137
|
-
segments:
|
138
|
-
- 0
|
139
|
-
version: "0"
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
140
142
|
requirements: []
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
specification_version: 3
|
146
|
-
summary: Ruby algorithm implementations covering several Artificial intelligence fields, including Genetic algorithms, Neural Networks, machine learning, and clustering.
|
147
|
-
test_files:
|
148
|
-
- test/classifiers/hyperpipes_test.rb
|
149
|
-
- test/classifiers/ib1_test.rb
|
150
|
-
- test/classifiers/id3_test.rb
|
151
|
-
- test/classifiers/multilayer_perceptron_test.rb
|
152
|
-
- test/classifiers/naive_bayes_test.rb
|
153
|
-
- test/classifiers/one_r_test.rb
|
154
|
-
- test/classifiers/prism_test.rb
|
155
|
-
- test/classifiers/simple_linear_regression_test.rb
|
156
|
-
- test/classifiers/zero_r_test.rb
|
157
|
-
- test/clusterers/average_linkage_test.rb
|
158
|
-
- test/clusterers/bisecting_k_means_test.rb
|
159
|
-
- test/clusterers/centroid_linkage_test.rb
|
160
|
-
- test/clusterers/complete_linkage_test.rb
|
161
|
-
- test/clusterers/diana_test.rb
|
162
|
-
- test/clusterers/k_means_test.rb
|
163
|
-
- test/clusterers/median_linkage_test.rb
|
164
|
-
- test/clusterers/single_linkage_test.rb
|
165
|
-
- test/clusterers/ward_linkage_hierarchical_test.rb
|
166
|
-
- test/clusterers/ward_linkage_test.rb
|
167
|
-
- test/clusterers/weighted_average_linkage_test.rb
|
168
|
-
- test/data/data_set_test.rb
|
169
|
-
- test/data/proximity_test.rb
|
170
|
-
- test/data/statistics_test.rb
|
171
|
-
- test/experiment/classifier_evaluator_test.rb
|
172
|
-
- test/genetic_algorithm/chromosome_test.rb
|
173
|
-
- test/genetic_algorithm/genetic_algorithm_test.rb
|
174
|
-
- test/neural_network/backpropagation_test.rb
|
175
|
-
- test/neural_network/hopfield_test.rb
|
176
|
-
- test/som/som_test.rb
|
143
|
+
rubygems_version: 3.6.9
|
144
|
+
specification_version: 4
|
145
|
+
summary: Minimalist Ruby library for learning a broad range of ML and AI algorithms.
|
146
|
+
test_files: []
|
data/README.rdoc
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
= Introduction
|
2
|
-
|
3
|
-
This project aims to produce ruby implementations of algorithms covering several Artificial intelligence fields.
|
4
|
-
|
5
|
-
= Where can I find the lastest code and info on this project?
|
6
|
-
|
7
|
-
http://www.ai4r.org
|
8
|
-
|
9
|
-
= How to install
|
10
|
-
|
11
|
-
1. Install the gem:
|
12
|
-
|
13
|
-
gem install ai4r
|
14
|
-
|
15
|
-
2. Include require statements in your code:
|
16
|
-
|
17
|
-
require "rubygems"
|
18
|
-
require "ai4r"
|
19
|
-
|
20
|
-
= More Info
|
21
|
-
|
22
|
-
* AI4R Project site: http://www.ai4r.org
|
23
|
-
* RDoc site: http://www.ai4r.org/rdoc/index.html
|
24
|
-
|
25
|
-
= Contact
|
26
|
-
|
27
|
-
If you have questions or constructive comments about this project send it to me:
|
28
|
-
{Sergio Fierens}[https://github.com/SergioFierens], email address: (sergio (at) gmail (dot) com).
|
29
|
-
|
30
|
-
= Contributors
|
31
|
-
|
32
|
-
This project was created and is maintained by {Sergio Fierens}[https://github.com/SergioFierens].
|
33
|
-
There are other (great and absolutely cool) people who have donated time and code to make this project better. You can check out the complete AI4R contributors list: http://github.com/SergioFierens/ai4r/graphs/contributors.
|
34
|
-
|
35
|
-
= Disclaimer
|
36
|
-
|
37
|
-
This software is provided "as is" and without any express or implied warranties,
|
38
|
-
including, without limitation, the implied warranties of merchantibility and
|
39
|
-
fitness for a particular purpose.
|
@@ -1,84 +0,0 @@
|
|
1
|
-
# Author:: Sergio Fierens
|
2
|
-
# License:: MPL 1.1
|
3
|
-
# Project:: ai4r
|
4
|
-
# Url:: http://www.ai4r.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 'ai4r/classifiers/hyperpipes'
|
11
|
-
require 'test/unit'
|
12
|
-
|
13
|
-
class Ai4r::Classifiers::Hyperpipes
|
14
|
-
attr_accessor :data_set, :pipes
|
15
|
-
end
|
16
|
-
|
17
|
-
include Ai4r::Classifiers
|
18
|
-
include Ai4r::Data
|
19
|
-
|
20
|
-
class HyperpipesTest < Test::Unit::TestCase
|
21
|
-
|
22
|
-
@@data_labels = [ 'city', 'age', 'gender', 'marketing_target' ]
|
23
|
-
|
24
|
-
@@data_items = [['New York', 25, 'M', 'Y'],
|
25
|
-
['New York', 23, 'M', 'Y'],
|
26
|
-
['New York', 18, 'M', 'Y'],
|
27
|
-
['Chicago', 43, 'M', 'Y'],
|
28
|
-
['New York', 34, 'F', 'N'],
|
29
|
-
['Chicago', 33, 'F', 'Y'],
|
30
|
-
['New York', 31, 'F', 'N'],
|
31
|
-
['Chicago', 55, 'M', 'N'],
|
32
|
-
['New York', 58, 'F', 'N'],
|
33
|
-
['New York', 59, 'M', 'N'],
|
34
|
-
['Chicago', 71, 'M', 'N'],
|
35
|
-
['New York', 60, 'F', 'N'],
|
36
|
-
['Chicago', 85, 'F', 'Y']
|
37
|
-
]
|
38
|
-
|
39
|
-
|
40
|
-
def setup
|
41
|
-
Hyperpipes.send(:public, *Hyperpipes.protected_instance_methods)
|
42
|
-
@data_set = DataSet.new(:data_items => @@data_items, :data_labels => @@data_labels)
|
43
|
-
end
|
44
|
-
|
45
|
-
def test_build_pipe
|
46
|
-
classifier = Hyperpipes.new
|
47
|
-
assert_equal [{}, {:max=>-1.0/0, :min=>1.0/0}, {}], classifier.build_pipe(@data_set)
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_get_rules
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
def test_build
|
55
|
-
assert_raise(ArgumentError) { Hyperpipes.new.build(DataSet.new) }
|
56
|
-
classifier = Hyperpipes.new.build(@data_set)
|
57
|
-
assert classifier.pipes.include?("Y")
|
58
|
-
assert classifier.pipes.include?("N")
|
59
|
-
end
|
60
|
-
|
61
|
-
def test_eval
|
62
|
-
classifier = Hyperpipes.new.build(@data_set)
|
63
|
-
assert classifier
|
64
|
-
assert_equal('N', classifier.eval(['Chicago', 55, 'M']))
|
65
|
-
assert_equal('N', classifier.eval(['New York', 35, 'F']))
|
66
|
-
assert_equal('Y', classifier.eval(['New York', 25, 'M']))
|
67
|
-
assert_equal('Y', classifier.eval(['Chicago', 85, 'F']))
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_get_rules
|
71
|
-
classifier = Hyperpipes.new.build(@data_set)
|
72
|
-
age = 28
|
73
|
-
gender = "M"
|
74
|
-
marketing_target = nil
|
75
|
-
eval classifier.get_rules
|
76
|
-
assert_equal 'Y', marketing_target
|
77
|
-
age = 44
|
78
|
-
city='New York'
|
79
|
-
eval classifier.get_rules
|
80
|
-
assert_equal 'N', marketing_target
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
|
@@ -1,78 +0,0 @@
|
|
1
|
-
# Author:: Sergio Fierens
|
2
|
-
# License:: MPL 1.1
|
3
|
-
# Project:: ai4r
|
4
|
-
# Url:: http://www.ai4r.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 'ai4r/classifiers/ib1'
|
11
|
-
require 'test/unit'
|
12
|
-
|
13
|
-
class Ai4r::Classifiers::IB1
|
14
|
-
attr_accessor :data_set, :min_values, :max_values
|
15
|
-
end
|
16
|
-
|
17
|
-
include Ai4r::Classifiers
|
18
|
-
include Ai4r::Data
|
19
|
-
|
20
|
-
class IB1Test < Test::Unit::TestCase
|
21
|
-
|
22
|
-
@@data_labels = [ 'city', 'age', 'gender', 'marketing_target' ]
|
23
|
-
|
24
|
-
@@data_items = [['New York', 25, 'M', 'Y'],
|
25
|
-
['New York', 23, 'M', 'Y'],
|
26
|
-
['New York', 18, 'M', 'Y'],
|
27
|
-
['Chicago', 43, 'M', 'Y'],
|
28
|
-
['New York', 34, 'F', 'N'],
|
29
|
-
['Chicago', 33, 'F', 'Y'],
|
30
|
-
['New York', 31, 'F', 'N'],
|
31
|
-
['Chicago', 55, 'M', 'N'],
|
32
|
-
['New York', 58, 'F', 'N'],
|
33
|
-
['New York', 59, 'M', 'N'],
|
34
|
-
['Chicago', 71, 'M', 'N'],
|
35
|
-
['New York', 60, 'F', 'N'],
|
36
|
-
['Chicago', 85, 'F', 'Y']
|
37
|
-
]
|
38
|
-
|
39
|
-
|
40
|
-
def setup
|
41
|
-
IB1.send(:public, *IB1.protected_instance_methods)
|
42
|
-
@data_set = DataSet.new(:data_items => @@data_items, :data_labels => @@data_labels)
|
43
|
-
@classifier = IB1.new.build(@data_set)
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_build
|
47
|
-
assert_raise(ArgumentError) { IB1.new.build(DataSet.new) }
|
48
|
-
assert @classifier.data_set
|
49
|
-
assert_equal [nil, 18, nil, nil], @classifier.min_values
|
50
|
-
assert_equal [nil, 85, nil, nil], @classifier.max_values
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_norm
|
54
|
-
assert_equal(0,@classifier.norm('Chicago', 0))
|
55
|
-
assert_in_delta(0.5522,@classifier.norm(55, 1),0.0001)
|
56
|
-
assert_equal(0,@classifier.norm('F', 0))
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_distance
|
60
|
-
item = ['Chicago', 55, 'M', 'N']
|
61
|
-
assert_equal(0, @classifier.distance(['Chicago', 55, 'M'], item))
|
62
|
-
assert_equal(1, @classifier.distance([nil, 55, 'M'], item))
|
63
|
-
assert_equal(1, @classifier.distance(['New York', 55, 'M'], item))
|
64
|
-
assert_in_delta(0.2728, @classifier.distance(['Chicago', 20, 'M'], item), 0.0001)
|
65
|
-
end
|
66
|
-
|
67
|
-
def test_eval
|
68
|
-
classifier = IB1.new.build(@data_set)
|
69
|
-
assert classifier
|
70
|
-
assert_equal('N', classifier.eval(['Chicago', 55, 'M']))
|
71
|
-
assert_equal('N', classifier.eval(['New York', 35, 'F']))
|
72
|
-
assert_equal('Y', classifier.eval(['New York', 25, 'M']))
|
73
|
-
assert_equal('Y', classifier.eval(['Chicago', 85, 'F']))
|
74
|
-
end
|
75
|
-
|
76
|
-
end
|
77
|
-
|
78
|
-
|
@@ -1,220 +0,0 @@
|
|
1
|
-
# id3_test.rb
|
2
|
-
#
|
3
|
-
# This is a unit test file for the ID3 algorithm (Quinlan) implemented
|
4
|
-
# in ai4r
|
5
|
-
#
|
6
|
-
# Author:: Sergio Fierens
|
7
|
-
# License:: MPL 1.1
|
8
|
-
# Project:: ai4r
|
9
|
-
# Url:: http://www.ai4r.org/
|
10
|
-
#
|
11
|
-
# You can redistribute it and/or modify it under the terms of
|
12
|
-
# the Mozilla Public License version 1.1 as published by the
|
13
|
-
# Mozilla Foundation at http://www.mozilla.org/MPL/MPL-1.1.txt
|
14
|
-
|
15
|
-
require 'ai4r/classifiers/id3'
|
16
|
-
require 'test/unit'
|
17
|
-
|
18
|
-
DATA_LABELS = [ 'city', 'age_range', 'gender', 'marketing_target' ]
|
19
|
-
|
20
|
-
DATA_ITEMS = [ ['New York', '<30', 'M', 'Y'],
|
21
|
-
['Chicago', '<30', 'M', 'Y'],
|
22
|
-
['Chicago', '<30', 'F', 'Y'],
|
23
|
-
['New York', '<30', 'M', 'Y'],
|
24
|
-
['New York', '<30', 'M', 'Y'],
|
25
|
-
['Chicago', '[30-50)', 'M', 'Y'],
|
26
|
-
['New York', '[30-50)', 'F', 'N'],
|
27
|
-
['Chicago', '[30-50)', 'F', 'Y'],
|
28
|
-
['New York', '[30-50)', 'F', 'N'],
|
29
|
-
['Chicago', '[50-80]', 'M', 'N'],
|
30
|
-
['New York', '[50-80]', 'F', 'N'],
|
31
|
-
['New York', '[50-80]', 'M', 'N'],
|
32
|
-
['Chicago', '[50-80]', 'M', 'N'],
|
33
|
-
['New York', '[50-80]', 'F', 'N'],
|
34
|
-
['Chicago', '>80', 'F', 'Y']
|
35
|
-
]
|
36
|
-
|
37
|
-
SPLIT_DATA_ITEMS_BY_CITY = [ [
|
38
|
-
["New York", "<30", "M", "Y"],
|
39
|
-
["New York", "<30", "M", "Y"],
|
40
|
-
["New York", "<30", "M", "Y"],
|
41
|
-
["New York", "[30-50)", "F", "N"],
|
42
|
-
["New York", "[30-50)", "F", "N"],
|
43
|
-
["New York", "[50-80]", "F", "N"],
|
44
|
-
["New York", "[50-80]", "M", "N"],
|
45
|
-
["New York", "[50-80]", "F", "N"]],
|
46
|
-
[
|
47
|
-
["Chicago", "<30", "M", "Y"],
|
48
|
-
["Chicago", "<30", "F", "Y"],
|
49
|
-
["Chicago", "[30-50)", "M", "Y"],
|
50
|
-
["Chicago", "[30-50)", "F", "Y"],
|
51
|
-
["Chicago", "[50-80]", "M", "N"],
|
52
|
-
["Chicago", "[50-80]", "M", "N"],
|
53
|
-
["Chicago", ">80", "F", "Y"]]
|
54
|
-
]
|
55
|
-
|
56
|
-
SPLIT_DATA_ITEMS_BY_AGE = [ [
|
57
|
-
["New York", "<30", "M", "Y"],
|
58
|
-
["Chicago", "<30", "M", "Y"],
|
59
|
-
["Chicago", "<30", "F", "Y"],
|
60
|
-
["New York", "<30", "M", "Y"],
|
61
|
-
["New York", "<30", "M", "Y"]],
|
62
|
-
[
|
63
|
-
["Chicago", "[30-50)", "M", "Y"],
|
64
|
-
["New York", "[30-50)", "F", "N"],
|
65
|
-
["Chicago", "[30-50)", "F", "Y"],
|
66
|
-
["New York", "[30-50)", "F", "N"]],
|
67
|
-
[
|
68
|
-
["Chicago", "[50-80]", "M", "N"],
|
69
|
-
["New York", "[50-80]", "F", "N"],
|
70
|
-
["New York", "[50-80]", "M", "N"],
|
71
|
-
["Chicago", "[50-80]", "M", "N"],
|
72
|
-
["New York", "[50-80]", "F", "N"]],
|
73
|
-
[
|
74
|
-
["Chicago", ">80", "F", "Y"]]
|
75
|
-
]
|
76
|
-
|
77
|
-
EXPECTED_RULES_STRING =
|
78
|
-
"if age_range=='<30' then marketing_target='Y'\n"+
|
79
|
-
"elsif age_range=='[30-50)' and city=='Chicago' then marketing_target='Y'\n"+
|
80
|
-
"elsif age_range=='[30-50)' and city=='New York' then marketing_target='N'\n"+
|
81
|
-
"elsif age_range=='[50-80]' then marketing_target='N'\n"+
|
82
|
-
"elsif age_range=='>80' then marketing_target='Y'\n"+
|
83
|
-
"else raise 'There was not enough information during training to do a proper induction for this data element' end"
|
84
|
-
|
85
|
-
include Ai4r::Classifiers
|
86
|
-
include Ai4r::Data
|
87
|
-
|
88
|
-
class ID3Test < Test::Unit::TestCase
|
89
|
-
|
90
|
-
def test_build
|
91
|
-
Ai4r::Classifiers::ID3.send(:public, *Ai4r::Classifiers::ID3.protected_instance_methods)
|
92
|
-
Ai4r::Classifiers::ID3.send(:public, *Ai4r::Classifiers::ID3.private_instance_methods)
|
93
|
-
end
|
94
|
-
|
95
|
-
def test_log2
|
96
|
-
assert_equal 1.0, ID3.log2(2)
|
97
|
-
assert_equal 0.0, ID3.log2(0)
|
98
|
-
assert 1.585 - ID3.log2(3) < 0.001
|
99
|
-
end
|
100
|
-
|
101
|
-
def test_sum
|
102
|
-
assert_equal 28, ID3.sum([5, 0, 22, 1])
|
103
|
-
assert_equal 0, ID3.sum([])
|
104
|
-
end
|
105
|
-
|
106
|
-
def test_data_labels
|
107
|
-
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS))
|
108
|
-
expected_default = [ 'attribute_1', 'attribute_2', 'attribute_3', 'class_value' ]
|
109
|
-
assert_equal(expected_default, id3.data_set.data_labels)
|
110
|
-
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
111
|
-
assert_equal(DATA_LABELS, id3.data_set.data_labels)
|
112
|
-
end
|
113
|
-
|
114
|
-
def test_domain
|
115
|
-
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
116
|
-
expected_domain = [["New York", "Chicago"], ["<30", "[30-50)", "[50-80]", ">80"], ["M", "F"], ["Y", "N"]]
|
117
|
-
assert_equal expected_domain, id3.domain(DATA_ITEMS)
|
118
|
-
end
|
119
|
-
|
120
|
-
def test_grid
|
121
|
-
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
122
|
-
expected_grid = [[3, 5], [5, 2]]
|
123
|
-
domain = id3.domain(DATA_ITEMS)
|
124
|
-
assert_equal expected_grid, id3.freq_grid(0, DATA_ITEMS, domain)
|
125
|
-
expected_grid = [[5, 0], [2, 2], [0, 5], [1, 0]]
|
126
|
-
assert_equal expected_grid, id3.freq_grid(1, DATA_ITEMS, domain)
|
127
|
-
end
|
128
|
-
|
129
|
-
def test_entropy
|
130
|
-
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
131
|
-
expected_entropy = 0.9118
|
132
|
-
domain = id3.domain(DATA_ITEMS)
|
133
|
-
freq_grid = id3.freq_grid(0, DATA_ITEMS, domain)
|
134
|
-
assert expected_entropy - id3.entropy(freq_grid, DATA_ITEMS.length) < 0.0001
|
135
|
-
expected_entropy = 0.2667
|
136
|
-
freq_grid = id3.freq_grid(1, DATA_ITEMS, domain)
|
137
|
-
assert expected_entropy - id3.entropy(freq_grid, DATA_ITEMS.length) < 0.0001
|
138
|
-
expected_entropy = 0.9688
|
139
|
-
freq_grid = id3.freq_grid(2, DATA_ITEMS, domain)
|
140
|
-
assert expected_entropy - id3.entropy(freq_grid, DATA_ITEMS.length) < 0.0001
|
141
|
-
end
|
142
|
-
|
143
|
-
def test_min_entropy_index
|
144
|
-
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
145
|
-
domain = id3.domain(DATA_ITEMS)
|
146
|
-
assert_equal 1, id3.min_entropy_index(DATA_ITEMS, domain)
|
147
|
-
assert_equal 0, id3.min_entropy_index(DATA_ITEMS, domain, [1])
|
148
|
-
assert_equal 2, id3.min_entropy_index(DATA_ITEMS, domain, [1, 0])
|
149
|
-
end
|
150
|
-
|
151
|
-
def test_split_data_examples
|
152
|
-
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
153
|
-
domain = id3.domain(DATA_ITEMS)
|
154
|
-
res = id3.split_data_examples(DATA_ITEMS, domain, 0)
|
155
|
-
assert_equal(SPLIT_DATA_ITEMS_BY_CITY, res)
|
156
|
-
res = id3.split_data_examples(DATA_ITEMS, domain, 1)
|
157
|
-
assert_equal(SPLIT_DATA_ITEMS_BY_AGE, res)
|
158
|
-
end
|
159
|
-
|
160
|
-
def test_most_freq
|
161
|
-
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
162
|
-
domain = id3.domain(DATA_ITEMS)
|
163
|
-
assert_equal 'Y', id3.most_freq(DATA_ITEMS, domain)
|
164
|
-
assert_equal 'Y', id3.most_freq(SPLIT_DATA_ITEMS_BY_AGE[3], domain)
|
165
|
-
assert_equal 'N', id3.most_freq(SPLIT_DATA_ITEMS_BY_AGE[2], domain)
|
166
|
-
end
|
167
|
-
|
168
|
-
def test_get_rules
|
169
|
-
assert_equal [["marketing_target='N'"]], CategoryNode.new('marketing_target', 'N').get_rules
|
170
|
-
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
171
|
-
assert_equal EXPECTED_RULES_STRING, id3.get_rules
|
172
|
-
end
|
173
|
-
|
174
|
-
def test_eval
|
175
|
-
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
176
|
-
#if age_range='<30' then marketing_target='Y'
|
177
|
-
assert_equal 'Y', id3.eval(['New York', '<30', 'F'])
|
178
|
-
assert_equal 'Y', id3.eval(['Chicago', '<30', 'M'])
|
179
|
-
#if age_range='[30-50)' and city='Chicago' then marketing_target='Y'
|
180
|
-
assert_equal 'Y', id3.eval(['Chicago', '[30-50)', 'F'])
|
181
|
-
assert_equal 'Y', id3.eval(['Chicago', '[30-50)', 'M'])
|
182
|
-
#if age_range='[30-50)' and city='New York' then marketing_target='N'
|
183
|
-
assert_equal 'N', id3.eval(['New York', '[30-50)', 'F'])
|
184
|
-
assert_equal 'N', id3.eval(['New York', '[30-50)', 'M'])
|
185
|
-
#if age_range='[50-80]' then marketing_target='N'
|
186
|
-
assert_equal 'N', id3.eval(['New York', '[50-80]', 'F'])
|
187
|
-
assert_equal 'N', id3.eval(['Chicago', '[50-80]', 'M'])
|
188
|
-
#if age_range='>80' then marketing_target='Y'
|
189
|
-
assert_equal 'Y', id3.eval(['New York', '>80', 'M'])
|
190
|
-
assert_equal 'Y', id3.eval(['Chicago', '>80', 'F'])
|
191
|
-
end
|
192
|
-
|
193
|
-
def test_rules_eval
|
194
|
-
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
195
|
-
#if age_range='<30' then marketing_target='Y'
|
196
|
-
age_range = '<30'
|
197
|
-
marketing_target = nil
|
198
|
-
eval id3.get_rules
|
199
|
-
assert_equal 'Y', marketing_target
|
200
|
-
#if age_range='[30-50)' and city='New York' then marketing_target='N'
|
201
|
-
age_range='[30-50)'
|
202
|
-
city='New York'
|
203
|
-
eval id3.get_rules
|
204
|
-
assert_equal 'N', marketing_target
|
205
|
-
end
|
206
|
-
|
207
|
-
def test_model_failure
|
208
|
-
bad_data_items = [ ['a', 'Y'],
|
209
|
-
['b', 'N'],
|
210
|
-
]
|
211
|
-
bad_data_labels = ['bogus', 'target']
|
212
|
-
id3 = ID3.new.build(DataSet.new(:data_items =>bad_data_items, :data_labels => bad_data_labels))
|
213
|
-
assert_raise ModelFailureError do
|
214
|
-
id3.eval(['c'])
|
215
|
-
end
|
216
|
-
assert_equal true, true
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
|