Parameter Awal

# Data
obs <- matrix(c(5, 5, 9, 1, 8, 2, 4, 6, 7, 3), nrow = 5, byrow = TRUE)
colnames(obs) <- c("H", "T")

# Parameter Awal
theta <- list(a = 0.7, b = 0.6)
tol <- 1e-5

E-Step

e_step <- function(data, params) {
  likelihood_a <- (params$a^data[, "H"]) * ((1 - params$a)^data[, "T"])
  likelihood_b <- (params$b^data[, "H"]) * ((1 - params$b)^data[, "T"])
  
  weight_a <- likelihood_a / (likelihood_a + likelihood_b)
  weight_b <- 1 - weight_a
  
  return(list(w_a = weight_a, w_b = weight_b))
}

M-Step

m_step <- function(data, weights) {
  new_h_a <- sum(weights$w_a * data[, "H"])
  new_t_a <- sum(weights$w_a * data[, "T"])
  
  new_h_b <- sum(weights$w_b * data[, "H"])
  new_t_b <- sum(weights$w_b * data[, "T"])
  
  new_theta_a <- new_h_a / (new_h_a + new_t_a)
  new_theta_b <- new_h_b / (new_h_b + new_t_b)
  
  return(list(a = new_theta_a, b = new_theta_b))
}

Looping

for (i in 1:100) {
  old_theta <- theta
  iterasi_terakhir <- i
  
  step_e_results <- e_step(obs, theta)
  theta          <- m_step(obs, step_e_results)
  
  cat(sprintf("Iterasi %d: Theta A = %.6f, Theta B = %.6f\n", i, theta$a, theta$b))
  
  # Cek Konvergensi
  if (abs(theta$a - old_theta$a) < tol && abs(theta$b - old_theta$b) < tol) {
    cat
    break
  }
}
## Iterasi 1: Theta A = 0.728914, Theta B = 0.588287
## Iterasi 2: Theta A = 0.752940, Theta B = 0.566029
## Iterasi 3: Theta A = 0.773011, Theta B = 0.545728
## Iterasi 4: Theta A = 0.785848, Theta B = 0.532177
## Iterasi 5: Theta A = 0.792276, Theta B = 0.525075
## Iterasi 6: Theta A = 0.795031, Theta B = 0.521864
## Iterasi 7: Theta A = 0.796122, Theta B = 0.520512
## Iterasi 8: Theta A = 0.796539, Theta B = 0.519959
## Iterasi 9: Theta A = 0.796696, Theta B = 0.519735
## Iterasi 10: Theta A = 0.796754, Theta B = 0.519644
## Iterasi 11: Theta A = 0.796776, Theta B = 0.519608
## Iterasi 12: Theta A = 0.796784, Theta B = 0.519593
## Iterasi 13: Theta A = 0.796787, Theta B = 0.519587
cat(sprintf("Total Iterasi : %d\n", iterasi_terakhir))
## Total Iterasi : 13
cat(sprintf("Final Theta A : %.6f\n", theta$a))
## Final Theta A : 0.796787
cat(sprintf("Final Theta B : %.6f\n", theta$b))
## Final Theta B : 0.519587

Kesimpulan

Berdasarkan perhitungan menggunakan algoritma EM, maka didapat theta A (0.796) dan theta B (0.519).

Dari hasil theta yang didapat, maka setiap set dapat diklasifikasikan untuk menebak koin mana yang paling mungkin:

Set 1: 5H 5T -> Kemungkinan besar koin B (hasilnya seimbang)

Set 2: 9H 1T -> Kemungkinan besar koin A (Hasil H jauh lebih banyak)

Set 3: 8H 2T -> Kemungkinan besar koin A (Hasil H lebih mendominasi)

Set 4: 4H 6T -> Kemungkinan besar koin B (Hasilnya relatif seimbang)

Set 5: 7H 3T -> Kemungkinan besar koin A (Hasil H lebih mendominasi)