Changes for performance as well as some general refactoring

This commit is contained in:
Brian Underwood
2017-04-07 10:33:40 -04:00
parent 21b19e9805
commit ff298a8fb9
3 changed files with 34 additions and 33 deletions

View File

@@ -1,29 +1,19 @@
class Array
def classification
collect(&:last)
end
# calculate information entropy
def entropy
return 0 if empty?
info = {}
each do |i|
info[i] = !info[i] ? 1 : (info[i] + 1)
each_with_object(Hash.new(0)) do |i, result|
result[i] += 1
end.values.inject(0) do |sum, count|
percentage = count.to_f / length
sum + -percentage * Math.log2(percentage)
end
result(info, length)
end
private
def result(info, total)
final = 0
info.each do |_symbol, count|
next unless count > 0
percentage = count.to_f / total
final += -percentage * Math.log(percentage) / Math.log(2.0)
end
final
end
end
module ArrayClassification
refine Array do
def classification
collect(&:last)
end
end
end