ai4r 1.13 → 2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +174 -0
- data/examples/classifiers/hyperpipes_data.csv +14 -0
- data/examples/classifiers/hyperpipes_example.rb +22 -0
- data/examples/classifiers/ib1_example.rb +12 -0
- data/examples/classifiers/id3_example.rb +15 -10
- data/examples/classifiers/id3_graphviz_example.rb +17 -0
- data/examples/classifiers/logistic_regression_example.rb +11 -0
- data/examples/classifiers/naive_bayes_attributes_example.rb +13 -0
- data/examples/classifiers/naive_bayes_example.rb +12 -13
- data/examples/classifiers/one_r_example.rb +27 -0
- data/examples/classifiers/parameter_tutorial.rb +29 -0
- data/examples/classifiers/prism_nominal_example.rb +15 -0
- data/examples/classifiers/prism_numeric_example.rb +21 -0
- data/examples/classifiers/simple_linear_regression_example.rb +14 -11
- data/examples/classifiers/zero_and_one_r_example.rb +34 -0
- data/examples/classifiers/zero_one_r_data.csv +8 -0
- data/examples/clusterers/clusterer_example.rb +40 -34
- data/examples/clusterers/dbscan_example.rb +17 -0
- data/examples/clusterers/dendrogram_example.rb +17 -0
- data/examples/clusterers/hierarchical_dendrogram_example.rb +20 -0
- data/examples/clusterers/kmeans_custom_example.rb +26 -0
- data/examples/genetic_algorithm/bitstring_example.rb +41 -0
- data/examples/genetic_algorithm/genetic_algorithm_example.rb +26 -18
- data/examples/genetic_algorithm/kmeans_seed_tuning.rb +45 -0
- data/examples/neural_network/backpropagation_example.rb +48 -48
- data/examples/neural_network/hopfield_example.rb +45 -0
- data/examples/neural_network/patterns_with_base_noise.rb +39 -39
- data/examples/neural_network/patterns_with_noise.rb +41 -39
- data/examples/neural_network/train_epochs_callback.rb +25 -0
- data/examples/neural_network/training_patterns.rb +39 -39
- data/examples/neural_network/transformer_text_classification.rb +78 -0
- data/examples/neural_network/xor_example.rb +23 -22
- data/examples/reinforcement/q_learning_example.rb +10 -0
- data/examples/som/som_data.rb +155 -152
- data/examples/som/som_multi_node_example.rb +12 -13
- data/examples/som/som_single_example.rb +12 -15
- data/examples/transformer/decode_classifier_example.rb +68 -0
- data/examples/transformer/deterministic_example.rb +10 -0
- data/examples/transformer/seq2seq_example.rb +16 -0
- data/lib/ai4r/classifiers/classifier.rb +24 -16
- data/lib/ai4r/classifiers/gradient_boosting.rb +64 -0
- data/lib/ai4r/classifiers/hyperpipes.rb +119 -43
- data/lib/ai4r/classifiers/ib1.rb +122 -32
- data/lib/ai4r/classifiers/id3.rb +524 -145
- data/lib/ai4r/classifiers/logistic_regression.rb +96 -0
- data/lib/ai4r/classifiers/multilayer_perceptron.rb +75 -59
- data/lib/ai4r/classifiers/naive_bayes.rb +95 -34
- data/lib/ai4r/classifiers/one_r.rb +112 -44
- data/lib/ai4r/classifiers/prism.rb +167 -76
- data/lib/ai4r/classifiers/random_forest.rb +72 -0
- data/lib/ai4r/classifiers/simple_linear_regression.rb +83 -58
- data/lib/ai4r/classifiers/support_vector_machine.rb +91 -0
- data/lib/ai4r/classifiers/votes.rb +57 -0
- data/lib/ai4r/classifiers/zero_r.rb +71 -30
- data/lib/ai4r/clusterers/average_linkage.rb +46 -27
- data/lib/ai4r/clusterers/bisecting_k_means.rb +50 -44
- data/lib/ai4r/clusterers/centroid_linkage.rb +52 -36
- data/lib/ai4r/clusterers/cluster_tree.rb +50 -0
- data/lib/ai4r/clusterers/clusterer.rb +29 -14
- data/lib/ai4r/clusterers/complete_linkage.rb +42 -31
- data/lib/ai4r/clusterers/dbscan.rb +134 -0
- data/lib/ai4r/clusterers/diana.rb +75 -49
- data/lib/ai4r/clusterers/k_means.rb +270 -135
- data/lib/ai4r/clusterers/median_linkage.rb +49 -33
- data/lib/ai4r/clusterers/single_linkage.rb +196 -88
- data/lib/ai4r/clusterers/ward_linkage.rb +51 -35
- data/lib/ai4r/clusterers/ward_linkage_hierarchical.rb +25 -10
- data/lib/ai4r/clusterers/weighted_average_linkage.rb +48 -32
- data/lib/ai4r/data/data_set.rb +223 -103
- data/lib/ai4r/data/parameterizable.rb +31 -25
- data/lib/ai4r/data/proximity.rb +62 -62
- data/lib/ai4r/data/statistics.rb +46 -35
- data/lib/ai4r/experiment/classifier_evaluator.rb +84 -32
- data/lib/ai4r/experiment/split.rb +39 -0
- data/lib/ai4r/genetic_algorithm/chromosome_base.rb +43 -0
- data/lib/ai4r/genetic_algorithm/genetic_algorithm.rb +92 -170
- data/lib/ai4r/genetic_algorithm/tsp_chromosome.rb +83 -0
- data/lib/ai4r/hmm/hidden_markov_model.rb +134 -0
- data/lib/ai4r/neural_network/activation_functions.rb +37 -0
- data/lib/ai4r/neural_network/backpropagation.rb +399 -134
- data/lib/ai4r/neural_network/hopfield.rb +175 -58
- data/lib/ai4r/neural_network/transformer.rb +194 -0
- data/lib/ai4r/neural_network/weight_initializations.rb +40 -0
- data/lib/ai4r/reinforcement/policy_iteration.rb +66 -0
- data/lib/ai4r/reinforcement/q_learning.rb +51 -0
- data/lib/ai4r/search/a_star.rb +76 -0
- data/lib/ai4r/search/bfs.rb +50 -0
- data/lib/ai4r/search/dfs.rb +50 -0
- data/lib/ai4r/search/mcts.rb +118 -0
- data/lib/ai4r/search.rb +12 -0
- data/lib/ai4r/som/distance_metrics.rb +29 -0
- data/lib/ai4r/som/layer.rb +28 -17
- data/lib/ai4r/som/node.rb +61 -32
- data/lib/ai4r/som/som.rb +158 -41
- data/lib/ai4r/som/two_phase_layer.rb +21 -25
- data/lib/ai4r/version.rb +3 -0
- data/lib/ai4r.rb +57 -28
- metadata +79 -109
- data/README.rdoc +0 -39
- data/test/classifiers/hyperpipes_test.rb +0 -84
- data/test/classifiers/ib1_test.rb +0 -78
- data/test/classifiers/id3_test.rb +0 -220
- data/test/classifiers/multilayer_perceptron_test.rb +0 -79
- data/test/classifiers/naive_bayes_test.rb +0 -43
- data/test/classifiers/one_r_test.rb +0 -62
- data/test/classifiers/prism_test.rb +0 -85
- data/test/classifiers/simple_linear_regression_test.rb +0 -37
- data/test/classifiers/zero_r_test.rb +0 -50
- data/test/clusterers/average_linkage_test.rb +0 -51
- data/test/clusterers/bisecting_k_means_test.rb +0 -66
- data/test/clusterers/centroid_linkage_test.rb +0 -53
- data/test/clusterers/complete_linkage_test.rb +0 -57
- data/test/clusterers/diana_test.rb +0 -69
- data/test/clusterers/k_means_test.rb +0 -167
- data/test/clusterers/median_linkage_test.rb +0 -53
- data/test/clusterers/single_linkage_test.rb +0 -122
- data/test/clusterers/ward_linkage_hierarchical_test.rb +0 -81
- data/test/clusterers/ward_linkage_test.rb +0 -53
- data/test/clusterers/weighted_average_linkage_test.rb +0 -53
- data/test/data/data_set_test.rb +0 -104
- data/test/data/proximity_test.rb +0 -87
- data/test/data/statistics_test.rb +0 -65
- data/test/experiment/classifier_evaluator_test.rb +0 -76
- data/test/genetic_algorithm/chromosome_test.rb +0 -57
- data/test/genetic_algorithm/genetic_algorithm_test.rb +0 -81
- data/test/neural_network/backpropagation_test.rb +0 -82
- data/test/neural_network/hopfield_test.rb +0 -72
- data/test/som/som_test.rb +0 -97
@@ -1,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
|