buncher 1.0.11 → 1.0.12
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/Gemfile +20 -0
- data/Manifest.txt +1 -0
- data/Rakefile +14 -2
- data/lib/buncher.rb +13 -5
- data/test/test_buncher.rb +4 -2
- metadata +118 -2
data/Gemfile
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# -*- ruby -*-
|
|
2
|
+
|
|
3
|
+
# DO NOT EDIT THIS FILE. Instead, edit Rakefile, and run `rake bundler:gemfile`.
|
|
4
|
+
|
|
5
|
+
source "https://rubygems.org/"
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
gem "minitest", "~>5.6", :group => [:development, :test]
|
|
9
|
+
gem "rdoc", "~>4.0", :group => [:development, :test]
|
|
10
|
+
gem "rake-compiler", "~>0.7", :group => [:development, :test]
|
|
11
|
+
gem "hoe-bundler", ">=1.1", :group => [:development, :test]
|
|
12
|
+
gem "hoe-gemspec", ">=1.0", :group => [:development, :test]
|
|
13
|
+
gem "hoe-git", ">=1.4", :group => [:development, :test]
|
|
14
|
+
gem "minitest-focus", ">=0", :group => [:development, :test]
|
|
15
|
+
gem "rake", ">=0.9", :group => [:development, :test]
|
|
16
|
+
gem "gnuplot", ">=0", :group => [:development, :test]
|
|
17
|
+
gem "rubystats", ">=0", :group => [:development, :test]
|
|
18
|
+
gem "hoe", "~>3.13", :group => [:development, :test]
|
|
19
|
+
|
|
20
|
+
# vim: syntax=ruby
|
data/Manifest.txt
CHANGED
data/Rakefile
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
# -*- ruby -*-
|
|
2
2
|
|
|
3
3
|
require "rubygems"
|
|
4
|
+
gem "hoe"
|
|
4
5
|
require "hoe"
|
|
5
6
|
|
|
7
|
+
Hoe.plugin :gemspec
|
|
8
|
+
Hoe.plugin :bundler
|
|
6
9
|
Hoe.plugin :git
|
|
7
|
-
Hoe.plugin :debugging # for gdb
|
|
8
10
|
Hoe.plugin :compiler
|
|
9
11
|
# Hoe.plugin :gem_prelude_sucks
|
|
10
12
|
# Hoe.plugin :inline
|
|
@@ -15,7 +17,17 @@ Hoe.plugin :minitest
|
|
|
15
17
|
|
|
16
18
|
Hoe.spec "buncher" do
|
|
17
19
|
developer("Robert Mathews", "rob@drync.com")
|
|
18
|
-
|
|
20
|
+
self.extra_dev_deps += [
|
|
21
|
+
["hoe-bundler", ">= 1.1"],
|
|
22
|
+
["hoe-gemspec", ">= 1.0"],
|
|
23
|
+
["hoe-git", ">= 1.4"],
|
|
24
|
+
["minitest", "> 2.2.2"],
|
|
25
|
+
["minitest-focus"],
|
|
26
|
+
["rake", ">= 0.9"],
|
|
27
|
+
["rake-compiler", "> 0.9.2"],
|
|
28
|
+
['gnuplot'],
|
|
29
|
+
['rubystats']
|
|
30
|
+
]
|
|
19
31
|
|
|
20
32
|
license "MIT" # this should match the license in the README
|
|
21
33
|
end
|
data/lib/buncher.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require 'buncher/buncher'
|
|
2
2
|
module Buncher
|
|
3
|
-
VERSION = "1.0.
|
|
3
|
+
VERSION = "1.0.12"
|
|
4
4
|
# your cluster needs to look like this. Make a bunch of them and pass them in. It's ok to pass in empty elements to start.
|
|
5
5
|
class Cluster
|
|
6
6
|
attr_accessor :elements
|
|
@@ -60,7 +60,12 @@ module Buncher
|
|
|
60
60
|
|
|
61
61
|
# run the clustering algorithm until we have calculated the best number of clusters, taken from this paper:
|
|
62
62
|
# http://papers.nips.cc/paper/2526-learning-the-k-in-k-means.pdf
|
|
63
|
+
# min_size: force at least min_size clusters to be created.
|
|
64
|
+
# plausable: return a hash of #plausable values for k. Sometimes the data has multiple possible answers, so return
|
|
65
|
+
# the top n of them in a hash of score=>plausable solutions. lowest scores are best, but sometimes there are
|
|
66
|
+
# "ties".
|
|
63
67
|
def self.cluster(elements, weights,options={})
|
|
68
|
+
plausable=options[:plausable] || 1
|
|
64
69
|
solutions={}
|
|
65
70
|
min_size=options[:min_size] || 1
|
|
66
71
|
# try all the sizes of clusters up to #elements. Ok, sure we could probably do something like 50% .. ok, I did
|
|
@@ -79,11 +84,14 @@ module Buncher
|
|
|
79
84
|
solutions[last_fK]=centers if number_clusters >= min_size
|
|
80
85
|
# break if number_clusters == 3 ## debugging
|
|
81
86
|
end
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
87
|
+
solutions.select! {|min_fK| min_fK <= 0.85}
|
|
88
|
+
min_fKs =solutions.keys.sort[0...plausable] || [1.0]
|
|
89
|
+
if options[:plausable]
|
|
90
|
+
solutions.select {|key| min_fKs.include?(key)}
|
|
91
|
+
elsif !min_fKs.empty?
|
|
92
|
+
solutions[min_fKs.first]
|
|
85
93
|
else
|
|
86
|
-
|
|
94
|
+
elements.map {|ele| Cluster.new(ele,[ele])} # ie, not clustered at all
|
|
87
95
|
end
|
|
88
96
|
end
|
|
89
97
|
end
|
data/test/test_buncher.rb
CHANGED
|
@@ -110,8 +110,9 @@ class TestBuncher < Minitest::Test
|
|
|
110
110
|
# focus
|
|
111
111
|
def test_min_size_works
|
|
112
112
|
elements = init_data(100,1)
|
|
113
|
-
new_centers = Buncher::cluster(elements,[1]*2,:min_size=>2)
|
|
114
|
-
assert(new_centers.
|
|
113
|
+
new_centers = Buncher::cluster(elements,[1]*2,:min_size=>2,:plausable=>3)
|
|
114
|
+
assert(new_centers.kind_of? Hash)
|
|
115
|
+
assert(new_centers.first.size >=2,"at least 2 centers")
|
|
115
116
|
end
|
|
116
117
|
def test_gaussian_distribution_of_100_points_in_3_clusters
|
|
117
118
|
1.times do |run|
|
|
@@ -124,6 +125,7 @@ class TestBuncher < Minitest::Test
|
|
|
124
125
|
graphfile = "/tmp/#{run}_centers_#{centers.size}.png"
|
|
125
126
|
plot(graphfile,elements,centers, initial_centers)
|
|
126
127
|
}
|
|
128
|
+
new_centers=new_centers.first
|
|
127
129
|
puts "run #{run}: k is #{new_centers.size}, seed was #{srand}"
|
|
128
130
|
puts "ERROR "*4 if new_centers.size != 3
|
|
129
131
|
puts
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: buncher
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.12
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2015-05-
|
|
12
|
+
date: 2015-05-03 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: minitest
|
|
@@ -59,6 +59,118 @@ dependencies:
|
|
|
59
59
|
- - ~>
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
61
|
version: '0.7'
|
|
62
|
+
- !ruby/object:Gem::Dependency
|
|
63
|
+
name: hoe-bundler
|
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
|
65
|
+
none: false
|
|
66
|
+
requirements:
|
|
67
|
+
- - ! '>='
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: '1.1'
|
|
70
|
+
type: :development
|
|
71
|
+
prerelease: false
|
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
73
|
+
none: false
|
|
74
|
+
requirements:
|
|
75
|
+
- - ! '>='
|
|
76
|
+
- !ruby/object:Gem::Version
|
|
77
|
+
version: '1.1'
|
|
78
|
+
- !ruby/object:Gem::Dependency
|
|
79
|
+
name: hoe-gemspec
|
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
|
81
|
+
none: false
|
|
82
|
+
requirements:
|
|
83
|
+
- - ! '>='
|
|
84
|
+
- !ruby/object:Gem::Version
|
|
85
|
+
version: '1.0'
|
|
86
|
+
type: :development
|
|
87
|
+
prerelease: false
|
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
89
|
+
none: false
|
|
90
|
+
requirements:
|
|
91
|
+
- - ! '>='
|
|
92
|
+
- !ruby/object:Gem::Version
|
|
93
|
+
version: '1.0'
|
|
94
|
+
- !ruby/object:Gem::Dependency
|
|
95
|
+
name: hoe-git
|
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
|
97
|
+
none: false
|
|
98
|
+
requirements:
|
|
99
|
+
- - ! '>='
|
|
100
|
+
- !ruby/object:Gem::Version
|
|
101
|
+
version: '1.4'
|
|
102
|
+
type: :development
|
|
103
|
+
prerelease: false
|
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
105
|
+
none: false
|
|
106
|
+
requirements:
|
|
107
|
+
- - ! '>='
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: '1.4'
|
|
110
|
+
- !ruby/object:Gem::Dependency
|
|
111
|
+
name: minitest-focus
|
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
|
113
|
+
none: false
|
|
114
|
+
requirements:
|
|
115
|
+
- - ! '>='
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: '0'
|
|
118
|
+
type: :development
|
|
119
|
+
prerelease: false
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
none: false
|
|
122
|
+
requirements:
|
|
123
|
+
- - ! '>='
|
|
124
|
+
- !ruby/object:Gem::Version
|
|
125
|
+
version: '0'
|
|
126
|
+
- !ruby/object:Gem::Dependency
|
|
127
|
+
name: rake
|
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
|
129
|
+
none: false
|
|
130
|
+
requirements:
|
|
131
|
+
- - ! '>='
|
|
132
|
+
- !ruby/object:Gem::Version
|
|
133
|
+
version: '0.9'
|
|
134
|
+
type: :development
|
|
135
|
+
prerelease: false
|
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
137
|
+
none: false
|
|
138
|
+
requirements:
|
|
139
|
+
- - ! '>='
|
|
140
|
+
- !ruby/object:Gem::Version
|
|
141
|
+
version: '0.9'
|
|
142
|
+
- !ruby/object:Gem::Dependency
|
|
143
|
+
name: gnuplot
|
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
|
145
|
+
none: false
|
|
146
|
+
requirements:
|
|
147
|
+
- - ! '>='
|
|
148
|
+
- !ruby/object:Gem::Version
|
|
149
|
+
version: '0'
|
|
150
|
+
type: :development
|
|
151
|
+
prerelease: false
|
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
153
|
+
none: false
|
|
154
|
+
requirements:
|
|
155
|
+
- - ! '>='
|
|
156
|
+
- !ruby/object:Gem::Version
|
|
157
|
+
version: '0'
|
|
158
|
+
- !ruby/object:Gem::Dependency
|
|
159
|
+
name: rubystats
|
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
|
161
|
+
none: false
|
|
162
|
+
requirements:
|
|
163
|
+
- - ! '>='
|
|
164
|
+
- !ruby/object:Gem::Version
|
|
165
|
+
version: '0'
|
|
166
|
+
type: :development
|
|
167
|
+
prerelease: false
|
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
169
|
+
none: false
|
|
170
|
+
requirements:
|
|
171
|
+
- - ! '>='
|
|
172
|
+
- !ruby/object:Gem::Version
|
|
173
|
+
version: '0'
|
|
62
174
|
- !ruby/object:Gem::Dependency
|
|
63
175
|
name: hoe
|
|
64
176
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -94,6 +206,7 @@ files:
|
|
|
94
206
|
- .autotest
|
|
95
207
|
- History.txt
|
|
96
208
|
- Manifest.txt
|
|
209
|
+
- Gemfile
|
|
97
210
|
- README.txt
|
|
98
211
|
- Rakefile
|
|
99
212
|
- ext/buncher/cluster.cpp
|
|
@@ -118,6 +231,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
118
231
|
- - ! '>='
|
|
119
232
|
- !ruby/object:Gem::Version
|
|
120
233
|
version: '0'
|
|
234
|
+
segments:
|
|
235
|
+
- 0
|
|
236
|
+
hash: 630999455354425102
|
|
121
237
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
122
238
|
none: false
|
|
123
239
|
requirements:
|