আমি ই.এম. অ্যালগরিদম নিজে বাস্তবায়ন এবং তারপর ফলাফল এটি তুলনা করতে চান normalmixEM
এর mixtools
প্যাকেজ। অবশ্যই, যদি তারা উভয়ই একই ফলাফলের দিকে পরিচালিত করে তবে আমি খুশি হব। প্রধান রেফারেন্স হলেন জিওফ্রে ম্যাকল্যাচলান (2000), ফিনিট মিকচার মডেল ।
আমার দুটি গৌসিয়ানের মিশ্রণ ঘনত্ব রয়েছে, সাধারণ আকারে, লগ-সম্ভাবনা দেওয়া হয় (ম্যাকল্যাচলান পৃষ্ঠা 48):
ই ধাপ এখন শর্তসাপেক্ষ প্রত্যাশা হিসাব হল:
আমি একটি আর কোড লেখার চেষ্টা করেছি (ডেটা এখানে পাওয়া যাবে )।
# 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
। আমার ভুল কোথায়?