मैं ईएम एल्गोरिथ्म मैन्युअल लागू करने और उसके बाद के परिणामों की तुलना करना चाहते हैं 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
। मेरी गलती कहाँ है?