eureka 0.0.1
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/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +25 -0
- data/Rakefile +40 -0
- data/lib/eureka.rb +8 -0
- data/lib/eureka/core.rb +79 -0
- data/spec/core_spec.rb +25 -0
- data/spec/data/stock_testing_data.arff +17 -0
- data/spec/data/stock_training_data.arff +17 -0
- data/spec/data/xor.arff +47 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/stock_spec.rb +42 -0
- data/spec/xor_spec.rb +28 -0
- metadata +82 -0
data/.document
ADDED
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Bjørn Arild Mæland
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
= Eureka
|
2
|
+
|
3
|
+
JRuby wrapper for Weka 3 (http://www.cs.waikato.ac.nz/ml/weka/).
|
4
|
+
|
5
|
+
Targets Weka 3.6.1, but it should work with earlier versions. Make sure to have
|
6
|
+
weka.jar on your CLASSPATH.
|
7
|
+
|
8
|
+
For examples of usage, look at the specs.
|
9
|
+
|
10
|
+
Created by Bjørn Arild Mæland [github.com/Chrononaut]
|
11
|
+
|
12
|
+
== Note on Patches/Pull Requests
|
13
|
+
|
14
|
+
* Fork the project.
|
15
|
+
* Make your feature addition or bug fix.
|
16
|
+
* Add tests for it. This is important so I don't break it in a
|
17
|
+
future version unintentionally.
|
18
|
+
* Commit, do not mess with rakefile, version, or history.
|
19
|
+
(if you want to have your own version, that is fine but
|
20
|
+
bump version in a commit by itself I can ignore when I pull)
|
21
|
+
* Send me a pull request. Bonus points for topic branches.
|
22
|
+
|
23
|
+
== Copyright
|
24
|
+
|
25
|
+
Copyright (c) 2009 Bjørn Arild Mæland. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require "rake"
|
3
|
+
require "spec/rake/spectask"
|
4
|
+
require 'jeweler'
|
5
|
+
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "eureka"
|
8
|
+
gem.version = "0.0.1"
|
9
|
+
gem.summary = "Use Weka from JRuby"
|
10
|
+
gem.description = "Weka wrapper for JRuby"
|
11
|
+
gem.email = "bjorn.maeland@gmail.com"
|
12
|
+
gem.homepage = "http://github.com/Chrononaut/eureka"
|
13
|
+
gem.authors = ["Bjørn Arild Mæland"]
|
14
|
+
gem.add_development_dependency "rspec", ">= 1.2.9"
|
15
|
+
end
|
16
|
+
|
17
|
+
Jeweler::GemcutterTasks.new
|
18
|
+
|
19
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
20
|
+
spec.libs << 'lib' << 'spec'
|
21
|
+
spec.spec_files = FileList['spec/*_spec.rb']
|
22
|
+
end
|
23
|
+
|
24
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
25
|
+
spec.libs << 'lib' << 'spec'
|
26
|
+
spec.pattern = 'spec/*_spec.rb'
|
27
|
+
spec.rcov = true
|
28
|
+
end
|
29
|
+
|
30
|
+
task :default => :spec
|
31
|
+
|
32
|
+
require 'rake/rdoctask'
|
33
|
+
Rake::RDocTask.new do |rdoc|
|
34
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
35
|
+
|
36
|
+
rdoc.rdoc_dir = 'rdoc'
|
37
|
+
rdoc.title = "eureka #{version}"
|
38
|
+
rdoc.rdoc_files.include('README*')
|
39
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
40
|
+
end
|
data/lib/eureka.rb
ADDED
data/lib/eureka/core.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
# Core extensions
|
2
|
+
class Array
|
3
|
+
def to_fast_vector
|
4
|
+
FastVector.new(self)
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
# Eureka
|
9
|
+
module Eureka
|
10
|
+
import "weka.core.Attribute"
|
11
|
+
import "weka.core.FastVector"
|
12
|
+
import "weka.core.Instances"
|
13
|
+
end
|
14
|
+
|
15
|
+
module Java::WekaCore
|
16
|
+
|
17
|
+
class Attribute
|
18
|
+
alias :[] :value
|
19
|
+
end
|
20
|
+
|
21
|
+
class FastVector
|
22
|
+
|
23
|
+
include Enumerable
|
24
|
+
|
25
|
+
def initialize(int_or_array=0)
|
26
|
+
if int_or_array.kind_of?(Fixnum)
|
27
|
+
super(int_or_array)
|
28
|
+
else
|
29
|
+
super(int_or_array.size)
|
30
|
+
int_or_array.each { |arg| self.add_element(arg) }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
alias :length :size
|
35
|
+
alias :first :first_element
|
36
|
+
alias :last :last_element
|
37
|
+
alias :<< :add_element
|
38
|
+
alias :[] :element_at
|
39
|
+
alias :include? :contains
|
40
|
+
|
41
|
+
def each
|
42
|
+
size.times { |i| yield self[i] }
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
class Instances
|
48
|
+
|
49
|
+
include Enumerable
|
50
|
+
|
51
|
+
class << self
|
52
|
+
# Reads in instances using the standard Weka ARFF format
|
53
|
+
def from_arff(path)
|
54
|
+
data = self.new(java.io.BufferedReader.new(java.io.FileReader.new(path)))
|
55
|
+
data.set_class_index(data.num_attributes - 1)
|
56
|
+
return data
|
57
|
+
end
|
58
|
+
|
59
|
+
# http://weka.sourceforge.net/doc/weka/core/converters/C45Loader.html
|
60
|
+
def from_c45
|
61
|
+
raise
|
62
|
+
end
|
63
|
+
|
64
|
+
# http://weka.sourceforge.net/doc/weka/core/converters/CSVLoader.html
|
65
|
+
def from_csv
|
66
|
+
raise
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
alias :<< :add
|
71
|
+
alias :[] :instance
|
72
|
+
|
73
|
+
def each
|
74
|
+
num_instances.times { |i| yield self[i] }
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
data/spec/core_spec.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Weka Core" do
|
4
|
+
describe "FastVector" do
|
5
|
+
before(:all) do
|
6
|
+
@fv = FastVector.new(("a".."z").to_a)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should have Ruby-like aliases"do
|
10
|
+
@fv.length.should == @fv.size
|
11
|
+
@fv.first.should == @fv.first_element
|
12
|
+
@fv.last.should == @fv.last_element
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should instanciate from an array" do
|
16
|
+
FastVector.new(("a".."z").to_a).length.should == 26
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should know if it includes a specific element" do
|
20
|
+
@fv.include?("a").should be_true
|
21
|
+
@fv.include?("1").should be_false
|
22
|
+
@fv[0].should == "a"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
@relation stock
|
2
|
+
|
3
|
+
@attribute percent_change_since_open real
|
4
|
+
@attribute percent_change_from_day_low real
|
5
|
+
@attribute percent_change_from_day_high real
|
6
|
+
@attribute action {buy, sell, hold}
|
7
|
+
|
8
|
+
@data
|
9
|
+
-0.21,0.05,-0.2,hold
|
10
|
+
-2.1,0.1,-2.3,sell
|
11
|
+
0.23,0.18,-0.04,buy
|
12
|
+
-0.24,0.16,-0.15,hold
|
13
|
+
-2.5,-0.1,-2.2,sell
|
14
|
+
0.31,0.29,-0.1,buy
|
15
|
+
-0.19,0.04,-0.18,hold
|
16
|
+
-2.7,0.4,-2.4,sell
|
17
|
+
0.21,0.28,-0.08,buy
|
@@ -0,0 +1,17 @@
|
|
1
|
+
@relation stock
|
2
|
+
|
3
|
+
@attribute percent_change_since_open real
|
4
|
+
@attribute percent_change_from_day_low real
|
5
|
+
@attribute percent_change_from_day_high real
|
6
|
+
@attribute action {buy, sell, hold}
|
7
|
+
|
8
|
+
@data
|
9
|
+
-0.2,0.1,-0.22,hold
|
10
|
+
-2.2,0.0,-2.5,sell
|
11
|
+
0.2,0.21,-0.01,buy
|
12
|
+
-0.22,0.12,-0.25,hold
|
13
|
+
-2.0,0.0,-2.1,sell
|
14
|
+
0.28,0.26,-0.04,buy
|
15
|
+
-0.12,0.08,-0.14,hold
|
16
|
+
-2.6,0.1,-2.6,sell
|
17
|
+
0.24,0.25,-0.03,buy
|
data/spec/data/xor.arff
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
@relation xor
|
2
|
+
|
3
|
+
@attribute x {TRUE, FALSE}
|
4
|
+
@attribute y {TRUE, FALSE}
|
5
|
+
@attribute xor {TRUE, FALSE}
|
6
|
+
|
7
|
+
@data
|
8
|
+
FALSE,FALSE,FALSE
|
9
|
+
FALSE,TRUE,TRUE
|
10
|
+
TRUE,FALSE,TRUE
|
11
|
+
TRUE,TRUE,FALSE
|
12
|
+
FALSE,FALSE,FALSE
|
13
|
+
FALSE,TRUE,TRUE
|
14
|
+
TRUE,FALSE,TRUE
|
15
|
+
TRUE,TRUE,FALSE
|
16
|
+
FALSE,FALSE,FALSE
|
17
|
+
FALSE,TRUE,TRUE
|
18
|
+
TRUE,FALSE,TRUE
|
19
|
+
TRUE,TRUE,FALSE
|
20
|
+
FALSE,FALSE,FALSE
|
21
|
+
FALSE,TRUE,TRUE
|
22
|
+
TRUE,FALSE,TRUE
|
23
|
+
TRUE,TRUE,FALSE
|
24
|
+
FALSE,FALSE,FALSE
|
25
|
+
FALSE,TRUE,TRUE
|
26
|
+
TRUE,FALSE,TRUE
|
27
|
+
TRUE,TRUE,FALSE
|
28
|
+
FALSE,FALSE,FALSE
|
29
|
+
FALSE,TRUE,TRUE
|
30
|
+
TRUE,FALSE,TRUE
|
31
|
+
TRUE,TRUE,FALSE
|
32
|
+
FALSE,FALSE,FALSE
|
33
|
+
FALSE,TRUE,TRUE
|
34
|
+
TRUE,FALSE,TRUE
|
35
|
+
TRUE,TRUE,FALSE
|
36
|
+
FALSE,FALSE,FALSE
|
37
|
+
FALSE,TRUE,TRUE
|
38
|
+
TRUE,FALSE,TRUE
|
39
|
+
TRUE,TRUE,FALSE
|
40
|
+
FALSE,FALSE,FALSE
|
41
|
+
FALSE,TRUE,TRUE
|
42
|
+
TRUE,FALSE,TRUE
|
43
|
+
TRUE,TRUE,FALSE
|
44
|
+
FALSE,FALSE,FALSE
|
45
|
+
FALSE,TRUE,TRUE
|
46
|
+
TRUE,FALSE,TRUE
|
47
|
+
TRUE,TRUE,FALSE
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
data/spec/stock_spec.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
import "weka.classifiers.meta.FilteredClassifier"
|
4
|
+
import "weka.classifiers.trees.J48"
|
5
|
+
import "weka.filters.unsupervised.attribute.Remove"
|
6
|
+
|
7
|
+
describe "Stock data example" do
|
8
|
+
|
9
|
+
before(:all) do
|
10
|
+
@training_data = Instances.from_arff(File.dirname(__FILE__) +
|
11
|
+
"/data/stock_training_data.arff")
|
12
|
+
@testing_data = Instances.from_arff(File.dirname(__FILE__) +
|
13
|
+
"/data/stock_testing_data.arff")
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should know the number of attributes and instances in model" do
|
17
|
+
@training_data.num_attributes.should == 4
|
18
|
+
@training_data.num_instances.should == 9
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should build and test a classifier" do
|
22
|
+
|
23
|
+
rm = Remove.new # Filter for removing samples
|
24
|
+
rm.set_attribute_indices("1") # Remove 1st attribute
|
25
|
+
|
26
|
+
fc = FilteredClassifier.new
|
27
|
+
fc.set_filter(rm)
|
28
|
+
fc.set_classifier(J48.new) # A classifier for decision trees
|
29
|
+
fc.build_classifier(@training_data) # Train the classifier
|
30
|
+
|
31
|
+
# Test using stock_testing_data.arff:
|
32
|
+
@testing_data.to_a[0..2].each do |instance|
|
33
|
+
predicted = fc.classify_instance(instance).to_i
|
34
|
+
given = instance.class_value.to_i
|
35
|
+
given.should == predicted
|
36
|
+
#print "given value: #{@testing_data.class_attribute[given]}"
|
37
|
+
#puts ". predicted value: #{@testing_data.class_attribute[predicted]}"
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
data/spec/xor_spec.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
import "weka.classifiers.lazy.IBk"
|
4
|
+
|
5
|
+
describe "XOR example" do
|
6
|
+
|
7
|
+
before(:all) do
|
8
|
+
@training_data = Instances.from_arff(File.dirname(__FILE__) +
|
9
|
+
"/data/xor.arff")
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should build and test a classifier" do
|
13
|
+
# Uses the IBk K-nearest neighbours classifier to solve the XOR problem.
|
14
|
+
# http://weka.sourceforge.net/doc/weka/classifiers/lazy/IBk.html
|
15
|
+
ibk = IBk.new
|
16
|
+
|
17
|
+
ibk.build_classifier(@training_data)
|
18
|
+
|
19
|
+
# FALSE, FALSE
|
20
|
+
@training_data.class_attribute[ibk.classify_instance(@training_data[0])].should ==
|
21
|
+
"FALSE"
|
22
|
+
|
23
|
+
# FALSE, TRUE
|
24
|
+
@training_data.class_attribute[ibk.classify_instance(@training_data[1])].should ==
|
25
|
+
"TRUE"
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
3
|
+
requirements:
|
4
|
+
- - '>='
|
5
|
+
- !ruby/object:Gem::Version
|
6
|
+
version: "0"
|
7
|
+
version:
|
8
|
+
email: bjorn.maeland@gmail.com
|
9
|
+
cert_chain: []
|
10
|
+
|
11
|
+
summary: Use Weka from JRuby
|
12
|
+
post_install_message:
|
13
|
+
extra_rdoc_files:
|
14
|
+
- LICENSE
|
15
|
+
- README.rdoc
|
16
|
+
homepage: http://github.com/Chrononaut/eureka
|
17
|
+
signing_key:
|
18
|
+
name: eureka
|
19
|
+
rdoc_options:
|
20
|
+
- --charset=UTF-8
|
21
|
+
rubyforge_project:
|
22
|
+
autorequire:
|
23
|
+
licenses: []
|
24
|
+
|
25
|
+
executables: []
|
26
|
+
|
27
|
+
description: Weka wrapper for JRuby
|
28
|
+
specification_version: 3
|
29
|
+
default_executable:
|
30
|
+
files:
|
31
|
+
- .document
|
32
|
+
- .gitignore
|
33
|
+
- LICENSE
|
34
|
+
- README.rdoc
|
35
|
+
- Rakefile
|
36
|
+
- lib/eureka.rb
|
37
|
+
- lib/eureka/core.rb
|
38
|
+
- spec/core_spec.rb
|
39
|
+
- spec/data/stock_testing_data.arff
|
40
|
+
- spec/data/stock_training_data.arff
|
41
|
+
- spec/data/xor.arff
|
42
|
+
- spec/spec.opts
|
43
|
+
- spec/spec_helper.rb
|
44
|
+
- spec/stock_spec.rb
|
45
|
+
- spec/xor_spec.rb
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - '>='
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: "0"
|
51
|
+
version:
|
52
|
+
extensions: []
|
53
|
+
|
54
|
+
rubygems_version: 1.3.5
|
55
|
+
requirements: []
|
56
|
+
|
57
|
+
authors:
|
58
|
+
- "Bj\xc3\xb8rn Arild M\xc3\xa6land"
|
59
|
+
date: 2009-10-26 23:00:00 +00:00
|
60
|
+
platform: ruby
|
61
|
+
test_files:
|
62
|
+
- spec/spec_helper.rb
|
63
|
+
- spec/xor_spec.rb
|
64
|
+
- spec/core_spec.rb
|
65
|
+
- spec/stock_spec.rb
|
66
|
+
version: !ruby/object:Gem::Version
|
67
|
+
version: 0.0.1
|
68
|
+
require_paths:
|
69
|
+
- lib
|
70
|
+
dependencies:
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 1.2.9
|
77
|
+
version:
|
78
|
+
type: :development
|
79
|
+
version_requirement:
|
80
|
+
name: rspec
|
81
|
+
bindir: bin
|
82
|
+
has_rdoc: true
|