class Scoruby::Models::NaiveBayes::Model
Public Class Methods
new(xml)
click to toggle source
# File lib/scoruby/models/naive_bayes/model.rb, line 14 def initialize(xml) @model_data = ModelData.new(xml) end
Public Instance Methods
lvalues(features)
click to toggle source
# File lib/scoruby/models/naive_bayes/model.rb, line 18 def lvalues(features) calc_label_feature_values(features) calc_label_values end
score(features, label)
click to toggle source
# File lib/scoruby/models/naive_bayes/model.rb, line 23 def score(features, label) lvalues(features)[label] / lvalues(features).values.reduce(:+) end
Private Instance Methods
calc_label_feature_values(features)
click to toggle source
# File lib/scoruby/models/naive_bayes/model.rb, line 40 def calc_label_feature_values(features) labels.each_key do |label| features.each do |feature_name, feature_value| label_value = category(feature_name, feature_value, label) label_value ||= numerical(feature_name, feature_value, label) labels[label][feature_name] = label_value if label_value end end end
calc_label_values()
click to toggle source
# File lib/scoruby/models/naive_bayes/model.rb, line 29 def calc_label_values label_values = {} labels.each do |label, label_data| label_data.each do |key, value| label_data[key] = threshold if value.round(5).zero? end label_values[label] = label_data.values.reduce(:*) end label_values end
calc_numerical(feature_value, mean, variance)
click to toggle source
# File lib/scoruby/models/naive_bayes/model.rb, line 67 def calc_numerical(feature_value, mean, variance) Math.exp(-(feature_value - mean)**2 / (2 * variance)) / Math.sqrt(2 * Math::PI * variance) end
category(feature_name, feature_value, label)
click to toggle source
# File lib/scoruby/models/naive_bayes/model.rb, line 50 def category(feature_name, feature_value, label) model_feature = category_features[feature_name] return unless model_feature && model_feature[feature_value] value_count = model_feature[feature_value][label].to_f overall_count = model_feature.map { |_, value| value[label].to_f } .reduce(0, :+) value_count / overall_count end
numerical(feature_name, feature_value, label)
click to toggle source
# File lib/scoruby/models/naive_bayes/model.rb, line 59 def numerical(feature_name, feature_value, label) model_feature = numerical_features[feature_name] return unless model_feature && model_feature[label] calc_numerical(feature_value.to_f, model_feature[label][:mean].to_f, model_feature[label][:variance].to_f) end