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