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:
Data terdiri dari jumlah kemunculan Head (H) dan Tail (T) pada setiap set percobaan.
Parameter awal ditentukan sebesar:θA=0.6,B=0.4 Nilai ini merepresentasikan probabilitas awal munculnya Head pada masing-masing koin.
Fungsi likelihood digunakan untuk menghitung probabilitas suatu data muncul berdasarkan parameter koin tertentu.
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.
Parameter θA dan θB diperbarui menggunakan hasil estimasi bobot dari tahap E-Step.
Perubahan dihitung menggunakan Euclidean Distance untuk melihat seberapa besar perubahan parameter antar iterasi.
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.
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