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