Algoritma Expectation-Maximization (EM) merupakan metode iteratif yang digunakan untuk mengestimasi parameter pada suatu model statistik, khususnya pada data yang memiliki variabel laten atau data yang tidak diketahui secara langsung. Algoritma ini bekerja melalui dua tahap utama, yaitu Expectation Step (E-Step) dan Maximization Step (M-Step), yang dilakukan secara berulang hingga mencapai kondisi konvergen.Pada program ini terdapat beberapa tahapan utama, yaitu:

  1. Input data

Data terdiri dari jumlah kemunculan Head (H) dan Tail (T) pada setiap set percobaan.

  1. Inisialisasi parameter awal

Parameter awal ditentukan sebesar:θA=0.6,B=0.4 Nilai ini merepresentasikan probabilitas awal munculnya Head pada masing-masing koin.

  1. Fungsi likelihood

Fungsi likelihood digunakan untuk menghitung probabilitas suatu data muncul berdasarkan parameter koin tertentu.

  1. E-Step (Expectation Step)

Pada tahap ini dihitung: Probabilitas data berasal dari koin A (P_A) Probabilitas data berasal dari koin B (P_B) Rasio probabilitas atau bobot (w_A dan w_B)

Nilai bobot ini menunjukkan kemungkinan setiap set data berasal dari masing-masing koin.

  1. M-Step (Maximization Step)

Parameter θA dan θB diperbarui menggunakan hasil estimasi bobot dari tahap E-Step.

  1. Perhitungan perubahan parameter

Perubahan dihitung menggunakan Euclidean Distance untuk melihat seberapa besar perubahan parameter antar iterasi.

  1. Kondisi konvergensi

Iterasi berhenti ketika perubahan parameter sangat kecil, yang menunjukkan algoritma telah konvergen.

# DATA
data <- data.frame(
  Set = 1:5,
  H = c(5, 9, 8, 4, 7),
  T = c(5, 1, 2, 6, 3)
)

# PARAMETER AWAL
theta_A <- 0.6
theta_B <- 0.4 

# fungsi likelihood
likelihood <- function(H, T, theta) {
  theta^H * (1 - theta)^T
}

# simpan hasil iterasi
hasil_iterasi <- data.frame(
  iterasi = 0,
  theta_A = theta_A,
  theta_B = theta_B,
  perubahan = NA
)

max_iter <- 20

# =========================
# ITERASI EM
# =========================
for (iter in 1:max_iter) {
  
  cat("\n==============================\n")
  cat("ITERASI KE-", iter, "\n")
  cat("==============================\n")
  
  # =========================
  # E-STEP
  # =========================
  pA <- c(); pB <- c()
  wA <- c(); wB <- c()
  
  for (i in 1:nrow(data)) {
    H <- data$H[i]
    T <- data$T[i]
    
    probA <- likelihood(H, T, theta_A)
    probB <- likelihood(H, T, theta_B)
    
    weightA <- probA / (probA + probB)
    weightB <- probB / (probA + probB)
    
    pA <- c(pA, probA)
    pB <- c(pB, probB)
    wA <- c(wA, weightA)
    wB <- c(wB, weightB)
  }
  
  tabel_E <- data.frame(
    Set = data$Set,
    H = data$H,
    T = data$T,
    P_A = round(pA,5),
    P_B = round(pB,5),
    w_A = round(wA,4),
    w_B = round(wB,4)
  )
  
  cat("\n--- E-STEP ---\n")
  print(tabel_E)
  
  # =========================
  # M-STEP
  # =========================
  A_H <- sum(wA * data$H)
  A_total <- sum(wA * (data$H + data$T))
  
  B_H <- sum(wB * data$H)
  B_total <- sum(wB * (data$H + data$T))
  
  theta_A_new <- A_H / A_total
  theta_B_new <- B_H / B_total
  
  cat("\n--- M-STEP ---\n")
  cat("theta_A baru =", round(theta_A_new,4), "\n")
  cat("theta_B baru =", round(theta_B_new,4), "\n")
  
  # =========================
  # PERUBAHAN
  # =========================
  perubahan <- sqrt((theta_A_new - theta_A)^2 + (theta_B_new - theta_B)^2)
  
  cat("\nPerubahan =", round(perubahan,4), "\n")
  
  # simpan
  hasil_iterasi <- rbind(hasil_iterasi,
                        data.frame(iterasi=iter,
                                   theta_A=theta_A_new,
                                   theta_B=theta_B_new,
                                   perubahan=perubahan))
  
  # update
  theta_A <- theta_A_new
  theta_B <- theta_B_new
  
  # kondisi berhenti
  if (perubahan < 0.001) {
    cat("\n*** KONVERGEN ***\n")
    break
  }
}
## 
## ==============================
## ITERASI KE- 1 
## ==============================
## 
## --- E-STEP ---
##   Set H T     P_A     P_B    w_A    w_B
## 1   1 5 5 0.00080 0.00080 0.5000 0.5000
## 2   2 9 1 0.00403 0.00016 0.9624 0.0376
## 3   3 8 2 0.00269 0.00024 0.9193 0.0807
## 4   4 4 6 0.00053 0.00119 0.3077 0.6923
## 5   5 7 3 0.00179 0.00035 0.8351 0.1649
## 
## --- M-STEP ---
## theta_A baru = 0.7261 
## theta_B baru = 0.502 
## 
## Perubahan = 0.1622 
## 
## ==============================
## ITERASI KE- 2 
## ==============================
## 
## --- E-STEP ---
##   Set H T     P_A     P_B    w_A    w_B
## 1   1 5 5 0.00031 0.00098 0.2416 0.7584
## 2   2 9 1 0.01537 0.00101 0.9384 0.0616
## 3   3 8 2 0.00580 0.00100 0.8528 0.1472
## 4   4 4 6 0.00012 0.00097 0.1080 0.8920
## 5   5 7 3 0.00219 0.00099 0.6878 0.3122
## 
## --- M-STEP ---
## theta_A baru = 0.768 
## theta_B baru = 0.5194 
## 
## Perubahan = 0.0453 
## 
## ==============================
## ITERASI KE- 3 
## ==============================
## 
## --- E-STEP ---
##   Set H T     P_A     P_B    w_A    w_B
## 1   1 5 5 0.00018 0.00097 0.1564 0.8436
## 2   2 9 1 0.02156 0.00132 0.9422 0.0578
## 3   3 8 2 0.00651 0.00122 0.8419 0.1581
## 4   4 4 6 0.00005 0.00090 0.0571 0.9429
## 5   5 7 3 0.00197 0.00113 0.6349 0.3651
## 
## --- M-STEP ---
## theta_A baru = 0.7852 
## theta_B baru = 0.5208 
## 
## Perubahan = 0.0173 
## 
## ==============================
## ITERASI KE- 4 
## ==============================
## 
## --- E-STEP ---
##   Set H T     P_A     P_B    w_A    w_B
## 1   1 5 5 0.00014 0.00097 0.1236 0.8764
## 2   2 9 1 0.02437 0.00135 0.9475 0.0525
## 3   3 8 2 0.00667 0.00124 0.8429 0.1571
## 4   4 4 6 0.00004 0.00089 0.0402 0.9598
## 5   5 7 3 0.00182 0.00114 0.6146 0.3854
## 
## --- M-STEP ---
## theta_A baru = 0.7923 
## theta_B baru = 0.5203 
## 
## Perubahan = 0.0071 
## 
## ==============================
## ITERASI KE- 5 
## ==============================
## 
## --- E-STEP ---
##   Set H T     P_A     P_B    w_A    w_B
## 1   1 5 5 0.00012 0.00097 0.1109 0.8891
## 2   2 9 1 0.02555 0.00134 0.9502 0.0498
## 3   3 8 2 0.00670 0.00124 0.8443 0.1557
## 4   4 4 6 0.00003 0.00089 0.0342 0.9658
## 5   5 7 3 0.00176 0.00114 0.6066 0.3934
## 
## --- M-STEP ---
## theta_A baru = 0.7951 
## theta_B baru = 0.5199 
## 
## Perubahan = 0.0028 
## 
## ==============================
## ITERASI KE- 6 
## ==============================
## 
## --- E-STEP ---
##   Set H T     P_A     P_B    w_A    w_B
## 1   1 5 5 0.00011 0.00097 0.1060 0.8940
## 2   2 9 1 0.02601 0.00133 0.9513 0.0487
## 3   3 8 2 0.00671 0.00123 0.8450 0.1550
## 4   4 4 6 0.00003 0.00089 0.0320 0.9680
## 5   5 7 3 0.00173 0.00114 0.6035 0.3965
## 
## --- M-STEP ---
## theta_A baru = 0.7961 
## theta_B baru = 0.5197 
## 
## Perubahan = 0.0011 
## 
## ==============================
## ITERASI KE- 7 
## ==============================
## 
## --- E-STEP ---
##   Set H T     P_A     P_B    w_A    w_B
## 1   1 5 5 0.00011 0.00097 0.1041 0.8959
## 2   2 9 1 0.02619 0.00133 0.9517 0.0483
## 3   3 8 2 0.00671 0.00123 0.8453 0.1547
## 4   4 4 6 0.00003 0.00090 0.0312 0.9688
## 5   5 7 3 0.00172 0.00113 0.6023 0.3977
## 
## --- M-STEP ---
## theta_A baru = 0.7965 
## theta_B baru = 0.5196 
## 
## Perubahan = 4e-04 
## 
## *** KONVERGEN ***
# =========================
# TABEL HASIL ITERASI
# =========================
cat("\n==============================\n")
## 
## ==============================
cat("HASIL AKHIR ITERASI\n")
## HASIL AKHIR ITERASI
cat("==============================\n")
## ==============================
print(round(hasil_iterasi,4))
##   iterasi theta_A theta_B perubahan
## 1       0  0.6000  0.4000        NA
## 2       1  0.7261  0.5020    0.1622
## 3       2  0.7680  0.5194    0.0453
## 4       3  0.7852  0.5208    0.0173
## 5       4  0.7923  0.5203    0.0071
## 6       5  0.7951  0.5199    0.0028
## 7       6  0.7961  0.5197    0.0011
## 8       7  0.7965  0.5196    0.0004
# =========================
# KESIMPULAN AKHIR
# =========================

theta_A_final <- theta_A
theta_B_final <- theta_B

hasil <- data.frame()

for (i in 1:nrow(data)) {
  
  H <- data$H[i]
  T <- data$T[i]
  
  pA <- likelihood(H, T, theta_A_final)
  pB <- likelihood(H, T, theta_B_final)
  
  wA <- pA / (pA + pB)
  wB <- pB / (pA + pB)
  
  if (wA > wB) {
    koin <- "koin A"
  } else {
    koin <- "koin B"
  }
  
  if (H > T) {
    ket <- "(banyak H, cocok koin berat)"
  } else if (H < T) {
    ket <- "(lebih banyak T)"
  } else {
    ket <- "(hasil seimbang, cocok koin adil)"
  }
  
  hasil <- rbind(hasil, data.frame(
    Set = data$Set[i],
    Hasil = paste0(H, "H ", T, "T"),
    Kesimpulan = paste("Kemungkinan besar", koin, ket)
  ))
}

cat("\n==============================\n")
## 
## ==============================
cat("KESIMPULAN AKHIR\n")
## KESIMPULAN AKHIR
cat("==============================\n")
## ==============================
print(hasil)
##   Set Hasil                                                 Kesimpulan
## 1   1 5H 5T Kemungkinan besar koin B (hasil seimbang, cocok koin adil)
## 2   2 9H 1T      Kemungkinan besar koin A (banyak H, cocok koin berat)
## 3   3 8H 2T      Kemungkinan besar koin A (banyak H, cocok koin berat)
## 4   4 4H 6T                  Kemungkinan besar koin B (lebih banyak T)
## 5   5 7H 3T      Kemungkinan besar koin A (banyak H, cocok koin berat)

Interpretasi: Berdasarkan hasil iterasi algoritma EM, diperoleh bahwa nilai parameter berubah secara bertahap hingga mencapai kondisi konvergen pada iterasi ke-7 dengan nilai: θA=0.7965 θB=0.5196

Nilai tersebut menunjukkan bahwa:

Koin A memiliki probabilitas lebih tinggi menghasilkan Head sehingga dapat dikatakan sebagai koin yang cenderung berat ke Head. Koin B memiliki probabilitas yang lebih mendekati seimbang antara Head dan Tail.

Pada tahap E-Step, diperoleh nilai probabilitas posterior (w) yang menunjukkan kemungkinan setiap set berasal dari koin tertentu. Hasil menunjukkan bahwa:

Set dengan jumlah Head tinggi seperti 9H1T, 8H2T, dan 7H3T lebih cenderung berasal dari koin A. Set dengan hasil lebih seimbang atau lebih banyak Tail seperti 5H5T dan 4H6T lebih cenderung berasal dari koin B.

Nilai perubahan parameter juga semakin kecil pada setiap iterasi:

0.1622→0.0453→0.0173→0.0071→0.0028→0.0011→0.0004

Hal ini menunjukkan bahwa parameter semakin stabil dan algoritma berhasil mencapai konvergensi.

Kesimpulan:

Berdasarkan penerapan algoritma EM, dapat disimpulkan bahwa:

Algoritma EM mampu mengestimasi parameter probabilitas dua koin meskipun identitas koin tidak diketahui sebelumnya. Koin A memiliki kecenderungan lebih besar menghasilkan Head dibandingkan koin B. Nilai probabilitas posterior (w) berhasil digunakan untuk menentukan kemungkinan koin yang digunakan pada setiap set data. Proses iterasi menunjukkan konvergensi karena nilai perubahan parameter semakin kecil hingga mendekati nol. Algoritma EM efektif digunakan untuk kasus dengan variabel