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
@@ -1,79 +0,0 @@
1
- require 'test/unit'
2
- require 'ai4r/classifiers/multilayer_perceptron'
3
- require 'ai4r/data/data_set'
4
-
5
- # Make all accessors and methods public
6
- class Ai4r::Classifiers::MultilayerPerceptron
7
- attr_accessor :data_set, :class_value, :network, :domains, :outputs
8
- public :get_max_index
9
- public :data_to_output
10
- end
11
-
12
- class MultilayerPerceptronTest < Test::Unit::TestCase
13
-
14
- include Ai4r::Classifiers
15
- include Ai4r::Data
16
-
17
- @@data_set = DataSet.new(:data_items =>[ ['New York', '<30', 'M', 'Y'],
18
- ['Chicago', '<30', 'M', 'Y'],
19
- ['New York', '<30', 'M', 'Y'],
20
- ['New York', '[30-50)', 'F', 'N'],
21
- ['Chicago', '[30-50)', 'F', 'Y'],
22
- ['New York', '[30-50)', 'F', 'N'],
23
- ['Chicago', '[50-80]', 'M', 'N'],
24
- ])
25
-
26
- def test_initialize
27
- classifier = MultilayerPerceptron.new
28
- assert_equal 1, classifier.active_node_value
29
- assert_equal 0, classifier.inactive_node_value
30
- assert_equal Ai4r::NeuralNetwork::Backpropagation, classifier.network_class
31
- assert_equal [], classifier.hidden_layers
32
- assert classifier.network_parameters
33
- assert classifier.network_parameters.empty?
34
- assert classifier.training_iterations > 1
35
- end
36
-
37
- def test_build
38
- assert_raise(ArgumentError) { MultilayerPerceptron.new.build(DataSet.new) }
39
- classifier = MultilayerPerceptron.new
40
- classifier.training_iterations = 1
41
- classifier.build(@@data_set)
42
- assert_equal [7,2], classifier.network.structure
43
- classifier.hidden_layers = [6, 4]
44
- classifier.build(@@data_set)
45
- assert_equal [7,6,4,2], classifier.network.structure
46
- end
47
-
48
- def test_eval
49
- classifier = MultilayerPerceptron.new.build(@@data_set)
50
- assert classifier
51
- assert_equal('N', classifier.eval(['Chicago', '[50-80]', 'M']))
52
- assert_equal('N', classifier.eval(['New York', '[30-50)', 'F']))
53
- assert_equal('Y', classifier.eval(['New York', '<30', 'M']))
54
- assert_equal('Y', classifier.eval(['Chicago', '[30-50)', 'F']))
55
- end
56
-
57
- def test_get_rules
58
- assert_match(/raise/, MultilayerPerceptron.new.get_rules)
59
- end
60
-
61
- def test_get_max_index
62
- classifier = MultilayerPerceptron.new
63
- assert_equal(0, classifier.get_max_index([3, 1, 0.2, -9, 0, 2.99]))
64
- assert_equal(2, classifier.get_max_index([3, 1, 5, -9, 0, 2.99]))
65
- assert_equal(5, classifier.get_max_index([3, 1, 5, -9, 0, 6]))
66
- end
67
-
68
- def test_data_to_output
69
- classifier = MultilayerPerceptron.new
70
- classifier.outputs = 4
71
- classifier.outputs = 4
72
- classifier.domains = [nil, nil, nil, ["A", "B", "C", "D"]]
73
- assert_equal([1,0,0,0], classifier.data_to_output("A"))
74
- assert_equal([0,0,1,0], classifier.data_to_output("C"))
75
- assert_equal([0,0,0,1], classifier.data_to_output("D"))
76
- end
77
-
78
- end
79
-
@@ -1,43 +0,0 @@
1
- require 'ai4r/classifiers/naive_bayes'
2
- require 'ai4r/data/data_set'
3
- require 'test/unit'
4
-
5
- include Ai4r::Classifiers
6
- include Ai4r::Data
7
-
8
- class NaiveBayesTest < Test::Unit::TestCase
9
-
10
- @@data_labels = %w(Color Type Origin Stolen?)
11
-
12
- @@data_items = [
13
- %w(Red Sports Domestic Yes),
14
- %w(Red Sports Domestic No),
15
- %w(Red Sports Domestic Yes),
16
- %w(Yellow Sports Domestic No),
17
- %w(Yellow Sports Imported Yes),
18
- %w(Yellow SUV Imported No),
19
- %w(Yellow SUV Imported Yes),
20
- %w(Yellow Sports Domestic No),
21
- %w(Red SUV Imported No),
22
- %w(Red Sports Imported Yes)
23
- ]
24
-
25
- def setup
26
- @data_set = DataSet.new
27
- @data_set = DataSet.new(:data_items => @@data_items, :data_labels => @@data_labels)
28
- @b = NaiveBayes.new.set_parameters({:m => 3}).build @data_set
29
- end
30
-
31
- def test_eval
32
- result = @b.eval(%w(Red SUV Domestic))
33
- assert_equal 'No', result
34
- end
35
-
36
- def test_get_probability_map
37
- map = @b.get_probability_map(%w(Red SUV Domestic))
38
- assert_equal 2, map.keys.length
39
- assert_in_delta 0.42, map['Yes'], 0.1
40
- assert_in_delta 0.58, map['No'], 0.1
41
- end
42
-
43
- end
@@ -1,62 +0,0 @@
1
- require 'test/unit'
2
- require 'ai4r/classifiers/one_r'
3
-
4
- class OneRTest < Test::Unit::TestCase
5
-
6
- include Ai4r::Classifiers
7
- include Ai4r::Data
8
-
9
- @@data_examples = [ ['New York', '<30', 'M', 'Y'],
10
- ['Chicago', '<30', 'M', 'Y'],
11
- ['New York', '<30', 'M', 'Y'],
12
- ['New York', '[30-50)', 'F', 'N'],
13
- ['Chicago', '[30-50)', 'F', 'Y'],
14
- ['New York', '[30-50)', 'F', 'N'],
15
- ['Chicago', '[50-80]', 'M', 'N']
16
- ]
17
-
18
- @@data_labels = [ 'city', 'age_range', 'gender', 'marketing_target' ]
19
-
20
- def test_build
21
- assert_raise(ArgumentError) { OneR.new.build(DataSet.new) }
22
- classifier = OneR.new.build(DataSet.new(:data_items => @@data_examples))
23
- assert_not_nil(classifier.data_set.data_labels)
24
- assert_not_nil(classifier.rule)
25
- assert_equal("attribute_1", classifier.data_set.data_labels.first)
26
- assert_equal("class_value", classifier.data_set.data_labels.last)
27
- classifier = OneR.new.build(DataSet.new(:data_items => @@data_examples,
28
- :data_labels => @@data_labels))
29
- assert_not_nil(classifier.data_set.data_labels)
30
- assert_not_nil(classifier.rule)
31
- assert_equal("city", classifier.data_set.data_labels.first)
32
- assert_equal("marketing_target", classifier.data_set.data_labels.last)
33
- assert_equal(1, classifier.rule[:attr_index])
34
- end
35
-
36
- def test_eval
37
- classifier = OneR.new.build(DataSet.new(:data_items => @@data_examples))
38
- assert_equal("Y", classifier.eval(['New York', '<30', 'M']))
39
- assert_equal("N", classifier.eval(['New York', '[30-50)', 'M']))
40
- assert_equal("N", classifier.eval(['Chicago', '[50-80]', 'M']))
41
- end
42
-
43
- def test_get_rules
44
- classifier = OneR.new.build(DataSet.new(:data_items => @@data_examples,
45
- :data_labels => @@data_labels))
46
- marketing_target = nil
47
- age_range = nil
48
- eval(classifier.get_rules)
49
- assert_nil(marketing_target)
50
- age_range = '<30'
51
- eval(classifier.get_rules)
52
- assert_equal("Y", marketing_target)
53
- age_range = '[30-50)'
54
- eval(classifier.get_rules)
55
- assert_equal("N", marketing_target)
56
- age_range = '[50-80]'
57
- eval(classifier.get_rules)
58
- assert_equal("N", marketing_target)
59
- end
60
-
61
- end
62
-
@@ -1,85 +0,0 @@
1
- require 'test/unit'
2
- require 'ai4r/classifiers/prism'
3
-
4
-
5
- class PrismTest < Test::Unit::TestCase
6
-
7
- include Ai4r::Classifiers
8
- include Ai4r::Data
9
-
10
- @@data_examples = [ ['New York', '<30', 'M', 'Y'],
11
- ['Chicago', '<30', 'M', 'Y'],
12
- ['Chicago', '<30', 'F', 'Y'],
13
- ['New York', '<30', 'M', 'Y'],
14
- ['New York', '<30', 'M', 'Y'],
15
- ['Chicago', '[30-50)', 'M', 'Y'],
16
- ['New York', '[30-50)', 'F', 'N'],
17
- ['Chicago', '[30-50)', 'F', 'Y'],
18
- ['New York', '[30-50)', 'F', 'N'],
19
- ['Chicago', '[50-80]', 'M', 'N'],
20
- ['New York', '[50-80]', 'F', 'N'],
21
- ['New York', '[50-80]', 'M', 'N'],
22
- ['Chicago', '[50-80]', 'M', 'N'],
23
- ['New York', '[50-80]', 'F', 'N'],
24
- ['Chicago', '>80', 'F', 'Y']
25
- ]
26
-
27
- @@data_labels = [ 'city', 'age_range', 'gender', 'marketing_target' ]
28
-
29
- def test_build
30
- assert_raise(ArgumentError) { Prism.new.build(DataSet.new) }
31
- classifier = Prism.new.build(DataSet.new(:data_items=>@@data_examples))
32
- assert_not_nil(classifier.data_set.data_labels)
33
- assert_not_nil(classifier.rules)
34
- assert_equal("attribute_1", classifier.data_set.data_labels.first)
35
- assert_equal("class_value", classifier.data_set.data_labels.last)
36
- classifier = Prism.new.build(DataSet.new(:data_items => @@data_examples,
37
- :data_labels => @@data_labels))
38
- assert_not_nil(classifier.data_set.data_labels)
39
- assert_not_nil(classifier.rules)
40
- assert_equal("city", classifier.data_set.data_labels.first)
41
- assert_equal("marketing_target", classifier.data_set.data_labels.last)
42
- assert !classifier.rules.empty?
43
-
44
- Prism.send(:public, *Prism.protected_instance_methods)
45
- Prism.send(:public, *Prism.private_instance_methods)
46
- end
47
-
48
- def test_eval
49
- classifier = Prism.new.build(DataSet.new(:data_items=>@@data_examples))
50
- @@data_examples.each do |data|
51
- assert_equal(data.last, classifier.eval(data[0...-1]))
52
- end
53
- end
54
-
55
- def test_get_rules
56
- classifier = Prism.new.build(DataSet.new(:data_items => @@data_examples,
57
- :data_labels => @@data_labels))
58
- marketing_target = nil
59
- age_range = nil
60
- city = 'Chicago'
61
- eval(classifier.get_rules)
62
- age_range = '<30'
63
- eval(classifier.get_rules)
64
- assert_equal("Y", marketing_target)
65
- age_range = '[30-50)'
66
- eval(classifier.get_rules)
67
- assert_equal("Y", marketing_target)
68
- age_range = '[30-50)'
69
- city = 'New York'
70
- eval(classifier.get_rules)
71
- assert_equal("N", marketing_target)
72
- age_range = '[50-80]'
73
- eval(classifier.get_rules)
74
- assert_equal("N", marketing_target)
75
- end
76
-
77
- def test_matches_conditions
78
- classifier = Prism.new.build(DataSet.new(:data_labels => @@data_labels,
79
- :data_items => @@data_examples))
80
-
81
- assert classifier.matches_conditions(['New York', '<30', 'M', 'Y'], {"age_range" => "<30"})
82
- assert !classifier.matches_conditions(['New York', '<30', 'M', 'Y'], {"age_range" => "[50-80]"})
83
- end
84
- end
85
-
@@ -1,37 +0,0 @@
1
- require 'ai4r/classifiers/simple_linear_regression'
2
- require 'ai4r/data/data_set'
3
- require 'test/unit'
4
-
5
- include Ai4r::Classifiers
6
- include Ai4r::Data
7
-
8
- class SimpleLinearRegressionTest < Test::Unit::TestCase
9
-
10
- @@data_labels = ["symboling", "normalized-losses", "wheel-base", "length", "width", "height", "curb-weight",
11
- "engine-size", "bore" , "stroke", "compression-ratio", "horsepower", "peak-rpm", "city-mpg",
12
- "highway-mpg", "class"]
13
-
14
- @@data_items = [
15
- [2,164,99.8,176.6,66.2,54.3,2337,109,3.19,3.4,10,102,5500,24,30,13950],
16
- [2,164,99.4,176.6,66.4,54.3,2824,136,3.19,3.4,8,115,5500,18,22,17450],
17
- [1,158,105.8,192.7,71.4,55.7,2844,136,3.19,3.4,8.5,110,5500,19,25,17710],
18
- [1,158,105.8,192.7,71.4,55.9,3086,131,3.13,3.4,8.3,140,5500,17,20,23875],
19
- [2,192,101.2,176.8,64.8,54.3,2395,108,3.5,2.8,8.8,101,5800,23,29,16430],
20
- [0,192,101.2,176.8,64.8,54.3,2395,108,3.5,2.8,8.8,101,5800,23,29,16925],
21
- [0,188,101.2,176.8,64.8,54.3,2710,164,3.31,3.19,9,121,4250,21,28,20970],
22
- [0,188,101.2,176.8,64.8,54.3,2765,164,3.31,3.19,9,121,4250,21,28,21105],
23
- [2,121,88.4,141.1,60.3,53.2,1488,61,2.91,3.03,9.5,48,5100,47,53,5151],
24
- ]
25
-
26
- def setup
27
- @data_set = DataSet.new
28
- @data_set = DataSet.new(:data_items => @@data_items, :data_labels => @@data_labels)
29
- @c = SimpleLinearRegression.new.build @data_set
30
- end
31
-
32
- def test_eval
33
- result = @c.eval([-1,95,109.1,188.8,68.9,55.5,3062,141,3.78,3.15,9.5,114,5400,19,25])
34
- assert_equal 17218.444444444445, result
35
- end
36
-
37
- end
@@ -1,50 +0,0 @@
1
- require 'test/unit'
2
- require 'ai4r/classifiers/zero_r'
3
- require 'ai4r/data/data_set'
4
-
5
- class ZeroRTest < Test::Unit::TestCase
6
-
7
- include Ai4r::Classifiers
8
- include Ai4r::Data
9
-
10
- @@data_examples = [
11
- ['New York', '[30-50)', 'F', 'N'],
12
- ['New York', '<30', 'M', 'Y'],
13
- ['Chicago', '<30', 'M', 'Y'],
14
- ['New York', '<30', 'M', 'Y'],
15
- ['Chicago', '[30-50)', 'F', 'Y'],
16
- ['New York', '[30-50)', 'F', 'N'],
17
- ['Chicago', '[50-80]', 'M', 'N'],
18
- ]
19
-
20
- @@data_labels = [ 'city', 'age_range', 'gender', 'marketing_target' ]
21
-
22
- def test_build
23
- assert_raise(ArgumentError) { ZeroR.new.build(DataSet.new) }
24
- classifier = ZeroR.new.build(DataSet.new(:data_items => @@data_examples))
25
- assert_equal("Y", classifier.class_value)
26
- assert_equal("attribute_1", classifier.data_set.data_labels.first)
27
- assert_equal("class_value", classifier.data_set.data_labels.last)
28
- classifier = ZeroR.new.build(DataSet.new(:data_items => @@data_examples,
29
- :data_labels => @@data_labels))
30
- assert_equal("Y", classifier.class_value)
31
- assert_equal("city", classifier.data_set.data_labels.first)
32
- assert_equal("marketing_target", classifier.data_set.data_labels.last)
33
- end
34
-
35
- def test_eval
36
- classifier = ZeroR.new.build(DataSet.new(:data_items => @@data_examples))
37
- assert_equal('Y', classifier.eval(@@data_examples.first) )
38
- assert_equal('Y', classifier.eval(@@data_examples.last) )
39
- end
40
-
41
- def test_get_rules
42
- classifier = ZeroR.new.build(DataSet.new(:data_items => @@data_examples,
43
- :data_labels => @@data_labels))
44
- marketing_target = nil
45
- eval(classifier.get_rules)
46
- assert_equal('Y', marketing_target)
47
- end
48
-
49
- end
50
-
@@ -1,51 +0,0 @@
1
- # Author:: Sergio Fierens (implementation)
2
- # License:: MPL 1.1
3
- # Project:: ai4r
4
- # Url:: http://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 'test/unit'
11
- require 'ai4r/clusterers/average_linkage'
12
-
13
- class Ai4r::Clusterers::AverageLinkage < Ai4r::Clusterers::SingleLinkage
14
- attr_accessor :data_set, :number_of_clusters, :clusters, :distance_matrix
15
- end
16
-
17
- class AverageLinkageTest < Test::Unit::TestCase
18
-
19
- include Ai4r::Clusterers
20
- include Ai4r::Data
21
-
22
- @@data = [ [10, 3], [3, 10], [2, 8], [2, 5], [3, 8], [10, 3],
23
- [1, 3], [8, 1], [2, 9], [2, 5], [3, 3], [9, 4]]
24
-
25
- @@expected_distance_matrix = [
26
- [98.0],
27
- [89.0, 5.0],
28
- [68.0, 26.0, 9.0],
29
- [74.0, 4.0, 1.0, 10.0],
30
- [0.0, 98.0, 89.0, 68.0, 74.0],
31
- [81.0, 53.0, 26.0, 5.0, 29.0, 81.0],
32
- [8.0, 106.0, 85.0, 52.0, 74.0, 8.0, 53.0],
33
- [100.0, 2.0, 1.0, 16.0, 2.0, 100.0, 37.0, 100.0],
34
- [68.0, 26.0, 9.0, 0.0, 10.0, 68.0, 5.0, 52.0, 16.0],
35
- [49.0, 49.0, 26.0, 5.0, 25.0, 49.0, 4.0, 29.0, 37.0, 5.0],
36
- [2.0, 72.0, 65.0, 50.0, 52.0, 2.0, 65.0, 10.0, 74.0, 50.0, 37.0]]
37
-
38
- def setup
39
- Ai4r::Clusterers::AverageLinkage.send(:public,
40
- *Ai4r::Clusterers::AverageLinkage.protected_instance_methods)
41
- end
42
-
43
- def test_linkage_distance
44
- clusterer = Ai4r::Clusterers::AverageLinkage.new
45
- clusterer.distance_matrix = @@expected_distance_matrix
46
- assert_equal 93.5, clusterer.linkage_distance(0,1,2)
47
- assert_equal 37.5, clusterer.linkage_distance(4,2,5)
48
- end
49
-
50
- end
51
-
@@ -1,66 +0,0 @@
1
- # Author:: Sergio Fierens (implementation)
2
- # License:: MPL 1.1
3
- # Project:: ai4r
4
- # Url:: http://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 'test/unit'
11
- require 'ai4r/clusterers/bisecting_k_means'
12
-
13
- class BisectingKMeansTest < Test::Unit::TestCase
14
-
15
- include Ai4r::Clusterers
16
- include Ai4r::Data
17
-
18
- @@data = [ [10, 3], [3, 10], [2, 8], [2, 5], [3, 8], [10, 3],
19
- [1, 3], [8, 1], [2, 9], [2, 5], [3, 3], [9, 4]]
20
-
21
- def test_build_without_refine
22
- build(false)
23
- end
24
-
25
- def test_build_with_refine
26
- build(true)
27
- end
28
-
29
- protected
30
- def build(refine)
31
- data_set = DataSet.new(:data_items => @@data, :data_labels => ["X", "Y"])
32
- clusterer = BisectingKMeans.new
33
- clusterer.set_parameters :refine => refine
34
- clusterer.build(data_set, 4)
35
- #draw_map(clusterer)
36
- # Verify that all 4 clusters are created
37
- assert_equal 4, clusterer.clusters.length
38
- assert_equal 4, clusterer.centroids.length
39
- # The addition of all instances of every cluster must be equal than
40
- # the number of data points
41
- total_length = 0
42
- clusterer.clusters.each do |cluster|
43
- total_length += cluster.data_items.length
44
- end
45
- assert_equal @@data.length, total_length
46
- # Data inside clusters must be the same as orifinal data
47
- clusterer.clusters.each do |cluster|
48
- cluster.data_items.each do |data_item|
49
- assert @@data.include?(data_item)
50
- end
51
- end
52
- end
53
-
54
- private
55
- def draw_map(clusterer)
56
- map = Array.new(11) {Array.new(11, 0)}
57
- clusterer.clusters.each_index do |i|
58
- clusterer.clusters[i].data_items.each do |point|
59
- map[point.first][point.last]=(i+1)
60
- end
61
- end
62
- map.each { |row| puts row.inspect}
63
- end
64
-
65
- end
66
-
@@ -1,53 +0,0 @@
1
- # Author:: Sergio Fierens (implementation)
2
- # License:: MPL 1.1
3
- # Project:: ai4r
4
- # Url:: http://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 'test/unit'
11
- require 'ai4r/clusterers/centroid_linkage'
12
-
13
- class Ai4r::Clusterers::CentroidLinkage
14
- attr_accessor :data_set, :number_of_clusters, :clusters, :distance_matrix, :index_clusters
15
- end
16
-
17
- class Ai4r::Clusterers::CentroidLinkageTest < Test::Unit::TestCase
18
-
19
- include Ai4r::Clusterers
20
- include Ai4r::Data
21
-
22
- @@data = [ [10, 3], [3, 10], [2, 8], [2, 5], [3, 8], [10, 3],
23
- [1, 3], [8, 1], [2, 9], [2, 5], [3, 3], [9, 4]]
24
-
25
- @@expected_distance_matrix = [
26
- [98.0],
27
- [89.0, 5.0],
28
- [68.0, 26.0, 9.0],
29
- [74.0, 4.0, 1.0, 10.0],
30
- [0.0, 98.0, 89.0, 68.0, 74.0],
31
- [81.0, 53.0, 26.0, 5.0, 29.0, 81.0],
32
- [8.0, 106.0, 85.0, 52.0, 74.0, 8.0, 53.0],
33
- [100.0, 2.0, 1.0, 16.0, 2.0, 100.0, 37.0, 100.0],
34
- [68.0, 26.0, 9.0, 0.0, 10.0, 68.0, 5.0, 52.0, 16.0],
35
- [49.0, 49.0, 26.0, 5.0, 25.0, 49.0, 4.0, 29.0, 37.0, 5.0],
36
- [2.0, 72.0, 65.0, 50.0, 52.0, 2.0, 65.0, 10.0, 74.0, 50.0, 37.0]]
37
-
38
- def setup
39
- Ai4r::Clusterers::CentroidLinkage.send(:public,
40
- *Ai4r::Clusterers::CentroidLinkage.protected_instance_methods)
41
- end
42
-
43
- def test_linkage_distance
44
- clusterer = Ai4r::Clusterers::CentroidLinkage.new
45
- clusterer.data_set = DataSet.new :data_items => @@data
46
- clusterer.index_clusters = clusterer.create_initial_index_clusters
47
- clusterer.distance_matrix = @@expected_distance_matrix
48
- assert_equal 92.25, clusterer.linkage_distance(0,1,2)
49
- assert_equal 15.25, clusterer.linkage_distance(4,2,5)
50
- end
51
-
52
- end
53
-
@@ -1,57 +0,0 @@
1
- # Author:: Sergio Fierens (implementation)
2
- # License:: MPL 1.1
3
- # Project:: ai4r
4
- # Url:: http://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 'test/unit'
11
- require 'ai4r/clusterers/complete_linkage'
12
-
13
- class Ai4r::Clusterers::CompleteLinkage
14
- attr_accessor :data_set, :number_of_clusters, :clusters, :distance_matrix
15
- end
16
-
17
- class CompleteLinkageTest < Test::Unit::TestCase
18
-
19
- include Ai4r::Clusterers
20
- include Ai4r::Data
21
-
22
- @@data = [ [10, 3], [3, 10], [2, 8], [2, 5], [3, 8], [10, 3],
23
- [1, 3], [8, 1], [2, 9], [2, 5], [3, 3], [9, 4]]
24
-
25
- @@expected_distance_matrix = [
26
- [98.0],
27
- [89.0, 5.0],
28
- [68.0, 26.0, 9.0],
29
- [74.0, 4.0, 1.0, 10.0],
30
- [0.0, 98.0, 89.0, 68.0, 74.0],
31
- [81.0, 53.0, 26.0, 5.0, 29.0, 81.0],
32
- [8.0, 106.0, 85.0, 52.0, 74.0, 8.0, 53.0],
33
- [100.0, 2.0, 1.0, 16.0, 2.0, 100.0, 37.0, 100.0],
34
- [68.0, 26.0, 9.0, 0.0, 10.0, 68.0, 5.0, 52.0, 16.0],
35
- [49.0, 49.0, 26.0, 5.0, 25.0, 49.0, 4.0, 29.0, 37.0, 5.0],
36
- [2.0, 72.0, 65.0, 50.0, 52.0, 2.0, 65.0, 10.0, 74.0, 50.0, 37.0]]
37
-
38
- def setup
39
- Ai4r::Clusterers::CompleteLinkage.send(:public,
40
- *Ai4r::Clusterers::CompleteLinkage.protected_instance_methods)
41
- end
42
-
43
- def test_linkage_distance
44
- clusterer = Ai4r::Clusterers::CompleteLinkage.new
45
- clusterer.distance_matrix = @@expected_distance_matrix
46
- assert_equal 98, clusterer.linkage_distance(0,1,2)
47
- assert_equal 74, clusterer.linkage_distance(4,2,5)
48
- end
49
-
50
- def test_distance_between_item_and_cluster
51
- clusterer = CompleteLinkage.new
52
- assert_equal 32.0, clusterer.distance_between_item_and_cluster([1,2],
53
- DataSet.new(:data_items => [[3,4],[5,6]]))
54
- end
55
-
56
- end
57
-
@@ -1,69 +0,0 @@
1
- # Author:: Sergio Fierens (implementation)
2
- # License:: MPL 1.1
3
- # Project:: ai4r
4
- # Url:: http://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 'test/unit'
11
- require 'ai4r/clusterers/diana'
12
-
13
- class Ai4r::Clusterers::Diana
14
- attr_accessor :data_set, :number_of_clusters, :clusters
15
- end
16
-
17
- class DianaTest < Test::Unit::TestCase
18
-
19
- @@data = [ [10, 3], [3, 10], [2, 8], [2, 5], [3, 8], [10, 3],
20
- [1, 3], [8, 1], [2, 9], [2, 5], [3, 3], [9, 4]]
21
-
22
- include Ai4r::Clusterers
23
- include Ai4r::Data
24
-
25
- def setup
26
- Diana.send(:public, *Diana.protected_instance_methods)
27
- @data_set = DataSet.new(:data_items => @@data.clone)
28
- end
29
-
30
- def test_build
31
- clusterer = Diana.new.build(@data_set, 4)
32
- assert_equal 4, clusterer.clusters.length
33
- end
34
-
35
- def test_eval
36
- clusterer = Diana.new.build(@data_set, 4)
37
- assert_equal 0, clusterer.eval([0, 0])
38
- assert_equal 1, clusterer.eval([9, 3])
39
- assert_equal 2, clusterer.eval([0,10])
40
- assert_equal 3, clusterer.eval([8, 0])
41
- end
42
-
43
- def test_cluster_diameter
44
- clusterer = Diana.new
45
- assert_equal 106, clusterer.cluster_diameter(@data_set)
46
- assert_equal 98, clusterer.cluster_diameter(@data_set[0..2])
47
- end
48
-
49
- def test_max_diameter_cluster
50
- clusterer = Diana.new
51
- assert_equal 0, clusterer.max_diameter_cluster([@data_set, @data_set[0..2]])
52
- assert_equal 1, clusterer.max_diameter_cluster([@data_set[0..2], @data_set])
53
- end
54
-
55
- def test_init_splinter_cluster
56
- clusterer = Diana.new
57
- assert_equal [10,3], clusterer.
58
- init_splinter_cluster(@data_set).data_items[0]
59
- end
60
-
61
- def test_max_distance_difference
62
- clusterer = Diana.new
63
- data_set_a = @data_set[1..-1]
64
- data_set_b = @data_set[0]
65
- assert_equal [63.7, 4], clusterer.
66
- max_distance_difference(data_set_a, data_set_b)
67
- end
68
-
69
- end