Module: Enumerable

Defined in:
lib/enumerable_extension.rb

Instance Method Summary collapse

Instance Method Details

#concitional_entropy_with(label) ⇒ Object



16
17
18
19
20
21
22
23
# File 'lib/enumerable_extension.rb', line 16

def concitional_entropy_with(label)
    dataset = Hash.new{|h,k| h[k] = Array.new }
    self.each_with_index{|v,i| dataset[v] << label[i] }

    new_entropy = 0.0
    dataset.each{|k,v| new_entropy += (v.size.to_f / self.size)*v.entropy }
    return new_entropy
end

#covariance(arr, ddof = 1) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
# File 'lib/enumerable_extension.rb', line 70

def covariance(arr,ddof=1)
    raise "array length error" if arr.length!=self.length
    xbar = self.mean
    ybar = arr.mean

    accum = 0.0
    arr.length.times do |i|
        accum += (self[i]-xbar)*(arr[i]-ybar)
    end
    return accum / (self.length - ddof).to_f
end

#entropyObject



3
4
5
6
7
8
9
10
11
12
13
14
# File 'lib/enumerable_extension.rb', line 3

def entropy
    dataset = Hash.new(0)
    self.each{|x| dataset[x] += 1 }

    entropy = 0.0
    dataset.each do |k,v|
        p = v.to_f / self.size
        entropy += (-p)*Math.log2(p)
    end

    return entropy
end

#geo_meanObject



33
34
35
36
# File 'lib/enumerable_extension.rb', line 33

def geo_mean
    geo_sum = self.inject(0){|accum, i| accum + i*i }
    Math.sqrt(geo_sum)
end

#l1_normalizeObject



86
87
88
89
# File 'lib/enumerable_extension.rb', line 86

def l1_normalize
    m = self.sum.to_f
    self.map{|x| x / m }
end

#l2_normalizeObject



91
92
93
94
# File 'lib/enumerable_extension.rb', line 91

def l2_normalize
    m = self.geo_mean
    self.map{|x| x / m }
end

#meanObject



29
30
31
# File 'lib/enumerable_extension.rb', line 29

def mean
  self.sum / self.length.to_f
end

#medianObject



38
39
40
41
42
43
44
45
46
# File 'lib/enumerable_extension.rb', line 38

def median
    sorted = self.sort
    m = sorted.length / 2
    if sorted.length.odd?
        sorted[m]
    else
        (sorted[m-1]+sorted[m])/2.0
    end
end

#pearson(arr, ddof = 1) ⇒ Object



82
83
84
# File 'lib/enumerable_extension.rb', line 82

def pearson(arr,ddof=1)
    self.covariance(arr,ddof) / (self.stdev(ddof) * arr.stdev(ddof))
end

#stdev(ddof = 1) ⇒ Object



60
61
62
# File 'lib/enumerable_extension.rb', line 60

def stdev(ddof=1)
    return Math.sqrt(self.variance(ddof))
end

#sumObject



25
26
27
# File 'lib/enumerable_extension.rb', line 25

def sum
  self.inject(0){|accum, i| accum + i }
end

#sum_and_meanObject



48
49
50
51
52
# File 'lib/enumerable_extension.rb', line 48

def sum_and_mean
    sum = self.sum
    mean = sum/self.length.to_f
    return sum,mean
end

#variance(ddof = 1) ⇒ Object



54
55
56
57
58
# File 'lib/enumerable_extension.rb', line 54

def variance(ddof=1)
    m = self.mean
    sum = self.inject(0){|accum, i| accum +(i-m)**2 }
    sum / (self.length - ddof).to_f
end

#variance_and_stdev(ddof = 1) ⇒ Object



64
65
66
67
68
# File 'lib/enumerable_extension.rb', line 64

def variance_and_stdev(ddof=1)
    sv = self.variance(ddof)
    stdev = Math.sqrt(sv)
    return sv, stdev
end