ai4r 1.2 → 1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +12 -25
- data/examples/decision_trees/id3_example.rb +6 -9
- data/examples/decision_trees/results.txt +2 -0
- data/examples/genetic_algorithm/genetic_algorithm_example.rb +11 -13
- data/examples/neural_network/xor_example.rb +25 -0
- data/lib/ai4r.rb +10 -0
- data/lib/ai4r/classifiers/classifier.rb +46 -0
- data/lib/ai4r/classifiers/id3.rb +27 -58
- data/lib/ai4r/classifiers/one_r.rb +19 -58
- data/lib/ai4r/classifiers/prism.rb +21 -57
- data/lib/ai4r/classifiers/zero_r.rb +16 -48
- data/lib/ai4r/clusterers/bisecting_k_means.rb +115 -0
- data/lib/ai4r/clusterers/clusterer.rb +55 -0
- data/lib/ai4r/clusterers/k_means.rb +164 -0
- data/lib/ai4r/data/data_set.rb +250 -0
- data/lib/ai4r/genetic_algorithm/genetic_algorithm.rb +19 -19
- data/lib/ai4r/neural_network/backpropagation.rb +23 -24
- data/site/build/site/en/broken-links.xml +2 -0
- data/site/build/site/en/downloads.html +200 -0
- data/site/build/site/en/downloads.pdf +151 -0
- data/site/build/site/en/forum.html +197 -0
- data/site/build/site/en/forum.pdf +151 -0
- data/site/build/site/en/geneticAlgorithms.html +591 -0
- data/site/build/site/en/geneticAlgorithms.pdf +934 -0
- data/site/build/site/en/images/ai4r-logo.png +0 -0
- data/site/build/site/en/images/built-with-forrest-button.png +0 -0
- data/site/build/site/en/images/c.png +0 -0
- data/site/build/site/en/images/c_wbn.png +0 -0
- data/site/build/site/en/images/c_wn.png +0 -0
- data/site/build/site/en/images/ero.gif +0 -0
- data/site/build/site/en/images/europe2.png +0 -0
- data/site/build/site/en/images/europe3.png +0 -0
- data/site/build/site/en/images/fitness.png +0 -0
- data/site/build/site/en/images/genetic_algorithms_example.png +0 -0
- data/site/build/site/en/images/instruction_arrow.png +0 -0
- data/site/build/site/en/images/jadeferret.png +0 -0
- data/site/build/site/en/images/my_email.png +0 -0
- data/site/build/site/en/images/neural_network_example.png +0 -0
- data/site/build/site/en/images/rubyforge.png +0 -0
- data/site/build/site/en/images/s.png +0 -0
- data/site/build/site/en/images/s_wbn.png +0 -0
- data/site/build/site/en/images/s_wn.png +0 -0
- data/site/build/site/en/images/sigmoid.png +0 -0
- data/site/build/site/en/images/t.png +0 -0
- data/site/build/site/en/images/t_wbn.png +0 -0
- data/site/build/site/en/images/t_wn.png +0 -0
- data/site/build/site/en/index.html +336 -0
- data/site/build/site/en/index.pdf +508 -0
- data/site/build/site/en/linkmap.html +263 -0
- data/site/build/site/en/linkmap.pdf +94 -0
- data/site/build/site/en/locationmap.xml +72 -0
- data/site/build/site/en/machineLearning.html +339 -0
- data/site/build/site/en/machineLearning.pdf +337 -0
- data/site/build/site/en/neuralNetworks.html +484 -0
- data/site/build/site/en/neuralNetworks.pdf +604 -0
- data/site/build/site/en/skin/CommonMessages_de.xml +23 -0
- data/site/build/site/en/skin/CommonMessages_en_US.xml +23 -0
- data/site/build/site/en/skin/CommonMessages_es.xml +23 -0
- data/site/build/site/en/skin/CommonMessages_fr.xml +23 -0
- data/site/build/site/en/skin/basic.css +166 -0
- data/site/build/site/en/skin/breadcrumbs-optimized.js +90 -0
- data/site/build/site/en/skin/breadcrumbs.js +237 -0
- data/site/build/site/en/skin/fontsize.js +166 -0
- data/site/build/site/en/skin/getBlank.js +40 -0
- data/site/build/site/en/skin/getMenu.js +45 -0
- data/site/build/site/en/skin/images/README.txt +1 -0
- data/site/build/site/en/skin/images/add.jpg +0 -0
- data/site/build/site/en/skin/images/built-with-forrest-button.png +0 -0
- data/site/build/site/en/skin/images/chapter.gif +0 -0
- data/site/build/site/en/skin/images/chapter_open.gif +0 -0
- data/site/build/site/en/skin/images/current.gif +0 -0
- data/site/build/site/en/skin/images/error.png +0 -0
- data/site/build/site/en/skin/images/external-link.gif +0 -0
- data/site/build/site/en/skin/images/fix.jpg +0 -0
- data/site/build/site/en/skin/images/forrest-credit-logo.png +0 -0
- data/site/build/site/en/skin/images/hack.jpg +0 -0
- data/site/build/site/en/skin/images/header_white_line.gif +0 -0
- data/site/build/site/en/skin/images/info.png +0 -0
- data/site/build/site/en/skin/images/instruction_arrow.png +0 -0
- data/site/build/site/en/skin/images/label.gif +0 -0
- data/site/build/site/en/skin/images/page.gif +0 -0
- data/site/build/site/en/skin/images/pdfdoc.gif +0 -0
- data/site/build/site/en/skin/images/poddoc.png +0 -0
- data/site/build/site/en/skin/images/printer.gif +0 -0
- data/site/build/site/en/skin/images/rc-b-l-15-1body-2menu-3menu.png +0 -0
- data/site/build/site/en/skin/images/rc-b-r-15-1body-2menu-3menu.png +0 -0
- data/site/build/site/en/skin/images/rc-b-r-5-1header-2tab-selected-3tab-selected.png +0 -0
- data/site/build/site/en/skin/images/rc-t-l-5-1header-2searchbox-3searchbox.png +0 -0
- data/site/build/site/en/skin/images/rc-t-l-5-1header-2tab-selected-3tab-selected.png +0 -0
- data/site/build/site/en/skin/images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png +0 -0
- data/site/build/site/en/skin/images/rc-t-r-15-1body-2menu-3menu.png +0 -0
- data/site/build/site/en/skin/images/rc-t-r-5-1header-2searchbox-3searchbox.png +0 -0
- data/site/build/site/en/skin/images/rc-t-r-5-1header-2tab-selected-3tab-selected.png +0 -0
- data/site/build/site/en/skin/images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png +0 -0
- data/site/build/site/en/skin/images/remove.jpg +0 -0
- data/site/build/site/en/skin/images/rss.png +0 -0
- data/site/build/site/en/skin/images/spacer.gif +0 -0
- data/site/build/site/en/skin/images/success.png +0 -0
- data/site/build/site/en/skin/images/txtdoc.png +0 -0
- data/site/build/site/en/skin/images/update.jpg +0 -0
- data/site/build/site/en/skin/images/valid-html401.png +0 -0
- data/site/build/site/en/skin/images/vcss.png +0 -0
- data/site/build/site/en/skin/images/warning.png +0 -0
- data/site/build/site/en/skin/images/xmldoc.gif +0 -0
- data/site/build/site/en/skin/menu.js +48 -0
- data/site/build/site/en/skin/note.txt +50 -0
- data/site/build/site/en/skin/print.css +54 -0
- data/site/build/site/en/skin/profile.css +163 -0
- data/site/build/site/en/skin/prototype.js +1257 -0
- data/site/build/site/en/skin/screen.css +587 -0
- data/site/build/site/en/svn.html +252 -0
- data/site/build/site/en/svn.pdf +306 -0
- data/site/build/site/en/wholesite.pdf +1915 -0
- data/site/build/tmp/brokenlinks.xml +2 -0
- data/site/build/tmp/cocoon-work/cache-dir/cocoon-ehcache-1.data +0 -0
- data/site/build/tmp/cocoon-work/cache-dir/cocoon-ehcache-1.index +0 -0
- data/site/build/tmp/locationmap.xml +14 -14
- data/site/build/tmp/output.xmap +23 -23
- data/site/build/tmp/pluginlist2fetchbuild.xml +144 -144
- data/site/build/tmp/projfilters.properties +41 -41
- data/site/build/webapp/WEB-INF/logs/core.log +593 -679
- data/site/build/webapp/WEB-INF/logs/error.log +362 -279
- data/site/build/webapp/WEB-INF/logs/sitemap.log +368 -1015
- data/site/src/documentation/content/xdocs/index.xml +18 -10
- data/site/src/documentation/content/xdocs/machineLearning.xml +4 -3
- data/site/src/documentation/content/xdocs/site.xml +2 -1
- data/site/src/documentation/resources/images/sigmoid.png +0 -0
- data/test/classifiers/id3_test.rb +45 -44
- data/test/classifiers/one_r_test.rb +19 -17
- data/test/classifiers/prism_test.rb +22 -20
- data/test/classifiers/zero_r_test.rb +15 -12
- data/test/clusterers/bisecting_k_means_test.rb +59 -0
- data/test/clusterers/k_means_test.rb +93 -0
- data/test/data/data_set_test.rb +92 -0
- metadata +252 -128
- data/lib/ai4r/classifiers/classifier_helper.rb +0 -54
- data/site/src/documentation/content/xdocs/forum.html +0 -9
- data/site/src/documentation/resources/images/Thumbs.db +0 -0
- data/site/src/documentation/resources/images/sub-dir/Thumbs.db +0 -0
@@ -14,7 +14,6 @@
|
|
14
14
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
15
|
See the License for the specific language governing permissions and
|
16
16
|
limitations under the License.
|
17
|
-
|
18
17
|
-->
|
19
18
|
<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" "http://forrest.apache.org/dtd/document-v20.dtd">
|
20
19
|
<document>
|
@@ -39,6 +38,12 @@
|
|
39
38
|
<li><a href="http://en.wikipedia.org/wiki/Association_rule_learning#Zero-attribute-rule">ZeroR</a></li>
|
40
39
|
</ul>
|
41
40
|
</li>
|
41
|
+
<li><a href="machineLearning.html">Data clustering</a>
|
42
|
+
<ul>
|
43
|
+
<li><a href="http://en.wikipedia.org/wiki/k_means">K-means algorithm</a></li>
|
44
|
+
<li><a href="http://en.wikipedia.org/wiki/k_means">Bisecting k-means</a></li>
|
45
|
+
</ul>
|
46
|
+
</li>
|
42
47
|
</ul>
|
43
48
|
</section>
|
44
49
|
|
@@ -72,22 +77,25 @@
|
|
72
77
|
<p>2. Include require statements in your code:</p>
|
73
78
|
<source>
|
74
79
|
require "rubygems"
|
75
|
-
require "ai4r
|
76
|
-
require "ai4r/classifiers/prism"
|
77
|
-
require "ai4r/classifiers/one_r"
|
78
|
-
require "ai4r/classifiers/zero_r"
|
79
|
-
require "ai4r/neural_network/backpropagation"
|
80
|
-
require "ai4r/genetic_algorithm/genetic_algorithm"
|
80
|
+
require "ai4r"
|
81
81
|
</source>
|
82
82
|
</section>
|
83
83
|
|
84
84
|
<section id="ContactMe">
|
85
85
|
<title>Contact me</title>
|
86
86
|
<p>
|
87
|
-
If you have
|
87
|
+
If you have questions or constructive comments about this project,
|
88
|
+
please post them in the
|
89
|
+
<a href="http://forum.jadeferret.com/viewforum.php?f=3" title="Ai4r Forum">forum</a>.
|
90
|
+
I get an email notification when you post, and I do my best to answer as soon as possible.
|
91
|
+
</p>
|
92
|
+
<p>
|
93
|
+
If you do not want to make it public, send it to me:
|
88
94
|
Sergio Fierens, email address: <img src="images/my_email.png" alt="(sergio (dot) fierens (at) gmail (dot) com)"
|
89
|
-
title="Sergio Fierens contact email"
|
90
|
-
|
95
|
+
title="Sergio Fierens contact email" />. But please, try to post them in the
|
96
|
+
forum. I get tons of emails and it would be great to make them
|
97
|
+
public to help everyone.
|
98
|
+
</p>
|
91
99
|
</section>
|
92
100
|
|
93
101
|
<section id="warranty">
|
@@ -59,7 +59,7 @@ The only information that you have is a collection of examples, provided by a ma
|
|
59
59
|
and identify new posible marketing targets:</p>
|
60
60
|
<source>
|
61
61
|
<![CDATA[
|
62
|
-
id3.
|
62
|
+
id3.get_rules
|
63
63
|
# => if age_range=='<30' then marketing_target='Y'
|
64
64
|
elsif age_range=='[30-50)' and city=='Chicago' then marketing_target='Y'
|
65
65
|
elsif age_range=='[30-50)' and city=='New York' then marketing_target='N'
|
@@ -104,7 +104,8 @@ id3.eval(['New York', '<30', 'M'])
|
|
104
104
|
# => 'Y'
|
105
105
|
]]></source>
|
106
106
|
<p>
|
107
|
-
But instead of going through the tree every time, you can take advantage of the
|
107
|
+
But instead of going through the tree every time, you can take advantage of the
|
108
|
+
fact that the method "get_rules" generates proper ruby code!
|
108
109
|
</p>
|
109
110
|
<source>
|
110
111
|
<![CDATA[
|
@@ -113,7 +114,7 @@ But instead of going through the tree every time, you can take advantage of the
|
|
113
114
|
city = 'New York'
|
114
115
|
gender = 'M'
|
115
116
|
marketing_target = nil
|
116
|
-
eval id3.
|
117
|
+
eval id3.get_rules
|
117
118
|
puts marketing_target
|
118
119
|
# => 'Y'
|
119
120
|
]]></source>
|
@@ -46,7 +46,8 @@ See http://forrest.apache.org/docs/linking.html for more info
|
|
46
46
|
<neuralNetworks label="Neural Networks" href="neuralNetworks.html" description="Backpropagation Neural Network in ruby" />
|
47
47
|
</practicalExamples>
|
48
48
|
<download label="Downloads" href="downloads.html" description="ai4r - Download Files"/>
|
49
|
-
<
|
49
|
+
<forum label="Forum" href="http://forum.jadeferret.com/viewforum.php?f=3" description="Ai4r Forum"/>
|
50
|
+
<rdoc label="API doc (Rdoc)" href="http://ai4r.rubyforge.org/rdoc/index.html" description="Ai4 RDoc docs"/>
|
50
51
|
<svn label="Source Code repository" href="svn.html" description="ai4r Subversion repository"/>
|
51
52
|
<ai4r_site_pdf label="ai4r project PDF" href="wholesite.pdf"/>
|
52
53
|
</about>
|
File without changes
|
@@ -18,7 +18,7 @@ require 'test/unit'
|
|
18
18
|
|
19
19
|
DATA_LABELS = [ 'city', 'age_range', 'gender', 'marketing_target' ]
|
20
20
|
|
21
|
-
|
21
|
+
DATA_ITEMS = [ ['New York', '<30', 'M', 'Y'],
|
22
22
|
['Chicago', '<30', 'M', 'Y'],
|
23
23
|
['Chicago', '<30', 'F', 'Y'],
|
24
24
|
['New York', '<30', 'M', 'Y'],
|
@@ -35,7 +35,7 @@ DATA_SET = [ ['New York', '<30', 'M', 'Y'],
|
|
35
35
|
['Chicago', '>80', 'F', 'Y']
|
36
36
|
]
|
37
37
|
|
38
|
-
|
38
|
+
SPLIT_DATA_ITEMS_BY_CITY = [ [
|
39
39
|
["New York", "<30", "M", "Y"],
|
40
40
|
["New York", "<30", "M", "Y"],
|
41
41
|
["New York", "<30", "M", "Y"],
|
@@ -54,7 +54,7 @@ SPLIT_DATA_SET_BY_CITY = [ [
|
|
54
54
|
["Chicago", ">80", "F", "Y"]]
|
55
55
|
]
|
56
56
|
|
57
|
-
|
57
|
+
SPLIT_DATA_ITEMS_BY_AGE = [ [
|
58
58
|
["New York", "<30", "M", "Y"],
|
59
59
|
["Chicago", "<30", "M", "Y"],
|
60
60
|
["Chicago", "<30", "F", "Y"],
|
@@ -87,6 +87,7 @@ Ai4r::Classifiers::ID3.send(:public, *Ai4r::Classifiers::ID3.protected_instance_
|
|
87
87
|
Ai4r::Classifiers::ID3.send(:public, *Ai4r::Classifiers::ID3.private_instance_methods)
|
88
88
|
|
89
89
|
include Ai4r::Classifiers
|
90
|
+
include Ai4r::Data
|
90
91
|
|
91
92
|
class ID3Test < Test::Unit::TestCase
|
92
93
|
|
@@ -102,75 +103,75 @@ class ID3Test < Test::Unit::TestCase
|
|
102
103
|
end
|
103
104
|
|
104
105
|
def test_data_labels
|
105
|
-
id3 = ID3.new.build(
|
106
|
+
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS))
|
106
107
|
expected_default = [ 'attribute_1', 'attribute_2', 'attribute_3', 'class_value' ]
|
107
|
-
assert_equal(expected_default, id3.data_labels)
|
108
|
-
id3 = ID3.new.build(
|
109
|
-
assert_equal(DATA_LABELS, id3.data_labels)
|
108
|
+
assert_equal(expected_default, id3.data_set.data_labels)
|
109
|
+
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
110
|
+
assert_equal(DATA_LABELS, id3.data_set.data_labels)
|
110
111
|
end
|
111
112
|
|
112
113
|
def test_domain
|
113
|
-
id3 = ID3.new.build(
|
114
|
+
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
114
115
|
expected_domain = [["New York", "Chicago"], ["<30", "[30-50)", "[50-80]", ">80"], ["M", "F"], ["Y", "N"]]
|
115
|
-
assert_equal expected_domain, id3.domain(
|
116
|
+
assert_equal expected_domain, id3.domain(DATA_ITEMS)
|
116
117
|
end
|
117
118
|
|
118
119
|
def test_grid
|
119
|
-
id3 = ID3.new.build(
|
120
|
+
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
120
121
|
expected_grid = [[3, 5], [5, 2]]
|
121
|
-
domain = id3.domain(
|
122
|
-
assert_equal expected_grid, id3.freq_grid(0,
|
122
|
+
domain = id3.domain(DATA_ITEMS)
|
123
|
+
assert_equal expected_grid, id3.freq_grid(0, DATA_ITEMS, domain)
|
123
124
|
expected_grid = [[5, 0], [2, 2], [0, 5], [1, 0]]
|
124
|
-
assert_equal expected_grid, id3.freq_grid(1,
|
125
|
+
assert_equal expected_grid, id3.freq_grid(1, DATA_ITEMS, domain)
|
125
126
|
end
|
126
127
|
|
127
128
|
def test_entropy
|
128
|
-
id3 = ID3.new.build(
|
129
|
+
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
129
130
|
expected_entropy = 0.9118
|
130
|
-
domain = id3.domain(
|
131
|
-
freq_grid = id3.freq_grid(0,
|
132
|
-
assert expected_entropy - id3.entropy(freq_grid,
|
131
|
+
domain = id3.domain(DATA_ITEMS)
|
132
|
+
freq_grid = id3.freq_grid(0, DATA_ITEMS, domain)
|
133
|
+
assert expected_entropy - id3.entropy(freq_grid, DATA_ITEMS.length) < 0.0001
|
133
134
|
expected_entropy = 0.2667
|
134
|
-
freq_grid = id3.freq_grid(1,
|
135
|
-
assert expected_entropy - id3.entropy(freq_grid,
|
135
|
+
freq_grid = id3.freq_grid(1, DATA_ITEMS, domain)
|
136
|
+
assert expected_entropy - id3.entropy(freq_grid, DATA_ITEMS.length) < 0.0001
|
136
137
|
expected_entropy = 0.9688
|
137
|
-
freq_grid = id3.freq_grid(2,
|
138
|
-
assert expected_entropy - id3.entropy(freq_grid,
|
138
|
+
freq_grid = id3.freq_grid(2, DATA_ITEMS, domain)
|
139
|
+
assert expected_entropy - id3.entropy(freq_grid, DATA_ITEMS.length) < 0.0001
|
139
140
|
end
|
140
141
|
|
141
142
|
def test_min_entropy_index
|
142
|
-
id3 = ID3.new.build(
|
143
|
-
domain = id3.domain(
|
144
|
-
assert_equal 1, id3.min_entropy_index(
|
145
|
-
assert_equal 0, id3.min_entropy_index(
|
146
|
-
assert_equal 2, id3.min_entropy_index(
|
143
|
+
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
144
|
+
domain = id3.domain(DATA_ITEMS)
|
145
|
+
assert_equal 1, id3.min_entropy_index(DATA_ITEMS, domain)
|
146
|
+
assert_equal 0, id3.min_entropy_index(DATA_ITEMS, domain, [1])
|
147
|
+
assert_equal 2, id3.min_entropy_index(DATA_ITEMS, domain, [1, 0])
|
147
148
|
end
|
148
149
|
|
149
150
|
def test_split_data_examples
|
150
|
-
id3 = ID3.new.build(
|
151
|
-
domain = id3.domain(
|
152
|
-
res = id3.split_data_examples(
|
153
|
-
assert_equal(
|
154
|
-
res = id3.split_data_examples(
|
155
|
-
assert_equal(
|
151
|
+
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
152
|
+
domain = id3.domain(DATA_ITEMS)
|
153
|
+
res = id3.split_data_examples(DATA_ITEMS, domain, 0)
|
154
|
+
assert_equal(SPLIT_DATA_ITEMS_BY_CITY, res)
|
155
|
+
res = id3.split_data_examples(DATA_ITEMS, domain, 1)
|
156
|
+
assert_equal(SPLIT_DATA_ITEMS_BY_AGE, res)
|
156
157
|
end
|
157
158
|
|
158
159
|
def test_most_freq
|
159
|
-
id3 = ID3.new.build(
|
160
|
-
domain = id3.domain(
|
161
|
-
assert_equal 'Y', id3.most_freq(
|
162
|
-
assert_equal 'Y', id3.most_freq(
|
163
|
-
assert_equal 'N', id3.most_freq(
|
160
|
+
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
161
|
+
domain = id3.domain(DATA_ITEMS)
|
162
|
+
assert_equal 'Y', id3.most_freq(DATA_ITEMS, domain)
|
163
|
+
assert_equal 'Y', id3.most_freq(SPLIT_DATA_ITEMS_BY_AGE[3], domain)
|
164
|
+
assert_equal 'N', id3.most_freq(SPLIT_DATA_ITEMS_BY_AGE[2], domain)
|
164
165
|
end
|
165
166
|
|
166
|
-
def
|
167
|
+
def test_get_rules
|
167
168
|
assert_equal [["marketing_target='N'"]], CategoryNode.new('marketing_target', 'N').get_rules
|
168
|
-
id3 = ID3.new.build(
|
169
|
-
assert_equal EXPECTED_RULES_STRING, id3.
|
169
|
+
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
170
|
+
assert_equal EXPECTED_RULES_STRING, id3.get_rules
|
170
171
|
end
|
171
172
|
|
172
173
|
def test_eval
|
173
|
-
id3 = ID3.new.build(
|
174
|
+
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
174
175
|
#if age_range='<30' then marketing_target='Y'
|
175
176
|
assert_equal 'Y', id3.eval(['New York', '<30', 'F'])
|
176
177
|
assert_equal 'Y', id3.eval(['Chicago', '<30', 'M'])
|
@@ -189,16 +190,16 @@ class ID3Test < Test::Unit::TestCase
|
|
189
190
|
end
|
190
191
|
|
191
192
|
def test_rules_eval
|
192
|
-
id3 = ID3.new.build(
|
193
|
+
id3 = ID3.new.build(DataSet.new(:data_items =>DATA_ITEMS, :data_labels => DATA_LABELS))
|
193
194
|
#if age_range='<30' then marketing_target='Y'
|
194
195
|
age_range = '<30'
|
195
196
|
marketing_target = nil
|
196
|
-
eval id3.
|
197
|
+
eval id3.get_rules
|
197
198
|
assert_equal 'Y', marketing_target
|
198
199
|
#if age_range='[30-50)' and city='New York' then marketing_target='N'
|
199
200
|
age_range='[30-50)'
|
200
201
|
city='New York'
|
201
|
-
eval id3.
|
202
|
+
eval id3.get_rules
|
202
203
|
assert_equal 'N', marketing_target
|
203
204
|
end
|
204
205
|
end
|
@@ -6,6 +6,7 @@ require File.dirname(__FILE__) + '/../../lib/ai4r/classifiers/one_r'
|
|
6
6
|
class OneRTest < Test::Unit::TestCase
|
7
7
|
|
8
8
|
include Ai4r::Classifiers
|
9
|
+
include Ai4r::Data
|
9
10
|
|
10
11
|
@@data_examples = [ ['New York', '<30', 'M', 'Y'],
|
11
12
|
['Chicago', '<30', 'M', 'Y'],
|
@@ -19,42 +20,43 @@ class OneRTest < Test::Unit::TestCase
|
|
19
20
|
@@data_labels = [ 'city', 'age_range', 'gender', 'marketing_target' ]
|
20
21
|
|
21
22
|
def test_build
|
22
|
-
assert_raise(ArgumentError) { OneR.new.build(
|
23
|
-
|
24
|
-
classifier
|
25
|
-
assert_not_nil(classifier.data_labels)
|
23
|
+
assert_raise(ArgumentError) { OneR.new.build(DataSet.new) }
|
24
|
+
classifier = OneR.new.build(DataSet.new(:data_items => @@data_examples))
|
25
|
+
assert_not_nil(classifier.data_set.data_labels)
|
26
26
|
assert_not_nil(classifier.rule)
|
27
|
-
assert_equal("attribute_1", classifier.data_labels.first)
|
28
|
-
assert_equal("class_value", classifier.data_labels.last)
|
29
|
-
classifier = OneR.new.build(@@data_examples,
|
30
|
-
|
27
|
+
assert_equal("attribute_1", classifier.data_set.data_labels.first)
|
28
|
+
assert_equal("class_value", classifier.data_set.data_labels.last)
|
29
|
+
classifier = OneR.new.build(DataSet.new(:data_items => @@data_examples,
|
30
|
+
:data_labels => @@data_labels))
|
31
|
+
assert_not_nil(classifier.data_set.data_labels)
|
31
32
|
assert_not_nil(classifier.rule)
|
32
|
-
assert_equal("city", classifier.data_labels.first)
|
33
|
-
assert_equal("marketing_target", classifier.data_labels.last)
|
33
|
+
assert_equal("city", classifier.data_set.data_labels.first)
|
34
|
+
assert_equal("marketing_target", classifier.data_set.data_labels.last)
|
34
35
|
assert_equal(1, classifier.rule[:attr_index])
|
35
36
|
end
|
36
37
|
|
37
38
|
def test_eval
|
38
|
-
classifier = OneR.new.build(@@data_examples)
|
39
|
+
classifier = OneR.new.build(DataSet.new(:data_items => @@data_examples))
|
39
40
|
assert_equal("Y", classifier.eval(['New York', '<30', 'M']))
|
40
41
|
assert_equal("N", classifier.eval(['New York', '[30-50)', 'M']))
|
41
42
|
assert_equal("N", classifier.eval(['Chicago', '[50-80]', 'M']))
|
42
43
|
end
|
43
44
|
|
44
|
-
def
|
45
|
-
classifier = OneR.new.build(@@data_examples,
|
45
|
+
def test_get_rules
|
46
|
+
classifier = OneR.new.build(DataSet.new(:data_items => @@data_examples,
|
47
|
+
:data_labels => @@data_labels))
|
46
48
|
marketing_target = nil
|
47
49
|
age_range = nil
|
48
|
-
eval(classifier.
|
50
|
+
eval(classifier.get_rules)
|
49
51
|
assert_nil(marketing_target)
|
50
52
|
age_range = '<30'
|
51
|
-
eval(classifier.
|
53
|
+
eval(classifier.get_rules)
|
52
54
|
assert_equal("Y", marketing_target)
|
53
55
|
age_range = '[30-50)'
|
54
|
-
eval(classifier.
|
56
|
+
eval(classifier.get_rules)
|
55
57
|
assert_equal("N", marketing_target)
|
56
58
|
age_range = '[50-80]'
|
57
|
-
eval(classifier.
|
59
|
+
eval(classifier.get_rules)
|
58
60
|
assert_equal("N", marketing_target)
|
59
61
|
end
|
60
62
|
|
@@ -9,6 +9,7 @@ Ai4r::Classifiers::Prism.send(:public, *Ai4r::Classifiers::Prism.private_instanc
|
|
9
9
|
class PrismTest < Test::Unit::TestCase
|
10
10
|
|
11
11
|
include Ai4r::Classifiers
|
12
|
+
include Ai4r::Data
|
12
13
|
|
13
14
|
@@data_examples = [ ['New York', '<30', 'M', 'Y'],
|
14
15
|
['Chicago', '<30', 'M', 'Y'],
|
@@ -30,52 +31,53 @@ class PrismTest < Test::Unit::TestCase
|
|
30
31
|
@@data_labels = [ 'city', 'age_range', 'gender', 'marketing_target' ]
|
31
32
|
|
32
33
|
def test_build
|
33
|
-
assert_raise(ArgumentError) { Prism.new.build(
|
34
|
-
|
35
|
-
classifier
|
36
|
-
assert_not_nil(classifier.data_labels)
|
34
|
+
assert_raise(ArgumentError) { Prism.new.build(DataSet.new) }
|
35
|
+
classifier = Prism.new.build(DataSet.new(:data_items=>@@data_examples))
|
36
|
+
assert_not_nil(classifier.data_set.data_labels)
|
37
37
|
assert_not_nil(classifier.rules)
|
38
|
-
assert_equal("attribute_1", classifier.data_labels.first)
|
39
|
-
assert_equal("class_value", classifier.data_labels.last)
|
40
|
-
classifier = Prism.new.build(@@data_examples,
|
41
|
-
|
38
|
+
assert_equal("attribute_1", classifier.data_set.data_labels.first)
|
39
|
+
assert_equal("class_value", classifier.data_set.data_labels.last)
|
40
|
+
classifier = Prism.new.build(DataSet.new(:data_items => @@data_examples,
|
41
|
+
:data_labels => @@data_labels))
|
42
|
+
assert_not_nil(classifier.data_set.data_labels)
|
42
43
|
assert_not_nil(classifier.rules)
|
43
|
-
assert_equal("city", classifier.data_labels.first)
|
44
|
-
assert_equal("marketing_target", classifier.data_labels.last)
|
44
|
+
assert_equal("city", classifier.data_set.data_labels.first)
|
45
|
+
assert_equal("marketing_target", classifier.data_set.data_labels.last)
|
45
46
|
assert !classifier.rules.empty?
|
46
47
|
end
|
47
48
|
|
48
49
|
def test_eval
|
49
|
-
classifier = Prism.new.build(
|
50
|
+
classifier = Prism.new.build(DataSet.new(:data_items=>@@data_examples))
|
50
51
|
@@data_examples.each do |data|
|
51
52
|
assert_equal(data.last, classifier.eval(data[0...-1]))
|
52
53
|
end
|
53
54
|
end
|
54
55
|
|
55
|
-
def
|
56
|
-
classifier = Prism.new.build(@@data_examples,
|
56
|
+
def test_get_rules
|
57
|
+
classifier = Prism.new.build(DataSet.new(:data_items => @@data_examples,
|
58
|
+
:data_labels => @@data_labels))
|
57
59
|
marketing_target = nil
|
58
60
|
age_range = nil
|
59
61
|
city = 'Chicago'
|
60
|
-
eval(classifier.
|
62
|
+
eval(classifier.get_rules)
|
61
63
|
age_range = '<30'
|
62
|
-
eval(classifier.
|
64
|
+
eval(classifier.get_rules)
|
63
65
|
assert_equal("Y", marketing_target)
|
64
66
|
age_range = '[30-50)'
|
65
|
-
eval(classifier.
|
67
|
+
eval(classifier.get_rules)
|
66
68
|
assert_equal("Y", marketing_target)
|
67
69
|
age_range = '[30-50)'
|
68
70
|
city = 'New York'
|
69
|
-
eval(classifier.
|
71
|
+
eval(classifier.get_rules)
|
70
72
|
assert_equal("N", marketing_target)
|
71
73
|
age_range = '[50-80]'
|
72
|
-
eval(classifier.
|
74
|
+
eval(classifier.get_rules)
|
73
75
|
assert_equal("N", marketing_target)
|
74
76
|
end
|
75
77
|
|
76
78
|
def test_matches_conditions
|
77
|
-
classifier = Prism.new
|
78
|
-
|
79
|
+
classifier = Prism.new.build(DataSet.new(:data_labels => @@data_labels,
|
80
|
+
:data_items => @@data_examples))
|
79
81
|
assert classifier.matches_conditions(['New York', '<30', 'M', 'Y'], {"age_range" => "<30"})
|
80
82
|
assert !classifier.matches_conditions(['New York', '<30', 'M', 'Y'], {"age_range" => "[50-80]"})
|
81
83
|
end
|
@@ -2,10 +2,12 @@ $:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
|
2
2
|
|
3
3
|
require 'test/unit'
|
4
4
|
require File.dirname(__FILE__) + '/../../lib/ai4r/classifiers/zero_r'
|
5
|
+
require File.dirname(__FILE__) + '/../../lib/ai4r/data/data_set'
|
5
6
|
|
6
7
|
class ZeroRTest < Test::Unit::TestCase
|
7
8
|
|
8
9
|
include Ai4r::Classifiers
|
10
|
+
include Ai4r::Data
|
9
11
|
|
10
12
|
@@data_examples = [ ['New York', '<30', 'M', 'Y'],
|
11
13
|
['Chicago', '<30', 'M', 'Y'],
|
@@ -19,28 +21,29 @@ class ZeroRTest < Test::Unit::TestCase
|
|
19
21
|
@@data_labels = [ 'city', 'age_range', 'gender', 'marketing_target' ]
|
20
22
|
|
21
23
|
def test_build
|
22
|
-
assert_raise(ArgumentError) { ZeroR.new.build(
|
23
|
-
|
24
|
-
classifier = ZeroR.new.build(@@data_examples)
|
24
|
+
assert_raise(ArgumentError) { ZeroR.new.build(DataSet.new) }
|
25
|
+
classifier = ZeroR.new.build(DataSet.new(:data_items => @@data_examples))
|
25
26
|
assert_equal("Y", classifier.class_value)
|
26
|
-
assert_equal("attribute_1", classifier.data_labels.first)
|
27
|
-
assert_equal("class_value", classifier.data_labels.last)
|
28
|
-
classifier = ZeroR.new.build(@@data_examples,
|
27
|
+
assert_equal("attribute_1", classifier.data_set.data_labels.first)
|
28
|
+
assert_equal("class_value", classifier.data_set.data_labels.last)
|
29
|
+
classifier = ZeroR.new.build(DataSet.new(:data_items => @@data_examples,
|
30
|
+
:data_labels => @@data_labels))
|
29
31
|
assert_equal("Y", classifier.class_value)
|
30
|
-
assert_equal("city", classifier.data_labels.first)
|
31
|
-
assert_equal("marketing_target", classifier.data_labels.last)
|
32
|
+
assert_equal("city", classifier.data_set.data_labels.first)
|
33
|
+
assert_equal("marketing_target", classifier.data_set.data_labels.last)
|
32
34
|
end
|
33
35
|
|
34
36
|
def test_eval
|
35
|
-
classifier = ZeroR.new.build(@@data_examples)
|
37
|
+
classifier = ZeroR.new.build(DataSet.new(:data_items => @@data_examples))
|
36
38
|
assert_equal('Y', classifier.eval(@@data_examples.first) )
|
37
39
|
assert_equal('Y', classifier.eval(@@data_examples.last) )
|
38
40
|
end
|
39
41
|
|
40
|
-
def
|
41
|
-
classifier = ZeroR.new.build(@@data_examples,
|
42
|
+
def test_get_rules
|
43
|
+
classifier = ZeroR.new.build(DataSet.new(:data_items => @@data_examples,
|
44
|
+
:data_labels => @@data_labels))
|
42
45
|
marketing_target = nil
|
43
|
-
eval(classifier.
|
46
|
+
eval(classifier.get_rules)
|
44
47
|
assert_equal('Y', marketing_target)
|
45
48
|
end
|
46
49
|
|