# 1. Persiapan Data (H = Heads, T = Tails)
# Dataset dari slide: 5H5T, 9H1T, 8H2T, 4H6T, 7H3T
heads <- c(5, 9, 8, 4, 7)
tails <- c(5, 1, 2, 6, 3)
n_lemparan <- 10
# 2. Inisialisasi Parameter Awal (Sesuai Tugas: theta_A=0.7, theta_B=0.4)
theta_a <- 0.7
theta_b <- 0.4
# Pengaturan Iterasi
maks_iter <- 20
toleransi <- 1e-6 # Batas konvergensi
cat("Memulai Iterasi EM...\n")
## Memulai Iterasi EM...
cat(sprintf("Iterasi 0: theta_A = %.3f, theta_B = %.3f\n", theta_a, theta_b))
## Iterasi 0: theta_A = 0.700, theta_B = 0.400
for (i in 1:maks_iter) {
# Simpan nilai lama untuk cek konvergensi
theta_a_lama <- theta_a
theta_b_lama <- theta_b
### E-STEP ###
# Menghitung probabilitas binomial untuk tiap set (Likelihood)
# P(E|Z) = nCr * theta^h * (1-theta)^t
prob_set_a <- dbinom(heads, size = n_lemparan, prob = theta_a)
prob_set_b <- dbinom(heads, size = n_lemparan, prob = theta_b)
# Menghitung bobot (Posterior/Keyakinan koin mana yang digunakan)
# Rasio koin A = P(E|A) / (P(E|A) + P(E|B))
bobot_a <- prob_set_a / (prob_set_a + prob_set_b)
bobot_b <- 1 - bobot_a
# Estimasi jumlah H dan T untuk tiap koin (Ekspektasi)
est_h_a <- heads * bobot_a
est_t_a <- tails * bobot_a
est_h_b <- heads * bobot_b
est_t_b <- tails * bobot_b
### M-STEP ###
# Memperbarui nilai theta dengan MLE
theta_a <- sum(est_h_a) / sum(est_h_a + est_t_a)
theta_b <- sum(est_h_b) / sum(est_h_b + est_t_b)
# Cek Konvergensi (Euclidean Distance atau selisih absolut)
perubahan <- sqrt((theta_a - theta_a_lama)^2 + (theta_b - theta_b_lama)^2)
cat(sprintf("Iterasi %d: theta_A = %.4f, theta_B = %.4f, Perubahan = %.6f\n",
i, theta_a, theta_b, perubahan))
if (perubahan < toleransi) {
cat("Algoritma Konvergen!\n")
break
}
}
## Iterasi 1: theta_A = 0.7571, theta_B = 0.4759, Perubahan = 0.095004
## Iterasi 2: theta_A = 0.7813, theta_B = 0.5025, Perubahan = 0.035958
## Iterasi 3: theta_A = 0.7908, theta_B = 0.5126, Perubahan = 0.013890
## Iterasi 4: theta_A = 0.7945, theta_B = 0.5167, Perubahan = 0.005486
## Iterasi 5: theta_A = 0.7959, theta_B = 0.5184, Perubahan = 0.002193
## Iterasi 6: theta_A = 0.7964, theta_B = 0.5191, Perubahan = 0.000882
## Iterasi 7: theta_A = 0.7967, theta_B = 0.5194, Perubahan = 0.000356
## Iterasi 8: theta_A = 0.7967, theta_B = 0.5195, Perubahan = 0.000144
## Iterasi 9: theta_A = 0.7968, theta_B = 0.5195, Perubahan = 0.000058
## Iterasi 10: theta_A = 0.7968, theta_B = 0.5196, Perubahan = 0.000024
## Iterasi 11: theta_A = 0.7968, theta_B = 0.5196, Perubahan = 0.000010
## Iterasi 12: theta_A = 0.7968, theta_B = 0.5196, Perubahan = 0.000004
## Iterasi 13: theta_A = 0.7968, theta_B = 0.5196, Perubahan = 0.000002
## Iterasi 14: theta_A = 0.7968, theta_B = 0.5196, Perubahan = 0.000001
## Algoritma Konvergen!
# Hasil Akhir
cat("\n--- HASIL AKHIR ---\n")
##
## --- HASIL AKHIR ---
cat(sprintf("Theta A: %.4f\n", theta_a))
## Theta A: 0.7968
cat(sprintf("Theta B: %.4f\n", theta_b))
## Theta B: 0.5196
# 1. Persiapan Data (H = Heads, T = Tails)
# Dataset dari slide: 5H5T, 9H1T, 8H2T, 4H6T, 7H3T
heads <- c(5, 9, 8, 4, 7)
tails <- c(5, 1, 2, 6, 3)
n_lemparan <- 10
# 2. Inisialisasi Parameter Awal (Sesuai Tugas: theta_A=0.7, theta_B=0.4)
theta_a <- 0.4
theta_b <- 0.7
# Pengaturan Iterasi
maks_iter <- 20
toleransi <- 1e-6 # Batas konvergensi
cat("Memulai Iterasi EM...\n")
## Memulai Iterasi EM...
cat(sprintf("Iterasi 0: theta_A = %.3f, theta_B = %.3f\n", theta_a, theta_b))
## Iterasi 0: theta_A = 0.400, theta_B = 0.700
for (i in 1:maks_iter) {
# Simpan nilai lama untuk cek konvergensi
theta_a_lama <- theta_a
theta_b_lama <- theta_b
### E-STEP ###
# Menghitung probabilitas binomial untuk tiap set (Likelihood)
# P(E|Z) = nCr * theta^h * (1-theta)^t
prob_set_a <- dbinom(heads, size = n_lemparan, prob = theta_a)
prob_set_b <- dbinom(heads, size = n_lemparan, prob = theta_b)
# Menghitung bobot (Posterior/Keyakinan koin mana yang digunakan)
# Rasio koin A = P(E|A) / (P(E|A) + P(E|B))
bobot_a <- prob_set_a / (prob_set_a + prob_set_b)
bobot_b <- 1 - bobot_a
# Estimasi jumlah H dan T untuk tiap koin (Ekspektasi)
est_h_a <- heads * bobot_a
est_t_a <- tails * bobot_a
est_h_b <- heads * bobot_b
est_t_b <- tails * bobot_b
### M-STEP ###
# Memperbarui nilai theta dengan MLE
theta_a <- sum(est_h_a) / sum(est_h_a + est_t_a)
theta_b <- sum(est_h_b) / sum(est_h_b + est_t_b)
# Cek Konvergensi (Euclidean Distance atau selisih absolut)
perubahan <- sqrt((theta_a - theta_a_lama)^2 + (theta_b - theta_b_lama)^2)
cat(sprintf("Iterasi %d: theta_A = %.4f, theta_B = %.4f, Perubahan = %.6f\n",
i, theta_a, theta_b, perubahan))
if (perubahan < toleransi) {
cat("Algoritma Konvergen!\n")
break
}
}
## Iterasi 1: theta_A = 0.4759, theta_B = 0.7571, Perubahan = 0.095004
## Iterasi 2: theta_A = 0.5025, theta_B = 0.7813, Perubahan = 0.035958
## Iterasi 3: theta_A = 0.5126, theta_B = 0.7908, Perubahan = 0.013890
## Iterasi 4: theta_A = 0.5167, theta_B = 0.7945, Perubahan = 0.005486
## Iterasi 5: theta_A = 0.5184, theta_B = 0.7959, Perubahan = 0.002193
## Iterasi 6: theta_A = 0.5191, theta_B = 0.7964, Perubahan = 0.000882
## Iterasi 7: theta_A = 0.5194, theta_B = 0.7967, Perubahan = 0.000356
## Iterasi 8: theta_A = 0.5195, theta_B = 0.7967, Perubahan = 0.000144
## Iterasi 9: theta_A = 0.5195, theta_B = 0.7968, Perubahan = 0.000058
## Iterasi 10: theta_A = 0.5196, theta_B = 0.7968, Perubahan = 0.000024
## Iterasi 11: theta_A = 0.5196, theta_B = 0.7968, Perubahan = 0.000010
## Iterasi 12: theta_A = 0.5196, theta_B = 0.7968, Perubahan = 0.000004
## Iterasi 13: theta_A = 0.5196, theta_B = 0.7968, Perubahan = 0.000002
## Iterasi 14: theta_A = 0.5196, theta_B = 0.7968, Perubahan = 0.000001
## Algoritma Konvergen!
# Hasil Akhir
cat("\n--- HASIL AKHIR ---\n")
##
## --- HASIL AKHIR ---
cat(sprintf("Theta A: %.4f\n", theta_a))
## Theta A: 0.5196
cat(sprintf("Theta B: %.4f\n", theta_b))
## Theta B: 0.7968
# 1. Persiapan Data (H = Heads, T = Tails)
# Dataset dari slide: 5H5T, 9H1T, 8H2T, 4H6T, 7H3T
heads <- c(5, 9, 8, 4, 7)
tails <- c(5, 1, 2, 6, 3)
n_lemparan <- 10
# 2. Inisialisasi Parameter Awal (Sesuai Tugas: theta_A=0.7, theta_B=0.4)
theta_a <- 0.5
theta_b <- 0.5
# Pengaturan Iterasi
maks_iter <- 20
toleransi <- 1e-6 # Batas konvergensi
cat("Memulai Iterasi EM...\n")
## Memulai Iterasi EM...
cat(sprintf("Iterasi 0: theta_A = %.3f, theta_B = %.3f\n", theta_a, theta_b))
## Iterasi 0: theta_A = 0.500, theta_B = 0.500
for (i in 1:maks_iter) {
# Simpan nilai lama untuk cek konvergensi
theta_a_lama <- theta_a
theta_b_lama <- theta_b
### E-STEP ###
# Menghitung probabilitas binomial untuk tiap set (Likelihood)
# P(E|Z) = nCr * theta^h * (1-theta)^t
prob_set_a <- dbinom(heads, size = n_lemparan, prob = theta_a)
prob_set_b <- dbinom(heads, size = n_lemparan, prob = theta_b)
# Menghitung bobot (Posterior/Keyakinan koin mana yang digunakan)
# Rasio koin A = P(E|A) / (P(E|A) + P(E|B))
bobot_a <- prob_set_a / (prob_set_a + prob_set_b)
bobot_b <- 1 - bobot_a
# Estimasi jumlah H dan T untuk tiap koin (Ekspektasi)
est_h_a <- heads * bobot_a
est_t_a <- tails * bobot_a
est_h_b <- heads * bobot_b
est_t_b <- tails * bobot_b
### M-STEP ###
# Memperbarui nilai theta dengan MLE
theta_a <- sum(est_h_a) / sum(est_h_a + est_t_a)
theta_b <- sum(est_h_b) / sum(est_h_b + est_t_b)
# Cek Konvergensi (Euclidean Distance atau selisih absolut)
perubahan <- sqrt((theta_a - theta_a_lama)^2 + (theta_b - theta_b_lama)^2)
cat(sprintf("Iterasi %d: theta_A = %.4f, theta_B = %.4f, Perubahan = %.6f\n",
i, theta_a, theta_b, perubahan))
if (perubahan < toleransi) {
cat("Algoritma Konvergen!\n")
break
}
}
## Iterasi 1: theta_A = 0.6600, theta_B = 0.6600, Perubahan = 0.226274
## Iterasi 2: theta_A = 0.6600, theta_B = 0.6600, Perubahan = 0.000000
## Algoritma Konvergen!
# Hasil Akhir
cat("\n--- HASIL AKHIR ---\n")
##
## --- HASIL AKHIR ---
cat(sprintf("Theta A: %.4f\n", theta_a))
## Theta A: 0.6600
cat(sprintf("Theta B: %.4f\n", theta_b))
## Theta B: 0.6600
# 1. Persiapan Data (H = Heads, T = Tails)
# Dataset dari slide: 5H5T, 9H1T, 8H2T, 4H6T, 7H3T
heads <- c(5, 9, 8, 4, 7)
tails <- c(5, 1, 2, 6, 3)
n_lemparan <- 10
# 2. Inisialisasi Parameter Awal (Sesuai Tugas: theta_A=0.7, theta_B=0.4)
theta_a <- 0.71
theta_b <- 0.43
# Pengaturan Iterasi
maks_iter <- 20
toleransi <- 1e-6 # Batas konvergensi
cat("Memulai Iterasi EM...\n")
## Memulai Iterasi EM...
cat(sprintf("Iterasi 0: theta_A = %.3f, theta_B = %.3f\n", theta_a, theta_b))
## Iterasi 0: theta_A = 0.710, theta_B = 0.430
for (i in 1:maks_iter) {
# Simpan nilai lama untuk cek konvergensi
theta_a_lama <- theta_a
theta_b_lama <- theta_b
### E-STEP ###
# Menghitung probabilitas binomial untuk tiap set (Likelihood)
# P(E|Z) = nCr * theta^h * (1-theta)^t
prob_set_a <- dbinom(heads, size = n_lemparan, prob = theta_a)
prob_set_b <- dbinom(heads, size = n_lemparan, prob = theta_b)
# Menghitung bobot (Posterior/Keyakinan koin mana yang digunakan)
# Rasio koin A = P(E|A) / (P(E|A) + P(E|B))
bobot_a <- prob_set_a / (prob_set_a + prob_set_b)
bobot_b <- 1 - bobot_a
# Estimasi jumlah H dan T untuk tiap koin (Ekspektasi)
est_h_a <- heads * bobot_a
est_t_a <- tails * bobot_a
est_h_b <- heads * bobot_b
est_t_b <- tails * bobot_b
### M-STEP ###
# Memperbarui nilai theta dengan MLE
theta_a <- sum(est_h_a) / sum(est_h_a + est_t_a)
theta_b <- sum(est_h_b) / sum(est_h_b + est_t_b)
# Cek Konvergensi (Euclidean Distance atau selisih absolut)
perubahan <- sqrt((theta_a - theta_a_lama)^2 + (theta_b - theta_b_lama)^2)
cat(sprintf("Iterasi %d: theta_A = %.4f, theta_B = %.4f, Perubahan = %.6f\n",
i, theta_a, theta_b, perubahan))
if (perubahan < toleransi) {
cat("Algoritma Konvergen!\n")
break
}
}
## Iterasi 1: theta_A = 0.7625, theta_B = 0.4874, Perubahan = 0.077731
## Iterasi 2: theta_A = 0.7835, theta_B = 0.5071, Perubahan = 0.028826
## Iterasi 3: theta_A = 0.7917, theta_B = 0.5145, Perubahan = 0.011051
## Iterasi 4: theta_A = 0.7948, theta_B = 0.5175, Perubahan = 0.004337
## Iterasi 5: theta_A = 0.7960, theta_B = 0.5187, Perubahan = 0.001723
## Iterasi 6: theta_A = 0.7965, theta_B = 0.5192, Perubahan = 0.000689
## Iterasi 7: theta_A = 0.7967, theta_B = 0.5194, Perubahan = 0.000277
## Iterasi 8: theta_A = 0.7967, theta_B = 0.5195, Perubahan = 0.000112
## Iterasi 9: theta_A = 0.7968, theta_B = 0.5196, Perubahan = 0.000045
## Iterasi 10: theta_A = 0.7968, theta_B = 0.5196, Perubahan = 0.000018
## Iterasi 11: theta_A = 0.7968, theta_B = 0.5196, Perubahan = 0.000007
## Iterasi 12: theta_A = 0.7968, theta_B = 0.5196, Perubahan = 0.000003
## Iterasi 13: theta_A = 0.7968, theta_B = 0.5196, Perubahan = 0.000001
## Iterasi 14: theta_A = 0.7968, theta_B = 0.5196, Perubahan = 0.000000
## Algoritma Konvergen!
# Hasil Akhir
cat("\n--- HASIL AKHIR ---\n")
##
## --- HASIL AKHIR ---
cat(sprintf("Theta A: %.4f\n", theta_a))
## Theta A: 0.7968
cat(sprintf("Theta B: %.4f\n", theta_b))
## Theta B: 0.5196
Pengujian algoritma EM menggunakan dataset lemparan koin (Heads/Tails) dengan empat skenario inisialisasi parameter awal yang berbeda:
Inisialisasi: (\(\theta_A=0.7, \theta_B=0.4\)) dan (\(\theta_A=0.71, \theta_B=0.43\)).
Hasil: Kedua skenario ini konvergen ke nilai yang sama, yaitu \(\theta_A \approx 0.7968\) dan \(\theta_B \approx 0.5196\).
Interpretasi: Algoritma berhasil memisahkan dua karakter koin yang berbeda dari data yang tercampur. Koin A diestimasi memiliki peluang muncul angka (Heads) sebesar ~80%, sedangkan koin B adalah koin yang cukup adil (fair coin) dengan peluang ~52%.
Inisialisasi: \(\theta_A=0.4, \theta_B=0.7\).
Hasil: Konvergen ke \(\theta_A \approx 0.5196\) dan \(\theta_B \approx 0.7968\).
Interpretasi: Hasilnya identik dengan skenario pertama namun labelnya tertukar. Ini membuktikan bahwa algoritma EM bersifat konsisten secara matematis tetapi tidak mengetahui “label” koin secara absolut; ia hanya mengikuti kecenderungan awal yang diberikan.
Inisialisasi: \(\theta_A=0.5, \theta_B=0.5\).
Hasil: Konvergen sangat cepat (2 iterasi) ke nilai \(\theta_A = 0.66\) dan \(\theta_B = 0.66\).
Interpretasi: Karena tidak ada perbedaan awal, algoritma tidak memiliki dasar untuk membedakan data ke koin A atau B. Akhirnya, keduanya hanya menghitung rata-rata dari seluruh data (total 33 Heads dari 50 lemparan = 0.66).
Estimasi Parameter: Nilai optimal untuk parameter koin berdasarkan data yang diberikan adalah 0.7968 (cenderung Heads) dan 0.5196 (mendekati seimbang).
Ketergantungan pada Nilai Awal: Keberhasilan algoritma EM sangat bergantung pada pemilihan nilai awal (initial guess). Jika nilai awal sama, algoritma akan gagal melakukan pengelompokan atau pemisahan data laten.
Stabilitas Algoritma: Selama terdapat perbedaan pada inisialisasi awal, algoritma secara konsisten menuju ke titik optimal yang sama (konvergen) meskipun melalui jumlah iterasi yang berbeda-beda.
Kondisi Konvergensi: Algoritma dinyatakan berhasil ketika “Perubahan” antar iterasi lebih kecil dari batas toleransi (\(1e-6\)), yang dalam simulasi ini rata-rata tercapai dalam 14 iterasi untuk skenario yang valid.