Class: Newral::Classifier::KMeansCluster

Inherits:
Object
  • Object
show all
Defined in:
lib/newral/classifier/k_means_cluster.rb

Instance Method Summary collapse

Constructor Details

#initialize(points, cluster_labels: [:a,:b], max_iterations: 20) ⇒ KMeansCluster

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)



9
10
11
12
13
# 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

Instance Method Details

#processObject



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 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