Expectation-Maximization (EM) Algorithm merupakan salah satu metode dalam statistika dan machine learning yang digunakan untuk melakukan estimasi parameter pada model probabilistik dengan data yang tidak lengkap atau memiliki variabel tersembunyi (latent variables). Algoritma ini bekerja secara iteratif melalui dua tahap utama, yaitu Expectation (E-step) untuk menghitung nilai ekspektasi dari variabel tersembunyi, dan Maximization (M-step) untuk memperbarui parameter model berdasarkan hasil ekspektasi tersebut.
Pada praktikum ini, algoritma EM diterapkan pada kasus sederhana berupa pelemparan dua koin yang tidak diketahui identitasnya. Setiap set data merupakan hasil kombinasi jumlah kemunculan Head (H) dan Tail (T), namun tidak diketahui koin mana yang digunakan pada masing-masing percobaan. Oleh karena itu, EM digunakan untuk mengestimasi parameter probabilitas kemunculan Head dari masing-masing koin, sekaligus mengelompokkan data berdasarkan kemungkinan koin yang digunakan.
Melalui proses iterasi, diharapkan algoritma EM dapat mencapai kondisi konvergen, sehingga diperoleh estimasi parameter yang stabil. Hasil tersebut kemudian dapat digunakan untuk melakukan interpretasi terhadap karakteristik masing-masing koin serta menentukan kecenderungan penggunaan koin pada setiap set data.
# Data observasi
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_a <- 0.7
theta_b <- 0.4
# Parameter kontrol
max_iter <- 100
tol <- 1e-6
e_step <- function(obs, theta_a, theta_b) {
# Likelihood
likelihood_a <- (theta_a^obs[, "H"]) * ((1 - theta_a)^obs[, "T"])
likelihood_b <- (theta_b^obs[, "H"]) * ((1 - theta_b)^obs[, "T"])
# Posterior (bobot)
weight_a <- likelihood_a / (likelihood_a + likelihood_b)
weight_b <- 1 - weight_a
return(list(weight_a = weight_a, weight_b = weight_b))
}
m_step <- function(obs, weight_a, weight_b) {
# Ekspektasi untuk koin A
expected_h_a <- sum(weight_a * obs[, "H"])
expected_t_a <- sum(weight_a * obs[, "T"])
# Ekspektasi untuk koin B
expected_h_b <- sum(weight_b * obs[, "H"])
expected_t_b <- sum(weight_b * obs[, "T"])
# Update theta
theta_a_new <- expected_h_a / (expected_h_a + expected_t_a)
theta_b_new <- expected_h_b / (expected_h_b + expected_t_b)
return(list(theta_a = theta_a_new, theta_b = theta_b_new))
}
cat(sprintf("%-8s | %-10s | %-10s\n", "Iterasi", "Theta A", "Theta B"))
## Iterasi | Theta A | Theta B
cat(paste0(rep("-", 35), collapse = ""), "\n")
## -----------------------------------
for (i in 1:max_iter) {
prev_theta_a <- theta_a
prev_theta_b <- theta_b
# E-Step
e_res <- e_step(obs, theta_a, theta_b)
# M-Step
m_res <- m_step(obs, e_res$weight_a, e_res$weight_b)
theta_a <- m_res$theta_a
theta_b <- m_res$theta_b
cat(sprintf("%-8d | %-10.6f | %-10.6f\n", i, theta_a, theta_b))
# Cek konvergensi
if (abs(theta_a - prev_theta_a) < tol &&
abs(theta_b - prev_theta_b) < tol) {
cat("\nStatus: Konvergen!\n")
break
}
}
## 1 | 0.757111 | 0.475921
## 2 | 0.781339 | 0.502491
## 3 | 0.790823 | 0.512640
## 4 | 0.794488 | 0.516722
## 5 | 0.795901 | 0.518399
## 6 | 0.796446 | 0.519093
## 7 | 0.796656 | 0.519380
## 8 | 0.796738 | 0.519499
## 9 | 0.796769 | 0.519548
## 10 | 0.796781 | 0.519569
## 11 | 0.796786 | 0.519577
## 12 | 0.796788 | 0.519581
## 13 | 0.796789 | 0.519582
## 14 | 0.796789 | 0.519583
##
## Status: Konvergen!
cat(sprintf("Hasil Akhir:\nTheta A: %.4f\nTheta B: %.4f\n", theta_a, theta_b))
## Hasil Akhir:
## Theta A: 0.7968
## Theta B: 0.5196
hasil_em <- data.frame(
Set = 1:5,
Hasil = c("5H 5T", "9H 1T", "8H 2T", "4H 6T", "7H 3T"),
Kesimpulan = c(
"Kemungkinan besar koin B (hasil seimbang, mendekati 0.5)",
"Kemungkinan besar koin A (banyak Head, sesuai θA tinggi)",
"Kemungkinan besar koin A",
"Kemungkinan besar koin B",
"Kemungkinan besar koin A"
)
)
# Tampilkan
hasil_em
## Set Hasil Kesimpulan
## 1 1 5H 5T Kemungkinan besar koin B (hasil seimbang, mendekati 0.5)
## 2 2 9H 1T Kemungkinan besar koin A (banyak Head, sesuai θA tinggi)
## 3 3 8H 2T Kemungkinan besar koin A
## 4 4 4H 6T Kemungkinan besar koin B
## 5 5 7H 3T Kemungkinan besar koin A
Dengan menggunakan hasil akhir dari algoritma EM, diperoleh nilai parameter: θA = 0.7968 dan θB = 0.5196. Nilai ini menunjukkan bahwa koin A cenderung menghasilkan Head lebih tinggi (~80%), sedangkan koin B mendekati koin seimbang (~52%). Secara umum, algoritma EM berhasil mengelompokkan data berdasarkan karakteristik probabilitas masing-masing koin yaitu Koin A merepresentasikan koin “berat ke Head” dan Koin B merepresentasikan koin yang relatif lebih seimbang.