Module: Enumerable
- Defined in:
- lib/enumerable_extension.rb
Instance Method Summary collapse
- #concitional_entropy_with(label) ⇒ Object
- #covariance(arr, ddof = 1) ⇒ Object
- #entropy ⇒ Object
- #geo_mean ⇒ Object
- #l1_normalize ⇒ Object
- #l2_normalize ⇒ Object
- #mean ⇒ Object
- #median ⇒ Object
- #pearson(arr, ddof = 1) ⇒ Object
- #stdev(ddof = 1) ⇒ Object
- #sum ⇒ Object
- #sum_and_mean ⇒ Object
- #variance(ddof = 1) ⇒ Object
- #variance_and_stdev(ddof = 1) ⇒ Object
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 = self.mean = arr.mean accum = 0.0 arr.length.times do |i| accum += (self[i]-)*(arr[i]-) end return accum / (self.length - ddof).to_f end |
#entropy ⇒ Object
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_mean ⇒ Object
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_normalize ⇒ Object
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_normalize ⇒ Object
91 92 93 94 |
# File 'lib/enumerable_extension.rb', line 91 def l2_normalize m = self.geo_mean self.map{|x| x / m } end |
#mean ⇒ Object
29 30 31 |
# File 'lib/enumerable_extension.rb', line 29 def mean self.sum / self.length.to_f end |
#median ⇒ Object
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 |
#sum ⇒ Object
25 26 27 |
# File 'lib/enumerable_extension.rb', line 25 def sum self.inject(0){|accum, i| accum + i } end |
#sum_and_mean ⇒ Object
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 |