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.
Files changed (6) hide show
  1. data/Gemfile +20 -0
  2. data/Manifest.txt +1 -0
  3. data/Rakefile +14 -2
  4. data/lib/buncher.rb +13 -5
  5. data/test/test_buncher.rb +4 -2
  6. 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
@@ -1,6 +1,7 @@
1
1
  .autotest
2
2
  History.txt
3
3
  Manifest.txt
4
+ Gemfile
4
5
  README.txt
5
6
  Rakefile
6
7
  ext/buncher/cluster.cpp
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
- self.extra_dev_deps
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.11"
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
- min_fK =solutions.keys.sort.first || 1.0
83
- if min_fK > 0.85
84
- elements.map {|ele| Cluster.new(ele,[ele])} # ie, not clustered at all
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
- solutions[min_fK]
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.size >=2,"at least 2 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.11
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-02 00:00:00.000000000 Z
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: