module Azami

Azami

Public Class Methods

em(data) click to toggle source
# File lib/azami.rb, line 3
def self.em(data)
  inputs = data[:inputs]
  normal_params = data[:normal_params]
  iteration_count = data[:iteration_count]

  iteration_count.times do
    likelihood_weights =
      inputs.map do |input|
        likelihoods = normal_params.map do |normal_param|
          mean = normal_param[:mean]
          stdev = normal_param[:stdev]
          (0.398942 * (2.71828**(-(0.5 * (input - mean)**2) / stdev**2))) / stdev
        end
        total_likelihood = likelihoods.sum
        likelihoods.map do |lk|
          lk / total_likelihood
        end
      end.transpose

    normal_params.each_with_index do |normal_param, normal_index|
      weights = likelihood_weights[normal_index]
      weights_sum = weights.sum
      normal_param[:mean] = mean = weights.map.with_index do |weight, input_i|
                                      (weight * inputs[input_i])
                                    end .sum / weights_sum
      normal_param[:stdev] = Math.sqrt((weights.map.with_index do |weight, input_i|
                                           (((inputs[input_i] - mean)**2) * weight)
                                         end).sum / weights_sum)
    end
  end
  normal_params
end