Never been to DZone Snippets before?

Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

« Newer Snippets
Older Snippets »
Showing 1-2 of 2 total  RSS 

Weighted Mean

Weighted mean ( http://en.wikipedia.org/wiki/Mean#Weighted_arithmetic_mean )

class Array
  #sum (and mean) found on http://snippets.dzone.com/posts/show/2161
  def sum
    inject( nil ) { |sum,x| sum ? sum + x.to_f : x.to_f }
  end
  
  def mean
    sum.to_f / size
  end
  
  #http://en.wikipedia.org/wiki/Mean#Weighted_arithmetic_mean
  def weighted_mean(weights_array)
    raise "Each element of the array must have an accompanying weight.  Array length = #{self.size} versus Weights length = #{weights_array.size}" if weights_array.size != self.size
    w_sum = weights_array.sum
    w_prod = 0
    self.each_index {|i| w_prod += self[i] * weights_array[i].to_f}
    w_prod.to_f / w_sum.to_f
  end
end


Example
>> a = [1,2,3]
=> [1, 2, 3]
>> w = [1,1,1]
=> [1, 1, 1]
>> a.weighted_arithmetic_mean(w)
=> 2.0
>> a.mean
=> 2.0
>> w = [5,2,1]
=> [5, 2, 1]
>> a.weighted_arithmetic_mean(w)
=> 1.5

Generic 'sum' and 'mean' methods for Ruby arrays

class Array; def sum; inject( nil ) { |sum,x| sum ? sum+x : x }; end; end


It's class agnostic, so you can do this:

[1,2,3].sum              # => 6
['a','b','c'].sum        # => 'abc'
[['a'], ['b','c']].sum   # => ['a', 'b', 'c']


You can then add a 'mean' operator easily:

class Array; def mean; sum / size; end; end


mean only works for numbers though, of course, like so:

[1,2,1000].mean    # => 334


That said, if your class implements division, it'll also work!
« Newer Snippets
Older Snippets »
Showing 1-2 of 2 total  RSS