Class: Evoc::InterestingnessMeasureAggregator

Inherits:
Object
  • Object
show all
Defined in:
lib/evoc/interestingness_measure_aggregator.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(type, values) ⇒ InterestingnessMeasureAggregator



5
6
7
8
9
10
11
12
# File 'lib/evoc/interestingness_measure_aggregator.rb', line 5

def initialize(type,values)
  self.type     = type
  self.min      = Evoc::InterestingnessMeasures.get_min(type)
  self.mid      = Evoc::InterestingnessMeasures.get_mid(type)
  self.max      = Evoc::InterestingnessMeasures.get_max(type)
  self.values   = values
  self.size     = values.size
end

Instance Attribute Details

#maxObject

Returns the value of attribute max.



3
4
5
# File 'lib/evoc/interestingness_measure_aggregator.rb', line 3

def max
  @max
end

#midObject

Returns the value of attribute mid.



3
4
5
# File 'lib/evoc/interestingness_measure_aggregator.rb', line 3

def mid
  @mid
end

#minObject

Returns the value of attribute min.



3
4
5
# File 'lib/evoc/interestingness_measure_aggregator.rb', line 3

def min
  @min
end

#sizeObject

Returns the value of attribute size.



3
4
5
# File 'lib/evoc/interestingness_measure_aggregator.rb', line 3

def size
  @size
end

#typeObject

Returns the value of attribute type.



3
4
5
# File 'lib/evoc/interestingness_measure_aggregator.rb', line 3

def type
  @type
end

#valuesObject

Returns the value of attribute values.



3
4
5
# File 'lib/evoc/interestingness_measure_aggregator.rb', line 3

def values
  @values
end

Instance Method Details

#cgObject

cumulative gain aka sum



35
36
37
38
# File 'lib/evoc/interestingness_measure_aggregator.rb', line 35

def cg
  aggregated = normalize_measures.inject(:+) + self.mid
  Evoc::InterestingnessMeasure.new(type: self.type, min: self.min, mid: self.mid, max: self.max, value: aggregated)
end

#dcgObject

discounted CG



41
42
43
44
45
# File 'lib/evoc/interestingness_measure_aggregator.rb', line 41

def dcg
  agr = normalize_measures.first + normalize_measures[1..-1].each_with_index.inject(0) {|sum,(element,index)| sum + element/Math.log2(index+2)}
  agr = agr + self.mid
  Evoc::InterestingnessMeasure.new(type: self.type, min: self.min, mid: self.mid, max: self.max, value: agr)
end

#dcg2Object

discounted CG2



48
49
50
51
52
53
54
# File 'lib/evoc/interestingness_measure_aggregator.rb', line 48

def dcg2
  agr = normalize_measures.first + normalize_measures[1..-1].each_with_index.inject(0) {|sum,(element,index)| 
    sum + (element >= 0 ? (2**element-1)/Math.log2(index+2) : -(2**element.abs-1)/Math.log2(index+2))
  }
  agr = agr + self.mid
  Evoc::InterestingnessMeasure.new(type: self.type, min: self.min, mid: self.mid, max: self.max, value: agr)
end

#hcgObject

Our own aggregation functions



17
18
19
20
21
22
23
24
# File 'lib/evoc/interestingness_measure_aggregator.rb', line 17

def hcg
  agr = normalize_measures.inject {|tot,i| 
    direction = i > 0 ? self.max-self.mid : self.min-self.mid
    coefficient = direction.to_f.finite? ? (direction-tot)/direction : 1
    tot + coefficient*i
  } + self.mid
  Evoc::InterestingnessMeasure.new(type: self.type, min: self.min, mid: self.mid, max: self.max, value: agr)
end

#hcg_hcObject



26
27
28
# File 'lib/evoc/interestingness_measure_aggregator.rb', line 26

def hcg_hc
  self.hcg
end

#normalize_measuresObject

def discounted_cg3

  agr = normalize_measures.each_with_index.inject(0) {|sum,(element,index)| 
    sum + element >= 0 ? (2**element-1)/Math.log2(index+2) : -(2**element.abs-1)/Math.log2(index+2)
  }
  agr = agr + self.mid
  Evoc::InterestingnessMeasure.new(type: self.type, min: self.min, mid: self.mid, max: self.max, value: agr)
end

def discounted_cg4
  agr = normalize_measures.each_with_index.inject(0) {|sum,(element,index)| 
    sum + (2**element)/Math.log2(index+2)
  }
  agr = agr + self.mid
  Evoc::InterestingnessMeasure.new(type: self.type, min: self.min, mid: self.mid, max: self.max, value: agr)
end

def discounted_cg5
  agr = normalize_measures.each_with_index.inject(0) {|sum,(element,index)| 
    sum + element == 0 ? 0 : (2**element)/Math.log2(index+2)
  }
  agr = agr + self.mid
  Evoc::InterestingnessMeasure.new(type: self.type, min: self.min, mid: self.mid, max: self.max, value: agr)
end

def discounted_rank_cg
  agr = normalize_measures.each_with_index.inject(0) {|sum,(element,index)| 
    sum + element/(index+1)
  }
  agr = agr + self.mid
  Evoc::InterestingnessMeasure.new(type: self.type, min: self.min, mid: self.mid, max: self.max, value: agr)
end


89
90
91
# File 'lib/evoc/interestingness_measure_aggregator.rb', line 89

def normalize_measures
  self.values.map {|m| m - self.mid} 
end