1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
require 'facets/array/probability'
class Array
# Shannon's entropy for an array - returns the average
# bits per symbol required to encode the array.
# Lower values mean less "entropy" - i.e. less unique
# information in the array.
#
# e = %w{ a b c d e e e }.entropy
#
# ("%.3f" % e) #=> "2.128"
#
# CREDIT: Derek
def entropy
arr = self
probHash = arr.probability
# -- h is the Shannon entropy of the array
h = -1.to_f * probHash.keys.inject(0.to_f) do |sum, i|
sum + (probHash[i] * (Math.log(probHash[i])/Math.log(2.to_f)))
end
h
end
# Returns the maximum possible Shannon entropy of the array
# with given size assuming that it is an "order-0" source
# (each element is selected independently of the next).
#
# CREDIT: Derek
def ideal_entropy
arr = self
unitProb = 1.0.to_f / arr.size.to_f
(-1.to_f * arr.size.to_f * unitProb * Math.log(unitProb)/Math.log(2.to_f))
end
end
|