Sha256: 224383e7cc0cb1975a21321f777d396031fe39605395c5584403e2fa3828c33e
Contents?: true
Size: 1.7 KB
Versions: 3
Compression:
Stored size: 1.7 KB
Contents
class Cluster1D attr_accessor :center, :points # Constructor with a starting centerpoint def initialize(center) @center = center @points = [] end # Recenters the centroid point and removes all of the associated points def recenter! avg = 0 old_center = @center # Sum up all x/y coords @points.each do |point| avg += point end # Average out data if points.length == 0 avg = center else avg /= points.length end # Reset center and return distance moved @center = avg return (old_center - center).abs end end # # kmeans algorithm # def kmeans1d(data, k, delta=0.001) clusters = [] # Assign intial values for all clusters (1..k).each do |point| index = (data.length * rand).to_i rand_point = data[index] c = Cluster1D.new(rand_point) clusters.push c end # Loop while true # Assign points to clusters data.each do |point| min_dist = +Float::INFINITY min_cluster = nil # Find the closest cluster clusters.each do |cluster| dist = (point - cluster.center).abs if dist < min_dist min_dist = dist min_cluster = cluster end end # Add to closest cluster min_cluster.points.push point end # Check deltas max_delta = -Float::INFINITY clusters.each do |cluster| dist_moved = cluster.recenter! # Get largest delta if dist_moved > max_delta max_delta = dist_moved end end # Check exit condition if max_delta < delta return clusters end # Reset points for the next iteration clusters.each do |cluster| cluster.points = [] end end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
jkr-0.2.2 | lib/jkr/stat/kmeans-1d.rb |
jkr-0.2.1 | lib/jkr/stat/kmeans-1d.rb |
jkr-0.1.0 | lib/jkr/stat/kmeans-1d.rb |