6

Có ai có thể cung cấp một ví dụ số đơn giản của thuật toán EM vì tôi không chắc chắn về các công thức đã cho không? Một thực sự đơn giản với 4 hoặc 5 tọa độ Descartes sẽ hoàn hảo.Ví dụ số của thuật toán tối đa hóa kỳ vọng

+0

** mà ** của các biến thể EM làm bạn nghĩa là gì? Thuật toán kết hợp phổ biến của hỗn hợp Gaussians? Những gì * có * bạn hiểu? Là Mahalanobis khoảng cách hoàn toàn rõ ràng chưa? –

+0

Phải, tôi cần Mô hình hỗn hợp Gaussian. Vâng, tôi nghĩ rằng tôi nhận được trực giác (mức cao) nhưng tôi không thể áp dụng các công thức cho một ví dụ đơn giản. – Michael

+0

Hãy thử [Hướng dẫn] này (http://www.dbs.ifi.lmu.de/Lehre/KDD/SS12/uebung/Tutorial05ClusteringEM.pdf). Nó chỉ là một bước (và nó không tính toán lại ma trận!) Nhưng tôi nghĩ nó sẽ trả lời một số câu hỏi của bạn và khá trực quan. –

Trả lời

5

gì về điều này: http://en.wikibooks.org/wiki/Data_Mining_Algorithms_In_R/Clustering/Expectation_Maximization_(EM)#A_simple_example

Tôi cũng đã viết một ví dụ đơn giản trong (chỉnh sửa) R một năm trước, tiếc là tôi không thể tìm thấy nó. Tôi sẽ cố gắng tìm lại sau.

EDIT: Đây rồi -

 
EM <- function() 
{ 
    ### Read file, get necessary cols 
    dataFile <- read.csv("wine.csv", head = FALSE, sep = ",") 
    sl <- dataFile[, 2] 
    #sw <- dataFile[, 3] 
    #pl <- dataFile[, 3] 
    #pw <- dataFile[, 4] 
    class <- dataFile[, 5] 
    N <- length(sl) 
    pi1 <- 0.5 
     ### Init ### 
    rand1 <- floor(runif(1) * N) 
    rand2 <- floor(runif(1) * N) 
    mu1 <- sl[rand1] 
    mu2 <- sl[rand2] 
    mean1 <- sum(sl)/N 
    sigma1 <- sum( (sl - mean1) ** 2) /N 
    sigma2 <- sigma1 
    print(mu1) 
    print(mu2) 
    print(sigma1) 
    print(sigma2) 
    COUNTLIM <- 10 
    count <- 1 
    prevmu1 <- 0.0; 
    prevmu2 <- 0.0; 
    prevsigma1 <- 0.0; 
    prevsigma2 <- 0.0; 
    gamma <- array(0, length(sl)) 
    while (count <= COUNTLIM) 
    { 
     gamma <- pi1 * dnorm(sl, mu2, sigma2)/ ((1 - pi1) * dnorm(sl, mu1, sigma1) + pi1 * dnorm(sl, mu2, sigma2)) 
     mu1 <- sum((1 - gamma) * sl)/sum(1 - gamma)
mu2 <- sum((gamma) * sl)/sum(gamma)
sigma1 <- sum((1 - gamma) * (sl - mu1) ** 2)/sum(1 - gamma) sigma2 <- sum((gamma) * (sl - mu2) ** 2)/sum(gamma) pi1 <- sum(gamma)/N print(c(mu1, mu2, sigma1, sigma2, pi1)) if (count == 1) { prevmu1 <- mu1; prevmu2 <- mu2; prevsigma1 <- sigma1; prevsigma2 <- sigma2; } else { val <- ((prevmu1 - mu1)*2 + (prevmu2 - mu2)*2 + (prevsigma1 - sigma1)*2 + (prevsigma2 - sigma2)*2) ** 0.5; print(c("val: " , val)) if (val <= 1) { break; } } count <- count + 1 } print(mu1) print(mu2) print(sigma1) print(sigma2) }

+0

bạn có thể liên kết (hoặc | và mô tả) dữ liệu wine.csv không? Tôi cho là tôi đã tìm thấy nó. Đó là: http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data? – andi

+0

vâng, xin lỗi, đó là một. –