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.
Files changed (129) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +174 -0
  3. data/examples/classifiers/hyperpipes_data.csv +14 -0
  4. data/examples/classifiers/hyperpipes_example.rb +22 -0
  5. data/examples/classifiers/ib1_example.rb +12 -0
  6. data/examples/classifiers/id3_example.rb +15 -10
  7. data/examples/classifiers/id3_graphviz_example.rb +17 -0
  8. data/examples/classifiers/logistic_regression_example.rb +11 -0
  9. data/examples/classifiers/naive_bayes_attributes_example.rb +13 -0
  10. data/examples/classifiers/naive_bayes_example.rb +12 -13
  11. data/examples/classifiers/one_r_example.rb +27 -0
  12. data/examples/classifiers/parameter_tutorial.rb +29 -0
  13. data/examples/classifiers/prism_nominal_example.rb +15 -0
  14. data/examples/classifiers/prism_numeric_example.rb +21 -0
  15. data/examples/classifiers/simple_linear_regression_example.rb +14 -11
  16. data/examples/classifiers/zero_and_one_r_example.rb +34 -0
  17. data/examples/classifiers/zero_one_r_data.csv +8 -0
  18. data/examples/clusterers/clusterer_example.rb +40 -34
  19. data/examples/clusterers/dbscan_example.rb +17 -0
  20. data/examples/clusterers/dendrogram_example.rb +17 -0
  21. data/examples/clusterers/hierarchical_dendrogram_example.rb +20 -0
  22. data/examples/clusterers/kmeans_custom_example.rb +26 -0
  23. data/examples/genetic_algorithm/bitstring_example.rb +41 -0
  24. data/examples/genetic_algorithm/genetic_algorithm_example.rb +26 -18
  25. data/examples/genetic_algorithm/kmeans_seed_tuning.rb +45 -0
  26. data/examples/neural_network/backpropagation_example.rb +48 -48
  27. data/examples/neural_network/hopfield_example.rb +45 -0
  28. data/examples/neural_network/patterns_with_base_noise.rb +39 -39
  29. data/examples/neural_network/patterns_with_noise.rb +41 -39
  30. data/examples/neural_network/train_epochs_callback.rb +25 -0
  31. data/examples/neural_network/training_patterns.rb +39 -39
  32. data/examples/neural_network/transformer_text_classification.rb +78 -0
  33. data/examples/neural_network/xor_example.rb +23 -22
  34. data/examples/reinforcement/q_learning_example.rb +10 -0
  35. data/examples/som/som_data.rb +155 -152
  36. data/examples/som/som_multi_node_example.rb +12 -13
  37. data/examples/som/som_single_example.rb +12 -15
  38. data/examples/transformer/decode_classifier_example.rb +68 -0
  39. data/examples/transformer/deterministic_example.rb +10 -0
  40. data/examples/transformer/seq2seq_example.rb +16 -0
  41. data/lib/ai4r/classifiers/classifier.rb +24 -16
  42. data/lib/ai4r/classifiers/gradient_boosting.rb +64 -0
  43. data/lib/ai4r/classifiers/hyperpipes.rb +119 -43
  44. data/lib/ai4r/classifiers/ib1.rb +122 -32
  45. data/lib/ai4r/classifiers/id3.rb +524 -145
  46. data/lib/ai4r/classifiers/logistic_regression.rb +96 -0
  47. data/lib/ai4r/classifiers/multilayer_perceptron.rb +75 -59
  48. data/lib/ai4r/classifiers/naive_bayes.rb +95 -34
  49. data/lib/ai4r/classifiers/one_r.rb +112 -44
  50. data/lib/ai4r/classifiers/prism.rb +167 -76
  51. data/lib/ai4r/classifiers/random_forest.rb +72 -0
  52. data/lib/ai4r/classifiers/simple_linear_regression.rb +83 -58
  53. data/lib/ai4r/classifiers/support_vector_machine.rb +91 -0
  54. data/lib/ai4r/classifiers/votes.rb +57 -0
  55. data/lib/ai4r/classifiers/zero_r.rb +71 -30
  56. data/lib/ai4r/clusterers/average_linkage.rb +46 -27
  57. data/lib/ai4r/clusterers/bisecting_k_means.rb +50 -44
  58. data/lib/ai4r/clusterers/centroid_linkage.rb +52 -36
  59. data/lib/ai4r/clusterers/cluster_tree.rb +50 -0
  60. data/lib/ai4r/clusterers/clusterer.rb +29 -14
  61. data/lib/ai4r/clusterers/complete_linkage.rb +42 -31
  62. data/lib/ai4r/clusterers/dbscan.rb +134 -0
  63. data/lib/ai4r/clusterers/diana.rb +75 -49
  64. data/lib/ai4r/clusterers/k_means.rb +270 -135
  65. data/lib/ai4r/clusterers/median_linkage.rb +49 -33
  66. data/lib/ai4r/clusterers/single_linkage.rb +196 -88
  67. data/lib/ai4r/clusterers/ward_linkage.rb +51 -35
  68. data/lib/ai4r/clusterers/ward_linkage_hierarchical.rb +25 -10
  69. data/lib/ai4r/clusterers/weighted_average_linkage.rb +48 -32
  70. data/lib/ai4r/data/data_set.rb +223 -103
  71. data/lib/ai4r/data/parameterizable.rb +31 -25
  72. data/lib/ai4r/data/proximity.rb +62 -62
  73. data/lib/ai4r/data/statistics.rb +46 -35
  74. data/lib/ai4r/experiment/classifier_evaluator.rb +84 -32
  75. data/lib/ai4r/experiment/split.rb +39 -0
  76. data/lib/ai4r/genetic_algorithm/chromosome_base.rb +43 -0
  77. data/lib/ai4r/genetic_algorithm/genetic_algorithm.rb +92 -170
  78. data/lib/ai4r/genetic_algorithm/tsp_chromosome.rb +83 -0
  79. data/lib/ai4r/hmm/hidden_markov_model.rb +134 -0
  80. data/lib/ai4r/neural_network/activation_functions.rb +37 -0
  81. data/lib/ai4r/neural_network/backpropagation.rb +399 -134
  82. data/lib/ai4r/neural_network/hopfield.rb +175 -58
  83. data/lib/ai4r/neural_network/transformer.rb +194 -0
  84. data/lib/ai4r/neural_network/weight_initializations.rb +40 -0
  85. data/lib/ai4r/reinforcement/policy_iteration.rb +66 -0
  86. data/lib/ai4r/reinforcement/q_learning.rb +51 -0
  87. data/lib/ai4r/search/a_star.rb +76 -0
  88. data/lib/ai4r/search/bfs.rb +50 -0
  89. data/lib/ai4r/search/dfs.rb +50 -0
  90. data/lib/ai4r/search/mcts.rb +118 -0
  91. data/lib/ai4r/search.rb +12 -0
  92. data/lib/ai4r/som/distance_metrics.rb +29 -0
  93. data/lib/ai4r/som/layer.rb +28 -17
  94. data/lib/ai4r/som/node.rb +61 -32
  95. data/lib/ai4r/som/som.rb +158 -41
  96. data/lib/ai4r/som/two_phase_layer.rb +21 -25
  97. data/lib/ai4r/version.rb +3 -0
  98. data/lib/ai4r.rb +57 -28
  99. metadata +79 -109
  100. data/README.rdoc +0 -39
  101. data/test/classifiers/hyperpipes_test.rb +0 -84
  102. data/test/classifiers/ib1_test.rb +0 -78
  103. data/test/classifiers/id3_test.rb +0 -220
  104. data/test/classifiers/multilayer_perceptron_test.rb +0 -79
  105. data/test/classifiers/naive_bayes_test.rb +0 -43
  106. data/test/classifiers/one_r_test.rb +0 -62
  107. data/test/classifiers/prism_test.rb +0 -85
  108. data/test/classifiers/simple_linear_regression_test.rb +0 -37
  109. data/test/classifiers/zero_r_test.rb +0 -50
  110. data/test/clusterers/average_linkage_test.rb +0 -51
  111. data/test/clusterers/bisecting_k_means_test.rb +0 -66
  112. data/test/clusterers/centroid_linkage_test.rb +0 -53
  113. data/test/clusterers/complete_linkage_test.rb +0 -57
  114. data/test/clusterers/diana_test.rb +0 -69
  115. data/test/clusterers/k_means_test.rb +0 -167
  116. data/test/clusterers/median_linkage_test.rb +0 -53
  117. data/test/clusterers/single_linkage_test.rb +0 -122
  118. data/test/clusterers/ward_linkage_hierarchical_test.rb +0 -81
  119. data/test/clusterers/ward_linkage_test.rb +0 -53
  120. data/test/clusterers/weighted_average_linkage_test.rb +0 -53
  121. data/test/data/data_set_test.rb +0 -104
  122. data/test/data/proximity_test.rb +0 -87
  123. data/test/data/statistics_test.rb +0 -65
  124. data/test/experiment/classifier_evaluator_test.rb +0 -76
  125. data/test/genetic_algorithm/chromosome_test.rb +0 -57
  126. data/test/genetic_algorithm/genetic_algorithm_test.rb +0 -81
  127. data/test/neural_network/backpropagation_test.rb +0 -82
  128. data/test/neural_network/hopfield_test.rb +0 -72
  129. 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
- hash: 21
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
- description:
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
- extra_rdoc_files:
28
- - README.rdoc
29
- files:
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
- - README.rdoc
84
- - test/classifiers/hyperpipes_test.rb
85
- - test/classifiers/ib1_test.rb
86
- - test/classifiers/id3_test.rb
87
- - test/classifiers/multilayer_perceptron_test.rb
88
- - test/classifiers/naive_bayes_test.rb
89
- - test/classifiers/one_r_test.rb
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
- none: false
124
- requirements:
132
+ required_ruby_version: !ruby/object:Gem::Requirement
133
+ requirements:
125
134
  - - ">="
126
- - !ruby/object:Gem::Version
127
- hash: 3
128
- segments:
129
- - 0
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
- hash: 3
137
- segments:
138
- - 0
139
- version: "0"
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
140
142
  requirements: []
141
-
142
- rubyforge_project:
143
- rubygems_version: 1.3.7
144
- signing_key:
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
-