class ClusterCalculator

after:

http://colinfdrake.com/2011/05/28/clustering-in-ruby.html
http://m635j520.blogspot.com/2013/02/implementing-k-means-clustering-in-ruby.html

Attributes

clusters[RW]
delta[RW]
max_clusters[RW]
samples[RW]

Public Class Methods

new(params={}) click to toggle source
# File lib/quadtone/cluster_calculator.rb, line 51
def initialize(params={})
  @delta = 0.001
  params.each { |k, v| send("#{k}=", v) }
  raise "Must specify samples" unless @samples
  raise "Must specify max_clusters" unless @max_clusters
  @max_clusters = @samples.length if @max_clusters > @samples.length
end

Public Instance Methods

cluster!() click to toggle source
# File lib/quadtone/cluster_calculator.rb, line 59
def cluster!
  @clusters = @max_clusters.times.map { Cluster.new(@samples.sample.output) }
  while @clusters.any?(&:moved)
    @clusters.each(&:clear_samples)
    @samples.each do |sample|
      shortest = Float::INFINITY
      cluster_found = nil
      @clusters.each do |cluster|
        distance = cluster.distance_to(sample)
        if distance < shortest
          cluster_found = cluster
          shortest = distance
        end
      end
      cluster_found.add_sample(sample) if cluster_found
    end
    @clusters.delete_if { |c| c.size == 0 }
    @clusters.each { |c| c.update_center(@delta) }
  end

end