Class: Newral::Classifier::Dendogram
- Inherits:
-
Object
- Object
- Newral::Classifier::Dendogram
- Defined in:
- lib/newral/classifier/dendogram.rb
Instance Attribute Summary collapse
-
#distances ⇒ Object
readonly
Returns the value of attribute distances.
-
#max_distance ⇒ Object
readonly
Returns the value of attribute max_distance.
-
#nodes ⇒ Object
readonly
Returns the value of attribute nodes.
Instance Method Summary collapse
- #calculate_distances(node) ⇒ Object
- #combine_nodes(node1, node2) ⇒ Object
-
#initialize(points, max_runs: 100, abort_at_distance: 0.5) ⇒ Dendogram
constructor
A new instance of Dendogram.
- #process ⇒ Object
- #to_cluster_set ⇒ Object
- #to_s ⇒ Object
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
#distances ⇒ Object (readonly)
Returns the value of attribute distances.
6 7 8 |
# File 'lib/newral/classifier/dendogram.rb', line 6 def distances @distances end |
#max_distance ⇒ Object (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 |
#nodes ⇒ Object (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 |
#process ⇒ Object
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_set ⇒ Object
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_s ⇒ Object
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 |