ai4r 1.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.
- data/README.rdoc +48 -0
- data/examples/decision_trees/data_set.csv +121 -0
- data/examples/decision_trees/id3_example.rb +31 -0
- data/examples/decision_trees/results.txt +29 -0
- data/examples/genetic_algorithm/genetic_algorithm_example.rb +39 -0
- data/examples/genetic_algorithm/travel_cost.csv +16 -0
- data/examples/neural_network/backpropagation_example.rb +65 -0
- data/examples/neural_network/patterns_with_base_noise.rb +68 -0
- data/examples/neural_network/patterns_with_noise.rb +66 -0
- data/examples/neural_network/training_patterns.rb +68 -0
- data/lib/decision_tree/id3.rb +354 -0
- data/lib/genetic_algorithm/genetic_algorithm.rb +268 -0
- data/lib/neural_network/backpropagation.rb +259 -0
- data/site/build/site/en/broken-links.xml +2 -0
- data/site/build/site/en/downloads.html +187 -0
- data/site/build/site/en/downloads.pdf +151 -0
- data/site/build/site/en/geneticAlgorithms.html +564 -0
- data/site/build/site/en/geneticAlgorithms.pdf +911 -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/instruction_arrow.png +0 -0
- data/site/build/site/en/images/my_email.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 +258 -0
- data/site/build/site/en/index.pdf +306 -0
- data/site/build/site/en/linkmap.html +231 -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 +325 -0
- data/site/build/site/en/machineLearning.pdf +337 -0
- data/site/build/site/en/neuralNetworks.html +446 -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 +223 -0
- data/site/build/site/en/svn.pdf +239 -0
- data/site/build/site/en/wholesite.pdf +1686 -0
- data/site/build/tmp/brokenlinks.xml +2 -0
- data/site/build/tmp/build-info.xml +5 -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/input.xmap +32 -0
- data/site/build/tmp/internal.xmap +32 -0
- data/site/build/tmp/locationmap.xml +29 -0
- data/site/build/tmp/output.xmap +38 -0
- data/site/build/tmp/pluginlist2fetchbuild.xml +144 -0
- data/site/build/tmp/plugins-1.xml +212 -0
- data/site/build/tmp/plugins-2.xml +347 -0
- data/site/build/tmp/projfilters.properties +41 -0
- data/site/build/tmp/resources.xmap +32 -0
- data/site/build/webapp/WEB-INF/logs/access.log +0 -0
- data/site/build/webapp/WEB-INF/logs/core.log +788 -0
- data/site/build/webapp/WEB-INF/logs/debug.log +0 -0
- data/site/build/webapp/WEB-INF/logs/error.log +248 -0
- data/site/build/webapp/WEB-INF/logs/flow.log +0 -0
- data/site/build/webapp/WEB-INF/logs/idgen.log +0 -0
- data/site/build/webapp/WEB-INF/logs/linkrewriter.log +0 -0
- data/site/build/webapp/WEB-INF/logs/locationmap.log +0 -0
- data/site/build/webapp/WEB-INF/logs/sitemap.log +0 -0
- data/site/build/webapp/WEB-INF/logs/xmlform.log +0 -0
- data/site/forrest.properties +152 -0
- data/site/forrest.properties.dispatcher.properties +25 -0
- data/site/forrest.properties.xml +29 -0
- data/site/src/documentation/README.txt +7 -0
- data/site/src/documentation/classes/CatalogManager.properties +62 -0
- data/site/src/documentation/content/locationmap.xml +72 -0
- data/site/src/documentation/content/xdocs/downloads.html +9 -0
- data/site/src/documentation/content/xdocs/geneticAlgorithms.xml +280 -0
- data/site/src/documentation/content/xdocs/index.xml +73 -0
- data/site/src/documentation/content/xdocs/machineLearning.xml +129 -0
- data/site/src/documentation/content/xdocs/neuralNetworks.xml +218 -0
- data/site/src/documentation/content/xdocs/site.xml +51 -0
- data/site/src/documentation/content/xdocs/svn.xml +31 -0
- data/site/src/documentation/content/xdocs/tabs.xml +35 -0
- data/site/src/documentation/resources/images/ai4r-logo.png +0 -0
- data/site/src/documentation/resources/images/c.png +0 -0
- data/site/src/documentation/resources/images/c_wbn.png +0 -0
- data/site/src/documentation/resources/images/c_wn.png +0 -0
- data/site/src/documentation/resources/images/ellipse-2.svg +30 -0
- data/site/src/documentation/resources/images/ero.gif +0 -0
- data/site/src/documentation/resources/images/europe2.png +0 -0
- data/site/src/documentation/resources/images/europe3.png +0 -0
- data/site/src/documentation/resources/images/fitness.png +0 -0
- data/site/src/documentation/resources/images/icon-a.png +0 -0
- data/site/src/documentation/resources/images/icon-b.png +0 -0
- data/site/src/documentation/resources/images/icon.png +0 -0
- data/site/src/documentation/resources/images/my_email.png +0 -0
- data/site/src/documentation/resources/images/project-logo.png +0 -0
- data/site/src/documentation/resources/images/rubyforge.png +0 -0
- data/site/src/documentation/resources/images/s.png +0 -0
- data/site/src/documentation/resources/images/s_wbn.png +0 -0
- data/site/src/documentation/resources/images/s_wn.png +0 -0
- data/site/src/documentation/resources/images/sigmoid.png +0 -0
- data/site/src/documentation/resources/images/sub-dir/icon-c.png +0 -0
- data/site/src/documentation/resources/images/t.png +0 -0
- data/site/src/documentation/resources/images/t_wbn.png +0 -0
- data/site/src/documentation/resources/images/t_wn.png +0 -0
- data/site/src/documentation/resources/schema/catalog.xcat +29 -0
- data/site/src/documentation/resources/schema/hello-v10.dtd +51 -0
- data/site/src/documentation/resources/schema/symbols-project-v10.ent +26 -0
- data/site/src/documentation/resources/stylesheets/hello2document.xsl +33 -0
- data/site/src/documentation/sitemap.xmap +66 -0
- data/site/src/documentation/skinconf.xml +418 -0
- data/site/src/documentation/translations/langcode.xml +29 -0
- data/site/src/documentation/translations/languages_de.xml +24 -0
- data/site/src/documentation/translations/languages_en.xml +24 -0
- data/site/src/documentation/translations/languages_es.xml +22 -0
- data/site/src/documentation/translations/languages_fr.xml +24 -0
- data/site/src/documentation/translations/languages_nl.xml +24 -0
- data/site/src/documentation/translations/menu.xml +33 -0
- data/site/src/documentation/translations/menu_af.xml +33 -0
- data/site/src/documentation/translations/menu_de.xml +33 -0
- data/site/src/documentation/translations/menu_es.xml +33 -0
- data/site/src/documentation/translations/menu_fr.xml +33 -0
- data/site/src/documentation/translations/menu_it.xml +33 -0
- data/site/src/documentation/translations/menu_nl.xml +33 -0
- data/site/src/documentation/translations/menu_no.xml +33 -0
- data/site/src/documentation/translations/menu_ru.xml +33 -0
- data/site/src/documentation/translations/menu_sk.xml +33 -0
- data/site/src/documentation/translations/tabs.xml +22 -0
- data/site/src/documentation/translations/tabs_de.xml +22 -0
- data/site/src/documentation/translations/tabs_es.xml +22 -0
- data/site/src/documentation/translations/tabs_fr.xml +22 -0
- data/site/src/documentation/translations/tabs_nl.xml +22 -0
- data/test/decision_tree/id3_test.rb +209 -0
- data/test/genetic_algorithm/chromosome_test.rb +55 -0
- data/test/genetic_algorithm/genetic_algorithm_test.rb +78 -0
- data/test/neural_network/backpropagation_test.rb +44 -0
- metadata +274 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
4
|
+
contributor license agreements. See the NOTICE file distributed with
|
|
5
|
+
this work for additional information regarding copyright ownership.
|
|
6
|
+
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
7
|
+
(the "License"); you may not use this file except in compliance with
|
|
8
|
+
the License. You may obtain a copy of the License at
|
|
9
|
+
|
|
10
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
|
|
12
|
+
Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
See the License for the specific language governing permissions and
|
|
16
|
+
limitations under the License.
|
|
17
|
+
-->
|
|
18
|
+
<catalogue xml:lang="sk">
|
|
19
|
+
<message key="About">O programe</message>
|
|
20
|
+
<message key="Index">Zoznám</message>
|
|
21
|
+
<message key="Changes">Zmeny</message>
|
|
22
|
+
<message key="Todo">Úlohy</message>
|
|
23
|
+
<message key="Samples">Príklady</message>
|
|
24
|
+
<message key="Apache document">Apache Document</message>
|
|
25
|
+
<message key="Static content">Statický Obsah</message>
|
|
26
|
+
<message key="Linking">Linking</message>
|
|
27
|
+
<message key="Wiki page">Wiki stránka</message>
|
|
28
|
+
<message key="ihtml page">ihtml stránka</message>
|
|
29
|
+
<message key="ehtml page">ehtml stránka</message>
|
|
30
|
+
<message key="FAQ">Casté Otázky</message>
|
|
31
|
+
<message key="Simplifed Docbook">Simplifed Docbook stránka</message>
|
|
32
|
+
<message key="XSP page">XSP stránka</message>
|
|
33
|
+
</catalogue>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<?xml version="1.0"?>
|
|
2
|
+
<!--
|
|
3
|
+
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
4
|
+
contributor license agreements. See the NOTICE file distributed with
|
|
5
|
+
this work for additional information regarding copyright ownership.
|
|
6
|
+
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
7
|
+
(the "License"); you may not use this file except in compliance with
|
|
8
|
+
the License. You may obtain a copy of the License at
|
|
9
|
+
|
|
10
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
|
|
12
|
+
Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
See the License for the specific language governing permissions and
|
|
16
|
+
limitations under the License.
|
|
17
|
+
-->
|
|
18
|
+
<catalogue xml:lang="en">
|
|
19
|
+
<message key="Home">Home</message>
|
|
20
|
+
<message key="Samples">Samples</message>
|
|
21
|
+
<message key="Apache XML Projects">Apache XML Projects</message>
|
|
22
|
+
</catalogue>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<?xml version="1.0"?>
|
|
2
|
+
<!--
|
|
3
|
+
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
4
|
+
contributor license agreements. See the NOTICE file distributed with
|
|
5
|
+
this work for additional information regarding copyright ownership.
|
|
6
|
+
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
7
|
+
(the "License"); you may not use this file except in compliance with
|
|
8
|
+
the License. You may obtain a copy of the License at
|
|
9
|
+
|
|
10
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
|
|
12
|
+
Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
See the License for the specific language governing permissions and
|
|
16
|
+
limitations under the License.
|
|
17
|
+
-->
|
|
18
|
+
<catalogue xml:lang="de">
|
|
19
|
+
<message key="Home">Home</message>
|
|
20
|
+
<message key="Samples">Beispiele</message>
|
|
21
|
+
<message key="Apache XML Projects">Apache XML Projekte</message>
|
|
22
|
+
</catalogue>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<?xml version="1.0"?>
|
|
2
|
+
<!--
|
|
3
|
+
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
4
|
+
contributor license agreements. See the NOTICE file distributed with
|
|
5
|
+
this work for additional information regarding copyright ownership.
|
|
6
|
+
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
7
|
+
(the "License"); you may not use this file except in compliance with
|
|
8
|
+
the License. You may obtain a copy of the License at
|
|
9
|
+
|
|
10
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
|
|
12
|
+
Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
See the License for the specific language governing permissions and
|
|
16
|
+
limitations under the License.
|
|
17
|
+
-->
|
|
18
|
+
<catalogue xml:lang="es">
|
|
19
|
+
<message key="Home">Inicio</message>
|
|
20
|
+
<message key="Samples">Ejemplos</message>
|
|
21
|
+
<message key="Apache XML Projects">Projectos XML Apache</message>
|
|
22
|
+
</catalogue>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<?xml version="1.0"?>
|
|
2
|
+
<!--
|
|
3
|
+
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
4
|
+
contributor license agreements. See the NOTICE file distributed with
|
|
5
|
+
this work for additional information regarding copyright ownership.
|
|
6
|
+
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
7
|
+
(the "License"); you may not use this file except in compliance with
|
|
8
|
+
the License. You may obtain a copy of the License at
|
|
9
|
+
|
|
10
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
|
|
12
|
+
Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
See the License for the specific language governing permissions and
|
|
16
|
+
limitations under the License.
|
|
17
|
+
-->
|
|
18
|
+
<catalogue xml:lang="fr">
|
|
19
|
+
<message key="Home">Accueil</message>
|
|
20
|
+
<message key="Samples">Exemples</message>
|
|
21
|
+
<message key="Apache XML Projects">Projets Apache XML</message>
|
|
22
|
+
</catalogue>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<?xml version="1.0"?>
|
|
2
|
+
<!--
|
|
3
|
+
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
4
|
+
contributor license agreements. See the NOTICE file distributed with
|
|
5
|
+
this work for additional information regarding copyright ownership.
|
|
6
|
+
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
7
|
+
(the "License"); you may not use this file except in compliance with
|
|
8
|
+
the License. You may obtain a copy of the License at
|
|
9
|
+
|
|
10
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
|
|
12
|
+
Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
See the License for the specific language governing permissions and
|
|
16
|
+
limitations under the License.
|
|
17
|
+
-->
|
|
18
|
+
<catalogue xml:lang="nl">
|
|
19
|
+
<message key="Home">Home</message>
|
|
20
|
+
<message key="Samples">Voorbeelden</message>
|
|
21
|
+
<message key="Apache XML Projects">Apache XML Projecten</message>
|
|
22
|
+
</catalogue>
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
#
|
|
2
|
+
# id3_test.rb
|
|
3
|
+
#
|
|
4
|
+
# This is a unit test file for the ID3 algorithm (Quinlan) implemented
|
|
5
|
+
# in ai4r
|
|
6
|
+
#
|
|
7
|
+
# Author:: Sergio Fierens
|
|
8
|
+
# License:: MPL 1.1
|
|
9
|
+
# Project:: ai4r
|
|
10
|
+
# Url:: http://ai4r.rubyforge.org/
|
|
11
|
+
#
|
|
12
|
+
# You can redistribute it and/or modify it under the terms of
|
|
13
|
+
# the Mozilla Public License version 1.1 as published by the
|
|
14
|
+
# Mozilla Foundation at http://www.mozilla.org/MPL/MPL-1.1.txt
|
|
15
|
+
#
|
|
16
|
+
|
|
17
|
+
require File.dirname(__FILE__) + '/../../lib/decision_tree/id3'
|
|
18
|
+
require 'test/unit'
|
|
19
|
+
|
|
20
|
+
DATA_LABELS = [ 'city', 'age_range', 'gender', 'marketing_target' ]
|
|
21
|
+
|
|
22
|
+
DATA_SET = [ ['New York', '<30', 'M', 'Y'],
|
|
23
|
+
['Chicago', '<30', 'M', 'Y'],
|
|
24
|
+
['Chicago', '<30', 'F', 'Y'],
|
|
25
|
+
['New York', '<30', 'M', 'Y'],
|
|
26
|
+
['New York', '<30', 'M', 'Y'],
|
|
27
|
+
['Chicago', '[30-50)', 'M', 'Y'],
|
|
28
|
+
['New York', '[30-50)', 'F', 'N'],
|
|
29
|
+
['Chicago', '[30-50)', 'F', 'Y'],
|
|
30
|
+
['New York', '[30-50)', 'F', 'N'],
|
|
31
|
+
['Chicago', '[50-80]', 'M', 'N'],
|
|
32
|
+
['New York', '[50-80]', 'F', 'N'],
|
|
33
|
+
['New York', '[50-80]', 'M', 'N'],
|
|
34
|
+
['Chicago', '[50-80]', 'M', 'N'],
|
|
35
|
+
['New York', '[50-80]', 'F', 'N'],
|
|
36
|
+
['Chicago', '>80', 'F', 'Y']
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
SPLIT_DATA_SET_BY_CITY = [ [
|
|
40
|
+
["New York", "<30", "M", "Y"],
|
|
41
|
+
["New York", "<30", "M", "Y"],
|
|
42
|
+
["New York", "<30", "M", "Y"],
|
|
43
|
+
["New York", "[30-50)", "F", "N"],
|
|
44
|
+
["New York", "[30-50)", "F", "N"],
|
|
45
|
+
["New York", "[50-80]", "F", "N"],
|
|
46
|
+
["New York", "[50-80]", "M", "N"],
|
|
47
|
+
["New York", "[50-80]", "F", "N"]],
|
|
48
|
+
[
|
|
49
|
+
["Chicago", "<30", "M", "Y"],
|
|
50
|
+
["Chicago", "<30", "F", "Y"],
|
|
51
|
+
["Chicago", "[30-50)", "M", "Y"],
|
|
52
|
+
["Chicago", "[30-50)", "F", "Y"],
|
|
53
|
+
["Chicago", "[50-80]", "M", "N"],
|
|
54
|
+
["Chicago", "[50-80]", "M", "N"],
|
|
55
|
+
["Chicago", ">80", "F", "Y"]]
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
SPLIT_DATA_SET_BY_AGE = [ [
|
|
59
|
+
["New York", "<30", "M", "Y"],
|
|
60
|
+
["Chicago", "<30", "M", "Y"],
|
|
61
|
+
["Chicago", "<30", "F", "Y"],
|
|
62
|
+
["New York", "<30", "M", "Y"],
|
|
63
|
+
["New York", "<30", "M", "Y"]],
|
|
64
|
+
[
|
|
65
|
+
["Chicago", "[30-50)", "M", "Y"],
|
|
66
|
+
["New York", "[30-50)", "F", "N"],
|
|
67
|
+
["Chicago", "[30-50)", "F", "Y"],
|
|
68
|
+
["New York", "[30-50)", "F", "N"]],
|
|
69
|
+
[
|
|
70
|
+
["Chicago", "[50-80]", "M", "N"],
|
|
71
|
+
["New York", "[50-80]", "F", "N"],
|
|
72
|
+
["New York", "[50-80]", "M", "N"],
|
|
73
|
+
["Chicago", "[50-80]", "M", "N"],
|
|
74
|
+
["New York", "[50-80]", "F", "N"]],
|
|
75
|
+
[
|
|
76
|
+
["Chicago", ">80", "F", "Y"]]
|
|
77
|
+
]
|
|
78
|
+
|
|
79
|
+
EXPECTED_RULES_STRING =
|
|
80
|
+
"if age_range=='<30' then marketing_target='Y'\n"+
|
|
81
|
+
"elsif age_range=='[30-50)' and city=='Chicago' then marketing_target='Y'\n"+
|
|
82
|
+
"elsif age_range=='[30-50)' and city=='New York' then marketing_target='N'\n"+
|
|
83
|
+
"elsif age_range=='[50-80]' then marketing_target='N'\n"+
|
|
84
|
+
"elsif age_range=='>80' then marketing_target='Y'\n"+
|
|
85
|
+
"else raise 'There was not enough information during training to do a proper induction for this data element' end"
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
DecisionTree::ID3.send(:public, *DecisionTree::ID3.protected_instance_methods)
|
|
89
|
+
DecisionTree::ID3.send(:public, *DecisionTree::ID3.private_instance_methods)
|
|
90
|
+
|
|
91
|
+
module DecisionTree
|
|
92
|
+
|
|
93
|
+
class ID3Test < Test::Unit::TestCase
|
|
94
|
+
|
|
95
|
+
def test_log2
|
|
96
|
+
assert_equal 1.0, DecisionTree::ID3.log2(2)
|
|
97
|
+
assert_equal 0.0, DecisionTree::ID3.log2(0)
|
|
98
|
+
assert 1.585 - DecisionTree::ID3.log2(3) < 0.001
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def test_sum
|
|
102
|
+
assert_equal 28, DecisionTree::ID3.sum([5, 0, 22, 1])
|
|
103
|
+
assert_equal 0, DecisionTree::ID3.sum([])
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def test_data_labels
|
|
107
|
+
id3 = DecisionTree::ID3.new(DATA_SET)
|
|
108
|
+
expected_default = [ 'ATTRIBUTE_1', 'ATTRIBUTE_2', 'ATTRIBUTE_3', 'CATEGORY' ]
|
|
109
|
+
assert_equal(expected_default, id3.data_labels)
|
|
110
|
+
id3 = DecisionTree::ID3.new(DATA_SET, DATA_LABELS)
|
|
111
|
+
assert_equal(DATA_LABELS, id3.data_labels)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def test_domain
|
|
115
|
+
id3 = DecisionTree::ID3.new(DATA_SET, 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_SET)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def test_grid
|
|
121
|
+
id3 = DecisionTree::ID3.new(DATA_SET, DATA_LABELS)
|
|
122
|
+
expected_grid = [[3, 5], [5, 2]]
|
|
123
|
+
domain = id3.domain(DATA_SET)
|
|
124
|
+
assert_equal expected_grid, id3.freq_grid(0, DATA_SET, domain)
|
|
125
|
+
expected_grid = [[5, 0], [2, 2], [0, 5], [1, 0]]
|
|
126
|
+
assert_equal expected_grid, id3.freq_grid(1, DATA_SET, domain)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def test_entropy
|
|
130
|
+
id3 = DecisionTree::ID3.new(DATA_SET, DATA_LABELS)
|
|
131
|
+
expected_entropy = 0.9118
|
|
132
|
+
domain = id3.domain(DATA_SET)
|
|
133
|
+
freq_grid = id3.freq_grid(0, DATA_SET, domain)
|
|
134
|
+
assert expected_entropy - id3.entropy(freq_grid, DATA_SET.length) < 0.0001
|
|
135
|
+
expected_entropy = 0.2667
|
|
136
|
+
freq_grid = id3.freq_grid(1, DATA_SET, domain)
|
|
137
|
+
assert expected_entropy - id3.entropy(freq_grid, DATA_SET.length) < 0.0001
|
|
138
|
+
expected_entropy = 0.9688
|
|
139
|
+
freq_grid = id3.freq_grid(2, DATA_SET, domain)
|
|
140
|
+
assert expected_entropy - id3.entropy(freq_grid, DATA_SET.length) < 0.0001
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def test_min_entropy_index
|
|
144
|
+
id3 = DecisionTree::ID3.new(DATA_SET, DATA_LABELS)
|
|
145
|
+
domain = id3.domain(DATA_SET)
|
|
146
|
+
assert_equal 1, id3.min_entropy_index(DATA_SET, domain)
|
|
147
|
+
assert_equal 0, id3.min_entropy_index(DATA_SET, domain, [1])
|
|
148
|
+
assert_equal 2, id3.min_entropy_index(DATA_SET, domain, [1, 0])
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def test_split_data_examples
|
|
152
|
+
id3 = DecisionTree::ID3.new(DATA_SET, DATA_LABELS)
|
|
153
|
+
domain = id3.domain(DATA_SET)
|
|
154
|
+
res = id3.split_data_examples(DATA_SET, domain, 0)
|
|
155
|
+
assert_equal(SPLIT_DATA_SET_BY_CITY, res)
|
|
156
|
+
res = id3.split_data_examples(DATA_SET, domain, 1)
|
|
157
|
+
assert_equal(SPLIT_DATA_SET_BY_AGE, res)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def test_most_freq
|
|
161
|
+
id3 = DecisionTree::ID3.new(DATA_SET, DATA_LABELS)
|
|
162
|
+
domain = id3.domain(DATA_SET)
|
|
163
|
+
assert_equal 'Y', id3.most_freq(DATA_SET, domain)
|
|
164
|
+
assert_equal 'Y', id3.most_freq(SPLIT_DATA_SET_BY_AGE[3], domain)
|
|
165
|
+
assert_equal 'N', id3.most_freq(SPLIT_DATA_SET_BY_AGE[2], domain)
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def test_to_s
|
|
169
|
+
assert_equal [["marketing_target='N'"]], DecisionTree::CategoryNode.new('marketing_target', 'N').get_rules
|
|
170
|
+
id3 = DecisionTree::ID3.new(DATA_SET, DATA_LABELS)
|
|
171
|
+
assert_equal EXPECTED_RULES_STRING, id3.to_s
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def test_eval
|
|
175
|
+
id3 = DecisionTree::ID3.new(DATA_SET, 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 = DecisionTree::ID3.new(DATA_SET, DATA_LABELS)
|
|
195
|
+
#if age_range='<30' then marketing_target='Y'
|
|
196
|
+
age_range = '<30'
|
|
197
|
+
marketing_target = nil
|
|
198
|
+
eval id3.to_s
|
|
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.to_s
|
|
204
|
+
assert_equal 'N', marketing_target
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
end
|
|
209
|
+
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Author:: Sergio Fierens
|
|
2
|
+
# License:: MPL 1.1
|
|
3
|
+
# Project:: ai4r
|
|
4
|
+
# Url:: http://ai4r.rubyforge.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
|
+
|
|
11
|
+
require File.dirname(__FILE__) + '/../../lib/genetic_algorithm/genetic_algorithm'
|
|
12
|
+
|
|
13
|
+
require 'test/unit'
|
|
14
|
+
|
|
15
|
+
module GeneticAlgorithm
|
|
16
|
+
|
|
17
|
+
COST = [
|
|
18
|
+
[ 0, 10, 12, 21, 25, 25, 34, 26, 28, 11],
|
|
19
|
+
[ 10, 0, 12, 21, 19, 21, 18, 12, 22, 11],
|
|
20
|
+
[ 10, 12, 0, 24, 18, 16, 36, 29, 17, 22],
|
|
21
|
+
[ 20, 12, 22, 0, 32, 34, 28, 24, 31, 9],
|
|
22
|
+
[ 23, 20, 19, 31, 0, 25, 29, 25, 31, 28],
|
|
23
|
+
[ 24, 20, 15, 33, 24, 0, 38, 34, 17, 25],
|
|
24
|
+
[ 33, 19, 35, 29, 24, 34, 0, 9, 38, 28],
|
|
25
|
+
[ 25, 13, 28, 25, 25, 34, 9, 0, 33, 19],
|
|
26
|
+
[ 30, 23, 18, 29, 31, 18, 38, 34, 0, 23],
|
|
27
|
+
[ 11, 11, 22, 9, 28, 26, 27, 19, 22, 0]
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
class ChromosomeTest < Test::Unit::TestCase
|
|
31
|
+
|
|
32
|
+
def test_chromosome_seed
|
|
33
|
+
Chromosome.set_cost_matrix(COST)
|
|
34
|
+
chromosome = Chromosome.seed
|
|
35
|
+
assert_equal [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], chromosome.data.sort
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_fitness
|
|
39
|
+
Chromosome.set_cost_matrix(COST)
|
|
40
|
+
chromosome = Chromosome.new([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
|
|
41
|
+
assert_equal( -206, chromosome.fitness)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def test_reproduce
|
|
45
|
+
Chromosome.set_cost_matrix(COST)
|
|
46
|
+
c1 = Chromosome.new([2, 8, 5, 3, 6, 7, 1, 9, 0, 4])
|
|
47
|
+
c2 = Chromosome.new([3, 2, 0, 1, 5, 4, 6, 7, 9, 8])
|
|
48
|
+
c3 = Chromosome.reproduce(c1, c2)
|
|
49
|
+
assert_equal([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], c3.data.sort)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Author:: Sergio Fierens
|
|
2
|
+
# License:: MPL 1.1
|
|
3
|
+
# Project:: ai4r
|
|
4
|
+
# Url:: http://ai4r.rubyforge.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 File.dirname(__FILE__) + '/../../lib/genetic_algorithm/genetic_algorithm'
|
|
11
|
+
require 'test/unit'
|
|
12
|
+
|
|
13
|
+
module GeneticAlgorithm
|
|
14
|
+
|
|
15
|
+
COUNTRY = %w"Belgium France Germany Ireland Italy Poland Portugal Spain Sweden UK"
|
|
16
|
+
|
|
17
|
+
# Belgium, France, Germany, Ireland, Italy, Poland, Portugal, Spain, Sweden, UK
|
|
18
|
+
COSTS = [
|
|
19
|
+
[ 0, 10, 12, 21, 25, 25, 34, 26, 28, 11],
|
|
20
|
+
[ 10, 0, 12, 21, 19, 21, 18, 12, 22, 11],
|
|
21
|
+
[ 10, 12, 0, 24, 18, 16, 36, 29, 17, 22],
|
|
22
|
+
[ 20, 12, 22, 0, 32, 34, 28, 24, 31, 9],
|
|
23
|
+
[ 23, 20, 19, 31, 0, 25, 29, 25, 31, 28],
|
|
24
|
+
[ 24, 20, 15, 33, 24, 0, 38, 34, 17, 25],
|
|
25
|
+
[ 33, 19, 35, 29, 24, 34, 0, 9, 38, 28],
|
|
26
|
+
[ 25, 13, 28, 25, 25, 34, 9, 0, 33, 19],
|
|
27
|
+
[ 30, 23, 18, 29, 31, 18, 38, 34, 0, 23],
|
|
28
|
+
[ 11, 11, 22, 9, 28, 26, 27, 19, 22, 0]
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class GeneticAlgorithmTest < Test::Unit::TestCase
|
|
33
|
+
|
|
34
|
+
def test_chromosome_seed
|
|
35
|
+
Chromosome.set_cost_matrix(COSTS)
|
|
36
|
+
chromosome = Chromosome.seed
|
|
37
|
+
assert_equal [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], chromosome.data.sort
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_fitness
|
|
41
|
+
Chromosome.set_cost_matrix(COSTS)
|
|
42
|
+
chromosome = Chromosome.new([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
|
|
43
|
+
assert_equal( -206, chromosome.fitness)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_selection
|
|
47
|
+
search = GeneticSearch.new(10, 5)
|
|
48
|
+
search.generate_initial_population
|
|
49
|
+
selected = search.selection
|
|
50
|
+
selected.each { |c| assert c!=nil }
|
|
51
|
+
assert_equal 6, selected.length
|
|
52
|
+
assert_equal 1, search.population[0].normalized_fitness
|
|
53
|
+
assert_equal 0, search.population.last.normalized_fitness
|
|
54
|
+
assert_equal 10, search.population.length
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_reproduction
|
|
58
|
+
search = GeneticSearch.new(10, 5)
|
|
59
|
+
search.generate_initial_population
|
|
60
|
+
selected = search.selection
|
|
61
|
+
offsprings = search.reproduction selected
|
|
62
|
+
assert_equal 3, offsprings.length
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_replace_worst_ranked
|
|
66
|
+
search = GeneticSearch.new(10, 5)
|
|
67
|
+
search.generate_initial_population
|
|
68
|
+
selected = search.selection
|
|
69
|
+
offsprings = search.reproduction selected
|
|
70
|
+
search.replace_worst_ranked offsprings
|
|
71
|
+
assert_equal 10, search.population.length
|
|
72
|
+
offsprings.each { |c| assert search.population.include?(c)}
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
end
|