ฉันต้องการใช้อัลกอริทึม EM ด้วยตนเองแล้วเปรียบเทียบกับผลลัพธ์normalmixEM
ของmixtools
แพ็คเกจ แน่นอนฉันจะมีความสุขถ้าพวกเขาทั้งสองนำไปสู่ผลลัพธ์เดียวกัน อ้างอิงหลักคือเจฟฟรีย์ McLachlan (2000) จำกัด ผสมรุ่น
ฉันมีความหนาแน่นของสอง Gaussians ในรูปแบบทั่วไปบันทึกความเป็นไปได้ที่ได้รับ (McLachlan หน้า 48):
Eขั้นตอนคือตอนนี้การคำนวณของความคาดหวังที่มีเงื่อนไข:
ฉันพยายามเขียนรหัส R (สามารถดูข้อมูลได้ที่นี่ )
# EM algorithm manually
# dat is the data
# initial values
pi1 <- 0.5
pi2 <- 0.5
mu1 <- -0.01
mu2 <- 0.01
sigma1 <- 0.01
sigma2 <- 0.02
loglik[1] <- 0
loglik[2] <- sum(pi1*(log(pi1) + log(dnorm(dat,mu1,sigma1)))) +
sum(pi2*(log(pi2) + log(dnorm(dat,mu2,sigma2))))
tau1 <- 0
tau2 <- 0
k <- 1
# loop
while(abs(loglik[k+1]-loglik[k]) >= 0.00001) {
# E step
tau1 <- pi1*dnorm(dat,mean=mu1,sd=sigma1)/(pi1*dnorm(x,mean=mu1,sd=sigma1) +
pi2*dnorm(dat,mean=mu2,sd=sigma2))
tau2 <- pi2*dnorm(dat,mean=mu2,sd=sigma2)/(pi1*dnorm(x,mean=mu1,sd=sigma1) +
pi2*dnorm(dat,mean=mu2,sd=sigma2))
# M step
pi1 <- sum(tau1)/length(dat)
pi2 <- sum(tau2)/length(dat)
mu1 <- sum(tau1*x)/sum(tau1)
mu2 <- sum(tau2*x)/sum(tau2)
sigma1 <- sum(tau1*(x-mu1)^2)/sum(tau1)
sigma2 <- sum(tau2*(x-mu2)^2)/sum(tau2)
loglik[k] <- sum(tau1*(log(pi1) + log(dnorm(x,mu1,sigma1)))) +
sum(tau2*(log(pi2) + log(dnorm(x,mu2,sigma2))))
k <- k+1
}
# compare
library(mixtools)
gm <- normalmixEM(x, k=2, lambda=c(0.5,0.5), mu=c(-0.01,0.01), sigma=c(0.01,0.02))
gm$lambda
gm$mu
gm$sigma
gm$loglik
-Inf
อัลกอริทึมไม่ทำงานเนื่องจากข้อสังเกตบางคนมีโอกาสในการเป็นศูนย์และเข้าสู่ระบบของการมีที่นี้ ความผิดพลาดของฉันอยู่ที่ไหน