ai4r 1.12 → 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 (128) 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.csv +159 -0
  16. data/examples/classifiers/simple_linear_regression_example.rb +18 -0
  17. data/examples/classifiers/zero_and_one_r_example.rb +34 -0
  18. data/examples/classifiers/zero_one_r_data.csv +8 -0
  19. data/examples/clusterers/clusterer_example.rb +62 -0
  20. data/examples/clusterers/dbscan_example.rb +17 -0
  21. data/examples/clusterers/dendrogram_example.rb +17 -0
  22. data/examples/clusterers/hierarchical_dendrogram_example.rb +20 -0
  23. data/examples/clusterers/kmeans_custom_example.rb +26 -0
  24. data/examples/genetic_algorithm/bitstring_example.rb +41 -0
  25. data/examples/genetic_algorithm/genetic_algorithm_example.rb +26 -18
  26. data/examples/genetic_algorithm/kmeans_seed_tuning.rb +45 -0
  27. data/examples/neural_network/backpropagation_example.rb +49 -48
  28. data/examples/neural_network/hopfield_example.rb +45 -0
  29. data/examples/neural_network/patterns_with_base_noise.rb +39 -39
  30. data/examples/neural_network/patterns_with_noise.rb +41 -39
  31. data/examples/neural_network/train_epochs_callback.rb +25 -0
  32. data/examples/neural_network/training_patterns.rb +39 -39
  33. data/examples/neural_network/transformer_text_classification.rb +78 -0
  34. data/examples/neural_network/xor_example.rb +23 -22
  35. data/examples/reinforcement/q_learning_example.rb +10 -0
  36. data/examples/som/som_data.rb +155 -152
  37. data/examples/som/som_multi_node_example.rb +12 -13
  38. data/examples/som/som_single_example.rb +12 -15
  39. data/examples/transformer/decode_classifier_example.rb +68 -0
  40. data/examples/transformer/deterministic_example.rb +10 -0
  41. data/examples/transformer/seq2seq_example.rb +16 -0
  42. data/lib/ai4r/classifiers/classifier.rb +24 -16
  43. data/lib/ai4r/classifiers/gradient_boosting.rb +64 -0
  44. data/lib/ai4r/classifiers/hyperpipes.rb +119 -43
  45. data/lib/ai4r/classifiers/ib1.rb +122 -32
  46. data/lib/ai4r/classifiers/id3.rb +527 -144
  47. data/lib/ai4r/classifiers/logistic_regression.rb +96 -0
  48. data/lib/ai4r/classifiers/multilayer_perceptron.rb +75 -59
  49. data/lib/ai4r/classifiers/naive_bayes.rb +112 -48
  50. data/lib/ai4r/classifiers/one_r.rb +112 -44
  51. data/lib/ai4r/classifiers/prism.rb +167 -76
  52. data/lib/ai4r/classifiers/random_forest.rb +72 -0
  53. data/lib/ai4r/classifiers/simple_linear_regression.rb +143 -0
  54. data/lib/ai4r/classifiers/support_vector_machine.rb +91 -0
  55. data/lib/ai4r/classifiers/votes.rb +57 -0
  56. data/lib/ai4r/classifiers/zero_r.rb +71 -30
  57. data/lib/ai4r/clusterers/average_linkage.rb +46 -27
  58. data/lib/ai4r/clusterers/bisecting_k_means.rb +50 -44
  59. data/lib/ai4r/clusterers/centroid_linkage.rb +52 -36
  60. data/lib/ai4r/clusterers/cluster_tree.rb +50 -0
  61. data/lib/ai4r/clusterers/clusterer.rb +28 -24
  62. data/lib/ai4r/clusterers/complete_linkage.rb +42 -31
  63. data/lib/ai4r/clusterers/dbscan.rb +134 -0
  64. data/lib/ai4r/clusterers/diana.rb +75 -49
  65. data/lib/ai4r/clusterers/k_means.rb +309 -72
  66. data/lib/ai4r/clusterers/median_linkage.rb +49 -33
  67. data/lib/ai4r/clusterers/single_linkage.rb +196 -88
  68. data/lib/ai4r/clusterers/ward_linkage.rb +51 -35
  69. data/lib/ai4r/clusterers/ward_linkage_hierarchical.rb +63 -0
  70. data/lib/ai4r/clusterers/weighted_average_linkage.rb +48 -32
  71. data/lib/ai4r/data/data_set.rb +229 -100
  72. data/lib/ai4r/data/parameterizable.rb +31 -25
  73. data/lib/ai4r/data/proximity.rb +72 -50
  74. data/lib/ai4r/data/statistics.rb +46 -35
  75. data/lib/ai4r/experiment/classifier_evaluator.rb +84 -32
  76. data/lib/ai4r/experiment/split.rb +39 -0
  77. data/lib/ai4r/genetic_algorithm/chromosome_base.rb +43 -0
  78. data/lib/ai4r/genetic_algorithm/genetic_algorithm.rb +92 -170
  79. data/lib/ai4r/genetic_algorithm/tsp_chromosome.rb +83 -0
  80. data/lib/ai4r/hmm/hidden_markov_model.rb +134 -0
  81. data/lib/ai4r/neural_network/activation_functions.rb +37 -0
  82. data/lib/ai4r/neural_network/backpropagation.rb +419 -143
  83. data/lib/ai4r/neural_network/hopfield.rb +175 -58
  84. data/lib/ai4r/neural_network/transformer.rb +194 -0
  85. data/lib/ai4r/neural_network/weight_initializations.rb +40 -0
  86. data/lib/ai4r/reinforcement/policy_iteration.rb +66 -0
  87. data/lib/ai4r/reinforcement/q_learning.rb +51 -0
  88. data/lib/ai4r/search/a_star.rb +76 -0
  89. data/lib/ai4r/search/bfs.rb +50 -0
  90. data/lib/ai4r/search/dfs.rb +50 -0
  91. data/lib/ai4r/search/mcts.rb +118 -0
  92. data/lib/ai4r/search.rb +12 -0
  93. data/lib/ai4r/som/distance_metrics.rb +29 -0
  94. data/lib/ai4r/som/layer.rb +28 -17
  95. data/lib/ai4r/som/node.rb +61 -32
  96. data/lib/ai4r/som/som.rb +158 -41
  97. data/lib/ai4r/som/two_phase_layer.rb +21 -25
  98. data/lib/ai4r/version.rb +3 -0
  99. data/lib/ai4r.rb +58 -27
  100. metadata +117 -106
  101. data/README.rdoc +0 -44
  102. data/test/classifiers/hyperpipes_test.rb +0 -84
  103. data/test/classifiers/ib1_test.rb +0 -78
  104. data/test/classifiers/id3_test.rb +0 -208
  105. data/test/classifiers/multilayer_perceptron_test.rb +0 -79
  106. data/test/classifiers/naive_bayes_test.rb +0 -43
  107. data/test/classifiers/one_r_test.rb +0 -62
  108. data/test/classifiers/prism_test.rb +0 -85
  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 -100
  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_test.rb +0 -53
  119. data/test/clusterers/weighted_average_linkage_test.rb +0 -53
  120. data/test/data/data_set_test.rb +0 -96
  121. data/test/data/proximity_test.rb +0 -81
  122. data/test/data/statistics_test.rb +0 -65
  123. data/test/experiment/classifier_evaluator_test.rb +0 -76
  124. data/test/genetic_algorithm/chromosome_test.rb +0 -57
  125. data/test/genetic_algorithm/genetic_algorithm_test.rb +0 -81
  126. data/test/neural_network/backpropagation_test.rb +0 -82
  127. data/test/neural_network/hopfield_test.rb +0 -72
  128. data/test/som/som_test.rb +0 -97
metadata CHANGED
@@ -1,135 +1,146 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: ai4r
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 12
8
- version: "1.12"
3
+ version: !ruby/object:Gem::Version
4
+ version: '2.0'
9
5
  platform: ruby
10
- authors:
6
+ authors:
11
7
  - Sergio Fierens
12
- autorequire:
13
8
  bindir: bin
14
9
  cert_chain: []
15
-
16
- date: 2012-09-07 00:00:00 -05:00
17
- default_executable:
10
+ date: 1980-01-02 00:00:00.000000000 Z
18
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.
19
14
 
20
- description:
21
- 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.
22
16
  executables: []
23
-
24
17
  extensions: []
25
-
26
- extra_rdoc_files:
27
- - README.rdoc
28
- 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
25
+ - examples/classifiers/id3_data.csv
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
30
+ - examples/classifiers/naive_bayes_data.csv
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
36
+ - examples/classifiers/results.txt
37
+ - examples/classifiers/simple_linear_regression_example.csv
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
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
47
+ - examples/genetic_algorithm/genetic_algorithm_example.rb
48
+ - examples/genetic_algorithm/kmeans_seed_tuning.rb
49
+ - examples/genetic_algorithm/travel_cost.csv
50
+ - examples/neural_network/backpropagation_example.rb
51
+ - examples/neural_network/hopfield_example.rb
29
52
  - examples/neural_network/patterns_with_base_noise.rb
53
+ - examples/neural_network/patterns_with_noise.rb
54
+ - examples/neural_network/train_epochs_callback.rb
30
55
  - examples/neural_network/training_patterns.rb
56
+ - examples/neural_network/transformer_text_classification.rb
31
57
  - examples/neural_network/xor_example.rb
32
- - examples/neural_network/patterns_with_noise.rb
33
- - examples/neural_network/backpropagation_example.rb
58
+ - examples/reinforcement/q_learning_example.rb
34
59
  - examples/som/som_data.rb
35
- - examples/som/som_single_example.rb
36
60
  - examples/som/som_multi_node_example.rb
37
- - examples/classifiers/id3_example.rb
38
- - examples/classifiers/results.txt
39
- - examples/classifiers/naive_bayes_example.rb
40
- - examples/classifiers/naive_bayes_data.csv
41
- - examples/classifiers/id3_data.csv
42
- - examples/genetic_algorithm/genetic_algorithm_example.rb
43
- - examples/genetic_algorithm/travel_cost.csv
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
44
65
  - lib/ai4r.rb
45
- - lib/ai4r/data/proximity.rb
46
- - lib/ai4r/data/parameterizable.rb
47
- - lib/ai4r/data/data_set.rb
48
- - lib/ai4r/data/statistics.rb
49
- - lib/ai4r/neural_network/backpropagation.rb
50
- - lib/ai4r/neural_network/hopfield.rb
51
- - lib/ai4r/som/node.rb
52
- - lib/ai4r/som/som.rb
53
- - lib/ai4r/som/two_phase_layer.rb
54
- - lib/ai4r/som/layer.rb
66
+ - lib/ai4r/classifiers/classifier.rb
67
+ - lib/ai4r/classifiers/gradient_boosting.rb
68
+ - lib/ai4r/classifiers/hyperpipes.rb
55
69
  - lib/ai4r/classifiers/ib1.rb
56
70
  - lib/ai4r/classifiers/id3.rb
57
- - lib/ai4r/classifiers/naive_bayes.rb
58
- - lib/ai4r/classifiers/hyperpipes.rb
59
- - lib/ai4r/classifiers/zero_r.rb
71
+ - lib/ai4r/classifiers/logistic_regression.rb
60
72
  - lib/ai4r/classifiers/multilayer_perceptron.rb
73
+ - lib/ai4r/classifiers/naive_bayes.rb
61
74
  - lib/ai4r/classifiers/one_r.rb
62
- - lib/ai4r/classifiers/classifier.rb
63
75
  - lib/ai4r/classifiers/prism.rb
64
- - lib/ai4r/experiment/classifier_evaluator.rb
65
- - lib/ai4r/genetic_algorithm/genetic_algorithm.rb
66
- - lib/ai4r/clusterers/complete_linkage.rb
67
- - lib/ai4r/clusterers/single_linkage.rb
68
- - lib/ai4r/clusterers/k_means.rb
69
- - lib/ai4r/clusterers/clusterer.rb
70
- - lib/ai4r/clusterers/centroid_linkage.rb
71
- - lib/ai4r/clusterers/diana.rb
76
+ - lib/ai4r/classifiers/random_forest.rb
77
+ - lib/ai4r/classifiers/simple_linear_regression.rb
78
+ - lib/ai4r/classifiers/support_vector_machine.rb
79
+ - lib/ai4r/classifiers/votes.rb
80
+ - lib/ai4r/classifiers/zero_r.rb
72
81
  - lib/ai4r/clusterers/average_linkage.rb
73
82
  - lib/ai4r/clusterers/bisecting_k_means.rb
74
- - lib/ai4r/clusterers/ward_linkage.rb
83
+ - lib/ai4r/clusterers/centroid_linkage.rb
84
+ - lib/ai4r/clusterers/cluster_tree.rb
85
+ - lib/ai4r/clusterers/clusterer.rb
86
+ - lib/ai4r/clusterers/complete_linkage.rb
87
+ - lib/ai4r/clusterers/dbscan.rb
88
+ - lib/ai4r/clusterers/diana.rb
89
+ - lib/ai4r/clusterers/k_means.rb
75
90
  - lib/ai4r/clusterers/median_linkage.rb
91
+ - lib/ai4r/clusterers/single_linkage.rb
92
+ - lib/ai4r/clusterers/ward_linkage.rb
93
+ - lib/ai4r/clusterers/ward_linkage_hierarchical.rb
76
94
  - lib/ai4r/clusterers/weighted_average_linkage.rb
77
- - README.rdoc
78
- has_rdoc: true
79
- homepage: http://www.ai4r.org
80
- licenses: []
81
-
82
- post_install_message:
95
+ - lib/ai4r/data/data_set.rb
96
+ - lib/ai4r/data/parameterizable.rb
97
+ - lib/ai4r/data/proximity.rb
98
+ - lib/ai4r/data/statistics.rb
99
+ - lib/ai4r/experiment/classifier_evaluator.rb
100
+ - lib/ai4r/experiment/split.rb
101
+ - lib/ai4r/genetic_algorithm/chromosome_base.rb
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
106
+ - lib/ai4r/neural_network/backpropagation.rb
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
118
+ - lib/ai4r/som/layer.rb
119
+ - lib/ai4r/som/node.rb
120
+ - lib/ai4r/som/som.rb
121
+ - lib/ai4r/som/two_phase_layer.rb
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'
83
129
  rdoc_options: []
84
-
85
- require_paths:
130
+ require_paths:
86
131
  - lib
87
- required_ruby_version: !ruby/object:Gem::Requirement
88
- requirements:
132
+ required_ruby_version: !ruby/object:Gem::Requirement
133
+ requirements:
89
134
  - - ">="
90
- - !ruby/object:Gem::Version
91
- segments:
92
- - 0
93
- version: "0"
94
- required_rubygems_version: !ruby/object:Gem::Requirement
95
- requirements:
135
+ - !ruby/object:Gem::Version
136
+ version: '3.1'
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ requirements:
96
139
  - - ">="
97
- - !ruby/object:Gem::Version
98
- segments:
99
- - 0
100
- version: "0"
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
101
142
  requirements: []
102
-
103
- rubyforge_project:
104
- rubygems_version: 1.3.6
105
- signing_key:
106
- specification_version: 3
107
- summary: Ruby algorithm implementations covering several Artificial intelligence fields, including Genetic algorithms, Neural Networks, machine learning, and clustering.
108
- test_files:
109
- - test/data/proximity_test.rb
110
- - test/data/data_set_test.rb
111
- - test/data/statistics_test.rb
112
- - test/neural_network/hopfield_test.rb
113
- - test/neural_network/backpropagation_test.rb
114
- - test/som/som_test.rb
115
- - test/classifiers/one_r_test.rb
116
- - test/classifiers/id3_test.rb
117
- - test/classifiers/ib1_test.rb
118
- - test/classifiers/hyperpipes_test.rb
119
- - test/classifiers/zero_r_test.rb
120
- - test/classifiers/prism_test.rb
121
- - test/classifiers/multilayer_perceptron_test.rb
122
- - test/classifiers/naive_bayes_test.rb
123
- - test/experiment/classifier_evaluator_test.rb
124
- - test/genetic_algorithm/chromosome_test.rb
125
- - test/genetic_algorithm/genetic_algorithm_test.rb
126
- - test/clusterers/complete_linkage_test.rb
127
- - test/clusterers/average_linkage_test.rb
128
- - test/clusterers/centroid_linkage_test.rb
129
- - test/clusterers/bisecting_k_means_test.rb
130
- - test/clusterers/diana_test.rb
131
- - test/clusterers/single_linkage_test.rb
132
- - test/clusterers/weighted_average_linkage_test.rb
133
- - test/clusterers/k_means_test.rb
134
- - test/clusterers/median_linkage_test.rb
135
- - test/clusterers/ward_linkage_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,44 +0,0 @@
1
- = Introduction
2
-
3
- This project aims to produce ruby implementations of
4
- algorithms covering several Artificial intelligence fields.
5
-
6
- = Where can I find the lastest code and info on this project?
7
-
8
- http://www.ai4r.org
9
-
10
- = How to install
11
-
12
- 1. Install the gem:
13
-
14
- gem install ai4r
15
-
16
- 2. Include require statements in your code:
17
-
18
- require "rubygems"
19
- require "ai4r"
20
-
21
- = More Info
22
-
23
- * AI4R Project site: http://www.ai4r.org
24
- * RDoc site: http://www.ai4r.org/rdoc/index.html
25
-
26
- = Contact
27
-
28
- If you have questions or constructive comments about this project send it to me:
29
- {Sergio Fierens}[https://github.com/SergioFierens], email address: (sergio (at) gmail (dot) com).
30
-
31
- = Contributors
32
-
33
- This project was created and is maintained by {Sergio Fierens}[https://github.com/SergioFierens].
34
- There are other (great and absolutely cool) people who have donated time and code to make this project better, including:
35
-
36
- * {Thomas Kern}[https://github.com/thomaskern]
37
- * {Luis Parravicini}[https://github.com/luisparravicini]
38
- * {Kevin Menard}[https://github.com/nirvdrum]
39
-
40
- = Disclaimer
41
-
42
- This software is provided "as is" and without any express or implied warranties,
43
- including, without limitation, the implied warranties of merchantibility and
44
- 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,208 +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
- end
207
-
208
-