Module: Nimbus::LossFunctions
- Defined in:
- lib/nimbus/loss_functions.rb
Overview
Math functions.
The LossFunctions class provides handy mathematical functions as class methods to be used by Tree and Forest when estimating predictions, errors and loss functions for training and testing data.
Class Method Summary collapse
-
.average(ids, value_table) ⇒ Object
Simple average: sum(n) / n.
-
.class_sizes(ids, value_table, classes) ⇒ Object
Array with the list of sizes of each class in the given list of individuals.
-
.class_sizes_in_list(list, classes) ⇒ Object
Array with the list of sizes of each class in the given list of classes.
-
.gini_index(ids, value_table, classes) ⇒ Object
Gini index of a list of classified individuals.
-
.majority_class(ids, value_table, classes) ⇒ Object
Majority class of a list of classified individuals.
-
.majority_class_in_list(list, classes) ⇒ Object
Majority class of a list of classes.
-
.mean_squared_error(ids, value_table, mean = nil) ⇒ Object
Mean squared error: sum (x-y)^2.
-
.quadratic_loss(ids, value_table, mean = nil) ⇒ Object
Quadratic loss: averaged mean squared error: sum (x-y)^2 / n.
-
.squared_difference(x, y) ⇒ Object
Difference between two values, squared.
Class Method Details
.average(ids, value_table) ⇒ Object
Simple average: sum(n) / n
17 18 19 |
# File 'lib/nimbus/loss_functions.rb', line 17 def average(ids, value_table) ids.inject(0.0){|sum, i| sum + value_table[i]} / ids.size end |
.class_sizes(ids, value_table, classes) ⇒ Object
Array with the list of sizes of each class in the given list of individuals.
70 71 72 |
# File 'lib/nimbus/loss_functions.rb', line 70 def class_sizes(ids, value_table, classes) classes.map{|c| ids.count{|i| value_table[i] == c}} end |
.class_sizes_in_list(list, classes) ⇒ Object
Array with the list of sizes of each class in the given list of classes.
75 76 77 |
# File 'lib/nimbus/loss_functions.rb', line 75 def class_sizes_in_list(list, classes) classes.map{|c| list.count{|i| i == c}} end |
.gini_index(ids, value_table, classes) ⇒ Object
Gini index of a list of classified individuals.
If a dataset T contains examples from n classes, then: gini(T) = 1 - Sum (Pj)^2 where Pj is the relative frequency of class j in T
46 47 48 49 50 51 |
# File 'lib/nimbus/loss_functions.rb', line 46 def gini_index(ids, value_table, classes) total_size = ids.size.to_f gini = 1 - class_sizes(ids, value_table, classes).inject(0.0){|sum, size| sum + (size/total_size)**2} gini.round(5) end |
.majority_class(ids, value_table, classes) ⇒ Object
Majority class of a list of classified individuals. If more than one class has the same number of individuals, one of the majority classes is selected randomly.
56 57 58 59 |
# File 'lib/nimbus/loss_functions.rb', line 56 def majority_class(ids, value_table, classes) sizes = class_sizes(ids, value_table, classes) Hash[classes.zip sizes].keep_if{|k,v| v == sizes.max}.keys.sample end |
.majority_class_in_list(list, classes) ⇒ Object
Majority class of a list of classes. If more than one class has the same number of individuals, one of the majority classes is selected randomly.
64 65 66 67 |
# File 'lib/nimbus/loss_functions.rb', line 64 def majority_class_in_list(list, classes) sizes = classes.map{|c| list.count{|i| i == c}} Hash[classes.zip sizes].keep_if{|k,v| v == sizes.max}.keys.sample end |
.mean_squared_error(ids, value_table, mean = nil) ⇒ Object
Mean squared error: sum (x-y)^2
22 23 24 25 |
# File 'lib/nimbus/loss_functions.rb', line 22 def mean_squared_error(ids, value_table, mean = nil) mean ||= self.average ids, value_table ids.inject(0.0){|sum, i| sum + ((value_table[i] - mean)**2) } end |
.quadratic_loss(ids, value_table, mean = nil) ⇒ Object
Quadratic loss: averaged mean squared error: sum (x-y)^2 / n
Default loss function for regression forests.
30 31 32 |
# File 'lib/nimbus/loss_functions.rb', line 30 def quadratic_loss(ids, value_table, mean = nil) self.mean_squared_error(ids, value_table, mean) / ids.size end |
.squared_difference(x, y) ⇒ Object
Difference between two values, squared. (x-y)^2
35 36 37 |
# File 'lib/nimbus/loss_functions.rb', line 35 def squared_difference(x,y) 0.0 + (x-y)**2 end |