Class: Newral::Classifier::Dendogram

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(points, max_runs: 100, abort_at_distance: 0.5) ⇒ Dendogram

Returns a new instance of Dendogram.



7
8
9
10
11
12
# File 'lib/newral/classifier/dendogram.rb', line 7

def initialize( points, max_runs: 100, abort_at_distance: 0.5 )
 @distances = []
 @abort_at_distance = abort_at_distance
 @max_runs = max_runs
 @nodes = points.collect{ |point| Node.new( point, from_point: true ) }
end

Instance Attribute Details

#distancesObject (readonly)

Returns the value of attribute distances.



6
7
8
# File 'lib/newral/classifier/dendogram.rb', line 6

def distances
  @distances
end

#max_distanceObject (readonly)

Returns the value of attribute max_distance.



6
7
8
# File 'lib/newral/classifier/dendogram.rb', line 6

def max_distance
  @max_distance
end

#nodesObject (readonly)

Returns the value of attribute nodes.



6
7
8
# File 'lib/newral/classifier/dendogram.rb', line 6

def nodes
  @nodes
end

Instance Method Details

#calculate_distances(node) ⇒ Object



28
29
30
31
32
# File 'lib/newral/classifier/dendogram.rb', line 28

def calculate_distances( node )
  @nodes.each do |other_node|
    @distances << NodeDistance.new( node, other_node ) unless node==other_node
  end
end

#combine_nodes(node1, node2) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/newral/classifier/dendogram.rb', line 34

def combine_nodes( node1, node2 )
  new_node = Node.new([node1,node2])
  node1.parent_node = new_node
  node2.parent_node = new_node
  
  # remove node1 and node2 
  @nodes = @nodes.collect do |node| 
    node unless node == node1 || node == node2
  end.compact
  # remove distances for these 2 nodes 
  @distances = @distances.collect do |distance|
    distance unless distance.node1 == node1 || distance.node1 == node2 || distance.node2 == node2 || distance.node2 == node1
  end.compact

  # insert new node
  @nodes << new_node 
  # calculate_distances for new node 
  calculate_distances( new_node )
  @distances.sort!
end

#processObject



14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/newral/classifier/dendogram.rb', line 14

def process
  runs = 0
  @nodes.each do |node|
    calculate_distances( node )
  end
  @distances.sort!
  @max_distance = @distances.last.distance 
  while @distances.size > 2 && @distances.first.distance/@max_distance < @abort_at_distance && runs < @max_runs
    combine_nodes( @distances.first.node1, @distances.first.node2 )
    runs = runs+1
  end
  self
end

#to_cluster_setObject



61
62
63
64
# File 'lib/newral/classifier/dendogram.rb', line 61

def to_cluster_set
  clusters = @nodes.collect{|node| node.to_cluster }
  Data::ClusterSet.new( clusters: clusters )
end

#to_sObject



55
56
57
58
59
# File 'lib/newral/classifier/dendogram.rb', line 55

def to_s 
  @nodes.collect do |node|
    node.to_s
  end.join(" / ")
end