class Newral::Classifier::KMeansCluster
Public Class Methods
new( points, cluster_labels: [:a,:b], max_iterations: 20 )
click to toggle source
input array of points, cluster_labels: how many clusters to find, max_iterations stop after x approximations output hash of clusters where has keys are cluster_labels and value is points(Array) and center(point)
# File lib/newral/classifier/k_means_cluster.rb, line 9 def initialize( points, cluster_labels: [:a,:b], max_iterations: 20 ) @points = points @cluster_labels = cluster_labels @max_iterations = max_iterations end
Public Instance Methods
process()
click to toggle source
# File lib/newral/classifier/k_means_cluster.rb, line 15 def process @cluster_set = Newral::Data::ClusterSet.new( cluster_labels: @cluster_labels ) runs = 0 @points.sample( @cluster_set.cluster_array.length ).each_with_index do |point,idx| @cluster_set.cluster_array[ idx ].center = point end while @cluster_set.cluster_array.collect{ |cluster| cluster.moved }.member?( true ) && runs < @max_iterations @cluster_set.clusters.each do |key,cluster| cluster.points=[] end # iterate over points assign, best cluster @points.each do |point| min_distance = { cluster:'none', distance: 99**99 } @cluster_set.clusters.each do |key,cluster| distance = Newral::Tools::euclidian_distance( cluster.center, point ) min_distance = {cluster: cluster, distance: distance } if distance < min_distance[:distance] end min_distance[:cluster].add_point point end @cluster_set.update_centers runs=runs+1 end @cluster_set end