class Lurn::NaiveBayes::BernoulliNaiveBayes
Attributes
label_probabilities[RW]
probability_matrix[RW]
unique_labels[RW]
Public Class Methods
new()
click to toggle source
# File lib/lurn/naive_bayes/bernoulli_naive_bayes.rb, line 9 def initialize @k = 1.0 end
Public Instance Methods
fit(vectors, labels)
click to toggle source
# File lib/lurn/naive_bayes/bernoulli_naive_bayes.rb, line 13 def fit(vectors, labels) vectors = Matrix.rows(vectors) @unique_labels = labels.uniq @feature_count = vectors.column_size document_count_matrix = build_document_count_matrix(vectors, labels) @probability_matrix = build_probability_matrix(document_count_matrix, labels) @label_probabilities = @unique_labels.map { |l1| labels.count { |l2| l1 == l2 }.to_f / labels.count.to_f } end
to_h()
click to toggle source
# File lib/lurn/naive_bayes/bernoulli_naive_bayes.rb, line 25 def to_h { probability_matrix: probability_matrix.to_a, label_probabilities: label_probabilities, unique_labels: unique_labels } end
Private Instance Methods
build_document_count_matrix(vectors, labels)
click to toggle source
# File lib/lurn/naive_bayes/bernoulli_naive_bayes.rb, line 48 def build_document_count_matrix(vectors, labels) matrix = Array.new(@unique_labels.count) { Array.new(@feature_count, 0) } vectors.each_with_index do |value, row, col| if value == true label = labels[row] label_index = @unique_labels.index(label) matrix[label_index][col] += 1 end end Matrix.rows(matrix) end
build_probability_matrix(document_count_matrix, labels)
click to toggle source
# File lib/lurn/naive_bayes/bernoulli_naive_bayes.rb, line 35 def build_probability_matrix(document_count_matrix, labels) probability_matrix = Array.new(@unique_labels.count) { Array.new(@feature_count, 0.0) } document_count_matrix.each_with_index do |value, row, col| label = @unique_labels[row] label_frequency = labels.count(label) probability_matrix[row][col] = Math.log((value.to_f + @k) / (label_frequency.to_f + (2.0 * @k))) end Matrix.rows(probability_matrix) end
joint_log_likelihood(x)
click to toggle source
# File lib/lurn/naive_bayes/bernoulli_naive_bayes.rb, line 62 def joint_log_likelihood(x) jlls = [] unique_labels.each_with_index do |label, label_index| vector = Vector.elements(x.map { |e| e == true ? 1 : 0 }) probabilities = @probability_matrix.row(label_index) neg_probs = probabilities.map { |prb| Math.log(1.0 - Math.exp(prb)) } jll = vector.dot(probabilities - neg_probs) jll += Math.log(@label_probabilities[label_index]) + neg_probs.inject(:+) jlls.push jll end jlls end